diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a7a8e26d91e540..97e1f4036d6e10 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # For details, see https://github.com/devcontainers/images/tree/main/src/ruby -FROM mcr.microsoft.com/devcontainers/ruby:3.4-trixie +FROM mcr.microsoft.com/devcontainers/ruby:4.0-trixie # Install node version from .nvmrc WORKDIR /app diff --git a/.github/ISSUE_TEMPLATE/3.troubleshooting.yml b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml index 5278933ecefed9..95efe3fd3cfa5d 100644 --- a/.github/ISSUE_TEMPLATE/3.troubleshooting.yml +++ b/.github/ISSUE_TEMPLATE/3.troubleshooting.yml @@ -61,7 +61,7 @@ body: value: | Please at least include those informations: - Operating system: (eg. Ubuntu 24.04.2) - - Ruby version: (from `ruby --version`, eg. v3.4.9) + - Ruby version: (from `ruby --version`, eg. v4.0.3) - Node.js version: (from `node --version`, eg. v22.16.0) validations: required: false diff --git a/.github/actions/setup-javascript/action.yml b/.github/actions/setup-javascript/action.yml index 3c9e06116cb913..7f29265c1c5fab 100644 --- a/.github/actions/setup-javascript/action.yml +++ b/.github/actions/setup-javascript/action.yml @@ -9,7 +9,7 @@ runs: using: 'composite' steps: - name: Set up Node.js - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version-file: '.nvmrc' @@ -23,7 +23,7 @@ runs: shell: bash run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 + - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/.github/actions/setup-ruby/action.yml b/.github/actions/setup-ruby/action.yml index fed79add6d8ba6..317c1256d51685 100644 --- a/.github/actions/setup-ruby/action.yml +++ b/.github/actions/setup-ruby/action.yml @@ -1,4 +1,4 @@ -name: 'Setup RUby' +name: 'Setup Ruby' description: 'Setup a Ruby environment ready to run the Mastodon code' inputs: ruby-version: @@ -14,10 +14,10 @@ runs: shell: bash run: | sudo apt-get update - sudo apt-get install -y libicu-dev libidn11-dev libvips42 ${{ inputs.additional-system-dependencies }} + sudo apt-get install --no-install-recommends -y libicu-dev libidn11-dev libvips42 ${{ inputs.additional-system-dependencies }} - name: Set up Ruby - uses: ruby/setup-ruby@4eb9f110bac952a8b68ecf92e3b5c7a987594ba6 # v1 + uses: ruby/setup-ruby@94e4d89d3e6c1c7599e0210d114c5ffb23f1a866 # v1 with: ruby-version: ${{ inputs.ruby-version }} bundler-cache: true diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml index d0f88dcd90c4ea..9bd5bd634d3546 100644 --- a/.github/workflows/bundler-audit.yml +++ b/.github/workflows/bundler-audit.yml @@ -34,7 +34,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Set up Ruby - uses: ruby/setup-ruby@4eb9f110bac952a8b68ecf92e3b5c7a987594ba6 # v1 + uses: ruby/setup-ruby@94e4d89d3e6c1c7599e0210d114c5ffb23f1a866 # v1 with: bundler-cache: true diff --git a/.github/workflows/crowdin-download-stable.yml b/.github/workflows/crowdin-download-stable.yml index 297e1c2f3c3a41..65e8cc7f80a3fc 100644 --- a/.github/workflows/crowdin-download-stable.yml +++ b/.github/workflows/crowdin-download-stable.yml @@ -24,7 +24,7 @@ jobs: # Download the translation files from Crowdin - name: crowdin action - uses: crowdin/github-action@b4b468cffefb50bdd99dd83e5d2eaeb63c880380 # v2 + uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2 with: upload_sources: false upload_translations: false diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml index 0f8fd6d46ab697..d7a9988ef702f7 100644 --- a/.github/workflows/lint-haml.yml +++ b/.github/workflows/lint-haml.yml @@ -39,7 +39,7 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Set up Ruby - uses: ruby/setup-ruby@4eb9f110bac952a8b68ecf92e3b5c7a987594ba6 # v1 + uses: ruby/setup-ruby@94e4d89d3e6c1c7599e0210d114c5ffb23f1a866 # v1 with: bundler-cache: true diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index 7be23472975436..3f4e2d4a85e51c 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -41,15 +41,12 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Set up Ruby - uses: ruby/setup-ruby@4eb9f110bac952a8b68ecf92e3b5c7a987594ba6 # v1 + uses: ruby/setup-ruby@94e4d89d3e6c1c7599e0210d114c5ffb23f1a866 # v1 with: bundler-cache: true - - name: Set-up RuboCop Problem Matcher - uses: r7kamura/rubocop-problem-matchers-action@59f1a0759f50cc2649849fd850b8487594bb5a81 # v1.2.2 - - name: Run rubocop - run: bin/rubocop + run: bin/rubocop --format github - name: Run brakeman if: always() # Run both checks, even if the first failed diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index c1e2608c94e3b9..e13cc7fcbed863 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -46,7 +46,7 @@ jobs: onlyProduction: 'true' - name: Cache assets from compilation - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | public/assets @@ -128,8 +128,8 @@ jobs: fail-fast: false matrix: ruby-version: - - '3.2' - '3.3' + - '3.4' - '.ruby-version' steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -155,7 +155,7 @@ jobs: bin/flatware fan bin/rails db:test:prepare - name: Cache RSpec persistence file - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | tmp/rspec/examples.txt @@ -171,7 +171,7 @@ jobs: - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' - uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5 + uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5 with: files: coverage/lcov/*.lcov env: @@ -222,8 +222,8 @@ jobs: fail-fast: false matrix: ruby-version: - - '3.2' - '3.3' + - '3.4' - '.ruby-version' steps: @@ -252,7 +252,7 @@ jobs: - name: Cache Playwright Chromium browser id: playwright-cache - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: ~/.cache/ms-playwright key: playwright-browsers-${{ runner.os }}-${{ hashFiles('yarn.lock') }} @@ -353,8 +353,8 @@ jobs: fail-fast: false matrix: ruby-version: - - '3.2' - '3.3' + - '3.4' - '.ruby-version' search-image: - docker.elastic.co/elasticsearch/elasticsearch:7.17.29 @@ -393,13 +393,6 @@ jobs: name: test-search-logs-${{ matrix.ruby-version }} path: log/ - - name: Archive test screenshots - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 - if: failure() - with: - name: test-search-screenshots - path: tmp/capybara/ - test-back-and-return: name: Back to original and return test runs-on: ubuntu-latest diff --git a/.nvmrc b/.nvmrc index fd655f8a35b4f3..a2e33f6e2c077c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -24.14 +24.15 diff --git a/.rubocop.yml b/.rubocop.yml index 1bbba515af1add..425709187c35a9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,7 +8,7 @@ AllCops: - lib/mastodon/migration_helpers.rb ExtraDetails: true NewCops: enable - TargetRubyVersion: 3.2 # Oldest supported ruby version + TargetRubyVersion: 3.3 # Oldest supported ruby version inherit_from: - .rubocop/layout.yml diff --git a/.ruby-version b/.ruby-version index 7bcbb3808b5089..c4e41f94594c72 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.9 +4.0.3 diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index b8b9bd385efa9c..4fb559ccf96e22 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -137,11 +137,7 @@ const preview: Preview = { }, [currentLocale, currentLocaleData]); return ( - + ); diff --git a/.yarnrc.yml b/.yarnrc.yml index 3186f3f0795ab6..74a014733cf52f 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1 +1,6 @@ +approvedGitRepositories: + - '**' + +enableScripts: true + nodeLinker: node-modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b6fbc92cf2bf..bf5dbd2ba98d11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to this project will be documented in this file. +## [4.5.9] - 2026-04-15 + +### Security + +- Insufficient verification of email addresses ([GHSA-5r37-qpwq-2jhh](https://github.com/mastodon/mastodon/security/advisories/GHSA-5r37-qpwq-2jhh)) +- Updated dependencies + +### Added + +- Add trademark warning to `mastodon:setup` task (#38548 by @ClearlyClaire) + +### Fixed + +- Fix definition for `quote` in JSON-LD context (#38686 by @ClearlyClaire) +- Fix being unable to disable sound for quote update notification (#38537 by @ClearlyClaire) +- Fix being able to quote someone you blocked (#38608 by @ClearlyClaire) + ## [4.5.8] - 2026-03-24 ### Security diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index c88a0d938553d8..bce574d47c1539 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,132 +1,83 @@ -# Contributor Covenant Code of Conduct +# Contributor Covenant 3.0 Code of Conduct ## Our Pledge -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. +We pledge to make our community welcoming, safe, and equitable for all. -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. +We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant. -## Our Standards +## Encouraged Behaviors -Examples of behavior that contributes to a positive environment for our -community include: +While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language. -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the overall - community +With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including: -Examples of unacceptable behavior include: +1. Respecting the **purpose of our community**, our activities, and our ways of gathering. +2. Engaging **kindly and honestly** with others. +3. Respecting **different viewpoints** and experiences. +4. **Taking responsibility** for our actions and contributions. +5. Gracefully giving and accepting **constructive feedback**. +6. Committing to **repairing harm** when it occurs. +7. Behaving in other ways that promote and sustain the **well-being of our community**. -- The use of sexualized language or imagery, and sexual attention or advances of - any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email address, - without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +## Restricted Behaviors -## Enforcement Responsibilities +We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct. -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. +1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop. +2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people. +3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable identities or traits. +4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community. +5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their permission. +6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group. +7. Behaving in other ways that **threaten the well-being** of our community. -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. +### Other Restrictions -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -[hello@joinmastodon.org](mailto:hello@joinmastodon.org). -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines +1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions. +2. **Failing to credit sources.** Not properly crediting the sources of content you contribute. +3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community. +4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors. -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: +## Reporting an Issue -### 1. Correction +Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm. -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. +When an incident does occur, it is important to report it promptly. To report a possible violation, send an email describing the situation to hello@joinmastodon.org. -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. +Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. -### 2. Warning +## Addressing and Repairing Harm -**Community Impact**: A violation through a single incident or series of -actions. +If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. +1. Warning + 1. Event: A violation involving a single incident or series of incidents. + 2. Consequence: A private, written warning from the Community Moderators. + 3. Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations. +2. Temporarily Limited Activities + 1. Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation. + 2. Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members. + 3. Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over. +3. Temporary Suspension + 1. Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation. + 2. Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions. + 3. Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted. +4. Permanent Ban + 1. Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member. + 2. Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior. + 3. Repair: There is no possible repair in cases of this severity. -### 3. Temporary Ban +This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community. -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. +## Scope -**Consequence**: A permanent ban from any sort of public interaction within the -community. +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. +This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/). -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at -[https://www.contributor-covenant.org/translations][translations]. +Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) -[homepage]: https://www.contributor-covenant.org -[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations +For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of [Mozilla’s code of conduct team](https://github.com/mozilla/inclusion). diff --git a/Dockerfile b/Dockerfile index c26f957cee23fe..1f50c0f1a81bcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,9 +11,9 @@ ARG TARGETPLATFORM=${TARGETPLATFORM} ARG BUILDPLATFORM=${BUILDPLATFORM} ARG BASE_REGISTRY="docker.io" -# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"] +# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="4.0.x"] # renovate: datasource=docker depName=docker.io/ruby -ARG RUBY_VERSION="3.4.9" +ARG RUBY_VERSION="4.0.3" # # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="22"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="24" @@ -25,8 +25,8 @@ FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby # 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"] +# 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="" @@ -48,29 +48,27 @@ ARG GID="991" # Apply Mastodon build options based on options above ENV \ - # Apply Mastodon version information MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \ MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \ SOURCE_COMMIT="${SOURCE_COMMIT}" \ - # Apply Mastodon static files and YJIT options - RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \ - RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \ - # Apply timezone - TZ=${TZ} - + RAILS_SERVE_STATIC_FILES="${RAILS_SERVE_STATIC_FILES}" \ + RUBY_YJIT_ENABLE="${RUBY_YJIT_ENABLE}" \ + TZ="${TZ}" + +# Configure runtime environment +# BIND: IP to bind Mastodon to when serving traffic +# NODE_ENV/RAILS_ENV: production settings for Node.js and Ruby on Rails +# DEBIAN_FRONTEND: suppress interactive prompts +# PATH: add Ruby and Mastodon installation directories +# MALLOC_CONF: optimize jemalloc 5.x performance +# MASTODON_SIDEKIQ_READY_FILENAME: Sidekiq readiness check filename for Kubernetes ENV \ - # Configure the IP to bind Mastodon to when serving traffic BIND="0.0.0.0" \ - # Use production settings for Yarn, Node.js and related tools NODE_ENV="production" \ - # Use production settings for Ruby on Rails RAILS_ENV="production" \ - # Add Ruby and Mastodon installation to the PATH DEBIAN_FRONTEND="noninteractive" \ PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \ - # Optimize jemalloc 5.x performance MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \ - # 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 @@ -99,10 +97,10 @@ RUN \ # Mount Apt cache and lib directories from Docker buildx caches --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ - # Apt update & upgrade to check for security updates to Debian image + # Update package list and upgrade system packages apt-get update; \ apt-get dist-upgrade -yq; \ - # Install jemalloc, curl and other necessary components + # Install jemalloc and other necessary components apt-get install -y --no-install-recommends \ curl \ file \ @@ -112,6 +110,42 @@ RUN \ tini \ tzdata \ wget \ + # Mastodon components + libexpat1 \ + libglib2.0-0t64 \ + libicu76 \ + libidn12 \ + libpq5 \ + libreadline8t64 \ + libssl3t64 \ + libyaml-0-2 \ + # libvips components + libcgif0 \ + libexif12 \ + libheif1 \ + libhwy1t64 \ + libimagequant0 \ + libjpeg62-turbo \ + liblcms2-2 \ + libspng0 \ + libtiff6 \ + libwebp7 \ + libwebpdemux2 \ + libwebpmux3 \ + # ffmpeg components + libdav1d7 \ + libmp3lame0 \ + libopencore-amrnb0 \ + libopencore-amrwb0 \ + libopus0 \ + libsnappy1v5 \ + libtheora0 \ + libvorbis0a \ + libvorbisenc2 \ + libvorbisfile3 \ + libvpx9 \ + libx264-164 \ + libx265-215 \ ; \ # Patch Ruby to use jemalloc patchelf --add-needed libjemalloc.so.2 /usr/local/bin/ruby; \ @@ -120,42 +154,37 @@ RUN \ patchelf \ ; -# Create temporary build layer from base image -FROM ruby AS build +# Build stage for media libraries (libvips, ffmpeg) +FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS media-build ARG TARGETPLATFORM +# Set default shell used for running commands +SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"] + # hadolint ignore=DL3008 RUN \ - # Mount Apt cache and lib directories from Docker buildx caches - --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ - # Install build tools and bundler dependencies from APT + --mount=type=cache,id=apt-native-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=apt-native-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ + # Remove automatic apt cache Docker cleanup scripts + rm -f /etc/apt/apt.conf.d/docker-clean; \ + # Install build tools for native libraries + apt-get update; \ apt-get install -y --no-install-recommends \ autoconf \ automake \ build-essential \ - cmake \ - git \ - libgdbm-dev \ - libglib2.0-dev \ - libgmp-dev \ - libicu-dev \ - libidn-dev \ - libpq-dev \ - libssl-dev \ libtool \ - libyaml-dev \ meson \ nasm \ pkg-config \ - shared-mime-info \ xz-utils \ # libvips components libcgif-dev \ libexif-dev \ libexpat1-dev \ libgirepository1.0-dev \ + libglib2.0-dev \ libheif-dev \ libhwy-dev \ libimagequant-dev \ @@ -176,12 +205,12 @@ RUN \ libx265-dev \ ; -# Create temporary libvips specific build layer from build layer -FROM build AS libvips +# Create temporary libvips specific build layer +FROM media-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 -ARG VIPS_VERSION=8.18.1 +ARG VIPS_VERSION=8.18.2 # libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"] ARG VIPS_URL=https://github.com/libvips/libvips/releases/download @@ -192,19 +221,20 @@ RUN tar xf vips-${VIPS_VERSION}.tar.xz; WORKDIR /usr/local/libvips/src/vips-${VIPS_VERSION} -# Configure and compile libvips -RUN \ - meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \ - cd build; \ - ninja; \ - ninja install; +# Configure libvips +RUN meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false + +WORKDIR /usr/local/libvips/src/vips-${VIPS_VERSION}/build -# Create temporary ffmpeg specific build layer from build layer -FROM build AS ffmpeg +# Compile and install libvips +RUN ninja && ninja install + +# Create temporary ffmpeg specific build layer +FROM media-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=8.0 +# renovate: datasource=github-tags depName=FFmpeg/FFmpeg extractVersion=^n(?\d+\.\d+(\.\d+)?)$ +ARG FFMPEG_VERSION=8.1 # ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"] ARG FFMPEG_URL=https://github.com/FFmpeg/FFmpeg/archive/refs/tags @@ -241,17 +271,48 @@ RUN \ --enable-shared \ --enable-version3 \ ; \ - make -j$(nproc); \ + make -j"$(nproc)"; \ make install; +# Create temporary build layer from base image for Ruby dependencies +FROM ruby AS ruby-build + +ARG TARGETPLATFORM + +# hadolint ignore=DL3008 +RUN \ + # Mount Apt cache and lib directories from Docker buildx caches + --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ + --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 \ + build-essential \ + git \ + libgdbm-dev \ + libgmp-dev \ + libicu-dev \ + libidn-dev \ + libpq-dev \ + libssl-dev \ + libyaml-dev \ + shared-mime-info \ + zlib1g-dev \ + ; + # Create temporary bundler specific build layer from build layer -FROM build AS bundler +FROM ruby-build AS bundler ARG TARGETPLATFORM # Copy Gemfile config into working directory COPY Gemfile* /opt/mastodon/ +# Copy libvips for gems that need it during install +COPY --from=libvips /usr/local/libvips/lib /usr/local/lib +COPY --from=libvips /usr/local/libvips/include /usr/local/include + +RUN ldconfig + RUN \ # Mount Ruby Gem caches --mount=type=cache,id=gem-cache-${TARGETPLATFORM},target=/usr/local/bundle/cache/,sharing=locked \ @@ -267,7 +328,7 @@ RUN \ bundle install -j"$(nproc)"; # Create temporary assets build layer from build layer -FROM build AS precompiler +FROM ruby-build AS precompiler ARG TARGETPLATFORM @@ -311,53 +372,6 @@ FROM ruby AS mastodon ARG TARGETPLATFORM -# hadolint ignore=DL3008 -RUN \ - # Mount Apt cache and lib directories from Docker buildx caches - --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ - --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ - # Mount Corepack and Yarn caches from Docker buildx caches - --mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \ - --mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \ - # Apt update install non-dev versions of necessary components - apt-get install -y --no-install-recommends \ - libexpat1 \ - libglib2.0-0t64 \ - libicu76 \ - libidn12 \ - libpq5 \ - libreadline8t64 \ - libssl3t64 \ - libyaml-0-2 \ - # libvips components - libcgif0 \ - libexif12 \ - libheif1 \ - libhwy1t64 \ - libimagequant0 \ - libjpeg62-turbo \ - liblcms2-2 \ - libspng0 \ - libtiff6 \ - libwebp7 \ - libwebpdemux2 \ - libwebpmux3 \ - # ffmpeg components - libdav1d7 \ - libmp3lame0 \ - libopencore-amrnb0 \ - libopencore-amrwb0 \ - libopus0 \ - libsnappy1v5 \ - libtheora0 \ - libvorbis0a \ - libvorbisenc2 \ - libvorbisfile3 \ - libvpx9 \ - libx264-164 \ - libx265-215 \ - ; - # Copy Mastodon sources into final layer COPY . /opt/mastodon/ diff --git a/Gemfile b/Gemfile index 40f95d56e9f27c..f5d72aed1b1b43 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby '>= 3.2.0', '< 3.5.0' +ruby '>= 3.3.0', '< 4.1.0' gem 'propshaft' -gem 'puma', '~> 7.0' +gem 'puma' gem 'rails', '~> 8.1.0' gem 'thor', '~> 1.2' @@ -50,7 +50,6 @@ gem 'doorkeeper', '~> 5.6' gem 'faraday-httpclient' gem 'fast_blank', '~> 1.0' gem 'fastimage' -gem 'hiredis', '~> 0.6' gem 'hiredis-client' gem 'htmlentities', '~> 4.3' gem 'http', '~> 5.3.0' @@ -76,7 +75,7 @@ gem 'rack-attack', '~> 6.6' gem 'rack-cors', require: 'rack/cors' gem 'rails-i18n', '~> 8.0' gem 'redcarpet', '~> 3.6' -gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis'] +gem 'redis', '~> 5' gem 'rqrcode', '~> 3.0' gem 'ruby-progressbar', '~> 1.13' gem 'sanitize', '~> 7.0' @@ -102,23 +101,23 @@ gem 'rdf-normalize', '~> 0.5' gem 'prometheus_exporter', '~> 2.2', require: false -gem 'opentelemetry-api', '~> 1.8.0' +gem 'opentelemetry-api', '~> 1.9.0' group :opentelemetry do - gem 'opentelemetry-exporter-otlp', '~> 0.32.0', require: false - gem 'opentelemetry-instrumentation-active_job', '~> 0.10.0', require: false - gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-excon', '~> 0.28.0', require: false - gem 'opentelemetry-instrumentation-faraday', '~> 0.32.0', require: false - gem 'opentelemetry-instrumentation-http', '~> 0.29.0', require: false - gem 'opentelemetry-instrumentation-http_client', '~> 0.28.0', require: false - gem 'opentelemetry-instrumentation-net_http', '~> 0.28.0', require: false - gem 'opentelemetry-instrumentation-pg', '~> 0.35.0', require: false - gem 'opentelemetry-instrumentation-rack', '~> 0.30.0', require: false - gem 'opentelemetry-instrumentation-rails', '~> 0.40.0', require: false - gem 'opentelemetry-instrumentation-redis', '~> 0.28.0', require: false - gem 'opentelemetry-instrumentation-sidekiq', '~> 0.28.0', require: false + gem 'opentelemetry-exporter-otlp', '~> 0.33.0', require: false + gem 'opentelemetry-instrumentation-active_job', '~> 0.11.0', require: false + gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.25.0', require: false + gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.25.0', require: false + gem 'opentelemetry-instrumentation-excon', '~> 0.29.0', require: false + gem 'opentelemetry-instrumentation-faraday', '~> 0.33.0', require: false + gem 'opentelemetry-instrumentation-http', '~> 0.30.0', require: false + gem 'opentelemetry-instrumentation-http_client', '~> 0.29.0', require: false + gem 'opentelemetry-instrumentation-net_http', '~> 0.29.0', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.36.0', require: false + gem 'opentelemetry-instrumentation-rack', '~> 0.31.0', require: false + gem 'opentelemetry-instrumentation-rails', '~> 0.41.0', require: false + gem 'opentelemetry-instrumentation-redis', '~> 0.29.0', require: false + gem 'opentelemetry-instrumentation-sidekiq', '~> 0.29.0', require: false gem 'opentelemetry-sdk', '~> 1.4', require: false end @@ -135,7 +134,7 @@ group :test do # Browser integration testing gem 'capybara', '~> 3.39' gem 'capybara-playwright-driver' - gem 'playwright-ruby-client', '1.57.1', require: false # Pinning the exact version as it needs to be kept in sync with the installed npm package + gem 'playwright-ruby-client', '1.59.0', require: false # Pinning the exact version as it needs to be kept in sync with the installed npm package # Used to reset the database between system tests gem 'database_cleaner-active_record' diff --git a/Gemfile.lock b/Gemfile.lock index fc2beaa711124b..57879896e964e8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,31 +10,31 @@ GIT GEM remote: https://rubygems.org/ specs: - action_text-trix (2.1.17) + action_text-trix (2.1.18) railties - actioncable (8.1.2.1) - actionpack (= 8.1.2.1) - activesupport (= 8.1.2.1) + actioncable (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.1.2.1) - actionpack (= 8.1.2.1) - activejob (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionmailbox (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) - actionmailer (8.1.2.1) - actionpack (= 8.1.2.1) - actionview (= 8.1.2.1) - activejob (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionmailer (8.1.3) + actionpack (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.1.2.1) - actionview (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionpack (8.1.3) + actionview (= 8.1.3) + activesupport (= 8.1.3) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -42,16 +42,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.1.2.1) + actiontext (8.1.3) action_text-trix (~> 2.1.15) - actionpack (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + actionpack (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.1.2.1) - activesupport (= 8.1.2.1) + actionview (8.1.3) + activesupport (= 8.1.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -61,22 +61,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (8.1.2.1) - activesupport (= 8.1.2.1) + activejob (8.1.3) + activesupport (= 8.1.3) globalid (>= 0.3.6) - activemodel (8.1.2.1) - activesupport (= 8.1.2.1) - activerecord (8.1.2.1) - activemodel (= 8.1.2.1) - activesupport (= 8.1.2.1) + activemodel (8.1.3) + activesupport (= 8.1.3) + activerecord (8.1.3) + activemodel (= 8.1.3) + activesupport (= 8.1.3) timeout (>= 0.4.0) - activestorage (8.1.2.1) - actionpack (= 8.1.2.1) - activejob (= 8.1.2.1) - activerecord (= 8.1.2.1) - activesupport (= 8.1.2.1) + activestorage (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activesupport (= 8.1.3) marcel (~> 1.0) - activesupport (8.1.2.1) + activesupport (8.1.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -89,7 +89,7 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - addressable (2.8.9) + addressable (2.9.0) public_suffix (>= 2.0.2, < 8.0) aes_key_wrap (1.1.0) android_key_attestation (0.3.0) @@ -99,8 +99,8 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.4.0) - aws-partitions (1.1227.0) - aws-sdk-core (3.244.0) + aws-partitions (1.1242.0) + aws-sdk-core (3.246.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -108,10 +108,10 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.123.0) + aws-sdk-kms (1.124.0) aws-sdk-core (~> 3, >= 3.244.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.217.0) + aws-sdk-s3 (1.220.0) aws-sdk-core (~> 3, >= 3.244.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -121,7 +121,7 @@ GEM rexml base64 (0.3.0) bcp47_spec (0.2.1) - bcrypt (3.1.21) + bcrypt (3.1.22) benchmark (0.5.0) better_errors (2.10.1) erubi (>= 1.0.0) @@ -132,7 +132,7 @@ GEM binding_of_caller (2.0.0) debug_inspector (>= 1.2.0) blurhash (0.1.8) - bootsnap (1.23.0) + bootsnap (1.24.1) msgpack (~> 1.2) brakeman (8.0.4) racc @@ -156,7 +156,7 @@ GEM playwright-ruby-client (>= 1.16.0) case_transform (0.2) activesupport - cbor (0.5.10.1) + cbor (0.5.10.2) cgi (0.5.1) charlock_holmes (0.7.9) chewy (8.0.1) @@ -178,7 +178,7 @@ GEM bigdecimal rexml crass (1.0.6) - css_parser (1.21.1) + css_parser (2.1.0) addressable csv (3.3.5) database_cleaner-active_record (2.2.2) @@ -214,7 +214,7 @@ GEM dotenv (3.2.0) drb (2.2.3) dry-cli (1.4.1) - elastic-transport (8.4.1) + elastic-transport (8.5.1) faraday (< 3) multi_json elasticsearch (8.19.3) @@ -226,14 +226,14 @@ GEM elasticsearch-dsl (0.1.10) email_validator (2.2.4) activemodel - erb (6.0.2) + erb (6.0.4) erubi (1.13.1) et-orbi (1.4.0) tzinfo - excon (1.4.0) + excon (1.4.2) logger fabrication (3.0.0) - faker (3.6.1) + faker (3.8.0) i18n (>= 1.8.11, < 2) faraday (2.14.1) faraday-net_http (>= 2.0, < 3.5) @@ -247,7 +247,7 @@ GEM net-http (~> 0.5) fast_blank (1.0.1) fastimage (2.4.1) - ffi (1.17.3) + ffi (1.17.4) ffi-compiler (1.3.2) ffi (>= 1.15.5) rake @@ -264,7 +264,7 @@ GEM excon (~> 1.0) formatador (>= 0.2, < 2.0) mime-types - fog-json (1.2.0) + fog-json (1.3.0) fog-core multi_json (~> 1.10) fog-openstack (1.1.5) @@ -278,7 +278,7 @@ GEM raabro (~> 1.4) globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (4.34.0) + google-protobuf (4.34.1) bigdecimal rake (~> 13.3) googleapis-common-protos-types (1.22.0) @@ -292,9 +292,9 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.72.0) + haml_lint (0.73.0) haml (>= 5.0) - parallel (~> 1.10) + parallel (>= 1.10) rainbow rubocop (>= 1.0) sysexits (~> 1.1) @@ -305,7 +305,6 @@ GEM json highline (3.1.2) reline - hiredis (0.6.3) hiredis-client (0.28.0) redis-client (= 0.28.0) hkdf (0.3.0) @@ -315,7 +314,7 @@ GEM http-cookie (~> 1.0) http-form_data (~> 2.2) llhttp-ffi (~> 0.5.0) - http-cookie (1.1.0) + http-cookie (1.1.6) domain_name (~> 0.5) http-form_data (2.3.0) http_accept_language (2.1.1) @@ -344,7 +343,7 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.8.2) - irb (1.17.0) + irb (1.18.0) pp (>= 0.6.0) prism (>= 1.3.0) rdoc (>= 4.0.0) @@ -354,7 +353,7 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.19.2) + json (2.19.4) json-canonicalization (1.0.0) json-jwt (1.17.0) activesupport (>= 4.2) @@ -448,18 +447,18 @@ GEM mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2026.0317) + mime-types-data (3.2026.0414) mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (6.0.2) + minitest (6.0.5) drb (~> 2.0) prism (~> 1.5) msgpack (1.8.0) - multi_json (1.19.1) + multi_json (1.20.1) mutex_m (0.3.0) net-http (0.6.0) uri - net-imap (0.6.3) + net-imap (0.6.4) date net-protocol net-ldap (0.20.0) @@ -472,7 +471,7 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.5) - nokogiri (1.19.2) + nokogiri (1.19.3) mini_portile2 (~> 2.8.2) racc (~> 1.4) omniauth (2.1.4) @@ -509,103 +508,104 @@ GEM openssl (4.0.1) openssl-signature_algorithm (1.3.0) openssl (> 2.0) - opentelemetry-api (1.8.0) + opentelemetry-api (1.9.0) logger - opentelemetry-common (0.23.0) + opentelemetry-common (0.24.0) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.32.0) + opentelemetry-exporter-otlp (0.33.0) google-protobuf (>= 3.18) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-sdk (~> 1.10) opentelemetry-semantic_conventions - opentelemetry-helpers-sql (0.3.0) + opentelemetry-helpers-sql (0.4.0) opentelemetry-api (~> 1.7) - opentelemetry-helpers-sql-processor (0.4.0) + opentelemetry-helpers-sql-processor (0.5.0) opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.21) - opentelemetry-instrumentation-action_mailer (0.6.1) + opentelemetry-instrumentation-action_mailer (0.7.0) opentelemetry-instrumentation-active_support (~> 0.10) - opentelemetry-instrumentation-action_pack (0.16.0) + opentelemetry-instrumentation-action_pack (0.17.0) opentelemetry-instrumentation-rack (~> 0.29) - opentelemetry-instrumentation-action_view (0.11.2) + opentelemetry-instrumentation-action_view (0.12.0) opentelemetry-instrumentation-active_support (~> 0.10) - opentelemetry-instrumentation-active_job (0.10.1) + opentelemetry-instrumentation-active_job (0.11.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-active_model_serializers (0.24.0) + opentelemetry-instrumentation-active_model_serializers (0.25.0) opentelemetry-instrumentation-active_support (>= 0.7.0) - opentelemetry-instrumentation-active_record (0.11.1) + opentelemetry-instrumentation-active_record (0.12.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-active_storage (0.3.1) + opentelemetry-instrumentation-active_storage (0.4.0) opentelemetry-instrumentation-active_support (~> 0.10) - opentelemetry-instrumentation-active_support (0.10.1) + opentelemetry-instrumentation-active_support (0.11.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-base (0.25.0) + opentelemetry-instrumentation-base (0.26.0) opentelemetry-api (~> 1.7) opentelemetry-common (~> 0.21) opentelemetry-registry (~> 0.1) - opentelemetry-instrumentation-concurrent_ruby (0.24.0) + opentelemetry-instrumentation-concurrent_ruby (0.25.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-excon (0.28.0) + opentelemetry-instrumentation-excon (0.29.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-faraday (0.32.0) + opentelemetry-instrumentation-faraday (0.33.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http (0.29.0) + opentelemetry-instrumentation-http (0.30.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http_client (0.28.0) + opentelemetry-instrumentation-http_client (0.29.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-net_http (0.28.0) + opentelemetry-instrumentation-net_http (0.29.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-pg (0.35.0) + opentelemetry-instrumentation-pg (0.36.0) opentelemetry-helpers-sql opentelemetry-helpers-sql-processor opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-rack (0.30.0) + opentelemetry-instrumentation-rack (0.31.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-rails (0.40.0) - opentelemetry-instrumentation-action_mailer (~> 0.6) - opentelemetry-instrumentation-action_pack (~> 0.15) - opentelemetry-instrumentation-action_view (~> 0.11) - opentelemetry-instrumentation-active_job (~> 0.10) - opentelemetry-instrumentation-active_record (~> 0.11) - opentelemetry-instrumentation-active_storage (~> 0.3) - opentelemetry-instrumentation-active_support (~> 0.10) - opentelemetry-instrumentation-concurrent_ruby (~> 0.23) - opentelemetry-instrumentation-redis (0.28.0) + opentelemetry-instrumentation-rails (0.41.0) + opentelemetry-instrumentation-action_mailer (~> 0.7) + opentelemetry-instrumentation-action_pack (~> 0.17) + opentelemetry-instrumentation-action_view (~> 0.12) + opentelemetry-instrumentation-active_job (~> 0.11) + opentelemetry-instrumentation-active_record (~> 0.12) + opentelemetry-instrumentation-active_storage (~> 0.4) + opentelemetry-instrumentation-active_support (~> 0.11) + opentelemetry-instrumentation-concurrent_ruby (~> 0.25) + opentelemetry-instrumentation-redis (0.29.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-sidekiq (0.28.1) + opentelemetry-instrumentation-sidekiq (0.29.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-registry (0.4.0) + opentelemetry-registry (0.5.0) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.10.0) + opentelemetry-sdk (1.11.0) + logger opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) opentelemetry-semantic_conventions - opentelemetry-semantic_conventions (1.36.0) + opentelemetry-semantic_conventions (1.37.0) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) ostruct (0.6.3) - ox (2.14.23) + ox (2.14.25) bigdecimal (>= 3.0) - parallel (1.27.0) - parser (3.3.10.2) + parallel (1.28.0) + parser (3.3.11.1) ast (~> 2.4.1) racc parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) pg (1.6.3) - pghero (3.7.0) - activerecord (>= 7.1) - playwright-ruby-client (1.57.1) + pghero (3.8.0) + activerecord (>= 7.2) + playwright-ruby-client (1.59.0) base64 concurrent-ruby (>= 1.1.6) mime-types (>= 3.0) pp (0.6.3) prettyprint - premailer (1.27.0) + premailer (1.29.0) addressable css_parser (>= 1.19.0) htmlentities (>= 4.0.0) @@ -617,7 +617,7 @@ GEM prism (1.9.0) prometheus_exporter (2.3.1) webrick - propshaft (1.3.1) + propshaft (1.3.2) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack @@ -625,13 +625,13 @@ GEM date stringio public_suffix (7.0.5) - puma (7.2.0) + puma (8.0.1) nio4r (~> 2.0) pundit (2.5.2) activesupport (>= 3.0.0) raabro (1.4.0) racc (1.8.1) - rack (3.2.5) + rack (3.2.6) rack-attack (6.8.0) rack (>= 1.0, < 4) rack-cors (3.0.0) @@ -650,27 +650,27 @@ GEM rack (>= 3.0.0, < 4) rack-proxy (0.7.7) rack - rack-session (2.1.1) + rack-session (2.1.2) base64 (>= 0.1.0) rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) rackup (2.3.1) rack (>= 3) - rails (8.1.2.1) - actioncable (= 8.1.2.1) - actionmailbox (= 8.1.2.1) - actionmailer (= 8.1.2.1) - actionpack (= 8.1.2.1) - actiontext (= 8.1.2.1) - actionview (= 8.1.2.1) - activejob (= 8.1.2.1) - activemodel (= 8.1.2.1) - activerecord (= 8.1.2.1) - activestorage (= 8.1.2.1) - activesupport (= 8.1.2.1) + rails (8.1.3) + actioncable (= 8.1.3) + actionmailbox (= 8.1.3) + actionmailer (= 8.1.3) + actionpack (= 8.1.3) + actiontext (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activemodel (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) bundler (>= 1.15.0) - railties (= 8.1.2.1) + railties (= 8.1.3) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -681,9 +681,9 @@ GEM rails-i18n (8.1.0) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) - railties (8.1.2.1) - actionpack (= 8.1.2.1) - activesupport (= 8.1.2.1) + railties (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -691,7 +691,7 @@ GEM tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.3.1) + rake (13.4.2) rdf (3.3.4) bcp47_spec (~> 0.2) bigdecimal (~> 3.1, >= 3.1.5) @@ -708,10 +708,11 @@ GEM readline (0.0.4) reline redcarpet (3.6.1) - redis (4.8.1) + redis (5.4.1) + redis-client (>= 0.22.0) redis-client (0.28.0) connection_pool - regexp_parser (2.11.3) + regexp_parser (2.12.0) reline (0.6.3) io-console (~> 0.5) request_store (1.7.0) @@ -772,7 +773,7 @@ GEM rubocop-capybara (2.22.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-i18n (3.2.3) + rubocop-i18n (3.3.0) lint_roller (~> 1.1) rubocop (>= 1.72.1) rubocop-performance (1.26.1) @@ -816,15 +817,15 @@ GEM securerandom (0.4.1) shoulda-matchers (7.0.1) activesupport (>= 7.1) - sidekiq (8.0.10) - connection_pool (>= 2.5.0) - json (>= 2.9.0) - logger (>= 1.6.2) - rack (>= 3.1.0) - redis-client (>= 0.23.2) + sidekiq (8.1.3) + connection_pool (>= 3.0.0) + json (>= 2.16.0) + logger (>= 1.7.0) + rack (>= 3.2.0) + redis-client (>= 0.26.0) sidekiq-bulk (0.2.0) sidekiq - sidekiq-scheduler (6.0.1) + sidekiq-scheduler (6.0.2) rufus-scheduler (~> 3.2) sidekiq (>= 7.3, < 9) sidekiq-unique-jobs (8.0.13) @@ -847,12 +848,12 @@ GEM stackprof (0.2.28) starry (0.2.0) base64 - stoplight (5.8.0) + stoplight (5.8.2) concurrent-ruby zeitwerk stringio (3.2.0) - strong_migrations (2.5.2) - activerecord (>= 7.1) + strong_migrations (2.7.0) + activerecord (>= 7.2) swd (2.0.3) activesupport (>= 3) attr_required (>= 0.0.5) @@ -864,7 +865,7 @@ GEM unicode-display_width (>= 1.1.1, < 4) terrapin (1.1.1) climate_control - test-prof (1.6.0) + test-prof (1.6.1) thor (1.5.0) tilt (2.7.0) timeout (0.6.1) @@ -888,7 +889,7 @@ GEM unf (~> 0.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2026.1) + tzinfo-data (1.2026.2) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext @@ -904,7 +905,7 @@ GEM vite_rails (3.0.20) railties (>= 5.1, < 9) vite_ruby (~> 3.0, >= 3.2.2) - vite_ruby (3.9.3) + vite_ruby (3.10.2) dry-cli (>= 0.7, < 2) logger (~> 1.6) mutex_m @@ -984,7 +985,6 @@ DEPENDENCIES haml-rails (~> 3.0) haml_lint hcaptcha (~> 7.1) - hiredis (~> 0.6) hiredis-client htmlentities (~> 4.3) http (~> 5.3.0) @@ -1020,32 +1020,32 @@ DEPENDENCIES omniauth-rails_csrf_protection (~> 2.0) omniauth-saml (~> 2.0) omniauth_openid_connect (~> 0.8.0) - opentelemetry-api (~> 1.8.0) - opentelemetry-exporter-otlp (~> 0.32.0) - opentelemetry-instrumentation-active_job (~> 0.10.0) - opentelemetry-instrumentation-active_model_serializers (~> 0.24.0) - opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0) - opentelemetry-instrumentation-excon (~> 0.28.0) - opentelemetry-instrumentation-faraday (~> 0.32.0) - opentelemetry-instrumentation-http (~> 0.29.0) - opentelemetry-instrumentation-http_client (~> 0.28.0) - opentelemetry-instrumentation-net_http (~> 0.28.0) - opentelemetry-instrumentation-pg (~> 0.35.0) - opentelemetry-instrumentation-rack (~> 0.30.0) - opentelemetry-instrumentation-rails (~> 0.40.0) - opentelemetry-instrumentation-redis (~> 0.28.0) - opentelemetry-instrumentation-sidekiq (~> 0.28.0) + opentelemetry-api (~> 1.9.0) + opentelemetry-exporter-otlp (~> 0.33.0) + opentelemetry-instrumentation-active_job (~> 0.11.0) + opentelemetry-instrumentation-active_model_serializers (~> 0.25.0) + opentelemetry-instrumentation-concurrent_ruby (~> 0.25.0) + opentelemetry-instrumentation-excon (~> 0.29.0) + opentelemetry-instrumentation-faraday (~> 0.33.0) + opentelemetry-instrumentation-http (~> 0.30.0) + opentelemetry-instrumentation-http_client (~> 0.29.0) + opentelemetry-instrumentation-net_http (~> 0.29.0) + opentelemetry-instrumentation-pg (~> 0.36.0) + opentelemetry-instrumentation-rack (~> 0.31.0) + opentelemetry-instrumentation-rails (~> 0.41.0) + opentelemetry-instrumentation-redis (~> 0.29.0) + opentelemetry-instrumentation-sidekiq (~> 0.29.0) opentelemetry-sdk (~> 1.4) ox (~> 2.14) parslet pg (~> 1.5) pghero - playwright-ruby-client (= 1.57.1) + playwright-ruby-client (= 1.59.0) premailer-rails prometheus_exporter (~> 2.2) propshaft public_suffix (~> 7.0) - puma (~> 7.0) + puma pundit (~> 2.3) rack-attack (~> 6.6) rack-cors @@ -1054,7 +1054,7 @@ DEPENDENCIES rails-i18n (~> 8.0) rdf-normalize (~> 0.5) redcarpet (~> 3.6) - redis (~> 4.5) + redis (~> 5) rqrcode (~> 3.0) rspec-github (~> 3.0) rspec-rails (~> 8.0) @@ -1097,7 +1097,7 @@ DEPENDENCIES xorcist (~> 1.1) RUBY VERSION - ruby 3.4.9 + ruby 4.0.3 BUNDLED WITH - 4.0.8 + 4.0.11 diff --git a/app/controllers/activitypub/featured_collections_controller.rb b/app/controllers/activitypub/featured_collections_controller.rb index 872d03423d2172..09de5583cc95e6 100644 --- a/app/controllers/activitypub/featured_collections_controller.rb +++ b/app/controllers/activitypub/featured_collections_controller.rb @@ -33,7 +33,9 @@ def index def set_collections authorize @account, :index_collections? - @collections = @account.collections.page(params[:page]).per(PER_PAGE) + @collections = @account.collections + .includes(:accepted_collection_items) + .page(params[:page]).per(PER_PAGE) rescue Mastodon::NotPermittedError not_found end diff --git a/app/controllers/admin/roles_controller.rb b/app/controllers/admin/roles_controller.rb index 238d75bf798842..abaa54b4a90e3a 100644 --- a/app/controllers/admin/roles_controller.rb +++ b/app/controllers/admin/roles_controller.rb @@ -62,7 +62,7 @@ def set_role def resource_params params - .expect(user_role: [:name, :color, :highlighted, :position, :require_2fa, permissions_as_keys: []]) + .expect(user_role: [:name, :color, :highlighted, :position, :require_2fa, :collection_limit, permissions_as_keys: []]) end end end diff --git a/app/controllers/api/v1/accounts/email_subscriptions_controller.rb b/app/controllers/api/v1/accounts/email_subscriptions_controller.rb new file mode 100644 index 00000000000000..4e773f902bce83 --- /dev/null +++ b/app/controllers/api/v1/accounts/email_subscriptions_controller.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class Api::V1::Accounts::EmailSubscriptionsController < Api::BaseController + before_action :set_account + before_action :require_feature_enabled! + before_action :require_account_permissions! + + def create + @account.email_subscriptions.create!(email: params[:email], locale: I18n.locale) + render_empty + rescue ActiveRecord::RecordInvalid => e + render json: ValidationErrorFormatter.new(e).as_json, status: 422 + end + + private + + def set_account + @account = Account.local.find(params[:account_id]) + end + + def require_feature_enabled! + head 404 unless Mastodon::Feature.email_subscriptions_enabled? + end + + def require_account_permissions! + head 404 if @account.unavailable? || !@account.user_can?(:manage_email_subscriptions) || !@account.user_email_subscriptions_enabled? + end +end diff --git a/app/controllers/api/v1/instances/terms_of_service_controller.rb b/app/controllers/api/v1/instances/terms_of_service_controller.rb new file mode 100644 index 00000000000000..9968b41317eb2f --- /dev/null +++ b/app/controllers/api/v1/instances/terms_of_service_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class Api::V1::Instances::TermsOfServiceController < Api::V1::Instances::BaseController + before_action :cache_even_if_authenticated! + + def index + @terms_of_service = TermsOfService.current || raise(ActiveRecord::RecordNotFound) + render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer + end + + def show + @terms_of_service = TermsOfService.published.find_by!(effective_date: params[:date]) + render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer + end +end diff --git a/app/controllers/api/v1/instances/terms_of_services_controller.rb b/app/controllers/api/v1/instances/terms_of_services_controller.rb deleted file mode 100644 index a32438e31d8c39..00000000000000 --- a/app/controllers/api/v1/instances/terms_of_services_controller.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -class Api::V1::Instances::TermsOfServicesController < Api::V1::Instances::BaseController - before_action :set_terms_of_service - - def show - cache_even_if_authenticated! - render json: @terms_of_service, serializer: REST::TermsOfServiceSerializer - end - - private - - def set_terms_of_service - @terms_of_service = begin - if params[:date].present? - TermsOfService.published.find_by!(effective_date: params[:date]) - else - TermsOfService.current - end - end - not_found if @terms_of_service.nil? - end -end diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 13919b400df6a3..91995f8421aa11 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -16,7 +16,7 @@ def index @relationships = StatusRelationshipsPresenter.new(target_statuses_from_notifications, current_user&.account_id) end - render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: @relationships + render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: @relationships, supported_notification_types: params[:supported_types] end def unread_count @@ -29,7 +29,7 @@ def unread_count def show @notification = current_account.notifications.without_suspended.find(params[:id]) - render json: @notification, serializer: REST::NotificationSerializer + render json: @notification, serializer: REST::NotificationSerializer, supported_notification_types: params[:supported_types] end def clear @@ -89,6 +89,8 @@ def browserable_params end def pagination_params(core_params) - params.slice(:limit, :account_id, :types, :exclude_types, :include_filtered).permit(:limit, :account_id, :include_filtered, types: [], exclude_types: []).merge(core_params) + params.slice(:limit, :account_id, :types, :exclude_types, :include_filtered, :supported_types) + .permit(:limit, :account_id, :include_filtered, types: [], exclude_types: [], supported_types: []) + .merge(core_params) end end diff --git a/app/controllers/api/v1_alpha/in_collections_controller.rb b/app/controllers/api/v1_alpha/in_collections_controller.rb new file mode 100644 index 00000000000000..087464989ef0e5 --- /dev/null +++ b/app/controllers/api/v1_alpha/in_collections_controller.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +class Api::V1Alpha::InCollectionsController < Api::BaseController + include Authorization + + DEFAULT_COLLECTIONS_LIMIT = 40 + + before_action :check_feature_enabled + + before_action -> { authorize_if_got_token! :read, :'read:collections' }, only: [:index] + + before_action :require_user! + before_action :set_account, only: [:index] + before_action :set_collections, only: [:index] + + after_action :insert_pagination_headers, only: [:index] + + after_action :verify_authorized + + def index + cache_if_unauthenticated! + authorize @account, :index_featured_in_collections? + + render json: @collections, each_serializer: REST::CollectionSerializer, adapter: :json + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end + + def set_collections + @collections = @account.featured_in_collections + .with_tag + .offset(offset_param) + .limit(limit_param(DEFAULT_COLLECTIONS_LIMIT)) + end + + def check_feature_enabled + raise ActionController::RoutingError unless Mastodon::Feature.collections_enabled? + end + + def next_path + return unless records_continue? + + api_v1_alpha_account_in_collections_url(@account, pagination_params(offset: offset_param + limit_param(DEFAULT_COLLECTIONS_LIMIT))) + end + + def prev_path + return if offset_param.zero? + + api_v1_alpha_account_in_collections_url(@account, pagination_params(offset: offset_param - limit_param(DEFAULT_COLLECTIONS_LIMIT))) + end + + def records_continue? + ((offset_param * limit_param(DEFAULT_COLLECTIONS_LIMIT)) + @collections.size) < @account.featured_in_collections.size + end + + def offset_param + params[:offset].to_i + end +end diff --git a/app/controllers/api/v2/notifications_controller.rb b/app/controllers/api/v2/notifications_controller.rb index 848c361cfc321f..f54cd230b7aaa1 100644 --- a/app/controllers/api/v2/notifications_controller.rb +++ b/app/controllers/api/v2/notifications_controller.rb @@ -33,7 +33,7 @@ def index 'app.notification_grouping.expand_accounts_param' => expand_accounts_param ) - render json: @presenter, serializer: REST::DedupNotificationGroupSerializer, relationships: @relationships, expand_accounts: expand_accounts_param + render json: @presenter, serializer: REST::DedupNotificationGroupSerializer, relationships: @relationships, expand_accounts: expand_accounts_param, supported_notification_types: params[:supported_types] end end @@ -48,7 +48,7 @@ def unread_count def show @notification = current_account.notifications.without_suspended.by_group_key(params[:group_key]).take! presenter = GroupedNotificationsPresenter.new(NotificationGroup.from_notifications([@notification])) - render json: presenter, serializer: REST::DedupNotificationGroupSerializer + render json: presenter, serializer: REST::DedupNotificationGroupSerializer, supported_notification_types: params[:supported_types] end def clear @@ -138,7 +138,9 @@ def browserable_params end def pagination_params(core_params) - params.slice(:limit, :include_filtered, :types, :exclude_types, :grouped_types).permit(:limit, :include_filtered, types: [], exclude_types: [], grouped_types: []).merge(core_params) + params.slice(:limit, :include_filtered, :types, :exclude_types, :grouped_types, :supported_types) + .permit(:limit, :include_filtered, types: [], exclude_types: [], grouped_types: [], supported_types: []) + .merge(core_params) end def expand_accounts_param diff --git a/app/controllers/auth/sessions/security_key_options_controller.rb b/app/controllers/auth/sessions/security_key_options_controller.rb new file mode 100644 index 00000000000000..1bd2b4043c7e1c --- /dev/null +++ b/app/controllers/auth/sessions/security_key_options_controller.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Auth::Sessions::SecurityKeyOptionsController < ApplicationController + skip_before_action :check_self_destruct! + skip_before_action :require_functional! + skip_before_action :update_user_sign_in + + def show + user = User.find_by(id: session[:attempt_user_id]) + + if user&.webauthn_enabled? + options_for_get = WebAuthn::Credential.options_for_get( + allow: user.webauthn_credentials.pluck(:external_id), + user_verification: 'discouraged' + ) + + session[:webauthn_challenge] = options_for_get.challenge + + render json: options_for_get, status: 200 + else + render json: { error: t('webauthn_credentials.not_enabled') }, status: 401 + end + end +end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 71ef01e5ad67b2..fc188b0c111d92 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -38,23 +38,6 @@ def destroy flash.delete(:notice) end - def webauthn_options - user = User.find_by(id: session[:attempt_user_id]) - - if user&.webauthn_enabled? - options_for_get = WebAuthn::Credential.options_for_get( - allow: user.webauthn_credentials.pluck(:external_id), - user_verification: 'discouraged' - ) - - session[:webauthn_challenge] = options_for_get.challenge - - render json: options_for_get, status: 200 - else - render json: { error: t('webauthn_credentials.not_enabled') }, status: 401 - end - end - protected def find_user diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 3e2ba714702d59..70541433f00ef7 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -17,7 +17,10 @@ class CollectionsController < ApplicationController def show respond_to do |format| - # TODO: format.html + format.html do + expires_in expiration_duration, public: true unless user_signed_in? + render template: 'home/index' + end format.json do expires_in expiration_duration, public: true if public_fetch_mode? @@ -28,8 +31,17 @@ def show private + def set_account + if account_id_param.present? + @account = Account.local.find(account_id_param) + else + @collection = Collection.find(params[:id]) + @account = @collection.account + end + end + def set_collection - @collection = @account.collections.find(params[:id]) + @collection ||= @account.collections.find(params[:id]) authorize @collection, :show? rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError not_found diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 1e83ab9c69b6b7..fd1e2fafb29ce6 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -53,19 +53,21 @@ def signed_request_actor raise Mastodon::SignatureVerificationError, 'Request not signed' unless signed_request? - actor = actor_from_key_id + keypair = keypair_from_key_id - raise Mastodon::SignatureVerificationError, "Public key not found for key #{signature_key_id}" if actor.nil? + raise Mastodon::SignatureVerificationError, "Public key not found for key #{signature_key_id}" if keypair.nil? - return (@signed_request_actor = actor) if signed_request.verified?(actor) + check_keypair_validity!(keypair) + return (@signed_request_actor = keypair.actor) if signed_request.verified?(keypair) - actor = stoplight_wrapper.run { actor_refresh_key!(actor) } + keypair = stoplight_wrapper.run { keypair_refresh_key!(keypair) } - raise Mastodon::SignatureVerificationError, "Could not refresh public key #{signature_key_id}" if actor.nil? + raise Mastodon::SignatureVerificationError, "Could not refresh public key #{signature_key_id}" if keypair.nil? - return (@signed_request_actor = actor) if signed_request.verified?(actor) + check_keypair_validity!(keypair) + return (@signed_request_actor = keypair.actor) if signed_request.verified?(keypair) - fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri}" + fail_with! "Verification failed for #{keypair.actor.to_log_human_identifier} #{keypair.actor.uri} #{keypair.uri}" rescue Mastodon::MalformedHeaderError => e @signature_verification_failure_code = 400 fail_with! e.message @@ -89,7 +91,7 @@ def fail_with!(message, **options) @signed_request_actor = nil end - def actor_from_key_id + def keypair_from_key_id key_id = signed_request.key_id domain = key_id.start_with?('acct:') ? key_id.split('@').last : key_id @@ -99,11 +101,12 @@ def actor_from_key_id end if key_id.start_with?('acct:') - stoplight_wrapper.run { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) } + stoplight_wrapper.run { fetch_key_from_acct(key_id.delete_prefix('acct:')) } elsif !ActivityPub::TagManager.instance.local_uri?(key_id) - account = ActivityPub::TagManager.instance.uri_to_actor(key_id) - account ||= stoplight_wrapper.run { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) } - account + keypair = Keypair.from_keyid(key_id) + return keypair if keypair.present? + + stoplight_wrapper.run { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) } end rescue Mastodon::PrivateNetworkAddressError => e raise Mastodon::SignatureVerificationError, "Requests to private network addresses are disallowed (tried to query #{e.host})" @@ -111,6 +114,15 @@ def actor_from_key_id raise Mastodon::SignatureVerificationError, e.message end + def fetch_key_from_acct(acct) + # This is legacy and can't let us pick a specific key, so pick the first + + account = ResolveAccountService.new.call(acct, suppress_errors: false) + return if account.nil? + + account.keypairs.first || Keypair.from_legacy_account(account) + end + def stoplight_wrapper Stoplight( "source:#{request.remote_ip}", @@ -120,14 +132,32 @@ def stoplight_wrapper ) end - def actor_refresh_key!(actor) - return if actor.local? || !actor.activitypub? - return actor.refresh! if actor.respond_to?(:refresh!) && actor.possibly_stale? + def keypair_refresh_key!(keypair) + return if keypair.actor.local? || !keypair.actor.activitypub? - ActivityPub::FetchRemoteActorService.new.call(actor.uri, only_key: true, suppress_errors: false) + actor = if keypair.actor.possibly_stale? + # Doing a full profile refresh + keypair.actor.refresh! + else + # Only refreshing keys, skipping potentially more expensive requests + ActivityPub::FetchRemoteActorService.new.call(keypair.actor.uri, only_key: true, suppress_errors: false) + end + return if actor.nil? + + keypair_uri = keypair.uri + + keypair = actor.keypairs.find_by(uri: keypair_uri) + return keypair if keypair.present? + + Keypair.from_legacy_account(actor, uri: keypair_uri) if actor.public_key.present? rescue Mastodon::PrivateNetworkAddressError => e raise Mastodon::SignatureVerificationError, "Requests to private network addresses are disallowed (tried to query #{e.host})" rescue Mastodon::HostValidationError, ActivityPub::FetchRemoteActorService::Error, Webfinger::Error => e raise Mastodon::SignatureVerificationError, e.message end + + def check_keypair_validity!(keypair) + raise Mastodon::SignatureVerification, "Key #{signature_key_id} is revoked" if keypair.revoked? + raise Mastodon::SignatureVerification, "Key #{signature_key_id} has expired" if keypair.expired? + end end diff --git a/app/controllers/email_subscriptions/confirmations_controller.rb b/app/controllers/email_subscriptions/confirmations_controller.rb new file mode 100644 index 00000000000000..2750b68d4fc723 --- /dev/null +++ b/app/controllers/email_subscriptions/confirmations_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class EmailSubscriptions::ConfirmationsController < ApplicationController + layout 'auth' + + before_action :set_email_subscription + + def show + @email_subscription.confirm! unless @email_subscription.confirmed? + end + + private + + def set_email_subscription + @email_subscription = EmailSubscription.find_by!(confirmation_token: params[:confirmation_token]) + end +end diff --git a/app/controllers/mail_subscriptions_controller.rb b/app/controllers/mail_subscriptions_controller.rb deleted file mode 100644 index 34df75f63ad6c4..00000000000000 --- a/app/controllers/mail_subscriptions_controller.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -class MailSubscriptionsController < ApplicationController - layout 'auth' - - skip_before_action :require_functional! - - before_action :set_user - before_action :set_type - - protect_from_forgery with: :null_session - - def show; end - - def create - @user.settings[email_type_from_param] = false - @user.save! - end - - private - - def set_user - @user = GlobalID::Locator.locate_signed(params[:token], for: 'unsubscribe') - not_found unless @user - end - - def set_type - @type = email_type_from_param - end - - def email_type_from_param - case params[:type] - when 'follow', 'reblog', 'favourite', 'mention', 'follow_request' - "notification_emails.#{params[:type]}" - else - not_found - end - end -end diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 0590ea40270cd3..2aa83717c38ffa 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -24,12 +24,7 @@ def player; end private def set_media_attachment - id = params[:id] || params[:medium_id] - return if id.nil? - - scope = MediaAttachment.local.attached - # If id is 19 characters long, it's a shortcode, otherwise it's an identifier - @media_attachment = id.size == 19 ? scope.find_by!(shortcode: id) : scope.find(id) + @media_attachment = MediaAttachment.local.attached.identified(params[:id]) end def verify_permitted_status! diff --git a/app/controllers/settings/privacy_controller.rb b/app/controllers/settings/privacy_controller.rb index 96efa03ccf7e3d..2716fce806e99c 100644 --- a/app/controllers/settings/privacy_controller.rb +++ b/app/controllers/settings/privacy_controller.rb @@ -2,6 +2,7 @@ class Settings::PrivacyController < Settings::BaseController before_action :set_account + before_action :set_email_subscriptions_count def show; end @@ -24,4 +25,8 @@ def account_params def set_account @account = current_account end + + def set_email_subscriptions_count + @email_subscriptions_count = with_read_replica { @account.email_subscriptions.confirmed.count } + end end diff --git a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb index 6ec53224d384c3..565409612c4ff3 100644 --- a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb +++ b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb @@ -7,7 +7,7 @@ class RecoveryCodesController < BaseController skip_before_action :require_functional! - before_action :require_challenge!, on: :create + before_action :require_challenge! def create @recovery_codes = current_user.generate_otp_backup_codes! diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb index 9371ebf7d0676a..a5373685301fe0 100644 --- a/app/controllers/severed_relationships_controller.rb +++ b/app/controllers/severed_relationships_controller.rb @@ -13,13 +13,13 @@ def index def following respond_to do |format| - format.csv { send_data following_data, filename: "following-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" } + format.csv { send_data following_data, filename: } end end def followers respond_to do |format| - format.csv { send_data followers_data, filename: "followers-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" } + format.csv { send_data followers_data, filename: } end end @@ -48,4 +48,8 @@ def followers_data def acct(account) account.local? ? account.local_username_and_domain : account.acct end + + def filename + "#{action_name}-#{@event.identifier}.csv" + end end diff --git a/app/controllers/unsubscriptions_controller.rb b/app/controllers/unsubscriptions_controller.rb new file mode 100644 index 00000000000000..aac58a38068bc4 --- /dev/null +++ b/app/controllers/unsubscriptions_controller.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +class UnsubscriptionsController < ApplicationController + layout 'auth' + + skip_before_action :require_functional! + + before_action :set_recipient + before_action :set_type + before_action :set_scope + before_action :require_type_if_user! + + protect_from_forgery with: :null_session + + def show; end + + def create + case @scope + when :user + @recipient.settings[@type] = false + @recipient.save! + when :email_subscription + @recipient.destroy! + end + end + + private + + def set_recipient + @recipient = GlobalID::Locator.locate_signed(params[:token], for: 'unsubscribe') + not_found unless @recipient + end + + def set_scope + if @recipient.is_a?(User) + @scope = :user + elsif @recipient.is_a?(EmailSubscription) + @scope = :email_subscription + else + not_found + end + end + + def set_type + @type = email_type_from_param + end + + def require_type_if_user! + not_found if @recipient.is_a?(User) && @type.blank? + end + + def email_type_from_param + case params[:type] + when 'follow', 'reblog', 'favourite', 'mention', 'follow_request' + "notification_emails.#{params[:type]}" + end + end +end diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb index 72f0ea890fc654..9536b948f3c1e4 100644 --- a/app/controllers/well_known/webfinger_controller.rb +++ b/app/controllers/well_known/webfinger_controller.rb @@ -18,23 +18,7 @@ def show private def set_account - username = username_from_resource - - @account = begin - if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain - Account.representative - else - Account.find_local!(username) - end - end - end - - def username_from_resource - resource_user = resource_param - username, domain = resource_user.split('@') - resource_user = "#{username}@#{Rails.configuration.x.local_domain}" if Rails.configuration.x.alternate_domains.include?(domain) - - WebfingerResource.new(resource_user).username + @account = WebfingerResource.new(resource_param).account end def resource_param diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index be9f737530b97c..aae33e2832b05a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -36,11 +36,11 @@ def closed_registrations? Setting.registrations_mode == 'none' end - def available_sign_up_path + def available_sign_up_url if closed_registrations? || omniauth_only? - 'https://joinmastodon.org/#getting-started' + 'https://joinmastodon.org/' else - ENV.fetch('SSO_ACCOUNT_SIGN_UP', new_user_registration_path) + ENV.fetch('SSO_ACCOUNT_SIGN_UP', new_user_registration_url) end end diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 4f0327e3704bc0..634fd245541459 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -4,6 +4,7 @@ module ContextHelper NAMED_CONTEXT_MAP = { activitystreams: 'https://www.w3.org/ns/activitystreams', security: 'https://w3id.org/security/v1', + webfinger: 'https://purl.archive.org/socialweb/webfinger', }.freeze CONTEXT_EXTENSION_MAP = { @@ -44,7 +45,7 @@ module ContextHelper }, quote_requests: { 'QuoteRequest' => 'https://w3id.org/fep/044f#QuoteRequest' }, quotes: { - 'quote' => 'https://w3id.org/fep/044f#quote', + 'quote' => { '@id' => 'https://w3id.org/fep/044f#quote', '@type' => '@id' }, 'quoteUri' => 'http://fedibird.com/ns#quoteUri', '_misskey_quote' => 'https://misskey-hub.net/ns#_misskey_quote', 'quoteAuthorization' => { '@id' => 'https://w3id.org/fep/044f#quoteAuthorization', '@type' => '@id' }, diff --git a/app/helpers/invites_helper.rb b/app/helpers/invites_helper.rb deleted file mode 100644 index c189061db0bf0f..00000000000000 --- a/app/helpers/invites_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module InvitesHelper - def invites_max_uses_options - [1, 5, 10, 25, 50, 100] - end - - def invites_expires_options - [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week] - end -end diff --git a/app/helpers/media_player_helper.rb b/app/helpers/media_player_helper.rb new file mode 100644 index 00000000000000..8b617164d75645 --- /dev/null +++ b/app/helpers/media_player_helper.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module MediaPlayerHelper + PLAYER_HEIGHT = 380 + PLAYER_WIDTH = 670 +end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 44113f3d475d9e..196eac52d55d82 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -23,6 +23,10 @@ def featured_tags_hint(recently_used_tags) ) end + def user_settings_collection(value) + UserSettings.definition_for(value)&.in || [] + end + def author_attribution_name(account) return if account.nil? diff --git a/app/helpers/theme_helper.rb b/app/helpers/theme_helper.rb index f5f0c6ea95fae1..180013e2ebc215 100644 --- a/app/helpers/theme_helper.rb +++ b/app/helpers/theme_helper.rb @@ -65,13 +65,15 @@ def user_custom_stylesheet end def current_theme - unless Themes.instance.names.include? current_user&.setting_theme - return 'default' unless Themes.instance.names.include? Setting.theme + available_themes = Themes.instance.names - return Setting.theme - end + user_theme = current_user&.setting_theme + return user_theme if user_theme && available_themes.include?(user_theme) + + site_theme = Setting.theme + return site_theme if available_themes.include?(site_theme) - current_user.setting_theme + 'default' # Fallback end def color_scheme diff --git a/app/javascript/images/anniversary.svg b/app/javascript/images/anniversary.svg new file mode 100644 index 00000000000000..8663dea7c23786 --- /dev/null +++ b/app/javascript/images/anniversary.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/images/elephant_ui.svg b/app/javascript/images/elephant_ui.svg new file mode 100644 index 00000000000000..88b23841ffd80c --- /dev/null +++ b/app/javascript/images/elephant_ui.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/javascript/images/icons/icon_clock.svg b/app/javascript/images/icons/icon_clock.svg new file mode 100644 index 00000000000000..cba7451c5b3cbb --- /dev/null +++ b/app/javascript/images/icons/icon_clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/javascript/images/icons/icon_follower.svg b/app/javascript/images/icons/icon_follower.svg new file mode 100644 index 00000000000000..8a7372fd58d593 --- /dev/null +++ b/app/javascript/images/icons/icon_follower.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 0ae40c30c1fe3d..1762d8e043e241 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -8,6 +8,7 @@ import { browserHistory } from 'mastodon/components/router'; import { countableText } from 'mastodon/features/compose/util/counter'; import { search as emojiSearch } from 'mastodon/features/emoji/emoji_mart_search_light'; import { tagHistory } from 'mastodon/settings'; +import { fetchCustomEmojiData } from '@/mastodon/features/emoji/picker'; import { showAlert, showAlertForError } from './alerts'; import { useEmoji } from './emojis'; @@ -158,10 +159,11 @@ export function resetCompose() { }; } -export const focusCompose = (defaultText = '') => (dispatch, getState) => { +export const focusCompose = (defaultText = '', caretStart = false) => (dispatch, getState) => { dispatch({ type: COMPOSE_FOCUS, defaultText, + caretStart, }); ensureComposeIsVisible(getState); @@ -580,7 +582,7 @@ export function clearComposeSuggestions() { }; } -const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => { +const fetchComposeSuggestionsAccounts = throttle((dispatch, token) => { if (fetchComposeSuggestionsAccountsController) { fetchComposeSuggestionsAccountsController.abort(); } @@ -607,12 +609,13 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => }); }, 200, { leading: true, trailing: true }); -const fetchComposeSuggestionsEmojis = (dispatch, getState, token) => { - const results = emojiSearch(token.replace(':', ''), { maxResults: 5 }); +const fetchComposeSuggestionsEmojis = async (dispatch, token) => { + const custom = await fetchCustomEmojiData(); + const results = emojiSearch(token.replace(':', ''), { maxResults: 5, custom }); dispatch(readyComposeSuggestionsEmojis(token, results)); }; -const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => { +const fetchComposeSuggestionsTags = throttle((dispatch, token) => { if (fetchComposeSuggestionsTagsController) { fetchComposeSuggestionsTagsController.abort(); } @@ -646,14 +649,14 @@ export function fetchComposeSuggestions(token) { return (dispatch, getState) => { switch (token[0]) { case ':': - fetchComposeSuggestionsEmojis(dispatch, getState, token); + void fetchComposeSuggestionsEmojis(dispatch, token); break; case '#': case '#': - fetchComposeSuggestionsTags(dispatch, getState, token); + fetchComposeSuggestionsTags(dispatch, token); break; default: - fetchComposeSuggestionsAccounts(dispatch, getState, token); + fetchComposeSuggestionsAccounts(dispatch, token); break; } }; diff --git a/app/javascript/mastodon/actions/custom_emojis.js b/app/javascript/mastodon/actions/custom_emojis.js deleted file mode 100644 index fb65f072dc8db7..00000000000000 --- a/app/javascript/mastodon/actions/custom_emojis.js +++ /dev/null @@ -1,40 +0,0 @@ -import api from '../api'; - -export const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST'; -export const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS'; -export const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL'; - -export function fetchCustomEmojis() { - return (dispatch) => { - dispatch(fetchCustomEmojisRequest()); - - api().get('/api/v1/custom_emojis').then(response => { - dispatch(fetchCustomEmojisSuccess(response.data)); - }).catch(error => { - dispatch(fetchCustomEmojisFail(error)); - }); - }; -} - -export function fetchCustomEmojisRequest() { - return { - type: CUSTOM_EMOJIS_FETCH_REQUEST, - skipLoading: true, - }; -} - -export function fetchCustomEmojisSuccess(custom_emojis) { - return { - type: CUSTOM_EMOJIS_FETCH_SUCCESS, - custom_emojis, - skipLoading: true, - }; -} - -export function fetchCustomEmojisFail(error) { - return { - type: CUSTOM_EMOJIS_FETCH_FAIL, - error, - skipLoading: true, - }; -} diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 802d55c43cf265..78844594426683 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -47,8 +47,10 @@ export function updateEmojiReactions(emoji_reaction) { export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { - const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); - const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); + const filterType = notification.type === 'quoted_update' ? 'update' : notification.type; + + const showAlert = getState().getIn(['settings', 'notifications', 'alerts', filterType], true); + const playSound = getState().getIn(['settings', 'notifications', 'sounds', filterType], true); let filtered = false; diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts index fc6e38fbc8d47a..2229d17c56026a 100644 --- a/app/javascript/mastodon/api/accounts.ts +++ b/app/javascript/mastodon/api/accounts.ts @@ -75,3 +75,6 @@ export const apiDeleteProfileAvatar = () => export const apiDeleteProfileHeader = () => apiRequestDelete('v1/profile/header'); + +export const apiSubscribeByEmail = (id: string, email: string) => + apiRequestPost(`v1/accounts/${id}/email_subscriptions`, { email }); diff --git a/app/javascript/mastodon/api/collections.ts b/app/javascript/mastodon/api/collections.ts index 862f98b60a688d..7f39651f02ad60 100644 --- a/app/javascript/mastodon/api/collections.ts +++ b/app/javascript/mastodon/api/collections.ts @@ -34,11 +34,16 @@ export const apiGetCollection = (collectionId: string) => `v1_alpha/collections/${collectionId}`, ); -export const apiGetAccountCollections = (accountId: string) => +export const apiGetCollectionsCreatedByAccount = (accountId: string) => apiRequestGet( `v1_alpha/accounts/${accountId}/collections`, ); +export const apiGetCollectionsFeaturingAccount = (accountId: string) => + apiRequestGet( + `v1_alpha/accounts/${accountId}/in_collections`, + ); + export const apiAddCollectionItem = (collectionId: string, accountId: string) => apiRequestPost( `v1_alpha/collections/${collectionId}/items`, diff --git a/app/javascript/mastodon/api_types/accounts.ts b/app/javascript/mastodon/api_types/accounts.ts index 273a523e690c84..ba50a56fe051d1 100644 --- a/app/javascript/mastodon/api_types/accounts.ts +++ b/app/javascript/mastodon/api_types/accounts.ts @@ -62,6 +62,7 @@ export interface BaseApiAccountJSON { acct: string; avatar: string; avatar_static: string; + avatar_description: string; bot: boolean; created_at: string; discoverable?: boolean; @@ -75,8 +76,9 @@ export interface BaseApiAccountJSON { group: boolean; header: string; header_static: string; + header_description: string; id: string; - last_status_at: string; + last_status_at: string | null; locked: boolean; show_media: boolean; show_media_replies: boolean; @@ -96,6 +98,7 @@ export interface BaseApiAccountJSON { limited?: boolean; memorial?: boolean; hide_collections: boolean; + email_subscriptions?: boolean; } // See app/serializers/rest/muted_account_serializer.rb diff --git a/app/javascript/mastodon/api_types/collections.ts b/app/javascript/mastodon/api_types/collections.ts index fae95875d1e3b3..2ba20eb514c6a0 100644 --- a/app/javascript/mastodon/api_types/collections.ts +++ b/app/javascript/mastodon/api_types/collections.ts @@ -11,12 +11,13 @@ export interface ApiCollectionJSON { account_id: string; id: string; - uri: string | null; + uri: string; + url: string; local: boolean; item_count: number; name: string; - description: string; + description: string | null; tag: ApiTagJSON | null; language: string | null; sensitive: boolean; @@ -56,7 +57,7 @@ export interface CollectionAccountItem { id: string; account_id?: string; // Only present when state is 'accepted' (or the collection is your own) state: 'pending' | 'accepted' | 'rejected' | 'revoked'; - position: number; + created_at: string; } export interface WrappedCollectionAccountItem { diff --git a/app/javascript/mastodon/api_types/errors.ts b/app/javascript/mastodon/api_types/errors.ts new file mode 100644 index 00000000000000..46f8e0b8cdaa08 --- /dev/null +++ b/app/javascript/mastodon/api_types/errors.ts @@ -0,0 +1,22 @@ +export type ErrorToken = + | 'ERR_TAKEN' + | 'ERR_INVALID' + | 'ERR_BLOCKED' + | 'ERR_RESERVED' + | 'ERR_TOO_MANY' + | 'ERR_MALFORMED' + | 'ERR_UNUSABLE' + | 'ERR_TOO_SOON' + | 'ERR_BELOW_LIMIT' + | 'ERR_UNREACHABLE' + | 'ERR_ELEVATED'; + +export interface ValidationError { + error: ErrorToken; + description: string; +} + +export interface ValidationErrorResponse { + error: string; + details: Record; +} diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index 29fa95fad4f718..05530042c2f56b 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -3,6 +3,7 @@ import type { AccountWarningAction } from 'mastodon/models/notification_group'; import type { ApiAccountJSON } from './accounts'; +import type { ApiCollectionJSON } from './collections'; import type { ApiListJSON } from './lists'; import type { ApiReportJSON } from './reports'; import type { ApiStatusJSON } from './statuses'; @@ -26,6 +27,8 @@ export const allNotificationTypes: NotificationType[] = [ 'moderation_warning', 'severed_relationships', 'annual_report', + 'added_to_collection', + 'collection_update', ]; export type NotificationWithStatusType = @@ -49,7 +52,9 @@ export type NotificationType = | 'severed_relationships' | 'admin.sign_up' | 'admin.report' - | 'annual_report'; + | 'annual_report' + | 'added_to_collection' + | 'collection_update'; export interface NotifyEmojiReactionJSON { name: string; @@ -111,6 +116,26 @@ interface ReportNotificationJSON extends BaseNotificationJSON { report: ApiReportJSON; } +interface AddedToCollectionNotificationGroupJSON extends BaseNotificationGroupJSON { + type: 'added_to_collection'; + collection: ApiCollectionJSON; +} + +interface AddedToCollectionNotificationJSON extends BaseNotificationJSON { + type: 'added_to_collection'; + collection: ApiCollectionJSON; +} + +interface CollectionUpdateNotificationGroupJSON extends BaseNotificationGroupJSON { + type: 'collection_update'; + collection: ApiCollectionJSON; +} + +interface CollectionUpdateNotificationJSON extends BaseNotificationJSON { + type: 'collection_update'; + collection: ApiCollectionJSON; +} + type SimpleNotificationTypes = 'follow' | 'follow_request' | 'admin.sign_up'; interface SimpleNotificationGroupJSON extends BaseNotificationGroupJSON { type: SimpleNotificationTypes; @@ -174,7 +199,9 @@ export type ApiNotificationJSON = | ReportNotificationJSON | AccountRelationshipSeveranceNotificationJSON | NotificationWithStatusJSON - | ModerationWarningNotificationJSON; + | ModerationWarningNotificationJSON + | AddedToCollectionNotificationJSON + | CollectionUpdateNotificationJSON; export type ApiNotificationGroupJSON = | SimpleNotificationGroupJSON @@ -182,7 +209,9 @@ export type ApiNotificationGroupJSON = | AccountRelationshipSeveranceNotificationGroupJSON | NotificationGroupWithStatusJSON | ModerationWarningNotificationGroupJSON - | AnnualReportNotificationGroupJSON; + | AnnualReportNotificationGroupJSON + | AddedToCollectionNotificationGroupJSON + | CollectionUpdateNotificationGroupJSON; export interface ApiNotificationGroupsResultJSON { accounts: ApiAccountJSON[]; diff --git a/app/javascript/mastodon/components/account/index.tsx b/app/javascript/mastodon/components/account/index.tsx index bc96b41e36481a..105a2e330dd067 100644 --- a/app/javascript/mastodon/components/account/index.tsx +++ b/app/javascript/mastodon/components/account/index.tsx @@ -23,6 +23,7 @@ import { openModal } from 'mastodon/actions/modal'; import { initMuteModal } from 'mastodon/actions/mutes'; import { apiFollowAccount } from 'mastodon/api/accounts'; import { Avatar } from 'mastodon/components/avatar'; +import { VerifiedBadge } from 'mastodon/components/badge'; import { Button } from 'mastodon/components/button'; import { FollowersCounter } from 'mastodon/components/counters'; import { DisplayName } from 'mastodon/components/display_name'; @@ -31,7 +32,6 @@ import { FollowButton } from 'mastodon/components/follow_button'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; import { ShortNumber } from 'mastodon/components/short_number'; import { Skeleton } from 'mastodon/components/skeleton'; -import { VerifiedBadge } from 'mastodon/components/verified_badge'; import { useIdentity } from 'mastodon/identity_context'; import { me } from 'mastodon/initial_state'; import type { MenuItem } from 'mastodon/models/dropdown_menu'; @@ -79,6 +79,7 @@ interface AccountProps { withMenu?: boolean; withBorder?: boolean; extraAccountInfo?: React.ReactNode; + className?: string; children?: React.ReactNode; } @@ -94,6 +95,7 @@ export const Account: React.FC = ({ withMenu = true, withBorder = true, extraAccountInfo, + className, children, }) => { const intl = useIntl(); @@ -285,7 +287,7 @@ export const Account: React.FC = ({ if (account?.mute_expires_at) { muteTimeRemaining = ( <> - · + · ); } @@ -300,7 +302,7 @@ export const Account: React.FC = ({ return (
= ({ accountId }) => { const account = useAccount(accountId); @@ -46,9 +41,6 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { return null; } - const isRedesign = isRedesignEnabled(); - const className = isRedesign ? classes.badge : ''; - const domain = account.acct.includes('@') ? account.acct.split('@')[1] : localDomain; @@ -58,7 +50,6 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { , @@ -68,8 +59,7 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { , ); @@ -77,25 +67,19 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { }); if (account.bot) { - badges.push(); + badges.push(); } if (account.group) { - badges.push(); + badges.push(); } - if (isRedesign && relationship) { + if (relationship) { if (relationship.blocking) { - badges.push( - , - ); + badges.push(); } if (relationship.domain_blocking) { badges.push( = ({ accountId }) => { badges.push( , ); @@ -121,20 +104,10 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { return null; } - return
{badges}
; + return
{badges}
; }; -export const PinnedBadge: FC = () => ( - } - label={ - - } - /> -); - function isAdminBadge(role: AccountRole) { const name = role.name.toLowerCase(); - return isRedesignEnabled() && (name === 'admin' || name === 'owner'); + return name === 'admin' || name === 'owner'; } diff --git a/app/javascript/mastodon/features/account_timeline/components/buttons.tsx b/app/javascript/mastodon/components/account_header/buttons.tsx similarity index 93% rename from app/javascript/mastodon/features/account_timeline/components/buttons.tsx rename to app/javascript/mastodon/components/account_header/buttons.tsx index fe0bbbfbd620e3..737a3b9ca5a302 100644 --- a/app/javascript/mastodon/features/account_timeline/components/buttons.tsx +++ b/app/javascript/mastodon/components/account_header/buttons.tsx @@ -6,9 +6,6 @@ import { defineMessages, useIntl } from 'react-intl'; import classNames from 'classnames'; import { followAccount } from '@/mastodon/actions/accounts'; -import { CopyIconButton } from '@/mastodon/components/copy_icon_button'; -import { FollowButton } from '@/mastodon/components/follow_button'; -import { IconButton } from '@/mastodon/components/icon_button'; import { useAccount } from '@/mastodon/hooks/useAccount'; import { getAccountHidden } from '@/mastodon/selectors/accounts'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; @@ -16,7 +13,9 @@ import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react'; import ShareIcon from '@/material-icons/400-24px/share.svg?react'; -import { isRedesignEnabled } from '../common'; +import { CopyIconButton } from '../copy_icon_button'; +import { FollowButton } from '../follow_button'; +import { IconButton } from '../icon_button'; import { AccountMenu } from './menu'; @@ -97,7 +96,6 @@ const AccountButtonsOther: FC< accountId={accountId} className='account__header__follow-button' labelLength='long' - withUnmute={!isRedesignEnabled()} /> )} {isFollowing && ( diff --git a/app/javascript/mastodon/features/account_timeline/components/fields.tsx b/app/javascript/mastodon/components/account_header/fields.tsx similarity index 82% rename from app/javascript/mastodon/features/account_timeline/components/fields.tsx rename to app/javascript/mastodon/components/account_header/fields.tsx index 5bad90aaaebb95..ce2fe9d3225d1a 100644 --- a/app/javascript/mastodon/features/account_timeline/components/fields.tsx +++ b/app/javascript/mastodon/components/account_header/fields.tsx @@ -1,67 +1,29 @@ import { useCallback, useMemo, useRef, useState } from 'react'; import type { FC } from 'react'; -import { defineMessage, FormattedMessage, useIntl } from 'react-intl'; +import { defineMessage, useIntl } from 'react-intl'; import classNames from 'classnames'; import IconVerified from '@/images/icons/icon_verified.svg?react'; import { openModal } from '@/mastodon/actions/modal'; -import { AccountFields } from '@/mastodon/components/account_fields'; -import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; -import type { EmojiHTMLProps } from '@/mastodon/components/emoji/html'; -import { EmojiHTML } from '@/mastodon/components/emoji/html'; -import { FormattedDateWrapper } from '@/mastodon/components/formatted_date'; -import { Icon } from '@/mastodon/components/icon'; -import { IconButton } from '@/mastodon/components/icon_button'; -import { MiniCard } from '@/mastodon/components/mini_card'; -import { useElementHandledLink } from '@/mastodon/components/status/handled_link'; +import { useFieldHtml } from '@/mastodon/features/account_timeline/hooks/useFieldHtml'; +import { cleanExtraEmojis } from '@/mastodon/features/emoji/normalize'; import { useAccount } from '@/mastodon/hooks/useAccount'; import { useResizeObserver } from '@/mastodon/hooks/useObserver'; -import type { Account } from '@/mastodon/models/account'; +import type { AccountFieldShape } from '@/mastodon/models/account'; import { useAppDispatch } from '@/mastodon/store'; import MoreIcon from '@/material-icons/400-24px/more_horiz.svg?react'; -import { cleanExtraEmojis } from '../../emoji/normalize'; -import type { AccountField } from '../common'; -import { isRedesignEnabled } from '../common'; -import { useFieldHtml } from '../hooks/useFieldHtml'; +import { CustomEmojiProvider } from '../emoji/context'; +import type { EmojiHTMLProps } from '../emoji/html'; +import { EmojiHTML } from '../emoji/html'; +import { Icon } from '../icon'; +import { IconButton } from '../icon_button'; +import { MiniCard } from '../mini_card'; +import { useElementHandledLink } from '../status/handled_link'; -import classes from './redesign.module.scss'; - -export const AccountHeaderFields: FC<{ accountId: string }> = ({ - accountId, -}) => { - const account = useAccount(accountId); - - if (!account) { - return null; - } - - if (isRedesignEnabled()) { - return ; - } - - return ( -
-
-
- -
-
- -
-
- - -
- ); -}; +import classes from './styles.module.scss'; const verifyMessage = defineMessage({ id: 'account.link_verified_on', @@ -75,13 +37,28 @@ const dateFormatOptions: Intl.DateTimeFormatOptions = { minute: '2-digit', }; -const RedesignAccountHeaderFields: FC<{ account: Account }> = ({ account }) => { +export interface AccountField extends AccountFieldShape { + nameHasEmojis: boolean; + value_plain: string; + valueHasEmojis: boolean; +} + +export const AccountHeaderFields: FC<{ accountId: string }> = ({ + accountId, +}) => { + const account = useAccount(accountId); + const emojis = useMemo( - () => cleanExtraEmojis(account.emojis), - [account.emojis], + () => cleanExtraEmojis(account?.emojis), + [account?.emojis], ); + const accountFields = account?.fields; const fields: AccountField[] = useMemo(() => { - const fields = account.fields.toJS(); + const fields = accountFields?.toJS(); + if (!fields) { + return []; + } + if (!emojis) { return fields.map((field) => ({ ...field, @@ -102,10 +79,10 @@ const RedesignAccountHeaderFields: FC<{ account: Account }> = ({ account }) => { field.value_plain?.includes(`:${code}:`), ), })); - }, [account.fields, emojis]); + }, [accountFields, emojis]); const htmlHandlers = useElementHandledLink({ - hashtagAccountId: account.id, + hashtagAccountId: account?.id, }); const { wrapperRef } = useColumnWrap(); @@ -264,6 +241,7 @@ function useColumnWrap() { const columnCount = parseInt(styles.getPropertyValue('--cols')) || 2; const listWidth = listEle.offsetWidth; const colWidth = (listWidth - gap * (columnCount - 1)) / columnCount; + const halfColSpan = columnCount / 2; // Matrix to hold the grid layout. const itemGrid: { ele: HTMLElement; span: number }[][] = []; @@ -313,10 +291,23 @@ function useColumnWrap() { if (!item) { break; } + const { ele, span } = item; + if (i < row.length - 1) { ele.dataset.cols = span.toString(); remainingRowSpan -= span; + } else if ( + row.length > 1 && + row.length === halfColSpan && + span === 1 && + remainingRowSpan > 1 + ) { + // Special case for 2 items in a row where both items only need 1 column. + ele.dataset.cols = halfColSpan.toString(); + if (row[0]) { + row[0].ele.dataset.cols = halfColSpan.toString(); + } } else { // Last item in the row takes up remaining space to fill the row. ele.dataset.cols = remainingRowSpan.toString(); diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/components/account_header/index.tsx similarity index 64% rename from app/javascript/mastodon/features/account_timeline/components/account_header.tsx rename to app/javascript/mastodon/components/account_header/index.tsx index 6a9d51f737c30f..9222d0eb320232 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/components/account_header/index.tsx @@ -4,10 +4,6 @@ import classNames from 'classnames'; import { Helmet } from 'react-helmet'; import { openModal } from '@/mastodon/actions/modal'; -import { AccountBio } from '@/mastodon/components/account_bio'; -import { Avatar } from '@/mastodon/components/avatar'; -import { AnimateEmojiProvider } from '@/mastodon/components/emoji/context'; -import { AccountNote } from '@/mastodon/features/account/components/account_note'; import FollowRequestNoteContainer from '@/mastodon/features/account/containers/follow_request_note_container'; import { useLayout } from '@/mastodon/hooks/useLayout'; import { useVisibility } from '@/mastodon/hooks/useVisibility'; @@ -20,19 +16,20 @@ import type { Account } from '@/mastodon/models/account'; import { getAccountHidden } from '@/mastodon/selectors/accounts'; import { useAppSelector, useAppDispatch } from '@/mastodon/store'; -import { isRedesignEnabled } from '../common'; +import { AccountBio } from '../account_bio'; +import { Avatar } from '../avatar'; +import { AnimateEmojiProvider } from '../emoji/context'; +import { FamiliarFollowers } from '../familiar_followers'; -import { AccountName } from './account_name'; -import { AccountBadges } from './badges'; import { AccountButtons } from './buttons'; -import { FamiliarFollowers } from './familiar_followers'; import { AccountHeaderFields } from './fields'; -import { AccountInfo } from './info'; import { MemorialNote } from './memorial_note'; import { MovedNote } from './moved_note'; -import { AccountNote as AccountNoteRedesign } from './note'; +import { AccountName } from './name'; +import { AccountNote } from './note'; import { AccountNumberFields } from './number_fields'; -import redesignClasses from './redesign.module.scss'; +import classes from './styles.module.scss'; +import { AccountSubscriptionForm } from './subscription_form'; import { AccountTabs } from './tabs'; const titleFromAccount = (account: Account) => { @@ -51,8 +48,6 @@ export const AccountHeader: React.FC<{ accountId: string; hideTabs?: boolean; }> = ({ accountId, hideTabs }) => { - const isRedesign = isRedesignEnabled(); - const dispatch = useAppDispatch(); const account = useAppSelector((state) => state.accounts.get(accountId)); const relationship = useAppSelector((state) => @@ -77,7 +72,7 @@ export const AccountHeader: React.FC<{ modalType: 'IMAGE', modalProps: { src: account.avatar, - alt: '', + alt: account.avatar_description, }, }), ); @@ -116,35 +111,21 @@ export const AccountHeader: React.FC<{ )} -
- {me !== account.id && relationship && !isRedesign && ( - - )} - +
{!suspendedOrHidden && ( )}
-
+
- - {!isRedesign && ( - - )}
- {isRedesign && ( - - )} +
- + {!isMe && !suspendedOrHidden && ( - - )} - - {!isRedesign && ( - )} {!suspendedOrHidden && (
- {me && - account.id !== me && - (isRedesign ? ( - - ) : ( - - ))} + {me && account.id !== me && ( + + )} +
- + {!me && account.email_subscriptions && ( + + )}
)} - {isRedesign && ( - - )} +
- {!hideTabs && !hidden && } + {!hideTabs && !hidden && }
diff --git a/app/javascript/mastodon/features/account_timeline/components/memorial_note.tsx b/app/javascript/mastodon/components/account_header/memorial_note.tsx similarity index 100% rename from app/javascript/mastodon/features/account_timeline/components/memorial_note.tsx rename to app/javascript/mastodon/components/account_header/memorial_note.tsx diff --git a/app/javascript/mastodon/features/account_timeline/components/menu.tsx b/app/javascript/mastodon/components/account_header/menu.tsx similarity index 69% rename from app/javascript/mastodon/features/account_timeline/components/menu.tsx rename to app/javascript/mastodon/components/account_header/menu.tsx index 3e7b9f1ce2fe1f..a8cd2677fc2bc2 100644 --- a/app/javascript/mastodon/features/account_timeline/components/menu.tsx +++ b/app/javascript/mastodon/components/account_header/menu.tsx @@ -4,7 +4,6 @@ import type { FC } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { - blockAccount, followAccount, pinAccount, unblockAccount, @@ -13,6 +12,7 @@ import { } from '@/mastodon/actions/accounts'; import { removeAccountFromFollowers } from '@/mastodon/actions/accounts_typed'; import { showAlert } from '@/mastodon/actions/alerts'; +import { initBlockModal } from '@/mastodon/actions/blocks'; import { directCompose, mentionCompose } from '@/mastodon/actions/compose'; import { initDomainBlockModal, @@ -21,7 +21,6 @@ import { import { openModal } from '@/mastodon/actions/modal'; import { initMuteModal } from '@/mastodon/actions/mutes'; import { initReport } from '@/mastodon/actions/reports'; -import { Dropdown } from '@/mastodon/components/dropdown_menu'; import { useAccount } from '@/mastodon/hooks/useAccount'; import { useIdentity } from '@/mastodon/identity_context'; import type { Account } from '@/mastodon/models/account'; @@ -40,9 +39,9 @@ import PersonRemoveIcon from '@/material-icons/400-24px/person_remove.svg?react' import ReportIcon from '@/material-icons/400-24px/report.svg?react'; import ShareIcon from '@/material-icons/400-24px/share.svg?react'; -import { isRedesignEnabled } from '../common'; +import { Dropdown } from '../dropdown_menu'; -import classes from './redesign.module.scss'; +import classes from './styles.module.scss'; export const AccountMenu: FC<{ accountId: string }> = ({ accountId }) => { const intl = useIntl(); @@ -63,19 +62,9 @@ export const AccountMenu: FC<{ accountId: string }> = ({ accountId }) => { return []; } - if (isRedesignEnabled()) { - return redesignMenuItems({ - account, - signedIn: !isMe && signedIn, - permissions, - intl, - relationship, - dispatch, - }); - } - return currentMenuItems({ + return getMenuItems({ account, - signedIn, + signedIn: !isMe && signedIn, permissions, intl, relationship, @@ -190,269 +179,6 @@ const messages = defineMessages({ }, }); -function currentMenuItems({ - account, - signedIn, - permissions, - intl, - relationship, - dispatch, -}: MenuItemsParams): MenuItem[] { - const items: MenuItem[] = []; - const isRemote = account.acct !== account.username; - - if (signedIn && !account.suspended) { - items.push( - { - text: intl.formatMessage(messages.mention, { - name: account.username, - }), - action: () => { - dispatch(mentionCompose(account)); - }, - }, - { - text: intl.formatMessage(messages.direct, { - name: account.username, - }), - action: () => { - dispatch(directCompose(account)); - }, - }, - null, - ); - } - - if (isRemote) { - items.push( - { - text: intl.formatMessage(messages.openOriginalPage), - href: account.url, - }, - null, - ); - } - - if (!signedIn) { - return items; - } - - if (relationship?.following) { - // Timeline options - if (!relationship.muting) { - if (relationship.showing_reblogs) { - items.push({ - text: intl.formatMessage(messages.hideReblogs, { - name: account.username, - }), - action: () => { - dispatch(followAccount(account.id, { reblogs: false })); - }, - }); - } else { - items.push({ - text: intl.formatMessage(messages.showReblogs, { - name: account.username, - }), - action: () => { - dispatch(followAccount(account.id, { reblogs: true })); - }, - }); - } - - items.push( - { - text: intl.formatMessage(messages.languages), - action: () => { - dispatch( - openModal({ - modalType: 'SUBSCRIBED_LANGUAGES', - modalProps: { - accountId: account.id, - }, - }), - ); - }, - }, - null, - ); - } - - items.push( - { - text: intl.formatMessage( - relationship.endorsed ? messages.unendorse : messages.endorse, - ), - action: () => { - if (relationship.endorsed) { - dispatch(unpinAccount(account.id)); - } else { - dispatch(pinAccount(account.id)); - } - }, - }, - { - text: intl.formatMessage(messages.add_or_remove_from_list), - action: () => { - dispatch( - openModal({ - modalType: 'LIST_ADDER', - modalProps: { - accountId: account.id, - }, - }), - ); - }, - }, - null, - ); - } - - if (relationship?.followed_by) { - const handleRemoveFromFollowers = () => { - dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - title: intl.formatMessage(messages.confirmRemoveFromFollowersTitle), - message: intl.formatMessage( - messages.confirmRemoveFromFollowersMessage, - { name: {account.acct} }, - ), - confirm: intl.formatMessage( - messages.confirmRemoveFromFollowersButton, - ), - onConfirm: () => { - void dispatch( - removeAccountFromFollowers({ accountId: account.id }), - ); - }, - }, - }), - ); - }; - - items.push({ - text: intl.formatMessage(messages.removeFromFollowers, { - name: account.username, - }), - action: handleRemoveFromFollowers, - dangerous: true, - }); - } - - if (relationship?.muting) { - items.push({ - text: intl.formatMessage(messages.unmute, { - name: account.username, - }), - action: () => { - dispatch(unmuteAccount(account.id)); - }, - }); - } else { - items.push({ - text: intl.formatMessage(messages.mute, { - name: account.username, - }), - action: () => { - dispatch(initMuteModal(account)); - }, - dangerous: true, - }); - } - - if (relationship?.blocking) { - items.push({ - text: intl.formatMessage(messages.unblock, { - name: account.username, - }), - action: () => { - dispatch(unblockAccount(account.id)); - }, - }); - } else { - items.push({ - text: intl.formatMessage(messages.block, { - name: account.username, - }), - action: () => { - dispatch(blockAccount(account.id)); - }, - dangerous: true, - }); - } - - if (!account.suspended) { - items.push({ - text: intl.formatMessage(messages.report, { - name: account.username, - }), - action: () => { - dispatch(initReport(account)); - }, - dangerous: true, - }); - } - - const remoteDomain = isRemote ? account.acct.split('@')[1] : null; - if (remoteDomain) { - items.push(null); - - if (relationship?.domain_blocking) { - items.push({ - text: intl.formatMessage(messages.unblockDomain, { - domain: remoteDomain, - }), - action: () => { - dispatch(unblockDomain(remoteDomain)); - }, - }); - } else { - items.push({ - text: intl.formatMessage(messages.blockDomain, { - domain: remoteDomain, - }), - action: () => { - dispatch(initDomainBlockModal(account)); - }, - dangerous: true, - }); - } - } - - if ( - (permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || - (isRemote && - (permissions & PERMISSION_MANAGE_FEDERATION) === - PERMISSION_MANAGE_FEDERATION) - ) { - items.push(null); - if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { - items.push({ - text: intl.formatMessage(messages.admin_account, { - name: account.username, - }), - href: `/admin/accounts/${account.id}`, - }); - } - if ( - isRemote && - (permissions & PERMISSION_MANAGE_FEDERATION) === - PERMISSION_MANAGE_FEDERATION - ) { - items.push({ - text: intl.formatMessage(messages.admin_domain, { - domain: remoteDomain, - }), - href: `/admin/instances/${remoteDomain}`, - }); - } - } - - return items; -} - const redesignMessages = defineMessages({ share: { id: 'account.menu.share', defaultMessage: 'Share…' }, copy: { id: 'account.menu.copy', defaultMessage: 'Copy link' }, @@ -510,7 +236,7 @@ const redesignMessages = defineMessages({ }, }); -function redesignMenuItems({ +function getMenuItems({ account, signedIn, permissions, @@ -764,7 +490,7 @@ function redesignMenuItems({ if (relationship?.blocking) { dispatch(unblockAccount(account.id)); } else { - dispatch(blockAccount(account.id)); + dispatch(initBlockModal(account)); } }, dangerous: true, diff --git a/app/javascript/mastodon/features/account_timeline/components/moved_note.tsx b/app/javascript/mastodon/components/account_header/moved_note.tsx similarity index 87% rename from app/javascript/mastodon/features/account_timeline/components/moved_note.tsx rename to app/javascript/mastodon/components/account_header/moved_note.tsx index f2457dedd74712..153c206bbc96c5 100644 --- a/app/javascript/mastodon/features/account_timeline/components/moved_note.tsx +++ b/app/javascript/mastodon/components/account_header/moved_note.tsx @@ -2,9 +2,10 @@ import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; -import { DisplayName } from '@/mastodon/components/display_name'; -import { AvatarOverlay } from 'mastodon/components/avatar_overlay'; -import { useAppSelector } from 'mastodon/store'; +import { useAppSelector } from '@/mastodon/store'; + +import { AvatarOverlay } from '../avatar_overlay'; +import { DisplayName } from '../display_name'; export const MovedNote: React.FC<{ accountId: string; diff --git a/app/javascript/mastodon/features/account_timeline/components/account_name.tsx b/app/javascript/mastodon/components/account_header/name.tsx similarity index 68% rename from app/javascript/mastodon/features/account_timeline/components/account_name.tsx rename to app/javascript/mastodon/components/account_header/name.tsx index 0733699242c69d..4a38b47ed8a1b0 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_name.tsx +++ b/app/javascript/mastodon/components/account_header/name.tsx @@ -7,19 +7,22 @@ import classNames from 'classnames'; import Overlay from 'react-overlays/esm/Overlay'; -import { DisplayName } from '@/mastodon/components/display_name'; -import { Icon } from '@/mastodon/components/icon'; +import { showAlert } from '@/mastodon/actions/alerts'; import { useAccount } from '@/mastodon/hooks/useAccount'; -import { useAppSelector } from '@/mastodon/store'; +import { useRelationship } from '@/mastodon/hooks/useRelationship'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import AtIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; import HelpIcon from '@/material-icons/400-24px/help.svg?react'; import DomainIcon from '@/material-icons/400-24px/language.svg?react'; -import LockIcon from '@/material-icons/400-24px/lock.svg?react'; -import { DomainPill } from '../../account/components/domain_pill'; -import { isRedesignEnabled } from '../common'; +import { FollowsYouBadge } from '../badge'; +import { Button } from '../button'; +import { DisplayName } from '../display_name'; +import { Icon } from '../icon'; -import classes from './redesign.module.scss'; +import { AccountBadges } from './badges'; +import classes from './styles.module.scss'; const messages = defineMessages({ lockedInfo: { @@ -31,15 +34,19 @@ const messages = defineMessages({ id: 'account.name_info', defaultMessage: 'What does this mean?', }, + copied: { + id: 'copy_icon_button.copied', + defaultMessage: 'Copied to clipboard', + }, }); export const AccountName: FC<{ accountId: string }> = ({ accountId }) => { - const intl = useIntl(); const account = useAccount(accountId); const me = useAppSelector((state) => state.meta.get('me') as string); const localDomain = useAppSelector( (state) => state.meta.get('domain') as string, ); + const relationship = useRelationship(accountId); if (!account) { return null; @@ -47,47 +54,23 @@ export const AccountName: FC<{ accountId: string }> = ({ accountId }) => { const [username = '', domain = localDomain] = account.acct.split('@'); - if (!isRedesignEnabled()) { - return ( -

- - - - @{username} - @{domain} - - - {account.locked && ( - - )} - -

- ); - } - return ( -
-

- -

-

- @{username}@{domain} - -

+
+
+

+ +

+ {relationship?.followed_by && } +
+ + + +
); }; @@ -107,6 +90,19 @@ const AccountNameHelp: FC<{ setOpen((prev) => !prev); }, []); + const handle = `@${username}@${domain}`; + + const dispatch = useAppDispatch(); + const [copied, setCopied] = useState(false); + const handleCopy = useCallback(() => { + void navigator.clipboard.writeText(handle); + setCopied(true); + dispatch(showAlert({ message: messages.copied })); + setTimeout(() => { + setCopied(false); + }, 700); + }, [handle, dispatch]); + return ( <>
)} diff --git a/app/javascript/mastodon/features/account_timeline/components/note.tsx b/app/javascript/mastodon/components/account_header/note.tsx similarity index 91% rename from app/javascript/mastodon/features/account_timeline/components/note.tsx rename to app/javascript/mastodon/components/account_header/note.tsx index b344e81d6bf800..d58c37aec94620 100644 --- a/app/javascript/mastodon/features/account_timeline/components/note.tsx +++ b/app/javascript/mastodon/components/account_header/note.tsx @@ -5,12 +5,13 @@ import { defineMessages, useIntl } from 'react-intl'; import { fetchRelationships } from '@/mastodon/actions/accounts'; import { openModal } from '@/mastodon/actions/modal'; -import { Callout } from '@/mastodon/components/callout'; -import { IconButton } from '@/mastodon/components/icon_button'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import EditIcon from '@/material-icons/400-24px/edit_square.svg?react'; -import classes from './redesign.module.scss'; +import { Callout } from '../callout'; +import { IconButton } from '../icon_button'; + +import classes from './styles.module.scss'; const messages = defineMessages({ title: { diff --git a/app/javascript/mastodon/components/account_header/number_fields.tsx b/app/javascript/mastodon/components/account_header/number_fields.tsx new file mode 100644 index 00000000000000..4d539e8449994b --- /dev/null +++ b/app/javascript/mastodon/components/account_header/number_fields.tsx @@ -0,0 +1,96 @@ +import { useCallback, useMemo } from 'react'; +import type { FC } from 'react'; + +import { FormattedMessage, useIntl } from 'react-intl'; + +import { openModal } from '@/mastodon/actions/modal'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useAppDispatch } from '@/mastodon/store'; + +import { FormattedDateWrapper } from '../formatted_date'; +import { NumberFields, NumberFieldsItem } from '../number_fields'; +import { ShortNumber } from '../short_number'; + +export const AccountNumberFields: FC<{ accountId: string }> = ({ + accountId, +}) => { + const intl = useIntl(); + const account = useAccount(accountId); + const createdThisYear = useMemo( + () => account?.created_at.includes(new Date().getFullYear().toString()), + [account?.created_at], + ); + + const dispatch = useAppDispatch(); + const showJoinModal = useCallback(() => { + dispatch( + openModal({ modalType: 'ACCOUNT_JOIN_DATE', modalProps: { accountId } }), + ); + }, [accountId, dispatch]); + + if (!account) { + return null; + } + + return ( + + + } + hint={intl.formatNumber(account.followers_count)} + isHide={account.other_settings.hide_followers_count} + link={`/@${account.acct}/followers`} + > + + + + + } + hint={intl.formatNumber(account.following_count)} + isHide={account.other_settings.hide_following_count} + link={`/@${account.acct}/following`} + > + + + + } + hint={intl.formatNumber(account.statuses_count)} + isHide={account.other_settings.hide_statuses_count} + > + + + + + } + hint={intl.formatDate(account.created_at)} + > + + + + ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss b/app/javascript/mastodon/components/account_header/styles.module.scss similarity index 67% rename from app/javascript/mastodon/features/account_timeline/components/redesign.module.scss rename to app/javascript/mastodon/components/account_header/styles.module.scss index 3b6a95d099c567..7d87dde147560a 100644 --- a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss +++ b/app/javascript/mastodon/components/account_header/styles.module.scss @@ -9,6 +9,7 @@ .barWrapper { border-bottom: none; + padding-inline: 16px; } .avatarWrapper { @@ -16,46 +17,47 @@ padding-top: 0; } -.nameWrapper { +.displayNameWrapper { display: flex; align-items: start; gap: 16px; } -.name { +.nameWrapper { flex-grow: 1; +} +.name { > h1 { + display: inline; font-size: 22px; line-height: normal; white-space: initial; + margin-inline-end: 4px; } } -.username { - display: flex; - font-size: 13px; - color: var(--color-text-secondary); - align-items: center; - user-select: all; - margin-top: 4px; +.badges { + margin-top: 8px; } .handleHelpButton { + display: flex; + gap: 2px; + padding: 0; + margin-top: 4px; appearance: none; - border: none; background: none; - padding: 0; - color: inherit; - font-size: 1em; - margin-left: 2px; - width: 16px; - height: 16px; + border: none; + color: var(--color-text-secondary); + font-size: 13px; transition: color 0.2s ease-in-out; + word-break: break-all; + text-align: left; > svg { - width: 100%; - height: 100%; + width: 16px; + height: 16px; } &:hover, @@ -73,6 +75,10 @@ max-width: 400px; box-sizing: border-box; + [data-color-scheme='dark'] & { + border: 1px solid var(--color-border-primary); + } + > h3 { font-size: 17px; font-weight: 600; @@ -90,15 +96,15 @@ &:first-child { margin-bottom: 12px; } - } - svg { - background: var(--color-bg-brand-softer); - width: 28px; - height: 28px; - padding: 5px; - border-radius: 9999px; - box-sizing: border-box; + > svg { + background: var(--color-bg-brand-softest); + width: 28px; + height: 28px; + padding: 5px; + border-radius: 9999px; + box-sizing: border-box; + } } strong { @@ -121,11 +127,31 @@ $button-fallback-breakpoint: $button-breakpoint + 55px; } } +.handleCopy { + border: 1px solid var(--color-border-primary); + border-radius: 8px; + box-sizing: border-box; + padding: 4px 8px; + background-color: var(--color-bg-primary); + color: var(--color-text-primary); + font-size: 13px; + transition: + color 0.2s ease-in-out, + background-color 0.2s ease-in-out; + margin-top: 12px; + + &:active, + &:focus, + &:hover { + background-color: var(--color-bg-brand-softest); + } +} + .buttonsMobile { position: sticky; bottom: var(--mobile-bottom-nav-height); padding: 12px 16px; - margin: 0 -20px; + margin: 0 -16px; @container (width >= #{$button-breakpoint}) { display: none; @@ -164,36 +190,8 @@ $button-fallback-breakpoint: $button-breakpoint + 55px; font-size: 15px; } -.badge { - background-color: var(--color-bg-secondary); - border: none; - color: var(--color-text-secondary); - font-weight: 500; - padding: 4px; - font-size: 13px; - - :global(.account__header__badges) > & { - line-height: 1; - } - - > span { - font-weight: unset; - opacity: 1; - } -} - -.badgeMuted { - background-color: var(--color-bg-inverted); - color: var(--color-text-on-inverted); -} - -.badgeBlocked { - background-color: var(--color-bg-error-base); - color: var(--color-text-on-error-base); -} - -svg.badgeIcon { - opacity: 1; +.familiarFollowers { + margin-top: 16px; } .note { @@ -202,6 +200,9 @@ svg.badgeIcon { .noteContent { white-space-collapse: preserve-breaks; + overflow-wrap: break-word; + word-break: break-all; + hyphens: auto; } .noteEditButton { @@ -270,10 +271,11 @@ svg.badgeIcon { } .fieldVerified { - background-color: var(--color-bg-success-softer); + background-color: var(--color-bg-success-softest); - dt { - padding-right: 24px; + &.fieldItem { + border-color: var(--color-border-success-soft); + padding-right: 32px; // 8px padding + 16px for the icon + 8px gap } } @@ -292,8 +294,8 @@ svg.badgeIcon { } .fieldOverflowButton { - --default-bg-color: var(--color-bg-secondary-solid); - --hover-bg-color: var(--color-bg-brand-softer-solid); + --default-bg-color: var(--color-bg-secondary); + --hover-bg-color: var(--color-bg-brand-softest); position: absolute; right: 8px; @@ -307,37 +309,6 @@ svg.badgeIcon { } } -.fieldNumbersWrapper { - display: flex; - font-size: 13px; - padding: 0; - margin: 8px 0; - gap: 20px; - - li { - @container (width < 420px) { - flex: 1 1 0px; - } - } - - a, - strong { - display: block; - font-weight: 600; - color: var(--color-text-primary); - font-size: 15px; - } - - a { - padding: 0; - - &:hover, - &:focus { - text-decoration: underline; - } - } -} - .modalCloseButton { padding: 8px; border-radius: 50%; @@ -350,7 +321,7 @@ svg.badgeIcon { } .modalFieldsList { - padding: 24px; + padding: 16px; } .modalFieldItem { @@ -381,39 +352,74 @@ svg.badgeIcon { } } -.tabs { +.noTabs { + width: 100%; + border-width: 0 0 1px; border-bottom: 1px solid var(--color-border-primary); +} + +.bannerBase { + box-sizing: border-box; + padding: 16px; + border-radius: 12px; + background: var(--color-bg-secondary); display: flex; + flex-direction: column; gap: 12px; - padding: 0 24px; + justify-content: center; + align-items: flex-start; + margin: 16px 0; +} - @container (width < 500px) { - padding: 0 12px; +.bannerBaseCentered { + min-height: 146px; + align-items: center; - a { - flex: 1 1 0px; - text-align: center; - } + .bannerTextAndActions { + text-align: center; + } +} + +.bannerTextAndActions { + display: flex; + flex-direction: column; + gap: 4px; + font-size: 13px; + font-weight: 400; + color: var(--color-text-primary); + + h2 { + font-size: 17px; + font-weight: 600; } +} +.bannerDisclaimer { a { - display: block; - font-size: 15px; - font-weight: 500; - padding: 18px 4px; - text-decoration: none; - color: var(--color-text-primary); - border-radius: 0; - transition: color 0.2s ease-in-out; - - &:not([aria-current='page']):is(:hover, :focus) { - color: var(--color-text-brand-soft); - } + color: inherit; + } +} + +.bannerInputButton { + display: flex; + gap: 8px; + align-self: stretch; + align-items: flex-start; + + & > div { + flex-grow: 1; + } + + label { + font-weight: 400; + } + + :global(.button) { + margin-top: 24px; // To align with input under label } - :global(.active) { - color: var(--color-text-brand); - border-bottom: 4px solid var(--color-text-brand); - padding-bottom: 14px; + input[type='email'] { + padding: 7px 8px; // To align size with button + background: var(--color-bg-primary); } } diff --git a/app/javascript/mastodon/components/account_header/subscription_form.tsx b/app/javascript/mastodon/components/account_header/subscription_form.tsx new file mode 100644 index 00000000000000..f78077bef76910 --- /dev/null +++ b/app/javascript/mastodon/components/account_header/subscription_form.tsx @@ -0,0 +1,194 @@ +import { useState, useCallback, useId } from 'react'; + +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; +import type { IntlShape } from 'react-intl'; + +import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + +import { AxiosError } from 'axios'; + +import { apiSubscribeByEmail } from '@/mastodon/api/accounts'; +import type { + ValidationErrorResponse, + ValidationError, +} from '@/mastodon/api_types/errors'; +import { useAppSelector } from '@/mastodon/store'; + +import { Button } from '../button'; +import { DisplayName } from '../display_name'; +import type { FieldStatus } from '../form_fields'; +import { TextInputField } from '../form_fields/text_input_field'; + +import classes from './styles.module.scss'; + +const messages = defineMessages({ + emailInvalid: { + id: 'email_subscriptions.validation.email.invalid', + defaultMessage: 'Invalid email address', + }, + emailBlocked: { + id: 'email_subscriptions.validation.email.blocked', + defaultMessage: 'Blocked email provider', + }, + email: { + id: 'email_subscriptions.email', + defaultMessage: 'Email', + }, +}); + +const isValidationErrorResponse = ( + data: unknown, +): data is ValidationErrorResponse => + typeof data === 'object' && + data !== null && + 'error' in data && + 'details' in data; + +const fieldStatusFromErrors = ( + intl: IntlShape, + errors: ValidationError[], +): FieldStatus | undefined => { + const error = errors[0]; + + if (!error) { + return undefined; + } + + let message: string; + + switch (error.error) { + case 'ERR_BLOCKED': + message = intl.formatMessage(messages.emailBlocked); + break; + case 'ERR_INVALID': + default: + message = intl.formatMessage(messages.emailInvalid); + break; + } + + return { variant: 'error', message }; +}; + +export const AccountSubscriptionForm: React.FC<{ accountId: string }> = ({ + accountId, +}) => { + const account = useAppSelector((state) => state.accounts.get(accountId)); + const intl = useIntl(); + const accessibilityId = useId(); + + const [email, setEmail] = useState(''); + const [submitting, setSubmitting] = useState(false); + const [submitted, setSubmitted] = useState(false); + const [errors, setErrors] = useState>({}); + + const handleChange = useCallback>( + (e) => { + setEmail(e.target.value); + setErrors({}); + }, + [], + ); + + const handleSubmit = useCallback( + (e) => { + e.preventDefault(); + + if (email.length === 0) { + return; + } + + setSubmitting(true); + + apiSubscribeByEmail(accountId, email) + .then(() => { + setSubmitting(false); + setSubmitted(true); + + return ''; + }) + .catch((err: unknown) => { + setSubmitting(false); + + if (err instanceof AxiosError && err.response) { + const data: unknown = err.response.data; + + if (isValidationErrorResponse(data)) { + if (data.details.email?.some((k) => k.error === 'ERR_TAKEN')) { + setSubmitted(true); + return; + } + + setErrors(data.details); + } + } + }); + }, + [accountId, email], + ); + + if (submitted) { + return ( +
+
+

+ +

+ +
+
+ ); + } + + return ( +
+
+

+ , + }} + /> +

+
+ +
+ + + +
+ +
+ {str} }} + /> +
+
+ ); +}; diff --git a/app/javascript/mastodon/components/account_header/tabs.tsx b/app/javascript/mastodon/components/account_header/tabs.tsx new file mode 100644 index 00000000000000..f2f4ebbe278ed9 --- /dev/null +++ b/app/javascript/mastodon/components/account_header/tabs.tsx @@ -0,0 +1,48 @@ +import type { FC } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import type { NavLinkProps } from 'react-router-dom'; + +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useAccountId } from '@/mastodon/hooks/useAccountId'; + +import { TabLink, TabList } from '../tab_list'; + +import classes from './styles.module.scss'; + +const isActive: Required['isActive'] = (match, location) => + match?.url === location.pathname || + (!!match?.url && location.pathname.startsWith(`${match.url}/tagged/`)); + +export const AccountTabs: FC = () => { + const accountId = useAccountId(); + const account = useAccount(accountId); + + if (!account) { + return
; + } + + const { acct, show_featured, show_media } = account; + if (!show_featured && !show_media) { + return
; + } + + return ( + + + + + {show_media && ( + + + + )} + {show_featured && ( + + + + )} + + ); +}; diff --git a/app/javascript/mastodon/components/account_list_item/account_list_item.stories.tsx b/app/javascript/mastodon/components/account_list_item/account_list_item.stories.tsx new file mode 100644 index 00000000000000..62875b02f67ab1 --- /dev/null +++ b/app/javascript/mastodon/components/account_list_item/account_list_item.stories.tsx @@ -0,0 +1,65 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +import { accountFactoryState, relationshipsFactory } from '@/testing/factories'; + +import { PendingBadge } from '../badge'; + +import { AccountListItem } from './index'; + +const meta = { + title: 'Components/AccountListItem', + component: AccountListItem, + args: { + accountId: '1', + withBorder: false, + }, + parameters: { + state: { + accounts: { + '1': accountFactoryState(), + }, + }, + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; + +export const FollowsYou: Story = { + parameters: { + state: { + relationships: { + '1': relationshipsFactory({ + followed_by: true, + }), + }, + }, + }, +}; + +export const WithCustomStats: Story = { + args: { + stats: ['posts', 'last-active'], + }, +}; + +export const WithCustomBadge: Story = { + args: { + badge: , + }, +}; + +export const WithBorder: Story = { + args: { + withBorder: true, + }, +}; + +export const WithoutButton: Story = { + args: { + renderButton: () => null, + }, +}; diff --git a/app/javascript/mastodon/components/account_list_item/index.tsx b/app/javascript/mastodon/components/account_list_item/index.tsx new file mode 100644 index 00000000000000..04817cb33e2f90 --- /dev/null +++ b/app/javascript/mastodon/components/account_list_item/index.tsx @@ -0,0 +1,204 @@ +import type { ReactNode } from 'react'; +import { useMemo } from 'react'; + +import { FormattedMessage, useIntl } from 'react-intl'; + +import classNames from 'classnames'; + +import { FollowsYouBadge, VerifiedBadge } from 'mastodon/components/badge'; +import { useAccount } from 'mastodon/hooks/useAccount'; +import { useRelationship } from 'mastodon/hooks/useRelationship'; +import { domain } from 'mastodon/initial_state'; +import type { Relationship } from 'mastodon/models/relationship'; + +import { Avatar } from '../avatar'; +import { useAccountHandle } from '../display_name/default'; +import { DisplayNameSimple } from '../display_name/simple'; +import { EmojiHTML } from '../emoji/html'; +import { FollowButton } from '../follow_button'; +import { FormattedDateWrapper } from '../formatted_date'; +import { ListItemLink, ListItemWrapper } from '../list_item'; +import { NumberFields, NumberFieldsItem } from '../number_fields'; +import { RelativeTimestamp } from '../relative_timestamp'; +import { ShortNumber } from '../short_number'; + +import classes from './styles.module.scss'; + +export interface RenderButtonOptions { + accountId: string | undefined; + relationship: Relationship | null | undefined; +} + +type Stat = 'followers' | 'following' | 'posts' | 'joined' | 'last-active'; + +interface Props { + accountId: string | undefined; + stats?: Stat[]; + withBio?: boolean; + withBorder?: boolean; + badge?: ReactNode; + renderButton?: (options: RenderButtonOptions) => React.ReactNode; +} + +const DEFAULT_STATS: Stat[] = ['followers', 'posts', 'last-active']; + +/** + * Extended account list item with bio, verified link badge, + * and familiar follower widget. + * + * The displayed account stats can be customised using the `stats` prop, + * and button rendering can be customised via the `renderButton` prop. + */ +export const AccountListItem: React.FC = ({ + accountId, + stats = DEFAULT_STATS, + withBio = true, + withBorder = true, + badge: badgeProp, + renderButton = defaultRenderButton, +}) => { + const intl = useIntl(); + const account = useAccount(accountId); + const handle = useAccountHandle(account, domain); + const relationship = useRelationship(accountId); + + const createdThisYear = useMemo( + () => account?.created_at.includes(new Date().getFullYear().toString()), + [account?.created_at], + ); + + if (!accountId || !account) { + return null; + } + + const badge = + badgeProp ?? (relationship?.followed_by ? : null); + + const firstVerifiedField = account.fields.find((item) => !!item.verified_at); + + return ( +
+ } + sideContent={ + + {renderButton({ accountId, relationship })} + + } + > + + + {badge && {badge}} + + + + + {stats.includes('followers') && ( + + } + hint={intl.formatNumber(account.followers_count)} + > + + + )} + {stats.includes('following') && ( + + } + hint={intl.formatNumber(account.following_count)} + link={`/@${account.acct}/following`} + > + + + )} + {stats.includes('posts') && ( + + } + hint={intl.formatNumber(account.statuses_count)} + > + + + )} + {stats.includes('joined') && ( + + } + hint={intl.formatDate(account.created_at)} + > + {createdThisYear ? ( + + ) : ( + + )} + + )} + {stats.includes('last-active') && ( + + } + > + {account.last_status_at ? ( + + ) : ( + '-' + )} + + )} + {firstVerifiedField && ( + + )} + + {withBio && account.note.length > 0 && ( + + )} +
+ ); +}; + +const defaultRenderButton = ({ accountId }: RenderButtonOptions) => ( + +); + +export const AccountListItemFollowButton: React.FC<{ + accountId: string | undefined; +}> = ({ accountId }) => ( + +); diff --git a/app/javascript/mastodon/components/account_list_item/styles.module.scss b/app/javascript/mastodon/components/account_list_item/styles.module.scss new file mode 100644 index 00000000000000..69949508c59bb7 --- /dev/null +++ b/app/javascript/mastodon/components/account_list_item/styles.module.scss @@ -0,0 +1,49 @@ +.wrapper { + display: flex; + flex-direction: column; + align-items: start; + gap: 12px; + padding: 16px; + + &[data-with-border='true'] { + border-bottom: 1px solid var(--color-border-primary); + } +} + +.main { + --list-item-padding: 0; +} + +.displayName { + // Spacing for badge + margin-inline-end: 6px; +} + +.badge { + // Sort out vertical alignment next to name + vertical-align: -4px; +} + +.button { + align-self: start; +} + +.verifiedBadge { + align-self: end; +} + +.bio { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + line-clamp: 3; + + :any-link { + color: var(--color-text-status-links); + + &:hover { + text-decoration: none; + } + } +} diff --git a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx index 3c33688b0c8dc1..1a61ade5789d83 100644 --- a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx @@ -1,12 +1,14 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { injectIntl, defineMessages } from 'react-intl'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; import api from 'mastodon/api'; +import { injectIntl } from '../intl'; + const messages = defineMessages({ legal: { id: 'report.categories.legal', defaultMessage: 'Legal' }, other: { id: 'report.categories.other', defaultMessage: 'Other' }, diff --git a/app/javascript/mastodon/components/alt_text_badge/index.tsx b/app/javascript/mastodon/components/alt_text_badge/index.tsx index 6bb64254c63781..a33325dee53ef7 100644 --- a/app/javascript/mastodon/components/alt_text_badge/index.tsx +++ b/app/javascript/mastodon/components/alt_text_badge/index.tsx @@ -1,7 +1,9 @@ -import { useState, useCallback, useRef, useId, Fragment } from 'react'; +import { useState, useCallback, useRef, useId } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; +import classNames from 'classnames'; + import type { OffsetValue, UsePopperOptions, @@ -18,9 +20,10 @@ import classes from './styles.module.scss'; const offset = [0, 4] as OffsetValue; const popperConfig = { strategy: 'fixed' } as UsePopperOptions; -export const AltTextBadge: React.FC<{ description: string }> = ({ - description, -}) => { +export const AltTextBadge: React.FC<{ + description: string; + className?: string; +}> = ({ description, className }) => { const intl = useIntl(); const uniqueId = useId(); const popoverId = `${uniqueId}-popover`; @@ -48,7 +51,7 @@ export const AltTextBadge: React.FC<{ description: string }> = ({ diff --git a/app/javascript/mastodon/components/empty_state/empty_state.module.scss b/app/javascript/mastodon/components/empty_state/empty_state.module.scss index 1707b3bc0818d0..96aea81d1ccedd 100644 --- a/app/javascript/mastodon/components/empty_state/empty_state.module.scss +++ b/app/javascript/mastodon/components/empty_state/empty_state.module.scss @@ -2,22 +2,46 @@ display: flex; flex-direction: column; align-items: center; + justify-content: center; max-width: 600px; - padding: 20px; + padding: 24px; gap: 16px; text-align: center; color: var(--color-text-primary); } .content { + max-width: 370px; + + svg, + img { + width: 200px; + aspect-ratio: 1; + object-fit: contain; + max-width: 100%; + margin-bottom: 16px; + } + h3 { font-size: 17px; font-weight: 500; + text-wrap: balance; + line-height: 1.2; } p { - font-size: 15px; margin-top: 8px; + font-size: 15px; color: var(--color-text-secondary); + text-wrap: pretty; } } + +[data-color-scheme='dark'] .defaultImage { + --color-skin-1: #3a3a50; + --color-skin-2: #67678e; + --color-skin-3: #44445f; + --color-outline: #21212c; + --color-shadow: #181820; + --color-highlight: #b2b1c8; +} diff --git a/app/javascript/mastodon/components/empty_state/empty_state.stories.tsx b/app/javascript/mastodon/components/empty_state/empty_state.stories.tsx index 8515a6ea1add89..83fce034686ecf 100644 --- a/app/javascript/mastodon/components/empty_state/empty_state.stories.tsx +++ b/app/javascript/mastodon/components/empty_state/empty_state.stories.tsx @@ -29,16 +29,24 @@ export const Default: Story = { }, }; -export const WithoutMessage: Story = { +export const WithAction: Story = { args: { - message: undefined, + ...Default.args, + // eslint-disable-next-line react/jsx-no-bind + children: , }, }; -export const WithAction: Story = { +export const WithoutImage: Story = { args: { ...Default.args, - // eslint-disable-next-line react/jsx-no-bind - children: , + image: null, + }, +}; + +export const WithoutMessage: Story = { + args: { + ...Default.args, + message: undefined, }, }; diff --git a/app/javascript/mastodon/components/empty_state/index.tsx b/app/javascript/mastodon/components/empty_state/index.tsx index 93f034f3e9373b..e332aaedb5ce49 100644 --- a/app/javascript/mastodon/components/empty_state/index.tsx +++ b/app/javascript/mastodon/components/empty_state/index.tsx @@ -1,30 +1,47 @@ import { FormattedMessage } from 'react-intl'; +import classNames from 'classnames'; + +import ElephantImage from '@/images/elephant_ui.svg?react'; + import classes from './empty_state.module.scss'; +const images = { + default: , +}; + /** * Simple empty state component with a neutral default title and customisable message. * - * Action buttons can be passed as `children` + * Action buttons can be passed as `children`. */ export const EmptyState: React.FC<{ - title?: string | React.ReactElement; - message?: string | React.ReactElement; + image?: keyof typeof images | React.ReactElement | null; + title?: React.ReactNode; + message?: React.ReactNode; children?: React.ReactNode; + className?: string; }> = ({ + image = 'default', title = ( ), message, children, + className, }) => { + const imageToRender = typeof image === 'string' ? images[image] : image; + return ( -
-
-

{title}

- {!!message &&

{message}

} -
+
+ {(title || message || imageToRender) && ( +
+ {imageToRender} + {!!title &&

{title}

} + {!!message &&

{message}

} +
+ )} {children}
diff --git a/app/javascript/mastodon/features/account_timeline/components/familiar_followers.tsx b/app/javascript/mastodon/components/familiar_followers/index.tsx similarity index 78% rename from app/javascript/mastodon/features/account_timeline/components/familiar_followers.tsx rename to app/javascript/mastodon/components/familiar_followers/index.tsx index cc6434c6ee6436..b6cbea6c0f37c7 100644 --- a/app/javascript/mastodon/features/account_timeline/components/familiar_followers.tsx +++ b/app/javascript/mastodon/components/familiar_followers/index.tsx @@ -1,11 +1,14 @@ import { FormattedMessage } from 'react-intl'; +import classNames from 'classnames'; + import { Avatar } from '@/mastodon/components/avatar'; import { AvatarGroup } from '@/mastodon/components/avatar_group'; import { LinkedDisplayName } from '@/mastodon/components/display_name'; import type { Account } from '@/mastodon/models/account'; -import { useFetchFamiliarFollowers } from '../hooks/familiar_followers'; +import classes from './styles.module.scss'; +import { useFetchFamiliarFollowers } from './use_fetch_familiar_followers'; const FamiliarFollowersReadout: React.FC<{ familiarFollowers: Account[] }> = ({ familiarFollowers, @@ -51,9 +54,10 @@ const FamiliarFollowersReadout: React.FC<{ familiarFollowers: Account[] }> = ({ } }; -export const FamiliarFollowers: React.FC<{ accountId: string }> = ({ - accountId, -}) => { +export const FamiliarFollowers: React.FC<{ + accountId: string; + className?: string; +}> = ({ accountId, className }) => { const { familiarFollowers, isLoading } = useFetchFamiliarFollowers({ accountId, }); @@ -63,13 +67,15 @@ export const FamiliarFollowers: React.FC<{ accountId: string }> = ({ } return ( -
- +
+ {familiarFollowers.slice(0, 3).map((account) => ( - + ))} - + + +
); }; diff --git a/app/javascript/mastodon/components/familiar_followers/styles.module.scss b/app/javascript/mastodon/components/familiar_followers/styles.module.scss new file mode 100644 index 00000000000000..f3a11f970f9b91 --- /dev/null +++ b/app/javascript/mastodon/components/familiar_followers/styles.module.scss @@ -0,0 +1,11 @@ +.wrapper { + display: flex; + align-items: center; + gap: 10px; + + a:any-link { + font-weight: 500; + text-decoration: none; + color: var(--color-text-primary); + } +} diff --git a/app/javascript/mastodon/features/account_timeline/hooks/familiar_followers.ts b/app/javascript/mastodon/components/familiar_followers/use_fetch_familiar_followers.ts similarity index 100% rename from app/javascript/mastodon/features/account_timeline/hooks/familiar_followers.ts rename to app/javascript/mastodon/components/familiar_followers/use_fetch_familiar_followers.ts diff --git a/app/javascript/mastodon/components/follow_button.tsx b/app/javascript/mastodon/components/follow_button.tsx index 52864b432c654c..3ce6d0f4e71613 100644 --- a/app/javascript/mastodon/components/follow_button.tsx +++ b/app/javascript/mastodon/components/follow_button.tsx @@ -6,7 +6,6 @@ import classNames from 'classnames'; import { Link } from 'react-router-dom'; import { useIdentity } from '@/mastodon/identity_context'; -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; import { fetchRelationships, followAccount, @@ -175,23 +174,10 @@ export const FollowButton: React.FC<{ 'button--compact': compact, }); - if (isServerFeatureEnabled('profile_redesign')) { - return ( - - {label} - - ); - } - return ( - + {label} - + ); } diff --git a/app/javascript/mastodon/components/form_fields/combobox.module.scss b/app/javascript/mastodon/components/form_fields/combobox.module.scss index 7947b698a563fe..e64c5e679e9f6e 100644 --- a/app/javascript/mastodon/components/form_fields/combobox.module.scss +++ b/app/javascript/mastodon/components/form_fields/combobox.module.scss @@ -8,9 +8,9 @@ .menuButton { position: absolute; - inset-inline-end: 0; - top: 0; - padding: 9px; + inset-inline-end: 1px; + top: 1px; + padding: 7px; &::before { // Subtle divider line separating the button from the input field @@ -25,8 +25,7 @@ .popover { z-index: 9999; box-sizing: border-box; - max-height: max(200px, 30dvh); - padding: 4px; + max-height: min(320px, 50dvh); border-radius: 4px; color: var(--color-text-primary); background: var(--color-bg-primary); @@ -38,10 +37,18 @@ overscroll-behavior-y: contain; } +.groupTitle { + padding: 8px 16px 4px; + font-size: 13px; + font-weight: bold; + text-transform: uppercase; +} + .menuItem { display: flex; align-items: center; padding: 8px 12px; + margin-inline: 4px; gap: 12px; font-size: 14px; line-height: 20px; @@ -50,14 +57,16 @@ cursor: pointer; user-select: none; - &[data-highlighted='true'] { - color: var(--color-text-on-brand-base); - background: var(--color-bg-brand-base); + &:first-child { + margin-top: 4px; + } + + &:last-child { + margin-bottom: 4px; + } - &[aria-disabled='true'] { - color: var(--color-text-on-disabled); - background: var(--color-bg-disabled); - } + &[data-highlighted='true'] { + background: var(--color-bg-overlay-highlight); } &[aria-disabled='true'] { @@ -67,6 +76,26 @@ } .emptyMessage { - padding: 8px 16px; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + gap: 8px; + padding: 16px; font-size: 13px; } + +.loadingIndicator { + --spinner-size: 20px; + + position: relative; + display: block; + width: var(--spinner-size); + height: var(--spinner-size); + overflow: hidden; + + & :global(.circular-progress) { + width: var(--spinner-size); + height: var(--spinner-size); + } +} diff --git a/app/javascript/mastodon/components/form_fields/combobox_field.stories.tsx b/app/javascript/mastodon/components/form_fields/combobox_field.stories.tsx index 2c4b82fdcda6d8..795cba727a6f36 100644 --- a/app/javascript/mastodon/components/form_fields/combobox_field.stories.tsx +++ b/app/javascript/mastodon/components/form_fields/combobox_field.stories.tsx @@ -2,42 +2,48 @@ import { useCallback, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react-vite'; -import { ComboboxField } from './combobox_field'; +import { ComboboxField, ComboboxMenuItem } from './combobox_field'; -const ComboboxDemo: React.FC = () => { +interface Fruit { + id: string; + name: string; + type: 'citrus' | 'berryish' | 'seedy' | 'stony' | 'longish' | 'chonky'; + disabled?: boolean; +} + +const ComboboxDemo: React.FC<{ withGroups?: boolean }> = ({ withGroups }) => { const [searchValue, setSearchValue] = useState(''); - const items = [ - { id: '1', name: 'Apple' }, - { id: '2', name: 'Banana' }, - { id: '3', name: 'Cherry', disabled: true }, - { id: '4', name: 'Date' }, - { id: '5', name: 'Fig', disabled: true }, - { id: '6', name: 'Grape' }, - { id: '7', name: 'Honeydew' }, - { id: '8', name: 'Kiwi' }, - { id: '9', name: 'Lemon' }, - { id: '10', name: 'Mango' }, - { id: '11', name: 'Nectarine' }, - { id: '12', name: 'Orange' }, - { id: '13', name: 'Papaya' }, - { id: '14', name: 'Quince' }, - { id: '15', name: 'Raspberry' }, - { id: '16', name: 'Strawberry' }, - { id: '17', name: 'Tangerine' }, - { id: '19', name: 'Vanilla bean' }, - { id: '20', name: 'Watermelon' }, - { id: '22', name: 'Yellow Passion Fruit' }, - { id: '23', name: 'Zucchini' }, - { id: '24', name: 'Cantaloupe' }, - { id: '25', name: 'Blackberry' }, - { id: '26', name: 'Persimmon' }, - { id: '27', name: 'Lychee' }, - { id: '28', name: 'Dragon Fruit' }, - { id: '29', name: 'Passion Fruit' }, - { id: '30', name: 'Starfruit' }, + const items: Fruit[] = [ + { id: '1', name: 'Apple', type: 'seedy' }, + { id: '2', name: 'Banana', type: 'longish' }, + { id: '3', name: 'Cherry', type: 'berryish', disabled: true }, + { id: '4', name: 'Date', type: 'stony' }, + { id: '5', name: 'Fig', type: 'seedy', disabled: true }, + { id: '6', name: 'Grape', type: 'berryish' }, + { id: '7', name: 'Honeydew', type: 'chonky' }, + { id: '8', name: 'Kiwi', type: 'seedy' }, + { id: '9', name: 'Lemon', type: 'citrus' }, + { id: '10', name: 'Mango', type: 'stony' }, + { id: '11', name: 'Nectarine', type: 'stony' }, + { id: '12', name: 'Orange', type: 'citrus' }, + { id: '13', name: 'Papaya', type: 'seedy' }, + { id: '14', name: 'Quince', type: 'seedy' }, + { id: '15', name: 'Raspberry', type: 'berryish' }, + { id: '16', name: 'Strawberry', type: 'berryish' }, + { id: '17', name: 'Tangerine', type: 'citrus' }, + { id: '19', name: 'Vanilla bean', type: 'longish' }, + { id: '20', name: 'Watermelon', type: 'chonky' }, + { id: '22', name: 'Yellow Passion Fruit', type: 'seedy' }, + { id: '23', name: 'Zucchini', type: 'longish' }, + { id: '24', name: 'Cantaloupe', type: 'chonky' }, + { id: '25', name: 'Blackberry', type: 'berryish' }, + { id: '26', name: 'Persimmon', type: 'seedy' }, + { id: '27', name: 'Lychee', type: 'berryish' }, + { id: '28', name: 'Dragon Fruit', type: 'seedy' }, + { id: '29', name: 'Passion Fruit', type: 'seedy' }, + { id: '30', name: 'Starfruit', type: 'seedy' }, ]; - type Fruit = (typeof items)[number]; const getItemId = useCallback((item: Fruit) => item.id, []); const getIsItemDisabled = useCallback((item: Fruit) => !!item.disabled, []); @@ -54,7 +60,7 @@ const ComboboxDemo: React.FC = () => { }, []); const renderItem = useCallback( - (fruit: Fruit) => {fruit.name}, + (fruit: Fruit) => {fruit.name}, [], ); @@ -66,12 +72,16 @@ const ComboboxDemo: React.FC = () => { ) : items; + const groupedResults = withGroups + ? Object.groupBy(results, (item) => item.type) + : results; + return ( { const meta = { title: 'Components/Form Fields/ComboboxField', component: ComboboxField, + subcomponents: { ComboboxMenuItem }, render: () => , } satisfies Meta; @@ -90,15 +101,23 @@ export default meta; type Story = StoryObj; -export const Example: Story = { - args: { - // Adding these types to keep TS happy, they're not passed on to `ComboboxDemo` - label: '', - value: '', - onChange: () => undefined, - items: [], - getItemId: () => '', - renderItem: () => <>Nothing, - onSelectItem: () => undefined, - }, +// These args are just used to keep TS happy, +// they're not passed to `ComboboxDemo` +const dummyArgs = { + label: '', + value: '', + onChange: () => undefined, + items: [], + getItemId: () => '', + renderItem: () => <>Nothing, + onSelectItem: () => undefined, +}; + +export const Simple: Story = { + args: dummyArgs, +}; + +export const WithGroups: Story = { + render: () => , + args: dummyArgs, }; diff --git a/app/javascript/mastodon/components/form_fields/combobox_field.tsx b/app/javascript/mastodon/components/form_fields/combobox_field.tsx index 057258847e7065..f3e7b454765b77 100644 --- a/app/javascript/mastodon/components/form_fields/combobox_field.tsx +++ b/app/javascript/mastodon/components/form_fields/combobox_field.tsx @@ -1,4 +1,13 @@ -import { forwardRef, useCallback, useId, useRef, useState } from 'react'; +import { + createContext, + forwardRef, + useCallback, + useContext, + useId, + useMemo, + useRef, + useState, +} from 'react'; import { useIntl } from 'react-intl'; @@ -13,6 +22,8 @@ import { matchWidth } from 'mastodon/components/dropdown/utils'; import { IconButton } from 'mastodon/components/icon_button'; import { useOnClickOutside } from 'mastodon/hooks/useOnClickOutside'; +import { LoadingIndicator } from '../loading_indicator'; + import classes from './combobox.module.scss'; import { FormFieldWrapper } from './form_field_wrapper'; import type { CommonFieldWrapperProps } from './form_field_wrapper'; @@ -28,10 +39,10 @@ export interface ComboboxItemState { isDisabled: boolean; } -interface ComboboxProps extends Omit< - TextInputProps, - 'icon' -> { +interface ComboboxProps< + Item extends ComboboxItem, + GroupKey extends string, +> extends Omit { /** * The value of the combobox's text input */ @@ -46,34 +57,45 @@ interface ComboboxProps extends Omit< */ isLoading?: boolean; /** - * The set of options/suggestions that should be rendered in the dropdown menu. + * The set of options/suggestions that should be rendered in the dropdown menu, + * optionally separated into groups by providing an object */ - items: T[]; + items: Item[] | Partial>; /** * A function that must return a unique id for each option passed via `items` */ - getItemId?: (item: T) => string; + getItemId?: (item: Item) => string; /** * Providing this function turns the combobox into a multi-select box that assumes * multiple options to be selectable. Single-selection is handled automatically. */ - getIsItemSelected?: (item: T) => boolean; + getIsItemSelected?: (item: Item) => boolean; /** * Use this function to mark items as disabled, if needed */ - getIsItemDisabled?: (item: T) => boolean; + getIsItemDisabled?: (item: Item) => boolean; /** * Customise the rendering of each option. * The rendered content must not contain other interactive content! */ renderItem: ( - item: T, + item: Item, state: ComboboxItemState, ) => React.ReactElement | string; + /** + * Customise the rendering of group titles. + * The `titleId` must be attached to the element that provides the + * accessible name for the group. + * Return `null` to omit rendering the group title. + */ + renderGroupTitle?: ( + groupKey: GroupKey, + titleId: string, + ) => React.ReactElement | null; /** * The main selection handler, called when an option is selected or deselected. */ - onSelectItem: (item: T) => void; + onSelectItem: (item: Item) => void; /** * Icon to be displayed in the text input */ @@ -88,8 +110,60 @@ interface ComboboxProps extends Omit< suppressMenu?: boolean; } -interface Props - extends ComboboxProps, CommonFieldWrapperProps {} +interface Props + extends ComboboxProps, CommonFieldWrapperProps {} + +interface ComboboxItemPropsContext { + role: 'option'; + 'data-highlighted': boolean; + 'aria-selected': boolean; + 'aria-disabled': boolean; + 'data-item-id': string; + onMouseEnter: React.MouseEventHandler; + onClick: React.MouseEventHandler; +} + +const ComboboxItemPropsContext = createContext( + null, +); + +export function useComboboxItemProps() { + const context = useContext(ComboboxItemPropsContext); + + if (context === null) { + throw new Error( + 'useComboboxItemProps must be used within a Combobox component', + ); + } + + return context; +} + +export const ComboboxMenuItem: React.FC<{ + className?: string; + children: React.ReactNode; +}> = ({ className, children }) => { + const props = useComboboxItemProps(); + return ( +
  • + {children} +
  • + ); +}; + +export const ComboboxMenuGroupTitle: React.FC< + React.ComponentPropsWithoutRef<'li'> +> = ({ className, children, ...otherProps }) => { + return ( +
  • + {children} +
  • + ); +}; /** * The combobox field allows users to select one or more items @@ -100,8 +174,11 @@ interface Props * [research & implementations](https://sarahmhigley.com/writing/select-your-poison/). */ -export const ComboboxFieldWithRef = ( - { id, label, hint, status, required, ...otherProps }: Props, +export const ComboboxFieldWithRef = < + Item extends ComboboxItem, + GroupKey extends string, +>( + { id, label, hint, status, required, ...otherProps }: Props, ref: React.ForwardedRef, ) => ( ( // Using a type assertion to maintain the full type signature of ComboboxWithRef // (including its generic type) after wrapping it with `forwardRef`. export const ComboboxField = forwardRef(ComboboxFieldWithRef) as { - ( - props: Props & { ref?: React.ForwardedRef }, + ( + props: Props & { + ref?: React.ForwardedRef; + }, ): ReturnType; displayName: string; }; ComboboxField.displayName = 'ComboboxField'; -const ComboboxWithRef = ( +const ComboboxWithRef = ( { value, isLoading = false, @@ -135,6 +214,7 @@ const ComboboxWithRef = ( getIsItemDisabled, getIsItemSelected, disabled, + renderGroupTitle, renderItem, onSelectItem, onChange, @@ -144,7 +224,7 @@ const ComboboxWithRef = ( icon = SearchIcon, className, ...otherProps - }: ComboboxProps, + }: ComboboxProps, ref: React.ForwardedRef, ) => { const intl = useIntl(); @@ -157,15 +237,28 @@ const ComboboxWithRef = ( ); const [shouldMenuOpen, setShouldMenuOpen] = useState(false); + const hasGroups = !Array.isArray(items); + const flatItems = useMemo( + () => + hasGroups + ? (Object.values(items) + .flat() + .filter((i) => !!i) as Item[]) + : items, + [hasGroups, items], + ); + const statusMessage = useGetA11yStatusMessage({ value, isLoading, - itemCount: items.length, + itemCount: flatItems.length, }); const showStatusMessageInMenu = - !!statusMessage && value.length > 0 && items.length === 0; + !!statusMessage && value.length > 0 && flatItems.length === 0; const hasMenuContent = - !disabled && !suppressMenu && (items.length > 0 || showStatusMessageInMenu); + !disabled && + !suppressMenu && + (flatItems.length > 0 || showStatusMessageInMenu); const isMenuOpen = shouldMenuOpen && hasMenuContent; const openMenu = useCallback(() => { @@ -178,10 +271,10 @@ const ComboboxWithRef = ( }, []); const resetHighlight = useCallback(() => { - const firstItem = items[0]; + const firstItem = flatItems[0]; const firstItemId = firstItem ? getItemId(firstItem) : null; setHighlightedItemId(firstItemId); - }, [getItemId, items]); + }, [getItemId, flatItems]); const highlightItem = useCallback((id: string | null) => { setHighlightedItemId(id); @@ -216,7 +309,7 @@ const ComboboxWithRef = ( const selectItem = useCallback( (itemId: string | null) => { - const item = items.find((item) => item.id === itemId); + const item = flatItems.find((item) => item.id === itemId); if (item) { const isDisabled = getIsItemDisabled?.(item) ?? false; if (!isDisabled) { @@ -229,7 +322,7 @@ const ComboboxWithRef = ( } inputRef.current?.focus(); }, - [closeMenu, closeOnSelect, getIsItemDisabled, items, onSelectItem], + [closeMenu, closeOnSelect, getIsItemDisabled, flatItems, onSelectItem], ); const handleSelectItem = useCallback( @@ -246,38 +339,38 @@ const ComboboxWithRef = ( const moveHighlight = useCallback( (direction: number) => { - if (items.length === 0) { + if (flatItems.length === 0) { return; } - const highlightedItemIndex = items.findIndex( + const highlightedItemIndex = flatItems.findIndex( (item) => getItemId(item) === highlightedItemId, ); if (highlightedItemIndex === -1) { // If no item is highlighted yet, highlight the first or last if (direction > 0) { - const firstItem = items.at(0); + const firstItem = flatItems.at(0); highlightItem(firstItem ? getItemId(firstItem) : null); } else { - const lastItem = items.at(-1); + const lastItem = flatItems.at(-1); highlightItem(lastItem ? getItemId(lastItem) : null); } } else { // If there is a highlighted item, select the next or previous item // and wrap around at the start or end: let newIndex = highlightedItemIndex + direction; - if (newIndex >= items.length) { + if (newIndex >= flatItems.length) { newIndex = 0; } else if (newIndex < 0) { - newIndex = items.length - 1; + newIndex = flatItems.length - 1; } - const newHighlightedItem = items[newIndex]; + const newHighlightedItem = flatItems[newIndex]; highlightItem( newHighlightedItem ? getItemId(newHighlightedItem) : null, ); } }, - [getItemId, highlightItem, highlightedItemId, items], + [getItemId, highlightItem, highlightedItemId, flatItems], ); useOnClickOutside(wrapperRef, closeMenu); @@ -331,6 +424,38 @@ const ComboboxWithRef = ( ], ); + const renderItems = (items: Item[]) => + items.map((item) => { + const id = getItemId(item); + const isDisabled = getIsItemDisabled?.(item) ?? false; + const isHighlighted = id === highlightedItemId; + // If `getIsItemSelected` is defined, we assume 'multi-select' + // behaviour and don't set `aria-selected` based on highlight, + // but based on selected item state. + const isSelected = getIsItemSelected + ? getIsItemSelected(item) + : isHighlighted; + return ( + + {renderItem(item, { + isSelected, + isDisabled, + })} + + ); + }); + const mergeRefs = useCallback( (element: HTMLInputElement | null) => { inputRef.current = element; @@ -406,42 +531,47 @@ const ComboboxWithRef = ( > {({ props, placement }) => (
    - {showStatusMessageInMenu ? ( - {statusMessage} - ) : ( -
      - {items.map((item) => { - const id = getItemId(item); - const isDisabled = getIsItemDisabled?.(item); - const isHighlighted = id === highlightedItemId; - // If `getIsItemSelected` is defined, we assume 'multi-select' - // behaviour and don't set `aria-selected` based on highlight, - // but based on selected item state. - const isSelected = getIsItemSelected - ? getIsItemSelected(item) - : isHighlighted; - return ( - // eslint-disable-next-line jsx-a11y/click-events-have-key-events -
    • - {renderItem(item, { - isSelected, - isDisabled: isDisabled ?? false, - })} -
    • - ); - })} -
    - )} + + {hasGroups ? ( +
    + {(Object.keys(items) as GroupKey[]).map((groupKey) => { + const groupItems = items[groupKey]; + const groupTitleId = `${listId}-group-${groupKey}`; + const customGroupTitle = renderGroupTitle?.( + groupKey, + groupTitleId, + ); + const hasTitle = customGroupTitle !== null; + + if (!groupItems?.length) return null; + + return ( +
      + {hasTitle && + (customGroupTitle ?? ( + + {groupKey} + + ))} + {renderItems(groupItems)} +
    + ); + })} +
    + ) : ( +
      + {renderItems(items)} +
    + )} +
    )} @@ -452,14 +582,38 @@ const ComboboxWithRef = ( // Using a type assertion to maintain the full type signature of ComboboxWithRef // (including its generic type) after wrapping it with `forwardRef`. export const Combobox = forwardRef(ComboboxWithRef) as { - ( - props: ComboboxProps & { ref?: React.ForwardedRef }, + ( + props: ComboboxProps & { + ref?: React.ForwardedRef; + }, ): ReturnType; displayName: string; }; Combobox.displayName = 'Combobox'; +const StatusMessageWrapper: React.FC<{ + showStatus: boolean; + status: string; + isLoading: boolean; + children: React.ReactNode; +}> = ({ showStatus, status, isLoading, children }) => { + if (showStatus) { + return ( + + {isLoading && ( + + + + )} + {status} + + ); + } + + return children; +}; + function useGetA11yStatusMessage({ itemCount, value, diff --git a/app/javascript/mastodon/components/form_fields/copy_link_field.module.scss b/app/javascript/mastodon/components/form_fields/copy_link_field.module.scss index 06834e9d91f2fb..68ee85c27ce660 100644 --- a/app/javascript/mastodon/components/form_fields/copy_link_field.module.scss +++ b/app/javascript/mastodon/components/form_fields/copy_link_field.module.scss @@ -8,7 +8,7 @@ .copyButton { position: absolute; - inset-inline-end: 0; - top: 0; - padding: 9px; + inset-inline-end: 1px; + top: 1px; + padding: 7px; } diff --git a/app/javascript/mastodon/components/form_fields/emoji_text_field.tsx b/app/javascript/mastodon/components/form_fields/emoji_text_field.tsx index af9e3d5280f8c4..6e65d22fc730f3 100644 --- a/app/javascript/mastodon/components/form_fields/emoji_text_field.tsx +++ b/app/javascript/mastodon/components/form_fields/emoji_text_field.tsx @@ -2,11 +2,9 @@ import type { ChangeEvent, ChangeEventHandler, ComponentPropsWithoutRef, - Dispatch, FC, ReactNode, RefObject, - SetStateAction, } from 'react'; import { useCallback, useId, useRef } from 'react'; @@ -25,7 +23,7 @@ import { TextInput } from './text_input_field'; export type EmojiInputProps = { value?: string; - onChange?: Dispatch>; + onChange?: (newValue: string) => void; counterMax?: number; recommended?: boolean; } & Omit; @@ -138,12 +136,15 @@ const EmojiFieldWrapper: FC< const handlePickEmoji = useCallback( (emoji: string) => { - onChange?.((prev) => { - const position = inputRef.current?.selectionStart ?? prev.length; - return insertEmojiAtPosition(prev, emoji, position); - }); + if (!value) { + onChange?.(''); + return; + } + const position = inputRef.current?.selectionStart ?? value.length; + const newValue = insertEmojiAtPosition(value, emoji, position); + onChange?.(newValue); }, - [onChange, inputRef], + [inputRef, value, onChange], ); const handleChange = useCallback( diff --git a/app/javascript/mastodon/components/form_fields/fieldset.tsx b/app/javascript/mastodon/components/form_fields/fieldset.tsx index 26381ca834ca0a..06882d8e816889 100644 --- a/app/javascript/mastodon/components/form_fields/fieldset.tsx +++ b/app/javascript/mastodon/components/form_fields/fieldset.tsx @@ -4,10 +4,10 @@ import type { ReactNode, FC } from 'react'; import { createContext, useId } from 'react'; import { A11yLiveRegion } from 'mastodon/components/a11y_live_region'; -import type { FieldStatus } from 'mastodon/components/callout_inline'; import { CalloutInline } from 'mastodon/components/callout_inline'; import classes from './fieldset.module.scss'; +import type { FieldStatus } from './form_field_wrapper'; import { getFieldStatus } from './form_field_wrapper'; import formFieldWrapperClasses from './form_field_wrapper.module.scss'; diff --git a/app/javascript/mastodon/components/form_fields/form_field_wrapper.tsx b/app/javascript/mastodon/components/form_fields/form_field_wrapper.tsx index 7cd6d676142f74..ffa7f491bcfa1d 100644 --- a/app/javascript/mastodon/components/form_fields/form_field_wrapper.tsx +++ b/app/javascript/mastodon/components/form_fields/form_field_wrapper.tsx @@ -8,7 +8,6 @@ import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { A11yLiveRegion } from 'mastodon/components/a11y_live_region'; -import type { FieldStatus } from 'mastodon/components/callout_inline'; import { CalloutInline } from 'mastodon/components/callout_inline'; import { FieldsetNameContext } from './fieldset'; @@ -20,11 +19,16 @@ export interface InputProps { 'aria-describedby'?: string; } +export interface FieldStatus { + variant: 'error' | 'warning' | 'info' | 'success'; + message?: string; +} + interface FieldWrapperProps { label: ReactNode; hint?: ReactNode; required?: boolean; - status?: FieldStatus['variant'] | FieldStatus; + status?: FieldStatus['variant'] | FieldStatus | null; inputId?: string; describedById?: string; inputPlacement?: 'inline-start' | 'inline-end'; diff --git a/app/javascript/mastodon/components/form_fields/index.ts b/app/javascript/mastodon/components/form_fields/index.ts index 97fb90cf562ee4..5f89c03ece817d 100644 --- a/app/javascript/mastodon/components/form_fields/index.ts +++ b/app/javascript/mastodon/components/form_fields/index.ts @@ -1,3 +1,4 @@ +export type { FieldStatus } from './form_field_wrapper'; export { FormFieldWrapper } from './form_field_wrapper'; export { FormStack } from './form_stack'; export { Fieldset } from './fieldset'; diff --git a/app/javascript/mastodon/components/form_fields/select.module.scss b/app/javascript/mastodon/components/form_fields/select.module.scss index e68e248fec60d7..7ba0a53cbf83c5 100644 --- a/app/javascript/mastodon/components/form_fields/select.module.scss +++ b/app/javascript/mastodon/components/form_fields/select.module.scss @@ -61,6 +61,6 @@ } [data-has-error='true'] & { - border-color: var(--color-text-error); + border-color: var(--color-border-error); } } diff --git a/app/javascript/mastodon/components/form_fields/text_input.module.scss b/app/javascript/mastodon/components/form_fields/text_input.module.scss index f432f57055d39c..cbb45e0a3a04a6 100644 --- a/app/javascript/mastodon/components/form_fields/text_input.module.scss +++ b/app/javascript/mastodon/components/form_fields/text_input.module.scss @@ -1,7 +1,6 @@ .input { box-sizing: border-box; display: block; - resize: vertical; width: 100%; padding: 10px 16px; font-family: inherit; @@ -32,11 +31,11 @@ &:focus:user-invalid, &:required:user-invalid, [data-has-error='true'] & { - outline-color: var(--color-text-error); + outline-color: var(--color-border-error); } &:focus { - outline-color: var(--color-text-brand); + outline-color: var(--color-border-brand); } &:required:user-valid { @@ -50,6 +49,10 @@ } } +textarea.input { + resize: vertical; +} + .iconWrapper { position: relative; } diff --git a/app/javascript/mastodon/components/form_fields/toggle.module.css b/app/javascript/mastodon/components/form_fields/toggle.module.css index 997434f336e2e8..b1f7e71b9fc5d8 100644 --- a/app/javascript/mastodon/components/form_fields/toggle.module.css +++ b/app/javascript/mastodon/components/form_fields/toggle.module.css @@ -1,3 +1,13 @@ +.wrapper { + --diameter: 20px; + --padding: 2px; + --transition: 0.2s ease-in-out; + + display: inline-block; + position: relative; + height: calc(var(--diameter) + var(--padding) * 2); +} + .input { position: absolute; opacity: 0; @@ -9,10 +19,6 @@ } .toggle { - --diameter: 20px; - --padding: 2px; - --transition: 0.2s ease-in-out; - display: inline-flex; align-items: center; border-radius: 9999px; @@ -68,8 +74,3 @@ :global([dir='rtl']) .input:checked + .toggle::before { transform: translateX(calc(-1 * (var(--diameter) - (var(--padding) * 2)))); } - -.wrapper { - display: inline-block; - position: relative; -} diff --git a/app/javascript/mastodon/components/form_fields/toggle_field.tsx b/app/javascript/mastodon/components/form_fields/toggle_field.tsx index 75fdb8f21bd770..3de09823d3e19e 100644 --- a/app/javascript/mastodon/components/form_fields/toggle_field.tsx +++ b/app/javascript/mastodon/components/form_fields/toggle_field.tsx @@ -31,20 +31,17 @@ ToggleField.displayName = 'ToggleField'; export const Toggle = forwardRef( ({ className, size, ...otherProps }, ref) => ( - + -
    diff --git a/app/javascript/mastodon/components/number_fields/index.tsx b/app/javascript/mastodon/components/number_fields/index.tsx new file mode 100644 index 00000000000000..324ed160512355 --- /dev/null +++ b/app/javascript/mastodon/components/number_fields/index.tsx @@ -0,0 +1,47 @@ +import classNames from 'classnames'; +import { NavLink } from 'react-router-dom'; + +import type { MastodonLocationDescriptor } from 'mastodon/components/router'; + +import classes from './styles.module.scss'; + +export const NumberFields: React.FC> = ({ + children, + className, +}) => { + return
      {children}
    ; +}; + +interface ItemProps extends React.ComponentPropsWithoutRef<'li'> { + label: React.ReactNode; + hint?: string; + link?: MastodonLocationDescriptor; + isHide?: boolean; +} + +export const NumberFieldsItem: React.FC = ({ + label, + hint, + link, + children, + className, + isHide, + ...restProps +}) => { + return ( +
  • + {label} + {link ? ( + + {children} + + ) : ( + {children} + )} +
  • + ); +}; diff --git a/app/javascript/mastodon/components/number_fields/styles.module.scss b/app/javascript/mastodon/components/number_fields/styles.module.scss new file mode 100644 index 00000000000000..f71f690e9caeab --- /dev/null +++ b/app/javascript/mastodon/components/number_fields/styles.module.scss @@ -0,0 +1,46 @@ +.list { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0; + gap: 4px 24px; + font-size: 13px; + color: var(--color-text-secondary); +} + +.item { + @container (width < 420px) { + flex: 1 1 0px; + } + + a, + button, + strong { + display: block; + font-weight: 600; + color: var(--color-text-primary); + font-size: 15px; + white-space: nowrap; + } + + a { + padding: 0; + text-decoration: none; + } + + a, + button { + &:hover, + &:focus { + text-decoration: underline; + } + } + + button { + appearance: none; + background: none; + border: none; + display: block; + padding: 0; + } +} diff --git a/app/javascript/mastodon/components/poll.tsx b/app/javascript/mastodon/components/poll.tsx index 3ab31f4229679b..c77ce8bcee7483 100644 --- a/app/javascript/mastodon/components/poll.tsx +++ b/app/javascript/mastodon/components/poll.tsx @@ -70,7 +70,7 @@ export const Poll: React.FC = ({ pollId, disabled, status }) => { if (expired) { return intl.formatMessage(messages.closed); } - return ; + return ; }, [expired, intl, poll]); const votesCount = useMemo(() => { if (!poll) { diff --git a/app/javascript/mastodon/components/regeneration_indicator.tsx b/app/javascript/mastodon/components/regeneration_indicator.tsx index e26b93eb4fbd0d..a79556104e1502 100644 --- a/app/javascript/mastodon/components/regeneration_indicator.tsx +++ b/app/javascript/mastodon/components/regeneration_indicator.tsx @@ -20,6 +20,7 @@ export const RegenerationIndicator: React.FC = () => (
    diff --git a/app/javascript/mastodon/components/relative_timestamp/index.tsx b/app/javascript/mastodon/components/relative_timestamp/index.tsx index 493e535a71fa83..fa6200b7d12099 100644 --- a/app/javascript/mastodon/components/relative_timestamp/index.tsx +++ b/app/javascript/mastodon/components/relative_timestamp/index.tsx @@ -23,16 +23,16 @@ export const RelativeTimestamp: FC<{ timestamp: string; long?: boolean; noTime?: boolean; - noFuture?: boolean; -}> = ({ timestamp, long = false, noTime = false, noFuture = false }) => { + hasFuture?: boolean; +}> = ({ timestamp, long = false, noTime = false, hasFuture = false }) => { const intl = useIntl(); const [now, setNow] = useState(() => Date.now()); const date = useMemo(() => { const date = new Date(timestamp); - return noFuture ? new Date(Math.min(date.getTime(), now)) : date; - }, [noFuture, now, timestamp]); + return !hasFuture ? new Date(Math.min(date.getTime(), now)) : date; + }, [hasFuture, now, timestamp]); const ts = date.getTime(); useEffect(() => { diff --git a/app/javascript/mastodon/components/relative_timestamp/relative_timestamp.stories.tsx b/app/javascript/mastodon/components/relative_timestamp/relative_timestamp.stories.tsx index 978382515da50d..96965d3f3af21e 100644 --- a/app/javascript/mastodon/components/relative_timestamp/relative_timestamp.stories.tsx +++ b/app/javascript/mastodon/components/relative_timestamp/relative_timestamp.stories.tsx @@ -11,7 +11,7 @@ const meta = { timestamp: new Date(Date.now() - DAY * 3).toISOString(), long: false, noTime: false, - noFuture: false, + hasFuture: false, }, argTypes: { timestamp: { @@ -44,10 +44,10 @@ export const DateOnly: Story = { }, }; -export const NoFuture: Story = { +export const HasFuture: Story = { args: { timestamp: new Date(Date.now() + DAY * 3).toISOString(), - noFuture: true, + hasFuture: true, }, }; diff --git a/app/javascript/mastodon/components/router.tsx b/app/javascript/mastodon/components/router.tsx index 1c251d6abcda9c..bd6e4b568f0f18 100644 --- a/app/javascript/mastodon/components/router.tsx +++ b/app/javascript/mastodon/components/router.tsx @@ -26,6 +26,8 @@ export type LocationState = MastodonLocationState | null | undefined; export type MastodonLocation = ReturnType>; +export type MastodonLocationDescriptor = LocationDescriptor; + type HistoryPath = Path | LocationDescriptor; export const browserHistory = createBrowserHistory(); diff --git a/app/javascript/mastodon/components/scrollable_list/components.tsx b/app/javascript/mastodon/components/scrollable_list/components.tsx index 79afaf837ad7e9..5582c8e5b33173 100644 --- a/app/javascript/mastodon/components/scrollable_list/components.tsx +++ b/app/javascript/mastodon/components/scrollable_list/components.tsx @@ -1,8 +1,10 @@ import type { ComponentPropsWithoutRef } from 'react'; -import { Children, forwardRef } from 'react'; +import { forwardRef } from 'react'; import classNames from 'classnames'; +import { hasReactChildren } from '@/mastodon/utils/has_react_children'; + import { LoadingIndicator } from '../loading_indicator'; export const Scrollable = forwardRef< @@ -36,8 +38,12 @@ export const ItemList = forwardRef< emptyMessage?: React.ReactNode; } >(({ isLoading, emptyMessage, className, children, ...otherProps }, ref) => { - if (!isLoading && Children.count(children) === 0 && emptyMessage) { - return
    {emptyMessage}
    ; + if (!isLoading && !hasReactChildren(children) && emptyMessage) { + return ( +
    + {emptyMessage} +
    + ); } return ( diff --git a/app/javascript/mastodon/components/scrollable_list/index.jsx b/app/javascript/mastodon/components/scrollable_list/index.jsx index 4726829ad80a5a..80c0aeb6553771 100644 --- a/app/javascript/mastodon/components/scrollable_list/index.jsx +++ b/app/javascript/mastodon/components/scrollable_list/index.jsx @@ -385,7 +385,7 @@ class ScrollableList extends PureComponent { {alwaysPrepend && prepend}
    - {emptyMessage} + {emptyMessage}
    {footer} diff --git a/app/javascript/mastodon/components/server_banner.jsx b/app/javascript/mastodon/components/server_banner.jsx index 989ac7f006fa2f..939a92b2815052 100644 --- a/app/javascript/mastodon/components/server_banner.jsx +++ b/app/javascript/mastodon/components/server_banner.jsx @@ -1,9 +1,9 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; +import { FormattedMessage, defineMessages } from 'react-intl'; -import { Link } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; import { connect } from 'react-redux'; @@ -14,8 +14,11 @@ import { ShortNumber } from 'mastodon/components/short_number'; import { Skeleton } from 'mastodon/components/skeleton'; import { domain } from 'mastodon/initial_state'; +import { injectIntl } from './intl'; + const messages = defineMessages({ aboutActiveUsers: { id: 'server_banner.about_active_users', defaultMessage: 'People using this server during the last 30 days (Monthly Active Users)' }, + aboutThisServer: { id: 'server_banner.more_about_this_server', defaultMessage: 'More about this server'}, }); const mapStateToProps = state => ({ @@ -45,9 +48,14 @@ class ServerBanner extends PureComponent { {domain}, mastodon: Mastodon }} />
    - - - + + +
    {isLoading ? ( diff --git a/app/javascript/mastodon/components/server_hero_image.tsx b/app/javascript/mastodon/components/server_hero_image/index.tsx similarity index 53% rename from app/javascript/mastodon/components/server_hero_image.tsx rename to app/javascript/mastodon/components/server_hero_image/index.tsx index 68b7f03df39744..d1926260b83c87 100644 --- a/app/javascript/mastodon/components/server_hero_image.tsx +++ b/app/javascript/mastodon/components/server_hero_image/index.tsx @@ -2,9 +2,14 @@ import { useCallback, useState } from 'react'; import classNames from 'classnames'; -import { Blurhash } from './blurhash'; +import { AltTextBadge } from '../alt_text_badge'; +import { Blurhash } from '../blurhash'; + +import classes from './styles.module.scss'; interface Props { + withAltBadge?: boolean; + alt: string; src: string; srcSet?: string; blurhash?: string; @@ -12,9 +17,11 @@ interface Props { } export const ServerHeroImage: React.FC = ({ + alt, src, srcSet, blurhash, + withAltBadge, className, }) => { const [loaded, setLoaded] = useState(false); @@ -24,12 +31,12 @@ export const ServerHeroImage: React.FC = ({ }, [setLoaded]); return ( -
    +
    {blurhash && } - + {alt} + {withAltBadge && alt && ( + + )}
    ); }; diff --git a/app/javascript/mastodon/components/server_hero_image/styles.module.scss b/app/javascript/mastodon/components/server_hero_image/styles.module.scss new file mode 100644 index 00000000000000..7af71d26416c88 --- /dev/null +++ b/app/javascript/mastodon/components/server_hero_image/styles.module.scss @@ -0,0 +1,5 @@ +.altBadge { + position: absolute; + bottom: 8px; + inset-inline-end: 8px; +} diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 8d4557aba1d6ac..b1815a4f239125 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { injectIntl, defineMessages, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; @@ -26,6 +26,7 @@ import { MediaGallery, Video, Audio } from '../features/ui/util/async-components import { SensitiveMediaContext } from '../features/ui/util/sensitive_media_context'; import { displayMedia, enableEmojiReaction, isShowItem, isHideItem } from '../initial_state'; +import { injectIntl } from './intl'; import { StatusHeader } from './status/header' import { LinkedDisplayName } from './display_name'; import { getHashtagBarForStatus } from './hashtag_bar'; @@ -34,6 +35,7 @@ import StatusContent from './status_content'; import StatusEmojiReactionsBar from './status_emoji_reactions_bar'; import { StatusThreadLabel } from './status_thread_label'; import { VisibilityIcon } from './visibility_icon'; +import { CollectionPreviewCard } from '../features/collections/components/collection_preview_card'; const domParser = new DOMParser(); @@ -447,7 +449,7 @@ class Status extends ImmutablePureComponent {
    - +
    ); @@ -459,7 +461,7 @@ class Status extends ImmutablePureComponent { prepend = (
    - +
    ); } else if (showThread && status.get('in_reply_to_id')) { @@ -496,7 +498,7 @@ class Status extends ImmutablePureComponent { ); } else if (['image', 'gifv', 'unknown'].includes(status.getIn(['media_attachments', 0, 'type'])) || status.get('media_attachments').size > 1) { media = ( - + {Component => ( + {Component => ( + {Component => ( ); } - } else if (status.get('card') && !status.get('quote') && !this.props.muted) { - media = ( - - ); + } else if (status.get('card') && !status.get('quote')) { + const cardUrl = status.getIn(['card', 'url']); + + const taggedCollection = ( + status.get('tagged_collections') + ).find((item) => compareUrls(item.get('url'), cardUrl)); + + if (taggedCollection) { + media = ; + } else { + media = ( + + ); + } + } else if (status.get('tagged_collections').size) { + const firstLinkedCollection = status.get('tagged_collections').first(); + if (firstLinkedCollection) { + media = ( + + ); + } } visibilityName = status.get('limited_scope') || status.get('visibility_ex') || status.get('visibility'); diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx index 5fcea5f8b9841a..55d3c954359f6f 100644 --- a/app/javascript/mastodon/components/status/handled_link.tsx +++ b/app/javascript/mastodon/components/status/handled_link.tsx @@ -4,7 +4,9 @@ import type { ComponentProps, FC } from 'react'; import classNames from 'classnames'; import { Link } from 'react-router-dom'; +import type { ApiCollectionJSON } from '@/mastodon/api_types/collections'; import type { ApiMentionJSON } from '@/mastodon/api_types/statuses'; +import { getCollectionPath } from '@/mastodon/features/collections/utils'; import type { OnElementHandler } from '@/mastodon/utils/html'; export interface HandledLinkProps { @@ -13,6 +15,7 @@ export interface HandledLinkProps { prevText?: string; hashtagAccountId?: string; mention?: Pick; + collection?: Pick; } export const HandledLink: FC> = ({ @@ -21,6 +24,7 @@ export const HandledLink: FC> = ({ prevText, hashtagAccountId, mention, + collection, className, children, ...props @@ -57,6 +61,15 @@ export const HandledLink: FC> = ({ {children} ); + } else if (collection) { + return ( + + {children} + + ); } // Non-absolute paths treated as internal links. This shouldn't happen, but just in case. diff --git a/app/javascript/mastodon/components/status_action_bar/index.jsx b/app/javascript/mastodon/components/status_action_bar/index.jsx index 7a3533a0304c4e..575f027dd681f7 100644 --- a/app/javascript/mastodon/components/status_action_bar/index.jsx +++ b/app/javascript/mastodon/components/status_action_bar/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import { withRouter } from 'react-router-dom'; @@ -24,6 +24,7 @@ import { Dropdown } from 'mastodon/components/dropdown_menu'; import { enableEmojiReaction , bookmarkCategoryNeeded, simpleTimelineMenu, me, isHideItem, quickBoosting } from '../../initial_state'; import { IconButton } from '../icon_button'; +import { injectIntl } from '../intl'; import { BoostButton } from '../status/boost_button'; import { RemoveQuoteHint } from './remove_quote_hint'; import { quoteItemState, selectStatusState } from '../status/boost_button_utils'; diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 93aeee6556f5f2..d794130b28ed32 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, injectIntl } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import classnames from 'classnames'; import { withRouter } from 'react-router-dom'; @@ -16,7 +16,9 @@ import { identityContextPropShape, withIdentity } from 'mastodon/identity_contex import { languages as preloadedLanguages } from 'mastodon/initial_state'; import { EmojiHTML } from './emoji/html'; +import { injectIntl } from './intl'; import { HandledLink } from './status/handled_link'; +import { compareUrls } from '../utils/compare_urls'; const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top) @@ -70,17 +72,6 @@ const mapStateToProps = state => ({ languages: state.getIn(['server', 'translationLanguages', 'items']), }); -const compareUrls = (href1, href2) => { - try { - const url1 = new URL(href1); - const url2 = new URL(href2); - - return url1.origin === url2.origin && url1.pathname === url2.pathname && url1.search === url2.search; - } catch { - return false; - } -}; - class StatusContent extends PureComponent { static propTypes = { identity: identityContextPropShape, @@ -165,7 +156,13 @@ class StatusContent extends PureComponent { handleElement = (element, { key, ...props }, children) => { if (element instanceof HTMLAnchorElement) { - const mention = this.props.status.get('mentions').find(item => compareUrls(element.href, item.get('url'))); + const mention = this.props.status.get('mentions').find( + item => compareUrls(element.href, item.get('url')) + ); + const taggedCollection = this.props.status.get('tagged_collections').find( + item => compareUrls(element.href, item.get('url')) + ) + return ( {children} diff --git a/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx b/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx index e5ae18ef96a979..7a6bf1d14bf6ef 100644 --- a/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx +++ b/app/javascript/mastodon/components/status_emoji_reactions_bar.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { injectIntl } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; import classNames from 'classnames'; diff --git a/app/javascript/mastodon/components/status_list.jsx b/app/javascript/mastodon/components/status_list.jsx index 817a9e9ce4be8f..5e2c960ed15294 100644 --- a/app/javascript/mastodon/components/status_list.jsx +++ b/app/javascript/mastodon/components/status_list.jsx @@ -8,7 +8,7 @@ import { debounce } from 'lodash'; import { TIMELINE_GAP, TIMELINE_PINNED_VIEW_ALL, TIMELINE_SUGGESTIONS } from 'mastodon/actions/timelines'; import { RegenerationIndicator } from 'mastodon/components/regeneration_indicator'; import { InlineFollowSuggestions } from 'mastodon/features/home_timeline/components/inline_follow_suggestions'; -import { PinnedShowAllButton } from '@/mastodon/features/account_timeline/v2/pinned_statuses'; +import { PinnedShowAllButton } from '@/mastodon/features/account_timeline/components/pinned_statuses'; import { StatusQuoteManager } from '../components/status_quoted'; diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index 1fffe26c08b64d..5c9804fb40e8cf 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -335,7 +335,6 @@ export const QuotedStatus: React.FC = ({ return (
    - {/* @ts-expect-error Status is not yet typed */}
    - {label} + {label}
    ); }; diff --git a/app/javascript/mastodon/components/tab_list/index.tsx b/app/javascript/mastodon/components/tab_list/index.tsx new file mode 100644 index 00000000000000..98651ff4d07ce5 --- /dev/null +++ b/app/javascript/mastodon/components/tab_list/index.tsx @@ -0,0 +1,51 @@ +import type { ComponentPropsWithoutRef, FC } from 'react'; + +import classNames from 'classnames'; +import type { NavLinkProps } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; + +import classes from './styles.module.scss'; + +interface TabListProps { + /** + * Setting this will remove the default border and + * horizontal padding from the component + */ + plain?: boolean; +} + +/** + * Display a simple row of links as tabs. + * The current page will be highlighted automatically based on the link destination. + */ +export const TabList: FC> = ({ + plain, + className, + children, + ...otherProps +}) => { + return ( +
    + {children} +
    + ); +}; + +export const TabLink: FC = ({ + className, + children, + ...otherProps +}) => { + return ( + + {children} + + ); +}; diff --git a/app/javascript/mastodon/components/tab_list/styles.module.scss b/app/javascript/mastodon/components/tab_list/styles.module.scss new file mode 100644 index 00000000000000..95a71114fd7e3f --- /dev/null +++ b/app/javascript/mastodon/components/tab_list/styles.module.scss @@ -0,0 +1,45 @@ +.tabList { + display: flex; + gap: 16px; +} + +.withSpaceAndBorder { + padding-inline: 16px; + border-bottom: 1px solid var(--color-border-primary); +} + +.tab { + display: block; + padding: 18px 0; + color: var(--color-text-primary); + font-size: 15px; + font-weight: 500; + text-decoration: none; + border-radius: 0; + transition: color 0.2s ease-in-out; + + @container (width < 500px) { + flex: 1 1 0px; + text-align: center; + } + + &:hover { + text-decoration: none; + } + + &:focus { + // Override silly global border radius on focused links + border-radius: 0; + outline-offset: 2px; + } + + &:not(:global(.active)):is(:hover, :focus) { + color: var(--color-text-brand-soft); + } + + &:global(.active) { + color: var(--color-text-brand); + border-bottom: 4px solid var(--color-border-brand); + padding-bottom: 14px; + } +} diff --git a/app/javascript/mastodon/components/tab_list/tab_list.stories.tsx b/app/javascript/mastodon/components/tab_list/tab_list.stories.tsx new file mode 100644 index 00000000000000..56edb1b324c2bc --- /dev/null +++ b/app/javascript/mastodon/components/tab_list/tab_list.stories.tsx @@ -0,0 +1,33 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +import { TabList, TabLink } from './index'; + +const meta = { + title: 'Components/TabList', + component: TabList, + subcomponents: { TabLink }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + Activity + Media + Featured + + ), +}; + +export const Plain: Story = { + render: () => ( + + Activity + Media + Featured + + ), +}; diff --git a/app/javascript/mastodon/components/tags/style.module.css b/app/javascript/mastodon/components/tags/style.module.css index f3c507b644f851..dd14cc43df8ec4 100644 --- a/app/javascript/mastodon/components/tags/style.module.css +++ b/app/javascript/mastodon/components/tags/style.module.css @@ -22,8 +22,8 @@ button.tag:focus-visible { } .active { - border-color: var(--color-text-brand); - background: var(--color-bg-brand-softer); + border-color: var(--color-border-brand); + background: var(--color-bg-brand-softest); color: var(--color-text-brand); } diff --git a/app/javascript/mastodon/components/truncated_list/index.tsx b/app/javascript/mastodon/components/truncated_list/index.tsx new file mode 100644 index 00000000000000..898900fc296834 --- /dev/null +++ b/app/javascript/mastodon/components/truncated_list/index.tsx @@ -0,0 +1,116 @@ +import { useCallback, useId, useState } from 'react'; + +import { Article } from '@/mastodon/components/scrollable_list/components'; +import KeyboardArrowDownIcon from '@/material-icons/400-24px/keyboard_arrow_down.svg?react'; +import KeyboardArrowUpIcon from '@/material-icons/400-24px/keyboard_arrow_up.svg?react'; + +import { Icon } from '../icon'; +import type { IconProp } from '../icon'; +import { ListItemButton, ListItemWrapper } from '../list_item'; + +export interface TruncatedListItemInfo { + item: TListItem; + index: number; + totalListLength: number; + isLastElement: boolean; +} + +interface ToggleButtonOptions { + title: NonNullable; + subtitle?: React.ReactNode; + icon?: IconProp; +} + +interface TruncatedListProps { + visibleItems: TListItem[]; + truncatedItems: TListItem[]; + renderListItem: ( + itemInfo: TruncatedListItemInfo, + ) => React.ReactElement; + toggleButton: ToggleButtonOptions; +} + +/** + * Truncate the children of an `ItemList` component with this helper + * component. + * It handles rendering the children with correct indexes for accessibility, + * and has a configurable toggle button. + */ +export const TruncatedListItems = ({ + visibleItems, + truncatedItems, + toggleButton, + renderListItem, +}: TruncatedListProps) => { + const toggleButtonId = useId(); + const toggleButtonDescId = `${toggleButtonId}-desc`; + const [showTruncatedItems, setShowTruncatedItems] = useState(false); + const toggleTruncatedItems = useCallback(() => { + setShowTruncatedItems((prev) => !prev); + }, []); + + const hasHiddenAccounts = truncatedItems.length > 0; + // Add the toggle button's item to the list size when needed + const initialListSize = visibleItems.length + (hasHiddenAccounts ? 1 : 0); + const totalListLength = + initialListSize + (showTruncatedItems ? truncatedItems.length : 0); + + return ( + <> + {visibleItems.map((item, index) => { + return renderListItem({ + item, + index, + totalListLength, + isLastElement: + index === visibleItems.length - 1 && !hasHiddenAccounts, + }); + })} + {hasHiddenAccounts && ( +
    + + ) + } + sideContent={ + + } + > + + {toggleButton.title} + + +
    + )} + {showTruncatedItems && + truncatedItems.map((item, index) => { + return renderListItem({ + item, + index: initialListSize + index + 1, + totalListLength, + isLastElement: index === truncatedItems.length - 1, + }); + })} + + ); +}; diff --git a/app/javascript/mastodon/components/verified_badge.tsx b/app/javascript/mastodon/components/verified_badge.tsx deleted file mode 100644 index cc8d8bf409d6d3..00000000000000 --- a/app/javascript/mastodon/components/verified_badge.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { EmojiHTML } from '@/mastodon/components/emoji/html'; -import CheckIcon from '@/material-icons/400-24px/check.svg?react'; - -import type { OnAttributeHandler } from '../utils/html'; - -import { Icon } from './icon'; - -const onAttribute: OnAttributeHandler = (name, value, tagName) => { - if (name === 'rel' && tagName === 'a') { - if (value === 'me') { - return null; - } - return [ - name, - value - .split(' ') - .filter((x) => x !== 'me') - .join(' '), - ]; - } - return undefined; -}; - -interface Props { - link: string; -} -export const VerifiedBadge: React.FC = ({ link }) => ( - - - - -); diff --git a/app/javascript/mastodon/containers/compose_container.jsx b/app/javascript/mastodon/containers/compose_container.jsx index 468c78828e588a..5d54052e588bec 100644 --- a/app/javascript/mastodon/containers/compose_container.jsx +++ b/app/javascript/mastodon/containers/compose_container.jsx @@ -1,7 +1,6 @@ import { Provider } from 'react-redux'; import { fetchCircles } from 'mastodon/actions/circles'; -import { fetchCustomEmojis } from 'mastodon/actions/custom_emojis'; import { fetchServer } from 'mastodon/actions/server'; import { hydrateStore } from 'mastodon/actions/store'; import { Router } from 'mastodon/components/router'; @@ -14,7 +13,6 @@ if (initialState) { store.dispatch(hydrateStore(initialState)); } -store.dispatch(fetchCustomEmojis()); store.dispatch(fetchCircles()); store.dispatch(fetchServer()); diff --git a/app/javascript/mastodon/containers/mastodon.jsx b/app/javascript/mastodon/containers/mastodon.jsx index d045eada013aab..3da0a0a6fcbc80 100644 --- a/app/javascript/mastodon/containers/mastodon.jsx +++ b/app/javascript/mastodon/containers/mastodon.jsx @@ -5,9 +5,7 @@ import { Route } from 'react-router-dom'; import { Provider as ReduxProvider } from 'react-redux'; - import { fetchCircles } from 'mastodon/actions/circles'; -import { fetchCustomEmojis } from 'mastodon/actions/custom_emojis'; import { fetchReactionDeck } from 'mastodon/actions/reaction_deck'; import { hydrateStore } from 'mastodon/actions/store'; import { connectUserStream } from 'mastodon/actions/streaming'; @@ -29,7 +27,6 @@ const hydrateAction = hydrateStore(initialState); store.dispatch(hydrateAction); if (initialState.meta.me) { - store.dispatch(fetchCustomEmojis()); store.dispatch(fetchReactionDeck()); store.dispatch(fetchCircles()); } diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index fd5578fc9825ee..97b52114deeb83 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -1,5 +1,3 @@ -import { injectIntl } from 'react-intl'; - import { connect } from 'react-redux'; import { @@ -46,6 +44,7 @@ import { undoStatusTranslation, } from '../actions/statuses'; import { setStatusQuotePolicy } from '../actions/statuses_typed'; +import { injectIntl } from '../components/intl'; import Status from '../components/status'; import { deleteModal } from '../initial_state'; import { makeGetStatus, makeGetPictureInPicture } from '../selectors'; diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index 539a7c2b360325..f795ee8ed332cd 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -1,13 +1,14 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; +import { injectIntl } from '@/mastodon/components/intl'; import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'mastodon/actions/server'; import { Account } from 'mastodon/components/account'; import Column from 'mastodon/components/column'; @@ -110,7 +111,14 @@ class About extends PureComponent {
    - `${value} ${key.replace('@', '')}`).join(', ')} className='about__header__hero' /> + `${value} ${key.replace('@', '')}`).join(', ')} + className='about__header__hero' + />

    {isLoading ? : server.get('domain')}

    Mastodon }} />

    diff --git a/app/javascript/mastodon/features/account_edit/components/column.tsx b/app/javascript/mastodon/features/account_edit/components/column.tsx index 9fb83e444ce455..dde74368878f30 100644 --- a/app/javascript/mastodon/features/account_edit/components/column.tsx +++ b/app/javascript/mastodon/features/account_edit/components/column.tsx @@ -23,7 +23,7 @@ export const AccountEditEmptyColumn: FC<{ } return ( - + ); @@ -38,7 +38,7 @@ export const AccountEditColumn: FC<{ return ( <> - + - {children} +
    {children}
    {title} diff --git a/app/javascript/mastodon/features/account_edit/components/tag_search.tsx b/app/javascript/mastodon/features/account_edit/components/tag_search.tsx index 3b423c0735613e..04befb46903e78 100644 --- a/app/javascript/mastodon/features/account_edit/components/tag_search.tsx +++ b/app/javascript/mastodon/features/account_edit/components/tag_search.tsx @@ -4,6 +4,7 @@ import { useCallback, useId, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Combobox } from '@/mastodon/components/form_fields'; +import { ComboboxMenuItem } from '@/mastodon/components/form_fields/combobox_field'; import { useSearchTags } from '@/mastodon/hooks/useSearchTags'; import type { TagSearchResult } from '@/mastodon/hooks/useSearchTags'; import { addFeaturedTags } from '@/mastodon/reducers/slices/profile_edit'; @@ -65,7 +66,7 @@ export const AccountEditTagSearch: FC = () => { value={query} onChange={handleSearchChange} placeholder={inputLabel} - items={suggestedTags as TagSearchResult[]} + items={suggestedTags} isLoading={isLoading} renderItem={renderItem} onSelectItem={handleSelect} @@ -77,4 +78,6 @@ export const AccountEditTagSearch: FC = () => { ); }; -const renderItem = (item: TagSearchResult) => item.label ?? `#${item.name}`; +const renderItem = (item: TagSearchResult) => ( + {item.label ?? `#${item.name}`} +); diff --git a/app/javascript/mastodon/features/account_edit/index.tsx b/app/javascript/mastodon/features/account_edit/index.tsx index 9161b2f7a553a8..0199c3efa45aa1 100644 --- a/app/javascript/mastodon/features/account_edit/index.tsx +++ b/app/javascript/mastodon/features/account_edit/index.tsx @@ -13,11 +13,16 @@ import { Button } from '@/mastodon/components/button'; import { DismissibleCallout } from '@/mastodon/components/callout/dismissible'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; import { EmojiHTML } from '@/mastodon/components/emoji/html'; +import { ToggleField } from '@/mastodon/components/form_fields'; import { useElementHandledLink } from '@/mastodon/components/status/handled_link'; import { useAccount } from '@/mastodon/hooks/useAccount'; import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { useCustomEmojis } from '@/mastodon/hooks/useCustomEmojis'; import { autoPlayGif } from '@/mastodon/initial_state'; -import { fetchProfile } from '@/mastodon/reducers/slices/profile_edit'; +import { + fetchProfile, + patchProfile, +} from '@/mastodon/reducers/slices/profile_edit'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import { AccountEditColumn, AccountEditEmptyColumn } from './components/column'; @@ -59,7 +64,7 @@ export const messages = defineMessages({ defaultMessage: 'Add a short introduction to help others identify you.', }, bioAddLabel: { - id: 'account_edit.bio.label', + id: 'account_edit.bio.add_label', defaultMessage: 'Add bio', }, bioEditLabel: { @@ -102,11 +107,15 @@ export const messages = defineMessages({ }, profileTabTitle: { id: 'account_edit.profile_tab.title', - defaultMessage: 'Profile tab settings', + defaultMessage: 'Profile display settings', }, profileTabSubtitle: { id: 'account_edit.profile_tab.subtitle', - defaultMessage: 'Customize the tabs on your profile and what they display.', + defaultMessage: 'Customize how your profile is displayed.', + }, + advancedSettingsTitle: { + id: 'account_edit.advanced_settings.title', + defaultMessage: 'Advanced settings', }, }); @@ -117,7 +126,7 @@ export const AccountEdit: FC = () => { const dispatch = useAppDispatch(); - const { profile } = useAppSelector((state) => state.profileEdit); + const { profile, isPending } = useAppSelector((state) => state.profileEdit); useEffect(() => { void dispatch(fetchProfile()); }, [dispatch]); @@ -162,8 +171,12 @@ export const AccountEdit: FC = () => { history.push('/profile/featured_tags'); }, [history]); + const handleBotToggle = useCallback(() => { + void dispatch(patchProfile({ bot: !profile?.bot })); + }, [dispatch, profile?.bot]); + // Normally we would use the account emoji, but we want all custom emojis to be available to render after editing. - const emojis = useAppSelector((state) => state.custom_emojis); + const emojis = useCustomEmojis(); const htmlHandlers = useElementHandledLink({ hashtagAccountId: profile?.id, }); @@ -241,21 +254,23 @@ export const AccountEdit: FC = () => { showDescription={!hasFields} buttons={
    - + )} + {profile.fields.length < maxFieldCount && ( + - - = maxFieldCount} - /> + )}
    } > @@ -325,6 +340,26 @@ export const AccountEdit: FC = () => { } /> + + + + } + hint={ + + } + /> + ); diff --git a/app/javascript/mastodon/features/account_edit/modals/fields_modals.tsx b/app/javascript/mastodon/features/account_edit/modals/fields_modals.tsx index 41991da7d0f468..98324cf4dd2d9c 100644 --- a/app/javascript/mastodon/features/account_edit/modals/fields_modals.tsx +++ b/app/javascript/mastodon/features/account_edit/modals/fields_modals.tsx @@ -5,7 +5,7 @@ import { useMemo, useState, } from 'react'; -import type { FC } from 'react'; +import type { FC, FocusEventHandler } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -13,8 +13,9 @@ import type { Map as ImmutableMap } from 'immutable'; import { closeModal } from '@/mastodon/actions/modal'; import { Button } from '@/mastodon/components/button'; -import { Callout } from '@/mastodon/components/callout'; +import type { FieldStatus } from '@/mastodon/components/form_fields'; import { EmojiTextInputField } from '@/mastodon/components/form_fields'; +import { useCustomEmojis } from '@/mastodon/hooks/useCustomEmojis'; import { removeField, selectFieldById, @@ -71,6 +72,26 @@ const messages = defineMessages({ id: 'account_edit.field_edit_modal.discard_confirm', defaultMessage: 'Discard', }, + errorBlank: { + id: 'form_error.blank', + defaultMessage: 'Field cannot be blank.', + }, + warningLength: { + id: 'account_edit.field_edit_modal.length_warning', + defaultMessage: + 'Recommended character limit exceeded. Mobile users might not see your field in full.', + }, + warningUrlEmoji: { + id: 'account_edit.field_edit_modal.link_emoji_warning', + defaultMessage: + 'We recommend against the use of custom emoji in combination with urls. Custom fields containing both will display as text only instead of as a link, in order to prevent user confusion.', + }, + warningUrlProtocol: { + id: 'account_edit.field_edit_modal.url_warning', + defaultMessage: + 'To add a link, please include {protocol} at the beginning.', + description: '{protocol} is https://', + }, }); // We have two different values- the hard limit set by the server, @@ -90,11 +111,6 @@ const selectFieldLimits = createAppSelector( const RECOMMENDED_LIMIT = 40; -const selectEmojiCodes = createAppSelector( - [(state) => state.custom_emojis], - (emojis) => emojis.map((emoji) => emoji.get('shortcode')).toArray(), -); - interface ConfirmationMessage { message: string; confirm: string; @@ -124,34 +140,90 @@ export const EditFieldModal = forwardRef< const { nameLimit, valueLimit } = useAppSelector(selectFieldLimits); const isPending = useAppSelector((state) => state.profileEdit.isPending); - const disabled = - !newLabel.trim() || - !newValue.trim() || - !isDirty || - !nameLimit || - !valueLimit || - newLabel.length > nameLimit || - newValue.length > valueLimit; + const [fieldStatuses, setFieldStatuses] = useState<{ + label?: FieldStatus; + value?: FieldStatus; + }>({}); - const customEmojiCodes = useAppSelector(selectEmojiCodes); - const hasLinkAndEmoji = useMemo(() => { - const text = `${newLabel} ${newValue}`; // Combine text, as we're searching it all. - const hasLink = /https?:\/\//.test(text); - const hasEmoji = customEmojiCodes.some((code) => - text.includes(`:${code}:`), - ); - return hasLink && hasEmoji; - }, [customEmojiCodes, newLabel, newValue]); - const hasLinkWithoutProtocol = useMemo( - () => isUrlWithoutProtocol(newValue), - [newValue], + const customEmojis = useCustomEmojis(); + const customEmojiCodes = useMemo( + () => Object.keys(customEmojis ?? {}), + [customEmojis], + ); + const checkField = useCallback( + (value: string): FieldStatus | null => { + if (!value.trim()) { + return { + variant: 'error', + message: intl.formatMessage(messages.errorBlank), + }; + } + + if (value.length > RECOMMENDED_LIMIT) { + return { + variant: 'warning', + message: intl.formatMessage(messages.warningLength, { + max: RECOMMENDED_LIMIT, + }), + }; + } + + const hasLink = /https?:\/\//.test(value); + const hasEmoji = customEmojiCodes.some((code) => + value.includes(`:${code}:`), + ); + if (hasLink && hasEmoji) { + return { + variant: 'warning', + message: intl.formatMessage(messages.warningUrlEmoji), + }; + } + + if (isUrlWithoutProtocol(value)) { + return { + variant: 'warning', + message: intl.formatMessage(messages.warningUrlProtocol, { + protocol: 'https://', + }), + }; + } + + return null; + }, + [customEmojiCodes, intl], + ); + + const handleBlur: FocusEventHandler = useCallback( + (event) => { + const { name, value } = event.target; + const result = checkField(value); + if (name !== 'label' && name !== 'value') { + return; + } + setFieldStatuses((statuses) => ({ + ...statuses, + [name]: result ?? undefined, + })); + }, + [checkField], ); const dispatch = useAppDispatch(); const handleSave = useCallback(() => { - if (disabled || isPending) { + if (isPending) { + return; + } + + const labelStatus = checkField(newLabel); + const valueStatus = checkField(newValue); + if (labelStatus?.variant === 'error' || valueStatus?.variant === 'error') { + setFieldStatuses({ + label: labelStatus ?? undefined, + value: valueStatus ?? undefined, + }); return; } + void dispatch( updateField({ id: fieldKey, name: newLabel, value: newValue }), ).then(() => { @@ -163,7 +235,7 @@ export const EditFieldModal = forwardRef< }), ); }); - }, [disabled, dispatch, fieldKey, isPending, newLabel, newValue]); + }, [checkField, dispatch, fieldKey, isPending, newLabel, newValue]); useImperativeHandle( ref, @@ -198,60 +270,33 @@ export const EditFieldModal = forwardRef< confirm={intl.formatMessage(messages.save)} onConfirm={handleSave} updating={isPending} - disabled={disabled} className={classes.wrapper} > - - {hasLinkAndEmoji && ( - - - - )} - - {(newLabel.length > RECOMMENDED_LIMIT || - newValue.length > RECOMMENDED_LIMIT) && ( - - - - )} - - {hasLinkWithoutProtocol && ( - - https://, - }} - /> - - )} ); }); diff --git a/app/javascript/mastodon/features/account_edit/modals/fields_reorder_modal.tsx b/app/javascript/mastodon/features/account_edit/modals/fields_reorder_modal.tsx index 8a94c99ac28a1d..60ec040579a9d2 100644 --- a/app/javascript/mastodon/features/account_edit/modals/fields_reorder_modal.tsx +++ b/app/javascript/mastodon/features/account_edit/modals/fields_reorder_modal.tsx @@ -35,6 +35,7 @@ import { CSS } from '@dnd-kit/utilities'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; import { normalizeKey } from '@/mastodon/components/hotkeys/utils'; import { Icon } from '@/mastodon/components/icon'; +import { useCustomEmojis } from '@/mastodon/hooks/useCustomEmojis'; import type { FieldData } from '@/mastodon/reducers/slices/profile_edit'; import { patchProfile, @@ -217,7 +218,7 @@ export const ReorderFieldsModal: FC = ({ onClose }) => { void dispatch(patchProfile({ fields_attributes: newFields })).then(onClose); }, [dispatch, fieldKeys, fields, onClose]); - const emojis = useAppSelector((state) => state.custom_emojis); + const emojis = useCustomEmojis(); return ( // Add a wrapper here in the capture phase, so that it can be intercepted before the window listener in ModalRoot. diff --git a/app/javascript/mastodon/features/account_edit/modals/image_alt.tsx b/app/javascript/mastodon/features/account_edit/modals/image_alt.tsx index 973c74ff83e0f3..d9d014f792b59f 100644 --- a/app/javascript/mastodon/features/account_edit/modals/image_alt.tsx +++ b/app/javascript/mastodon/features/account_edit/modals/image_alt.tsx @@ -3,6 +3,7 @@ import { useCallback, useState } from 'react'; import { FormattedMessage } from 'react-intl'; +import { CharacterCounter } from '@/mastodon/components/character_counter'; import { Details } from '@/mastodon/components/details'; import { TextAreaField } from '@/mastodon/components/form_fields'; import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; @@ -84,7 +85,12 @@ export const ImageAltTextField: FC<{ const altLimit = useAppSelector( (state) => state.server.getIn( - ['server', 'configuration', 'media_attachments', 'description_limit'], + [ + 'server', + 'configuration', + 'accounts', + 'max_header_description_length', + ], 150, ) as number, ); @@ -100,23 +106,26 @@ export const ImageAltTextField: FC<{ <> - - } - hint={ - - } - onChange={handleChange} - value={altText} - maxLength={altLimit} - /> +
    + + } + hint={ + + } + onChange={handleChange} + value={altText} + maxLength={altLimit} + /> + +
    {!hideTip && (
      {chunks}
    , li: (chunks) =>
  • {chunks}
  • , diff --git a/app/javascript/mastodon/features/account_edit/modals/image_upload.tsx b/app/javascript/mastodon/features/account_edit/modals/image_upload.tsx index 23636083de7ba1..e63ac427c2a86c 100644 --- a/app/javascript/mastodon/features/account_edit/modals/image_upload.tsx +++ b/app/javascript/mastodon/features/account_edit/modals/image_upload.tsx @@ -64,15 +64,28 @@ export const ImageUploadModal: FC< const [imageBlob, setImageBlob] = useState(null); const handleFile = useCallback((file: File) => { - const reader = new FileReader(); - reader.addEventListener('load', () => { - const result = reader.result; - if (typeof result === 'string' && result.length > 0) { - setImageSrc(result); - setStep('crop'); + try { + // If the image is animated, skip cropping and go straight to alt text. + if (file.type === 'image/gif') { + setImageBlob(file); + setStep('alt'); + return; } - }); - reader.readAsDataURL(file); + + const reader = new FileReader(); + reader.onload = () => { + const dataUri = reader.result; + if (typeof dataUri !== 'string') { + throw new Error('Expected a string'); + } + setImageSrc(dataUri); + setStep('crop'); + }; + reader.readAsDataURL(file); + } catch (error) { + console.warn('Error with image parsing:', error); + setStep('select'); + } }, []); const handleCrop = useCallback( @@ -104,19 +117,20 @@ export const ImageUploadModal: FC< ); const handleCancel = useCallback(() => { - switch (step) { - case 'crop': - setImageSrc(null); - setStep('select'); - break; - case 'alt': - setImageBlob(null); + if (step === 'crop') { + setImageSrc(null); + setStep('select'); + } else if (step === 'alt') { + setImageBlob(null); + if (imageSrc) { setStep('crop'); - break; - default: - onClose(); + } else { + setStep('select'); + } + } else { + onClose(); } - }, [onClose, step]); + }, [imageSrc, onClose, step]); return ( = ({ onClose }) => { const handleToggleChange: ChangeEventHandler = useCallback( (event) => { const { name, checked } = event.target; - void dispatch(patchProfile({ [name]: checked })); + const targetChecked = name === 'hide_collections' ? !checked : checked; + void dispatch(patchProfile({ [name]: targetChecked })); }, [dispatch], ); @@ -101,6 +102,25 @@ export const ProfileDisplayModal: FC = ({ onClose }) => { /> } /> + + + } + hint={ + + } + />
    img { object-fit: cover; - object-position: top center; width: 100%; height: 100%; } @@ -26,7 +25,7 @@ .avatar { margin-top: -64px; - margin-left: 18px; + margin-left: 22px; position: relative; width: 82px; @@ -127,11 +126,6 @@ // Column component -.column { - border: 1px solid var(--color-border-primary); - border-top-width: 0; -} - .columnHeader { :global(.column-header__buttons) { align-items: center; @@ -160,7 +154,7 @@ &:active, &:focus, &:hover { - background-color: var(--color-bg-brand-softer); + background-color: var(--color-bg-brand-softest); } &:disabled { @@ -177,12 +171,17 @@ .deleteButton { --default-icon-color: var(--color-text-error); - --hover-bg-color: var(--color-bg-error-base-hover); + --hover-bg-color: var(--color-bg-error-base); --hover-icon-color: var(--color-text-on-error-base); } // Field component +.fieldName, +.fieldValue { + word-break: break-all; +} + .fieldName { color: var(--color-text-secondary); font-size: 13px; @@ -201,7 +200,7 @@ &, &:global(.active) { // Overrides the transparent background added by default with .active - --hover-bg-color: var(--color-bg-brand-softer-solid); + --hover-bg-color: var(--color-bg-brand-softest); } position: absolute; @@ -251,9 +250,13 @@ // Section component .section { - padding: 20px; + padding: 24px; border-bottom: 1px solid var(--color-border-primary); font-size: 15px; + + &:last-child { + border-bottom: none; + } } .sectionHeader { diff --git a/app/javascript/mastodon/features/account_featured/components/empty_message.tsx b/app/javascript/mastodon/features/account_featured/components/empty_message.tsx index 51450a85d80dbc..19ced4ce23cade 100644 --- a/app/javascript/mastodon/features/account_featured/components/empty_message.tsx +++ b/app/javascript/mastodon/features/account_featured/components/empty_message.tsx @@ -1,15 +1,24 @@ +import { useCallback } from 'react'; + import { FormattedMessage } from 'react-intl'; import { useParams } from 'react-router'; +import { Link } from 'react-router-dom'; -import { LimitedAccountHint } from 'mastodon/features/account_timeline/components/limited_account_hint'; -import { me } from 'mastodon/initial_state'; +import { openModal } from '@/mastodon/actions/modal'; +import { Button } from '@/mastodon/components/button'; +import { EmptyState } from '@/mastodon/components/empty_state'; +import { LimitedAccountHint } from '@/mastodon/components/limited_account_hint'; +import { areCollectionsEnabled } from '@/mastodon/features/collections/utils'; +import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { useAppDispatch } from '@/mastodon/store'; interface EmptyMessageProps { suspended: boolean; hidden: boolean; blockedBy: boolean; accountId?: string; + withoutAddCollectionButton?: boolean; } export const EmptyMessage: React.FC = ({ @@ -17,23 +26,81 @@ export const EmptyMessage: React.FC = ({ suspended, hidden, blockedBy, + withoutAddCollectionButton, }) => { const { acct } = useParams<{ acct?: string }>(); + const me = useCurrentAccountId(); + + const dispatch = useAppDispatch(); + + const confirmHideFeaturedTab = useCallback(() => { + void dispatch( + openModal({ + modalType: 'ACCOUNT_HIDE_FEATURED_TAB', + modalProps: {}, + }), + ); + }, [dispatch]); + if (!accountId) { return null; } + let title: React.ReactNode = null; let message: React.ReactNode = null; + const hasCollections = areCollectionsEnabled(); + if (me === accountId) { - message = ( - - ); + if (hasCollections) { + // Return only here to insert the "Create a collection" button as the action for the empty state. + return ( + + } + message={ + + } + > + {!withoutAddCollectionButton && ( + + + + )} + + + ); + } else { + title = ( + + ); + message = ( + + ); + } } else if (suspended) { - message = ( + title = ( = ({ } else if (hidden) { message = ; } else if (blockedBy) { - message = ( + title = ( ); - } else if (acct) { - message = ( - - ); } else { - message = ( - - ); + if (acct) { + title = ( + + ); + } else { + title = ( + + ); + } } - return
    {message}
    ; + return ; }; diff --git a/app/javascript/mastodon/features/account_featured/components/featured_tag.tsx b/app/javascript/mastodon/features/account_featured/components/featured_tag.tsx deleted file mode 100644 index b9a79ce25e0203..00000000000000 --- a/app/javascript/mastodon/features/account_featured/components/featured_tag.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { defineMessages, useIntl } from 'react-intl'; - -import type { Map as ImmutableMap } from 'immutable'; - -import { Hashtag } from 'mastodon/components/hashtag'; - -export type TagMap = ImmutableMap< - 'id' | 'name' | 'url' | 'statuses_count' | 'last_status_at' | 'accountId', - string | null ->; - -interface FeaturedTagProps { - tag: TagMap; - account: string; -} - -const messages = defineMessages({ - lastStatusAt: { - id: 'account.featured_tags.last_status_at', - defaultMessage: 'Last post on {date}', - }, - empty: { - id: 'account.featured_tags.last_status_never', - defaultMessage: 'No posts', - }, -}); - -export const FeaturedTag: React.FC = ({ tag, account }) => { - const intl = useIntl(); - const name = tag.get('name') ?? ''; - const count = Number.parseInt(tag.get('statuses_count') ?? ''); - return ( - 0 - ? intl.formatMessage(messages.lastStatusAt, { - date: intl.formatDate(tag.get('last_status_at') ?? '', { - month: 'short', - day: '2-digit', - year: 'numeric', - }), - }) - : intl.formatMessage(messages.empty) - } - /> - ); -}; diff --git a/app/javascript/mastodon/features/account_featured/components/subheading.module.scss b/app/javascript/mastodon/features/account_featured/components/subheading.module.scss new file mode 100644 index 00000000000000..aee5d65af268f5 --- /dev/null +++ b/app/javascript/mastodon/features/account_featured/components/subheading.module.scss @@ -0,0 +1,37 @@ +.subheading { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + min-height: 52px; + padding: 12px 16px; + font-size: 13px; + font-weight: 500; + text-transform: uppercase; + color: var(--color-text-primary); + background: var(--color-bg-secondary); +} + +.link { + display: flex; + padding-block: 4px; + font-size: 13px; + font-weight: 500; + text-transform: none; + text-decoration: none; + color: inherit; + + &:hover { + text-decoration: underline; + } + + &:focus-visible { + outline: var(--outline-focus-default); + outline-offset: 2px; + } + + :global(.icon) { + width: 18px; + height: 18px; + } +} diff --git a/app/javascript/mastodon/features/account_featured/components/subheading.tsx b/app/javascript/mastodon/features/account_featured/components/subheading.tsx new file mode 100644 index 00000000000000..361253b26027bd --- /dev/null +++ b/app/javascript/mastodon/features/account_featured/components/subheading.tsx @@ -0,0 +1,42 @@ +import type { ComponentPropsWithoutRef } from 'react'; + +import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + +import type { IconProp } from '@/mastodon/components/icon'; +import { Icon } from '@/mastodon/components/icon'; +import { polymorphicForwardRef } from '@/types/polymorphic'; + +import classes from './subheading.module.scss'; + +export const Subheading = polymorphicForwardRef<'h2'>( + ({ as: Component = 'h2', children, className, ...props }, ref) => { + return ( + + {children} + + ); + }, +); + +interface SubheadingLinkProps extends ComponentPropsWithoutRef { + icon: IconProp; +} + +export const SubheadingLink: React.FC = ({ + icon, + children, + className, + ...props +}) => { + return ( + + + {children} + + ); +}; diff --git a/app/javascript/mastodon/features/account_featured/index.tsx b/app/javascript/mastodon/features/account_featured/index.tsx index 5cec2250ef6787..d4b36ae7471d68 100644 --- a/app/javascript/mastodon/features/account_featured/index.tsx +++ b/app/javascript/mastodon/features/account_featured/index.tsx @@ -1,4 +1,4 @@ -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -6,36 +6,35 @@ import { useHistory } from 'react-router'; import { List as ImmutableList } from 'immutable'; -import { useAccount } from '@/mastodon/hooks/useAccount'; -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; -import { fetchEndorsedAccounts } from 'mastodon/actions/accounts'; -import { fetchFeaturedTags } from 'mastodon/actions/featured_tags'; -import { Account } from 'mastodon/components/account'; -import { ColumnBackButton } from 'mastodon/components/column_back_button'; -import { LoadingIndicator } from 'mastodon/components/loading_indicator'; -import { RemoteHint } from 'mastodon/components/remote_hint'; +import { fetchEndorsedAccounts } from '@/mastodon/actions/accounts'; +import { AccountHeader } from '@/mastodon/components/account_header'; +import { AccountListItem } from '@/mastodon/components/account_list_item'; +import { ColumnBackButton } from '@/mastodon/components/column_back_button'; +import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; +import { RemoteHint } from '@/mastodon/components/remote_hint'; import { Article, ItemList, Scrollable, -} from 'mastodon/components/scrollable_list/components'; -import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header'; -import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; -import Column from 'mastodon/features/ui/components/column'; -import { useAccountId } from 'mastodon/hooks/useAccountId'; -import { useAccountVisibility } from 'mastodon/hooks/useAccountVisibility'; -import { - fetchAccountCollections, - selectAccountCollections, -} from 'mastodon/reducers/slices/collections'; -import { useAppDispatch, useAppSelector } from 'mastodon/store'; +} from '@/mastodon/components/scrollable_list/components'; +import type { TruncatedListItemInfo } from '@/mastodon/components/truncated_list'; +import { TruncatedListItems } from '@/mastodon/components/truncated_list'; +import BundleColumnError from '@/mastodon/features/ui/components/bundle_column_error'; +import Column from '@/mastodon/features/ui/components/column'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useAccountId } from '@/mastodon/hooks/useAccountId'; +import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import { CollectionListItem } from '../collections/detail/collection_list_item'; +import { CollectionListItem } from '../collections/components/collection_list_item'; +import { useCollectionsCreatedBy } from '../collections/overview/created_by_you'; import { areCollectionsEnabled } from '../collections/utils'; import { EmptyMessage } from './components/empty_message'; -import { FeaturedTag } from './components/featured_tag'; -import type { TagMap } from './components/featured_tag'; +import { Subheading, SubheadingLink } from './components/subheading'; + +const collectionsEnabled = areCollectionsEnabled(); const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({ multiColumn, @@ -49,37 +48,17 @@ const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({ const history = useHistory(); useEffect(() => { - if ( - account && - !account.show_featured && - isServerFeatureEnabled('profile_redesign') - ) { + if (account && !account.show_featured) { history.push(`/@${account.acct}`); } }, [account, history]); useEffect(() => { if (accountId) { - void dispatch(fetchFeaturedTags({ accountId })); void dispatch(fetchEndorsedAccounts({ accountId })); - if (areCollectionsEnabled()) { - void dispatch(fetchAccountCollections({ accountId })); - } } }, [accountId, dispatch]); - const isLoading = useAppSelector( - (state) => - !accountId || - !!state.user_lists.getIn(['featured_tags', accountId, 'isLoading']), - ); - const featuredTags = useAppSelector( - (state) => - state.user_lists.getIn( - ['featured_tags', accountId, 'items'], - ImmutableList(), - ) as ImmutableList, - ); const featuredAccountIds = useAppSelector( (state) => state.user_lists.getIn( @@ -87,16 +66,46 @@ const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({ ImmutableList(), ) as ImmutableList, ); - const { collections, status } = useAppSelector((state) => - selectAccountCollections(state, accountId ?? null), + const { collections, status: collectionsLoadStatus } = + useCollectionsCreatedBy(accountId); + + const { listedCollections = [], unlistedCollections = [] } = Object.groupBy( + collections, + (item) => + item.discoverable && !!item.item_count + ? 'listedCollections' + : 'unlistedCollections', ); - const listedCollections = collections.filter( - // Hide unlisted and empty collections to avoid confusion - // (Unlisted collections will only be part of the payload - // when viewing your own profile.) - (item) => item.discoverable && !!item.item_count, + + const renderListItem = useCallback( + ({ + item, + index, + totalListLength, + isLastElement, + }: TruncatedListItemInfo<(typeof listedCollections)[number]>) => ( + + ), + [], ); + const hasCollections = + collectionsEnabled && + collectionsLoadStatus === 'idle' && + listedCollections.length > 0; + + const hasFeaturedAccounts = !featuredAccountIds.isEmpty(); + + const isLoading = + !accountId || (collectionsEnabled && collectionsLoadStatus !== 'idle'); + if (accountId === null) { return ; } @@ -111,14 +120,7 @@ const AccountFeatured: React.FC<{ multiColumn: boolean }> = ({ ); } - const noTags = - featuredTags.isEmpty() || isServerFeatureEnabled('profile_redesign'); - - if ( - noTags && - featuredAccountIds.isEmpty() && - listedCollections.length === 0 - ) { + if (!hasFeaturedAccounts && !hasCollections) { return ( = ({ {accountId && ( )} - {listedCollections.length > 0 && status === 'idle' && ( - <> -

    - -

    - - {listedCollections.map((item, index) => ( - - ))} - - - )} - {!noTags && ( - <> -

    - -

    - - {featuredTags.map((tag, index) => ( -
    - -
    - ))} -
    - - )} {!featuredAccountIds.isEmpty() && ( <> -

    + -

    + {featuredAccountIds.map((featuredAccountId, index) => (
    = ({ aria-posinset={index + 1} aria-setsize={featuredAccountIds.size} > - +
    ))}
    )} + {collectionsEnabled && ( + <> + +

    + +

    + + + +
    + {hasCollections ? ( + + + ), + subtitle: ( + + ), + }} + renderListItem={renderListItem} + /> + + ) : ( +
    diff --git a/app/javascript/mastodon/features/account_gallery/index.tsx b/app/javascript/mastodon/features/account_gallery/index.tsx index 52f30ac5057b44..feba6f454d5e52 100644 --- a/app/javascript/mastodon/features/account_gallery/index.tsx +++ b/app/javascript/mastodon/features/account_gallery/index.tsx @@ -4,31 +4,28 @@ import { FormattedMessage } from 'react-intl'; import { List as ImmutableList, isList } from 'immutable'; -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; -import { openModal } from 'mastodon/actions/modal'; -import { expandAccountMediaTimeline } from 'mastodon/actions/timelines'; -import { ColumnBackButton } from 'mastodon/components/column_back_button'; -import { RemoteHint } from 'mastodon/components/remote_hint'; -import ScrollableList from 'mastodon/components/scrollable_list'; -import { AccountHeader } from 'mastodon/features/account_timeline/components/account_header'; -import { LimitedAccountHint } from 'mastodon/features/account_timeline/components/limited_account_hint'; -import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; -import Column from 'mastodon/features/ui/components/column'; -import { useAccountId } from 'mastodon/hooks/useAccountId'; -import { useAccountVisibility } from 'mastodon/hooks/useAccountVisibility'; -import type { MediaAttachment } from 'mastodon/models/media_attachment'; +import { openModal } from '@/mastodon/actions/modal'; +import { expandAccountMediaTimeline } from '@/mastodon/actions/timelines'; +import { AccountHeader } from '@/mastodon/components/account_header'; +import { ColumnBackButton } from '@/mastodon/components/column_back_button'; +import { LimitedAccountHint } from '@/mastodon/components/limited_account_hint'; +import { RemoteHint } from '@/mastodon/components/remote_hint'; +import ScrollableList from '@/mastodon/components/scrollable_list'; +import BundleColumnError from '@/mastodon/features/ui/components/bundle_column_error'; +import Column from '@/mastodon/features/ui/components/column'; +import { useAccountId } from '@/mastodon/hooks/useAccountId'; +import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility'; +import type { MediaAttachment } from '@/mastodon/models/media_attachment'; import { useAppSelector, useAppDispatch, createAppSelector, -} from 'mastodon/store'; +} from '@/mastodon/store'; import { MediaItem } from './components/media_item'; const emptyList = ImmutableList(); -const redesignEnabled = isServerFeatureEnabled('profile_redesign'); - const selectGalleryTimeline = createAppSelector( [ (_state, accountId?: string | null) => accountId, @@ -37,29 +34,39 @@ const selectGalleryTimeline = createAppSelector( (state) => state.statuses, ], (accountId, timelines, accounts, statuses) => { + let items = emptyList; if (!accountId) { - return null; + return { + items, + hasMore: false, + isLoading: false, + withReplies: false, + }; } const account = accounts.get(accountId); if (!account) { - return null; + return { + items, + hasMore: false, + isLoading: false, + withReplies: false, + }; } - let items = emptyList; const { show_media, show_media_replies } = account; // If the account disabled showing media, don't display anything. - if (!show_media && redesignEnabled) { + if (!show_media) { return { items, hasMore: false, isLoading: false, - showingReplies: false, + withReplies: false, }; } - const showingReplies = show_media_replies && redesignEnabled; + const withReplies = show_media_replies; const timeline = timelines.get( - `account:${accountId}:media${showingReplies ? ':with_replies' : ''}`, + `account:${accountId}:media${withReplies ? ':with_replies' : ''}`, ); const statusIds = timeline?.get('items'); @@ -77,8 +84,8 @@ const selectGalleryTimeline = createAppSelector( return { items, hasMore: !!timeline?.get('hasMore'), - isLoading: !!timeline?.get('isLoading'), - showingReplies, + isLoading: timeline?.get('isLoading') ? true : false, + withReplies, }; }, ); @@ -89,11 +96,11 @@ export const AccountGallery: React.FC<{ const dispatch = useAppDispatch(); const accountId = useAccountId(); const { - isLoading = true, - hasMore = false, - items: attachments = emptyList, - showingReplies: withReplies = false, - } = useAppSelector((state) => selectGalleryTimeline(state, accountId)) ?? {}; + isLoading, + items: attachments, + hasMore, + withReplies, + } = useAppSelector((state) => selectGalleryTimeline(state, accountId)); const { suspended, blockedBy, hidden } = useAccountVisibility(accountId); diff --git a/app/javascript/mastodon/features/account_timeline/common.ts b/app/javascript/mastodon/features/account_timeline/common.ts deleted file mode 100644 index 7a939bbec9d393..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/common.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { AccountFieldShape } from '@/mastodon/models/account'; -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; - -export function isRedesignEnabled() { - return isServerFeatureEnabled('profile_redesign'); -} - -export interface AccountField extends AccountFieldShape { - nameHasEmojis: boolean; - value_plain: string; - valueHasEmojis: boolean; -} diff --git a/app/javascript/mastodon/features/account_timeline/v2/featured_tags.tsx b/app/javascript/mastodon/features/account_timeline/components/featured_tags.tsx similarity index 96% rename from app/javascript/mastodon/features/account_timeline/v2/featured_tags.tsx rename to app/javascript/mastodon/features/account_timeline/components/featured_tags.tsx index b8061fced433d4..c4d43bb2b9f841 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/featured_tags.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/featured_tags.tsx @@ -13,8 +13,8 @@ import { useOverflowButton } from '@/mastodon/hooks/useOverflow'; import { selectAccountFeaturedTags } from '@/mastodon/selectors/accounts'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; -import { useAccountContext } from './context'; -import classes from './styles.module.scss'; +import { useAccountContext } from '../hooks/useAccountContext'; +import classes from '../styles.module.scss'; export const FeaturedTags: FC<{ accountId: string }> = ({ accountId }) => { // Fetch tags. diff --git a/app/javascript/mastodon/features/account_timeline/v2/filters.tsx b/app/javascript/mastodon/features/account_timeline/components/filters.tsx similarity index 94% rename from app/javascript/mastodon/features/account_timeline/v2/filters.tsx rename to app/javascript/mastodon/features/account_timeline/components/filters.tsx index 28dcb5f5c47731..e24ca642093fb4 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/filters.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/filters.tsx @@ -7,14 +7,13 @@ import { useParams } from 'react-router'; import Overlay from 'react-overlays/esm/Overlay'; +import { AccountTabs } from '@/mastodon/components/account_header/tabs'; import { Toggle } from '@/mastodon/components/form_fields'; import { Icon } from '@/mastodon/components/icon'; import KeyboardArrowDownIcon from '@/material-icons/400-24px/keyboard_arrow_down.svg?react'; -import { AccountTabs } from '../components/tabs'; - -import { useAccountContext } from './context'; -import classes from './styles.module.scss'; +import { useAccountContext } from '../hooks/useAccountContext'; +import classes from '../styles.module.scss'; export const AccountFilters: FC = () => { const { acct } = useParams<{ acct: string }>(); @@ -23,7 +22,7 @@ export const AccountFilters: FC = () => { } return ( <> - +
    diff --git a/app/javascript/mastodon/features/account_timeline/components/info.tsx b/app/javascript/mastodon/features/account_timeline/components/info.tsx deleted file mode 100644 index 4529b7c7e683e9..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/components/info.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import type { FC } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -import { isHideItem } from '@/mastodon/initial_state'; -import type { Relationship } from '@/mastodon/models/relationship'; - -export const AccountInfo: FC<{ relationship?: Relationship }> = ({ - relationship, -}) => { - if (!relationship) { - return null; - } - return ( -
    - {(relationship.followed_by || relationship.requested_by) && ( - - - - )} - {relationship.blocking && ( - - - - )} - {relationship.muting && ( - - - - )} - {relationship.domain_blocking && ( - - - - )} -
    - ); -}; - -const AccountInfoFollower: FC<{ relationship: Relationship }> = ({ - relationship, -}) => { - const isHideRelationships = isHideItem('relationships'); - - if ( - !isHideRelationships && - relationship.followed_by && - (relationship.following || relationship.requested) - ) { - return ( - - ); - } else if (!isHideRelationships && relationship.followed_by) { - return ( - - ); - } else if (relationship.requested_by) { - return ( - - ); - } - return null; -}; diff --git a/app/javascript/mastodon/features/account_timeline/components/number_fields.tsx b/app/javascript/mastodon/features/account_timeline/components/number_fields.tsx deleted file mode 100644 index b24d927390f03b..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/components/number_fields.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { useMemo } from 'react'; -import type { FC } from 'react'; - -import { FormattedMessage, useIntl } from 'react-intl'; - -import classNames from 'classnames'; -import { NavLink } from 'react-router-dom'; - -import { - FollowersCounter, - FollowingCounter, - StatusesCounter, -} from '@/mastodon/components/counters'; -import { FormattedDateWrapper } from '@/mastodon/components/formatted_date'; -import { ShortNumber } from '@/mastodon/components/short_number'; -import { useAccount } from '@/mastodon/hooks/useAccount'; - -import { isRedesignEnabled } from '../common'; - -import classes from './redesign.module.scss'; - -const LegacyNumberFields: FC<{ accountId: string }> = ({ accountId }) => { - const intl = useIntl(); - const account = useAccount(accountId); - - if (!account) { - return null; - } - - return ( -
    - - - - - - - - - - - -
    - ); -}; - -const RedesignNumberFields: FC<{ accountId: string }> = ({ accountId }) => { - const intl = useIntl(); - const account = useAccount(accountId); - const createdThisYear = useMemo( - () => account?.created_at.includes(new Date().getFullYear().toString()), - [account?.created_at], - ); - - if (!account) { - return null; - } - - return ( -
      -
    • - - - - -
    • - -
    • - - - - -
    • - -
    • - - - - -
    • - -
    • - - - {createdThisYear ? ( - - ) : ( - - )} - -
    • -
    - ); -}; - -export const AccountNumberFields = isRedesignEnabled() - ? RedesignNumberFields - : LegacyNumberFields; diff --git a/app/javascript/mastodon/features/account_timeline/components/pinned_statuses.tsx b/app/javascript/mastodon/features/account_timeline/components/pinned_statuses.tsx new file mode 100644 index 00000000000000..11de336002b057 --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/pinned_statuses.tsx @@ -0,0 +1,55 @@ +import type { FC } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import IconPinned from '@/images/icons/icon_pinned.svg?react'; +import { Badge } from '@/mastodon/components/badge'; +import { Button } from '@/mastodon/components/button'; +import { Icon } from '@/mastodon/components/icon'; +import { StatusHeader } from '@/mastodon/components/status/header'; +import type { StatusHeaderRenderFn } from '@/mastodon/components/status/header'; + +import { useAccountContext } from '../hooks/useAccountContext'; +import classes from '../styles.module.scss'; + +export const renderPinnedStatusHeader: StatusHeaderRenderFn = ({ + featured, + ...args +}) => { + if (!featured) { + return ; + } + return ( + + } + label={ + + } + /> + + ); +}; + +export const PinnedShowAllButton: FC = () => { + const { onShowAllPinned } = useAccountContext(); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/tabs.tsx b/app/javascript/mastodon/features/account_timeline/components/tabs.tsx deleted file mode 100644 index 5febb8eaf8c564..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/components/tabs.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import type { FC } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -import type { NavLinkProps } from 'react-router-dom'; -import { NavLink } from 'react-router-dom'; - -import { useAccount } from '@/mastodon/hooks/useAccount'; -import { useAccountId } from '@/mastodon/hooks/useAccountId'; - -import { isRedesignEnabled } from '../common'; - -import classes from './redesign.module.scss'; - -export const AccountTabs: FC<{ acct: string }> = ({ acct }) => { - if (isRedesignEnabled()) { - return ; - } - return ( -
    - - - - - - - - - - - - -
    - ); -}; - -const isActive: Required['isActive'] = (match, location) => - match?.url === location.pathname || - (!!match?.url && location.pathname.startsWith(`${match.url}/tagged/`)); - -const RedesignTabs: FC = () => { - const accountId = useAccountId(); - const account = useAccount(accountId); - - if (!account) { - return null; - } - - const { acct, show_featured, show_media } = account; - - return ( -
    - - - - {show_media && ( - - - - )} - {show_featured && ( - - - - )} -
    - ); -}; diff --git a/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx b/app/javascript/mastodon/features/account_timeline/components/tags_suggestions.tsx similarity index 88% rename from app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx rename to app/javascript/mastodon/features/account_timeline/components/tags_suggestions.tsx index 93ac491f6caee2..555dc6e7c9ae7b 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/tags_suggestions.tsx @@ -14,20 +14,27 @@ import { fetchSuggestedTags, addFeaturedTags, } from '@/mastodon/reducers/slices/profile_edit'; -import { useAppSelector, useAppDispatch } from '@/mastodon/store'; +import { + useAppSelector, + useAppDispatch, + createAppSelector, +} from '@/mastodon/store'; -import classes from './styles.module.scss'; +import classes from '../styles.module.scss'; const MAX_SUGGESTED_TAGS = 3; +const selectSuggestedTags = createAppSelector( + [(state) => state.profileEdit.tagSuggestions], + (tagSuggestions) => tagSuggestions?.slice(0, MAX_SUGGESTED_TAGS), +); + export const TagSuggestions: FC = () => { const { dismiss, wasDismissed } = useDismissible( 'profile/featured_tag_suggestions', ); - const suggestedTags = useAppSelector((state) => - state.profileEdit.tagSuggestions?.slice(0, MAX_SUGGESTED_TAGS), - ); + const suggestedTags = useAppSelector(selectSuggestedTags); const existingTagCount = useAppSelector( (state) => state.profileEdit.profile?.featuredTags.length, ); @@ -78,6 +85,7 @@ export const TagSuggestions: FC = () => { values={{ link: (chunks) => {chunks}, }} + tagName='span' /> ); @@ -122,6 +130,7 @@ export const TagSuggestions: FC = () => { /> ), }} + tagName='span' /> ); diff --git a/app/javascript/mastodon/features/account_timeline/v2/context.tsx b/app/javascript/mastodon/features/account_timeline/hooks/useAccountContext.ts similarity index 79% rename from app/javascript/mastodon/features/account_timeline/v2/context.tsx rename to app/javascript/mastodon/features/account_timeline/hooks/useAccountContext.ts index f41e19acf60745..46595425bd3408 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/context.tsx +++ b/app/javascript/mastodon/features/account_timeline/hooks/useAccountContext.ts @@ -1,4 +1,3 @@ -import type { FC, ReactNode } from 'react'; import { createContext, useCallback, @@ -10,7 +9,7 @@ import { import { useStorageState } from '@/mastodon/hooks/useStorage'; interface AccountTimelineContextValue { - accountId: string; + accountId: string | null; boosts: boolean; replies: boolean; showAllPinned: boolean; @@ -19,16 +18,23 @@ interface AccountTimelineContextValue { onShowAllPinned: () => void; } -const AccountTimelineContext = +export const AccountTimelineContext = createContext(null); -export const AccountTimelineProvider: FC<{ - accountId: string; - children: ReactNode; -}> = ({ accountId, children }) => { +export function useAccountContext() { + const values = useContext(AccountTimelineContext); + if (!values) { + throw new Error( + 'useAccountFilters must be used within an AccountTimelineProvider', + ); + } + return values; +} + +export const useAccountContextValue = (accountId?: string | null) => { const storageOptions = { - type: 'session', - prefix: `filters-${accountId}:`, + type: 'local', + prefix: 'account-filters', } as const; const [boosts, setBoosts] = useStorageState( @@ -62,9 +68,9 @@ export const AccountTimelineProvider: FC<{ }, []); // Memoize the context value to avoid unnecessary re-renders. - const value = useMemo( + return useMemo( () => ({ - accountId, + accountId: accountId ?? null, boosts, replies, showAllPinned, @@ -82,20 +88,4 @@ export const AccountTimelineProvider: FC<{ showAllPinned, ], ); - - return ( - - {children} - - ); }; - -export function useAccountContext() { - const values = useContext(AccountTimelineContext); - if (!values) { - throw new Error( - 'useAccountFilters must be used within an AccountTimelineProvider', - ); - } - return values; -} diff --git a/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx b/app/javascript/mastodon/features/account_timeline/hooks/usePinned.ts similarity index 51% rename from app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx rename to app/javascript/mastodon/features/account_timeline/hooks/usePinned.ts index 7a8523c9de549e..2ff2c16965e3fb 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx +++ b/app/javascript/mastodon/features/account_timeline/hooks/usePinned.ts @@ -1,28 +1,14 @@ -import type { FC } from 'react'; import { useEffect, useMemo } from 'react'; -import { FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; - -import IconPinned from '@/images/icons/icon_pinned.svg?react'; import { TIMELINE_PINNED_VIEW_ALL } from '@/mastodon/actions/timelines'; import { expandTimelineByKey, timelineKey, } from '@/mastodon/actions/timelines_typed'; -import { Button } from '@/mastodon/components/button'; -import { Icon } from '@/mastodon/components/icon'; -import { StatusHeader } from '@/mastodon/components/status/header'; -import type { StatusHeaderRenderFn } from '@/mastodon/components/status/header'; import { selectTimelineByKey } from '@/mastodon/selectors/timelines'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; -import { isRedesignEnabled } from '../common'; -import { PinnedBadge } from '../components/badges'; - -import { useAccountContext } from './context'; -import classes from './styles.module.scss'; +import { useAccountContext } from './useAccountContext'; export function usePinnedStatusIds({ accountId, @@ -38,6 +24,7 @@ export function usePinnedStatusIds({ userId: accountId, tagged, pinned: true, + replies: true, }); const dispatch = useAppDispatch(); @@ -69,38 +56,3 @@ export function usePinnedStatusIds({ showAllPinned, }; } - -export const renderPinnedStatusHeader: StatusHeaderRenderFn = ({ - featured, - ...args -}) => { - if (!featured) { - return ; - } - return ( - - - - ); -}; - -export const PinnedShowAllButton: FC = () => { - const { onShowAllPinned } = useAccountContext(); - - if (!isRedesignEnabled()) { - return null; - } - - return ( - - ); -}; diff --git a/app/javascript/mastodon/features/account_timeline/index.jsx b/app/javascript/mastodon/features/account_timeline/index.jsx deleted file mode 100644 index 70e607d5f2d009..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/index.jsx +++ /dev/null @@ -1,197 +0,0 @@ -import PropTypes from 'prop-types'; - -import { FormattedMessage } from 'react-intl'; - -import { List as ImmutableList } from 'immutable'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; -import { me } from 'mastodon/initial_state'; -import { normalizeForLookup } from 'mastodon/reducers/accounts_map'; -import { getAccountHidden } from 'mastodon/selectors/accounts'; - -import { lookupAccount, fetchAccount } from '../../actions/accounts'; -import { expandAccountFeaturedTimeline, expandAccountTimeline, connectTimeline, disconnectTimeline } from '../../actions/timelines'; -import { ColumnBackButton } from '../../components/column_back_button'; -import { LoadingIndicator } from '../../components/loading_indicator'; -import StatusList from '../../components/status_list'; -import Column from '../ui/components/column'; -import { RemoteHint } from 'mastodon/components/remote_hint'; - -import { AccountHeader } from './components/account_header'; -import { LimitedAccountHint } from './components/limited_account_hint'; -import { FeaturedCarousel } from '@/mastodon/components/featured_carousel'; - -const emptyList = ImmutableList(); - -const mapStateToProps = (state, { params: { acct, id, tagged }, withReplies = false }) => { - const accountId = id || state.accounts_map[normalizeForLookup(acct)]; - - if (accountId === null) { - return { - isLoading: false, - isAccount: false, - statusIds: emptyList, - }; - } else if (!accountId) { - return { - isLoading: true, - statusIds: emptyList, - }; - } - - const path = withReplies ? `${accountId}:with_replies` : `${accountId}${tagged ? `:${tagged}` : ''}`; - - return { - accountId, - isAccount: !!state.getIn(['accounts', accountId]), - statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList), - isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']), - hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']), - suspended: state.getIn(['accounts', accountId, 'suspended'], false), - hidden: getAccountHidden(state, accountId), - blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false), - }; -}; - -class AccountTimeline extends ImmutablePureComponent { - - static propTypes = { - params: PropTypes.shape({ - acct: PropTypes.string, - id: PropTypes.string, - tagged: PropTypes.string, - }).isRequired, - accountId: PropTypes.string, - dispatch: PropTypes.func.isRequired, - statusIds: ImmutablePropTypes.list, - isLoading: PropTypes.bool, - hasMore: PropTypes.bool, - withReplies: PropTypes.bool, - blockedBy: PropTypes.bool, - isAccount: PropTypes.bool, - suspended: PropTypes.bool, - hidden: PropTypes.bool, - multiColumn: PropTypes.bool, - }; - - _load () { - const { accountId, withReplies, params: { tagged }, dispatch } = this.props; - - dispatch(fetchAccount(accountId)); - - if (!withReplies) { - dispatch(expandAccountFeaturedTimeline(accountId, { tagged })); - } - - dispatch(expandAccountTimeline(accountId, { withReplies, tagged })); - - if (accountId === me) { - dispatch(connectTimeline(`account:${me}`)); - } - } - - componentDidMount () { - const { params: { acct }, accountId, dispatch } = this.props; - - if (accountId) { - this._load(); - } else { - dispatch(lookupAccount(acct)); - } - } - - componentDidUpdate (prevProps) { - const { params: { acct, tagged }, accountId, withReplies, dispatch } = this.props; - - if (prevProps.accountId !== accountId && accountId) { - this._load(); - } else if (prevProps.params.acct !== acct) { - dispatch(lookupAccount(acct)); - } else if (prevProps.params.tagged !== tagged) { - if (!withReplies) { - dispatch(expandAccountFeaturedTimeline(accountId, { tagged })); - } - dispatch(expandAccountTimeline(accountId, { withReplies, tagged })); - } - - if (prevProps.accountId === me && accountId !== me) { - dispatch(disconnectTimeline({ timeline: `account:${me}` })); - } - } - - componentWillUnmount () { - const { dispatch, accountId } = this.props; - - if (accountId === me) { - dispatch(disconnectTimeline({ timeline: `account:${me}` })); - } - } - - handleLoadMore = maxId => { - this.props.dispatch(expandAccountTimeline(this.props.accountId, { maxId, withReplies: this.props.withReplies, tagged: this.props.params.tagged })); - }; - - render () { - const { accountId, statusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl, params: { tagged } } = this.props; - - if (isLoading && statusIds.isEmpty()) { - return ( - - - - ); - } else if (!isLoading && !isAccount) { - return ( - - ); - } - - let emptyMessage; - - const forceEmptyState = suspended || blockedBy || hidden; - - if (suspended) { - emptyMessage = ; - } else if (hidden) { - emptyMessage = ; - } else if (blockedBy) { - emptyMessage = ; - } else if (remote && statusIds.isEmpty()) { - emptyMessage = ; - } else { - emptyMessage = ; - } - - return ( - - - - - - {!forceEmptyState && } - - } - alwaysPrepend - append={} - scrollKey='account_timeline' - statusIds={forceEmptyState ? emptyList : statusIds} - isLoading={isLoading} - hasMore={!forceEmptyState && hasMore} - onLoadMore={this.handleLoadMore} - emptyMessage={emptyMessage} - bindToDocument={!multiColumn} - timelineId='account' - withCounters - /> - - ); - } - -} - -export default connect(mapStateToProps)(AccountTimeline); diff --git a/app/javascript/mastodon/features/account_timeline/v2/index.tsx b/app/javascript/mastodon/features/account_timeline/index.tsx similarity index 85% rename from app/javascript/mastodon/features/account_timeline/v2/index.tsx rename to app/javascript/mastodon/features/account_timeline/index.tsx index 693813bdbe9f6b..ce1e99a45fadaf 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/index.tsx +++ b/app/javascript/mastodon/features/account_timeline/index.tsx @@ -12,8 +12,10 @@ import { expandTimelineByKey, timelineKey, } from '@/mastodon/actions/timelines_typed'; +import { AccountHeader } from '@/mastodon/components/account_header'; import { Column } from '@/mastodon/components/column'; import { ColumnBackButton } from '@/mastodon/components/column_back_button'; +import { LimitedAccountHint } from '@/mastodon/components/limited_account_hint'; import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; import { RemoteHint } from '@/mastodon/components/remote_hint'; import StatusList from '@/mastodon/components/status_list'; @@ -26,23 +28,23 @@ import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility'; import { selectTimelineByKey } from '@/mastodon/selectors/timelines'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; -import { AccountHeader } from '../components/account_header'; -import { LimitedAccountHint } from '../components/limited_account_hint'; - -import { AccountTimelineProvider, useAccountContext } from './context'; -import { FeaturedTags } from './featured_tags'; -import { AccountFilters } from './filters'; +import { FeaturedTags } from './components/featured_tags'; +import { AccountFilters } from './components/filters'; +import { renderPinnedStatusHeader } from './components/pinned_statuses'; +import { TagSuggestions } from './components/tags_suggestions'; import { - renderPinnedStatusHeader, - usePinnedStatusIds, -} from './pinned_statuses'; + AccountTimelineContext, + useAccountContext, + useAccountContextValue, +} from './hooks/useAccountContext'; +import { usePinnedStatusIds } from './hooks/usePinned'; import classes from './styles.module.scss'; -import { TagSuggestions } from './tags_suggestions'; const emptyList = ImmutableList(); -const AccountTimelineV2: FC<{ multiColumn: boolean }> = ({ multiColumn }) => { +const AccountTimeline: FC<{ multiColumn: boolean }> = ({ multiColumn }) => { const accountId = useAccountId(); + const accountContext = useAccountContextValue(accountId); // Null means accountId does not exist (e.g. invalid acct). Undefined means loading. if (accountId === null) { @@ -59,13 +61,13 @@ const AccountTimelineV2: FC<{ multiColumn: boolean }> = ({ multiColumn }) => { // Add this key to remount the timeline when accountId changes. return ( - + - + ); }; @@ -183,4 +185,4 @@ const EmptyMessage: FC<{ accountId: string }> = ({ accountId }) => { }; // eslint-disable-next-line import/no-default-export -export default AccountTimelineV2; +export default AccountTimeline; diff --git a/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx b/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx index c778e08fa26a5b..baf0c70f76289d 100644 --- a/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx +++ b/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx @@ -2,6 +2,7 @@ import type { FC } from 'react'; import { FormattedMessage } from 'react-intl'; +import type { AccountField } from '@/mastodon/components/account_header/fields'; import { Button } from '@/mastodon/components/button'; import { EmojiHTML } from '@/mastodon/components/emoji/html'; import { @@ -10,10 +11,9 @@ import { ModalShellBody, } from '@/mastodon/components/modal_shell'; -import type { AccountField } from '../common'; import { useFieldHtml } from '../hooks/useFieldHtml'; -import classes from './styles.module.css'; +import classes from './styles.module.scss'; export const AccountFieldModal: FC<{ onClose: () => void; @@ -28,6 +28,7 @@ export const AccountFieldModal: FC<{ as='h2' htmlString={field.name_emojified} onElement={handleLabelElement} + className={classes.fieldName} /> state.accounts, + (_, accountId: string) => accountId, + (state) => state.server.getIn(['server', 'domain']) as string | undefined, + ], + (accounts, accountId, serverDomain) => { + const acct = accounts.getIn([accountId, 'acct']) as string | undefined; + if (!acct) { + return undefined; + } + + const domain = acct.split('@').at(1); + if (domain) { + return domain; + } + + return serverDomain; + }, +); + +export const AccountJoinModal: FC<{ + accountId: string; + onClose: () => void; +}> = ({ accountId, onClose }) => { + const intl = useIntl(); + const account = useAccount(accountId); + const currentId = useCurrentAccountId(); + const isMe = accountId === currentId; + + const createdAtStr = account?.created_at; + const anniversary = useMemo(() => { + if (!createdAtStr) { + return null; + } + const now = new Date(); + const createdAt = new Date(createdAtStr); + if ( + now.getMonth() === createdAt.getMonth() && + now.getDate() === createdAt.getDate() + ) { + return now.getFullYear() - createdAt.getFullYear(); + } + return null; + }, [createdAtStr]); + + const domain = useAppSelector((state) => selectServerName(state, accountId)); + + const dispatch = useAppDispatch(); + const handle = account?.acct; + const handleShare = useCallback(() => { + if (anniversary === null) { + return; + } + + let shareText = '#Fediversary'; + if (anniversary === 0) { + shareText = isMe ? '#firstday' : '#welcome'; + } + + if (!isMe && handle) { + shareText = `@${handle} ${shareText}`; + } + + dispatch(resetCompose()); + dispatch(focusCompose(`\n\n${shareText}`, true)); + dispatch(closeModal({ modalType: 'ACCOUNT_JOIN_DATE', ignoreFocus: true })); + }, [anniversary, handle, dispatch, isMe]); + + return ( + + + + +
    + } + isMe={isMe} + serverName={domain} + anniversary={anniversary} + /> +

    + +

    +
    + + + + +
    +
    + ); +}; + +const AccountJoinMessage: FC<{ + name: React.JSX.Element; + isMe: boolean; + serverName?: string; + anniversary: number | null; +}> = ({ name, isMe, serverName, anniversary }) => { + if (anniversary === 0) { + if (isMe) { + return ( + + ); + } + return ( + + ); + } + + if (isMe) { + if (anniversary !== null && anniversary > 0) { + return ( + + ); + } + return ( + + ); + } + + return ( + + ); +}; + +const AccountAnniversaryImage: FC<{ anniversary: number | null }> = ({ + anniversary, +}) => { + if (anniversary === null) { + return null; + } + + return ( +
    + +

    {anniversary || 1}

    + {anniversary === 0 && ( + + )} + {anniversary > 0 && ( + + )} +
    + ); +}; + +const AccountAnniversaryShare: FC<{ + anniversary: number | null; + onShare: () => void; + isMe: boolean; +}> = ({ anniversary, onShare, isMe }) => { + if (anniversary === null) { + return null; + } + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/modals/note_modal.tsx b/app/javascript/mastodon/features/account_timeline/modals/note_modal.tsx index d108a14fd695a4..b8875be037047d 100644 --- a/app/javascript/mastodon/features/account_timeline/modals/note_modal.tsx +++ b/app/javascript/mastodon/features/account_timeline/modals/note_modal.tsx @@ -13,7 +13,7 @@ import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import { ConfirmationModal } from '../../ui/components/confirmation_modals'; -import classes from './styles.module.css'; +import classes from './styles.module.scss'; const messages = defineMessages({ newTitle: { diff --git a/app/javascript/mastodon/features/account_timeline/modals/styles.module.css b/app/javascript/mastodon/features/account_timeline/modals/styles.module.css deleted file mode 100644 index 4740a42cb9fae6..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/modals/styles.module.css +++ /dev/null @@ -1,27 +0,0 @@ -.noteCallout { - margin-bottom: 16px; -} - -.noteInput { - min-height: 70px; - width: 100%; - padding: 8px; - border-radius: 8px; - box-sizing: border-box; - background: var(--color-bg-primary); - border: 1px solid var(--color-border-primary); - appearance: none; - resize: none; - margin-top: 4px; -} - -.noteInput:focus-visible { - outline: var(--outline-focus-default); - outline-offset: 2px; -} - -.fieldValue { - color: var(--color-text-primary); - font-weight: 600; - margin-top: 4px; -} diff --git a/app/javascript/mastodon/features/account_timeline/modals/styles.module.scss b/app/javascript/mastodon/features/account_timeline/modals/styles.module.scss new file mode 100644 index 00000000000000..67a4f43d44ee2d --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/modals/styles.module.scss @@ -0,0 +1,108 @@ +@use '@/styles/mastodon/variables' as *; + +.noteCallout { + margin-bottom: 16px; +} + +.noteInput { + min-height: 70px; + width: 100%; + padding: 8px; + border-radius: 8px; + box-sizing: border-box; + background: var(--color-bg-primary); + border: 1px solid var(--color-border-primary); + appearance: none; + resize: none; + margin-top: 4px; +} + +.noteInput:focus-visible { + outline: var(--outline-focus-default); + outline-offset: 2px; +} + +.fieldName, +.fieldValue { + word-break: break-all; +} + +.fieldValue { + color: var(--color-text-primary); + font-weight: 600; + margin-top: 4px; +} + +@media screen and (min-width: ($mobile-breakpoint + 1)) { + .joinShell { + > :global(.safety-action-modal__top) { + border-bottom-left-radius: 16px; + border-bottom-right-radius: 16px; + border-bottom-width: 1px; + } + } +} + +.joinWrapper { + display: flex; + flex-direction: column; + color: var(--color-text-primary); + align-items: center; + justify-content: center; + position: relative; + min-height: 120px; + gap: 16px; + + p, + h1 { + text-align: center; + } + + p { + font-size: 13px; + } + + h1 { + margin-top: 8px; + margin-bottom: 0; + font-size: 17px; + font-weight: 600; + } +} + +.joinBanner { + width: 120px; + height: 110px; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + svg { + width: 100%; + position: absolute; + top: 0; + left: 0; + } + + h2 { + font-size: 40px; + font-weight: 600; + line-height: 40px; + margin-top: 8px; + } + + h3 { + font-size: 13px; + color: var(--color-text-secondary); + text-transform: uppercase; + } +} + +.joinClose { + position: absolute; + top: 0; + right: 0; + z-index: 1; +} diff --git a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss b/app/javascript/mastodon/features/account_timeline/styles.module.scss similarity index 91% rename from app/javascript/mastodon/features/account_timeline/v2/styles.module.scss rename to app/javascript/mastodon/features/account_timeline/styles.module.scss index 1df19feb1d5fc5..cd5cef3f29d966 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss +++ b/app/javascript/mastodon/features/account_timeline/styles.module.scss @@ -1,5 +1,5 @@ .filtersWrapper { - padding: 16px 24px 8px; + padding: 16px 16px 8px; } .filterSelectButton { @@ -51,7 +51,7 @@ .tagsWrapper, .tagSuggestions { - margin: 0 24px 8px; + margin: 0 16px 8px; } .tagsWrapper { @@ -67,6 +67,10 @@ flex-wrap: nowrap; overflow: hidden; position: relative; + + > button { + flex-shrink: 0; + } } .tagsListShowAll { @@ -76,11 +80,6 @@ } .statusWrapper { - :global(.status) { - padding-left: 24px; - padding-right: 24px; - } - &:has(.pinnedViewAllButton) :global(.status):has(.pinnedStatusHeader) { border-bottom: none; } @@ -97,7 +96,7 @@ box-sizing: border-box; color: var(--color-text-primary); line-height: normal; - margin: 12px 24px; + margin: 12px 16px; padding: 8px; transition: border-color 0.2s ease-in-out; width: calc(100% - 48px); @@ -123,8 +122,8 @@ > :global(.status__display-name) { grid-row: span 2; } +} - > :global(.account-role) { - justify-self: end; - } +.pinnedBadge { + justify-self: end; } diff --git a/app/javascript/mastodon/features/account_timeline/v2/status_header.tsx b/app/javascript/mastodon/features/account_timeline/v2/status_header.tsx deleted file mode 100644 index 5f0ff886857866..00000000000000 --- a/app/javascript/mastodon/features/account_timeline/v2/status_header.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { FC } from 'react'; - -import { Link } from 'react-router-dom'; - -import { RelativeTimestamp } from '@/mastodon/components/relative_timestamp'; -import type { StatusHeaderProps } from '@/mastodon/components/status/header'; -import { - StatusDisplayName, - StatusEditedAt, - StatusVisibility, -} from '@/mastodon/components/status/header'; -import type { Account } from '@/mastodon/models/account'; - -export const AccountStatusHeader: FC = ({ - status, - account, - children, - avatarSize = 48, - wrapperProps, - onHeaderClick, -}) => { - const statusAccount = status.get('account') as Account | undefined; - const editedAt = status.get('edited_at') as string; - - return ( - /* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ -
    - - - - {editedAt && } - - - - - {children} -
    - ); -}; diff --git a/app/javascript/mastodon/features/alt_text_modal/components/info_button.tsx b/app/javascript/mastodon/features/alt_text_modal/components/info_button.tsx index aecf9cbc2f5208..04c4ff8c568e2c 100644 --- a/app/javascript/mastodon/features/alt_text_modal/components/info_button.tsx +++ b/app/javascript/mastodon/features/alt_text_modal/components/info_button.tsx @@ -59,6 +59,7 @@ export const InfoButton: React.FC = () => { >
    -
    -
    - - -
    - -
    -
    -
    + + } + id='antenna_title' + type='text' + value={title} + onChange={handleTitleChange} + maxLength={30} + required + placeholder=' ' + />
    -
    -
    - - -
    - -
    -
    -
    + + } + value={mode} + onChange={handleModeChange} + id='antenna_insert_list' + > + + {(msg) => } + + + {(msg) => } + + + {(msg) => } + +
    -
    -
    - - -
    - -
    -
    -
    + + } + value={destination} + onChange={handleDestinationChange} + id='antenna_insert_destination' + > + + {(msg) => } + + + {(msg) => } + + + {(msg) => } + +
    {destination === 'list' && (
    -
    -
    - - -
    - -
    -
    -
    + + } + value={listId} + onChange={handleListIdChange} + id='antenna_insert_list' + > + {lists.map((list) => ( + + ))} +
    )} diff --git a/app/javascript/mastodon/features/blocks/index.jsx b/app/javascript/mastodon/features/blocks/index.jsx index 2bb3bc14621ecf..53a20c76ddc945 100644 --- a/app/javascript/mastodon/features/blocks/index.jsx +++ b/app/javascript/mastodon/features/blocks/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; @@ -8,6 +8,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; +import { injectIntl } from '@/mastodon/components/intl'; import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; import { Account } from 'mastodon/components/account'; diff --git a/app/javascript/mastodon/features/bookmark_categories/new.tsx b/app/javascript/mastodon/features/bookmark_categories/new.tsx index 7d2785a07585b1..620ba2e64b41a5 100644 --- a/app/javascript/mastodon/features/bookmark_categories/new.tsx +++ b/app/javascript/mastodon/features/bookmark_categories/new.tsx @@ -16,6 +16,7 @@ import { } from 'mastodon/actions/bookmark_categories_typed'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; +import { TextInputField } from 'mastodon/components/form_fields'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -88,28 +89,21 @@ const NewBookmarkCategory: React.FC<{ return (
    -
    -
    - - -
    - -
    -
    -
    + + } + id='bookmark_category_title' + type='text' + value={title} + onChange={handleTitleChange} + maxLength={30} + required + placeholder=' ' + />
    diff --git a/app/javascript/mastodon/features/circles/members.tsx b/app/javascript/mastodon/features/circles/members.tsx index 34aec8429f3fd9..9c632de0f5bf96 100644 --- a/app/javascript/mastodon/features/circles/members.tsx +++ b/app/javascript/mastodon/features/circles/members.tsx @@ -22,6 +22,7 @@ import { } from 'mastodon/api/circles'; import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; import { Avatar } from 'mastodon/components/avatar'; +import { VerifiedBadge } from 'mastodon/components/badge'; import { Button } from 'mastodon/components/button'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; @@ -30,7 +31,6 @@ import { DisplayName } from 'mastodon/components/display_name'; import { Icon } from 'mastodon/components/icon'; import ScrollableList from 'mastodon/components/scrollable_list'; import { ShortNumber } from 'mastodon/components/short_number'; -import { VerifiedBadge } from 'mastodon/components/verified_badge'; import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; import { me } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; diff --git a/app/javascript/mastodon/features/circles/new.tsx b/app/javascript/mastodon/features/circles/new.tsx index 8956d0f2652b9f..756ceb726b96a1 100644 --- a/app/javascript/mastodon/features/circles/new.tsx +++ b/app/javascript/mastodon/features/circles/new.tsx @@ -14,6 +14,7 @@ import { createCircle, updateCircle } from 'mastodon/actions/circles_typed'; import { apiGetAccounts } from 'mastodon/api/circles'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; +import { TextInputField } from 'mastodon/components/form_fields'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -123,28 +124,21 @@ const NewCircle: React.FC<{ return (
    -
    -
    - - -
    - -
    -
    -
    + + } + id='circle_title' + type='text' + value={title} + onChange={handleTitleChange} + maxLength={30} + required + placeholder=' ' + />
    {id && ( diff --git a/app/javascript/mastodon/features/collections/components/collection_list_item.module.scss b/app/javascript/mastodon/features/collections/components/collection_list_item.module.scss new file mode 100644 index 00000000000000..1079d1aebf0a7f --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_list_item.module.scss @@ -0,0 +1,20 @@ +.wrapper { + --list-item-padding: 16px; + --list-item-gap: 16px; + + &:not(.wrapperWithoutBorder) { + border-bottom: 1px solid var(--color-border-primary); + } +} + +.menuButton { + align-self: start; + padding: 4px; + margin-top: -4px; + margin-inline-end: -4px; + + svg { + width: 20px; + height: 20px; + } +} diff --git a/app/javascript/mastodon/features/collections/components/collection_list_item.tsx b/app/javascript/mastodon/features/collections/components/collection_list_item.tsx new file mode 100644 index 00000000000000..8169544cb866ea --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_list_item.tsx @@ -0,0 +1,59 @@ +import { useId } from 'react'; + +import classNames from 'classnames'; + +import { Article } from 'mastodon/components/scrollable_list/components'; +import type { CollectionLockupProps } from 'mastodon/features/collections/components/collection_lockup'; +import { CollectionLockup } from 'mastodon/features/collections/components/collection_lockup'; +import { CollectionMenu } from 'mastodon/features/collections/components/collection_menu'; + +import classes from './collection_list_item.module.scss'; + +interface CollectionListItemProps extends Omit< + CollectionLockupProps, + 'sideContent' +> { + withoutBorder?: boolean; + positionInList: number; + listSize: number; +} + +export const CollectionListItem: React.FC = ({ + collection, + withoutBorder, + positionInList, + listSize, + className, + ...otherProps +}) => { + const uniqueId = useId(); + const linkId = `${uniqueId}-link`; + const infoId = `${uniqueId}-info`; + + return ( +
    + + } + {...otherProps} + /> +
    + ); +}; diff --git a/app/javascript/mastodon/features/collections/components/collection_lockup.module.scss b/app/javascript/mastodon/features/collections/components/collection_lockup.module.scss new file mode 100644 index 00000000000000..cdd5b18368561d --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_lockup.module.scss @@ -0,0 +1,32 @@ +.wrapper { + --list-item-padding: 0px; +} + +.avatarGrid { + position: relative; + display: grid; + grid-template-columns: repeat(2, min-content); + gap: 2px; + + &.avatarGridSensitive { + .avatar { + filter: blur(4px); + } + } +} + +.avatar { + background: var(--color-bg-brand-softest); +} + +.avatarSensitiveBadge { + position: absolute; + inset: 0; + margin: auto; + padding: 3px; + width: 18px; + height: 18px; + border-radius: 8px; + fill: var(--color-text-primary); + background: var(--color-bg-warning-softest); +} diff --git a/app/javascript/mastodon/features/collections/components/collection_lockup.tsx b/app/javascript/mastodon/features/collections/components/collection_lockup.tsx new file mode 100644 index 00000000000000..22c584559f6166 --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_lockup.tsx @@ -0,0 +1,122 @@ +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import { ListItemLink, ListItemWrapper } from '@/mastodon/components/list_item'; +import WarningIcon from '@/material-icons/400-24px/warning.svg?react'; +import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; +import { AvatarById } from 'mastodon/components/avatar'; +import { useAccountHandle } from 'mastodon/components/display_name/default'; +import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; +import { useAccount } from 'mastodon/hooks/useAccount'; +import { domain } from 'mastodon/initial_state'; + +import { getCollectionPath } from '../utils'; + +import classes from './collection_lockup.module.scss'; + +export const AvatarGrid: React.FC<{ + accountIds: (string | undefined)[]; + sensitive?: boolean; +}> = ({ accountIds: ids, sensitive }) => { + const avatarIds = [ids[0], ids[1], ids[2], ids[3]]; + return ( +
    + {avatarIds.map((id, index) => ( + + ))} + {sensitive && } +
    + ); +}; + +export interface CollectionLockupProps { + collection: ApiCollectionJSON; + withAuthorHandle?: boolean; + withTimestamp?: boolean; + sideContent?: React.ReactNode; + className?: string; +} + +export const CollectionLockup: React.FC = ({ + collection, + withAuthorHandle = true, + withTimestamp, + sideContent, + className, +}) => { + const { id, name } = collection; + const authorAccount = useAccount(collection.account_id); + const authorHandle = useAccountHandle(authorAccount, domain); + + const collectionInfo = ( +
      + {collection.sensitive && ( +
    • + +
    • + )} + {withAuthorHandle && authorAccount && ( + + )} + + {withTimestamp && ( + , + }} + tagName='li' + /> + )} +
    + ); + + return ( + item.account_id)} + sensitive={collection.sensitive} + /> + } + sideContent={sideContent} + > + + {name} + + + ); +}; diff --git a/app/javascript/mastodon/features/collections/detail/collection_menu.tsx b/app/javascript/mastodon/features/collections/components/collection_menu.tsx similarity index 61% rename from app/javascript/mastodon/features/collections/detail/collection_menu.tsx rename to app/javascript/mastodon/features/collections/components/collection_menu.tsx index 90c6315cbbc7d3..f5cc518fb8a308 100644 --- a/app/javascript/mastodon/features/collections/detail/collection_menu.tsx +++ b/app/javascript/mastodon/features/collections/components/collection_menu.tsx @@ -2,8 +2,8 @@ import { useCallback, useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import { matchPath } from 'react-router'; - +import { showAlert } from '@/mastodon/actions/alerts'; +import { initBlockModal } from '@/mastodon/actions/blocks'; import { useAccount } from '@/mastodon/hooks/useAccount'; import MoreVertIcon from '@/material-icons/400-24px/more_vert.svg?react'; import { openModal } from 'mastodon/actions/modal'; @@ -15,15 +15,24 @@ import type { MenuItem } from 'mastodon/models/dropdown_menu'; import { useAppDispatch } from 'mastodon/store'; import { messages as editorMessages } from '../editor'; +import { getCollectionPath } from '../utils'; const messages = defineMessages({ view: { id: 'collections.view_collection', defaultMessage: 'View collection', }, - viewOtherCollections: { - id: 'collections.view_other_collections_by_user', - defaultMessage: 'View other collections by this user', + share: { + id: 'collections.share_short', + defaultMessage: 'Share', + }, + copyLink: { + id: 'collections.copy_link', + defaultMessage: 'Copy link', + }, + copyLinkConfirmation: { + id: 'collections.copy_link_confirmation', + defaultMessage: 'Copied collection link to clipboard', }, delete: { id: 'collections.delete_collection', @@ -33,6 +42,10 @@ const messages = defineMessages({ id: 'collections.report_collection', defaultMessage: 'Report this collection', }, + blockOwner: { + id: 'collections.block_collection_owner', + defaultMessage: 'Block account', + }, revoke: { id: 'collections.revoke_collection_inclusion', defaultMessage: 'Remove myself from this collection', @@ -42,15 +55,29 @@ const messages = defineMessages({ export const CollectionMenu: React.FC<{ collection: ApiCollectionJSON; - context: 'list' | 'collection'; + context: 'list' | 'notifications' | 'collection'; className?: string; }> = ({ collection, context, className }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const { id, name, account_id } = collection; - const isOwnCollection = account_id === me; + const { id, name, account_id, items } = collection; const ownerAccount = useAccount(account_id); + const isOwnCollection = account_id === me; + const currentAccountInCollection = items.find( + (item) => item.account_id === me, + ); + + const openShareModal = useCallback(() => { + dispatch( + openModal({ + modalType: 'SHARE_COLLECTION', + modalProps: { + collection, + }, + }), + ); + }, [collection, dispatch]); const openDeleteConfirmation = useCallback(() => { dispatch( @@ -75,9 +102,9 @@ export const CollectionMenu: React.FC<{ ); }, [collection, dispatch]); - const currentAccountInCollection = collection.items.find( - (item) => item.account_id === me, - ); + const openBlockModal = useCallback(() => { + dispatch(initBlockModal(ownerAccount)); + }, [ownerAccount, dispatch]); const openRevokeConfirmation = useCallback(() => { void dispatch( @@ -92,8 +119,28 @@ export const CollectionMenu: React.FC<{ }, [collection.id, currentAccountInCollection?.id, dispatch]); const menu = useMemo(() => { + const viewCollectionItem: MenuItem = { + text: intl.formatMessage(messages.view), + to: getCollectionPath(id), + }; + const shareItems: MenuItem[] = [ + { + text: intl.formatMessage(messages.share), + action: openShareModal, + }, + { + text: intl.formatMessage(messages.copyLink), + action: () => { + void navigator.clipboard.writeText(getCollectionPath(id)); + dispatch(showAlert({ message: messages.copyLinkConfirmation })); + }, + }, + ]; + if (isOwnCollection) { - const commonItems: MenuItem[] = [ + const ownerItems: MenuItem[] = [ + ...shareItems, + null, { text: intl.formatMessage(editorMessages.manageAccounts), to: `/collections/${id}/edit`, @@ -111,62 +158,51 @@ export const CollectionMenu: React.FC<{ ]; if (context === 'list') { - return [ - { text: intl.formatMessage(messages.view), to: `/collections/${id}` }, - null, - ...commonItems, - ]; + return [viewCollectionItem, ...ownerItems]; } else { - return commonItems; + return ownerItems; } } else { - const items: MenuItem[] = []; - - if (ownerAccount) { - const featuredCollectionsPath = `/@${ownerAccount.acct}/featured`; - // Don't show menu link to featured collections while on that very page - if ( - !matchPath(location.pathname, { - path: featuredCollectionsPath, - exact: true, - }) - ) { - items.push( - ...[ - { - text: intl.formatMessage(messages.viewOtherCollections), - to: featuredCollectionsPath, - }, - null, - ], - ); - } - } + const nonOwnerItems: MenuItem[] = [ + viewCollectionItem, + ...shareItems, + null, + ]; - if (currentAccountInCollection) { - items.push({ + // Collection notifications already have a prominent 'Remove me' button + if (currentAccountInCollection && context !== 'notifications') { + nonOwnerItems.push({ text: intl.formatMessage(messages.revoke), action: openRevokeConfirmation, }); } - items.push({ + nonOwnerItems.push({ text: intl.formatMessage(messages.report), action: openReportModal, }); - return items; + if (currentAccountInCollection) { + nonOwnerItems.push({ + text: intl.formatMessage(messages.blockOwner), + action: openBlockModal, + }); + } + + return nonOwnerItems; } }, [ - isOwnCollection, intl, id, + openShareModal, + isOwnCollection, + dispatch, openDeleteConfirmation, context, currentAccountInCollection, - openRevokeConfirmation, - ownerAccount, openReportModal, + openBlockModal, + openRevokeConfirmation, ]); return ( diff --git a/app/javascript/mastodon/features/collections/components/collection_preview_card.module.scss b/app/javascript/mastodon/features/collections/components/collection_preview_card.module.scss new file mode 100644 index 00000000000000..26eb44539e4305 --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_preview_card.module.scss @@ -0,0 +1,10 @@ +.wrapper { + --list-item-padding: 12px; + + border-radius: 12px; + border: 1px solid var(--color-border-primary); +} + +.removeButton { + align-self: start; +} diff --git a/app/javascript/mastodon/features/collections/components/collection_preview_card.tsx b/app/javascript/mastodon/features/collections/components/collection_preview_card.tsx new file mode 100644 index 00000000000000..83dc3e8a61e5c8 --- /dev/null +++ b/app/javascript/mastodon/features/collections/components/collection_preview_card.tsx @@ -0,0 +1,43 @@ +import { useIntl } from 'react-intl'; + +import classNames from 'classnames'; + +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import { IconButton } from 'mastodon/components/icon_button'; +import type { CollectionLockupProps } from 'mastodon/features/collections/components/collection_lockup'; +import { CollectionLockup } from 'mastodon/features/collections/components/collection_lockup'; + +import classes from './collection_preview_card.module.scss'; + +interface CollectionPreviewCardProps extends CollectionLockupProps { + onRemove?: () => void; +} + +export const CollectionPreviewCard: React.FC = ({ + collection, + onRemove, + ...otherProps +}) => { + const intl = useIntl(); + const removeButton = onRemove && ( + + ); + + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/collections/detail/share_modal.module.scss b/app/javascript/mastodon/features/collections/components/share_modal.module.scss similarity index 65% rename from app/javascript/mastodon/features/collections/detail/share_modal.module.scss rename to app/javascript/mastodon/features/collections/components/share_modal.module.scss index 2344ea519eb0ce..de10bb63c054de 100644 --- a/app/javascript/mastodon/features/collections/detail/share_modal.module.scss +++ b/app/javascript/mastodon/features/collections/components/share_modal.module.scss @@ -5,27 +5,7 @@ } .preview { - display: flex; - flex-wrap: wrap-reverse; - align-items: start; - justify-content: space-between; - gap: 8px; - padding: 16px; margin-bottom: 16px; - border-radius: 8px; - color: var(--color-text-primary); - background: linear-gradient( - 145deg, - var(--color-bg-brand-soft), - var(--color-bg-primary) - ); - border: 1px solid var(--color-bg-brand-base); -} - -.previewHeading { - font-size: 22px; - line-height: 1.3; - margin-bottom: 4px; } .actions { diff --git a/app/javascript/mastodon/features/collections/detail/share_modal.tsx b/app/javascript/mastodon/features/collections/components/share_modal.tsx similarity index 85% rename from app/javascript/mastodon/features/collections/detail/share_modal.tsx rename to app/javascript/mastodon/features/collections/components/share_modal.tsx index 26bab6abe00c88..0e2a412594bc09 100644 --- a/app/javascript/mastodon/features/collections/detail/share_modal.tsx +++ b/app/javascript/mastodon/features/collections/components/share_modal.tsx @@ -8,8 +8,6 @@ import { me } from '@/mastodon/initial_state'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { changeCompose, focusCompose } from 'mastodon/actions/compose'; import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; -import { AvatarById } from 'mastodon/components/avatar'; -import { AvatarGroup } from 'mastodon/components/avatar_group'; import { Button } from 'mastodon/components/button'; import { CopyLinkField } from 'mastodon/components/form_fields'; import { IconButton } from 'mastodon/components/icon_button'; @@ -20,7 +18,7 @@ import { } from 'mastodon/components/modal_shell'; import { useAppDispatch } from 'mastodon/store'; -import { AuthorNote } from '.'; +import { CollectionPreviewCard } from './collection_preview_card'; import classes from './share_modal.module.scss'; const messages = defineMessages({ @@ -95,24 +93,13 @@ export const CollectionShareModal: React.FC<{ />
    -
    -

    {collection.name}

    - -
    - - {collection.items.slice(0, 5).map(({ account_id }) => { - if (!account_id) return; - return ( - - ); - })} - +
    diff --git a/app/javascript/mastodon/features/collections/detail/accounts_list.tsx b/app/javascript/mastodon/features/collections/detail/accounts_list.tsx index e458dd27f06fcb..01718381c9ab77 100644 --- a/app/javascript/mastodon/features/collections/detail/accounts_list.tsx +++ b/app/javascript/mastodon/features/collections/detail/accounts_list.tsx @@ -1,25 +1,31 @@ -import { Fragment, useCallback, useRef, useState } from 'react'; +import { useCallback, useMemo, useRef, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { openModal } from 'mastodon/actions/modal'; +import { PendingBadge } from '@/mastodon/components/badge'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import type { ApiCollectionJSON, CollectionAccountItem, } from 'mastodon/api_types/collections'; -import { Account } from 'mastodon/components/account'; +import type { RenderButtonOptions } from 'mastodon/components/account_list_item'; +import { + AccountListItem, + AccountListItemFollowButton, +} from 'mastodon/components/account_list_item'; import { Button } from 'mastodon/components/button'; -import { DisplayName } from 'mastodon/components/display_name'; +import { Callout } from 'mastodon/components/callout'; import { Article, ItemList, } from 'mastodon/components/scrollable_list/components'; -import { useAccount } from 'mastodon/hooks/useAccount'; -import { useDismissible } from 'mastodon/hooks/useDismissible'; -import { useRelationship } from 'mastodon/hooks/useRelationship'; +import type { TruncatedListItemInfo } from 'mastodon/components/truncated_list'; +import { TruncatedListItems } from 'mastodon/components/truncated_list'; import { me } from 'mastodon/initial_state'; -import { useAppDispatch } from 'mastodon/store'; +import type { Account } from 'mastodon/models/account'; +import { createAppSelector, useAppSelector } from 'mastodon/store'; +import { useConfirmRevoke } from './revoke_collection_inclusion_modal'; import classes from './styles.module.scss'; const messages = defineMessages({ @@ -27,93 +33,8 @@ const messages = defineMessages({ id: 'collections.accounts.empty_title', defaultMessage: 'This collection is empty', }, - accounts: { - id: 'collections.detail.accounts_heading', - defaultMessage: 'Accounts', - }, }); -const SimpleAuthorName: React.FC<{ id: string }> = ({ id }) => { - const account = useAccount(id); - return ; -}; - -const AccountItem: React.FC<{ - accountId: string | undefined; - collectionOwnerId: string; - withBorder?: boolean; -}> = ({ accountId, withBorder = true, collectionOwnerId }) => { - const relationship = useRelationship(accountId); - - if (!accountId) { - return null; - } - - // When viewing your own collection, only show the Follow button - // for accounts you're not following (anymore). - // Otherwise, always show the follow button in its various states. - const withoutButton = - accountId === me || - !relationship || - (collectionOwnerId === me && - (relationship.following || relationship.requested)); - - return ( - - ); -}; - -const RevokeControls: React.FC<{ - collectionId: string; - collectionItem: CollectionAccountItem; -}> = ({ collectionId, collectionItem }) => { - const dispatch = useAppDispatch(); - - const confirmRevoke = useCallback(() => { - void dispatch( - openModal({ - modalType: 'REVOKE_COLLECTION_INCLUSION', - modalProps: { - collectionId, - collectionItemId: collectionItem.id, - }, - }), - ); - }, [collectionId, collectionItem.id, dispatch]); - - const { wasDismissed, dismiss } = useDismissible( - `collection-revoke-hint-${collectionItem.id}`, - ); - - if (wasDismissed) { - return null; - } - - return ( -
    - - -
    - ); -}; - const SensitiveScreen: React.FC<{ sensitive: boolean | undefined; focusTargetRef: React.RefObject; @@ -133,136 +54,180 @@ const SensitiveScreen: React.FC<{ } return ( -
    + + } + primaryLabel={ + + } + onPrimary={showAnyway} + className={classes.sensitiveScreen} + > - -
    + ); }; -/** - * Returns the collection's account items. If the current user's account - * is part of the collection, it will be returned separately. - */ -function getCollectionItems(collection: ApiCollectionJSON | undefined) { - if (!collection) - return { - currentUserInCollection: null, - items: [], - }; - - const { account_id, items } = collection; - - const isOwnCollection = account_id === me; - const currentUserIndex = items.findIndex( - (account) => account.account_id === me, - ); +type CollectionItemWithAccount = CollectionAccountItem & { + account?: Account | null; +}; - if (isOwnCollection || currentUserIndex === -1) { - return { - currentUserInCollection: null, - items, - }; - } else { - return { - currentUserInCollection: items.at(currentUserIndex) ?? null, - items: items.toSpliced(currentUserIndex, 1), - }; - } -} +const getCollectionItems = createAppSelector( + [ + (state) => state.accounts, + (state, collectionId?: string) => + state.collections.collections[collectionId ?? '']?.items, + ], + (accounts, collectionAccountItems) => + (collectionAccountItems ?? []).map( + (item): CollectionItemWithAccount => ({ + ...item, + account: item.account_id ? accounts.get(item.account_id) : null, + }), + ), +); export const CollectionAccountsList: React.FC<{ - collection?: ApiCollectionJSON; - isLoading: boolean; -}> = ({ collection, isLoading }) => { + collection: ApiCollectionJSON; +}> = ({ collection }) => { const intl = useIntl(); + const confirmRevoke = useConfirmRevoke(collection); const listHeadingRef = useRef(null); - const isOwnCollection = collection?.account_id === me; - const { items, currentUserInCollection } = getCollectionItems(collection); + const isOwnCollection = collection.account_id === me; + const { account_id: collectionOwnerId, id } = collection; - return ( - - {collection && currentUserInCollection ? ( - <> -

    - , - }} - tagName={Fragment} - /> -

    -
    - - -
    -

    + const relationships = useAppSelector((state) => state.relationships); + const collectionAccounts = useAppSelector((state) => + getCollectionItems(state, id), + ); + + const { visibleAccounts, hiddenAccounts } = useMemo(() => { + const visibleAccounts: CollectionItemWithAccount[] = []; + const hiddenAccounts: CollectionItemWithAccount[] = []; + + collectionAccounts.forEach((item) => { + const { account, account_id } = item; + + if (!isOwnCollection && !account) { + // Hide unavailable accounts unless you own this collection + return; + } + + const relationship = account_id ? relationships.get(account_id) : null; + if (relationship?.blocking || relationship?.muting) { + hiddenAccounts.push(item); + } else { + visibleAccounts.push(item); + } + }); + + return { visibleAccounts, hiddenAccounts }; + }, [collectionAccounts, isOwnCollection, relationships]); + + const renderAccountItemButton = useCallback( + ({ relationship, accountId }: RenderButtonOptions) => { + // When viewing your own collection, only show the Follow button + // for accounts you're not following anymore. + const withoutButton = + !relationship || + (collectionOwnerId === me && + (relationship.following || relationship.requested)); + + if (withoutButton) return null; + + if (accountId === me) { + return ( +

    - - ) : ( -

    - {intl.formatMessage(messages.accounts)} -

    - )} - {collection && ( - - {items.map(({ account_id }, index, items) => ( -
    - -
    - ))} -
    - )} -
    + + ); + } + + return ; + }, + [collectionOwnerId, confirmRevoke], + ); + + const renderListItem = useCallback( + ({ + item, + index, + totalListLength, + isLastElement, + }: TruncatedListItemInfo) => ( +
    + : null} + renderButton={renderAccountItemButton} + /> +
    + ), + [renderAccountItemButton], + ); + + return ( + <> +

    + +

    + + + + ), + subtitle: ( + + ), + }} + renderListItem={renderListItem} + /> + + + ); }; diff --git a/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss b/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss deleted file mode 100644 index 3c71e90f484fc0..00000000000000 --- a/app/javascript/mastodon/features/collections/detail/collection_list_item.module.scss +++ /dev/null @@ -1,54 +0,0 @@ -.wrapper { - display: flex; - align-items: center; - gap: 16px; - padding-inline: 16px; - - &:not(.wrapperWithoutBorder) { - border-bottom: 1px solid var(--color-border-primary); - } -} - -.content { - position: relative; - flex-grow: 1; - padding-block: 15px; -} - -.link { - display: block; - margin-bottom: 2px; - font-size: 15px; - font-weight: 500; - text-decoration: none; - color: var(--color-text-primary); - - &:hover { - color: var(--color-text-brand); - } - - &::after { - // Increase clickable area by extending link across parent - content: ''; - position: absolute; - inset: 0; - } -} - -.info { - font-size: 13px; - color: var(--color-text-secondary); -} - -.metaList { - --gap: 0.75ch; - - display: flex; - flex-wrap: wrap; - gap: var(--gap); - - & > li:not(:last-child)::after { - content: '·'; - margin-inline-start: var(--gap); - } -} diff --git a/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx b/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx deleted file mode 100644 index 73584a9e7b54c7..00000000000000 --- a/app/javascript/mastodon/features/collections/detail/collection_list_item.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useId } from 'react'; - -import { FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { Link } from 'react-router-dom'; - -import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; -import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; -import { Article } from 'mastodon/components/scrollable_list/components'; - -import classes from './collection_list_item.module.scss'; -import { CollectionMenu } from './collection_menu'; - -export const CollectionMetaData: React.FC<{ - collection: ApiCollectionJSON; - extended?: boolean; - className?: string; -}> = ({ collection, extended, className }) => { - return ( -
      - - {extended && ( - <> - {collection.discoverable ? ( - - ) : ( - - )} - {collection.sensitive && ( - - )} - - )} - , - }} - tagName='li' - /> -
    - ); -}; - -export const CollectionListItem: React.FC<{ - collection: ApiCollectionJSON; - withoutBorder?: boolean; - positionInList: number; - listSize: number; -}> = ({ collection, withoutBorder, positionInList, listSize }) => { - const { id, name } = collection; - const linkId = useId(); - - return ( -
    -
    -

    - - {name} - -

    - -
    - - -
    - ); -}; diff --git a/app/javascript/mastodon/features/collections/detail/index.tsx b/app/javascript/mastodon/features/collections/detail/index.tsx index 8db00e73d34813..12701d1fd42f96 100644 --- a/app/javascript/mastodon/features/collections/detail/index.tsx +++ b/app/javascript/mastodon/features/collections/detail/index.tsx @@ -4,29 +4,36 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; import { useHistory, useLocation, useParams } from 'react-router'; +import { Link } from 'react-router-dom'; -import { openModal } from '@/mastodon/actions/modal'; +import HelpIcon from '@/material-icons/400-24px/help.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import ShareIcon from '@/material-icons/400-24px/share.svg?react'; -import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; -import { Avatar } from 'mastodon/components/avatar'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; +import { openModal } from 'mastodon/actions/modal'; +import type { + ApiCollectionJSON, + CollectionAccountItem, +} from 'mastodon/api_types/collections'; +import { Badge } from 'mastodon/components/badge'; +import { Callout } from 'mastodon/components/callout'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; -import { - DisplayName, - LinkedDisplayName, -} from 'mastodon/components/display_name'; +import { DisplayName } from 'mastodon/components/display_name'; +import { useAccountHandle } from 'mastodon/components/display_name/default'; +import { FormattedDateWrapper } from 'mastodon/components/formatted_date'; import { IconButton } from 'mastodon/components/icon_button'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { Scrollable } from 'mastodon/components/scrollable_list/components'; -import { Tag } from 'mastodon/components/tags/tag'; import { useAccount } from 'mastodon/hooks/useAccount'; -import { me } from 'mastodon/initial_state'; +import { domain, me } from 'mastodon/initial_state'; import { fetchCollection } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; +import { CollectionMenu } from '../components/collection_menu'; + import { CollectionAccountsList } from './accounts_list'; -import { CollectionMetaData } from './collection_list_item'; -import { CollectionMenu } from './collection_menu'; +import { useConfirmRevoke } from './revoke_collection_inclusion_modal'; import classes from './styles.module.scss'; const messages = defineMessages({ @@ -40,41 +47,93 @@ const messages = defineMessages({ }, }); -export const AuthorNote: React.FC<{ id: string; previewMode?: boolean }> = ({ - id, - // When previewMode is enabled, your own display name - // will not be replaced with "you" - previewMode = false, -}) => { +export const AuthorNote: React.FC<{ id: string }> = ({ id }) => { const account = useAccount(id); + const authorHandle = useAccountHandle(account, domain); + + if (!account) { + return null; + } + const author = ( - - - {previewMode ? ( - - ) : ( - - )} - + + {authorHandle} + + ); + + return ( +

    + +

    ); +}; - const displayAsYou = id === me && !previewMode; +const RevokeControls: React.FC<{ + currentUserCollectionItem: CollectionAccountItem; + collection: ApiCollectionJSON; +}> = ({ currentUserCollectionItem, collection }) => { + const authorAccount = useAccount(collection.account_id); + const confirmRevoke = useConfirmRevoke(collection); return ( -

    - {displayAsYou ? ( + - ) : ( + } + primaryLabel={ - )} -

    + } + onPrimary={confirmRevoke} + > + , + date: ( + + ), + }} + /> + + ); +}; + +export const PendingNote: React.FC = () => { + return ( + + } + > + + ); }; @@ -82,11 +141,18 @@ const CollectionHeader: React.FC<{ collection: ApiCollectionJSON }> = ({ collection, }) => { const intl = useIntl(); - const { name, description, tag, account_id } = collection; + const { name, description, tag, account_id, items } = collection; const dispatch = useAppDispatch(); const history = useHistory(); - const handleShare = useCallback(() => { + const isOwnCollection = account_id === me; + const currentUserCollectionItem = items.find( + (account) => account.account_id === me, + ); + const isCurrentUserInCollection = + !isOwnCollection && !!currentUserCollectionItem; + + const openShareModal = useCallback(() => { dispatch( openModal({ modalType: 'SHARE_COLLECTION', @@ -103,19 +169,19 @@ const CollectionHeader: React.FC<{ collection: ApiCollectionJSON }> = ({ if (isNewCollection) { // Replace with current pathname to clear `newCollection` state history.replace(location.pathname); - handleShare(); + openShareModal(); } - }, [history, handleShare, isNewCollection, location.pathname]); + }, [history, openShareModal, isNewCollection, location.pathname]); + + const hasPendingAccounts = items.some((item) => item.state === 'pending'); return ( -
    +
    - {tag && ( - // TODO: Make non-interactive tag component - - )} + {tag && }

    {name}

    +
    = ({ icon='share-icon' title={intl.formatMessage(messages.share)} className={classes.iconButton} - onClick={handleShare} + onClick={openShareModal} /> = ({
    {description &&

    {description}

    } - - -
    + {hasPendingAccounts && } + {isCurrentUserInCollection && ( + + )} + ); }; @@ -152,7 +219,6 @@ export const CollectionDetailPage: React.FC<{ const collection = useAppSelector((state) => id ? state.collections.collections[id] : undefined, ); - const isLoading = !!id && !collection; useEffect(() => { if (id) { @@ -173,8 +239,14 @@ export const CollectionDetailPage: React.FC<{ /> - {collection && } - + {collection ? ( + <> + + + + ) : ( + + )} diff --git a/app/javascript/mastodon/features/collections/detail/revoke_collection_inclusion_modal.tsx b/app/javascript/mastodon/features/collections/detail/revoke_collection_inclusion_modal.tsx index c2c2bafe9dd2a5..489a35f3aee062 100644 --- a/app/javascript/mastodon/features/collections/detail/revoke_collection_inclusion_modal.tsx +++ b/app/javascript/mastodon/features/collections/detail/revoke_collection_inclusion_modal.tsx @@ -3,8 +3,11 @@ import { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { showAlert } from 'mastodon/actions/alerts'; +import { openModal } from 'mastodon/actions/modal'; +import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; import type { BaseConfirmationModalProps } from 'mastodon/features/ui/components/confirmation_modals/confirmation_modal'; import { ConfirmationModal } from 'mastodon/features/ui/components/confirmation_modals/confirmation_modal'; +import { me } from 'mastodon/initial_state'; import { revokeCollectionInclusion } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -24,6 +27,24 @@ const messages = defineMessages({ }, }); +export function useConfirmRevoke(collection?: ApiCollectionJSON | null) { + const dispatch = useAppDispatch(); + const { id, items = [] } = collection ?? {}; + const ownCollectionItemId = items.find((item) => item.account_id === me)?.id; + + return useCallback(() => { + void dispatch( + openModal({ + modalType: 'REVOKE_COLLECTION_INCLUSION', + modalProps: { + collectionId: id, + collectionItemId: ownCollectionItemId, + }, + }), + ); + }, [dispatch, id, ownCollectionItemId]); +} + export const RevokeCollectionInclusionModal: React.FC< { collectionId: string; diff --git a/app/javascript/mastodon/features/collections/detail/styles.module.scss b/app/javascript/mastodon/features/collections/detail/styles.module.scss index 786c0e7000b98e..da972334ff1b89 100644 --- a/app/javascript/mastodon/features/collections/detail/styles.module.scss +++ b/app/javascript/mastodon/features/collections/detail/styles.module.scss @@ -1,6 +1,9 @@ .header { + display: flex; + flex-direction: column; + gap: 12px; padding: 16px; - border-bottom: 1px solid var(--color-border-primary); + padding-bottom: 24px; } .titleWithMenu { @@ -11,23 +14,36 @@ .titleWrapper { flex-grow: 1; + display: flex; + flex-direction: column; + align-items: start; + gap: 4px; min-width: 0; } -.tag { - margin-bottom: 4px; - margin-inline-start: -8px; -} - .name { - font-size: 28px; + font-size: 22px; + font-weight: 500; line-height: 1.2; overflow-wrap: anywhere; } +.authorNote { + font-size: 13px; + color: var(--color-text-secondary); + + a { + color: inherit; + text-decoration-color: rgb(from var(--color-text-secondary) r g b / 50%); + + &:hover { + text-decoration: none; + } + } +} + .description { font-size: 15px; - margin-top: 8px; } .headerButtonWrapper { @@ -37,90 +53,22 @@ .iconButton { box-sizing: content-box; - padding: 5px; + padding: 7px; border-radius: 4px; border: 1px solid var(--color-border-primary); -} -.authorNote { - margin-top: 8px; - font-size: 13px; - color: var(--color-text-secondary); -} - -.previewAuthorNote { - font-size: 13px; + svg { + width: 20px; + height: 20px; + } } -.metaData { - margin-top: 16px; - font-size: 15px; +.sensitiveScreen { + margin: 16px; } .columnSubheading { - background: var(--color-bg-secondary); - padding: 15px 20px; + padding-inline: 16px; font-size: 15px; font-weight: 500; - - &:focus-visible { - outline: var(--outline-focus-default); - outline-offset: -2px; - } -} - -.displayNameWithAvatar { - display: inline-flex; - gap: 4px; - align-items: baseline; - - a { - color: inherit; - text-decoration: underline; - - &:hover, - &:focus { - text-decoration: none; - } - } - - > :global(.account__avatar) { - align-self: center; - } -} - -.sensitiveWarning { - display: flex; - flex-direction: column; - align-items: center; - max-width: 460px; - margin: auto; - padding: 60px 30px; - gap: 20px; - text-align: center; - text-wrap: balance; - font-size: 15px; - line-height: 1.5; - cursor: default; -} - -.revokeControlWrapper { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 10px; - margin-top: -10px; - padding-bottom: 16px; - padding-inline: calc(26px + var(--avatar-width)) 16px; - - :global(.button) { - min-width: 30%; - white-space: normal; - } - - --avatar-width: 46px; - - @container (width < 360px) { - --avatar-width: 35px; - } } diff --git a/app/javascript/mastodon/features/collections/editor/accounts.tsx b/app/javascript/mastodon/features/collections/editor/accounts.tsx index a6942193d07643..3643072f106446 100644 --- a/app/javascript/mastodon/features/collections/editor/accounts.tsx +++ b/app/javascript/mastodon/features/collections/editor/accounts.tsx @@ -4,22 +4,23 @@ import { FormattedMessage, useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; -import CancelIcon from '@/material-icons/400-24px/cancel.svg?react'; -import CheckIcon from '@/material-icons/400-24px/check.svg?react'; -import WarningIcon from '@/material-icons/400-24px/warning.svg?react'; -import { showAlertForError } from 'mastodon/actions/alerts'; -import { openModal } from 'mastodon/actions/modal'; -import { apiFollowAccount } from 'mastodon/api/accounts'; +import type { Map as ImmutableMap } from 'immutable'; + +import type { ApiMutedAccountJSON } from 'mastodon/api_types/accounts'; import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; -import { Account } from 'mastodon/components/account'; +import { AccountListItem } from 'mastodon/components/account_list_item'; import { Avatar } from 'mastodon/components/avatar'; -import { Badge } from 'mastodon/components/badge'; +import { PendingBadge } from 'mastodon/components/badge'; import { Button } from 'mastodon/components/button'; import { DisplayName } from 'mastodon/components/display_name'; +import { useAccountHandle } from 'mastodon/components/display_name/default'; import { EmptyState } from 'mastodon/components/empty_state'; -import { FormStack, Combobox } from 'mastodon/components/form_fields'; -import { Icon } from 'mastodon/components/icon'; -import { IconButton } from 'mastodon/components/icon_button'; +import { FormStack, ComboboxField } from 'mastodon/components/form_fields'; +import { useComboboxItemProps } from 'mastodon/components/form_fields/combobox_field'; +import { + ListItemContent, + ListItemWrapper, +} from 'mastodon/components/list_item'; import { Article, ItemList, @@ -27,108 +28,160 @@ import { } from 'mastodon/components/scrollable_list/components'; import { useAccount } from 'mastodon/hooks/useAccount'; import { useSearchAccounts } from 'mastodon/hooks/useSearchAccounts'; -import { me } from 'mastodon/initial_state'; +import { domain } from 'mastodon/initial_state'; +import type { Relationship } from 'mastodon/models/relationship'; import { addCollectionItem, - getCollectionItemIds, + getEditorCollectionItems, removeCollectionItem, updateCollectionEditorField, } from 'mastodon/reducers/slices/collections'; -import { store, useAppDispatch, useAppSelector } from 'mastodon/store'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +import { PendingNote } from '../detail'; import classes from './styles.module.scss'; -import { WizardStepHeader } from './wizard_step_header'; +import { WizardStepTitle } from './wizard_step_title'; const MAX_ACCOUNT_COUNT = 25; -function isOlderThanAWeek(date?: string): boolean { - if (!date) return false; - - const targetDate = new Date(date); - const sevenDaysAgo = new Date(); - sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); - return targetDate < sevenDaysAgo; -} - const AddedAccountItem: React.FC<{ accountId: string; + pending?: boolean; onRemove: (id: string) => void; -}> = ({ accountId, onRemove }) => { - const intl = useIntl(); - const account = useAccount(accountId); - +}> = ({ accountId, pending, onRemove }) => { const handleRemoveAccount = useCallback(() => { onRemove(accountId); }, [accountId, onRemove]); - const lastPostHint = useMemo( - () => - isOlderThanAWeek(account?.last_status_at) && ( - - } - icon={} - className={classes.accountBadge} + const renderButton = useCallback( + () => ( + + ), + [handleRemoveAccount], ); return ( - - - + } + renderButton={renderButton} + /> ); }; -interface SuggestionItem { - id: string; - isSelected: boolean; -} - -const SuggestedAccountItem: React.FC = ({ id, isSelected }) => { +const SuggestedAccountItem: React.FC<{ id: string }> = ({ id }) => { const account = useAccount(id); + const handle = useAccountHandle(account, domain); + const comboboxItemProps = useComboboxItemProps(); if (!account) return null; return ( - <> - - - {isSelected && ( - - )} - +
  • + }> + + + + +
  • ); }; -const renderAccountItem = (item: SuggestionItem) => ( - +const renderAccountItem = (account: ApiMutedAccountJSON) => ( + ); -const getItemId = (item: SuggestionItem) => item.id; -const getIsItemSelected = (item: SuggestionItem) => item.isSelected; +type GroupKey = 'available' | 'mustFollow' | 'disabled'; + +const canAccountBeAdded = (account: ApiMutedAccountJSON) => + ['automatic', 'manual'].includes(account.feature_approval.current_user); + +function groupSuggestions( + accounts: ApiMutedAccountJSON[], + relationships: ImmutableMap, +) { + const { available, mustFollow, disabled } = Object.groupBy( + accounts, + (account): GroupKey => { + if (canAccountBeAdded(account)) { + return 'available'; + } + + const canAccountBeAddedByFollowers = + account.feature_approval.automatic.includes('followers') || + account.feature_approval.manual.includes('followers'); + + if ( + canAccountBeAddedByFollowers && + !relationships.get(account.id)?.following + ) { + return 'mustFollow'; + } + + return 'disabled'; + }, + ); + + // Returning a new object ensures a fixed property order + return { available, mustFollow, disabled }; +} + +const renderGroupTitle = (groupKey: GroupKey, titleId: string) => { + if (groupKey === 'available') { + return null; + } + + let title: React.ReactElement; + let description: React.ReactElement; + + if (groupKey === 'mustFollow') { + title = ( + + ); + description = ( + + ); + } else { + title = ( + + ); + description = ( + + ); + } + + return ( +
  • + + + {title} + + +
  • + ); +}; + +const getItemId = (account: ApiMutedAccountJSON) => account.id; +const getIsItemDisabled = (account: ApiMutedAccountJSON) => + !canAccountBeAdded(account); export const CollectionAccounts: React.FC<{ collection?: ApiCollectionJSON | null; @@ -137,41 +190,45 @@ export const CollectionAccounts: React.FC<{ const dispatch = useAppDispatch(); const history = useHistory(); - const { id, items } = collection ?? {}; + const { id, items: collectionItems } = collection ?? {}; const isEditMode = !!id; - const collectionItems = items; - const addedAccountIds = useAppSelector( - (state) => state.collections.editor.accountIds, + const editorItemsFromState = useAppSelector( + (state) => state.collections.editor.items, ); - // In edit mode, we're bypassing state and just return collection items directly, - // since they're edited "live", saving after each addition/deletion - const accountIds = useMemo( + // In edit mode, we're bypassing our Redux state and just work on the + // collection items directly since they're edited "live", saving right + // after each addition/deletion + const editorItems = useMemo( () => - isEditMode ? getCollectionItemIds(collectionItems) : addedAccountIds, - [isEditMode, collectionItems, addedAccountIds], + isEditMode + ? getEditorCollectionItems(collectionItems) + : editorItemsFromState, + [isEditMode, collectionItems, editorItemsFromState], ); + const hasPendingItems = editorItems.some((item) => item.state === 'pending'); const [searchValue, setSearchValue] = useState(''); - const hasMaxAccounts = accountIds.length === MAX_ACCOUNT_COUNT; + const hasItems = editorItems.length > 0; + const hasMaxItems = editorItems.length === MAX_ACCOUNT_COUNT; const { - accountIds: suggestedAccountIds, + accounts: suggestedAccounts, isLoading: isLoadingSuggestions, searchAccounts, + resetAccounts, } = useSearchAccounts({ withRelationships: true, + // Don't suggest accounts that were already added filterResults: (account) => - // Only suggest accounts who allow being featured/recommended - account.feature_approval.current_user === 'automatic', + !editorItems.find((item) => item.account_id === account.id), }); - const suggestedItems = suggestedAccountIds.map((id) => ({ - id, - isSelected: accountIds.includes(id), - })); + const relationships = useAppSelector((state) => state.relationships); + + const groupedItems = groupSuggestions(suggestedAccounts, relationships); const handleSearchValueChange = useCallback( (e: React.ChangeEvent) => { @@ -190,78 +247,37 @@ export const CollectionAccounts: React.FC<{ [], ); - const relationships = useAppSelector((state) => state.relationships); - - const confirmFollowStatus = useCallback( - (accountId: string, onFollowing: () => void) => { - const relationship = relationships.get(accountId); - - if (!relationship) { - return; - } - - if ( - accountId === me || - relationship.following || - relationship.requested - ) { - onFollowing(); - } else { - dispatch( - openModal({ - modalType: 'CONFIRM_FOLLOW_TO_COLLECTION', - modalProps: { - accountId, - onConfirm: () => { - apiFollowAccount(accountId) - .then(onFollowing) - .catch((err: unknown) => { - store.dispatch(showAlertForError(err)); - }); - }, - }, - }), - ); - } - }, - [dispatch, relationships], - ); - const removeAccountItem = useCallback( (accountId: string) => { dispatch( updateCollectionEditorField({ - field: 'accountIds', - value: accountIds.filter((id) => id !== accountId), + field: 'items', + value: editorItems.filter((item) => item.account_id !== accountId), }), ); }, - [accountIds, dispatch], + [editorItems, dispatch], ); const addAccountItem = useCallback( - (accountId: string) => { - confirmFollowStatus(accountId, () => { - dispatch( - updateCollectionEditorField({ - field: 'accountIds', - value: [...accountIds, accountId], - }), - ); - }); - }, - [accountIds, confirmFollowStatus, dispatch], - ); - - const toggleAccountItem = useCallback( - (item: SuggestionItem) => { - if (accountIds.includes(item.id)) { - removeAccountItem(item.id); - } else { - addAccountItem(item.id); - } + (item: ApiMutedAccountJSON) => { + dispatch( + updateCollectionEditorField({ + field: 'items', + value: [ + ...editorItems, + { + account_id: item.id, + state: + item.feature_approval.current_user === 'manual' + ? 'pending' + : 'accepted', + }, + ], + }), + ); }, - [accountIds, addAccountItem, removeAccountItem], + [editorItems, dispatch], ); const instantRemoveAccountItem = useCallback( @@ -287,23 +303,14 @@ export const CollectionAccounts: React.FC<{ ); const instantAddAccountItem = useCallback( - (collectionId: string, accountId: string) => { - confirmFollowStatus(accountId, () => { - void dispatch(addCollectionItem({ collectionId, accountId })); - }); - }, - [confirmFollowStatus, dispatch], - ); - - const instantToggleAccountItem = useCallback( - (item: SuggestionItem) => { - if (accountIds.includes(item.id)) { - instantRemoveAccountItem(item.id); - } else if (id) { - instantAddAccountItem(id, item.id); + (item: ApiMutedAccountJSON) => { + if (id) { + void dispatch( + addCollectionItem({ collectionId: id, accountId: item.id }), + ); } }, - [accountIds, id, instantAddAccountItem, instantRemoveAccountItem], + [dispatch, id], ); const handleRemoveAccountItem = useCallback( @@ -317,131 +324,144 @@ export const CollectionAccounts: React.FC<{ [isEditMode, instantRemoveAccountItem, removeAccountItem], ); + const handleSelectItem = useCallback( + (item: ApiMutedAccountJSON) => { + if (isEditMode) { + instantAddAccountItem(item); + } else { + addAccountItem(item); + } + + setSearchValue(''); + resetAccounts(); + }, + [addAccountItem, instantAddAccountItem, isEditMode, resetAccounts], + ); + const handleSubmit = useCallback( (e: React.FormEvent) => { e.preventDefault(); if (!id) { - history.push(`/collections/new/details`, { - account_ids: accountIds, - }); + history.push('/collections/new/details'); } }, - [id, history, accountIds], + [id, history], ); const inputId = useId(); - const inputLabel = intl.formatMessage({ - id: 'collections.search_accounts_label', - defaultMessage: 'Search for accounts to add…', - }); + const AccountsHeadingElement = id ? 'h2' : 'h3'; return ( - {!id && ( - - } - description={ - +
    + {!id && ( + + } + /> + )} + {hasPendingItems && } + - )} - - - {hasMaxAccounts && ( - - )} - - - - } - message={ - - } +
    + +
    + {hasItems && ( + + - } - > - {accountIds.map((accountId, index) => ( -
    - + )} + + + + } + message={ + + } /> -
    - ))} - - + } + > + {editorItems.map(({ account_id, state }, index) => ( +
    + +
    + ))} + + +
    - {!isEditMode && ( + {!isEditMode && hasItems && (
    -
    - - {(text) =>
    {text}
    } -
    - -
    +
    )} diff --git a/app/javascript/mastodon/features/collections/editor/details.tsx b/app/javascript/mastodon/features/collections/editor/details.tsx index 73847a2b20912e..f90f4be5e1efbb 100644 --- a/app/javascript/mastodon/features/collections/editor/details.tsx +++ b/app/javascript/mastodon/features/collections/editor/details.tsx @@ -1,4 +1,4 @@ -import { Fragment, useCallback, useMemo, useState } from 'react'; +import { useCallback, useMemo } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; @@ -6,11 +6,13 @@ import { useHistory } from 'react-router-dom'; import { isFulfilled } from '@reduxjs/toolkit'; +import { ComboboxMenuItem } from '@/mastodon/components/form_fields/combobox_field'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; import { languages } from '@/mastodon/initial_state'; import { hasSpecialCharacters, inputToHashtag, - trimHashFromStart, } from '@/mastodon/utils/hashtags'; import type { ApiCreateCollectionPayload, @@ -36,13 +38,15 @@ import { } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; +import { getCollectionPath } from '../utils'; + import classes from './styles.module.scss'; -import { WizardStepHeader } from './wizard_step_header'; +import { WizardStepTitle } from './wizard_step_title'; export const CollectionDetails: React.FC = () => { const dispatch = useAppDispatch(); const history = useHistory(); - const { id, name, description, topic, discoverable, sensitive, accountIds } = + const { id, name, description, topic, discoverable, sensitive, items } = useAppSelector((state) => state.collections.editor); const handleNameChange = useCallback( @@ -93,6 +97,9 @@ export const CollectionDetails: React.FC = () => { [dispatch], ); + const accountId = useCurrentAccountId(); + const { acct: currentUserName } = useAccount(accountId) ?? {}; + const handleSubmit = useCallback( (e: React.FormEvent) => { e.preventDefault(); @@ -116,7 +123,7 @@ export const CollectionDetails: React.FC = () => { description, discoverable, sensitive, - account_ids: accountIds, + account_ids: items.map((item) => item.account_id), }; if (topic) { payload.tag_name = topic; @@ -128,8 +135,8 @@ export const CollectionDetails: React.FC = () => { }), ).then((result) => { if (isFulfilled(result)) { - history.replace(`/collections`); - history.push(`/collections/${result.payload.collection.id}`, { + history.replace(`/@${currentUserName}/collections`); + history.push(getCollectionPath(result.payload.collection.id), { newCollection: true, }); } @@ -145,7 +152,8 @@ export const CollectionDetails: React.FC = () => { sensitive, dispatch, history, - accountIds, + items, + currentUserName, ], ); @@ -153,7 +161,7 @@ export const CollectionDetails: React.FC = () => {
    {!id && ( - { /> {
    -
    - -
    +
    ); @@ -297,14 +303,7 @@ export const CollectionDetails: React.FC = () => { const TopicField: React.FC = () => { const intl = useIntl(); const dispatch = useAppDispatch(); - const { id, topic } = useAppSelector((state) => state.collections.editor); - - const collection = useAppSelector((state) => - id ? state.collections.collections[id] : undefined, - ); - const [isInitialValue, setIsInitialValue] = useState( - () => trimHashFromStart(topic) === (collection?.tag?.name ?? ''), - ); + const { topic } = useAppSelector((state) => state.collections.editor); const { tags, isLoading, searchTags } = useSearchTags({ query: topic, @@ -312,7 +311,6 @@ const TopicField: React.FC = () => { const handleTopicChange = useCallback( (event: React.ChangeEvent) => { - setIsInitialValue(false); dispatch( updateCollectionEditorField({ field: 'topic', @@ -341,6 +339,10 @@ const TopicField: React.FC = () => { [topic], ); + const isCurrentTopicOnlySuggestion = + tags.length === 1 && tags[0]?.id === 'new'; + const hideTagSuggestions = !tags.length || isCurrentTopicOnlySuggestion; + return ( { } : undefined } - suppressMenu={isInitialValue} + suppressMenu={hideTagSuggestions} /> ); }; -const renderTagItem = (item: TagSearchResult) => item.label ?? `#${item.name}`; +const renderTagItem = (item: TagSearchResult) => ( + {item.label ?? `#${item.name}`} +); const LanguageField: React.FC = () => { const dispatch = useAppDispatch(); @@ -422,7 +426,6 @@ const LanguageField: React.FC = () => { {languages?.map(([code, name, localName]) => ( diff --git a/app/javascript/mastodon/features/collections/editor/index.tsx b/app/javascript/mastodon/features/collections/editor/index.tsx index ff1549b9423db3..beb4719a3eb579 100644 --- a/app/javascript/mastodon/features/collections/editor/index.tsx +++ b/app/javascript/mastodon/features/collections/editor/index.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { defineMessages, useIntl } from 'react-intl'; +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; import { @@ -12,6 +12,9 @@ import { useLocation, } from 'react-router-dom'; +import { Callout } from '@/mastodon/components/callout'; +import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { initialState } from '@/mastodon/initial_state'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; @@ -22,8 +25,11 @@ import { } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; +import { useCollectionsCreatedBy } from '../overview/created_by_you'; + import { CollectionAccounts } from './accounts'; import { CollectionDetails } from './details'; +import classes from './styles.module.scss'; export const messages = defineMessages({ create: { @@ -44,7 +50,7 @@ export const messages = defineMessages({ }, }); -function usePageTitle(id: string | undefined) { +function usePageTitle(id: string | null) { const { path } = useRouteMatch(); const location = useLocation(); @@ -61,19 +67,33 @@ function usePageTitle(id: string | undefined) { } } +export const userCollectionLimit = initialState?.role?.collection_limit ?? 0; + export const CollectionEditorPage: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { const intl = useIntl(); const dispatch = useAppDispatch(); - const { id } = useParams<{ id?: string }>(); + const accountId = useCurrentAccountId(); + const { id = null } = useParams<{ id?: string }>(); const { path } = useRouteMatch(); const collection = useAppSelector((state) => id ? state.collections.collections[id] : undefined, ); const editorStateId = useAppSelector((state) => state.collections.editor.id); const isEditMode = !!id; - const isLoading = isEditMode && !collection; + + // When creating a new collection, we load the current account's collections + // to determine if they're allowed to create more. + const { collections: collectionList, status: collectionListStatus } = + useCollectionsCreatedBy(isEditMode ? null : accountId); + + const isLoading = + (isEditMode && !collection) || + (!isEditMode && collectionListStatus === 'loading'); + + const canCreateMoreCollections = + isEditMode || collectionList.length < userCollectionLimit; useEffect(() => { if (id) { @@ -108,7 +128,7 @@ export const CollectionEditorPage: React.FC<{
    {isLoading ? ( - ) : ( + ) : canCreateMoreCollections ? ( } /> + ) : ( + )}
    @@ -133,3 +155,23 @@ export const CollectionEditorPage: React.FC<{ ); }; + +export const MaxCollectionsCallout: React.FC<{ className?: string }> = ({ + className, +}) => ( + + } + > + + +); diff --git a/app/javascript/mastodon/features/collections/editor/styles.module.scss b/app/javascript/mastodon/features/collections/editor/styles.module.scss index 1991aa4211c079..d1111e746929c9 100644 --- a/app/javascript/mastodon/features/collections/editor/styles.module.scss +++ b/app/javascript/mastodon/features/collections/editor/styles.module.scss @@ -1,10 +1,17 @@ +.header { + display: flex; + flex-direction: column; + gap: 12px; +} + .step { font-size: 13px; color: var(--color-text-secondary); } .title { - font-size: 22px; + font-size: 17px; + font-weight: 500; line-height: 1.2; margin-top: 4px; } @@ -14,79 +21,63 @@ margin-top: 8px; } -/* Make form stretch full height of the column */ +.listHeading { + margin-bottom: 8px; + font-size: 15px; + font-weight: 500; + line-height: 1.2; +} + +/* Ensure sticky footer isn't covered by mobile bottom nav */ .form { --bottom-spacing: 0; - box-sizing: border-box; - display: flex; - flex-direction: column; - min-height: 100%; - padding-bottom: var(--bottom-spacing); + padding-bottom: 0; @media (width < 760px) { --bottom-spacing: var(--mobile-bottom-nav-height); } } -.selectedSuggestionIcon { - box-sizing: border-box; - width: 18px; - height: 18px; - margin-left: auto; - padding: 2px; - border-radius: 100%; - color: var(--color-text-on-brand-base); - background: var(--color-bg-brand-base); - - [data-highlighted='true'] & { - color: var(--color-bg-brand-base); - background: var(--color-text-on-brand-base); - } -} - -.formFieldStack { - flex-grow: 1; -} - -.scrollableWrapper, -.scrollableInner { - margin-inline: -8px; -} - -.submitDisabledCallout { - align-self: center; -} - .stickyFooter { position: sticky; bottom: var(--bottom-spacing); + margin-top: -16px; padding: 16px; background-image: linear-gradient( to bottom, transparent, - var(--color-bg-primary) 32px + var(--color-bg-primary) 24px ); } -.itemCountReadout { - text-align: center; +.formFieldStack { + gap: 16px; } -.actionWrapper { - display: flex; - flex-direction: column; - width: min-content; - min-width: 240px; - margin-inline: auto; - gap: 8px; +.scrollableWrapper { + margin-inline: -16px; } -.accountBadge { - margin-inline-start: 56px; +.suggestion { + cursor: pointer; + user-select: none; + border-bottom: 1px solid var(--color-border-primary); + + &[data-highlighted='true'] { + background: var(--color-bg-overlay-highlight); + } - @container (width < 360px) { - margin-top: 4px; - margin-inline-start: 46px; + &[aria-disabled='true'] { + opacity: 0.6; + cursor: not-allowed; } } + +.suggestionGroup { + padding-bottom: 4px; +} + +.maxCollectionsError { + margin: 16px; +} diff --git a/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx b/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx deleted file mode 100644 index 3bc9a4d7ef96a8..00000000000000 --- a/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FormattedMessage } from 'react-intl'; - -import classes from './styles.module.scss'; - -export const WizardStepHeader: React.FC<{ - step: number; - title: React.ReactElement; - description?: React.ReactElement; -}> = ({ step, title, description }) => { - return ( -
    - - {(content) =>

    {content}

    } -
    -

    {title}

    - {!!description &&

    {description}

    } -
    - ); -}; diff --git a/app/javascript/mastodon/features/collections/editor/wizard_step_title.tsx b/app/javascript/mastodon/features/collections/editor/wizard_step_title.tsx new file mode 100644 index 00000000000000..4d328521e7b0c1 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/wizard_step_title.tsx @@ -0,0 +1,21 @@ +import { FormattedMessage } from 'react-intl'; + +import classes from './styles.module.scss'; + +export const WizardStepTitle: React.FC<{ + step: number; + title: React.ReactElement; +}> = ({ step, title }) => { + return ( +
    +

    + +

    +

    {title}

    +
    + ); +}; diff --git a/app/javascript/mastodon/features/collections/index.tsx b/app/javascript/mastodon/features/collections/index.tsx index 9d9b5d06d86d79..0b1e6445f8aa98 100644 --- a/app/javascript/mastodon/features/collections/index.tsx +++ b/app/javascript/mastodon/features/collections/index.tsx @@ -1,108 +1,104 @@ -import { useEffect } from 'react'; - -import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, useIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; -import { Link } from 'react-router-dom'; +import { Route, Switch, useRouteMatch } from 'react-router-dom'; -import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import CollectionsFilledIcon from '@/material-icons/400-24px/category-fill.svg?react'; -import SquigglyArrow from '@/svg-icons/squiggly_arrow.svg?react'; +import { TabLink, TabList } from '@/mastodon/components/tab_list'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; -import { Icon } from 'mastodon/components/icon'; -import { - ItemList, - Scrollable, -} from 'mastodon/components/scrollable_list/components'; -import { - fetchAccountCollections, - selectAccountCollections, -} from 'mastodon/reducers/slices/collections'; -import { useAppSelector, useAppDispatch } from 'mastodon/store'; +import { DisplayNameSimple } from 'mastodon/components/display_name/simple'; +import { Scrollable } from 'mastodon/components/scrollable_list/components'; +import { useAccount } from 'mastodon/hooks/useAccount'; +import { useAccountId, useCurrentAccountId } from 'mastodon/hooks/useAccountId'; -import { CollectionListItem } from './detail/collection_list_item'; -import { messages as editorMessages } from './editor'; +import { CollectionsCreatedByYou } from './overview/created_by_you'; +import { CollectionsFeaturingYou } from './overview/featuring_you'; +import classes from './styles.module.scss'; const messages = defineMessages({ - heading: { id: 'column.collections', defaultMessage: 'My collections' }, + headingMe: { + id: 'column.your_collections', + defaultMessage: 'Your Collections', + }, + headingOther: { + id: 'column.other_collections', + defaultMessage: "{name}'s Collections", + }, + createdByYou: { + id: 'collections.list.created_by_you', + defaultMessage: 'Created by you', + }, + createdByAuthor: { + id: 'collections.list.created_by_author', + defaultMessage: 'Created by {name}', + }, + featuringYou: { + id: 'collections.list.featuring_you', + defaultMessage: 'Featuring you', + }, }); export const Collections: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { - const dispatch = useAppDispatch(); const intl = useIntl(); - const me = useAppSelector((state) => state.meta.get('me') as string); - const { collections, status } = useAppSelector((state) => - selectAccountCollections(state, me), - ); + const me = useCurrentAccountId(); + const accountId = useAccountId(); + const account = useAccount(accountId); + const { path } = useRouteMatch(); - useEffect(() => { - void dispatch(fetchAccountCollections({ accountId: me })); - }, [dispatch, me]); + const isOwnCollectionsPage = accountId === me; - const emptyMessage = - status === 'error' ? ( - - ) : ( - <> - - -
    - -
    + const titleMessage = isOwnCollectionsPage + ? messages.headingMe + : messages.headingOther; + + const pageTitle = intl.formatMessage(titleMessage, { + name: account?.get('display_name'), + }); + const pageTitleHtml = intl.formatMessage(titleMessage, { + name: , + }); - - - ); + const createdByTabMessage = isOwnCollectionsPage + ? messages.createdByYou + : messages.createdByAuthor; return ( - - - - - } - /> + + - - {collections.map((item, index) => ( - - ))} - +
    +

    {pageTitleHtml}

    + + + {intl.formatMessage(createdByTabMessage, { + name: , + })} + + {isOwnCollectionsPage && ( + + {intl.formatMessage(messages.featuringYou)} + + )} + +
    + + + +
    - {intl.formatMessage(messages.heading)} + {pageTitle}
    diff --git a/app/javascript/mastodon/features/collections/overview/created_by_you.tsx b/app/javascript/mastodon/features/collections/overview/created_by_you.tsx new file mode 100644 index 00000000000000..25b812e9bd9f0e --- /dev/null +++ b/app/javascript/mastodon/features/collections/overview/created_by_you.tsx @@ -0,0 +1,133 @@ +import { useEffect } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import { EmptyState } from 'mastodon/components/empty_state'; +import { Icon } from 'mastodon/components/icon'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { ItemList } from 'mastodon/components/scrollable_list/components'; +import { useAccountId, useCurrentAccountId } from 'mastodon/hooks/useAccountId'; +import { + fetchCollectionsCreatedByAccount, + selectAccountCollections, +} from 'mastodon/reducers/slices/collections'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { CollectionListItem } from '../components/collection_list_item'; +import { + messages as editorMessages, + MaxCollectionsCallout, + userCollectionLimit, +} from '../editor'; +import classes from '../styles.module.scss'; +import { areCollectionsEnabled } from '../utils'; + +const CreateButton: React.FC = () => ( + + + + +); + +export const CollectionListError: React.FC = () => ( + + } + /> +); + +export function useCollectionsCreatedBy(accountId: string | null | undefined) { + const dispatch = useAppDispatch(); + + useEffect(() => { + if (accountId && areCollectionsEnabled()) { + void dispatch(fetchCollectionsCreatedByAccount({ accountId })); + } + }, [dispatch, accountId]); + + return useAppSelector((state) => + selectAccountCollections(state, accountId, 'createdBy'), + ); +} + +export const CollectionsCreatedByYou: React.FC = () => { + const me = useCurrentAccountId(); + const accountId = useAccountId(); + + const { collections, status } = useCollectionsCreatedBy(accountId); + + const canCreateMoreCollections = collections.length < userCollectionLimit; + const isOwnCollectionPage = accountId === me; + const showCreateButton = + isOwnCollectionPage && status === 'idle' && canCreateMoreCollections; + + if (status === 'error' || !accountId) { + return ; + } + + if (status === 'loading') { + return ; + } + + if (collections.length === 0) { + return ( + + } + message={ + + } + > + + + ); + } + + return ( + <> +
    +

    + +

    + {showCreateButton && } +
    + + {!canCreateMoreCollections && ( + + )} + {collections.map((item, index) => ( + + ))} + + + ); +}; diff --git a/app/javascript/mastodon/features/collections/overview/featuring_you.tsx b/app/javascript/mastodon/features/collections/overview/featuring_you.tsx new file mode 100644 index 00000000000000..3fb93bbfc916f0 --- /dev/null +++ b/app/javascript/mastodon/features/collections/overview/featuring_you.tsx @@ -0,0 +1,87 @@ +import { useEffect } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { EmptyState } from 'mastodon/components/empty_state'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { ItemList } from 'mastodon/components/scrollable_list/components'; +import { useAccountId } from 'mastodon/hooks/useAccountId'; +import { + fetchCollectionsFeaturingAccount, + selectAccountCollections, +} from 'mastodon/reducers/slices/collections'; +import { useAppSelector, useAppDispatch } from 'mastodon/store'; + +import { CollectionListItem } from '../components/collection_list_item'; +import classes from '../styles.module.scss'; +import { areCollectionsEnabled } from '../utils'; + +import { CollectionListError } from './created_by_you'; + +function useCollectionsFeaturing(accountId: string | null | undefined) { + const dispatch = useAppDispatch(); + + useEffect(() => { + if (accountId && areCollectionsEnabled()) { + void dispatch(fetchCollectionsFeaturingAccount({ accountId })); + } + }, [dispatch, accountId]); + + return useAppSelector((state) => + selectAccountCollections(state, accountId, 'featuring'), + ); +} + +export const CollectionsFeaturingYou: React.FC = () => { + const accountId = useAccountId(); + + const { collections, status } = useCollectionsFeaturing(accountId); + + if (status === 'error' || !accountId) { + return ; + } + + if (status === 'loading') { + return ; + } + + if (collections.length === 0) { + return ( + + } + /> + ); + } + + return ( + <> +
    +

    + +

    +
    + + {collections.map((item, index) => ( + + ))} + + + ); +}; diff --git a/app/javascript/mastodon/features/collections/styles.module.scss b/app/javascript/mastodon/features/collections/styles.module.scss new file mode 100644 index 00000000000000..ed2ba13a09f295 --- /dev/null +++ b/app/javascript/mastodon/features/collections/styles.module.scss @@ -0,0 +1,39 @@ +.header { + display: flex; + flex-direction: column; + gap: 8px; + padding-top: 24px; + padding-inline: 16px; + border-bottom: 1px solid var(--color-border-primary); +} + +.heading { + font-size: 22px; + font-weight: 500; + line-height: 1.2; + overflow-wrap: break-word; +} + +.listHeader { + display: flex; + justify-content: space-between; + align-items: center; + min-height: 28px; + padding-top: 16px; + padding-inline: 16px; +} + +.subHeading { + font-size: 15px; + font-weight: 500; + line-height: 1.2; + overflow-wrap: break-word; +} + +.maxCollectionsError { + margin: 8px 16px; +} + +.error { + flex-grow: 1; +} diff --git a/app/javascript/mastodon/features/collections/utils.ts b/app/javascript/mastodon/features/collections/utils.ts index 616d0297a7441b..1905edfef1f0a3 100644 --- a/app/javascript/mastodon/features/collections/utils.ts +++ b/app/javascript/mastodon/features/collections/utils.ts @@ -1,11 +1,7 @@ -import { - isClientFeatureEnabled, - isServerFeatureEnabled, -} from '@/mastodon/utils/environment'; +import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; export function areCollectionsEnabled() { - return ( - isClientFeatureEnabled('collections') && - isServerFeatureEnabled('collections') - ); + return isServerFeatureEnabled('collections'); } + +export const getCollectionPath = (id: string) => `/collections/${id}`; diff --git a/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx b/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx index 73927b612d3089..b6847723b73de6 100644 --- a/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx +++ b/app/javascript/mastodon/features/community_timeline/components/column_settings.jsx @@ -1,10 +1,12 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { injectIntl } from '@/mastodon/components/intl'; + import SettingToggle from '../../notifications/components/setting_toggle'; class ColumnSettings extends PureComponent { diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx index b33fdd26b68302..0cb8d9a4b7b846 100644 --- a/app/javascript/mastodon/features/community_timeline/index.jsx +++ b/app/javascript/mastodon/features/community_timeline/index.jsx @@ -1,13 +1,14 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; +import { injectIntl } from '@/mastodon/components/intl'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { domain, localLiveFeedAccess } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/compose/components/circle_dropdown.jsx b/app/javascript/mastodon/features/compose/components/circle_dropdown.jsx index 5bc6a8329bc922..466161a9580dec 100644 --- a/app/javascript/mastodon/features/compose/components/circle_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/circle_dropdown.jsx @@ -1,7 +1,8 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { injectIntl, defineMessages } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index a6af5303e1fbbd..039e7731eb075a 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { createRef } from 'react'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; @@ -16,6 +16,7 @@ import AutosuggestInput from 'mastodon/components/autosuggest_input'; import AutosuggestTextarea from 'mastodon/components/autosuggest_textarea'; import { Button } from 'mastodon/components/button'; import CircleDropdownContainer from '../containers/circle_dropdown_container'; +import { injectIntl } from '@/mastodon/components/intl'; import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import ExpirationDropdownContainer from '../containers/expiration_dropdown_container'; import FeaturedTagsDropdownContainer from '../containers/featured_tags_dropdown_container'; diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx index cf1cabff2d5cdb..c4b61aff24e31c 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx @@ -1,19 +1,17 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; -import ImmutablePropTypes from 'react-immutable-proptypes'; - import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; import MoodIcon from '@/material-icons/400-20px/mood.svg?react'; import { IconButton } from 'mastodon/components/icon_button'; +import { injectIntl } from '@/mastodon/components/intl'; -import { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji'; import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components'; const messages = defineMessages({ @@ -155,7 +153,6 @@ class ModifierPicker extends PureComponent { class EmojiPickerMenuImpl extends PureComponent { static propTypes = { - custom_emojis: ImmutablePropTypes.list, frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string), loading: PropTypes.bool, onClose: PropTypes.func.isRequired, @@ -253,7 +250,7 @@ class EmojiPickerMenuImpl extends PureComponent { }; render() { - const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props; + const { loading, style, intl, skinTone, frequentlyUsedEmojis } = this.props; if (loading) { return
    ; @@ -263,32 +260,16 @@ class EmojiPickerMenuImpl extends PureComponent { const { modifierOpen } = this.state; - const categoriesSort = [ - 'recent', - 'people', - 'nature', - 'foods', - 'activity', - 'places', - 'objects', - 'symbols', - 'flags', - ]; - - categoriesSort.splice(1, 0, ...Array.from(categoriesFromEmojis(custom_emojis)).sort()); - return (
    { + this.setState({ loading: false }); + }); }).catch(() => { this.setState({ loading: false, active: false }); }); @@ -408,7 +389,6 @@ class EmojiPickerDropdown extends PureComponent {
    = ({
    - {isProcessing ? ( - - ) : ( - - )} + + {isProcessing ? ( + + ) : ( + + )} +
    diff --git a/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js index c3e95054e13307..d4227b83a1f3f9 100644 --- a/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js +++ b/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js @@ -72,23 +72,7 @@ const getFrequentlyUsedEmojis = createSelector([ return emojis; }); -const getCustomEmojis = createSelector([ - state => state.get('custom_emojis'), -], emojis => emojis.filter(e => e.get('visible_in_picker')).sort((a, b) => { - const aShort = a.get('shortcode').toLowerCase(); - const bShort = b.get('shortcode').toLowerCase(); - - if (aShort < bShort) { - return -1; - } else if (aShort > bShort ) { - return 1; - } else { - return 0; - } -})); - const mapStateToProps = state => ({ - custom_emojis: getCustomEmojis(state), skinTone: state.getIn(['settings', 'skinTone']), frequentlyUsedEmojis: getFrequentlyUsedEmojis(state), }); diff --git a/app/javascript/mastodon/features/compose/containers/markdown_button_container.js b/app/javascript/mastodon/features/compose/containers/markdown_button_container.js index d654c806a096d5..684f7cafceac55 100644 --- a/app/javascript/mastodon/features/compose/containers/markdown_button_container.js +++ b/app/javascript/mastodon/features/compose/containers/markdown_button_container.js @@ -1,4 +1,5 @@ -import { injectIntl, defineMessages } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { defineMessages } from 'react-intl'; import { connect } from 'react-redux'; diff --git a/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js b/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js index 9acc43437be0e4..b56f0dd8b90956 100644 --- a/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js +++ b/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js @@ -1,8 +1,9 @@ -import { injectIntl, defineMessages } from 'react-intl'; +import { defineMessages } from 'react-intl'; import { connect } from 'react-redux'; import WarningIcon from '@/material-icons/400-20px/warning.svg?react'; +import { injectIntl } from '@/mastodon/components/intl'; import { IconButton } from 'mastodon/components/icon_button'; import { changeComposeSpoilerness } from '../../../actions/compose'; diff --git a/app/javascript/mastodon/features/emoji/database.ts b/app/javascript/mastodon/features/emoji/database.ts index 8dbd22c71bacbd..80bdfd12ff46f8 100644 --- a/app/javascript/mastodon/features/emoji/database.ts +++ b/app/javascript/mastodon/features/emoji/database.ts @@ -267,6 +267,11 @@ export async function searchCustomEmojisByShortcodes(shortcodes: string[]) { return results.filter((emoji) => shortcodes.includes(emoji.shortcode)); } +export async function loadAllCustomEmoji() { + const db = await loadDB(); + return db.getAll('custom'); +} + export async function loadLegacyShortcodesByShortcode(shortcode: string) { const db = await loadDB(); return db.getFromIndex( @@ -302,7 +307,8 @@ async function toLoadedLocale(localeString: string) { } if (!loadedLocales.has(locale)) { log('Locale %s not loaded, importing...', locale); - const { importEmojiData } = await import('./loader'); + // Ignore the INEFFECTIVE_DYNAMIC_IMPORT Vite warning, since the static import location is inside an inlined web worker. + const { importEmojiData } = await import(/* @vite-ignore */ './loader'); await importEmojiData(locale); return locale; } diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index e4b3a2938a1313..80f94b649ea355 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -171,31 +171,3 @@ const emojify = (str, customEmojis = {}) => { }; export default emojify; - -export const buildCustomEmojis = (customEmojis) => { - const emojis = []; - - customEmojis.forEach(emoji => { - const shortcode = emoji.get('shortcode'); - const url = autoPlayGif ? emoji.get('url') : emoji.get('static_url'); - const name = shortcode.replace(':', ''); - const aliases = emoji.get('aliases'); - const keywords = aliases ? [name, ...aliases] : [name]; - - emojis.push({ - id: name, - name, - short_names: [name], - text: '', - emoticons: [], - keywords, - imageUrl: url, - custom: true, - customCategory: emoji.get('category'), - }); - }); - - return emojis; -}; - -export const categoriesFromEmojis = customEmojis => customEmojis.reduce((set, emoji) => set.add(emoji.get('category') ? `custom-${emoji.get('category')}` : 'custom'), new Set(['custom'])); diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.tsx b/app/javascript/mastodon/features/emoji/emoji_picker.tsx index 37fc94dde7aa0c..233c451aadd0e9 100644 --- a/app/javascript/mastodon/features/emoji/emoji_picker.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_picker.tsx @@ -1,27 +1,40 @@ +import type { FC } from 'react'; + import type { EmojiProps, PickerProps } from 'emoji-mart'; import EmojiRaw from 'emoji-mart/dist-es/components/emoji/nimble-emoji'; import PickerRaw from 'emoji-mart/dist-es/components/picker/nimble-picker'; -import { assetHost } from 'mastodon/utils/config'; +import { assetHost } from '@/mastodon/utils/config'; import { EMOJI_MODE_NATIVE } from './constants'; import EmojiData from './emoji_data.json'; import { useEmojiAppState } from './mode'; +import { usePickerEmojis } from './picker'; const backgroundImageFnDefault = () => `${assetHost}/emoji/sheet_16_0.png`; -const Emoji = ({ +export { fetchCustomEmojiData as loadCustomEmojiData } from './picker'; + +export const Picker: FC = ({ set = 'twitter', sheetSize = 32, sheetColumns = 62, sheetRows = 62, backgroundImageFn = backgroundImageFnDefault, ...props -}: EmojiProps) => { +}) => { const { mode } = useEmojiAppState(); + const { customCategories, customEmojis } = usePickerEmojis(); + + if (!customEmojis) { + return null; + } + return ( - = ({ set = 'twitter', sheetSize = 32, sheetColumns = 62, sheetRows = 62, backgroundImageFn = backgroundImageFnDefault, ...props -}: PickerProps) => { +}) => { const { mode } = useEmojiAppState(); return ( - ); }; - -export { Picker, Emoji }; diff --git a/app/javascript/mastodon/features/emoji/normalize.ts b/app/javascript/mastodon/features/emoji/normalize.ts index f19b300f3f0760..6d2cfbb46ab176 100644 --- a/app/javascript/mastodon/features/emoji/normalize.ts +++ b/app/javascript/mastodon/features/emoji/normalize.ts @@ -185,21 +185,16 @@ export function cleanExtraEmojis(extraEmojis?: CustomEmojiMapArg | null) { if (!extraEmojis) { return null; } - if (Array.isArray(extraEmojis)) { - return extraEmojis.reduce( - (acc, emoji) => ({ ...acc, [emoji.shortcode]: emoji }), - {}, - ); + if (!Array.isArray(extraEmojis) && !isList(extraEmojis)) { + return extraEmojis; } - if (isList(extraEmojis)) { - return extraEmojis - .toJS() - .reduce( - (acc, emoji) => ({ ...acc, [emoji.shortcode]: emoji }), - {}, - ); + const emojis: ExtraCustomEmojiMap = {}; + const emojiArray = isList(extraEmojis) ? extraEmojis.toJS() : extraEmojis; + for (const emoji of emojiArray) { + emojis[emoji.shortcode] = emoji; } - return extraEmojis; + + return emojis; } /** diff --git a/app/javascript/mastodon/features/emoji/picker.ts b/app/javascript/mastodon/features/emoji/picker.ts new file mode 100644 index 00000000000000..011c74cf97b2eb --- /dev/null +++ b/app/javascript/mastodon/features/emoji/picker.ts @@ -0,0 +1,87 @@ +import { useEffect, useState } from 'react'; + +import type { CategoryName, CustomEmoji } from 'emoji-mart'; + +import { autoPlayGif } from '@/mastodon/initial_state'; + +import { emojiLogger } from './utils'; + +const log = emojiLogger('picker'); + +let customEmojis: CustomEmoji[] | null = null; +let customCategories = [ + 'recent', + 'people', + 'nature', + 'foods', + 'activity', + 'places', + 'objects', + 'symbols', + 'flags', +] as CategoryName[]; + +export async function fetchCustomEmojiData() { + if (customEmojis !== null) { + return customEmojis; + } + + const { loadAllCustomEmoji } = await import('./database'); + const emojisRaw = await loadAllCustomEmoji(); + if (emojisRaw.length === 0) { + return []; + } + + const categories = new Set(['custom']); + const emojis = []; + for (const emoji of emojisRaw) { + const name = emoji.shortcode.replaceAll(':', ''); + const aliases = emoji.aliases; + emojis.push({ + name, + id: name, + custom: true, + short_names: [name], + keywords: aliases ? [name, ...aliases] : [name], + imageUrl: autoPlayGif ? emoji.url : emoji.static_url, + customCategory: emoji.category, + }); + + if (emoji.category) { + categories.add(`custom-${emoji.category}`); + } + } + + customEmojis = emojis.toSorted((a, b) => { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); + customCategories = customCategories.toSpliced( + 1, + 0, + ...(Array.from(categories).toSorted() as CategoryName[]), + ); + log( + 'loaded %d custom emojis in %d categories', + customEmojis.length, + categories.size, + ); + + return customEmojis; +} + +export function usePickerEmojis() { + const [, setLoaded] = useState(customEmojis !== null); + + useEffect(() => { + if (customEmojis === null) { + void fetchCustomEmojiData().then(() => { + setLoaded(true); + }); + } + }, []); + + return { + customEmojis, + customCategories, + }; +} diff --git a/app/javascript/mastodon/features/emoji/worker.ts b/app/javascript/mastodon/features/emoji/worker.ts index ce8eea09abd776..5602577dbe9ace 100644 --- a/app/javascript/mastodon/features/emoji/worker.ts +++ b/app/javascript/mastodon/features/emoji/worker.ts @@ -1,4 +1,9 @@ import { EMOJI_DB_NAME_SHORTCODES, EMOJI_TYPE_CUSTOM } from './constants'; +import { + importCustomEmojiData, + importEmojiData, + importLegacyShortcodes, +} from './loader'; addEventListener('message', handleMessage); self.postMessage('ready'); // After the worker is ready, notify the main thread @@ -11,8 +16,6 @@ function handleMessage(event: MessageEvent<{ locale: string }>) { } async function loadData(locale: string) { - const { importCustomEmojiData, importEmojiData, importLegacyShortcodes } = - await import('./loader'); let importCount: number | undefined; if (locale === EMOJI_TYPE_CUSTOM) { importCount = (await importCustomEmojiData())?.length; diff --git a/app/javascript/mastodon/features/emoji_reactions/index.jsx b/app/javascript/mastodon/features/emoji_reactions/index.jsx index 05d057dc654702..15a7a83bd72a63 100644 --- a/app/javascript/mastodon/features/emoji_reactions/index.jsx +++ b/app/javascript/mastodon/features/emoji_reactions/index.jsx @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; diff --git a/app/javascript/mastodon/features/explore/links.jsx b/app/javascript/mastodon/features/explore/links.jsx index 9858fc893209d3..8c2576f4c29512 100644 --- a/app/javascript/mastodon/features/explore/links.jsx +++ b/app/javascript/mastodon/features/explore/links.jsx @@ -47,7 +47,7 @@ class Links extends PureComponent { return (
    - +
    ); diff --git a/app/javascript/mastodon/features/explore/suggestions.jsx b/app/javascript/mastodon/features/explore/suggestions.jsx index b469a152527a5a..cca9935f9ed8e0 100644 --- a/app/javascript/mastodon/features/explore/suggestions.jsx +++ b/app/javascript/mastodon/features/explore/suggestions.jsx @@ -45,7 +45,7 @@ class Suggestions extends PureComponent { return (
    - +
    ); diff --git a/app/javascript/mastodon/features/explore/tags.jsx b/app/javascript/mastodon/features/explore/tags.jsx index 683f95bfb4e95f..9afb5ad6fa53cb 100644 --- a/app/javascript/mastodon/features/explore/tags.jsx +++ b/app/javascript/mastodon/features/explore/tags.jsx @@ -46,7 +46,7 @@ class Tags extends PureComponent { return (
    - +
    ); diff --git a/app/javascript/mastodon/features/favourited_statuses/index.jsx b/app/javascript/mastodon/features/favourited_statuses/index.jsx index 9049a20f05d278..8be62ad3983cab 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.jsx +++ b/app/javascript/mastodon/features/favourited_statuses/index.jsx @@ -2,7 +2,8 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; diff --git a/app/javascript/mastodon/features/favourites/index.jsx b/app/javascript/mastodon/features/favourites/index.jsx index b821dfcf3e77a4..3ad3973fc3e3ee 100644 --- a/app/javascript/mastodon/features/favourites/index.jsx +++ b/app/javascript/mastodon/features/favourites/index.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; @@ -17,6 +17,7 @@ import { fetchFavourites, expandFavourites } from 'mastodon/actions/interactions import { Account } from 'mastodon/components/account'; import ColumnHeader from 'mastodon/components/column_header'; import { Icon } from 'mastodon/components/icon'; +import { injectIntl } from '@/mastodon/components/intl'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollableList from 'mastodon/components/scrollable_list'; import Column from 'mastodon/features/ui/components/column'; diff --git a/app/javascript/mastodon/features/filters/select_filter.jsx b/app/javascript/mastodon/features/filters/select_filter.jsx index 5b2eb64952f0e5..010527e932f128 100644 --- a/app/javascript/mastodon/features/filters/select_filter.jsx +++ b/app/javascript/mastodon/features/filters/select_filter.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; @@ -9,6 +9,7 @@ import fuzzysort from 'fuzzysort'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import { Icon } from 'mastodon/components/icon'; +import { injectIntl } from '@/mastodon/components/intl'; import { toServerSideType } from 'mastodon/utils/filters'; import { loupeIcon, deleteIcon } from 'mastodon/utils/icons'; diff --git a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx index e865b606fe38e8..6aff30bd47ad45 100644 --- a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx +++ b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import { Link } from 'react-router-dom'; @@ -13,6 +13,7 @@ import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Avatar } from '@/mastodon/components/avatar'; import { DisplayName } from '@/mastodon/components/display_name'; import { IconButton } from '@/mastodon/components/icon_button'; +import { injectIntl } from '@/mastodon/components/intl'; import { EmojiHTML } from '@/mastodon/components/emoji/html'; const messages = defineMessages({ diff --git a/app/javascript/mastodon/features/follow_requests/index.jsx b/app/javascript/mastodon/features/follow_requests/index.jsx index 91648412b55799..ba632b8ea3480a 100644 --- a/app/javascript/mastodon/features/follow_requests/index.jsx +++ b/app/javascript/mastodon/features/follow_requests/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; @@ -11,6 +11,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; +import { injectIntl } from '@/mastodon/components/intl'; import { fetchFollowRequests, expandFollowRequests } from '../../actions/accounts'; import ScrollableList from '../../components/scrollable_list'; diff --git a/app/javascript/mastodon/features/followers/components/empty.tsx b/app/javascript/mastodon/features/followers/components/empty.tsx index eee034998aeeb0..8125abbbe5800f 100644 --- a/app/javascript/mastodon/features/followers/components/empty.tsx +++ b/app/javascript/mastodon/features/followers/components/empty.tsx @@ -2,7 +2,7 @@ import type { FC, ReactNode } from 'react'; import { FormattedMessage } from 'react-intl'; -import { LimitedAccountHint } from '@/mastodon/features/account_timeline/components/limited_account_hint'; +import { LimitedAccountHint } from '@/mastodon/components/limited_account_hint'; import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility'; import { isHideItem, me } from '@/mastodon/initial_state'; import type { Account } from '@/mastodon/models/account'; diff --git a/app/javascript/mastodon/features/followers/components/header.tsx b/app/javascript/mastodon/features/followers/components/header.tsx index 2733e1d0f4e196..f7b2359c02aa38 100644 --- a/app/javascript/mastodon/features/followers/components/header.tsx +++ b/app/javascript/mastodon/features/followers/components/header.tsx @@ -3,8 +3,12 @@ import type { FC } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; import type { MessageDescriptor } from 'react-intl'; +import { Link } from 'react-router-dom'; + +import { Callout } from '@/mastodon/components/callout'; import { DisplayNameSimple } from '@/mastodon/components/display_name/simple'; import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; import classes from '../styles.module.scss'; @@ -15,6 +19,7 @@ export const AccountListHeader: FC<{ }> = ({ accountId, total, titleText }) => { const intl = useIntl(); const account = useAccount(accountId); + const currentId = useCurrentAccountId(); return ( <>

    @@ -31,6 +36,35 @@ export const AccountListHeader: FC<{ />

    )} + {accountId === currentId && account?.hide_collections && ( + + {chunks}, + page: ( + + ), + modal: ( + + ), + field: ( + + ), + }} + /> + + )} ); }; diff --git a/app/javascript/mastodon/features/followers/components/list.tsx b/app/javascript/mastodon/features/followers/components/list.tsx index 0cb36d0e4c0cb8..0af76c3891aaa1 100644 --- a/app/javascript/mastodon/features/followers/components/list.tsx +++ b/app/javascript/mastodon/features/followers/components/list.tsx @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import type { FC, ReactNode } from 'react'; -import { Account } from '@/mastodon/components/account'; +import { AccountListItem } from '@/mastodon/components/account_list_item'; import { Column } from '@/mastodon/components/column'; import { ColumnBackButton } from '@/mastodon/components/column_back_button'; import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; @@ -30,6 +30,7 @@ interface AccountListProps { loadMore: () => void; prependAccountId?: string | null; scrollKey: string; + kind?: 'followers' | 'following' | null; } export const AccountList: FC = ({ @@ -42,11 +43,13 @@ export const AccountList: FC = ({ loadMore, prependAccountId, scrollKey, + kind, }) => { const account = useAccount(accountId); const { blockedBy, hidden, suspended } = useAccountVisibility(accountId); - const isHideRelationships = isHideItem('relationships') && accountId === me; + const isHideRelationships = + isHideItem('relationships') && accountId === me && kind === 'followers'; const forceEmptyState = blockedBy || hidden || suspended || isHideRelationships; @@ -56,12 +59,20 @@ export const AccountList: FC = ({ } const children = list?.items.map((followerId) => ( - + )) ?? []; if (prependAccountId) { children.unshift( - , + , ); } return children; diff --git a/app/javascript/mastodon/features/followers/index.tsx b/app/javascript/mastodon/features/followers/index.tsx index bba2f4cb083348..5db27b7cf4d3cf 100644 --- a/app/javascript/mastodon/features/followers/index.tsx +++ b/app/javascript/mastodon/features/followers/index.tsx @@ -63,6 +63,7 @@ const Followers: FC = () => {
    ); @@ -85,6 +86,7 @@ const Followers: FC = () => { loadMore={loadMore} prependAccountId={followerId} scrollKey='followers' + kind='followers' /> ); }; diff --git a/app/javascript/mastodon/features/followers/styles.module.scss b/app/javascript/mastodon/features/followers/styles.module.scss index f58b345becbe40..6294044c3bbba5 100644 --- a/app/javascript/mastodon/features/followers/styles.module.scss +++ b/app/javascript/mastodon/features/followers/styles.module.scss @@ -4,8 +4,12 @@ margin: 20px 16px 10px; } +.subtitle, +.callout { + margin: 10px 16px; +} + .subtitle { font-size: 14px; color: var(--color-text-secondary); - margin: 10px 16px; } diff --git a/app/javascript/mastodon/features/following/index.tsx b/app/javascript/mastodon/features/following/index.tsx index 6bc7abda69aaa6..0f0d976d1c4618 100644 --- a/app/javascript/mastodon/features/following/index.tsx +++ b/app/javascript/mastodon/features/following/index.tsx @@ -65,6 +65,7 @@ const Followers: FC = () => {
    ); @@ -89,6 +90,7 @@ const Followers: FC = () => { loadMore={loadMore} prependAccountId={followedId} scrollKey='following' + kind='following' /> ); }; diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx index 3412e5d1bde626..18222a44ffde9d 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx +++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.jsx @@ -1,13 +1,15 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { NonceProvider } from 'react-select'; import AsyncSelect from 'react-select/async'; -import Toggle from 'react-toggle'; + +import { Toggle } from '@/mastodon/components/form_fields/toggle_field'; +import { injectIntl } from '@/mastodon/components/intl'; import SettingToggle from '../../notifications/components/setting_toggle'; diff --git a/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx index cb44e1d075c0c7..2e4cc0214c48ce 100644 --- a/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx @@ -7,6 +7,7 @@ import elephantUIPlane from '@/images/elephant_ui_plane.svg'; import type { RenderSlideFn } from '@/mastodon/components/carousel'; import { Carousel } from '@/mastodon/components/carousel'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; +import { useCustomEmojis } from '@/mastodon/hooks/useCustomEmojis'; import { mascot } from '@/mastodon/initial_state'; import { createAppSelector, useAppSelector } from '@/mastodon/store'; @@ -23,7 +24,7 @@ const announcementSelector = createAppSelector( export const Announcements: FC = () => { const announcements = useAppSelector(announcementSelector); - const emojis = useAppSelector((state) => state.custom_emojis); + const emojis = useCustomEmojis(); const renderSlide: RenderSlideFn<{ id: string; diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx index 45b867ad9d6aa5..d7c463c5cc3cd8 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.tsx @@ -16,12 +16,12 @@ import { } from 'mastodon/actions/suggestions'; import type { ApiSuggestionSourceJSON } from 'mastodon/api_types/suggestions'; import { Avatar } from 'mastodon/components/avatar'; +import { Badge, VerifiedBadge } from 'mastodon/components/badge'; 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 { LoadingIndicator } from 'mastodon/components/loading_indicator'; -import { VerifiedBadge } from 'mastodon/components/verified_badge'; import { domain } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -110,13 +110,12 @@ const Source: React.FC<{ id: ApiSuggestionSourceJSON }> = ({ id }) => { } return ( -
    - - {label} -
    + label={label} + icon={} + /> ); }; diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 893e2c08cabf38..e135fe0cd91083 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; @@ -10,6 +10,7 @@ import { connect } from 'react-redux'; import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import { injectIntl } from '@/mastodon/components/intl'; import { SymbolLogo } from 'mastodon/components/logo'; import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx index 59c9d0e4bd9533..b07ac5f6832e68 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; @@ -9,6 +9,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import InfoIcon from '@/material-icons/400-24px/info.svg?react'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; +import { injectIntl } from '@/mastodon/components/intl'; const messages = defineMessages({ heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' }, diff --git a/app/javascript/mastodon/features/lists/members.tsx b/app/javascript/mastodon/features/lists/members.tsx index d7db8eb14909e1..e19ff3830f7027 100644 --- a/app/javascript/mastodon/features/lists/members.tsx +++ b/app/javascript/mastodon/features/lists/members.tsx @@ -19,6 +19,7 @@ import { apiRemoveAccountFromList, } from 'mastodon/api/lists'; import { Avatar } from 'mastodon/components/avatar'; +import { VerifiedBadge } from 'mastodon/components/badge'; import { Button } from 'mastodon/components/button'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; @@ -27,7 +28,6 @@ import { FollowersCounter } from 'mastodon/components/counters'; import { DisplayName } from 'mastodon/components/display_name'; import ScrollableList from 'mastodon/components/scrollable_list'; import { ShortNumber } from 'mastodon/components/short_number'; -import { VerifiedBadge } from 'mastodon/components/verified_badge'; import { useSearchAccounts } from 'mastodon/hooks/useSearchAccounts'; import { me } from 'mastodon/initial_state'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -165,7 +165,7 @@ const ListMembers: React.FC<{ const [mode, setMode] = useState('remove'); const { - accountIds: searchAccountIds, + accounts: accountsFromSearch, isLoading: loadingSearchResults, searchAccounts: handleSearch, } = useSearchAccounts({ @@ -178,6 +178,7 @@ const ListMembers: React.FC<{ } }, }); + const accountIdsFromSearch = accountsFromSearch.map((item) => item.id); useEffect(() => { if (id) { @@ -221,7 +222,7 @@ const ListMembers: React.FC<{ let displayedAccountIds: string[]; if (mode === 'add' && searching) { - displayedAccountIds = searchAccountIds; + displayedAccountIds = accountIdsFromSearch; } else { displayedAccountIds = accountIds; } @@ -286,6 +287,7 @@ const ListMembers: React.FC<{ ) } diff --git a/app/javascript/mastodon/features/lists/new.tsx b/app/javascript/mastodon/features/lists/new.tsx index 0fa9bd407860d9..881ef6a0bc2ad5 100644 --- a/app/javascript/mastodon/features/lists/new.tsx +++ b/app/javascript/mastodon/features/lists/new.tsx @@ -7,8 +7,6 @@ import { useParams, useHistory, Link } from 'react-router-dom'; import { isFulfilled } from '@reduxjs/toolkit'; -import Toggle from 'react-toggle'; - import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchList } from 'mastodon/actions/lists'; @@ -20,7 +18,11 @@ import { Avatar } from 'mastodon/components/avatar'; import { AvatarGroup } from 'mastodon/components/avatar_group'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; -import { SelectField, TextInputField } from 'mastodon/components/form_fields'; +import { + SelectField, + TextInputField, + Toggle, +} from 'mastodon/components/form_fields'; import { Icon } from 'mastodon/components/icon'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import type { List } from 'mastodon/models/list'; diff --git a/app/javascript/mastodon/features/mentioned_users/index.jsx b/app/javascript/mastodon/features/mentioned_users/index.jsx index 99443b9fa9d6bf..483d056dc38702 100644 --- a/app/javascript/mastodon/features/mentioned_users/index.jsx +++ b/app/javascript/mastodon/features/mentioned_users/index.jsx @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; diff --git a/app/javascript/mastodon/features/mutes/index.jsx b/app/javascript/mastodon/features/mutes/index.jsx index 28c76a04e201b2..8dd230e4adf517 100644 --- a/app/javascript/mastodon/features/mutes/index.jsx +++ b/app/javascript/mastodon/features/mutes/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; @@ -12,6 +12,7 @@ import { debounce } from 'lodash'; import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { Account } from 'mastodon/components/account'; +import { injectIntl } from '@/mastodon/components/intl'; import { fetchMutes, expandMutes } from '../../actions/mutes'; import { LoadingIndicator } from '../../components/loading_indicator'; diff --git a/app/javascript/mastodon/features/navigation_panel/index.tsx b/app/javascript/mastodon/features/navigation_panel/index.tsx index dd4547f8659c7a..6ba6ec94602196 100644 --- a/app/javascript/mastodon/features/navigation_panel/index.tsx +++ b/app/javascript/mastodon/features/navigation_panel/index.tsx @@ -10,6 +10,7 @@ import type { Map as ImmutableMap } from 'immutable'; import { animated, useSpring } from '@react-spring/web'; import { useDrag } from '@use-gesture/react'; +import { useAccount } from '@/mastodon/hooks/useAccount'; import CirclesIcon from '@/material-icons/400-24px/account_circle-fill.svg?react'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; @@ -225,6 +226,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ const { signedIn, permissions, disabledAccountId } = useIdentity(); const location = useLocation(); const showSearch = useBreakpoint('full') && !multiColumn; + const account = useAccount(me); const handleRefresh = useCallback(() => { window.location.reload(); @@ -331,7 +333,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ enableLocalTimeline && !signedIn ? '/public/local' - : '/public/remote' + : '/public' } icon='globe' iconComponent={PublicIcon} @@ -389,7 +391,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ {areCollectionsEnabled() && ( - +
    ); 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 eddd35df4a2fe0..6e9964fab1c4c5 100644 --- a/app/javascript/mastodon/features/notifications/containers/column_settings_container.js +++ b/app/javascript/mastodon/features/notifications/containers/column_settings_container.js @@ -1,9 +1,10 @@ -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import { connect } from 'react-redux'; import { openModal } from 'mastodon/actions/modal'; import { fetchNotifications , setNotificationsFilter } from 'mastodon/actions/notification_groups'; +import { injectIntl } from '@/mastodon/components/intl'; import { showAlert } from '../../../actions/alerts'; import { requestBrowserPermission } from '../../../actions/notifications'; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_collection.module.scss b/app/javascript/mastodon/features/notifications_v2/components/notification_collection.module.scss new file mode 100644 index 00000000000000..93627f5c9577c1 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_collection.module.scss @@ -0,0 +1,17 @@ +.actions { + display: flex; + align-items: center; +} + +.menuButton { + box-sizing: content-box; + margin-inline-start: auto; + padding: 4px; + border-radius: 4px; + border: 1px solid var(--color-border-primary); + + svg { + width: 20px; + height: 20px; + } +} diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_collection.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_collection.tsx new file mode 100644 index 00000000000000..10466b5d3d8cb2 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_collection.tsx @@ -0,0 +1,109 @@ +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import { Button } from '@/mastodon/components/button'; +import { LinkedDisplayName } from '@/mastodon/components/display_name'; +import { Icon } from '@/mastodon/components/icon'; +import { CollectionMenu } from '@/mastodon/features/collections/components/collection_menu'; +import { CollectionPreviewCard } from '@/mastodon/features/collections/components/collection_preview_card'; +import { useConfirmRevoke } from '@/mastodon/features/collections/detail/revoke_collection_inclusion_modal'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import CollectionsFilledIcon from '@/material-icons/400-24px/category-fill.svg?react'; +import type { + NotificationGroupAddedToCollection, + NotificationGroupCollectionUpdate, +} from 'mastodon/models/notification_group'; + +import classes from './notification_collection.module.scss'; + +export const NotificationCollection: React.FC<{ + notification: + | NotificationGroupAddedToCollection + | NotificationGroupCollectionUpdate; + unread: boolean; +}> = ({ notification, unread }) => { + const { collection, type } = notification; + + const collectionCreatorAccount = useAccount(collection?.account_id); + const confirmRevoke = useConfirmRevoke(collection); + + if (!collection) { + return null; + } + + return ( +
    +
    + +
    + +
    +
    +
    + {type === 'added_to_collection' && ( + + ), + }} + /> + )} + {type === 'collection_update' && ( + + ), + }} + /> + )} +
    +
    + + + +
    + + + +
    +
    +
    + ); +}; diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx index 677af6fda28e6d..399a301b59591f 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx @@ -9,6 +9,7 @@ import { useAppSelector, useAppDispatch } from 'mastodon/store'; import { NotificationAdminReport } from './notification_admin_report'; import { NotificationAdminSignUp } from './notification_admin_sign_up'; import { NotificationAnnualReport } from './notification_annual_report'; +import { NotificationCollection } from './notification_collection'; import { NotificationEmojiReaction } from './notification_emoji_reaction'; import { NotificationFavourite } from './notification_favourite'; import { NotificationFollow } from './notification_follow'; @@ -183,6 +184,15 @@ export const NotificationGroup: React.FC<{ /> ); break; + case 'added_to_collection': + case 'collection_update': + content = ( + + ); + break; default: return null; } 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 index 3787ae43bf9ec2..139b039936f724 100644 --- 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 @@ -155,7 +155,7 @@ export const NotificationGroupWithStatus: React.FC<{ )}
    - {label} + {label} {timestamp && ( <> 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 index cf3a70333aec03..0b3902b49636b6 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx @@ -107,7 +107,7 @@ export const NotificationWithStatus: React.FC<{
    - {label} + {label}
    void; onRemove?: (index: number) => void; -}> = ({ index, emoji, emojiMap, overlay, onChange, onRemove }) => { +}> = ({ index, emoji, mapEmoji, overlay, onChange, onRemove }) => { const handleChange = useCallback( (emoji: any) => { if (onChange) onChange(index, emoji); @@ -85,12 +86,9 @@ const ReactionEmoji: React.FC<{ }; let content: ReactNode; - const mapEmoji = emojiMap.find((e: any) => e.get('shortcode') === emoji); if (mapEmoji) { - const filename = autoPlayGif - ? mapEmoji.get('url') - : mapEmoji.get('static_url'); + const filename = mapEmoji.imageUrl; const shortCode = `:${emoji}:`; content = ( @@ -144,7 +142,7 @@ export const ReactionDeck: React.FC<{ const dispatch = useAppDispatch(); const intl = useIntl(); - const emojiMap = useAppSelector((state) => state.custom_emojis); + const { customEmojis } = usePickerEmojis(); const deck = useAppSelector((state) => state.reaction_deck); const onChange = useCallback( @@ -268,7 +266,7 @@ export const ReactionDeck: React.FC<{ {deck.map((emoji: any, index) => (
    c.id === emoji.get('name'))} emoji={emoji.get('name')} index={index} onChange={handleChange} @@ -283,7 +281,9 @@ export const ReactionDeck: React.FC<{ {activeId ? (
    c.id === activeEmoji.get('name'), + )} emoji={activeEmoji.get('name')} index={-1} overlay diff --git a/app/javascript/mastodon/features/reblogs/index.jsx b/app/javascript/mastodon/features/reblogs/index.jsx index 24786b62f065d0..b0ee5029f5fba7 100644 --- a/app/javascript/mastodon/features/reblogs/index.jsx +++ b/app/javascript/mastodon/features/reblogs/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; @@ -13,6 +13,7 @@ import { debounce } from 'lodash'; import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react'; import { Account } from 'mastodon/components/account'; import { Icon } from 'mastodon/components/icon'; +import { injectIntl } from '@/mastodon/components/intl'; import { fetchReblogs, expandReblogs } from '../../actions/interactions'; import ColumnHeader from '../../components/column_header'; diff --git a/app/javascript/mastodon/features/report/category.jsx b/app/javascript/mastodon/features/report/category.jsx index a2fc3b23b4ff99..7a37426a65cd1e 100644 --- a/app/javascript/mastodon/features/report/category.jsx +++ b/app/javascript/mastodon/features/report/category.jsx @@ -1,13 +1,14 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; import { Button } from 'mastodon/components/button'; +import { injectIntl } from '@/mastodon/components/intl'; import Option from './components/option'; diff --git a/app/javascript/mastodon/features/report/comment.tsx b/app/javascript/mastodon/features/report/comment.tsx index 8c2728a9445387..d6d4d94b43d71c 100644 --- a/app/javascript/mastodon/features/report/comment.tsx +++ b/app/javascript/mastodon/features/report/comment.tsx @@ -6,8 +6,7 @@ import type { Map } from 'immutable'; import { OrderedSet } from 'immutable'; import { shallowEqual } from 'react-redux'; -import Toggle from 'react-toggle'; - +import { Toggle } from '@/mastodon/components/form_fields/toggle_field'; import { fetchAccount } from 'mastodon/actions/accounts'; import { Button } from 'mastodon/components/button'; import type { Status } from 'mastodon/models/status'; @@ -194,6 +193,7 @@ const Comment: React.FC = ({ id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} + tagName='span' /> ))} diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index 995edd666ce34b..053a31ab3f1b55 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -13,6 +13,7 @@ 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-fill.svg?react'; import StarBorderIcon from '@/material-icons/400-24px/star.svg?react'; +import { injectIntl } from '@/mastodon/components/intl'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/features/status/components/detailed_status.tsx b/app/javascript/mastodon/features/status/components/detailed_status.tsx index 33bf81bfba8703..5e21068246422b 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.tsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.tsx @@ -31,10 +31,13 @@ import StatusEmojiReactionsBar from 'mastodon/components/status_emoji_reactions_ import { QuotedStatus } from 'mastodon/components/status_quoted'; import { VisibilityIcon } from 'mastodon/components/visibility_icon'; import { Audio } from 'mastodon/features/audio'; +import { CollectionPreviewCard } from 'mastodon/features/collections/components/collection_preview_card'; import scheduleIdleTask from 'mastodon/features/ui/util/schedule_idle_task'; import { Video } from 'mastodon/features/video'; import { useIdentity } from 'mastodon/identity_context'; import { enableEmojiReaction, isHideItem } from 'mastodon/initial_state'; +import type { CollectionAttachment } from 'mastodon/models/status'; +import { compareUrls } from 'mastodon/utils/compare_urls'; import Card from './card'; @@ -269,13 +272,32 @@ export const DetailedStatus: React.FC<{ ); } } else if (status.get('card') && !status.get('quote')) { - media = ( - - ); + const cardUrl: string = status.getIn(['card', 'url']); + + const taggedCollection = status + .get('tagged_collections') + .find((item: CollectionAttachment) => + compareUrls(item.get('url'), cardUrl), + ); + + if (taggedCollection) { + media = ; + } else { + media = ( + + ); + } + } else if (status.get('tagged_collections').size) { + const firstLinkedCollection = status.get('tagged_collections').first(); + if (firstLinkedCollection) { + media = ( + + ); + } } let emojiReactionsBar = null; @@ -481,6 +503,7 @@ export const DetailedStatus: React.FC<{
    )} diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index b96622911979fa..11c105d2fbbd49 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; @@ -15,6 +15,7 @@ import VisibilityIcon from '@/material-icons/400-24px/visibility.svg?react'; import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import { Hotkeys } from 'mastodon/components/hotkeys'; import { Icon } from 'mastodon/components/icon'; +import { injectIntl } from '@/mastodon/components/intl'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { ScrollContainer } from 'mastodon/containers/scroll_container'; import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error'; diff --git a/app/javascript/mastodon/features/status_references/index.jsx b/app/javascript/mastodon/features/status_references/index.jsx index c36d6fadc422e3..992eecbf9af5cc 100644 --- a/app/javascript/mastodon/features/status_references/index.jsx +++ b/app/javascript/mastodon/features/status_references/index.jsx @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import { injectIntl } from '@/mastodon/components/intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; diff --git a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx index 895a2686e842e6..8d5665b1c47db3 100644 --- a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx +++ b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { createSelector } from '@reduxjs/toolkit'; import { is, List as ImmutableList, Set as ImmutableSet } from 'immutable'; @@ -12,6 +12,7 @@ import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { followAccount } from 'mastodon/actions/accounts'; import { Button } from 'mastodon/components/button'; import { IconButton } from 'mastodon/components/icon_button'; +import { injectIntl } from '@/mastodon/components/intl'; import Option from 'mastodon/features/report/components/option'; import { languages as preloadedLanguages } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/ui/components/bundle.jsx b/app/javascript/mastodon/features/ui/components/bundle.jsx index 57143f157150a5..90e775f907395a 100644 --- a/app/javascript/mastodon/features/ui/components/bundle.jsx +++ b/app/javascript/mastodon/features/ui/components/bundle.jsx @@ -69,6 +69,7 @@ class Bundle extends PureComponent { this.setState({ mod: mod.default }); }) .catch((error) => { + console.error('Bundle fetching error:', error); this.setState({ mod: null }); }); }; diff --git a/app/javascript/mastodon/features/ui/components/bundle_column_error.jsx b/app/javascript/mastodon/features/ui/components/bundle_column_error.jsx index 2461028d8be990..da98c5632fb68a 100644 --- a/app/javascript/mastodon/features/ui/components/bundle_column_error.jsx +++ b/app/javascript/mastodon/features/ui/components/bundle_column_error.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { injectIntl, FormattedMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; @@ -9,6 +9,7 @@ import { Link } from 'react-router-dom'; import { Button } from 'mastodon/components/button'; import Column from 'mastodon/components/column'; +import { injectIntl } from '@/mastodon/components/intl'; import { GIF } from 'mastodon/components/gif'; class CopyButton extends PureComponent { diff --git a/app/javascript/mastodon/features/ui/components/column_subheading.jsx b/app/javascript/mastodon/features/ui/components/column_subheading.jsx deleted file mode 100644 index e970a0bfdd0e1e..00000000000000 --- a/app/javascript/mastodon/features/ui/components/column_subheading.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import PropTypes from 'prop-types'; - -const ColumnSubheading = ({ text }) => { - return ( -
    - {text} -
    - ); -}; - -ColumnSubheading.propTypes = { - text: PropTypes.string.isRequired, -}; - -export default ColumnSubheading; 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 index b0397f4d7be8f1..1dbc19ea3bff13 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -65,7 +65,7 @@ export const ConfirmationModal: React.FC< }, [onClose, onSecondary]); return ( - +

    {title}

    {message &&

    {message}

    } @@ -99,6 +99,7 @@ export const ConfirmationModal: React.FC< {/* eslint-disable jsx-a11y/no-autofocus -- we are in a modal and thus autofocusing is justified */}
    + } + confirm={intl.formatMessage(messages.confirm)} + onConfirm={onConfirm} + onClose={onClose} + /> + ); +}; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts index 575c666203b927..88265e7d3f7498 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/index.ts @@ -16,7 +16,6 @@ export { ConfirmUnblockModal } from './unblock'; export { ConfirmClearNotificationsModal } from './clear_notifications'; export { ConfirmLogOutModal } from './log_out'; export { ConfirmFollowToListModal } from './follow_to_list'; -export { ConfirmFollowToCollectionModal } from './follow_to_collection'; export { ConfirmMissingAltTextModal } from './missing_alt_text'; export { ConfirmRevokeQuoteModal } from './revoke_quote'; export { QuietPostQuoteInfoModal } from './quiet_post_quote_info'; diff --git a/app/javascript/mastodon/features/ui/components/filter_modal.jsx b/app/javascript/mastodon/features/ui/components/filter_modal.jsx index a1a39ba0abf680..c0a2bf6d53fbbc 100644 --- a/app/javascript/mastodon/features/ui/components/filter_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/filter_modal.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; @@ -9,6 +9,7 @@ import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { fetchFilters, createFilter, createFilterStatus } from 'mastodon/actions/filters'; import { fetchStatus } from 'mastodon/actions/statuses'; import { IconButton } from 'mastodon/components/icon_button'; +import { injectIntl } from '@/mastodon/components/intl'; import AddedToFilter from 'mastodon/features/filters/added_to_filter'; import SelectFilter from 'mastodon/features/filters/select_filter'; diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index e4d2bc4bd899fb..9a538eacc25d92 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -45,7 +45,6 @@ import { ConfirmClearNotificationsModal, ConfirmLogOutModal, ConfirmFollowToListModal, - ConfirmFollowToCollectionModal, ConfirmMissingAltTextModal, ConfirmRevokeQuoteModal, QuietPostQuoteInfoModal, @@ -78,7 +77,6 @@ export const MODAL_COMPONENTS = { 'CONFIRM_CLEAR_NOTIFICATIONS': () => Promise.resolve({ default: ConfirmClearNotificationsModal }), 'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }), 'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }), - 'CONFIRM_FOLLOW_TO_COLLECTION': () => Promise.resolve({ default: ConfirmFollowToCollectionModal }), 'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }), 'CONFIRM_PRIVATE_QUOTE_NOTIFY': () => Promise.resolve({ default: PrivateQuoteNotify }), 'CONFIRM_REVOKE_QUOTE': () => Promise.resolve({ default: ConfirmRevokeQuoteModal }), @@ -88,7 +86,7 @@ export const MODAL_COMPONENTS = { 'DOMAIN_BLOCK': DomainBlockModal, 'REPORT': ReportModal, 'REPORT_COLLECTION': ReportCollectionModal, - 'SHARE_COLLECTION': () => import('@/mastodon/features/collections/detail/share_modal').then(module => ({ default: module.CollectionShareModal })), + 'SHARE_COLLECTION': () => import('@/mastodon/features/collections/components/share_modal').then(module => ({ default: module.CollectionShareModal })), 'REVOKE_COLLECTION_INCLUSION': () => import('@/mastodon/features/collections/detail/revoke_collection_inclusion_modal').then(module => ({ default: module.RevokeCollectionInclusionModal })), 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, @@ -107,6 +105,7 @@ export const MODAL_COMPONENTS = { 'COMPOSE_PRIVACY': () => Promise.resolve({ default: VisibilityModal }), 'ACCOUNT_NOTE': () => import('@/mastodon/features/account_timeline/modals/note_modal').then(module => ({ default: module.AccountNoteModal })), 'ACCOUNT_FIELD_OVERFLOW': () => import('@/mastodon/features/account_timeline/modals/field_modal').then(module => ({ default: module.AccountFieldModal })), + 'ACCOUNT_JOIN_DATE': () => import('@/mastodon/features/account_timeline/modals/join_modal').then(module => ({ default: module.AccountJoinModal })), 'ACCOUNT_EDIT_NAME': accountEditModal('NameModal'), 'ACCOUNT_EDIT_BIO': accountEditModal('BioModal'), 'ACCOUNT_EDIT_PROFILE_DISPLAY': accountEditModal('ProfileDisplayModal'), @@ -117,6 +116,7 @@ export const MODAL_COMPONENTS = { 'ACCOUNT_EDIT_IMAGE_ALT': accountEditModal('ImageAltModal'), 'ACCOUNT_EDIT_IMAGE_DELETE': accountEditModal('ImageDeleteModal'), 'ACCOUNT_EDIT_IMAGE_UPLOAD': accountEditModal('ImageUploadModal'), + 'ACCOUNT_HIDE_FEATURED_TAB': () => import('@/mastodon/features/ui/components/confirmation_modals/hide_featured_tab').then(module => ({ default: module.ConfirmHideFeaturedTabModal })), }; /** @arg {keyof import('@/mastodon/features/account_edit/modals')} type */ diff --git a/app/javascript/mastodon/features/ui/components/report_modal.jsx b/app/javascript/mastodon/features/ui/components/report_modal.jsx index 6584364609522c..2ffac942be1f48 100644 --- a/app/javascript/mastodon/features/ui/components/report_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/report_modal.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; +import { defineMessages, FormattedMessage } from 'react-intl'; import { OrderedSet } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; @@ -12,6 +12,7 @@ import { submitReport } from 'mastodon/actions/reports'; import { fetchServer } from 'mastodon/actions/server'; import { expandAccountTimeline } from 'mastodon/actions/timelines'; import { IconButton } from 'mastodon/components/icon_button'; +import { injectIntl } from '@/mastodon/components/intl'; import Category from 'mastodon/features/report/category'; import Comment from 'mastodon/features/report/comment'; import Rules from 'mastodon/features/report/rules'; diff --git a/app/javascript/mastodon/features/ui/components/skip_links/skip_links.module.scss b/app/javascript/mastodon/features/ui/components/skip_links/skip_links.module.scss index 1d4dc1c3f549f5..ad206dfecc5205 100644 --- a/app/javascript/mastodon/features/ui/components/skip_links/skip_links.module.scss +++ b/app/javascript/mastodon/features/ui/components/skip_links/skip_links.module.scss @@ -33,7 +33,7 @@ &:focus-within { outline: var(--outline-focus-default); - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } :any-link { diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 6fcab6d06643bf..751df777eeafd9 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages } from 'react-intl'; import classNames from 'classnames'; import { Redirect, Route, withRouter } from 'react-router-dom'; @@ -16,6 +16,7 @@ import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodo import { fetchNotifications } from 'mastodon/actions/notification_groups'; import { INTRODUCTION_VERSION } from 'mastodon/actions/onboarding'; import { AlertsController } from 'mastodon/components/alerts_controller'; +import { injectIntl } from '@/mastodon/components/intl'; import { Hotkeys } from 'mastodon/components/hotkeys'; import { HoverCardController } from 'mastodon/components/hover_card_controller'; import { PictureInPicture } from 'mastodon/features/picture_in_picture'; @@ -23,7 +24,6 @@ import { identityContextPropShape, withIdentity } from 'mastodon/identity_contex import { layoutFromWindow } from 'mastodon/is_mobile'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; import { checkAnnualReport } from '@/mastodon/reducers/slices/annual_report'; -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose'; import { clearHeight } from '../../actions/height_cache'; @@ -199,20 +199,6 @@ class SwitchingColumnsArea extends PureComponent { rootRedirect = '/about'; } - const profileRedesignRoutes = []; - if (isServerFeatureEnabled('profile_redesign')) { - profileRedesignRoutes.push( - , - - ) - } else { - // If profile editing is not enabled, redirect to the home timeline as the current editing pages are outside React Router. - profileRedesignRoutes.push( - , - , - ); - } - return ( @@ -276,10 +262,18 @@ class SwitchingColumnsArea extends PureComponent { - {...profileRedesignRoutes} + + + {areCollectionsEnabled() && + [ + , + , + , + ] + } @@ -311,13 +305,6 @@ class SwitchingColumnsArea extends PureComponent { - {areCollectionsEnabled() && - [ - , - , - - ] - } diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index 96ca010bdea298..e260c4df748901 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -1,5 +1,3 @@ -import { isServerFeatureEnabled } from '@/mastodon/utils/environment'; - export function EmojiPicker () { return import('../../emoji/emoji_picker'); } @@ -95,9 +93,6 @@ export function PinnedStatuses () { } export function AccountTimeline () { - if (isServerFeatureEnabled('profile_redesign')) { - return import('../../account_timeline/v2'); - } return import('../../account_timeline'); } diff --git a/app/javascript/mastodon/hooks/useCustomEmojis.ts b/app/javascript/mastodon/hooks/useCustomEmojis.ts new file mode 100644 index 00000000000000..df0eed613857fd --- /dev/null +++ b/app/javascript/mastodon/hooks/useCustomEmojis.ts @@ -0,0 +1,35 @@ +import { useEffect, useState } from 'react'; + +import type { ExtraCustomEmojiMap } from '../features/emoji/types'; + +let emojis: ExtraCustomEmojiMap | null = null; + +export function useCustomEmojis() { + const [, setLoaded] = useState(emojis !== null); + useEffect(() => { + if (!emojis) { + void loadEmojisIntoCache().then(() => { + setLoaded(true); + }); + } + }, []); + + return emojis; +} + +async function loadEmojisIntoCache() { + const { loadAllCustomEmoji } = await import('../features/emoji/database'); + const emojisRaw = await loadAllCustomEmoji(); + if (emojisRaw.length === 0) { + return; + } + + emojis = {}; + for (const emoji of emojisRaw) { + emojis[emoji.shortcode] = { + url: emoji.url, + shortcode: emoji.shortcode, + static_url: emoji.static_url, + }; + } +} diff --git a/app/javascript/mastodon/hooks/useSearchAccounts.ts b/app/javascript/mastodon/hooks/useSearchAccounts.ts index 1fc71f54ef1fca..c19f08e734f06c 100644 --- a/app/javascript/mastodon/hooks/useSearchAccounts.ts +++ b/app/javascript/mastodon/hooks/useSearchAccounts.ts @@ -1,4 +1,4 @@ -import { useRef, useState } from 'react'; +import { useCallback, useRef, useState } from 'react'; import { useDebouncedCallback } from 'use-debounce'; @@ -21,7 +21,7 @@ export function useSearchAccounts({ } = {}) { const dispatch = useAppDispatch(); - const [accountIds, setAccountIds] = useState([]); + const [accounts, setAccounts] = useState([]); const [loadingState, setLoadingState] = useState< 'idle' | 'loading' | 'error' >('idle'); @@ -37,7 +37,7 @@ export function useSearchAccounts({ if (value.trim().length === 0) { onSettled?.(''); if (resetOnInputClear) { - setAccountIds([]); + setAccounts([]); } return; } @@ -60,7 +60,7 @@ export function useSearchAccounts({ if (withRelationships) { dispatch(fetchRelationships(accountIds)); } - setAccountIds(accountIds); + setAccounts(accounts); setLoadingState('idle'); onSettled?.(value); }) @@ -73,9 +73,14 @@ export function useSearchAccounts({ { leading: true, trailing: true }, ); + const resetAccounts = useCallback(() => { + setAccounts([]); + }, []); + return { searchAccounts, - accountIds, + resetAccounts, + accounts, isLoading: loadingState === 'loading', isError: loadingState === 'error', }; diff --git a/app/javascript/mastodon/hooks/useSearchTags.ts b/app/javascript/mastodon/hooks/useSearchTags.ts index 2f029b07e836ca..78fc85ed511d21 100644 --- a/app/javascript/mastodon/hooks/useSearchTags.ts +++ b/app/javascript/mastodon/hooks/useSearchTags.ts @@ -91,8 +91,8 @@ export function useSearchTags({ // Add dedicated item for adding the current query const tags = useMemo(() => { const trimmedQuery = query ? trimHashFromStart(query.trim()) : ''; - if (!trimmedQuery || !fetchedTags.length) { - return fetchedTags; + if (!trimmedQuery) { + return fetchedTags as TagSearchResult[]; } const results: TagSearchResult[] = [...fetchedTags]; // Make array mutable diff --git a/app/javascript/mastodon/hooks/useTheme.ts b/app/javascript/mastodon/hooks/useTheme.ts new file mode 100644 index 00000000000000..9c67efaf58a57a --- /dev/null +++ b/app/javascript/mastodon/hooks/useTheme.ts @@ -0,0 +1,23 @@ +import { useEffect, useState } from 'react'; + +import { isDarkMode } from '../utils/theme'; + +export function useTheme() { + const [darkMode, setDarkMode] = useState(() => isDarkMode()); + + useEffect(() => { + const mutationObserver = new MutationObserver(() => { + setDarkMode(isDarkMode()); + }); + mutationObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-color-scheme'], + }); + + return () => { + mutationObserver.disconnect(); + }; + }, []); + + return darkMode ? 'dark' : 'light'; +} diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts index 36da60d3db896b..d656291124d4e5 100644 --- a/app/javascript/mastodon/initial_state.ts +++ b/app/javascript/mastodon/initial_state.ts @@ -78,6 +78,7 @@ interface Role { permissions: string; color: string; highlighted: boolean; + collection_limit: number; } interface InitialWrapstodonState { diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index b0e368263df1dd..5535b09a39aa04 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -22,8 +22,6 @@ "account.edit_profile": "Redigeer profiel", "account.enable_notifications": "Laat weet my wanneer @{name} iets plaas", "account.endorse": "Toon op profiel", - "account.featured_tags.last_status_at": "Laaste plasing op {date}", - "account.featured_tags.last_status_never": "Geen plasings nie", "account.follow": "Volg", "account.followers": "Volgers", "account.followers.empty": "Hierdie gebruiker het nog nie volgers nie.", @@ -42,7 +40,6 @@ "account.muted": "Uitgedoof", "account.open_original_page": "Maak oorspronklike blad oop", "account.posts": "Plasings", - "account.posts_with_replies": "Plasings en antwoorde", "account.report": "Rapporteer @{name}", "account.requested_follow": "{name} het versoek om jou te volg", "account.share": "Deel @{name} se profiel", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 9994e0fb3b1a07..6913197fff8473 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -22,8 +22,6 @@ "account.edit_profile": "Editar perfil", "account.enable_notifications": "Notificar-me quan @{name} publique bella cosa", "account.endorse": "Amostrar en perfil", - "account.featured_tags.last_status_at": "Zaguera publicación lo {date}", - "account.featured_tags.last_status_never": "Sin publicacions", "account.follow": "Seguir", "account.followers": "Seguidores", "account.followers.empty": "Encara no sigue dengún a este usuario.", @@ -42,7 +40,6 @@ "account.muted": "Silenciau", "account.open_original_page": "Ubrir pachina orichinal", "account.posts": "Publicacions", - "account.posts_with_replies": "Publicacions y respuestas", "account.report": "Denunciar a @{name}", "account.requested_follow": "{name} ha demandau seguir-te", "account.share": "Compartir lo perfil de @{name}", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index bfd0f8bd60a52b..fb08a71ee6ef48 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -18,19 +18,23 @@ "account.add_note": "إضافة ملاحظة شخصية", "account.add_or_remove_from_list": "الإضافة أو الإزالة من القائمة", "account.badges.admin": "مدير", + "account.badges.blocked": "محظور", "account.badges.bot": "آلي", + "account.badges.domain_blocked": "النطاق محظور", "account.badges.group": "فريق", + "account.badges.muted": "مكتوم", + "account.badges.muted_until": "مكتوم إلى غاية {until}", "account.block": "احجب @{name}", "account.block_domain": "حظر اسم النِّطاق {domain}", "account.block_short": "حظر", "account.blocked": "محظور", - "account.blocking": "محظور", "account.cancel_follow_request": "إلغاء طلب المتابعة", "account.copy": "نسخ الرابط إلى الملف الشخصي", "account.direct": "إشارة خاصة لـ @{name}", "account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}", - "account.domain_blocking": "نطاق محظور", + "account.edit_note": "تعديل الملاحظة الشخصية", "account.edit_profile": "تعديل الملف الشخصي", + "account.edit_profile_short": "تعديل", "account.enable_notifications": "أشعرني عندما ينشر @{name}", "account.endorse": "أوصِ به على صفحتك الشخصية", "account.familiar_followers_many": "يتبعه {name1}، {name2} و{othersCount, plural, one {شخص آخر تعرفه} other {# أشخاص آخرون تعرفهم}}", @@ -38,10 +42,9 @@ "account.familiar_followers_two": "يتبعه {name1} و {name2}", "account.featured": "معروض", "account.featured.accounts": "ملفات شخصية", - "account.featured.hashtags": "هاشتاقات", - "account.featured_tags.last_status_at": "آخر منشور في {date}", - "account.featured_tags.last_status_never": "لا توجد رسائل", "account.filters.all": "جميع الأنشطة", + "account.filters.boosts_toggle": "اعرض المعاد نشرها", + "account.filters.posts_boosts": "المنشورات والمعاد نشرها", "account.filters.posts_only": "منشورات", "account.filters.posts_replies": "المنشورات والردود", "account.filters.replies_toggle": "اعرض الردود", @@ -51,6 +54,7 @@ "account.follow_request": "طلب المتابعة", "account.follow_request_cancel": "إلغاء الطلب", "account.follow_request_cancel_short": "إلغاء", + "account.follow_request_short": "طلب المتابعة", "account.followers": "مُتابِعون", "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.", "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}", @@ -64,19 +68,37 @@ "account.in_memoriam": "في الذكرى.", "account.joined_short": "انضم في", "account.languages": "تغيير اللغات المشترَك فيها", + "account.last_active": "آخر نشاط", "account.link_verified_on": "تمَّ التَّحقق مِن مِلْكيّة هذا الرابط بتاريخ {date}", "account.locked_info": "تم ضبط حالة خصوصية هذا الحساب على أنه مؤمّن. إذ يراجع صاحبه يدويًا من يُسمح له بالمتابعة.", "account.media": "وسائط", "account.mention": "أذكُر @{name}", + "account.menu.add_to_list": "إضافة إلى القائمة…", + "account.menu.block": "حظر الحساب", + "account.menu.block_domain": "حظر {domain}", + "account.menu.copied": "تم نسخ رابط الحساب إلى الحافظة", "account.menu.copy": "نسخ الرابط", + "account.menu.direct": "إشارة خاصة لـ", + "account.menu.mention": "إشارة", + "account.menu.mute": "كتم الحساب", + "account.menu.note.description": "مرئي لك فقط", + "account.menu.remove_follower": "إزالة المتابِع", + "account.menu.report": "الإبلاغ عن الحساب", + "account.menu.share": "مشاركة…", + "account.menu.unblock": "رفع الحظر عن الحساب", + "account.menu.unblock_domain": "رفع الحظر عن {domain}", + "account.menu.unmute": "إلغاء كتم الحساب", "account.moved_to": "أشار {name} إلى أن حسابه الجديد الآن:", "account.mute": "أكتم @{name}", "account.mute_notifications_short": "كتم الإشعارات", "account.mute_short": "اكتم", "account.muted": "مَكتوم", - "account.muting": "مكتوم", "account.mutual": "أنتم تتابعون بعضكم البعض", + "account.name.copy": "نسخ المعرف", + "account.name_info": "ما معنى ذلك؟", "account.no_bio": "لم يتم تقديم وصف.", + "account.node_modal.edit_title": "تعديل الملاحظة الشخصية", + "account.node_modal.error_unknown": "تعذر حفظ الملاحظة", "account.node_modal.field_label": "ملاحظة شخصية", "account.node_modal.save": "حفظ", "account.node_modal.title": "إضافة ملاحظة شخصية", @@ -84,14 +106,14 @@ "account.note.title": "ملاحظة شخصية (مرئية لك فقط)", "account.open_original_page": "افتح الصفحة الأصلية", "account.posts": "منشورات", - "account.posts_with_replies": "المنشورات والرُدود", "account.remove_from_followers": "إزالة {name} من المتابعين", "account.report": "الإبلاغ عن @{name}", "account.requested_follow": "لقد طلب {name} متابعتك", - "account.requests_to_follow_you": "طلبات المتابعة", "account.share": "شارِك الملف التعريفي لـ @{name}", "account.show_reblogs": "اعرض إعادات نشر @{name}", "account.statuses_counter": "{count, plural, zero {}one {{counter} مشور} two {{counter} منشور} few {{counter} منشور} many {{counter} منشور} other {{counter} منشور}}", + "account.timeline.pinned": "مثبّت", + "account.timeline.pinned.view_all": "عرض جميع المنشورات المثبتة", "account.unblock": "إلغاء الحَظر عن @{name}", "account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}", "account.unblock_domain_short": "رفع الحظر", @@ -101,6 +123,65 @@ "account.unmute": "إلغاء الكَتم عن @{name}", "account.unmute_notifications_short": "إلغاء كَتم الإشعارات", "account.unmute_short": "إلغاء الكتم", + "account_edit.advanced_settings.bot_label": "حساب آلي", + "account_edit.advanced_settings.title": "الإعدادات المتقدمة", + "account_edit.bio.add_label": "إضافة سيرة ذاتية", + "account_edit.bio.edit_label": "تعديل السيرة الذاتية", + "account_edit.bio.title": "نبذة عنك", + "account_edit.bio_modal.add_title": "إضافة سيرة ذاتية", + "account_edit.bio_modal.edit_title": "تعديل السيرة الذاتية", + "account_edit.column_button": "تمّ", + "account_edit.column_title": "تعديل الملف الشخصي", + "account_edit.custom_fields.add_label": "إضافة حقل", + "account_edit.custom_fields.edit_label": "تعديل الحقل", + "account_edit.custom_fields.placeholder": "أضف ضمائر أو روابط خارجية أو أي شيء آخر ترغب في مشاركته.", + "account_edit.custom_fields.reorder_button": "إعادة ترتيب الحقول", + "account_edit.custom_fields.tip_title": "نصيحة: إضافة روابط متحقق منها", + "account_edit.custom_fields.title": "الحقول المخصصة", + "account_edit.custom_fields.verified_hint": "كيف يمكنني إضافة رابط متحقق منه؟", + "account_edit.display_name.add_label": "إضافة اسم علني", + "account_edit.display_name.edit_label": "تعديل الاسم العلني", + "account_edit.display_name.title": "الاسم العلني", + "account_edit.featured_hashtags.edit_label": "إضافة وسوم", + "account_edit.featured_hashtags.title": "الوسوم المروّجة", + "account_edit.field_actions.delete": "حذف الحقل", + "account_edit.field_actions.edit": "تعديل الحقل", + "account_edit.field_delete_modal.delete_button": "حذف", + "account_edit.field_delete_modal.title": "أتريد حذف الحقل المخصص؟", + "account_edit.field_edit_modal.add_title": "إضافة حقل مخصص", + "account_edit.field_edit_modal.discard_confirm": "تجاهل", + "account_edit.field_edit_modal.edit_title": "تعديل الحقل المخصص", + "account_edit.field_edit_modal.name_hint": "على سبيل المثال \"الموقع الشخصي\"", + "account_edit.field_edit_modal.name_label": "التسمية", + "account_edit.field_edit_modal.url_warning": "لإضافة رابط ، يرجى تضمين {protocol} في البداية.", + "account_edit.field_edit_modal.value_hint": "على سبيل المثال \"https://example.me\"", + "account_edit.field_edit_modal.value_label": "قيمة", + "account_edit.image_alt_modal.add_title": "إضافة نص بديل", + "account_edit.image_alt_modal.edit_title": "تعديل نص بديل", + "account_edit.image_alt_modal.text_label": "نص بديل", + "account_edit.image_delete_modal.delete_button": "حذف", + "account_edit.image_edit.add_button": "إضافة صورة", + "account_edit.image_edit.alt_add_button": "إضافة نص بديل", + "account_edit.image_edit.alt_edit_button": "تعديل نص بديل", + "account_edit.image_edit.remove_button": "إزالة الصورة", + "account_edit.image_edit.replace_button": "استبدال الصورة", + "account_edit.item_list.delete": "حذف {name}", + "account_edit.item_list.edit": "تعديل {name}", + "account_edit.profile_tab.button_label": "تخصيص", + "account_edit.save": "حفظ", + "account_edit.upload_modal.back": "العودة", + "account_edit.upload_modal.done": "تمّ", + "account_edit.upload_modal.next": "التالي", + "account_edit.upload_modal.step_crop.zoom": "تكبير", + "account_edit.upload_modal.step_upload.button": "تصفح الملفات", + "account_edit.upload_modal.step_upload.dragging": "إسقاط للتحميل", + "account_edit.upload_modal.step_upload.header": "اختيار صورة", + "account_edit.upload_modal.title_add.avatar": "إضافة صورة الملف الشخصي", + "account_edit.upload_modal.title_add.header": "إضافة صورة الغلاف", + "account_edit.upload_modal.title_replace.avatar": "استبدال صورة الملف الشخصي", + "account_edit.upload_modal.title_replace.header": "استبدال صورة الغلاف", + "account_edit_tags.add_tag": "إضافة #{tagName}", + "account_edit_tags.suggestions": "الاقتراحات:", "account_note.placeholder": "اضغط لإضافة مُلاحظة", "admin.dashboard.daily_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالأيام", "admin.dashboard.monthly_retention": "معدّل بقاء المستخدمين بعد إنشاء الحسابات، بالشهور", @@ -124,6 +205,10 @@ "alt_text_modal.describe_for_people_with_visual_impairments": "قم بوصفها للأشخاص ذوي الإعاقة البصرية…", "alt_text_modal.done": "تمّ", "announcement.announcement": "إعلان", + "annual_report.announcement.action_dismiss": "لا شكراً", + "annual_report.nav_item.badge": "جديد", + "annual_report.shared_page.donate": "تبرع", + "annual_report.summary.archetype.oracle.name": "الحكيم", "annual_report.summary.archetype.replier.name": "الفراشة", "annual_report.summary.close": "اغلق", "annual_report.summary.copy_link": "نسخ الرابط", @@ -165,13 +250,32 @@ "closed_registrations_modal.find_another_server": "ابحث على خادم آخر", "closed_registrations_modal.preamble": "ماستدون لامركزي، لذلك بغض النظر عن مكان إنشاء حسابك، سيكون بإمكانك المتابعة والتفاعل مع أي شخص على هذا الخادم. يمكنك حتى أن تستضيفه ذاتياً!", "closed_registrations_modal.title": "إنشاء حساب على ماستدون", + "collection.share_modal.share_link_label": "مشاركة الرابط", + "collection.share_modal.share_via_post": "نشر على ماستدون", + "collections.block_collection_owner": "حظر الحساب", + "collections.by_account": "مِن {account_handle}", "collections.collection_description": "الوصف", + "collections.collection_language": "اللغة", + "collections.collection_language_none": "لا شيء", "collections.collection_name": "الاسم", "collections.collection_topic": "الموضوع", "collections.content_warning": "تحذير عن المحتوى", "collections.continue": "مواصلة", + "collections.copy_link": "نسخ الرابط", + "collections.copy_link_confirmation": "نسخ الرابط إلى الحافظة", + "collections.create.basic_details_title": "المعلومات الأساسية", "collections.create.steps": "الخطوة {step}/{total}", + "collections.detail.revoke_inclusion": "أزلني", + "collections.detail.sensitive_content": "محتوى حساس", + "collections.edit_details": "تعديل التفاصيل", + "collections.hints.accounts_counter": "{count}/{max} حسابات", "collections.manage_accounts": "إدارة الحسابات", + "collections.remove_account": "إزالة", + "collections.sensitive": "حساس", + "collections.share_short": "مشاركة", + "collections.visibility_public": "للعامة", + "collections.visibility_title": "مدى الظهور", + "collections.visibility_unlisted": "غير مُدرَج", "column.about": "عن", "column.blocks": "المُستَخدِمون المَحظورون", "column.bookmarks": "الفواصل المرجعية", @@ -199,6 +303,9 @@ "column_header.show_settings": "إظهار الإعدادات", "column_header.unpin": "إلغاء التَّثبيت", "column_search.cancel": "إلغاء", + "combobox.close_results": "إغلاق النتائج", + "combobox.loading": "جاري التحميل", + "combobox.open_results": "فتح النتائج", "community.column_settings.local_only": "المحلي فقط", "community.column_settings.media_only": "الوسائط فقط", "community.column_settings.remote_only": "عن بُعد فقط", @@ -232,6 +339,7 @@ "confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟", "confirmations.delete.title": "أتريد حذف المنشور؟", "confirmations.delete_collection.confirm": "حذف", + "confirmations.delete_collection.title": "حذف \"{name}\"؟", "confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟", "confirmations.delete_list.title": "أتريد حذف القائمة؟", @@ -255,6 +363,9 @@ "confirmations.missing_alt_text.secondary": "انشر على أي حال", "confirmations.missing_alt_text.title": "أضف نصًا بديلًا؟", "confirmations.mute.confirm": "أكتم", + "confirmations.private_quote_notify.cancel": "العودة إلى التحرير", + "confirmations.private_quote_notify.confirm": "نشر المنشور", + "confirmations.private_quote_notify.do_not_show_again": "لا تظهر علي هذه الرسالة مجددًا", "confirmations.quiet_post_quote_info.dismiss": "لا تُذكرني مرة أخرى", "confirmations.quiet_post_quote_info.got_it": "مفهوم", "confirmations.quiet_post_quote_info.message": "عندما تقتبس منشورا هادئا للعامة، فإن منشورك سيكون أيضا مخفيا عن الخيوط الزمنية الرائجة.", @@ -265,6 +376,7 @@ "confirmations.remove_from_followers.confirm": "إزالة المتابع", "confirmations.remove_from_followers.message": "سيتوقف {name} عن متابعتك. هل بالتأكيد تريد المتابعة؟", "confirmations.remove_from_followers.title": "إزالة المتابع؟", + "confirmations.revoke_collection_inclusion.confirm": "أزلني", "confirmations.revoke_quote.confirm": "إزالة المنشور", "confirmations.revoke_quote.message": "لا يمكن التراجع عن هذا الإجراء.", "confirmations.revoke_quote.title": "أتريد إزالة المنشور؟", @@ -272,11 +384,13 @@ "content_warning.hide": "إخفاء المنشور", "content_warning.show": "إظهار على أي حال", "content_warning.show_more": "إظهار المزيد", + "content_warning.show_short": "إظهار", "conversation.delete": "احذف المحادثة", "conversation.mark_as_read": "اعتبرها كمقروءة", "conversation.open": "اعرض المحادثة", "conversation.with": "مع {names}", "copy_icon_button.copied": "نُسِخ إلى الحافظة", + "copy_icon_button.copy_this_text": "نسخ الرابط إلى الحافظة", "copypaste.copied": "تم نسخه", "copypaste.copy_to_clipboard": "نسخ إلى الحافظة", "directory.federated": "مِن الفديفرس المعروف", @@ -311,6 +425,10 @@ "domain_pill.your_server": "موطِنك الرقمي، حيث توجد فيه كافة منشوراتك. ألا يعجبك المكان؟ يمكنك الانتقال بين الخوادم في أي وقت واصطحاب متابعيك أيضاً.", "domain_pill.your_username": "معرفك الفريد على هذا الخادم. من الممكن العثور على مستخدمين بنفس إسم المستخدم على خوادم مختلفة.", "dropdown.empty": "حدد خيارا", + "email_subscriptions.email": "البريد الإلكتروني", + "email_subscriptions.form.action": "اشترك", + "email_subscriptions.submitted.title": "خطوة واحدة أخرى", + "email_subscriptions.validation.email.invalid": "عنوان البريد الإلكتروني غير صالح", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.preview": "إليك ما سيبدو عليه:", "emoji_button.activity": "الأنشطة", @@ -328,9 +446,6 @@ "emoji_button.search_results": "نتائج البحث", "emoji_button.symbols": "رموز", "emoji_button.travel": "الأماكن والسفر", - "empty_column.account_featured.me": "لم تعرض أي شيء حتى الآن. هل تعلم أنه يمكنك عرض الهاشتاقات التي تستخدمها، وحتى حسابات أصدقاءك على ملفك الشخصي؟", - "empty_column.account_featured.other": "{acct} لم يعرض أي شيء حتى الآن. هل تعلم أنه يمكنك عرض الهاشتاقات التي تستخدمها، وحتى حسابات أصدقاءك على ملفك الشخصي؟", - "empty_column.account_featured_other.unknown": "هذا الحساب لم يعرض أي شيء حتى الآن.", "empty_column.account_hides_collections": "اختار هذا المستخدم عدم إتاحة هذه المعلومات للعامة", "empty_column.account_suspended": "حساب معلق", "empty_column.account_timeline": "لا توجد منشورات هنا!", @@ -352,6 +467,7 @@ "empty_column.notification_requests": "لا يوجد شيء هنا. عندما تتلقى إشعارات جديدة، سوف تظهر هنا وفقًا لإعداداتك.", "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.", "empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات", + "empty_state.no_results": "لا توجد نتائج", "error.unexpected_crash.explanation": "نظرا لوجود خطأ في التعليمات البرمجية أو مشكلة توافق مع المتصفّح، تعذر عرض هذه الصفحة بشكل صحيح.", "error.unexpected_crash.explanation_addons": "لا يمكن عرض هذه الصفحة بشكل صحيح. من المحتمل أن يكون هذا الخطأ بسبب إضافة متصفح أو أدوات ترجمة تلقائية.", "error.unexpected_crash.next_steps": "حاول إعادة إنعاش الصفحة. إن لم تُحلّ المشكلة، يمكنك دائمًا استخدام ماستدون عبر متصفّح آخر أو تطبيق أصلي.", @@ -364,6 +480,8 @@ "explore.trending_statuses": "المنشورات", "explore.trending_tags": "وُسُوم", "featured_carousel.header": "{count, plural, zero {}one {منشور معروض} two {منشور معروضَين} few {منشورات معروضة} many {منشورات معروضة} other {منشورات معروضة}}", + "featured_tags.suggestions.add": "إضافة", + "featured_tags.suggestions.dismiss": "لا شكراً", "filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.", "filter_modal.added.context_mismatch_title": "عدم تطابق السياق!", "filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.", @@ -405,6 +523,7 @@ "follow_suggestions.view_all": "عرض الكل", "follow_suggestions.who_to_follow": "حسابات للمُتابَعة", "followed_tags": "الوسوم المتابَعة", + "following.title": "يتبعه {name}", "footer.about": "عن", "footer.about_mastodon": "عن ماستدون", "footer.about_server": "عن {domain}", @@ -718,12 +837,14 @@ "notifications_permission_banner.title": "لا تفوت شيئاً أبداً", "onboarding.follows.back": "عودة", "onboarding.follows.empty": "نأسف، لا يمكن عرض نتائج في الوقت الحالي. جرب البحث أو انتقل لصفحة الاستكشاف لإيجاد أشخاص للمتابعة، أو حاول مرة أخرى.", + "onboarding.follows.next": "التالي: إعداد ملفك الشخصي", "onboarding.follows.search": "بحث", "onboarding.follows.title": "للبدء قم بمتابعة أشخاص", "onboarding.profile.discoverable": "اجعل ملفي الشخصي قابلاً للاكتشاف", "onboarding.profile.discoverable_hint": "عندما تختار تفعيل إمكانية الاكتشاف على ماستدون، قد تظهر منشوراتك في نتائج البحث والمواضيع الرائجة، وقد يتم اقتراح ملفك الشخصي لأشخاص ذوي اهتمامات مماثلة معك.", "onboarding.profile.display_name": "الاسم العلني", "onboarding.profile.display_name_hint": "اسمك الكامل أو اسمك المرح…", + "onboarding.profile.finish": "إنهاء", "onboarding.profile.note": "نبذة عنك", "onboarding.profile.note_hint": "يمكنك @ذِكر أشخاص آخرين أو استعمال #الوسوم…", "onboarding.profile.title": "إعداد الملف الشخصي", @@ -864,6 +985,7 @@ "sign_in_banner.mastodon_is": "ماستودون هو أفضل وسيلة لمواكبة الأحداث.", "sign_in_banner.sign_in": "تسجيل الدخول", "sign_in_banner.sso_redirect": "تسجيل الدخول أو إنشاء حساب", + "skip_links.skip_to_content": "تخطي إلى المحتوى الرئيسي", "status.admin_account": "افتح الواجهة الإدارية لـ @{name}", "status.admin_domain": "فتح واجهة الإشراف لـ {domain}", "status.admin_status": "افتح هذا المنشور على واجهة الإشراف", @@ -873,6 +995,12 @@ "status.cancel_reblog_private": "إلغاء إعادة النشر", "status.cannot_quote": "غير مصرح لك باقتباس هذا المنشور", "status.cannot_reblog": "لا يمكن إعادة نشر هذا المنشور", + "status.contains_quote": "يحتوي على اقتباس", + "status.context.loading": "تحميل المزيد من الردود", + "status.context.loading_success": "تم تحميل ردود جديدة", + "status.context.more_replies_found": "تم العثور على المزيد من الردود", + "status.context.retry": "حاول مجددًا", + "status.context.show": "إظهار", "status.continued_thread": "تكملة للخيط", "status.copy": "انسخ رابط الرسالة", "status.delete": "احذف", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 850971819ae53a..444b40aabb4e7d 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -25,7 +25,6 @@ "account.edit_profile": "Editar el perfil", "account.enable_notifications": "Avisame cuando @{name} espublice artículos", "account.endorse": "Destacar nel perfil", - "account.featured_tags.last_status_never": "Nun hai nenguna publicación", "account.follow": "Siguir", "account.follow_back": "Siguir tamién", "account.follow_request_short": "Solicitú", @@ -48,7 +47,6 @@ "account.no_bio": "Nun se fornió nenguna descripción.", "account.open_original_page": "Abrir la páxina orixinal", "account.posts": "Artículos", - "account.posts_with_replies": "Artículos y rempuestes", "account.report": "Informar de @{name}", "account.requested_follow": "{name} solicitó siguite", "account.share": "Compartir el perfil de @{name}", diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index e664b6bd0cb8cd..41dc1c7d402bfd 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -14,20 +14,27 @@ "about.powered_by": "{mastodon} tərəfindən təchiz edilən desentralizasiya edilmiş sosial media", "about.rules": "Server qaydaları", "account.account_note_header": "Şəxsi qeyd", + "account.activity": "Fəaliyyət", + "account.add_note": "Fərdi bir not əlavə et", "account.add_or_remove_from_list": "Siyahılara əlavə et və ya sil", + "account.badges.admin": "Admin", + "account.badges.blocked": "Əngəlləndi", "account.badges.bot": "Avtomatlaşdırılmış", + "account.badges.domain_blocked": "Əngəllənmiş domen", "account.badges.group": "Qrup", + "account.badges.muted": "Səssizdə", + "account.badges.muted_until": "{until} qədər səssizdə", "account.block": "@{name} istifadəçisini blokla", "account.block_domain": "{domain} domenini blokla", "account.block_short": "Blok", "account.blocked": "Bloklanıb", - "account.blocking": "Əngəlləmə", "account.cancel_follow_request": "İzləməni ləğv et", "account.copy": "Profil linkini kopyala", "account.direct": "@{name} istifadəçisini fərdi olaraq etiketlə", "account.disable_notifications": "@{name} paylaşım edəndə mənə bildiriş göndərməyi dayandır", - "account.domain_blocking": "Domenin bloklanması", + "account.edit_note": "Fərdi nota düzəliş", "account.edit_profile": "Profili redaktə et", + "account.edit_profile_short": "Düzəliş", "account.enable_notifications": "@{name} paylaşım edəndə mənə bildiriş göndər", "account.endorse": "Profildə seçilmişlərə əlavə et", "account.familiar_followers_many": "{name1}, {name2} və tanıdığınız digər {othersCount, plural, one {digər bir nəfər} other {# nəfər}} izləyir", @@ -35,11 +42,22 @@ "account.familiar_followers_two": "{name1} və {name2} izləyir", "account.featured": "Seçilmiş", "account.featured.accounts": "Profillər", - "account.featured.hashtags": "Etiketler", - "account.featured_tags.last_status_at": "Son paylaşım {date} tarixində olub", - "account.featured_tags.last_status_never": "Paylaşım yoxdur", + "account.featured.collections": "Kolleksiyalar", + "account.featured.new_collection": "Yeni kolleksiya", + "account.field_overflow": "Tam məzmunu göstər", + "account.filters.all": "Bütün fəaliyyət", + "account.filters.boosts_toggle": "Təkrar paylaşmaları göstər", + "account.filters.posts_boosts": "Göndərişlər və təkrar paylaşmalar", + "account.filters.posts_only": "Göndərişlər", + "account.filters.posts_replies": "Göndərişlər və cavablar", + "account.filters.replies_toggle": "Cavabları göstər", "account.follow": "İzlə", "account.follow_back": "Sən də izlə", + "account.follow_back_short": "Geri izlə", + "account.follow_request": "İzləmə istəyi", + "account.follow_request_cancel": "İstəyi ləğv et", + "account.follow_request_cancel_short": "İmtina", + "account.follow_request_short": "İstək", "account.followers": "İzləyicilər", "account.followers.empty": "Bu istifadəçini hələ ki, heç kim izləmir.", "account.followers_counter": "{count, plural, one {{counter} izləyici} other {{counter} izləyici}}", @@ -51,27 +69,51 @@ "account.go_to_profile": "Profilə get", "account.hide_reblogs": "@{name} - təkrar paylaşımlarını gizlət", "account.in_memoriam": "Xatirə.", + "account.join_modal.day": "Gün", + "account.join_modal.me": "{server} - qoşuldunuz", + "account.join_modal.me_anniversary": "Fediversary-niz mübarək! {server} - qoşuldunuz", + "account.join_modal.me_today": "{server} üzərində ilk gününüzdür!", + "account.join_modal.other": "{name}, {server} serverinə qoşuldu", + "account.join_modal.other_today": "{name} - {server} serverində ilk günüdür!", + "account.join_modal.share.celebrate": "Qeyd etmək üçün göndəriş paylaş", + "account.join_modal.share.intro": "Tanıtım üçün göndəriş paylaş", + "account.join_modal.share.welcome": "Xoş gəlmisiniz göndərişi paylaş", + "account.join_modal.years": "{number, plural, one {il} other {il}}", "account.joined_short": "Qoşulub", "account.languages": "Abunə olunmuş dilləri dəyiş", + "account.last_active": "Son aktivlik", "account.link_verified_on": "Bu linkin dəqiqliyi {date} tarixində yoxlanılıb", "account.locked_info": "Bu hesabın məxfilik statusu kilidlənib. Sahibi, onu kimin izləyə biləcəyini manual olaraq incələyir.", "account.media": "Media", "account.mention": "@{name} istifadəçisini teq et", + "account.menu.add_to_list": "Siyahıya əlavə et…", + "account.menu.block": "Hesabı əngəllə", + "account.menu.block_domain": "{domain} - əngəllə", + "account.menu.copied": "Hesab keçidi lövhəyə kopyalandı", + "account.menu.copy": "Keçidi kopyala", + "account.menu.direct": "Adını özəl olaraq çək", + "account.menu.hide_reblogs": "Zaman xəttində təkrar paylaşmaları gizlət", + "account.menu.mention": "Adçəkmə", + "account.menu.mute": "Hesabı səssizə al", + "account.menu.note.description": "Yalnız sizə görünəndir", + "account.menu.open_original_page": "Burada bax: {domain}", + "account.menu.remove_follower": "İzləyicini çıxart", + "account.menu.report": "Hesabı bildir", + "account.menu.share": "Paylaş…", + "account.menu.show_reblogs": "Zaman xəttində təkrar paylaşmaları göstər", + "account.menu.unblock": "Hesabın əngəlini götür", "account.moved_to": "{name} onun yeni hesabının artıq bu olduğunu bildirdi:", "account.mute": "@{name} istifadəçisini susdur", "account.mute_notifications_short": "Bildirişləri səssizləşdir", "account.mute_short": "Səssizləşdir", "account.muted": "Səssizləşdirilib", - "account.muting": "Səssizə alınır", "account.mutual": "Bir-birinizi izləyirsiniz", "account.no_bio": "Təsvir göstərilməyib.", "account.open_original_page": "Orijinal səhifəni aç", "account.posts": "Paylaşım", - "account.posts_with_replies": "Paylaşım və cavablar", "account.remove_from_followers": "{name} - izləyicilərdən çıxart", "account.report": "@{name} istifadəçisini şikayət et", "account.requested_follow": "{name} sizi izləmək sorğusu göndərib", - "account.requests_to_follow_you": "Sizi izləmək istəyir", "account.share": "@{name} profilini paylaş", "account.show_reblogs": "@{name} - təkrar paylaşımlarını göstər", "account.statuses_counter": "{count, plural, one {{counter} paylaşım} other {{counter} paylaşım}}", @@ -84,6 +126,12 @@ "account.unmute": "@{name} səssizləşdirmədən çıxart", "account.unmute_notifications_short": "Bildirişlərin səsini aç", "account.unmute_short": "Səssizləşdirmədən çıxart", + "account_edit.field_delete_modal.title": "Özəl xananı sil?", + "account_edit.field_edit_modal.add_title": "Özəl xana əlavə et", + "account_edit.field_edit_modal.discard_confirm": "İmtina", + "account_edit.field_edit_modal.discard_message": "Saxlanılmamış dəyişiklikləriniz var. Onları silmək istədiyinizə əminsiniz?", + "account_edit.field_edit_modal.edit_title": "Özəl xanaya düzəliş", + "account_edit.field_edit_modal.length_warning": "Tövsiyə edilən xarakter limiti aşıldı. Mobil istifadəçilər xananızın tamamını görməyə bilər.", "account_note.placeholder": "Qeyd əlavə etmək üçün kliklə", "admin.dashboard.daily_retention": "Qeydiyyatdan sonrakı günə görə istifadəçi qalma dərəcəsi", "admin.dashboard.monthly_retention": "Qeydiyyatdan sonrakı aya görə istifadəçi qalma dərəcəsi", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index aa510b681f25fa..e0c3b8792b5ae5 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -28,26 +28,22 @@ "account.block_domain": "Заблакіраваць дамен {domain}", "account.block_short": "Заблакіраваць", "account.blocked": "Заблакіраваны", - "account.blocking": "Блакіраванне", "account.cancel_follow_request": "Скасаваць запыт на падпіску", "account.copy": "Скапіраваць спасылку на профіль", "account.direct": "Згадаць прыватна @{name}", "account.disable_notifications": "Не паведамляць мне пра публікацыі @{name}", - "account.domain_blocking": "Блакіраванне дамена", "account.edit_note": "Рэдагаваць асабістую нататку", "account.edit_profile": "Рэдагаваць профіль", "account.edit_profile_short": "Рэдагаваць", "account.enable_notifications": "Апавяшчаць мяне пра допісы @{name}", - "account.endorse": "Паказваць у профілі", + "account.endorse": "Дадаць у \"Выбранае\" ў профілі", "account.familiar_followers_many": "Мае сярод падпісчыкаў {name1}, {name2}, і {othersCount, plural, one {яшчэ #-го чалавека, знаёмага Вам} few {яшчэ #-х чалавек, знаёмых Вам} many {яшчэ # людзей, знаёмых Вам} other {яшчэ # чалавек, знаёмых Вам}}", "account.familiar_followers_one": "Мае сярод падпісчыкаў {name1}", "account.familiar_followers_two": "Мае сярод падпісчыкаў {name1} і {name2}", - "account.featured": "Рэкамендаванае", + "account.featured": "Выбранае", "account.featured.accounts": "Профілі", "account.featured.collections": "Калекцыі", - "account.featured.hashtags": "Хэштэгі", - "account.featured_tags.last_status_at": "Апошні допіс ад {date}", - "account.featured_tags.last_status_never": "Няма допісаў", + "account.featured.new_collection": "Новая калекцыя", "account.field_overflow": "Паказаць усё змесціва", "account.filters.all": "Уся актыўнасць", "account.filters.boosts_toggle": "Паказваць пашырэнні", @@ -73,8 +69,19 @@ "account.go_to_profile": "Перайсці да профілю", "account.hide_reblogs": "Схаваць пашырэнні ад @{name}", "account.in_memoriam": "У памяць.", + "account.join_modal.day": "Дзень", + "account.join_modal.me": "Вы далучыліся да {server}", + "account.join_modal.me_anniversary": "З гадавінай! Вы далучыліся да {server}", + "account.join_modal.me_today": "Сёння Ваш першы дзень на {server}!", + "account.join_modal.other": "{name} далучыў(-ла)ся да {server}", + "account.join_modal.other_today": "Сёння першы дзень {name} на {server}!", + "account.join_modal.share.celebrate": "Абагуліць урачысты допіс", + "account.join_modal.share.intro": "Абагуліць допіс, каб прадставіцца", + "account.join_modal.share.welcome": "Абагуліць прывітальны допіс", + "account.join_modal.years": "{number, plural, one {# год} few {# гады} many {# гадоў} other {# гады}}", "account.joined_short": "Далучыўся", "account.languages": "Змяніць выбраныя мовы", + "account.last_active": "Апошняя актыўнасць", "account.link_verified_on": "Права ўласнасці на гэтую спасылку праверана {date}", "account.locked_info": "Гэты ўліковы запіс пазначаны як схаваны. Уладальнік сам вырашае, хто можа падпісвацца на яго.", "account.media": "Медыя", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Не апавяшчаць", "account.mute_short": "Ігнараваць", "account.muted": "Ігнаруецца", - "account.muting": "Ігнараванне", "account.mutual": "Вы падпісаныя адно на аднаго", + "account.name.copy": "Скапір. ідэнтыфікатар", "account.name.help.domain": "{domain} — сервер, які ўтрымлівае профіль і допісы гэтага карыстальніка.", "account.name.help.domain_self": "{domain} — Ваш сервер, які ўтрымлівае Ваш профіль і допісы.", - "account.name.help.footer": "Гэтак жа, як Вы можаце адпраўляць электронныя лісты людзям праз розныя кліенты электроннай пошты, Вы таксама можаце ўзаемадзейнічаць з людзьмі з іншых сервераў Mastodon, а таксама з усімі, хто карыстаецца іншымі сацыяльнымі сеткамі, якія працуюць па тых жа правілах, што і Mastodon (пратакол ActivityPub).", + "account.name.help.footer": "Гэтак жа, як Вы можаце дасылаць электронныя лісты людзям, у якіх паштовыя скрыні ад іншых правайдараў, Вы можаце ўзаемадзейнічаць з людзьмі з іншых сервераў Mastodon і з усімі, хто карыстаецца сацыяльнымі платформамі, сумяшчальнымі з Mastodon.", "account.name.help.header": "Ідэнтыфікатар карыстальніка падобны да адраса электроннай пошты", "account.name.help.username": "{username} — імя карыстальніка гэтага ўліковага запісу на гэтым серверы. У некага на іншым серверы яно можа быць такім жа.", "account.name.help.username_self": "{username} — Вашае імя карыстальніка на гэтым серверы. У некага на іншым серверы яно можа быць такім жа.", @@ -122,11 +129,9 @@ "account.note.title": "Асабістая нататка (бачная толькі Вам)", "account.open_original_page": "Адкрыць арыгінальную старонку", "account.posts": "Допісы", - "account.posts_with_replies": "Допісы і адказы", "account.remove_from_followers": "Выдаліць {name} з падпісчыкаў", "account.report": "Паскардзіцца на @{name}", "account.requested_follow": "{name} адправіў(-ла) запыт на падпіску", - "account.requests_to_follow_you": "Хоча падпісацца на вас", "account.share": "Абагуліць профіль @{name}", "account.show_reblogs": "Паказаць падштурхоўванні ад @{name}", "account.statuses_counter": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", @@ -136,39 +141,47 @@ "account.unblock_domain": "Разблакіраваць дамен {domain}", "account.unblock_domain_short": "Разблакіраваць", "account.unblock_short": "Разблакіраваць", - "account.unendorse": "Не паказваць у профілі", + "account.unendorse": "Прыбраць з \"Выбранага\" ў профілі", "account.unfollow": "Адпісацца", "account.unmute": "Не ігнараваць @{name}", "account.unmute_notifications_short": "Апавяшчаць", "account.unmute_short": "Не ігнараваць", + "account_edit.advanced_settings.bot_hint": "Пакажыце іншым, што гэты ўліковы запіс у асноўным выконвае аўтаматычныя дзеянні і можа не кантралявацца", + "account_edit.advanced_settings.bot_label": "Аўтаматызаваны ўліковы запіс", + "account_edit.advanced_settings.title": "Дадатковыя налады", + "account_edit.bio.add_label": "Апісаць сябе", + "account_edit.bio.edit_label": "Змяніць апісанне", "account_edit.bio.placeholder": "Коратка апішыце сябе, каб дапамагчы іншым пазнаць Вас.", "account_edit.bio.title": "Хто я", "account_edit.bio_modal.add_title": "Апісаць сябе", "account_edit.bio_modal.edit_title": "Змяніць апісанне", - "account_edit.button.add": "Дадаць {item}", - "account_edit.button.delete": "Выдаліць {item}", - "account_edit.button.edit": "Змяніць {item}", "account_edit.column_button": "Гатова", "account_edit.column_title": "Рэдагаваць профіль", - "account_edit.custom_fields.name": "поле", + "account_edit.custom_fields.add_label": "Дадаць поле", + "account_edit.custom_fields.edit_label": "Рэдагаваць поле", "account_edit.custom_fields.placeholder": "Дадайце свае займеннікі, знешнія спасылкі ці нешта іншае, чым Вы хацелі б падзяліцца.", "account_edit.custom_fields.reorder_button": "Змяніць парадак палёў", "account_edit.custom_fields.tip_content": "Вы можаце лёгка дадаць даверу да свайго ўліковага запісу Mastodon пацвярджэннем спасылак на любы з Вашых сайтаў.", "account_edit.custom_fields.tip_title": "Падказка: Дадаванне пацверджаных спасылак", "account_edit.custom_fields.title": "Адвольныя палі", "account_edit.custom_fields.verified_hint": "Як мне дадаць пацверджаную спасылку?", + "account_edit.display_name.add_label": "Дадаць бачнае імя", + "account_edit.display_name.edit_label": "Рэдагаваць бачнае імя", "account_edit.display_name.placeholder": "Вашае бачнае імя — гэта імя, якое іншыя людзі бачаць у Вашым профілі і ў стужках.", "account_edit.display_name.title": "Бачнае імя", - "account_edit.featured_hashtags.item": "хэштэгі", - "account_edit.featured_hashtags.placeholder": "Дапамажыце іншым зразумець, якія тэмы Вас цікавяць, і атрымаць доступ да іх.", + "account_edit.featured_hashtags.edit_label": "Дадаць хэштэгі", + "account_edit.featured_hashtags.placeholder": "Дапамажыце іншым зразумець, якія тэмы Вас цікавяць, і атрымаць хуткі доступ да іх.", "account_edit.featured_hashtags.title": "Выбраныя хэштэгі", + "account_edit.field_actions.delete": "Выдаліць поле", + "account_edit.field_actions.edit": "Рэдагаваць поле", "account_edit.field_delete_modal.confirm": "Вы ўпэўненыя, што хочаце выдаліць гэтае адвольнае поле? Гэтае дзеянне будзе незваротным.", "account_edit.field_delete_modal.delete_button": "Выдаліць", "account_edit.field_delete_modal.title": "Выдаліць адвольнае поле?", "account_edit.field_edit_modal.add_title": "Дадаць адвольнае поле", + "account_edit.field_edit_modal.discard_confirm": "Адхіліць", + "account_edit.field_edit_modal.discard_message": "У Вас ёсць незахаваныя змены. Вы сапраўды хочаце адхіліць іх?", "account_edit.field_edit_modal.edit_title": "Рэдагаваць адвольнае поле", - "account_edit.field_edit_modal.limit_header": "Перавышаная рэкамендаваная колькасць сімвалаў", - "account_edit.field_edit_modal.limit_message": "Карыстальнікі мабільных прылад могуць не ўбачыць Вашае поле цалкам.", + "account_edit.field_edit_modal.length_warning": "Перавышаны рэкамендаваны ліміт сімвалаў. Карыстальнікі мабільных прылад могуць не пабачыць Вашае поле цалкам.", "account_edit.field_edit_modal.link_emoji_warning": "Мы раім не ўжываць адвольныя эмодзі разам з url-спасылкамі. Адвольныя палі, якія ўтрымліваюць і тое, і другое, будуць адлюстраваныя выключна як тэкст, а не спасылкі, каб не блытаць карыстальнікаў.", "account_edit.field_edit_modal.name_hint": "Напрыклад, \"Асабісты Сайт\"", "account_edit.field_edit_modal.name_label": "Назва", @@ -197,19 +210,19 @@ "account_edit.image_edit.alt_edit_button": "Рэдагаваць альт. тэкст", "account_edit.image_edit.remove_button": "Прыбраць відарыс", "account_edit.image_edit.replace_button": "Замяніць відарыс", + "account_edit.item_list.delete": "Выдаліць {name}", + "account_edit.item_list.edit": "Рэдагаваць {name}", "account_edit.name_modal.add_title": "Дадаць бачнае імя", "account_edit.name_modal.edit_title": "Змяніць бачнае імя", "account_edit.profile_tab.button_label": "Змяніць", "account_edit.profile_tab.hint.description": "Гэтыя налады змяняюць тое, што бачаць карыстальнікі {server} у афіцыйных праграм, але гэта можа не ўплываць на карыстальнікаў іншых сервераў і неафіцыйных праграм.", "account_edit.profile_tab.hint.title": "Знешні выгляд можа адрознівацца", - "account_edit.profile_tab.show_featured.description": "\"Рэкамендаванае\" — гэта неабавязковая ўкладка, куды вы можаце дадаць для паказу іншыя ўліковыя запісы.", - "account_edit.profile_tab.show_featured.title": "Паказваць укладку \"Рэкамендаванае\"", + "account_edit.profile_tab.show_featured.description": "\"Выбранае\" — гэта неабавязковая ўкладка, куды вы можаце дадаць для паказу іншыя ўліковыя запісы.", + "account_edit.profile_tab.show_featured.title": "Паказваць укладку \"Выбранае\"", "account_edit.profile_tab.show_media.description": "\"Медыя\" — гэта неабавязковая ўкладка, якая паказвае Вашыя допісы, у якіх ёсць відарысы і відэа.", "account_edit.profile_tab.show_media.title": "Паказваць укладку \"Медыя\"", "account_edit.profile_tab.show_media_replies.description": "Калі ўключыць, укладка \"Медыя\" будзе адлюстроўваць як Вашыя допісы, гэтак і Вашыя адказы на допісы іншых людзей.", "account_edit.profile_tab.show_media_replies.title": "Змяшчаць адказы ва ўкладцы \"Медыя\"", - "account_edit.profile_tab.subtitle": "Змяняйце на свой густ укладкі свайго профілю і тое, што яны паказваюць.", - "account_edit.profile_tab.title": "Налады ўкладкі профілю", "account_edit.save": "Захаваць", "account_edit.upload_modal.back": "Назад", "account_edit.upload_modal.done": "Гатова", @@ -219,8 +232,10 @@ "account_edit.upload_modal.step_upload.dragging": "Перацягн. сюды, каб запамп.", "account_edit.upload_modal.step_upload.header": "Выбраць відарыс", "account_edit.upload_modal.step_upload.hint": "Фармату WEBP, PNG, GIF або JPG, да {limit} МБ.{br}Відарыс будзе сціснуты да памеру {width}x{height} пікселяў.", - "account_edit.upload_modal.title_add": "Дадаць фота профілю", - "account_edit.upload_modal.title_replace": "Замяніць фота профілю", + "account_edit.upload_modal.title_add.avatar": "Дадаць фота профілю", + "account_edit.upload_modal.title_add.header": "Дадаць фота вокладкі", + "account_edit.upload_modal.title_replace.avatar": "Замяніць фота профілю", + "account_edit.upload_modal.title_replace.header": "Замяніць фота вокладкі", "account_edit.verified_modal.details": "Дадайце даверу да Вашага профілю Mastodon, пацвярджэннем спасылак на ўласныя сайты. Вось як гэта працуе:", "account_edit.verified_modal.invisible_link.details": "Дадайце спасылку ў свой загаловак. Важнай часткай з'яўляецца rel=\"me\", яна прадухіляе выдачу сябе за іншую асобу на сайтах з карыстальніцкім кантэнтам. Вы нават можаце выкарыстоўваць тэг link у загалоўку старонкі замест {tag}, але HTML код павінен быць даступным без выканання JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Як мне зрабіць спасылку нябачнай?", @@ -229,11 +244,13 @@ "account_edit.verified_modal.step2.header": "Дадаць свой сайт як адвольнае поле", "account_edit.verified_modal.title": "Як дадаць пацверджаную спасылку", "account_edit_tags.add_tag": "Дадаць #{tagName}", - "account_edit_tags.column_title": "Змяніць выбраныя хэштэгі", + "account_edit_tags.column_title": "Рэдагаваць тэгі", "account_edit_tags.help_text": "Выбраныя хэштэгі дапамагаюць карыстальнікам знаходзіць Ваш профіль і ўзаемадзейнічаць з ім. Яны дзейнічаюць як фільтры пры праглядзе актыўнасці на Вашай старонцы.", + "account_edit_tags.max_tags_reached": "У Вас максімальная колькасць выбраных хэштэгаў.", "account_edit_tags.search_placeholder": "Увядзіце хэштэг…", "account_edit_tags.suggestions": "Прапановы:", "account_edit_tags.tag_status_count": "{count, plural, one {допіс} few {допісы} many {допісаў} other {допісаў}}", + "account_list.total": "{total, plural,one {# уліковы запіс} few{# уліковыя запісы} other {# уліковых запісаў}}", "account_note.placeholder": "Націсніце, каб дадаць нататку", "admin.dashboard.daily_retention": "Штодзённы паказчык утрымання карыстальнікаў пасля рэгістрацыі", "admin.dashboard.monthly_retention": "Штомесячны паказчык утрымання карыстальнікаў пасля рэгістрацыі", @@ -338,7 +355,7 @@ "closed_registrations_modal.find_another_server": "Знайсці іншы сервер", "closed_registrations_modal.preamble": "Mastodon дэцэнтралізаваны, так што дзе б вы ні стварылі ўліковы запіс, вы зможаце падпісвацца і камунікаваць з кім хочаце на гэтым серверы. Вы нават можаце стварыць свой!", "closed_registrations_modal.title": "Рэгістрацыя ў Mastodon", - "collection.share_modal.share_link_label": "Падзяліцца спасылкай", + "collection.share_modal.share_link_label": "Абагуліць спасылку", "collection.share_modal.share_via_post": "Апублікаваць у Mastodon", "collection.share_modal.share_via_system": "Падзяліцца ў…", "collection.share_modal.title": "Падзяліцца калекцыяй", @@ -346,8 +363,11 @@ "collection.share_template_other": "Глядзі, якая класная калекцыя: {link}", "collection.share_template_own": "Глядзі, у мяне новая калекцыя: {link}", "collections.account_count": "{count, plural,one {# уліковы запіс} few {# уліковыя запісы} other {# уліковых запісаў}}", - "collections.accounts.empty_description": "Дадайце да {count} уліковых запісаў, на якія Вы падпісаныя", + "collections.accounts.empty_description": "Дадайце да {count} уліковых запісаў", + "collections.accounts.empty_editor_title": "У гэтай калекцыі пакуль нікога няма", "collections.accounts.empty_title": "Гэтая калекцыя пустая", + "collections.block_collection_owner": "Заблакіраваць профіль", + "collections.by_account": "ад {account_handle}", "collections.collection_description": "Апісанне", "collections.collection_language": "Мова", "collections.collection_language_none": "Няма", @@ -356,47 +376,55 @@ "collections.confirm_account_removal": "Упэўненыя, што хочаце прыбраць гэты ўліковы запіс з гэтай калекцыі?", "collections.content_warning": "Папярэджанне аб змесціве", "collections.continue": "Працягнуць", - "collections.create.accounts_subtitle": "Можна дадаць толькі ўліковыя запісы, на якія Вы падпісаныя і якія далі дазвол на тое, каб іх можна было знайсці.", - "collections.create.accounts_title": "Каго Вы дадасце ў гэтую калекцыю?", + "collections.copy_link": "Капіяваць спасылку", + "collections.copy_link_confirmation": "Калекцыя скапіяваная ў буфер абмену", + "collections.create.accounts_title": "Каго Вы ўключыце ў гэтую калекцыю?", "collections.create.basic_details_title": "Асноўныя звесткі", "collections.create.steps": "Крок {step}/{total}", - "collections.create_a_collection_hint": "Стварыце калекцыю, каб параіць або падзяліцца сваімі любімымі ўліковымі запісамі з іншымі.", "collections.create_collection": "Стварыць калекцыю", "collections.delete_collection": "Выдаліць калекцыю", "collections.description_length_hint": "Максімум 100 сімвалаў", - "collections.detail.accept_inclusion": "Добра", - "collections.detail.accounts_heading": "Уліковыя запісы", - "collections.detail.author_added_you": "{author} дадаў(-ла) Вас у гэтую калекцыю", - "collections.detail.curated_by_author": "Курыруе {author}", - "collections.detail.curated_by_you": "Курыруеце Вы", + "collections.detail.author_added_you_on_date": "{author} дадаў(-ла) Вас {date}", "collections.detail.loading": "Загружаецца калекцыя…", - "collections.detail.other_accounts_in_collection": "Іншыя ў гэтай калекцыі:", "collections.detail.revoke_inclusion": "Прыбраць сябе", + "collections.detail.sensitive_content": "Адчувальнае змесціва", "collections.detail.sensitive_note": "У гэтай калекцыі прысутнічаюць уліковыя запісы і кантэнт, змесціва якіх можа падацца адчувальным для некаторых карыстальнікаў.", "collections.detail.share": "Падзяліцца гэтай калекцыяй", + "collections.detail.you_are_in_this_collection": "Вас уключылі ў гэтую калекцыю", "collections.edit_details": "Рэдагаваць падрабязнасці", - "collections.error_loading_collections": "Адбылася памылка падчас загрузкі Вашых калекцый.", - "collections.hints.accounts_counter": "{count} / {max} уліковых запісаў", + "collections.hidden_accounts_description": "Вы заблакіравалі або ігнаруеце {count, plural, one {гэтага карыстальніка} other {гэтых карыстальнікаў}}", + "collections.hidden_accounts_link": "{count, plural, one {# схаваны ўліковы запіс} few {# схаваныя ўліковыя запісы} other {# схаваных уліковых запісаў}}", + "collections.hints.accounts_counter": "{count}/{max} уліковых запісаў", "collections.last_updated_at": "Апошняе абнаўленне: {date}", + "collections.list.collections_with_count": "{count, plural, one {калекцыя} few {калекцыі} many {калекцыяў} other {калекцыі}}", + "collections.list.created_by_author": "Створаныя {name}", + "collections.list.created_by_you": "Створаныя Вамі", + "collections.list.featuring_you": "У якіх ёсць Вы", "collections.manage_accounts": "Кіраванне ўліковымі запісамі", "collections.mark_as_sensitive": "Пазначыць як адчувальную", "collections.mark_as_sensitive_hint": "Схаваць апісанне калекцыі і ўліковыя запісы за банерам з папярэджаннем. Назва калекцыі застанецца бачнай.", + "collections.maximum_collection_count_description": "Ваш сервер дазваляе ствараць да {count} калекцый.", + "collections.maximum_collection_count_reached": "Вы стварылі максімальную колькасць калекцый", "collections.name_length_hint": "Максімум 40 сімвалаў", "collections.new_collection": "Новая калекцыя", - "collections.no_collections_yet": "Пакуль няма калекцый.", - "collections.old_last_post_note": "Апошні допіс быў больш за тыдзень таму", - "collections.remove_account": "Прыбраць гэты ўліковы запіс", + "collections.remove_account": "Выдаліць", "collections.report_collection": "Паскардзіцца на гэту калекцыю", "collections.revoke_collection_inclusion": "Прыбраць сябе з гэтай калекцыі", "collections.revoke_inclusion.confirmation": "Вас прыбралі з \"{collection}\"", "collections.revoke_inclusion.error": "Адбылася памылка, калі ласка, спрабуйце яшчэ раз пазней.", - "collections.search_accounts_label": "Шукайце ўліковыя запісы, каб дадаць іх сюды…", + "collections.search_accounts_label": "Адшукайце ўліковы запіс, каб дадаць яго сюды", "collections.search_accounts_max_reached": "Вы дадалі максімальную колькасць уліковых запісаў", "collections.sensitive": "Адчувальная", + "collections.share_short": "Абагуліць", + "collections.suggestions.can_not_add": "Немагчыма дадаць", + "collections.suggestions.can_not_add_desc": "Магчыма, гэтыя ўліковыя запісы схаваныя ад рэкамендацый або знаходзяцца на серверы, які не падтрымлівае калекцыі.", + "collections.suggestions.must_follow": "Патрабуецца падпіска", + "collections.suggestions.must_follow_desc": "Гэтыя ўліковыя запісы разглядаюць усе запыты на падпіску. Падпісчыкі могуць дадаваць іх у калекцыі.", "collections.topic_hint": "Дадайце хэштэг, які дапаможа іншым зразумець галоўную тэму гэтай калекцыі.", "collections.topic_special_chars_hint": "Спецыяльныя сімвалы будуць прыбраныя пры захаванні", + "collections.unlisted_collections_description": "Яны не паказваюцца ў Вашым профілі іншым карыстальнікам. Іх можа пабачыць любы, хто мае спасылку на іх.", + "collections.unlisted_collections_with_count": "Схаваныя калекцыі ({count})", "collections.view_collection": "Глядзець калекцыю", - "collections.view_other_collections_by_user": "Паглядзець іншыя калекцыі гэтага карыстальніка", "collections.visibility_public": "Публічная", "collections.visibility_public_hint": "Можна знайсці ў пошуку і іншых месцах, дзе з'яўляюцца рэкамендацыі.", "collections.visibility_title": "Бачнасць", @@ -405,7 +433,6 @@ "column.about": "Пра нас", "column.blocks": "Заблакіраваныя карыстальнікі", "column.bookmarks": "Закладкі", - "column.collections": "Мае калекцыі", "column.community": "Лакальная стужка", "column.create_list": "Стварыць спіс", "column.direct": "Прыватныя згадванні", @@ -422,8 +449,10 @@ "column.lists": "Спісы", "column.mutes": "Ігнараваныя карыстальнікі", "column.notifications": "Апавяшчэнні", + "column.other_collections": "Калекцыі {name}", "column.pins": "Замацаваныя допісы", "column.public": "Інтэграваная стужка", + "column.your_collections": "Вашы калекцыі", "column_back_button.label": "Назад", "column_header.hide_settings": "Схаваць налады", "column_header.moveLeft_settings": "Пасунуць слупок улева", @@ -485,12 +514,13 @@ "confirmations.discard_draft.post.title": "Скасаваць чарнавік?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", - "confirmations.follow_to_collection.confirm": "Падпісацца і дадаць у калекцыю", - "confirmations.follow_to_collection.message": "Вам трэба падпісацца на {name}, каб дадаць яго/яе ў калекцыю.", - "confirmations.follow_to_collection.title": "Падпісацца на ўліковы запіс?", "confirmations.follow_to_list.confirm": "Падпісацца і дадаць у спіс", "confirmations.follow_to_list.message": "Вам трэба падпісацца на {name}, каб дадаць яго/яе ў спіс.", "confirmations.follow_to_list.title": "Падпісацца на карыстальніка?", + "confirmations.hide_featured_tab.confirm": "Схаваць укладку", + "confirmations.hide_featured_tab.intro": "Вы можаце змяніць гэтую наладу ў любы момант у Рэдагаваць профіль > Налады ўкладкі профілю.", + "confirmations.hide_featured_tab.message": "Гэтае дзеянне схавае ўкладку ад карыстальнікаў {serverName} і іншых сервераў з апошняй версіяй Mastodon. Яе адлюстраванне на іншых серверах можа адрознівацца.", + "confirmations.hide_featured_tab.title": "Схаваць укладку \"Выбранае\"?", "confirmations.logout.confirm": "Выйсці", "confirmations.logout.message": "Вы ўпэўненыя, што хочаце выйсці?", "confirmations.logout.title": "Выйсці?", @@ -529,6 +559,7 @@ "content_warning.hide": "Схаваць допіс", "content_warning.show": "Усё адно паказаць", "content_warning.show_more": "Паказаць усё роўна", + "content_warning.show_short": "Паказаць", "conversation.delete": "Выдаліць размову", "conversation.mark_as_read": "Адзначыць прачытаным", "conversation.open": "Прагледзець размову", @@ -569,6 +600,14 @@ "domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.", "domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", "dropdown.empty": "Выбраць варыянт", + "email_subscriptions.email": "Эл. пошта", + "email_subscriptions.form.action": "Падпісацца", + "email_subscriptions.form.bottom": "Атрымлівайце допісы ў сваю паштовую скрыню без стварэння ўліковага запісу Mastodon. Пры жаданні зможаце адпісацца ў любы момант. Падрабязней у Палітыцы прыватнасці.", + "email_subscriptions.form.title": "Зарэгістравацца на абнаўленні па электроннай пошце ад {name}", + "email_subscriptions.submitted.lead": "Праверце сваю паштовую скрыню, каб знайсці там ліст і скончыць рэгістрацыю на абнаўленні па электроннай пошце.", + "email_subscriptions.submitted.title": "Яшчэ адзін крок", + "email_subscriptions.validation.email.blocked": "Заблакіраваны правайдар электроннай пошты", + "email_subscriptions.validation.email.invalid": "Памылковы адрас электроннай пошты", "embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.", "embed.preview": "Вось як гэта будзе выглядаць:", "emoji_button.activity": "Актыўнасць", @@ -586,9 +625,14 @@ "emoji_button.search_results": "Вынікі пошуку", "emoji_button.symbols": "Сімвалы", "emoji_button.travel": "Падарожжы і месцы", - "empty_column.account_featured.me": "Вы яшчэ нічога не паказалі. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", - "empty_column.account_featured.other": "{acct} яшчэ нічога не паказаў. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", - "empty_column.account_featured_other.unknown": "Гэты ўліковы запіс яшчэ нічога не паказаў.", + "empty_column.account_featured.other": "{acct} пакуль нічога не адабраў(-ла) для паказу.", + "empty_column.account_featured_self.no_collections_button": "Стварыць калекцыю", + "empty_column.account_featured_self.no_collections_hide_tab": "Або схаваць гэтую ўкладку", + "empty_column.account_featured_self.pre_collections": "Рыхтуйцеся да Калекцый", + "empty_column.account_featured_self.pre_collections_desc": "Калекцыі (новая функцыя Mastodon 4.6) дазволяць Вам ствараць свае ўласныя спісы ўліковых запісаў, каб раіць іх іншым.", + "empty_column.account_featured_self.showcase_accounts": "Паказаць Вашыя ўлюбёныя ўліковыя запісы", + "empty_column.account_featured_self.showcase_accounts_desc": "Калекцыі — спісы адабраных уліковых запісаў, якія дапамагаюць іншым знаходзіць нешта новае ў федэральным сусвеце.", + "empty_column.account_featured_unknown.other": "Гэты ўліковы запіс пакуль нічога не адабраў для паказу.", "empty_column.account_hides_collections": "Гэты карыстальнік вырашыў схаваць гэтую інфармацыю", "empty_column.account_suspended": "Уліковы запіс прыпынены", "empty_column.account_timeline": "Тут няма допісаў!", @@ -628,9 +672,9 @@ "featured_carousel.header": "{count, plural,one {Замацаваны допіс} other {Замацаваныя допісы}}", "featured_carousel.slide": "Допіс {current, number} з {max, number}", "featured_tags.more_items": "+{count}", - "featured_tags.suggestions": "Апошнім часам Вы рабілі допісы пра {items}. Дадаць гэта ў рэкамендаваныя хэштэгі?", + "featured_tags.suggestions": "Апошнім часам Вы рабілі допісы пра {items}. Дадаць гэта ў выбраныя хэштэгі?", "featured_tags.suggestions.add": "Дадаць", - "featured_tags.suggestions.added": "Кіруйце сваімі рэкамендаванымі хэштэгамі ў любы час праз Рэдагаваць профіль > Рэкамендаваныя хэштэгі.", + "featured_tags.suggestions.added": "Кіруйце сваімі выбранымі хэштэгамі ў любы час праз Рэдагаваць профіль > Выбраныя хэштэгі.", "featured_tags.suggestions.dismiss": "Не, дзякуй", "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім Вы адкрылі гэты допіс. Калі Вы хочаце, каб паведамленне таксама было адфільтраванае ў гэтым кантэксце, Вам трэба будзе адрэдагаваць фільтр.", "filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!", @@ -674,7 +718,9 @@ "follow_suggestions.who_to_follow": "На каго падпісацца", "followed_tags": "Падпіскі на хэштэгі", "followers.hide_other_followers": "Гэты карыстальнік вырашыў не паказваць сваіх іншых падпісчыкаў", + "followers.title": "Падпісаны(-ая) на {name}", "following.hide_other_following": "Гэты карыстальнік вырашыў не паказваць свае іншыя падпіскі", + "following.title": "Падпісаны(-ая) {name}", "footer.about": "Пра нас", "footer.about_mastodon": "Пра Mastodon", "footer.about_server": "Пра {domain}", @@ -686,6 +732,7 @@ "footer.source_code": "Прагледзець зыходны код", "footer.status": "Статус", "footer.terms_of_service": "Умовы выкарыстання", + "form_error.blank": "Поле не можа быць пустым.", "form_field.optional": "(неабавязкова)", "generic.saved": "Захавана", "getting_started.heading": "Пачатак працы", @@ -869,6 +916,7 @@ "navigation_panel.expand_followed_tags": "Разгарнуць меню падпісак на хэштэгі", "navigation_panel.expand_lists": "Разгарнуць меню спіса", "not_signed_in_indicator.not_signed_in": "Вам трэба ўвайсці каб атрымаць доступ да гэтага рэсурсу.", + "notification.added_to_collection": "{name} дадаў(-ла) Вас у калекцыю", "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}", @@ -878,6 +926,7 @@ "notification.admin.sign_up.name_and_others": "{name} і {count, plural, one {# іншы(-ая)} other {# іншых}} зарэгістраваліся", "notification.annual_report.message": "Вас чакае Ваш #Wrapstodon нумар {year}! Падзяліцеся сваімі галоўнымі падзеямі і запамінальнымі момантамі ў Mastodon!", "notification.annual_report.view": "Перайсці да #Wrapstodon", + "notification.collection_update": "{name} рэдагаваў(-ла) калекцыю з Вамі", "notification.favourite": "{name} упадабаў(-ла) Ваш допіс", "notification.favourite.name_and_others_with_link": "{name} і {count, plural, one {# іншы(-ая)} other {# іншыя}} ўпадабалі Ваш допіс", "notification.favourite_pm": "{name} упадабаў(-ла) Вашае прыватнае згадванне", @@ -1141,6 +1190,7 @@ "server_banner.active_users": "актыўныя карыстальнікі", "server_banner.administered_by": "Адміністратар:", "server_banner.is_one_of_many": "{domain} - гэта адзін з многіх незалежных сервераў Mastodon, які Вы можаце выкарыстоўваць для ўдзелу ў федэральным сусвеце.", + "server_banner.more_about_this_server": "Падрабязней пра гэты сервер", "server_banner.server_stats": "Статыстыка сервера:", "sign_in_banner.create_account": "Стварыць уліковы запіс", "sign_in_banner.follow_anyone": "Падпісвайцеся на каго захочаце ва ўсім федэральным сусвеце і глядзіце ўсё ў храналагічным парадку. Ніякіх алгарытмаў, рэкламы або клікбэйту.", @@ -1185,7 +1235,7 @@ "status.load_more": "Загрузіць яшчэ", "status.media.open": "Націсніце, каб адкрыць", "status.media.show": "Націсніце, каб паказаць", - "status.media_hidden": "Медыя схавана", + "status.media_hidden": "Медыя схаваныя", "status.mention": "Згадаць @{name}", "status.more": "Больш", "status.mute": "Ігнараваць @{name}", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 850f1175440ded..7281a4cb34355e 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -21,12 +21,10 @@ "account.block_domain": "Блокиране на домейн {domain}", "account.block_short": "Блокиране", "account.blocked": "Блокирани", - "account.blocking": "Блокиране", "account.cancel_follow_request": "Оттегляне на заявката за последване", "account.copy": "Копиране на връзка към профила", "account.direct": "Частно споменаване на @{name}", "account.disable_notifications": "Спиране на известяване при публикуване от @{name}", - "account.domain_blocking": "Блокиране на домейн", "account.edit_profile": "Редактиране на профила", "account.edit_profile_short": "Редактиране", "account.enable_notifications": "Известяване при публикуване от @{name}", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "Последвано от {name1} и {name2}", "account.featured": "Препоръчано", "account.featured.accounts": "Профили", - "account.featured.hashtags": "Хаштагове", - "account.featured_tags.last_status_at": "Последна публикация на {date}", - "account.featured_tags.last_status_never": "Няма публикации", "account.follow": "Последване", "account.follow_back": "Последване взаимно", "account.follow_request_cancel": "Отказване на заявката", @@ -66,16 +61,13 @@ "account.mute_notifications_short": "Заглушаване на известията", "account.mute_short": "Заглушаване", "account.muted": "Заглушено", - "account.muting": "Заглушаване", "account.mutual": "Взаимно се следвате", "account.no_bio": "Няма представен опис.", "account.open_original_page": "Отваряне на първообразната страница", "account.posts": "Публикации", - "account.posts_with_replies": "Публ. и отговори", "account.remove_from_followers": "Премахване на {name} от последователи", "account.report": "Докладване на @{name}", "account.requested_follow": "{name} поиска да ви последва", - "account.requests_to_follow_you": "Заявки да ви последват", "account.share": "Споделяне на профила на @{name}", "account.show_reblogs": "Показване на подсилвания от @{name}", "account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}", @@ -308,7 +300,6 @@ "emoji_button.search_results": "Резултати от търсене", "emoji_button.symbols": "Символи", "emoji_button.travel": "Пътуване и места", - "empty_column.account_featured_other.unknown": "Този акаунт още не е отличил нищо.", "empty_column.account_hides_collections": "Този потребител е избрал да не дава тази информация", "empty_column.account_suspended": "Спрян акаунт", "empty_column.account_timeline": "Тук няма публикации!", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 768ccd19ac91ab..ea4c3e9eaf1eac 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -26,8 +26,6 @@ "account.edit_profile": "প্রোফাইল সম্পাদনা করুন", "account.enable_notifications": "আমাকে জানাবে যখন @{name} পোস্ট করবে", "account.endorse": "প্রোফাইলে ফিচার করুন", - "account.featured_tags.last_status_at": "{date} এ সর্বশেষ পোস্ট", - "account.featured_tags.last_status_never": "কোনো পোস্ট নেই", "account.follow": "অনুসরণ", "account.follow_back": "তাকে অনুসরণ করো", "account.followers": "অনুসরণকারী", @@ -51,7 +49,6 @@ "account.no_bio": "কোনো বর্ণনা দেওয়া হয়নি.", "account.open_original_page": "মূল পৃষ্ঠা খুলুন", "account.posts": "পোষ্টসমূহ", - "account.posts_with_replies": "টুট এবং মতামত", "account.report": "@{name} কে রিপোর্ট করুন", "account.requested_follow": "{name} আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে", "account.share": "@{name} র প্রোফাইল অন্যদের দেখান", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index cb55e4a68a3da5..f43050e09b4d8d 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -21,12 +21,10 @@ "account.block_domain": "Stankañ an domani {domain}", "account.block_short": "Stankañ", "account.blocked": "Stanket", - "account.blocking": "Stanket", "account.cancel_follow_request": "Nullañ ar reked heuliañ", "account.copy": "Eilañ al liamm war-zu ho profil", "account.direct": "Menegiñ @{name} ent-prevez", "account.disable_notifications": "Paouez d'am c'hemenn pa vez embannet traoù gant @{name}", - "account.domain_blocking": "Domani stanket", "account.edit_profile": "Kemmañ ar profil", "account.edit_profile_short": "Kemmañ", "account.enable_notifications": "Ma c'hemenn pa vez embannet traoù gant @{name}", @@ -35,9 +33,6 @@ "account.familiar_followers_two": "Heuliet gant {name1} ha {name2}", "account.featured": "En a-raok", "account.featured.accounts": "Profiloù", - "account.featured.hashtags": "Gerioù-klik", - "account.featured_tags.last_status_at": "Embann diwezhañ: {date}", - "account.featured_tags.last_status_never": "Embann ebet", "account.follow": "Heuliañ", "account.follow_back": "Heuliañ d'ho tro", "account.follow_back_short": "Heuliañ d'ho tro", @@ -65,16 +60,13 @@ "account.mute_notifications_short": "Kuzhat ar c'hemennoù", "account.mute_short": "Kuzhat", "account.muted": "Kuzhet", - "account.muting": "O kuzhat", "account.mutual": "Heuliañ a rit an eil egile", "account.no_bio": "Deskrivadur ebet da gaout.", "account.open_original_page": "Digeriñ ar bajenn orin", "account.posts": "Embannadurioù", - "account.posts_with_replies": "Embannadurioù ha respontoù", "account.remove_from_followers": "Dilemel {name} eus an heulierien·ezed", "account.report": "Disklêriañ @{name}", "account.requested_follow": "Gant {name} eo bet goulennet ho heuliañ", - "account.requests_to_follow_you": "Rekedoù d'ho heuliañ", "account.share": "Skignañ profil @{name}", "account.show_reblogs": "Diskouez skignadennoù @{name}", "account.statuses_counter": "{count, plural, one {{counter} embannadur} two {{counter} embannadur} few {{counter} embannadur} many {{counter} embannadur} other {{counter} embannadur}}", @@ -267,7 +259,6 @@ "emoji_button.search_results": "Disoc'hoù an enklask", "emoji_button.symbols": "Arouezioù", "emoji_button.travel": "Beajiñ & Lec'hioù", - "empty_column.account_featured_other.unknown": "N'eo ket bet lakaet netra en a-raok gant ar gont-mañ.", "empty_column.account_suspended": "Kont astalet", "empty_column.account_timeline": "Embannadur ebet amañ!", "empty_column.account_unavailable": "Profil dihegerz", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 08b644dd521959..9946756b6279f2 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -27,12 +27,10 @@ "account.block_domain": "Bloca el domini {domain}", "account.block_short": "Bloca", "account.blocked": "Blocat", - "account.blocking": "Blocat", "account.cancel_follow_request": "Cancel·la el seguiment", "account.copy": "Copia l'enllaç al perfil", "account.direct": "Menciona privadament @{name}", "account.disable_notifications": "Deixa de notificar-me els tuts de @{name}", - "account.domain_blocking": "Bloquem el domini", "account.edit_note": "Edita una nota personal", "account.edit_profile": "Edita el perfil", "account.edit_profile_short": "Edita", @@ -43,9 +41,6 @@ "account.familiar_followers_two": "Seguit per {name1} i {name2}", "account.featured": "Destacat", "account.featured.accounts": "Perfils", - "account.featured.hashtags": "Etiquetes", - "account.featured_tags.last_status_at": "Darrer tut el {date}", - "account.featured_tags.last_status_never": "No hi ha tuts", "account.filters.all": "Tota l'activitat", "account.filters.boosts_toggle": "Mostra els impulsos", "account.filters.posts_boosts": "Publicacions i impulsos", @@ -98,7 +93,6 @@ "account.mute_notifications_short": "Silencia les notificacions", "account.mute_short": "Silencia", "account.muted": "Silenciat", - "account.muting": "Silenciem", "account.mutual": "Us seguiu l'un a l'altre", "account.no_bio": "No s'ha proporcionat cap descripció.", "account.node_modal.callout": "Ningú més pot veure les vostres notes personals.", @@ -111,11 +105,9 @@ "account.note.title": "Nota personal (visible només per a vós)", "account.open_original_page": "Obre la pàgina original", "account.posts": "Tuts", - "account.posts_with_replies": "Tuts i respostes", "account.remove_from_followers": "Elimina {name} dels seguidors", "account.report": "Informa sobre @{name}", "account.requested_follow": "{name} ha demanat de seguir-te", - "account.requests_to_follow_you": "Peticions de seguir-vos", "account.share": "Comparteix el perfil de @{name}", "account.show_reblogs": "Mostra els impulsos de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicació} other {{counter} publicacions}}", @@ -205,23 +197,21 @@ "closed_registrations_modal.find_another_server": "Troba un altre servidor", "closed_registrations_modal.preamble": "Mastodon és descentralitzat. Per tant, tinguis on tinguis el compte, seràs capaç de seguir i interactuar amb tothom des d'aquest servidor. Fins i tot pots tenir el compte en el teu propi servidor!", "closed_registrations_modal.title": "Registrant-se a Mastodon", + "collections.account_count": "{count, plural, one {# compte} other {# comptes}}", "collections.collection_description": "Descripció", "collections.collection_name": "Nom", "collections.collection_topic": "Tema", - "collections.create_a_collection_hint": "Creeu una coŀlecció per a recomanar o compartir amb d'altres els vostres comptes preferits.", "collections.create_collection": "Crea una coŀlecció", "collections.delete_collection": "Elimina la coŀlecció", "collections.description_length_hint": "Límit de 100 caràcters", - "collections.error_loading_collections": "Hi ha hagut un error en carregar les vostres coŀleccions.", + "collections.last_updated_at": "Última actualització: {date}", "collections.mark_as_sensitive": "Marcar com a sensible", "collections.mark_as_sensitive_hint": "Amaga la descripció i els comptes de la coŀlecció rere un avís de contingut. El nom de la coŀlecció serà encara visible.", - "collections.no_collections_yet": "Encara no hi ha coŀleccions.", "collections.topic_hint": "Afegir una etiqueta que ajudi altres a entendre el tema principal de la coŀlecció.", "collections.view_collection": "Mostra la coŀlecció", "column.about": "Quant a", "column.blocks": "Usuaris blocats", "column.bookmarks": "Marcadors", - "column.collections": "Les meves coŀleccions", "column.community": "Línia de temps local", "column.create_list": "Crea una llista", "column.direct": "Mencions privades", @@ -390,9 +380,6 @@ "emoji_button.search_results": "Resultats de la cerca", "emoji_button.symbols": "Símbols", "emoji_button.travel": "Viatges i llocs", - "empty_column.account_featured.me": "Encara no heu destacat res. Sabeu que podeu destacar les etiquetes que més feu servir i fins i tot els comptes dels vostres amics al vostre perfil?", - "empty_column.account_featured.other": "{acct} encara no ha destacat res. Sabeu que podeu destacar les etiquetes que més feu servir i fins i tot els comptes dels vostres amics al vostre perfil?", - "empty_column.account_featured_other.unknown": "Aquest compte no ha destacat encara res.", "empty_column.account_hides_collections": "Aquest usuari ha decidit no mostrar aquesta informació", "empty_column.account_suspended": "Compte suspès", "empty_column.account_timeline": "No hi ha tuts aquí!", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 35c725a3df197f..a58ae647de63b4 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -25,8 +25,6 @@ "account.edit_profile": "دەستکاری پرۆفایل", "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان", "account.endorse": "ناساندن لە پرۆفایل", - "account.featured_tags.last_status_at": "دوایین پۆست لە {date}", - "account.featured_tags.last_status_never": "هیچ پۆستێک نییە", "account.follow": "بەدواداچوون", "account.follow_back": "فۆڵۆو بکەنەوە", "account.followers": "شوێنکەوتووان", @@ -50,7 +48,6 @@ "account.no_bio": "هیچ وەسفێک نەخراوەتەڕوو.", "account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە", "account.posts": "نووسراوەکان", - "account.posts_with_replies": "توتس و وەڵامەکان", "account.report": "گوزارشت @{name}", "account.requested_follow": "{name} داوای کردووە شوێنت بکەوێت", "account.share": "پرۆفایلی @{name} هاوبەش بکە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index a240b8831385dc..03e36a6b2ba1e3 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -22,7 +22,6 @@ "account.mute": "Piattà @{name}", "account.muted": "Piattatu", "account.posts": "Statuti", - "account.posts_with_replies": "Statuti è risposte", "account.report": "Palisà @{name}", "account.share": "Sparte u prufile di @{name}", "account.show_reblogs": "Vede spartere da @{name}", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 02fe2ebc196b45..87428e5c204099 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -28,12 +28,10 @@ "account.block_domain": "Blokovat doménu {domain}", "account.block_short": "Zablokovat", "account.blocked": "Blokovaný", - "account.blocking": "Blokovaní", "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", - "account.domain_blocking": "Blokované domény", "account.edit_note": "Upravit vlastní poznámku", "account.edit_profile": "Upravit profil", "account.edit_profile_short": "Upravit", @@ -44,9 +42,6 @@ "account.familiar_followers_two": "Sleduje je {name1} a {name2}", "account.featured": "Zvýrazněné", "account.featured.accounts": "Profily", - "account.featured.hashtags": "Hashtagy", - "account.featured_tags.last_status_at": "Poslední příspěvek {date}", - "account.featured_tags.last_status_never": "Žádné příspěvky", "account.filters.all": "Veškerá aktivita", "account.filters.boosts_toggle": "Zobrazit boosty", "account.filters.posts_boosts": "Příspěvky a boosty", @@ -100,11 +95,9 @@ "account.mute_notifications_short": "Ztlumit upozornění", "account.mute_short": "Ztlumit", "account.muted": "Skrytý", - "account.muting": "Ztlumení", "account.mutual": "Sledujete se navzájem", "account.name.help.domain": "{domain} je server, který hostuje profily a příspěvky uživatelů.", "account.name.help.domain_self": "{domain} je váš server, který hostuje váš profil a příspěvky.", - "account.name.help.footer": "Stejně jako můžete posílat e-maily lidem, kteří používají různé e-mailové klienty, můžete komunikovat s lidmi na jiných Mastodon serverech – a s kýmkoli na jiných sociálních aplikacích poháněných stejným souborem pravidel, jako používá Mastodon (protokol ActivityPub).", "account.name.help.header": "Handle je jako e-mailová adresa", "account.name.help.username": "{username} je uživatelské jméno tohoto účtu na jeho serveru. Někdo na jiném serveru může mít stejné uživatelské jméno.", "account.name.help.username_self": "{username} je vaše uživatelské jméno na tomto serveru. Někdo na jiném serveru může mít stejné uživatelské jméno.", @@ -120,11 +113,9 @@ "account.note.title": "Vlastní poznámka (viditelná pouze pro vás)", "account.open_original_page": "Otevřít původní stránku", "account.posts": "Příspěvky", - "account.posts_with_replies": "Příspěvky a odpovědi", "account.remove_from_followers": "Odebrat {name} ze sledujících", "account.report": "Nahlásit @{name}", "account.requested_follow": "{name} tě požádal o sledování", - "account.requests_to_follow_you": "Žádosti 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ů}}", @@ -256,9 +247,6 @@ "collections.mark_as_sensitive_hint": "Skryje popis kolekce a účty za varováním obsahu. Název kolekce bude stále viditelný.", "collections.name_length_hint": "Limit 40 znaků", "collections.new_collection": "Nová sbírka", - "collections.no_collections_yet": "Ještě nemáte žádné sbírky.", - "collections.remove_account": "Odstranit tento účet", - "collections.search_accounts_label": "Hledat účty pro přidání…", "collections.search_accounts_max_reached": "Přidali jste maximální počet účtů", "collections.sensitive": "Citlivé", "collections.topic_hint": "Přidat štítek, který pomůže ostatním pochopit hlavní téma této kolekce.", @@ -270,7 +258,6 @@ "column.about": "O aplikaci", "column.blocks": "Blokovaní uživatelé", "column.bookmarks": "Záložky", - "column.collections": "Mé sbírky", "column.community": "Místní časová osa", "column.create_list": "Vytvořit seznam", "column.direct": "Soukromé zmínky", @@ -443,9 +430,6 @@ "emoji_button.search_results": "Výsledky hledání", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestování a místa", - "empty_column.account_featured.me": "Zatím jste nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?", - "empty_column.account_featured.other": "{acct} zatím nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?", - "empty_column.account_featured_other.unknown": "Tento účet zatím nemá nic zvýrazněného.", "empty_column.account_hides_collections": "Tento uživatel se rozhodl tuto informaci nezveřejňovat", "empty_column.account_suspended": "Účet je pozastaven", "empty_column.account_timeline": "Nejsou tu žádné příspěvky!", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index ccb9375d7f44a9..a1252a4b93c448 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -28,12 +28,10 @@ "account.block_domain": "Rhwystro'r parth {domain}", "account.block_short": "Rhwystro", "account.blocked": "Wedi'i rwystro", - "account.blocking": "Yn Rhwystro", "account.cancel_follow_request": "Tynnu cais i ddilyn", "account.copy": "Copïo dolen i'r proffil", "account.direct": "Crybwyll yn breifat @{name}", "account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio", - "account.domain_blocking": "Parthau'n cael eu rhwystro", "account.edit_note": "Golygu nodyn personol", "account.edit_profile": "Golygu'r proffil", "account.edit_profile_short": "Golygu", @@ -45,9 +43,6 @@ "account.featured": "Nodwedd", "account.featured.accounts": "Proffilau", "account.featured.collections": "Casgliadau", - "account.featured.hashtags": "Hashnodau", - "account.featured_tags.last_status_at": "Y postiad olaf ar {date}", - "account.featured_tags.last_status_never": "Dim postiadau", "account.field_overflow": "Dangos cynnwys llawn", "account.filters.all": "Pob gweithgaredd", "account.filters.boosts_toggle": "Dangos hybiau", @@ -102,11 +97,9 @@ "account.mute_notifications_short": "Diffodd hysbysiadau", "account.mute_short": "Anwybyddu", "account.muted": "Wedi anwybyddu", - "account.muting": "Tewi", "account.mutual": "Rydych chi'n dilyn eich gilydd", "account.name.help.domain": "{domain} yw'r gweinydd sy'n cynnal proffil a phostiadau'r defnyddiwr.", "account.name.help.domain_self": "{domain} yw eich gweinydd sy'n cynnal eich proffil a'ch postiadau.", - "account.name.help.footer": "Yn union fel y gallwch anfon negeseuon e-bost at bobl gan ddefnyddio gwahanol raglenni e-bost, gallwch ryngweithio â phobl ar weinyddion Mastodon eraill – a chyda unrhyw un ar apiau cymdeithasol eraill sy'n cael eu pweru gan yr un set o reolau ag y mae Mastodon yn eu defnyddio (y protocol ActivityPub).", "account.name.help.header": "Mae dolen fel cyfeiriad e-bost", "account.name.help.username": "{username} yw enw defnyddiwr y cyfrif hwn ar eu gweinydd. Efallai bod gan rywun ar weinydd arall yr un enw defnyddiwr.", "account.name.help.username_self": "{username} yw eich enw defnyddiwr ar y gweinydd hwn. Efallai bod gan rywun ar weinydd arall yr un enw defnyddiwr.", @@ -122,11 +115,9 @@ "account.note.title": "Nodyn personol (yn weladwy i chi yn unig)", "account.open_original_page": "Agor y dudalen wreiddiol", "account.posts": "Postiadau", - "account.posts_with_replies": "Postiadau ac ymatebion", "account.remove_from_followers": "Tynnu {name} o'ch dilynwyr", "account.report": "Adrodd @{name}", "account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn", - "account.requests_to_follow_you": "Ceisiadau i'ch dilyn", "account.share": "Rhannu proffil @{name}", "account.show_reblogs": "Dangos hybiau gan @{name}", "account.statuses_counter": "{count, plural, one {{counter} postiad} two {{counter} bostiad} few {{counter} phostiad} many {{counter} postiad} other {{counter} postiad}}", @@ -145,12 +136,8 @@ "account_edit.bio.title": "Cyflwyniad", "account_edit.bio_modal.add_title": "Ychwanegu cyflwyniad", "account_edit.bio_modal.edit_title": "Golygu'r cyflwyniad", - "account_edit.button.add": "Ychwanegu {item}", - "account_edit.button.delete": "Dileu {item}", - "account_edit.button.edit": "Golygu {item}", "account_edit.column_button": "Gorffen", "account_edit.column_title": "Golygu Proffil", - "account_edit.custom_fields.name": "maes", "account_edit.custom_fields.placeholder": "Ychwanegwch eich rhagenwau, dolenni allanol, neu unrhyw beth arall hoffech ei rannu.", "account_edit.custom_fields.reorder_button": "Ail-drefnu meysydd", "account_edit.custom_fields.tip_content": "Gallwch chi ychwanegu hygrededd at eich cyfrif Mastodon yn hawdd trwy wirio dolenni i unrhyw wefannau rydych chi'n berchen arnyn nhw.", @@ -159,7 +146,6 @@ "account_edit.custom_fields.verified_hint": "Sut ydw i'n ychwanegu dolen wedi'i gwirio?", "account_edit.display_name.placeholder": "Eich enw dangos yw sut mae'ch enw'n ymddangos ar eich proffil ac mewn llinellau amser.", "account_edit.display_name.title": "Enw dangos", - "account_edit.featured_hashtags.item": "hashnodau", "account_edit.featured_hashtags.placeholder": "Helpwch eraill i adnabod, a chael mynediad cyflym at eich hoff bynciau.", "account_edit.featured_hashtags.title": "Hashnodau dan sylw", "account_edit.field_delete_modal.confirm": "Ydych chi'n siŵr eich bod chi eisiau dileu'r maes cyfaddas hwn? Does dim modd dadwneud y weithred hon.", @@ -167,8 +153,6 @@ "account_edit.field_delete_modal.title": "Dileu maes cyfaddas?", "account_edit.field_edit_modal.add_title": "Ychwanegu maes cyfaddas", "account_edit.field_edit_modal.edit_title": "Golygu maes cyfaddas", - "account_edit.field_edit_modal.limit_header": "Wedi mynd dros y terfyn nodau sy'n cael eu hargymell", - "account_edit.field_edit_modal.limit_message": "Efallai na fydd defnyddwyr symudol yn gweld eich maes yn llawn.", "account_edit.field_edit_modal.link_emoji_warning": "Rydym yn argymell yn erbyn defnyddio emoji personol ar y cyd ag URLau. Bydd meysydd personol sy'n cynnwys y ddau yn cael eu harddangos fel testun yn unig yn hytrach nag fel dolen, er mwyn atal dryswch ymhlith defnyddwyr.", "account_edit.field_edit_modal.name_hint": "e.e. “Gwefan bersonol”", "account_edit.field_edit_modal.url_warning": "I ychwanegu dolen, cofiwch gynnwys {protocol} ar y dechrau.", @@ -207,8 +191,6 @@ "account_edit.profile_tab.show_media.title": "Dangos y tab ‘Cyfryngau’", "account_edit.profile_tab.show_media_replies.description": "Pan fydd wedi'i alluogi, mae'r tab Cyfryngau yn dangos eich postiadau ac atebion i bostiadau pobl eraill.", "account_edit.profile_tab.show_media_replies.title": "Cynhwyswch atebion ar y tab ‘Cyfryngau’", - "account_edit.profile_tab.subtitle": "Cyfaddaswch y tabiau ar eich proffil a'r hyn maen nhw'n ei ddangos.", - "account_edit.profile_tab.title": "Gosodiadau tab proffil", "account_edit.save": "Cadw", "account_edit.upload_modal.back": "Nôl", "account_edit.upload_modal.done": "Gorffen", @@ -218,8 +200,6 @@ "account_edit.upload_modal.step_upload.dragging": "Gollwng i lwytho i fyny", "account_edit.upload_modal.step_upload.header": "Dewiswch ddelwedd", "account_edit.upload_modal.step_upload.hint": "Fformat WEBP, PNG, GIF neu JPG, hyd at {limit}MB.{br}Bydd y ddelwedd yn cael ei haddasu i {width}x{height}px.", - "account_edit.upload_modal.title_add": "Ychwanegu llun proffil", - "account_edit.upload_modal.title_replace": "Amnewid llun proffil", "account_edit.verified_modal.details": "Ychwanegwch hygrededd at eich proffil Mastodon trwy wirio dolenni i wefannau personol. Dyma sut mae'n gweithio:", "account_edit.verified_modal.invisible_link.details": "Ychwanegwch y ddolen at eich pennyn. Y rhan bwysig yw rel=\"me\" sy'n atal dynwared ar wefannau gyda chynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr. Gallwch hyd yn oed ddefnyddio tag dolen ym mhennyn y dudalen yn lle {tag}, ond rhaid bod yr HTML yn hygyrch ac heb weithredu JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Sut ydw i'n gwneud y ddolen yn anweledig?", @@ -228,7 +208,6 @@ "account_edit.verified_modal.step2.header": "Ychwanegwch eich gwefan fel maes cyfaddas", "account_edit.verified_modal.title": "Sut i ychwanegu dolen wedi'i gwirio", "account_edit_tags.add_tag": "Ychwanegu #{tagName}", - "account_edit_tags.column_title": "Golygu hashnodau dan sylw", "account_edit_tags.help_text": "Mae hashnodau dan sylw yn helpu defnyddwyr i ddarganfod a rhyngweithio â'ch proffil. Maen nhw'n ymddangos fel hidlwyr ar olwg Gweithgaredd eich tudalen Proffil.", "account_edit_tags.search_placeholder": "Rhowch hashnod…", "account_edit_tags.suggestions": "Awgrymiadau:", @@ -337,7 +316,6 @@ "closed_registrations_modal.find_another_server": "Dod o hyd i weinydd arall", "closed_registrations_modal.preamble": "Mae Mastodon wedi'i ddatganoli, felly does dim gwahaniaeth ble rydych chi'n creu eich cyfrif, byddwch chi'n gallu dilyn a rhyngweithio ag unrhyw un ar y gweinydd hwn. Gallwch hyd yn oed ei gynnal un eich hun!", "closed_registrations_modal.title": "Cofrestru ar Mastodon", - "collection.share_modal.share_link_label": "Dolen rhannu gwahoddiad", "collection.share_modal.share_via_post": "Postio ar Mastodon", "collection.share_modal.share_via_system": "Rhannwch i…", "collection.share_modal.title": "Rhannu casgliad", @@ -345,7 +323,6 @@ "collection.share_template_other": "Edrychwch ar y casgliad trawiadol hwn: {link}", "collection.share_template_own": "Edrychwch ar fy nghasgliad newydd: {link}", "collections.account_count": "{count, plural, one {# cyfrif} other {# cyfrif}}", - "collections.accounts.empty_description": "Ychwanegwch hyd at {count} cyfrif rydych chi'n eu dilyn", "collections.accounts.empty_title": "Mae'r casgliad hwn yn wag", "collections.collection_description": "Disgrifiad", "collections.collection_name": "Enw", @@ -353,47 +330,32 @@ "collections.confirm_account_removal": "Ydych chi'n siŵr eich bod chi eisiau tynnu'r cyfrif hwn o'r casgliad hwn?", "collections.content_warning": "Rhybudd cynnwys", "collections.continue": "Parhau", - "collections.create.accounts_subtitle": "Dim ond cyfrifon rydych chi'n eu dilyn sydd wedi dewis cael eu darganfod y mae modd eu hychwanegu.", "collections.create.accounts_title": "Pwy fyddwch chi'n ei gynnwys yn y casgliad hwn?", "collections.create.basic_details_title": "Manylion sylfaenol", "collections.create.steps": "Cam {step}/{total}", - "collections.create_a_collection_hint": "Creu casgliad i argymell neu rannu eich hoff gyfrifon gydag eraill.", "collections.create_collection": "Creu casgliad", "collections.delete_collection": "Dileu casgliad", "collections.description_length_hint": "Terfyn o 100 nod", - "collections.detail.accept_inclusion": "Iawn", - "collections.detail.accounts_heading": "Cyfrifon", - "collections.detail.author_added_you": "Ychwanegodd {author} chi at y casgliad hwn", - "collections.detail.curated_by_author": "Wedi'i guradu gan {author}", - "collections.detail.curated_by_you": "Wedi'i guradu gennych chi", "collections.detail.loading": "Yn llwytho casgliad…", - "collections.detail.other_accounts_in_collection": "Eraill yn y casgliad hwn:", "collections.detail.revoke_inclusion": "Tynnu fi", "collections.detail.sensitive_note": "Mae'r casgliad hwn yn cynnwys cyfrifon a chynnwys a allai fod yn sensitif i rai defnyddwyr.", "collections.detail.share": "Rhannu'r casgliad hwn", "collections.edit_details": "Golygu manylion", - "collections.error_loading_collections": "Bu gwall wrth geisio llwytho eich casgliadau.", - "collections.hints.accounts_counter": "{count} / {max} cyfrif", "collections.last_updated_at": "Diweddarwyd ddiwethaf: {date}", "collections.manage_accounts": "Rheoli cyfrifon", "collections.mark_as_sensitive": "Marcio fel sensitif", "collections.mark_as_sensitive_hint": "Yn cuddio disgrifiad a chyfrifon y casgliad y tu ôl i rybudd cynnwys. Bydd enw'r casgliad yn dal i fod yn weladwy.", "collections.name_length_hint": "Terfyn o 40 nod", "collections.new_collection": "Casgliad newydd", - "collections.no_collections_yet": "Dim casgliadau eto.", - "collections.old_last_post_note": "Postiwyd ddiwethaf dros wythnos yn ôl", - "collections.remove_account": "Dileu'r cyfrif hwn", "collections.report_collection": "Adroddwch am y casgliad hwn", "collections.revoke_collection_inclusion": "Tynnu fy hun o'r casgliad hwn", "collections.revoke_inclusion.confirmation": "Rydych chi wedi cael eich tynnu o \"{collection}\"", "collections.revoke_inclusion.error": "Bu gwall, ceisiwch eto yn nes ymlaen.", - "collections.search_accounts_label": "Chwiliwch am gyfrifon i'w hychwanegu…", "collections.search_accounts_max_reached": "Rydych chi wedi ychwanegu'r nifer mwyaf o gyfrifon", "collections.sensitive": "Sensitif", "collections.topic_hint": "Ychwanegwch hashnod sy'n helpu eraill i ddeall prif bwnc y casgliad hwn.", "collections.topic_special_chars_hint": "Bydd nodau arbennig yn cael eu tynnu wrth gadw", "collections.view_collection": "Gweld y casgliad", - "collections.view_other_collections_by_user": "Edrychwch ar gasgliadau eraill gan y defnyddiwr hwn", "collections.visibility_public": "Cyhoeddus", "collections.visibility_public_hint": "Mae modd eu canfod mewn canlyniadau chwilio a mannau eraill lle mae argymhellion yn ymddangos.", "collections.visibility_title": "Gwelededd", @@ -402,7 +364,6 @@ "column.about": "Ynghylch", "column.blocks": "Defnyddwyr wedi'u rhwystro", "column.bookmarks": "Llyfrnodau", - "column.collections": "Fy nghasgliadau", "column.community": "Ffrwd lleol", "column.create_list": "Creu rhestr", "column.direct": "Crybwylliadau preifat", @@ -482,9 +443,6 @@ "confirmations.discard_draft.post.title": "Dileu drafft eich postiad?", "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.follow_to_collection.confirm": "Dilyn ac ychwanegu at y casgliad", - "confirmations.follow_to_collection.message": "Mae angen i chi fod yn dilyn {name} i'w hychwanegu at gasgliad.", - "confirmations.follow_to_collection.title": "Dilyn cyfrif?", "confirmations.follow_to_list.confirm": "Dilyn ac ychwanegu at y rhestr", "confirmations.follow_to_list.message": "Mae angen i chi fod yn dilyn {name} i'w ychwanegu at restr.", "confirmations.follow_to_list.title": "Dilyn defnyddiwr?", @@ -583,9 +541,6 @@ "emoji_button.search_results": "Canlyniadau chwilio", "emoji_button.symbols": "Symbolau", "emoji_button.travel": "Teithio a Llefydd", - "empty_column.account_featured.me": "Dydych chi ddim wedi cynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?", - "empty_column.account_featured.other": "Dyw {acct} heb gynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?", - "empty_column.account_featured_other.unknown": "Dyw'r cyfrif hwn heb gynnwys dim eto.", "empty_column.account_hides_collections": "Mae'r defnyddiwr wedi dewis i beidio rhannu'r wybodaeth yma", "empty_column.account_suspended": "Cyfrif wedi'i atal", "empty_column.account_timeline": "Dim postiadau yma!", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 8eb992fd4ed262..f4e69924c59918 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -28,12 +28,10 @@ "account.block_domain": "Blokér domænet {domain}", "account.block_short": "Bloker", "account.blocked": "Blokeret", - "account.blocking": "Blokering", "account.cancel_follow_request": "Annullér anmodning om at følge", "account.copy": "Kopiér link til profil", "account.direct": "Nævn @{name} privat", "account.disable_notifications": "Giv mig ikke længere en notifikation, når @{name} laver indlæg", - "account.domain_blocking": "Blokerer domæne", "account.edit_note": "Rediger personlig note", "account.edit_profile": "Redigér profil", "account.edit_profile_short": "Rediger", @@ -45,9 +43,7 @@ "account.featured": "Fremhævet", "account.featured.accounts": "Profiler", "account.featured.collections": "Samlinger", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Seneste indlæg {date}", - "account.featured_tags.last_status_never": "Ingen indlæg", + "account.featured.new_collection": "Ny samling", "account.field_overflow": "Vis fuldt indhold", "account.filters.all": "Al aktivitet", "account.filters.boosts_toggle": "Vis fremhævelser", @@ -73,8 +69,19 @@ "account.go_to_profile": "Gå til profil", "account.hide_reblogs": "Skjul fremhævelser fra @{name}", "account.in_memoriam": "Til minde om.", + "account.join_modal.day": "Dag", + "account.join_modal.me": "Du tilmeldte dig {server}", + "account.join_modal.me_anniversary": "Tillykke med dit fedivers-jubilæum! Du tilmeldte dig {server}", + "account.join_modal.me_today": "Det er din første dag på {server}!", + "account.join_modal.other": "{name} tilmeldte sig {server}", + "account.join_modal.other_today": "Det er {name}’s første dag på {server}!", + "account.join_modal.share.celebrate": "Del et indlæg for at fejre begivenheden", + "account.join_modal.share.intro": "Del et introindlæg", + "account.join_modal.share.welcome": "Del et velkomstindlæg", + "account.join_modal.years": "{number, plural, one {år} other {år}}", "account.joined_short": "Oprettet", "account.languages": "Skift abonnementssprog", + "account.last_active": "Senest aktiv", "account.link_verified_on": "Ejerskab af dette link blev tjekket {date}", "account.locked_info": "Denne kontos fortrolighedsstatus er sat til låst. Ejeren bedømmer manuelt, hvem der kan følge vedkommende.", "account.media": "Medier", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Sluk for notifikationer", "account.mute_short": "Skjul", "account.muted": "Skjult", - "account.muting": "Skjuler", "account.mutual": "I følger hinanden", + "account.name.copy": "Kopiér handle", "account.name.help.domain": "{domain} er den server, der er vært for brugerens profil og indlæg.", "account.name.help.domain_self": "{domain} er din server, der er vært for din profil og indlæg.", - "account.name.help.footer": "Ligesom du kan sende e-mails til personer, der bruger forskellige e-mail-klienter, kan du interagere med personer på andre Mastodon-servere – og med alle på andre sociale apps, der bruger de samme regler som Mastodon (ActivityPub-protokollen).", + "account.name.help.footer": "Ligesom du kan sende e-mails til folk, der bruger forskellige e-mailudbydere, kan du kommunikere med folk på andre Mastodon-servere og med enhver, der bruger andre Mastodon-kompatible sociale apps.", "account.name.help.header": "Et handle svarer til en e-mailadresse", "account.name.help.username": "{username} er denne kontos brugernavn på deres server. En konto på en anden server kan have det samme brugernavn.", "account.name.help.username_self": "{username} er dit brugernavn på denne server. En konto på en anden server kan have det samme brugernavn.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Rediger", "account.note.title": "Personlig note (kun synlige for dig)", "account.open_original_page": "Åbn oprindelig side", + "account.pending": "Afventer", "account.posts": "Indlæg", - "account.posts_with_replies": "Indlæg og svar", "account.remove_from_followers": "Fjern {name} fra følgere", "account.report": "Anmeld @{name}", "account.requested_follow": "{name} har anmodet om at følge dig", - "account.requests_to_follow_you": "Anmoder 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}}", @@ -141,34 +147,42 @@ "account.unmute": "Vis @{name} igen", "account.unmute_notifications_short": "Vis notifikationer igen", "account.unmute_short": "Vis igen", + "account_edit.advanced_settings.bot_hint": "Signalér til andre, at kontoen hovedsageligt udfører automatiserede handlinger og muligvis ikke monitoreres", + "account_edit.advanced_settings.bot_label": "Automatiseret konto", + "account_edit.advanced_settings.title": "Avancerede indstillinger", + "account_edit.bio.add_label": "Tilføj bio", + "account_edit.bio.edit_label": "Rediger bio", "account_edit.bio.placeholder": "Tilføj en kort introduktion, så andre kan få et indtryk af, hvem du er.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Tilføj bio", "account_edit.bio_modal.edit_title": "Rediger bio", - "account_edit.button.add": "Tilføj {item}", - "account_edit.button.delete": "Slet {item}", - "account_edit.button.edit": "Rediger {item}", "account_edit.column_button": "Færdig", "account_edit.column_title": "Rediger profil", - "account_edit.custom_fields.name": "felt", + "account_edit.custom_fields.add_label": "Tilføj felt", + "account_edit.custom_fields.edit_label": "Rediger felt", "account_edit.custom_fields.placeholder": "Tilføj dine pronominer, eksterne links eller andet, du gerne vil dele.", "account_edit.custom_fields.reorder_button": "Omsorter felter", "account_edit.custom_fields.tip_content": "Du kan nemt øge troværdigheden af din Mastodon-konto ved at verificere links til alle websteder, du ejer.", "account_edit.custom_fields.tip_title": "Tip: Tilføjelse af bekræftede links", "account_edit.custom_fields.title": "Brugerdefinerede felter", "account_edit.custom_fields.verified_hint": "Hvordan tilføjer jeg et bekræftet link?", + "account_edit.display_name.add_label": "Tilføj visningsnavn", + "account_edit.display_name.edit_label": "Rediger visningsnavn", "account_edit.display_name.placeholder": "Dit visningsnavn er det navn, der vises på din profil og i tidslinjer.", "account_edit.display_name.title": "Visningsnavn", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Tilføj hashtags", "account_edit.featured_hashtags.placeholder": "Hjælp andre med at identificere og få hurtig adgang til dine yndlingsemner.", "account_edit.featured_hashtags.title": "Fremhævede hashtags", + "account_edit.field_actions.delete": "Slet felt", + "account_edit.field_actions.edit": "Rediger felt", "account_edit.field_delete_modal.confirm": "Er du sikker på, at du vil slette dette brugerdefinerede felt? Denne handling kan ikke fortrydes.", "account_edit.field_delete_modal.delete_button": "Slet", "account_edit.field_delete_modal.title": "Slet brugerdefineret felt?", "account_edit.field_edit_modal.add_title": "Tilføj brugerdefineret felt", + "account_edit.field_edit_modal.discard_confirm": "Kassér", + "account_edit.field_edit_modal.discard_message": "Du har ændringer, der ikke er gemt. Er du sikker på, at du vil kassere dem?", "account_edit.field_edit_modal.edit_title": "Rediger brugerdefineret felt", - "account_edit.field_edit_modal.limit_header": "Anbefalet tegngrænse overskredet", - "account_edit.field_edit_modal.limit_message": "Mobilbrugere kan muligvis ikke se hele dit felt.", + "account_edit.field_edit_modal.length_warning": "Anbefalet tegngrænse overskredet. Mobilbrugere kan muligvis ikke se hele dit felt.", "account_edit.field_edit_modal.link_emoji_warning": "Vi fraråder brug af brugerdefinerede emoji i kombination med url'er. Brugerdefinerede felter, der indeholder begge dele, vises kun som tekst i stedet for som et link for at undgå forvirring hos brugerne.", "account_edit.field_edit_modal.name_hint": "F.eks. “Personligt websted”", "account_edit.field_edit_modal.name_label": "Etiket", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Rediger alt-tekst", "account_edit.image_edit.remove_button": "Fjern billede", "account_edit.image_edit.replace_button": "Erstat billede", + "account_edit.item_list.delete": "Slet {name}", + "account_edit.item_list.edit": "Rediger {name}", "account_edit.name_modal.add_title": "Tilføj visningsnavn", "account_edit.name_modal.edit_title": "Rediger visningsnavn", "account_edit.profile_tab.button_label": "Tilpas", @@ -208,8 +224,10 @@ "account_edit.profile_tab.show_media.title": "Vis fanebladet ‘Medier‘", "account_edit.profile_tab.show_media_replies.description": "Når aktiveret, viser fanen Medier både dine indlæg og svar på andres indlæg.", "account_edit.profile_tab.show_media_replies.title": "Inkludér svar på fanen 'Medier'", - "account_edit.profile_tab.subtitle": "Tilpas fanerne på din profil og det, de viser.", - "account_edit.profile_tab.title": "Indstillinger for profil-fane", + "account_edit.profile_tab.show_relations.description": "Viser de konti, du følger, samt dine følgere for andre brugere på din profil. Andre kan stadig se, om du følger dem.", + "account_edit.profile_tab.show_relations.title": "Vis ‘Følgere‘ og ‘Fulgte’", + "account_edit.profile_tab.subtitle": "Tilpas, hvordan din profil vises.", + "account_edit.profile_tab.title": "Indstillinger for profilvisning", "account_edit.save": "Gem", "account_edit.upload_modal.back": "Tilbage", "account_edit.upload_modal.done": "Færdig", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "Slip for at uploade", "account_edit.upload_modal.step_upload.header": "Vælg et billede", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eller JPG-format, op til {limit} MB.{br}Billede vil blive skaleret til {width}x{height} px.", - "account_edit.upload_modal.title_add": "Tilføj profilfoto", - "account_edit.upload_modal.title_replace": "Erstat profilfoto", + "account_edit.upload_modal.title_add.avatar": "Tilføj profilfoto", + "account_edit.upload_modal.title_add.header": "Tilføj coverfoto", + "account_edit.upload_modal.title_replace.avatar": "Erstat profilfoto", + "account_edit.upload_modal.title_replace.header": "Erstat coverfoto", "account_edit.verified_modal.details": "Øg troværdigheden af din Mastodon-profil ved at verificere links til personlige websteder. Sådan fungerer det:", "account_edit.verified_modal.invisible_link.details": "Føj linket til din header. Det vigtige er rel=\"me\", som forhindrer imitatorer på websteder med brugergenereret indhold. Du kan endda bruge et link-tag i sidens header i stedet for {tag}, men HTML-koden skal være tilgængelig uden at afvikle JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Hvordan gør jeg linket usynligt?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "Tilføj dit websted som et brugerdefineret felt", "account_edit.verified_modal.title": "Sådan tilføjes et bekræftet link", "account_edit_tags.add_tag": "Tilføj #{tagName}", - "account_edit_tags.column_title": "Rediger fremhævede hashtags", + "account_edit_tags.column_title": "Rediger etiket", "account_edit_tags.help_text": "Fremhævede hashtags hjælper brugere med at finde og interagere med din profil. De vises som filtre i aktivitetsvisningen på din profilside.", + "account_edit_tags.max_tags_reached": "Du har nået det maksimale antal fremhævede hashtags.", "account_edit_tags.search_placeholder": "Angiv et hashtag…", "account_edit_tags.suggestions": "Forslag:", "account_edit_tags.tag_status_count": "{count, plural, one {# indlæg} other {# indlæg}}", + "account_list.hidden_notice": "Dette kan kun ses af dig. Hvis du vil vise denne liste for andre, skal du gå til {page} > {modal} > {field}.", + "account_list.total": "{total, plural, one {# konto} other {# konti}}", "account_note.placeholder": "Klik for at tilføje notat", "admin.dashboard.daily_retention": "Brugerfastholdelsesrate pr. dag efter tilmelding", "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate pr. måned efter tilmelding", @@ -338,7 +361,7 @@ "closed_registrations_modal.find_another_server": "Find en anden server", "closed_registrations_modal.preamble": "Mastodon er decentraliseret, så uanset hvor du opretter din konto, vil du være i stand til at følge og interagere med hvem som helst på denne server. Du kan endda selv være vært for den!", "closed_registrations_modal.title": "Oprettelse på Mastodon", - "collection.share_modal.share_link_label": "Invitationlink til deling", + "collection.share_modal.share_link_label": "Del link", "collection.share_modal.share_via_post": "Del på Mastodon", "collection.share_modal.share_via_system": "Del med…", "collection.share_modal.title": "Del samling", @@ -346,8 +369,11 @@ "collection.share_template_other": "Tjek denne seje samling: {link}", "collection.share_template_own": "Tjek min nye samling: {link}", "collections.account_count": "{count, plural, one {# konto} other {# konti}}", - "collections.accounts.empty_description": "Tilføj op til {count} konti, du følger", + "collections.accounts.empty_description": "Tilføj op til {count} konti", + "collections.accounts.empty_editor_title": "Ingen er i denne samling endnu", "collections.accounts.empty_title": "Denne samling er tom", + "collections.block_collection_owner": "Blokér konto", + "collections.by_account": "af {account_handle}", "collections.collection_description": "Beskrivelse", "collections.collection_language": "Sprog", "collections.collection_language_none": "Intet", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "Er du sikker på, at du vil fjerne denne konto fra denne samling?", "collections.content_warning": "Indholdsadvarsel", "collections.continue": "Fortsæt", - "collections.create.accounts_subtitle": "Kun konti, du følger, og som har tilmeldt sig opdagelse, kan tilføjes.", + "collections.copy_link": "Kopiér link", + "collections.copy_link_confirmation": "Link til samling kopieret til udklipsholderen", "collections.create.accounts_title": "Hvem vil du fremhæve i denne samling?", "collections.create.basic_details_title": "Grundlæggende oplysninger", "collections.create.steps": "Trin {step}/{total}", - "collections.create_a_collection_hint": "Opret en samling for at anbefale eller dele dine yndlingskonti med andre.", "collections.create_collection": "Opret samling", "collections.delete_collection": "Slet samling", "collections.description_length_hint": "Begrænset til 100 tegn", - "collections.detail.accept_inclusion": "Okay", - "collections.detail.accounts_heading": "Konti", - "collections.detail.author_added_you": "{author} tilføjede dig til denne samling", - "collections.detail.curated_by_author": "Kurateret af {author}", - "collections.detail.curated_by_you": "Kurateret af dig", + "collections.detail.author_added_you_on_date": "{author} tilføjede dig {date}", "collections.detail.loading": "Indlæser samling…", - "collections.detail.other_accounts_in_collection": "Andre i denne samling:", "collections.detail.revoke_inclusion": "Fjern mig", + "collections.detail.sensitive_content": "Følsomt indhold", "collections.detail.sensitive_note": "Denne samling indeholder konti og indhold, der kan være følsomt for nogle brugere.", "collections.detail.share": "Del denne samling", + "collections.detail.you_are_in_this_collection": "Du er med i denne samling", "collections.edit_details": "Rediger detaljer", - "collections.error_loading_collections": "Der opstod en fejl under indlæsning af dine samlinger.", - "collections.hints.accounts_counter": "{count} / {max} konti", + "collections.error_loading_collections": "Der opstod en fejl under indlæsning af disse samlinger.", + "collections.hidden_accounts_description": "Du har blokeret eller skjult {count, plural, one {denne bruger} other {disse brugere}}", + "collections.hidden_accounts_link": "{count, plural, one {# skjult konto} other {# skjulte konti}}", + "collections.hints.accounts_counter": "{count}/{max} konti", "collections.last_updated_at": "Senest opdateret: {date}", + "collections.list.collections_with_count": "{count, plural, one {# samling} other {# samlinger}}", + "collections.list.created_by_author": "Oprettet af {name}", + "collections.list.created_by_you": "Oprettet af dig", + "collections.list.featuring_you": "Med dig", "collections.manage_accounts": "Administrer konti", "collections.mark_as_sensitive": "Markér som sensitiv", "collections.mark_as_sensitive_hint": "Skjuler samlingens beskrivelse og konti bag en indholdsadvarsel. Samlingens navn vil stadig være synligt.", + "collections.maximum_collection_count_description": "Din server tillader oprettelse af op til {count} samlinger.", + "collections.maximum_collection_count_reached": "Du har oprettet det maksimale antal samlinger", "collections.name_length_hint": "Begrænset til 40 tegn", "collections.new_collection": "Ny samling", - "collections.no_collections_yet": "Ingen samlinger endnu.", - "collections.old_last_post_note": "Seneste indlæg er fra over en uge siden", - "collections.remove_account": "Fjern denne konto", + "collections.pending_accounts.message": "Konti kan vises som afventende, når vi venter på et svar fra brugeren eller dennes server. Det er kun dig, der kan se de afventende konti.", + "collections.pending_accounts.title": "Hvorfor ser jeg afventende konti?", + "collections.remove_account": "Fjern", "collections.report_collection": "Anmeld denne samling", "collections.revoke_collection_inclusion": "Fjern mig selv fra denne samling", "collections.revoke_inclusion.confirmation": "Du er blevet fjernet fra \"{collection}\"", "collections.revoke_inclusion.error": "Der opstod en fejl, prøv igen senere.", - "collections.search_accounts_label": "Søg efter konti for at tilføje…", + "collections.search_accounts_label": "Søg efter en konto at tilføje", "collections.search_accounts_max_reached": "Du har tilføjet det maksimale antal konti", "collections.sensitive": "Sensitivt", + "collections.share_short": "Del", + "collections.suggestions.can_not_add": "Kan ikke tilføjes", + "collections.suggestions.can_not_add_desc": "Disse konti kan have fravalgt opdagelse, eller de kan være på en server, der ikke understøtter samlinger.", + "collections.suggestions.must_follow": "Skal følge først", + "collections.suggestions.must_follow_desc": "Disse konti gennemgår alle følge-anmodninger. Følgere kan tilføje dem til samlinger.", "collections.topic_hint": "Tilføj et hashtag, der hjælper andre med at forstå det overordnede emne for denne samling.", "collections.topic_special_chars_hint": "Specialtegn fjernes, når der gemmes", + "collections.unlisted_collections_description": "Disse vises ikke på din profil for andre. Alle, der har linket, kan finde dem.", + "collections.unlisted_collections_with_count": "Ikke-listede samlinger ({count})", "collections.view_collection": "Vis samling", - "collections.view_other_collections_by_user": "Se andre samlinger af denne bruger", "collections.visibility_public": "Offentlig", "collections.visibility_public_hint": "Kan opdages i søgeresultater og andre områder, hvor anbefalinger vises.", "collections.visibility_title": "Synlighed", @@ -405,7 +442,6 @@ "column.about": "Om", "column.blocks": "Blokerede brugere", "column.bookmarks": "Bogmærker", - "column.collections": "Mine samlinger", "column.community": "Lokal tidslinje", "column.create_list": "Opret liste", "column.direct": "Private omtaler", @@ -422,8 +458,10 @@ "column.lists": "Lister", "column.mutes": "Skjulte brugere", "column.notifications": "Notifikationer", + "column.other_collections": "Samlinger af {name}", "column.pins": "Fastgjorte indlæg", "column.public": "Fælles tidslinje", + "column.your_collections": "Dine samlinger", "column_back_button.label": "Tilbage", "column_header.hide_settings": "Skjul indstillinger", "column_header.moveLeft_settings": "Flyt kolonne til venstre", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "Kassér dit indlægsudkast?", "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.follow_to_collection.confirm": "Følg og føj til samling", - "confirmations.follow_to_collection.message": "Du skal følge {name} for at føje vedkommende til en samling.", - "confirmations.follow_to_collection.title": "Følg konto?", "confirmations.follow_to_list.confirm": "Følg og føj til liste", "confirmations.follow_to_list.message": "Du skal følge {name} for at føje vedkommende til en liste.", "confirmations.follow_to_list.title": "Følg bruger?", + "confirmations.hide_featured_tab.confirm": "Skjul fane", + "confirmations.hide_featured_tab.intro": "Du kan til enhver tid ændre dette under Rediger profil > Indstillinger for profil-fane.", + "confirmations.hide_featured_tab.message": "Dette vil skjule fanen for brugere på {serverName} og andre servere, der kører den nyeste version af Mastodon. Andre visninger kan variere.", + "confirmations.hide_featured_tab.title": "Skjul fanen \"Fremhævet\"?", "confirmations.logout.confirm": "Log ud", "confirmations.logout.message": "Er du sikker på, at du vil logge ud?", "confirmations.logout.title": "Log ud?", @@ -529,6 +568,7 @@ "content_warning.hide": "Skjul indlæg", "content_warning.show": "Vis alligevel", "content_warning.show_more": "Vis mere", + "content_warning.show_short": "Vis", "conversation.delete": "Slet samtale", "conversation.mark_as_read": "Markér som læst", "conversation.open": "Vis samtale", @@ -569,6 +609,14 @@ "domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.", "domain_pill.your_username": "Din unikke identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.", "dropdown.empty": "Vælg en indstilling", + "email_subscriptions.email": "E-mail", + "email_subscriptions.form.action": "Abonnér", + "email_subscriptions.form.bottom": "Få indlæg sendt direkte til din indbakke uden at oprette en Mastodon-konto. Du kan til enhver tid afmelde dig. For mere information henvises til privatlivspolitikken.", + "email_subscriptions.form.title": "Tilmeld dig e-mailopdateringer fra {name}", + "email_subscriptions.submitted.lead": "Kig i din indbakke efter en e-mail, hvor du kan afslutte tilmeldingen til e-mailopdateringer.", + "email_subscriptions.submitted.title": "Et trin mere", + "email_subscriptions.validation.email.blocked": "Blokeret e-mail-udbyder", + "email_subscriptions.validation.email.invalid": "Ugyldig e-mailadresse", "embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", @@ -586,15 +634,21 @@ "emoji_button.search_results": "Søgeresultater", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Rejser og steder", - "empty_column.account_featured.me": "Intet fremhævet endnu. Vidste du, at du kan fremhæve dine mest brugte hashtags og endda din vens konti på din profil?", - "empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu. Vidste du, at du kan fremhæve dine mest brugte hashtags og endda din vens konti på din profil?", - "empty_column.account_featured_other.unknown": "Denne konto har ikke fremhævet noget endnu.", + "empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu.", + "empty_column.account_featured_self.no_collections_button": "Opret en samling", + "empty_column.account_featured_self.no_collections_hide_tab": "Skjul denne fane i stedet", + "empty_column.account_featured_self.pre_collections": "Hold udkig efter Samlinger", + "empty_column.account_featured_self.pre_collections_desc": "Med samlinger (kommer i Mastodon 4.6) kan du oprette dine egne kuraterede lister over konti, som du kan anbefale til andre.", + "empty_column.account_featured_self.showcase_accounts": "Vis dine favoritkonti", + "empty_column.account_featured_self.showcase_accounts_desc": "Samlinger er kuraterede lister over konti, der skal hjælpe andre med at opdage mere af Fediverset.", + "empty_column.account_featured_unknown.other": "Denne konto har ikke fremhævet noget endnu.", "empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig", "empty_column.account_suspended": "Konto suspenderet", "empty_column.account_timeline": "Ingen indlæg her!", "empty_column.account_unavailable": "Profil utilgængelig", "empty_column.blocks": "Du har ikke blokeret nogle brugere endnu.", "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", + "empty_column.collections.featured_in": "Du er ikke blevet tilføjet til nogen samlinger endnu.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", "empty_column.direct": "Du har ikke nogen private omtaler endnu. Når du sender eller modtager en, vil den blive vist her.", "empty_column.disabled_feed": "Dette feed er blevet deaktiveret af dine serveradministratorer.", @@ -674,7 +728,9 @@ "follow_suggestions.who_to_follow": "Profiler, du kan følge", "followed_tags": "Hashtags, som følges", "followers.hide_other_followers": "Denne bruger har valgt ikke at gøre sine øvrige følgere synlige", + "followers.title": "Følger {name}", "following.hide_other_following": "Denne bruger har valgt at skjule resten af sine fulgte konti", + "following.title": "Følges af {name}", "footer.about": "Om", "footer.about_mastodon": "Om Mastodon", "footer.about_server": "Om {domain}", @@ -686,6 +742,7 @@ "footer.source_code": "Vis kildekode", "footer.status": "Status", "footer.terms_of_service": "Tjenestevilkår", + "form_error.blank": "Feltet må ikke være tomt.", "form_field.optional": "(valgfri)", "generic.saved": "Gemt", "getting_started.heading": "Startmenu", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "Udfold menuen Fulgte hashtags", "navigation_panel.expand_lists": "Udvid listemenu", "not_signed_in_indicator.not_signed_in": "Du skal logge ind for at tilgå denne ressource.", + "notification.added_to_collection": "{name} tilføjede dig til en samling", "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}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig", "notification.annual_report.message": "Din {year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!", "notification.annual_report.view": "Vis #Wrapstodon", + "notification.collection_update": "{name} redigerede en samling, du er med i", "notification.favourite": "{name} føjede dit indlæg til favoritter", "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter", "notification.favourite_pm": "{name} føjede din private omtale til favoritter", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "aktive brugere", "server_banner.administered_by": "Administreret af:", "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, du kan bruge for at deltage i fediverset.", + "server_banner.more_about_this_server": "Mere om denne server", "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.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index a0f9b9f06b18b0..77fbc6dd05ffd5 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -28,12 +28,10 @@ "account.block_domain": "{domain} blockieren", "account.block_short": "Blockieren", "account.blocked": "Blockiert", - "account.blocking": "Blockiert", "account.cancel_follow_request": "Anfrage zurückziehen", "account.copy": "Link zum Profil kopieren", "account.direct": "@{name} privat erwähnen", "account.disable_notifications": "Benachrichtige mich nicht mehr, wenn @{name} etwas veröffentlicht", - "account.domain_blocking": "Domain blockiert", "account.edit_note": "Persönliche Notiz bearbeiten", "account.edit_profile": "Profil bearbeiten", "account.edit_profile_short": "Bearbeiten", @@ -45,9 +43,7 @@ "account.featured": "Vorgestellt", "account.featured.accounts": "Profile", "account.featured.collections": "Sammlungen", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Neuester Beitrag vom {date}", - "account.featured_tags.last_status_never": "Keine Beiträge", + "account.featured.new_collection": "Neue Sammlung", "account.field_overflow": "Vollständigen Inhalt anzeigen", "account.filters.all": "Alle Aktivitäten", "account.filters.boosts_toggle": "Geteilte Beiträge anzeigen", @@ -73,9 +69,20 @@ "account.go_to_profile": "Profil aufrufen", "account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden", "account.in_memoriam": "Zum Andenken.", - "account.joined_short": "Registriert am", + "account.join_modal.day": "Tag", + "account.join_modal.me": "Du bist auf {server} dabei seit", + "account.join_modal.me_anniversary": "Alles Gute zum Fediläum! Auf {server} bist du seit", + "account.join_modal.me_today": "Dein erster Tag auf {server}!", + "account.join_modal.other": "{name} ist auf {server} dabei seit", + "account.join_modal.other_today": "{name} ist seit einem Tag auf {server}!", + "account.join_modal.share.celebrate": "Teile die Feierlichkeit", + "account.join_modal.share.intro": "Teile einen Einblick über dich", + "account.join_modal.share.welcome": "Teile ein herzliches Willkommen", + "account.join_modal.years": "{number, plural, one {Jahr} other {Jahre}}", + "account.joined_short": "Dabei seit", "account.languages": "Sprachen verwalten", - "account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt", + "account.last_active": "Zuletzt aktiv", + "account.link_verified_on": "Dieser Link wurde am {date} Uhr verifiziert", "account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.", "account.media": "Medien", "account.mention": "@{name} erwähnen", @@ -83,7 +90,7 @@ "account.menu.block": "Konto blockieren", "account.menu.block_domain": "{domain} blockieren", "account.menu.copied": "Profillink in die Zwischenablage kopiert", - "account.menu.copy": "Link kopieren", + "account.menu.copy": "Profillink kopieren", "account.menu.direct": "Privat erwähnen", "account.menu.hide_reblogs": "Geteilte Beiträge in der Timeline ausblenden", "account.menu.mention": "Erwähnen", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Benachrichtigungen stummschalten", "account.mute_short": "Stummschalten", "account.muted": "Stummgeschaltet", - "account.muting": "Stummgeschaltet", "account.mutual": "Ihr folgt einander", + "account.name.copy": "Adresse kopieren", "account.name.help.domain": "{domain} ist der Server, auf dem das Profil registriert ist und die Beiträge verwaltet werden.", "account.name.help.domain_self": "{domain} ist der Server, auf dem du registriert bist und deine Beiträge verwaltet werden.", - "account.name.help.footer": "So wie du E-Mails an andere trotz unterschiedlicher E-Mail-Provider senden kannst, so kannst du auch mit anderen Profilen auf unterschiedlichen Mastodon-Servern interagieren. Wenn andere soziale Apps die gleichen Kommunikationsregeln (das ActivityPub-Protokoll) wie Mastodon verwenden, dann funktioniert die Kommunikation auch dort.", + "account.name.help.footer": "So wie du E-Mails an andere trotz unterschiedlicher E-Mail-Provider senden kannst, so kannst du auch mit anderen Profilen auf unterschiedlichen Mastodon-Servern interagieren. Wenn andere soziale Apps mit Mastodon kompatibel sind, dann funktioniert die Kommunikation auch dort.", "account.name.help.header": "Deine Adresse im Fediverse ist wie eine E-Mail-Adresse", "account.name.help.username": "{username} ist der Profilname auf deren Server. Es ist möglich, dass jemand auf einem anderen Server den gleichen Profilnamen hat.", "account.name.help.username_self": "{username} ist dein Profilname auf diesem Server. Es ist möglich, dass jemand auf einem anderen Server den gleichen Profilnamen hat.", @@ -120,13 +127,12 @@ "account.node_modal.title": "Persönliche Notiz hinzufügen", "account.note.edit_button": "Bearbeiten", "account.note.title": "Persönliche Notiz (nur für dich sichtbar)", - "account.open_original_page": "Originalbeitrag öffnen", + "account.open_original_page": "Originalseite öffnen", + "account.pending": "Ausstehend", "account.posts": "Beiträge", - "account.posts_with_replies": "Beiträge & Antworten", "account.remove_from_followers": "@{name} als Follower entfernen", "account.report": "@{name} melden", "account.requested_follow": "{name} möchte dir folgen", - "account.requests_to_follow_you": "Möchte dir folgen", "account.share": "Profil von @{name} teilen", "account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen", "account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}", @@ -141,34 +147,42 @@ "account.unmute": "Stummschaltung von @{name} aufheben", "account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben", "account.unmute_short": "Stummschaltung aufheben", + "account_edit.advanced_settings.bot_hint": "Signalisiert anderen, dass dieses Konto vor allem automatisierte Aktionen durchführt und möglicherweise nicht persönlich betreut oder moderiert wird", + "account_edit.advanced_settings.bot_label": "Automatisiertes Konto", + "account_edit.advanced_settings.title": "Erweiterte Einstellungen", + "account_edit.bio.add_label": "Biografie hinzufügen", + "account_edit.bio.edit_label": "Biografie bearbeiten", "account_edit.bio.placeholder": "Gib anderen einen Einblick über dich, damit sie wissen, wer du bist.", "account_edit.bio.title": "Über mich", "account_edit.bio_modal.add_title": "Biografie hinzufügen", "account_edit.bio_modal.edit_title": "Biografie bearbeiten", - "account_edit.button.add": "{item} hinzufügen", - "account_edit.button.delete": "{item} löschen", - "account_edit.button.edit": "{item} bearbeiten", "account_edit.column_button": "Erledigt", "account_edit.column_title": "Profil bearbeiten", - "account_edit.custom_fields.name": "Feld", + "account_edit.custom_fields.add_label": "Zusatzfeld hinzufügen", + "account_edit.custom_fields.edit_label": "Zusatzfeld bearbeiten", "account_edit.custom_fields.placeholder": "Ergänze deine Pronomen, weiterführenden Links oder etwas anderes, das du teilen möchtest.", "account_edit.custom_fields.reorder_button": "Felder neu anordnen", "account_edit.custom_fields.tip_content": "Du kannst deine Echtheit im Mastodon-Profil beweisen, wenn du verifizierte Links zu deinen Websites bereitstellst.", "account_edit.custom_fields.tip_title": "Tipp: Ergänze verifizierte Links", "account_edit.custom_fields.title": "Zusatzfelder", "account_edit.custom_fields.verified_hint": "Wie erstelle ich einen verifizierten Link?", + "account_edit.display_name.add_label": "Anzeigenamen hinzufügen", + "account_edit.display_name.edit_label": "Anzeigenamen bearbeiten", "account_edit.display_name.placeholder": "Dein Anzeigename wird auf deinem Profil und in Timelines angezeigt.", "account_edit.display_name.title": "Anzeigename", - "account_edit.featured_hashtags.item": "Hashtags", + "account_edit.featured_hashtags.edit_label": "Hashtags hinzufügen", "account_edit.featured_hashtags.placeholder": "Präsentiere deine Lieblingsthemen und ermögliche anderen einen schnellen Zugriff darauf.", "account_edit.featured_hashtags.title": "Vorgestellte Hashtags", + "account_edit.field_actions.delete": "Zusatzfeld löschen", + "account_edit.field_actions.edit": "Zusatzfeld bearbeiten", "account_edit.field_delete_modal.confirm": "Möchtest du dieses Zusatzfeld wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "account_edit.field_delete_modal.delete_button": "Löschen", "account_edit.field_delete_modal.title": "Zusatzfeld löschen?", "account_edit.field_edit_modal.add_title": "Zusatzfeld hinzufügen", + "account_edit.field_edit_modal.discard_confirm": "Verwerfen", + "account_edit.field_edit_modal.discard_message": "Du hast Änderungen vorgenommen, die noch nicht gespeichert sind. Trotzdem verwerfen?", "account_edit.field_edit_modal.edit_title": "Zusatzfeld bearbeiten", - "account_edit.field_edit_modal.limit_header": "Empfohlenes Zeichenlimit überschritten", - "account_edit.field_edit_modal.limit_message": "Auf mobilen Endgeräten wird das Feld möglicherweise nicht vollständig angezeigt.", + "account_edit.field_edit_modal.length_warning": "Empfohlene Zeichenanzahl überschritten. Auf mobilen Geräten wird dieses Feld möglicherweise nicht vollständig angezeigt.", "account_edit.field_edit_modal.link_emoji_warning": "Das Verwenden von Emojis wird bei URLs nicht empfohlen. Die Zusatzfelder werden bei dieser Kombination nur als Text und nicht als Link dargestellt.", "account_edit.field_edit_modal.name_hint": "z. B. „Meine Website“", "account_edit.field_edit_modal.name_label": "Beschriftung", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Bildbeschreibung bearbeiten", "account_edit.image_edit.remove_button": "Bild entfernen", "account_edit.image_edit.replace_button": "Bild ersetzen", + "account_edit.item_list.delete": "{name} löschen", + "account_edit.item_list.edit": "{name} bearbeiten", "account_edit.name_modal.add_title": "Anzeigenamen hinzufügen", "account_edit.name_modal.edit_title": "Anzeigenamen bearbeiten", "account_edit.profile_tab.button_label": "Anpassen", @@ -208,8 +224,10 @@ "account_edit.profile_tab.show_media.title": "„Medien“-Tab anzeigen", "account_edit.profile_tab.show_media_replies.description": "Durch das Aktivieren werden sowohl deine Beiträge als auch deine Antworten auf Beiträge anderer im „Medien“-Tab angezeigt.", "account_edit.profile_tab.show_media_replies.title": "Antworten im „Medien“-Tab anzeigen", - "account_edit.profile_tab.subtitle": "Passe die Tabs deines Profils und deren Inhalte an.", - "account_edit.profile_tab.title": "Profil-Tab-Einstellungen", + "account_edit.profile_tab.show_relations.description": "Dadurch werden die Konten, die dir folgen, und die Profile, denen du folgst, für andere sichtbar. Sie werden immer sehen können, ob du ihnen folgst.", + "account_edit.profile_tab.show_relations.title": "Follower und „Folge ich“ anzeigen", + "account_edit.profile_tab.subtitle": "Passe die Darstellung deines Profils an.", + "account_edit.profile_tab.title": "Einstellungen für die Profilübersicht", "account_edit.save": "Speichern", "account_edit.upload_modal.back": "Zurück", "account_edit.upload_modal.done": "Fertig", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "Zum Hochladen hier ablegen", "account_edit.upload_modal.step_upload.header": "Wähle ein Bild", "account_edit.upload_modal.step_upload.hint": "WebP, PNG, GIF oder JPG. Höchstens {limit} MB groß.{br}Das Bild wird auf {width}x{height} px skaliert.", - "account_edit.upload_modal.title_add": "Profilbild hinzufügen", - "account_edit.upload_modal.title_replace": "Profilbild ändern", + "account_edit.upload_modal.title_add.avatar": "Profilbild hinzufügen", + "account_edit.upload_modal.title_add.header": "Titelbild hinzufügen", + "account_edit.upload_modal.title_replace.avatar": "Profilbild ersetzen", + "account_edit.upload_modal.title_replace.header": "Titelbild ersetzen", "account_edit.verified_modal.details": "Beweise die Echtheit deines Mastodon-Profils, indem du verifizierte Links zu deinen persönlichen Websites ergänzt. So funktioniert’s:", "account_edit.verified_modal.invisible_link.details": "Füge den Link in den Header ein. Der wichtige Teil ist rel=\"me\". Du kannst auch den Tag link im Header (statt {tag}) verwenden, jedoch muss die Internetseite ohne JavaScript abrufbar sein.", "account_edit.verified_modal.invisible_link.summary": "Wie blende ich den Link aus?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "Ergänze deine Website in ein Zusatzfeld", "account_edit.verified_modal.title": "So erstellst du einen verifizierten Link", "account_edit_tags.add_tag": "#{tagName} hinzufügen", - "account_edit_tags.column_title": "Vorgestellte Hashtags bearbeiten", + "account_edit_tags.column_title": "Hashtags bearbeiten", "account_edit_tags.help_text": "Vorgestellte Hashtags können dabei helfen, dein Profil zu entdecken und besser mit dir zu interagieren. Sie dienen als Filter in der Aktivitätenübersicht deines Profils.", + "account_edit_tags.max_tags_reached": "Du hast die maximale Anzahl an vorgestellten Hashtags erreicht.", "account_edit_tags.search_placeholder": "Gib einen Hashtag ein …", "account_edit_tags.suggestions": "Vorschläge:", "account_edit_tags.tag_status_count": "{count, plural, one {# Beitrag} other {# Beiträge}}", + "account_list.hidden_notice": "Die Liste ist nur für dich sichtbar. Damit sie für andere zugänglich wird, rufe {page} > {modal}> {field} auf.", + "account_list.total": "{total, plural, one {# Konto} other {# Konten}}", "account_note.placeholder": "Klicken, um private Anmerkung hinzuzufügen", "admin.dashboard.daily_retention": "Verweildauer der Nutzer*innen pro Tag seit der Registrierung", "admin.dashboard.monthly_retention": "Verweildauer der Nutzer*innen pro Monat seit der Registrierung", @@ -338,7 +361,7 @@ "closed_registrations_modal.find_another_server": "Anderen Server suchen", "closed_registrations_modal.preamble": "Mastodon ist dezentralisiert, das heißt, unabhängig davon, wo du dein Konto erstellst, kannst du jedem Profil auf diesem Server folgen und mit ihm interagieren. Du kannst sogar deinen eigenen Mastodon-Server hosten!", "closed_registrations_modal.title": "Bei Mastodon registrieren", - "collection.share_modal.share_link_label": "Link zum Teilen", + "collection.share_modal.share_link_label": "Link teilen", "collection.share_modal.share_via_post": "Auf Mastodon veröffentlichen", "collection.share_modal.share_via_system": "Teilen …", "collection.share_modal.title": "Sammlung teilen", @@ -346,8 +369,11 @@ "collection.share_template_other": "Seht euch diese coole Sammlung an: {link}", "collection.share_template_own": "Seht euch meine neue Sammlung an: {link}", "collections.account_count": "{count, plural, one {# Konto} other {# Konten}}", - "collections.accounts.empty_description": "Füge bis zu {count} Konten, denen du folgst, hinzu", + "collections.accounts.empty_description": "Füge bis zu {count} Konten hinzu", + "collections.accounts.empty_editor_title": "Noch befindet sich niemand in dieser Sammlung", "collections.accounts.empty_title": "Diese Sammlung ist leer", + "collections.block_collection_owner": "Konto blockieren", + "collections.by_account": "von {account_handle}", "collections.collection_description": "Beschreibung", "collections.collection_language": "Sprache", "collections.collection_language_none": "Nicht festgelegt", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "Möchtest du dieses Konto wirklich aus der Sammlung entfernen?", "collections.content_warning": "Inhaltswarnung", "collections.continue": "Fortfahren", - "collections.create.accounts_subtitle": "Du kannst nur Profile hinzufügen, denen du folgst und die das Hinzufügen gestatten.", + "collections.copy_link": "Link kopieren", + "collections.copy_link_confirmation": "Link zur Sammlung in die Zwischenablage kopiert", "collections.create.accounts_title": "Wen möchtest du in dieser Sammlung präsentieren?", "collections.create.basic_details_title": "Allgemeine Informationen", "collections.create.steps": "Schritt {step}/{total}", - "collections.create_a_collection_hint": "Erstelle eine Sammlung, um deine Lieblingsprofile anderen zu empfehlen oder sie zu teilen.", "collections.create_collection": "Sammlung erstellen", "collections.delete_collection": "Sammlung löschen", "collections.description_length_hint": "Maximal 100 Zeichen", - "collections.detail.accept_inclusion": "Einverstanden", - "collections.detail.accounts_heading": "Konten", - "collections.detail.author_added_you": "{author} hat dich zur Sammlung hinzugefügt", - "collections.detail.curated_by_author": "Kuratiert von {author}", - "collections.detail.curated_by_you": "Kuratiert von dir", + "collections.detail.author_added_you_on_date": "{author} fügte dich am {date} hinzu", "collections.detail.loading": "Sammlung wird geladen …", - "collections.detail.other_accounts_in_collection": "Weitere Profile in dieser Sammlung:", "collections.detail.revoke_inclusion": "Mich entfernen", + "collections.detail.sensitive_content": "Inhaltswarnung", "collections.detail.sensitive_note": "Diese Sammlung enthält Profile und Inhalte, die manche als anstößig empfinden.", "collections.detail.share": "Sammlung teilen", + "collections.detail.you_are_in_this_collection": "Du bist ein Teil dieser Sammlung", "collections.edit_details": "Details bearbeiten", - "collections.error_loading_collections": "Beim Laden deiner Sammlungen ist ein Fehler aufgetreten.", + "collections.error_loading_collections": "Beim Laden dieser Sammlungen ist ein Fehler aufgetreten.", + "collections.hidden_accounts_description": "Du hast {count, plural, one {dieses Profil} other {diese Profile}} blockiert oder stummgeschaltet", + "collections.hidden_accounts_link": "{count, plural, one {# Konto ausgeblendet} other {# Konten ausgeblendet}}", "collections.hints.accounts_counter": "{count}/{max} Konten", "collections.last_updated_at": "Aktualisiert: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Sammlung} other {# Sammlungen}}", + "collections.list.created_by_author": "Von {name} erstellt", + "collections.list.created_by_you": "Von mir erstellt", + "collections.list.featuring_you": "Stellen mich vor", "collections.manage_accounts": "Profile verwalten", "collections.mark_as_sensitive": "Mit Inhaltswarnung versehen", "collections.mark_as_sensitive_hint": "Die Beschreibung sowie enthaltenen Profile werden durch eine Inhaltswarnung ausgeblendet. Der Titel bleibt weiterhin sichtbar.", + "collections.maximum_collection_count_description": "Auf deinem Server darfst du bis zu {count} Sammlungen erstellen.", + "collections.maximum_collection_count_reached": "Du hast die Höchstzahl an Sammlungen erreicht", "collections.name_length_hint": "Maximal 40 Zeichen", "collections.new_collection": "Neue Sammlung", - "collections.no_collections_yet": "Bisher keine Sammlungen vorhanden.", - "collections.old_last_post_note": "Neuester Beitrag mehr als eine Woche alt", - "collections.remove_account": "Dieses Konto entfernen", + "collections.pending_accounts.message": "Ein Konto erscheint als ausstehend, wenn eine Antwort vom Konto oder deren Server erwartet wird. Ausstehende Konten sind nur für dich sichtbar.", + "collections.pending_accounts.title": "Warum sehe ich ausstehende Konten?", + "collections.remove_account": "Entfernen", "collections.report_collection": "Sammlung melden", "collections.revoke_collection_inclusion": "Mich aus dieser Sammlung entfernen", "collections.revoke_inclusion.confirmation": "Du wurdest aus „{collection}“ entfernt", "collections.revoke_inclusion.error": "Es ist ein Fehler aufgetreten. Bitte versuche es später erneut.", - "collections.search_accounts_label": "Suche nach Konten, um sie hinzuzufügen …", + "collections.search_accounts_label": "Suche nach einem Konto, um es hinzuzufügen", "collections.search_accounts_max_reached": "Du hast die Höchstzahl an Konten hinzugefügt", "collections.sensitive": "Inhaltswarnung", + "collections.share_short": "Teilen", + "collections.suggestions.can_not_add": "Kann nicht hinzugefügt werden", + "collections.suggestions.can_not_add_desc": "Diese Konten möchten möglicherweise nicht entdeckt werden oder deren Server unterstützt noch keine Sammlungen.", + "collections.suggestions.must_follow": "Profil muss gefolgt werden", + "collections.suggestions.must_follow_desc": "Diese Konten überprüfen ihre Follower-Anfragen manuell. Follower können sie zu Sammlungen hinzufügen.", "collections.topic_hint": "Ein Hashtag für diese Sammlung kann anderen dabei helfen, dein Anliegen besser einordnen zu können.", "collections.topic_special_chars_hint": "Sonderzeichen werden beim Speichern entfernt", + "collections.unlisted_collections_description": "Die Sammlungen sind für andere nicht auf deinem Profil sichtbar. Ein direkter Zugriff ist per Link möglich.", + "collections.unlisted_collections_with_count": "Nicht öffentliche Sammlungen ({count})", "collections.view_collection": "Sammlungen anzeigen", - "collections.view_other_collections_by_user": "Andere Sammlungen dieses Kontos ansehen", "collections.visibility_public": "Öffentlich", "collections.visibility_public_hint": "Wird in den Suchergebnissen und anderen Bereichen mit Empfehlungen angezeigt.", "collections.visibility_title": "Sichtbarkeit", @@ -405,7 +442,6 @@ "column.about": "Über", "column.blocks": "Blockierte Profile", "column.bookmarks": "Lesezeichen", - "column.collections": "Meine Sammlungen", "column.community": "Lokale Timeline", "column.create_list": "Liste erstellen", "column.direct": "Private Erwähnungen", @@ -422,8 +458,10 @@ "column.lists": "Listen", "column.mutes": "Stummgeschaltete Profile", "column.notifications": "Benachrichtigungen", + "column.other_collections": "Sammlungen von {name}", "column.pins": "Angeheftete Beiträge", "column.public": "Föderierte Timeline", + "column.your_collections": "Deine Sammlungen", "column_back_button.label": "Zurück", "column_header.hide_settings": "Einstellungen ausblenden", "column_header.moveLeft_settings": "Diese Spalte nach links verschieben", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "Entwurf verwerfen?", "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.follow_to_collection.confirm": "Folgen und zur Sammlung hinzufügen", - "confirmations.follow_to_collection.message": "Du musst {name} folgen, um das Profil zu einer Sammlung hinzufügen zu können.", - "confirmations.follow_to_collection.title": "Konto folgen?", "confirmations.follow_to_list.confirm": "Folgen und zur Liste hinzufügen", "confirmations.follow_to_list.message": "Du musst {name} folgen, um das Profil zu einer Liste hinzufügen zu können.", "confirmations.follow_to_list.title": "Profil folgen?", + "confirmations.hide_featured_tab.confirm": "Tab ausblenden", + "confirmations.hide_featured_tab.intro": "Du kannst die Einstellungen jederzeit unter Profil bearbeiten > Profil-Tab-Einstellungen ändern.", + "confirmations.hide_featured_tab.message": "Dieser Tab wird auf {serverName} und auf anderen Servern ab Mastodon v4.6 nicht angezeigt. Anderswo kann die Darstellung abweichen.", + "confirmations.hide_featured_tab.title": "„Vorgestellt“-Tab ausblenden?", "confirmations.logout.confirm": "Abmelden", "confirmations.logout.message": "Möchtest du dich wirklich ausloggen?", "confirmations.logout.title": "Abmelden?", @@ -529,6 +568,7 @@ "content_warning.hide": "Beitrag ausblenden", "content_warning.show": "Trotzdem anzeigen", "content_warning.show_more": "Beitrag anzeigen", + "content_warning.show_short": "Anzeigen", "conversation.delete": "Unterhaltung löschen", "conversation.mark_as_read": "Als gelesen markieren", "conversation.open": "Unterhaltung anzeigen", @@ -569,6 +609,14 @@ "domain_pill.your_server": "Deine digitale Heimat. Hier „leben“ alle Beiträge von dir. Falls es dir hier nicht gefällt, kannst du jederzeit den Server wechseln und ebenso deine Follower übertragen.", "domain_pill.your_username": "Deine eindeutige Identität auf diesem Server. Es ist möglich, Profile mit dem gleichen Profilnamen auf verschiedenen Servern zu finden.", "dropdown.empty": "Option auswählen", + "email_subscriptions.email": "E-Mail-Adresse", + "email_subscriptions.form.action": "Abonnieren", + "email_subscriptions.form.bottom": "Lass dir Beiträge per E-Mail zuschicken, ohne ein Mastodon-Konto zu erstellen. Du kannst die E-Mail-Abonnements jederzeit abbestellen. Weitere Details findest du in der Datenschutzerklärung.", + "email_subscriptions.form.title": "Erhalte eine E-Mail bei Neuigkeiten von {name}", + "email_subscriptions.submitted.lead": "Überprüfe dein Postfach, um die Benachrichtigungen per E-Mail zu aktivieren.", + "email_subscriptions.submitted.title": "Ein weiterer Schritt", + "email_subscriptions.validation.email.blocked": "Gesperrter E-Mail-Provider", + "email_subscriptions.validation.email.invalid": "Ungültige E-Mail-Adresse", "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. in deine Website) einbetten, indem du diesen Code kopierst und dort einfügst.", "embed.preview": "Vorschau:", "emoji_button.activity": "Aktivitäten", @@ -586,15 +634,21 @@ "emoji_button.search_results": "Suchergebnisse", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Reisen & Orte", - "empty_column.account_featured.me": "Du hast bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?", - "empty_column.account_featured.other": "{acct} hat bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?", - "empty_column.account_featured_other.unknown": "Dieses Profil hat bisher noch nichts vorgestellt.", + "empty_column.account_featured.other": "{acct} hat noch nichts vorgestellt.", + "empty_column.account_featured_self.no_collections_button": "Sammlung erstellen", + "empty_column.account_featured_self.no_collections_hide_tab": "Diesen Tab ausblenden", + "empty_column.account_featured_self.pre_collections": "Sammlungen sind bald verfügbar", + "empty_column.account_featured_self.pre_collections_desc": "Mit Sammlungen (ab Mastodon v4.6) kannst du eigene Listen kuratieren, um auf empfehlenswerte Profile hinzuweisen.", + "empty_column.account_featured_self.showcase_accounts": "Präsentiere deine liebsten Konten", + "empty_column.account_featured_self.showcase_accounts_desc": "Sammlungen sind kuratierte Listen, die anderen helfen, mehr Konten im Fediverse zu entdecken.", + "empty_column.account_featured_unknown.other": "Dieser Account hat noch nichts vorgestellt.", "empty_column.account_hides_collections": "Das Profil hat sich entschieden, diese Information nicht zu veröffentlichen", "empty_column.account_suspended": "Konto dauerhaft gesperrt", "empty_column.account_timeline": "Keine Beiträge vorhanden!", "empty_column.account_unavailable": "Profil nicht verfügbar", "empty_column.blocks": "Du hast bisher keine Profile blockiert.", "empty_column.bookmarked_statuses": "Du hast bisher keine Beiträge als Lesezeichen abgelegt. Sobald du einen Beitrag als Lesezeichen speicherst, wird er hier erscheinen.", + "empty_column.collections.featured_in": "Du wurdest noch keiner Sammlung hinzugefügt.", "empty_column.community": "Die lokale Timeline ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!", "empty_column.direct": "Du hast noch keine privaten Erwähnungen. Sobald du eine sendest oder erhältst, wird sie hier erscheinen.", "empty_column.disabled_feed": "Diesen Feed haben deine Server-Administrator*innen deaktiviert.", @@ -674,7 +728,9 @@ "follow_suggestions.who_to_follow": "Wem folgen?", "followed_tags": "Abonnierte Hashtags", "followers.hide_other_followers": "Dieses Profil möchte die weiteren Follower geheim halten", + "followers.title": "Folgt {name}", "following.hide_other_following": "Dieses Profil möchte die gefolgten Profile geheim halten", + "following.title": "Von {name} gefolgt", "footer.about": "Über", "footer.about_mastodon": "Über Mastodon", "footer.about_server": "Über {domain}", @@ -686,6 +742,7 @@ "footer.source_code": "Quellcode anzeigen", "footer.status": "Status", "footer.terms_of_service": "Nutzungsbedingungen", + "form_error.blank": "Feld darf nicht leer sein.", "form_field.optional": "(optional)", "generic.saved": "Gespeichert", "getting_started.heading": "Auf gehts!", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "Menü für abonnierte Hashtags öffnen", "navigation_panel.expand_lists": "Listen-Menü öffnen", "not_signed_in_indicator.not_signed_in": "Du musst dich anmelden, um auf diesen Inhalt zugreifen zu können.", + "notification.added_to_collection": "{name} hat dich einer Sammlung hinzugefügt", "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}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} registrierten sich", "notification.annual_report.message": "Dein #Wrapstodon für {year} erwartet dich! Lass deine Highlights und unvergesslichen Momente auf Mastodon erneut aufleben!", "notification.annual_report.view": "#Wrapstodon ansehen", + "notification.collection_update": "{name} hat eine Sammlung bearbeitet, in der du vorgestellt wirst", "notification.favourite": "{name} favorisierte deinen Beitrag", "notification.favourite.name_and_others_with_link": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} favorisierten deinen Beitrag", "notification.favourite_pm": "{name} favorisierte deine private Erwähnung", @@ -907,9 +966,9 @@ "notification.quoted_update": "{name} bearbeitete einen von dir zitierten Beitrag", "notification.reblog": "{name} teilte deinen Beitrag", "notification.reblog.name_and_others_with_link": "{name} und {count, plural, one {# weiteres Profil} other {# weitere Profile}} teilten 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.", - "notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} blockiert – darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.", + "notification.relationships_severance_event": "Verbindung zu {name} verloren", + "notification.relationships_severance_event.account_suspension": "Administrator*innen von {from} haben den Zugriff auf den externen Server {target} gesperrt. Das bedeutet, dass du keine Inhalte mehr von dort erhältst. Du kannst auch nicht mehr mit den Profilen dieses Servers interagieren.", + "notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} gesperrt – darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.", "notification.relationships_severance_event.learn_more": "Mehr erfahren", "notification.relationships_severance_event.user_domain_block": "Du hast {target} blockiert – {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst, wurden entfernt.", "notification.status": "{name} veröffentlichte …", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "aktive Profile", "server_banner.administered_by": "Verwaltet von:", "server_banner.is_one_of_many": "{domain} ist einer von vielen unabhängigen Mastodon-Servern, mit dem du dich im Fediverse beteiligen kannst.", + "server_banner.more_about_this_server": "Mehr über diesen Server", "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Konto erstellen", "sign_in_banner.follow_anyone": "Du kannst jedem im Fediverse folgen und alles in chronologischer Reihenfolge sehen. Keine Algorithmen, Werbung oder Clickbaits vorhanden.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 16b51552fd8612..60c1a17c45eaf2 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -28,12 +28,10 @@ "account.block_domain": "Αποκλεισμός τομέα {domain}", "account.block_short": "Αποκλεισμός", "account.blocked": "Αποκλεισμένος/η", - "account.blocking": "Αποκλείεται", "account.cancel_follow_request": "Απόσυρση αιτήματος παρακολούθησης", "account.copy": "Αντιγραφή συνδέσμου προφίλ", "account.direct": "Ιδιωτική επισήμανση @{name}", "account.disable_notifications": "Σταμάτα να με ειδοποιείς όταν δημοσιεύει ο @{name}", - "account.domain_blocking": "Αποκλείεται ο τομέας", "account.edit_note": "Επεξεργασία προσωπικής σημείωσης", "account.edit_profile": "Επεξεργασία προφίλ", "account.edit_profile_short": "Επεξεργασία", @@ -45,9 +43,7 @@ "account.featured": "Αναδεδειγμένα", "account.featured.accounts": "Προφίλ", "account.featured.collections": "Συλλογές", - "account.featured.hashtags": "Ετικέτες", - "account.featured_tags.last_status_at": "Τελευταία ανάρτηση στις {date}", - "account.featured_tags.last_status_never": "Καμία ανάρτηση", + "account.featured.new_collection": "Νέα συλλογή", "account.field_overflow": "Εμφάνιση πλήρους περιεχομένου", "account.filters.all": "Όλη η δραστηριότητα", "account.filters.boosts_toggle": "Εμφάνιση ενισχύσεων", @@ -73,10 +69,21 @@ "account.go_to_profile": "Μετάβαση στο προφίλ", "account.hide_reblogs": "Απόκρυψη ενισχύσεων από @{name}", "account.in_memoriam": "Εις μνήμην.", + "account.join_modal.day": "Ημέρα", + "account.join_modal.me": "Έγινες μέλος στο {server} στις", + "account.join_modal.me_anniversary": "Ευτυχισμένο Fediversary! Έγινες μέλος στο {server} στις", + "account.join_modal.me_today": "Είναι η πρώτη σου μέρα στο {server}!", + "account.join_modal.other": "Ο/Η {name} έγινε μέλος στο {server} στις", + "account.join_modal.other_today": "Είναι η πρώτη μέρα του/της {name} στο {server}!", + "account.join_modal.share.celebrate": "Μοιράσου μια εορταστική ανάρτηση", + "account.join_modal.share.intro": "Μοιράσου μια εισαγωγική ανάρτηση", + "account.join_modal.share.welcome": "Μοιράσου μια ανάρτηση καλωσορίσματος", + "account.join_modal.years": "{number, plural, one {χρόνος} other {χρόνια}}", "account.joined_short": "Έγινε μέλος", "account.languages": "Αλλαγή εγγεγραμμένων γλωσσών", + "account.last_active": "Τελευταία ενεργός", "account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις {date}", - "account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού έχει ρυθμιστεί σε κλειδωμένη. Ο ιδιοκτήτης αξιολογεί χειροκίνητα ποιος μπορεί να τον ακολουθήσει.", + "account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού έχει ρυθμιστεί σε κλειδωμένη. Ο ιδιοκτήτης ελέγχει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.", "account.media": "Πολυμέσα", "account.mention": "Επισήμανση @{name}", "account.menu.add_to_list": "Προσθήκη στη λίστα…", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Σίγαση ειδοποιήσεων", "account.mute_short": "Σίγαση", "account.muted": "Σε σίγαση", - "account.muting": "Σίγαση", "account.mutual": "Ακολουθείτε ο ένας τον άλλο", + "account.name.copy": "Αντιγραφή πλήρους ονόματος χρήστη", "account.name.help.domain": "Το {domain} είναι ο διακομιστής που φιλοξενεί το προφίλ και τις αναρτήσεις του χρήστη.", "account.name.help.domain_self": "Το {domain} είναι ο διακομιστής σας που φιλοξενεί το προφίλ και τις αναρτήσεις σας.", - "account.name.help.footer": "Ακριβώς όπως μπορείτε να στείλετε μηνύματα ηλεκτρονικού ταχυδρομείου σε άτομα χρησιμοποιώντας διαφορετικούς παρόχους email, μπορείτε να αλληλεπιδράσετε με άτομα σε άλλους διακομιστές Mastodon – και με οποιονδήποτε σε άλλες κοινωνικές εφαρμογές που τροφοδοτούνται από το ίδιο σύνολο κανόνων όπως χρησιμοποιεί το Mastodon (το πρωτόκολλο ActivityPub).", + "account.name.help.footer": "Ακριβώς όπως μπορείς να στείλεις email σε κόσμο χρησιμοποιώντας διαφορετικούς παρόχους ηλεκτρονικού ταχυδρομείου, μπορείς να αλληλεπιδράσεις με άτομα σε άλλους διακομιστές Mastodon, και με οποιονδήποτε σε άλλες κοινωνικές εφαρμογές συμβατές με Mastodon.", "account.name.help.header": "Ένα πλήρες όνομα χρήστη είναι σαν μια διεύθυνση email", "account.name.help.username": "Το {username} είναι το όνομα χρήστη αυτού του λογαριασμού στο διακομιστή τους. Κάποιος σε άλλο διακομιστή μπορεί να έχει το ίδιο όνομα χρήστη.", "account.name.help.username_self": "Το {username} είναι το όνομα χρήστη σας σε αυτόν το διακομιστή. Κάποιος σε άλλο διακομιστή μπορεί να έχει το ίδιο όνομα χρήστη.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Επεξεργασία", "account.note.title": "Προσωπική σημείωση (ορατή μόνο σε εσάς)", "account.open_original_page": "Άνοιγμα πρωτότυπης σελίδας", + "account.pending": "Εκκρεμεί", "account.posts": "Αναρτήσεις", - "account.posts_with_replies": "Αναρτήσεις και απαντήσεις", "account.remove_from_followers": "Κατάργηση {name} από τους ακόλουθους", "account.report": "Αναφορά @{name}", "account.requested_follow": "Ο/Η {name} αιτήθηκε να σε ακολουθήσει", - "account.requests_to_follow_you": "Αιτήματα για να σε ακολουθήσουν", "account.share": "Κοινοποίηση του προφίλ @{name}", "account.show_reblogs": "Εμφάνιση ενισχύσεων από @{name}", "account.statuses_counter": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", @@ -141,34 +147,42 @@ "account.unmute": "Άρση σίγασης @{name}", "account.unmute_notifications_short": "Σίγαση ειδοποιήσεων", "account.unmute_short": "Κατάργηση σίγασης", + "account_edit.advanced_settings.bot_hint": "Υποδεικνύει σε άλλους χρήστες ότι ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται", + "account_edit.advanced_settings.bot_label": "Αυτοματοποιημένος λογαριασμός", + "account_edit.advanced_settings.title": "Προχωρημένες ρυθμίσεις", + "account_edit.bio.add_label": "Προσθήκη βιογραφικού", + "account_edit.bio.edit_label": "Επεξεργασία βιογραφικού", "account_edit.bio.placeholder": "Προσθέστε μια σύντομη εισαγωγή για να βοηθήσετε άλλους να σας αναγνωρίσουν.", "account_edit.bio.title": "Βιογραφικό", "account_edit.bio_modal.add_title": "Προσθήκη βιογραφικού", "account_edit.bio_modal.edit_title": "Επεξεργασία βιογραφικού", - "account_edit.button.add": "Προσθήκη {item}", - "account_edit.button.delete": "Διαγραφή {item}", - "account_edit.button.edit": "Επεξεργασία {item}", "account_edit.column_button": "Έγινε", "account_edit.column_title": "Επεξεργασία Προφίλ", - "account_edit.custom_fields.name": "πεδίο", + "account_edit.custom_fields.add_label": "Προσθήκη πεδίου", + "account_edit.custom_fields.edit_label": "Επεξεργασία πεδίου", "account_edit.custom_fields.placeholder": "Προσθέστε τις αντωνυμίες σας, εξωτερικούς συνδέσμους ή οτιδήποτε άλλο θέλετε να μοιραστείτε.", "account_edit.custom_fields.reorder_button": "Αναδιάταξη πεδίων", "account_edit.custom_fields.tip_content": "Μπορείς εύκολα να προσθέσεις αξιοπιστία στον Mastodon λογαριασμό σου επαληθεύοντας συνδέσμους σε οποιεσδήποτε ιστοσελίδες κατέχεις.", "account_edit.custom_fields.tip_title": "Συμβουλή: Προσθήκη επαληθευμένων συνδέσμων", "account_edit.custom_fields.title": "Προσαρμοσμένα πεδία", "account_edit.custom_fields.verified_hint": "Πώς προσθέτω έναν επαληθευμένο σύνδεσμο;", + "account_edit.display_name.add_label": "Προσθήκη εμφανιζόμενου ονόματος", + "account_edit.display_name.edit_label": "Επεξεργασία εμφανιζόμενου ονόματος", "account_edit.display_name.placeholder": "Το εμφανιζόμενο όνομα σας είναι πως εμφανίζεται το όνομά σας στο προφίλ σας και στα χρονοδιαγράμματα.", "account_edit.display_name.title": "Εμφανιζόμενο όνομα", - "account_edit.featured_hashtags.item": "ετικέτες", + "account_edit.featured_hashtags.edit_label": "Προσθήκη ετικετών", "account_edit.featured_hashtags.placeholder": "Βοηθήστε τους άλλους να εντοπίσουν και να έχουν γρήγορη πρόσβαση στα αγαπημένα σας θέματα.", "account_edit.featured_hashtags.title": "Αναδεδειγμένες ετικέτες", + "account_edit.field_actions.delete": "Διαγραφή πεδίου", + "account_edit.field_actions.edit": "Επεξεργασία πεδίου", "account_edit.field_delete_modal.confirm": "Σίγουρα θέλετε να διαγράψετε αυτό το προσαρμοσμένο πεδίο; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", "account_edit.field_delete_modal.delete_button": "Διαγραφή", "account_edit.field_delete_modal.title": "Διαγραφή προσαρμοσμένου πεδίου;", "account_edit.field_edit_modal.add_title": "Προσθήκη προσαρμοσμένου πεδίου", + "account_edit.field_edit_modal.discard_confirm": "Απόρριψη", + "account_edit.field_edit_modal.discard_message": "Έχετε μη αποθηκευμένες αλλαγές. Σίγουρα θέλετε να τις απορρίψετε;", "account_edit.field_edit_modal.edit_title": "Επεξεργασία προσαρμοσμένου πεδίου", - "account_edit.field_edit_modal.limit_header": "Ξεπεράστηκε το συνιστώμενο όριο χαρακτήρων", - "account_edit.field_edit_modal.limit_message": "Οι χρήστες κινητών ενδέχεται να μην βλέπουν πλήρως το πεδίο σας.", + "account_edit.field_edit_modal.length_warning": "Υπέρβαση του συνιστώμενου ορίου χαρακτήρων. Οι χρήστες κινητών ενδέχεται να μην βλέπουν το πεδίο σας πλήρως.", "account_edit.field_edit_modal.link_emoji_warning": "Δεν συνιστούμε τη χρήση προσαρμοσμένων emoji σε συνδυασμό με URL. Τα προσαρμοσμένα πεδία που περιέχουν και τα δύο θα εμφανίζονται ως κείμενο μόνο αντί ως σύνδεσμος, προκειμένου να αποφευχθεί η σύγχυση του χρήστη.", "account_edit.field_edit_modal.name_hint": "Π.χ. “Προσωπική ιστοσελίδα”", "account_edit.field_edit_modal.name_label": "Ετικέτα", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Επεξεργασία εναλλακτικού κειμένου", "account_edit.image_edit.remove_button": "Αφαίρεση εικόνας", "account_edit.image_edit.replace_button": "Αντικατάσταση εικόνας", + "account_edit.item_list.delete": "Διαγραφή {name}", + "account_edit.item_list.edit": "Επεξεργασία {name}", "account_edit.name_modal.add_title": "Προσθήκη εμφανιζόμενου ονόματος", "account_edit.name_modal.edit_title": "Επεξεργασία εμφανιζόμενου ονόματος", "account_edit.profile_tab.button_label": "Προσαρμογή", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Εμφάνιση καρτέλας «Πολυμέσα»", "account_edit.profile_tab.show_media_replies.description": "Όταν ενεργοποιηθεί, η καρτέλα Πολυμέσα εμφανίζει τόσο τις αναρτήσεις σας όσο και τις απαντήσεις σας σε αναρτήσεις άλλων ατόμων.", "account_edit.profile_tab.show_media_replies.title": "Συμπερίληψη απαντήσεων στην καρτέλα «Πολυμέσα»", - "account_edit.profile_tab.subtitle": "Προσαρμόστε τις καρτέλες στο προφίλ σας και τι εμφανίζουν.", - "account_edit.profile_tab.title": "Ρυθμίσεις καρτέλας προφίλ", "account_edit.save": "Αποθήκευση", "account_edit.upload_modal.back": "Πίσω", "account_edit.upload_modal.done": "Έγινε", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Αποθέστε εδώ για ανέβασμα", "account_edit.upload_modal.step_upload.header": "Επιλέξτε μια εικόνα", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF ή JPG μορφή, μέχρι {limit}MB.{br}Η ανάλυση της εικόνας θα προσαρμοστεί στα {width}x{height}px.", - "account_edit.upload_modal.title_add": "Προσθήκη εικόνας προφίλ", - "account_edit.upload_modal.title_replace": "Αντικατάσταση εικόνας προφίλ", + "account_edit.upload_modal.title_add.avatar": "Προσθήκη εικόνας προφίλ", + "account_edit.upload_modal.title_add.header": "Προσθήκη εικόνας εξωφύλλου", + "account_edit.upload_modal.title_replace.avatar": "Αντικατάσταση εικόνας προφίλ", + "account_edit.upload_modal.title_replace.header": "Αντικατάσταση εικόνας εξωφύλλου", "account_edit.verified_modal.details": "Πρόσθεσε αξιοπιστία στο Mastodon προφίλ σας επαληθεύοντας συνδέσμους σε προσωπικές ιστοσελίδες. Ορίστε πως δουλεύει:", "account_edit.verified_modal.invisible_link.details": "Πρόσθεσε τον σύνδεσμο στην κεφαλίδα σου. Το σημαντικό μέρος είναι το rel=\"me\" που αποτρέπει την μίμηση σε ιστοσελίδες με περιεχόμενο παραγόμενο από χρήστες. Μπορείς ακόμα να χρησιμοποιήσεις μια ετικέτα link στην κεφαλίδα της σελίδας αντί για {tag}, αλλά η HTML πρέπει να είναι προσβάσιμη χωρίς την εκτέλεση JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Πώς κάνω αυτόν τον σύνδεσμο αόρατο;", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Πρόσθεσε την ιστοσελίδα σου ως προσαρμοσμένο πεδίο", "account_edit.verified_modal.title": "Πώς να προσθέσεις έναν επαληθευμένο σύνδεσμο", "account_edit_tags.add_tag": "Προσθήκη #{tagName}", - "account_edit_tags.column_title": "Επεξεργασία αναδεδειγμένων ετικετών", + "account_edit_tags.column_title": "Επεξεργασία Ετικετών", "account_edit_tags.help_text": "Οι αναδεδειγμένες ετικέτες βοηθούν τους χρήστες να ανακαλύψουν και να αλληλεπιδράσουν με το προφίλ σας. Εμφανίζονται ως φίλτρα στην προβολή Δραστηριότητας της σελίδας προφίλ σας.", + "account_edit_tags.max_tags_reached": "Έχετε φτάσει τον μέγιστο αριθμό των προτεινόμενων ετικετών.", "account_edit_tags.search_placeholder": "Εισάγετε μια ετικέτα…", "account_edit_tags.suggestions": "Προτάσεις:", "account_edit_tags.tag_status_count": "{count, plural, one {# ανάρτηση} other {# αναρτήσεις}}", + "account_list.total": "{total, plural, one {# λογαριασμός} other {# λογαριασμοί}}", "account_note.placeholder": "Κάνε κλικ για να προσθέσεις σημείωση", "admin.dashboard.daily_retention": "Ποσοστό χρηστών που παραμένουν μετά την εγγραφή, ανά ημέρα", "admin.dashboard.monthly_retention": "Ποσοστό χρηστών που παραμένουν μετά την εγγραφή, ανά μήνα", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Βρες άλλον διακομιστή", "closed_registrations_modal.preamble": "Το Mastodon είναι αποκεντρωμένο, οπότε ανεξάρτητα από το πού θα δημιουργήσεις τον λογαριασμό σου, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με οποιονδήποτε σε αυτόν τον διακομιστή. Μπορείς ακόμη και να κάνεις τον δικό σου!", "closed_registrations_modal.title": "Εγγραφή στο Mastodon", - "collection.share_modal.share_link_label": "Σύνδεσμος κοινοποίησης", + "collection.share_modal.share_link_label": "Κοινοποίηση συνδέσμου", "collection.share_modal.share_via_post": "Ανάρτηση στο Mastodon", "collection.share_modal.share_via_system": "Κοινοποίηση σε…", "collection.share_modal.title": "Κοινοποίηση συλλογής", @@ -346,8 +364,11 @@ "collection.share_template_other": "Δείτε αυτή την ωραία συλλογή: {link}", "collection.share_template_own": "Δείτε τη νέα μου συλλογή: {link}", "collections.account_count": "{count, plural, one {# λογαριασμός} other {# λογαριασμοί}}", - "collections.accounts.empty_description": "Προσθέστε μέχρι και {count} λογαριασμούς που ακολουθείτε", + "collections.accounts.empty_description": "Προσθέστε μέχρι και {count} λογαριασμούς", + "collections.accounts.empty_editor_title": "Κανείς δεν είναι ακόμη σε αυτήν τη συλλογή", "collections.accounts.empty_title": "Αυτή η συλλογή είναι κενή", + "collections.block_collection_owner": "Αποκλεισμός λογαριασμού", + "collections.by_account": "από {account_handle}", "collections.collection_description": "Περιγραφή", "collections.collection_language": "Γλώσσα", "collections.collection_language_none": "Καμία", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Σίγουρα θέλετε να αφαιρέσετε αυτόν τον λογαριασμό από αυτή τη συλλογή;", "collections.content_warning": "Προειδοποίηση περιεχομένου", "collections.continue": "Συνέχεια", - "collections.create.accounts_subtitle": "Μόνο οι λογαριασμοί που ακολουθείτε που έχουν επιλέξει ανακάλυψη μπορούν να προστεθούν.", + "collections.copy_link": "Αντιγραφή συνδέσμου", + "collections.copy_link_confirmation": "Αντιγράφηκε ο σύνδεσμος συλλογής στο πρόχειρο", "collections.create.accounts_title": "Ποιον θα αναδείξετε σε αυτήν τη συλλογή;", "collections.create.basic_details_title": "Βασικά στοιχεία", "collections.create.steps": "Βήμα {step}/{total}", - "collections.create_a_collection_hint": "Δημιουργήστε μια συλλογή για να προτείνετε ή να μοιραστείτε τους αγαπημένους σας λογαριασμούς με άλλους.", "collections.create_collection": "Δημιουργία συλλογής", "collections.delete_collection": "Διαγραφή συλλογής", "collections.description_length_hint": "Όριο 100 χαρακτήρων", - "collections.detail.accept_inclusion": "Εντάξει", - "collections.detail.accounts_heading": "Λογαριασμοί", - "collections.detail.author_added_you": "Ο/Η {author} σας πρόσθεσε σε αυτήν τη συλλογή", - "collections.detail.curated_by_author": "Επιμέλεια από {author}", - "collections.detail.curated_by_you": "Επιμέλεια από εσάς", + "collections.detail.author_added_you_on_date": "Ο χρήστης {author} σας πρόσθεσε στις {date}", "collections.detail.loading": "Γίνεται φόρτωση της συλλογής…", - "collections.detail.other_accounts_in_collection": "Άλλοι σε αυτήν τη συλλογή:", "collections.detail.revoke_inclusion": "Αφαίρεσε με", + "collections.detail.sensitive_content": "Ευαίσθητο περιεχόμενο", "collections.detail.sensitive_note": "Αυτή η συλλογή περιέχει λογαριασμούς και περιεχόμενο που μπορεί να είναι ευαίσθητα σε ορισμένους χρήστες.", "collections.detail.share": "Κοινοποιήστε αυτήν τη συλλογή", + "collections.detail.you_are_in_this_collection": "Είστε αναδεδειγμένοι σε αυτήν τη συλλογή", "collections.edit_details": "Επεξεργασία λεπτομερειών", - "collections.error_loading_collections": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια φόρτωσης των συλλογών σας.", - "collections.hints.accounts_counter": "{count} / {max} λογαριασμοί", + "collections.hidden_accounts_description": "Έχετε αποκλείσει ή κάνει σίγαση {count, plural, one {αυτόν τον χρήστη} other {αυτούς τους χρήστες}}", + "collections.hidden_accounts_link": "{count, plural, one {# κρυμμένος λογαριασμός} other {# κρυμμένοι λογαριασμοί}}", + "collections.hints.accounts_counter": "{count}/{max} λογαριασμοί", "collections.last_updated_at": "Τελευταία ενημέρωση: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Συλλογή} other {# Συλλογές}}", + "collections.list.created_by_author": "Δημιουργήθηκε από {name}", + "collections.list.created_by_you": "Δημιουργήθηκε από εσάς", + "collections.list.featuring_you": "Σας αναδεικνύει", "collections.manage_accounts": "Διαχείριση λογαριασμών", "collections.mark_as_sensitive": "Σήμανση ως ευαίσθητο", "collections.mark_as_sensitive_hint": "Κρύβει την περιγραφή και τους λογαριασμούς της συλλογής πίσω από μια προειδοποίηση περιεχομένου. Το όνομα της συλλογής θα είναι ακόμη ορατό.", + "collections.maximum_collection_count_description": "Ο εξυπηρετητής σου επιτρέπει την δημιουργία μέχρι {count} συλλογών.", + "collections.maximum_collection_count_reached": "Έχεις δημιουργήσει τον μέγιστο αριθμό συλλογών", "collections.name_length_hint": "Όριο 40 χαρακτήρων", "collections.new_collection": "Νέα συλλογή", - "collections.no_collections_yet": "Καμία συλλογή ακόμη.", - "collections.old_last_post_note": "Τελευταία ανάρτηση πριν από μια εβδομάδα", - "collections.remove_account": "Αφαίρεση λογαριασμού", + "collections.pending_accounts.message": "Οι λογαριασμοί μπορεί να εμφανίζονται ως εκκρεμείς όταν περιμένουμε απάντηση από τον χρήστη ή τον διακομιστή τους. Μόνο εσείς μπορείτε να δείτε εκκρεμείς λογαριασμούς.", + "collections.pending_accounts.title": "Γιατί βλέπω εκκρεμείς λογαριασμούς;", + "collections.remove_account": "Αφαίρεση", "collections.report_collection": "Αναφορά αυτής της συλλογής", "collections.revoke_collection_inclusion": "Αφαίρεσε τον εαυτό μου από αυτήν τη συλλογή", "collections.revoke_inclusion.confirmation": "Έχεις αφαιρεθεί από τη συλλογή \"{collection}\"", "collections.revoke_inclusion.error": "Υπήρξε ένα σφάλμα, παρακαλούμε προσπαθήστε ξανά αργότερα.", - "collections.search_accounts_label": "Αναζήτηση λογαριασμών για προσθήκη…", + "collections.search_accounts_label": "Αναζήτηση λογαριασμού για προσθήκη", "collections.search_accounts_max_reached": "Έχετε προσθέσει τον μέγιστο αριθμό λογαριασμών", "collections.sensitive": "Ευαίσθητο", + "collections.share_short": "Κοινοποίηση", + "collections.suggestions.can_not_add": "Δεν μπορεί να προστεθεί", + "collections.suggestions.can_not_add_desc": "Αυτοί οι λογαριασμοί μπορεί να έχουν εξαιρεθεί από την ανακάλυψη, ή μπορεί να είναι σε έναν διακομιστή που δεν υποστηρίζει συλλογές.", + "collections.suggestions.must_follow": "Πρέπει να τον ακολουθήσετε πρώτα", + "collections.suggestions.must_follow_desc": "Αυτοί οι λογαριασμοί ελέγχουν όλα τα αιτήματα ακολούθησης. Οι ακόλουθοι μπορούν να τους προσθέσουν στις συλλογές.", "collections.topic_hint": "Προσθέστε μια ετικέτα που βοηθά άλλους να κατανοήσουν το κύριο θέμα αυτής της συλλογής.", "collections.topic_special_chars_hint": "Οι ειδικοί χαρακτήρες θα αφαιρεθούν κατά την αποθήκευση", + "collections.unlisted_collections_description": "Αυτές δεν εμφανίζονται στο προφίλ σας σε άλλους. Οποιοσδήποτε με τον σύνδεσμο μπορεί να τις ανακαλύψει.", + "collections.unlisted_collections_with_count": "Μη καταχωρισμένες συλλογές ({count})", "collections.view_collection": "Προβολή συλλογής", - "collections.view_other_collections_by_user": "Δείτε άλλες συλλογές από αυτόν τον χρήστη", "collections.visibility_public": "Δημόσια", "collections.visibility_public_hint": "Ανιχνεύσιμη στα αποτελέσματα αναζήτησης και σε άλλα σημεία όπου εμφανίζονται προτάσεις.", "collections.visibility_title": "Ορατότητα", @@ -405,7 +436,6 @@ "column.about": "Σχετικά με", "column.blocks": "Αποκλεισμένοι χρήστες", "column.bookmarks": "Σελιδοδείκτες", - "column.collections": "Οι συλλογές μου", "column.community": "Τοπική ροή", "column.create_list": "Δημιουργία λίστας", "column.direct": "Ιδιωτικές επισημάνσεις", @@ -422,8 +452,10 @@ "column.lists": "Λίστες", "column.mutes": "Αποσιωπημένοι χρήστες", "column.notifications": "Ειδοποιήσεις", + "column.other_collections": "Συλλογές από {name}", "column.pins": "Καρφιτσωμένες αναρτήσεις", "column.public": "Ομοσπονδιακή ροή", + "column.your_collections": "Οι Συλλογές σας", "column_back_button.label": "Πίσω", "column_header.hide_settings": "Απόκρυψη ρυθμίσεων", "column_header.moveLeft_settings": "Μεταφορά στήλης στα αριστερά", @@ -468,7 +500,7 @@ "confirmation_modal.cancel": "Άκυρο", "confirmations.block.confirm": "Αποκλεισμός", "confirmations.delete.confirm": "Διαγραφή", - "confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτή την ανάρτηση;", + "confirmations.delete.message": "Σίγουρα θες να διαγράψεις αυτήν την ανάρτηση;", "confirmations.delete.title": "Διαγραφή ανάρτησης;", "confirmations.delete_collection.confirm": "Διαγραφή", "confirmations.delete_collection.message": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Απόρριψη της πρόχειρης ανάρτησης σας;", "confirmations.discard_edit_media.confirm": "Απόρριψη", "confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;", - "confirmations.follow_to_collection.confirm": "Ακολουθήστε και προσθέστε στη συλλογή", - "confirmations.follow_to_collection.message": "Πρέπει να ακολουθήσετε τον χρήστη {name} για να τους προσθέσετε σε μια συλλογή.", - "confirmations.follow_to_collection.title": "Ακολουθήστε τον λογαριασμό;", "confirmations.follow_to_list.confirm": "Ακολούθησε και πρόσθεσε στη λίστα", "confirmations.follow_to_list.message": "Πρέπει να ακολουθήσεις τον χρήστη {name} για να τον προσθέσεις σε μια λίστα.", "confirmations.follow_to_list.title": "Ακολούθηση χρήστη;", + "confirmations.hide_featured_tab.confirm": "Απόκρυψη καρτέλας", + "confirmations.hide_featured_tab.intro": "Μπορείτε να το αλλάξετε ανά πάσα στιγμή κάτω από το Επεξεργασία προφίλ> Ρυθμίσεις καρτελών προφίλ.", + "confirmations.hide_featured_tab.message": "Αυτό θα κρύψει την καρτέλα για τους χρήστες στο {serverName} και σε άλλους διακομιστές που εκτελούν την τελευταία έκδοση του Mastodon. Άλλες εμφανίσεις μπορεί να ποικίλλουν.", + "confirmations.hide_featured_tab.title": "Απόκρυψη καρτέλας \"Αναδεδειγμένα\";", "confirmations.logout.confirm": "Αποσύνδεση", "confirmations.logout.message": "Σίγουρα θέλεις να αποσυνδεθείς;", "confirmations.logout.title": "Αποσύνδεση;", @@ -529,6 +562,7 @@ "content_warning.hide": "Απόκρυψη ανάρτησης", "content_warning.show": "Εμφάνιση ούτως ή άλλως", "content_warning.show_more": "Εμφάνιση περισσότερων", + "content_warning.show_short": "Εμφάνιση", "conversation.delete": "Διαγραφή συνομιλίας", "conversation.mark_as_read": "Σήμανση ως αναγνωσμένη", "conversation.open": "Προβολή συνομιλίας", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου μαζί.", "domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.", "dropdown.empty": "Διαλέξτε μια επιλογή", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Εγγραφή", + "email_subscriptions.form.bottom": "Λάβετε αναρτήσεις στα εισερχόμενά σας χωρίς να χρειαστεί να δημιουργήσετε λογαριασμό Mastodon. Κάντε απεγγραφή οποιαδήποτε στιγμή. Για περισσότερες πληροφορίες, ανατρέξτε στην Πολιτική Απορρήτου.", + "email_subscriptions.form.title": "Εγγραφείτε για ενημερώσεις μέσω email από {name}", + "email_subscriptions.submitted.lead": "Ελέγξτε τα εισερχόμενά σας για να ολοκληρωθεί η εγγραφή για ενημερώσεις μέσω email.", + "email_subscriptions.submitted.title": "Ένα βήμα ακόμα", + "email_subscriptions.validation.email.blocked": "Αποκλεισμένος πάροχος email", + "email_subscriptions.validation.email.invalid": "Μη έγκυρη διεύθυνση email", "embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.", "embed.preview": "Ορίστε πως θα φαίνεται:", "emoji_button.activity": "Δραστηριότητα", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", - "empty_column.account_featured.me": "Δεν έχεις αναδείξει τίποτα ακόμη. Γνώριζες ότι μπορείς να αναδείξεις τις ετικέτες που χρησιμοποιείς περισσότερο, ακόμη και τους λογαριασμούς των φίλων σου στο προφίλ σου;", - "empty_column.account_featured.other": "Ο/Η {acct} δεν έχει αναδείξει τίποτα ακόμη. Γνώριζες ότι μπορείς να αναδείξεις τις ετικέτες που χρησιμοποιείς περισσότερο, ακόμη και τους λογαριασμούς των φίλων σου στο προφίλ σου;", - "empty_column.account_featured_other.unknown": "Αυτός ο λογαριασμός δεν έχει αναδείξει τίποτα ακόμη.", + "empty_column.account_featured.other": "Ο/Η {acct} δεν έχει αναδείξει τίποτα ακόμη.", + "empty_column.account_featured_self.no_collections_button": "Δημιουργήστε μια συλλογή", + "empty_column.account_featured_self.no_collections_hide_tab": "Απόκρυψη αυτής της καρτέλας αντ' αυτού", + "empty_column.account_featured_self.pre_collections": "Μείνετε συντονισμένοι για τις Συλλογές", + "empty_column.account_featured_self.pre_collections_desc": "Οι Συλλογές (που έρχονται στο Mastodon 4.6) επιτρέπουν να δημιουργήσετε τις δικές σας επιμελημένες λίστες λογαριασμών για να συστήσετε σε άλλους.", + "empty_column.account_featured_self.showcase_accounts": "Παρουσιάστε τους αγαπημένους σας λογαριασμούς", + "empty_column.account_featured_self.showcase_accounts_desc": "Οι συλλογές είναι επιμελημένες λίστες λογαριασμών για να βοηθήσουν άλλους να ανακαλύψουν περισσότερα από το Fediverse.", + "empty_column.account_featured_unknown.other": "Αυτός ο λογαριασμός δεν έχει αναδείξει τίποτα ακόμη.", "empty_column.account_hides_collections": "Αυτός ο χρήστης έχει επιλέξει να μην καταστήσει αυτές τις πληροφορίες διαθέσιμες", "empty_column.account_suspended": "Λογαριασμός σε αναστολή", "empty_column.account_timeline": "Δεν έχει αναρτήσεις εδώ!", @@ -596,7 +643,7 @@ "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμη.", "empty_column.bookmarked_statuses": "Δεν έχεις καμία ανάρτηση με σελιδοδείκτη ακόμη. Μόλις βάλεις κάποιον, θα εμφανιστεί εδώ.", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσια για να αρχίσει να κυλά η μπάλα!", - "empty_column.direct": "Δεν έχεις καμία προσωπική επισήμανση ακόμη. Όταν στείλεις ή λάβεις μία, θα εμφανιστεί εδώ.", + "empty_column.direct": "Δεν έχεις καμία ιδιωτική επισήμανση ακόμη. Όταν στείλεις ή λάβεις μία, θα εμφανιστεί εδώ.", "empty_column.disabled_feed": "Αυτή η ροή έχει απενεργοποιηθεί από τους διαχειριστές του διακομιστή σας.", "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμη.", "empty_column.explore_statuses": "Τίποτα δεν βρίσκεται στις τάσεις αυτή τη στιγμή. Έλεγξε αργότερα!", @@ -628,7 +675,7 @@ "featured_carousel.header": "{count, plural, one {Καρφιτσωμένη Ανάρτηση} other {Καρφιτσωμένες Αναρτήσεις}}", "featured_carousel.slide": "Ανάρτηση {current, number} από {max, number}", "featured_tags.more_items": "+{count}", - "featured_tags.suggestions": "Τον τελευταίο καιρό έχετε δημοσιεύσει για {items}. Προσθέστε αυτά ως αναδεδειγμένες ετικέτες;", + "featured_tags.suggestions": "Τον τελευταίο καιρό έχεις δημοσιεύσει για {items}. Να προστεθούν αυτά ως αναδεδειγμένες ετικέτες;", "featured_tags.suggestions.add": "Προσθήκη", "featured_tags.suggestions.added": "Διαχειριστείτε τις αναδεδειγμένες ετικέτες σας οποιαδήποτε στιγμή κάτω από το Επεξεργασία προφίλ > Αναδεδειγμένες ετικέτες.", "featured_tags.suggestions.dismiss": "Όχι, ευχαριστώ", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Ποιον να ακολουθήσεις", "followed_tags": "Ακολουθούμενες ετικέτες", "followers.hide_other_followers": "Αυτός ο χρήστης έχει επιλέξει να μην κάνει τους άλλους ακολούθους του ορατούς", + "followers.title": "Ακολουθούν {name}", "following.hide_other_following": "Αυτός ο χρήστης έχει επιλέξει να μην κάνει τους υπόλοιπους που ακολουθεί ορατούς", + "following.title": "Ακολουθούνται από {name}", "footer.about": "Σχετικά με", "footer.about_mastodon": "Σχετικά με το Mastodon", "footer.about_server": "Σχετικά με το {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Προβολή πηγαίου κώδικα", "footer.status": "Κατάσταση", "footer.terms_of_service": "Όροι υπηρεσίας", + "form_error.blank": "Το πεδίο δεν μπορεί να είναι κενό.", "form_field.optional": "(προαιρετικό)", "generic.saved": "Αποθηκεύτηκε", "getting_started.heading": "Ας ξεκινήσουμε", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Επέκταση μενού ετικετών που ακολουθείτε", "navigation_panel.expand_lists": "Επέκταση μενού λίστας", "not_signed_in_indicator.not_signed_in": "Πρέπει να συνδεθείς για να αποκτήσεις πρόσβαση σε αυτόν τον πόρο.", + "notification.added_to_collection": "{name} σε πρόσθεσε σ' αυτήν τη συλλογή", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} και {count, plural, one {# ακόμα} other {# ακόμα}} έχουν εγγραφεί", "notification.annual_report.message": "Το #Wrapstodon {year} σε περιμένει! Αποκάλυψε τα στιγμιότυπα της χρονιάς και αξέχαστες στιγμές σου στο Mastodon!", "notification.annual_report.view": "Προβολή #Wrapstodon", + "notification.collection_update": "{name} επεξεργάστηκε μια συλλογή στην οποία περιλαμβάνεσαι", "notification.favourite": "{name} αγάπησε την ανάρτηση σου", "notification.favourite.name_and_others_with_link": "{name} και {count, plural, one {# ακόμα} other {# ακόμα}} αγάπησαν την ανάρτησή σου", "notification.favourite_pm": "Ο χρήστης {name} αγάπησε την ιδιωτική σου επισήμανση", @@ -904,16 +956,16 @@ "notification.moderation_warning.action_suspend": "Ο λογαριασμός σου έχει ανασταλεί.", "notification.own_poll": "Η δημοσκόπησή σου έληξε", "notification.poll": "Μία ψηφοφορία στην οποία συμμετείχες έχει τελειώσει", - "notification.quoted_update": "Ο χρήστης {name} επεξεργάστηκε μία ανάρτηση που παρέθεσες", + "notification.quoted_update": "{name} επεξεργάστηκε μία ανάρτηση που παρέθεσες", "notification.reblog": "Ο/Η {name} ενίσχυσε την ανάρτηση σου", "notification.reblog.name_and_others_with_link": "{name} και {count, plural, one {# ακόμα} other {# ακόμα}} ενίσχυσαν την ανάρτησή σου", - "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": "Χάθηκαν συνδέσεις με το {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.relationships_severance_event.user_domain_block": "Έχεις αποκλείσει τον λογαριασμό {target}, αφαιρώντας {followersCount} από τους ακόλουθούς σου και {followingCount, plural, one {# λογαριασμό} other {# λογαριασμούς}} που ακολουθείς.", "notification.status": "Ο/Η {name} μόλις ανέρτησε κάτι", - "notification.update": "Ο/Η {name} επεξεργάστηκε μια ανάρτηση", + "notification.update": "{name} επεξεργάστηκε μια ανάρτηση", "notification_requests.accept": "Αποδοχή", "notification_requests.accept_multiple": "{count, plural, one {Αποδοχή # αιτήματος…} other {Αποδοχή # αιτημάτων…}}", "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Αποδοχή αιτήματος} other {Αποδοχή αιτημάτων}}", @@ -1123,7 +1175,7 @@ "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.language_code": "κωδικός ISO γλώσσας", "search_popout.options": "Επιλογές αναζήτησης", "search_popout.quick_actions": "Γρήγορες ενέργειες", "search_popout.recent": "Πρόσφατες αναζητήσεις", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "ενεργοί χρήστες", "server_banner.administered_by": "Διαχειριστής:", "server_banner.is_one_of_many": "Το {domain} είναι ένας από τους πολλούς ανεξάρτητους διακομιστές Mastodon που μπορείς να χρησιμοποιήσεις για να συμμετάσχεις στο fediverse.", + "server_banner.more_about_this_server": "Περισσότερα για αυτόν τον διακομιστή", "server_banner.server_stats": "Στατιστικά διακομιστή:", "sign_in_banner.create_account": "Δημιουργία λογαριασμού", "sign_in_banner.follow_anyone": "Ακολούθησε οποιονδήποτε κατά μήκος του fediverse και δες τα όλα με χρονολογική σειρά. Δεν υπάρχουν αλγόριθμοι, διαφημίσεις ή clickbait ούτε για δείγμα.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 59bed6624b8a60..366ba8a25e9b80 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -28,12 +28,10 @@ "account.block_domain": "Block domain {domain}", "account.block_short": "Block", "account.blocked": "Blocked", - "account.blocking": "Blocking", "account.cancel_follow_request": "Cancel follow", "account.copy": "Copy link to profile", "account.direct": "Privately mention @{name}", "account.disable_notifications": "Stop notifying me when @{name} posts", - "account.domain_blocking": "Blocking domain", "account.edit_note": "Edit personal note", "account.edit_profile": "Edit profile", "account.edit_profile_short": "Edit", @@ -45,9 +43,7 @@ "account.featured": "Featured", "account.featured.accounts": "Profiles", "account.featured.collections": "Collections", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Last post on {date}", - "account.featured_tags.last_status_never": "No posts", + "account.featured.new_collection": "New collection", "account.field_overflow": "Show full content", "account.filters.all": "All activity", "account.filters.boosts_toggle": "Show boosts", @@ -73,8 +69,19 @@ "account.go_to_profile": "Go to profile", "account.hide_reblogs": "Hide boosts from @{name}", "account.in_memoriam": "In Memoriam.", + "account.join_modal.day": "Day", + "account.join_modal.me": "You joined {server} on", + "account.join_modal.me_anniversary": "Happy Fediversary! You joined {server} on", + "account.join_modal.me_today": "It’s your first day on {server}!", + "account.join_modal.other": "{name} joined {server} on", + "account.join_modal.other_today": "It’s {name}’s first day on {server}!", + "account.join_modal.share.celebrate": "Share a celebratory post", + "account.join_modal.share.intro": "Share an intro post", + "account.join_modal.share.welcome": "Share a welcome post", + "account.join_modal.years": "{number, plural, one {year} other {years}}", "account.joined_short": "Joined", "account.languages": "Change subscribed languages", + "account.last_active": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Mute notifications", "account.mute_short": "Mute", "account.muted": "Muted", - "account.muting": "Muting", "account.mutual": "You follow each other", + "account.name.copy": "Copy handle", "account.name.help.domain": "{domain} is the server that hosts the user’s profile and posts.", "account.name.help.domain_self": "{domain} is your server that hosts your profile and posts.", - "account.name.help.footer": "Just like you can send emails to people using different email clients, you can interact with people on other Mastodon servers – and with anyone on other social apps powered by the same set of rules as Mastodon uses (the ActivityPub protocol).", + "account.name.help.footer": "Just like you can send emails to people using different email providers, you can interact with people on other Mastodon servers, and with anyone on other Mastodon-compatible social apps.", "account.name.help.header": "A handle is like an email address", "account.name.help.username": "{username} is this account’s username on their server. Someone on another server might have the same username.", "account.name.help.username_self": "{username} is your username on this server. Someone on another server might have the same username.", @@ -122,11 +129,9 @@ "account.note.title": "Personal note (visible only to you)", "account.open_original_page": "Open original page", "account.posts": "Posts", - "account.posts_with_replies": "Posts and replies", "account.remove_from_followers": "Remove {name} from followers", "account.report": "Report @{name}", "account.requested_follow": "{name} has requested to follow you", - "account.requests_to_follow_you": "Requests 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}}", @@ -141,16 +146,18 @@ "account.unmute": "Unmute @{name}", "account.unmute_notifications_short": "Unmute notifications", "account.unmute_short": "Unmute", + "account_edit.advanced_settings.bot_hint": "Signal to others that the account mainly performs automated actions and might not be monitored", + "account_edit.advanced_settings.bot_label": "Automated account", + "account_edit.advanced_settings.title": "Advanced settings", + "account_edit.bio.edit_label": "Edit bio", "account_edit.bio.placeholder": "Add a short introduction to help others identify you.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Add bio", "account_edit.bio_modal.edit_title": "Edit bio", - "account_edit.button.add": "Add {item}", - "account_edit.button.delete": "Delete {item}", - "account_edit.button.edit": "Edit {item}", "account_edit.column_button": "Done", "account_edit.column_title": "Edit Profile", - "account_edit.custom_fields.name": "field", + "account_edit.custom_fields.add_label": "Add field", + "account_edit.custom_fields.edit_label": "Edit field", "account_edit.custom_fields.placeholder": "Add your pronouns, external links, or anything else you’d like to share.", "account_edit.custom_fields.reorder_button": "Reorder fields", "account_edit.custom_fields.tip_content": "You can easily add credibility to your Mastodon account by verifying links to any websites you own.", @@ -159,7 +166,7 @@ "account_edit.custom_fields.verified_hint": "How do I add a verified link?", "account_edit.display_name.placeholder": "Your display name is how your name appears on your profile and in timelines.", "account_edit.display_name.title": "Display name", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Add hashtags", "account_edit.featured_hashtags.placeholder": "Help others identify, and have quick access to, your favourite topics.", "account_edit.featured_hashtags.title": "Featured hashtags", "account_edit.field_delete_modal.confirm": "Are you sure you want to delete this custom field? This action can’t be undone.", @@ -167,8 +174,6 @@ "account_edit.field_delete_modal.title": "Delete custom field?", "account_edit.field_edit_modal.add_title": "Add custom field", "account_edit.field_edit_modal.edit_title": "Edit custom field", - "account_edit.field_edit_modal.limit_header": "Recommended character limit exceeded", - "account_edit.field_edit_modal.limit_message": "Mobile users might not see your field in full.", "account_edit.field_edit_modal.link_emoji_warning": "We recommend against the use of custom emoji in combination with URLs. Custom fields containing both will display as text only instead of as a link, in order to prevent user confusion.", "account_edit.field_edit_modal.name_hint": "Eg “Personal website”", "account_edit.field_edit_modal.name_label": "Label", @@ -183,6 +188,14 @@ "account_edit.field_reorder_modal.drag_start": "Picked up field \"{item}\".", "account_edit.field_reorder_modal.handle_label": "Drag field \"{item}\"", "account_edit.field_reorder_modal.title": "Rearrange fields", + "account_edit.image_alt_modal.details_content": "DO:
    • Describe yourself as pictured
    • Use third person language (e.g. “Alex” instead of “me”)
    • Be succinct – a few words is often enough
    DON’T:
    • Start with “Photo of” – it’s redundant for screen readers
    EXAMPLE:
    • “Alex wearing a green shirt and glasses”
    ", + "account_edit.image_alt_modal.details_title": "Tips: Alt text for profile photos", + "account_edit.image_alt_modal.edit_title": "Edit alt text", + "account_edit.image_alt_modal.text_hint": "Alt text helps screen reader users to understand your content.", + "account_edit.image_alt_modal.text_label": "Alt text", + "account_edit.image_delete_modal.confirm": "Are you sure you want to delete this image? This action can’t be undone.", + "account_edit.image_delete_modal.delete_button": "Delete", + "account_edit.image_delete_modal.title": "Delete image?", "account_edit.image_edit.add_button": "Add image", "account_edit.image_edit.alt_add_button": "Add alt text", "account_edit.image_edit.alt_edit_button": "Edit alt text", @@ -199,9 +212,15 @@ "account_edit.profile_tab.show_media.title": "Show ‘Media’ tab", "account_edit.profile_tab.show_media_replies.description": "When enabled, Media tab shows both your posts and replies to other people’s posts.", "account_edit.profile_tab.show_media_replies.title": "Include replies on ‘Media’ tab", - "account_edit.profile_tab.subtitle": "Customise the tabs on your profile and what they display.", - "account_edit.profile_tab.title": "Profile tab settings", "account_edit.save": "Save", + "account_edit.upload_modal.done": "Done", + "account_edit.upload_modal.next": "Next", + "account_edit.upload_modal.step_upload.dragging": "Drop to upload", + "account_edit.upload_modal.step_upload.header": "Choose an image", + "account_edit.upload_modal.title_add.avatar": "Add profile photo", + "account_edit.upload_modal.title_add.header": "Add cover photo", + "account_edit.upload_modal.title_replace.avatar": "Replace profile photo", + "account_edit.upload_modal.title_replace.header": "Replace cover photo", "account_edit.verified_modal.details": "Add credibility to your Mastodon profile by verifying links to personal websites. Here’s how it works:", "account_edit.verified_modal.invisible_link.details": "Add the link to your header. The important part is rel=\"me\" which prevents impersonation on websites with user-generated content. You can even use a link tag in the header of the page instead of {tag}, but the HTML must be accessible without executing JavaScript.", "account_edit.verified_modal.invisible_link.summary": "How do I make the link invisible?", @@ -212,9 +231,11 @@ "account_edit_tags.add_tag": "Add #{tagName}", "account_edit_tags.column_title": "Edit Tags", "account_edit_tags.help_text": "Featured hashtags help users discover and interact with your profile. They appear as filters on your Profile page’s Activity view.", + "account_edit_tags.max_tags_reached": "You have reached the maximum number of featured hashtags.", "account_edit_tags.search_placeholder": "Enter a hashtag…", "account_edit_tags.suggestions": "Suggestions:", "account_edit_tags.tag_status_count": "{count, plural, one {# post} other {# posts}}", + "account_list.total": "{total, plural, one {# account} other {# accounts}}", "account_note.placeholder": "Click to add note", "admin.dashboard.daily_retention": "User retention rate by day after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up", @@ -319,7 +340,7 @@ "closed_registrations_modal.find_another_server": "Find another server", "closed_registrations_modal.preamble": "Mastodon is decentralised, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!", "closed_registrations_modal.title": "Signing up on Mastodon", - "collection.share_modal.share_link_label": "Invite share link", + "collection.share_modal.share_link_label": "Share link", "collection.share_modal.share_via_post": "Post on Mastodon", "collection.share_modal.share_via_system": "Share to…", "collection.share_modal.title": "Share collection", @@ -327,55 +348,63 @@ "collection.share_template_other": "Check out this cool collection: {link}", "collection.share_template_own": "Check out my new collection: {link}", "collections.account_count": "{count, plural, one {# account} other {# accounts}}", - "collections.accounts.empty_description": "Add up to {count} accounts you follow", + "collections.accounts.empty_description": "Add up to {count} accounts", + "collections.accounts.empty_editor_title": "No one is in this collection yet", "collections.accounts.empty_title": "This collection is empty", + "collections.block_collection_owner": "Block account", "collections.collection_description": "Description", + "collections.collection_language": "Language", + "collections.collection_language_none": "None", "collections.collection_name": "Name", "collections.collection_topic": "Topic", "collections.confirm_account_removal": "Are you sure you want to remove this account from this collection?", "collections.content_warning": "Content warning", "collections.continue": "Continue", - "collections.create.accounts_subtitle": "Only accounts you follow who have opted into discovery can be added.", + "collections.copy_link": "Copy link", + "collections.copy_link_confirmation": "Copied collection link to clipboard", "collections.create.accounts_title": "Who will you feature in this collection?", "collections.create.basic_details_title": "Basic details", "collections.create.steps": "Step {step}/{total}", - "collections.create_a_collection_hint": "Create a collection to recommend or share your favourite accounts with others.", "collections.create_collection": "Create collection", "collections.delete_collection": "Delete collection", "collections.description_length_hint": "100 characters limit", - "collections.detail.accept_inclusion": "OK", - "collections.detail.accounts_heading": "Accounts", - "collections.detail.author_added_you": "{author} added you to this collection", - "collections.detail.curated_by_author": "Curated by {author}", - "collections.detail.curated_by_you": "Curated by you", + "collections.detail.author_added_you_on_date": "{author} added you on {date}", "collections.detail.loading": "Loading collection…", - "collections.detail.other_accounts_in_collection": "Others in this collection:", "collections.detail.revoke_inclusion": "Remove me", + "collections.detail.sensitive_content": "Sensitive content", "collections.detail.sensitive_note": "This collection contains accounts and content that may be sensitive to some users.", "collections.detail.share": "Share this collection", + "collections.detail.you_are_in_this_collection": "You're featured in this collection", "collections.edit_details": "Edit details", - "collections.error_loading_collections": "There was an error when trying to load your collections.", - "collections.hints.accounts_counter": "{count} / {max} accounts", + "collections.hidden_accounts_description": "You’ve blocked or muted {count, plural, one {this user} other {these users}}", + "collections.hidden_accounts_link": "{count, plural, one {# hidden account} other {# hidden accounts}}", + "collections.hints.accounts_counter": "{count}/{max} accounts", "collections.last_updated_at": "Last updated: {date}", "collections.manage_accounts": "Manage accounts", "collections.mark_as_sensitive": "Mark as sensitive", "collections.mark_as_sensitive_hint": "Hides the collection's description and accounts behind a content warning. The collection name will still be visible.", + "collections.maximum_collection_count_description": "Your server allows creation of up to {count} collections.", + "collections.maximum_collection_count_reached": "You have created the maximum number of collections", "collections.name_length_hint": "40 characters limit", "collections.new_collection": "New collection", - "collections.no_collections_yet": "No collections yet.", - "collections.old_last_post_note": "Last posted over a week ago", - "collections.remove_account": "Remove this account", + "collections.remove_account": "Remove", "collections.report_collection": "Report this collection", "collections.revoke_collection_inclusion": "Remove myself from this collection", "collections.revoke_inclusion.confirmation": "You've been removed from \"{collection}\"", "collections.revoke_inclusion.error": "There was an error, please try again later.", - "collections.search_accounts_label": "Search for accounts to add…", + "collections.search_accounts_label": "Search for an account to add", "collections.search_accounts_max_reached": "You have added the maximum number of accounts", "collections.sensitive": "Sensitive", + "collections.share_short": "Share", + "collections.suggestions.can_not_add": "Can’t be added", + "collections.suggestions.can_not_add_desc": "These accounts may have opted out of discovery, or they might be on a server that doesn’t support collections.", + "collections.suggestions.must_follow": "Must follow first", + "collections.suggestions.must_follow_desc": "These accounts review all follow requests. Followers can add them to collections.", "collections.topic_hint": "Add a hashtag that helps others understand the main topic of this collection.", "collections.topic_special_chars_hint": "Special characters will be removed when saving", + "collections.unlisted_collections_description": "These don’t appear on your profile to others. Anyone with the link can discover them.", + "collections.unlisted_collections_with_count": "Unlisted collections ({count})", "collections.view_collection": "View collection", - "collections.view_other_collections_by_user": "View other collections by this user", "collections.visibility_public": "Public", "collections.visibility_public_hint": "Discoverable in search results and other areas where recommendations appear.", "collections.visibility_title": "Visibility", @@ -384,7 +413,6 @@ "column.about": "About", "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", - "column.collections": "My collections", "column.community": "Local timeline", "column.create_list": "Create list", "column.direct": "Private mentions", @@ -401,6 +429,7 @@ "column.lists": "Lists", "column.mutes": "Muted users", "column.notifications": "Notifications", + "column.other_collections": "Collections by {name}", "column.pins": "Pinned posts", "column.public": "Federated timeline", "column_back_button.label": "Back", @@ -464,12 +493,13 @@ "confirmations.discard_draft.post.title": "Discard your draft post?", "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.follow_to_collection.confirm": "Follow and add to collection", - "confirmations.follow_to_collection.message": "You need to be following {name} to add them to a collection.", - "confirmations.follow_to_collection.title": "Follow account?", "confirmations.follow_to_list.confirm": "Follow and add to list", "confirmations.follow_to_list.message": "You need to be following {name} to add them to a list.", "confirmations.follow_to_list.title": "Follow user?", + "confirmations.hide_featured_tab.confirm": "Hide tab", + "confirmations.hide_featured_tab.intro": "You can change this at any time under Edit profile > Profile tab settings.", + "confirmations.hide_featured_tab.message": "This will hide the tab for users on {serverName} and other servers running the latest version of Mastodon. Other displays may vary.", + "confirmations.hide_featured_tab.title": "Hide \"Featured\" tab?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.title": "Log out?", @@ -508,6 +538,7 @@ "content_warning.hide": "Hide post", "content_warning.show": "Show anyway", "content_warning.show_more": "Show more", + "content_warning.show_short": "Show", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", @@ -548,6 +579,14 @@ "domain_pill.your_server": "Your digital home, where all of your posts live. Don’t like this one? Transfer servers at any time and bring your followers too.", "domain_pill.your_username": "Your unique identifier on this server. It’s possible to find users with the same username on different servers.", "dropdown.empty": "Select an option", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Subscribe", + "email_subscriptions.form.bottom": "Get posts in your inbox without creating a Mastodon account. Unsubscribe at any time. For more information, refer to the Privacy Policy.", + "email_subscriptions.form.title": "Sign up for email updates from {name}", + "email_subscriptions.submitted.lead": "Check your inbox for an email to finish signing up for email updates.", + "email_subscriptions.submitted.title": "One more step", + "email_subscriptions.validation.email.blocked": "Blocked email provider", + "email_subscriptions.validation.email.invalid": "Invalid email address", "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -565,9 +604,14 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", - "empty_column.account_featured.me": "You have not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", - "empty_column.account_featured.other": "{acct} has not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", - "empty_column.account_featured_other.unknown": "This account has not featured anything yet.", + "empty_column.account_featured.other": "{acct} has not featured anything yet.", + "empty_column.account_featured_self.no_collections_button": "Create a collection", + "empty_column.account_featured_self.no_collections_hide_tab": "Hide this tab instead", + "empty_column.account_featured_self.pre_collections": "Stay tuned for Collections", + "empty_column.account_featured_self.pre_collections_desc": "Collections (coming in Mastodon 4.6) allow you to create your own curated lists of accounts to recommend to others.", + "empty_column.account_featured_self.showcase_accounts": "Showcase your favourite accounts", + "empty_column.account_featured_self.showcase_accounts_desc": "Collections are curated lists of accounts to help others discover more of the Fediverse.", + "empty_column.account_featured_unknown.other": "This account hasn’t featured anything yet.", "empty_column.account_hides_collections": "This user has chosen not to make this information available", "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No posts here!", @@ -607,6 +651,10 @@ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}", "featured_carousel.slide": "Post {current, number} of {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Lately you’ve posted about {items}. Add these as featured hashtags?", + "featured_tags.suggestions.add": "Add", + "featured_tags.suggestions.added": "Manage your featured hashtags at any time under Edit Profile > Featured hashtags.", + "featured_tags.suggestions.dismiss": "No thanks", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", @@ -649,7 +697,9 @@ "follow_suggestions.who_to_follow": "Who to follow", "followed_tags": "Followed hashtags", "followers.hide_other_followers": "This user has chosen not to make their other followers visible", + "followers.title": "Following {name}", "following.hide_other_following": "This user has chosen not to make the rest of who they follow visible", + "following.title": "Followed by {name}", "footer.about": "About", "footer.about_mastodon": "About Mastodon", "footer.about_server": "About {domain}", @@ -661,6 +711,7 @@ "footer.source_code": "View source code", "footer.status": "Status", "footer.terms_of_service": "Terms of service", + "form_error.blank": "Field cannot be blank.", "form_field.optional": "(optional)", "generic.saved": "Saved", "getting_started.heading": "Getting started", @@ -844,6 +895,7 @@ "navigation_panel.expand_followed_tags": "Expand followed hashtags menu", "navigation_panel.expand_lists": "Expand list menu", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "notification.added_to_collection": "{name} added you to a collection", "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}", @@ -853,6 +905,7 @@ "notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up", "notification.annual_report.message": "Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!", "notification.annual_report.view": "View #Wrapstodon", + "notification.collection_update": "{name} edited a collection you’re in", "notification.favourite": "{name} favourited your post", "notification.favourite.name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}} favourited your post", "notification.favourite_pm": "{name} favourited your private mention", @@ -1116,6 +1169,7 @@ "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.more_about_this_server": "More about this server", "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.", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index b5023a3349bf08..b6ffa32fdf7507 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -40,12 +40,10 @@ "account.block_domain": "Block domain {domain}", "account.block_short": "Block", "account.blocked": "Blocked", - "account.blocking": "Blocking", "account.cancel_follow_request": "Cancel follow", "account.copy": "Copy link to profile", "account.direct": "Privately mention @{name}", "account.disable_notifications": "Stop notifying me when @{name} posts", - "account.domain_blocking": "Blocking domain", "account.edit_note": "Edit personal note", "account.edit_profile": "Edit profile", "account.edit_profile_short": "Edit", @@ -57,9 +55,7 @@ "account.featured": "Featured", "account.featured.accounts": "Profiles", "account.featured.collections": "Collections", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Last post on {date}", - "account.featured_tags.last_status_never": "No posts", + "account.featured.new_collection": "New collection", "account.field_overflow": "Show full content", "account.filters.all": "All activity", "account.filters.boosts_toggle": "Show boosts", @@ -86,8 +82,19 @@ "account.go_to_profile": "Go to profile", "account.hide_reblogs": "Hide boosts from @{name}", "account.in_memoriam": "In Memoriam.", + "account.join_modal.day": "Day", + "account.join_modal.me": "You joined {server} on", + "account.join_modal.me_anniversary": "Happy Fediversary! You joined {server} on", + "account.join_modal.me_today": "It’s your first day on {server}!", + "account.join_modal.other": "{name} joined {server} on", + "account.join_modal.other_today": "It’s {name}’s first day on {server}!", + "account.join_modal.share.celebrate": "Share a celebratory post", + "account.join_modal.share.intro": "Share an intro post", + "account.join_modal.share.welcome": "Share a welcome post", + "account.join_modal.years": "{number, plural, one {year} other {years}}", "account.joined_short": "Joined", "account.languages": "Change subscribed languages", + "account.last_active": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -115,11 +122,11 @@ "account.mute_notifications_short": "Mute notifications", "account.mute_short": "Mute", "account.muted": "Muted", - "account.muting": "Muting", "account.mutual": "You follow each other", + "account.name.copy": "Copy handle", "account.name.help.domain": "{domain} is the server that hosts the user’s profile and posts.", "account.name.help.domain_self": "{domain} is your server that hosts your profile and posts.", - "account.name.help.footer": "Just like you can send emails to people using different email clients, you can interact with people on other Mastodon servers – and with anyone on other social apps powered by the same set of rules as Mastodon uses (the ActivityPub protocol).", + "account.name.help.footer": "Just like you can send emails to people using different email providers, you can interact with people on other Mastodon servers, and with anyone on other Fediverse apps.", "account.name.help.header": "A handle is like an email address", "account.name.help.username": "{username} is this account’s username on their server. Someone on another server might have the same username.", "account.name.help.username_self": "{username} is your username on this server. Someone on another server might have the same username.", @@ -134,12 +141,11 @@ "account.note.edit_button": "Edit", "account.note.title": "Personal note (visible only to you)", "account.open_original_page": "Open original page", + "account.pending": "Pending", "account.posts": "Posts", - "account.posts_with_replies": "Posts and replies", "account.remove_from_followers": "Remove {name} from followers", "account.report": "Report @{name}", "account.requested_follow": "{name} has requested to follow you", - "account.requests_to_follow_you": "Requests 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}}", @@ -154,8 +160,11 @@ "account.unmute": "Unmute @{name}", "account.unmute_notifications_short": "Unmute notifications", "account.unmute_short": "Unmute", + "account_edit.advanced_settings.bot_hint": "Signal to others that the account mainly performs automated actions and might not be monitored", + "account_edit.advanced_settings.bot_label": "Automated account", + "account_edit.advanced_settings.title": "Advanced settings", + "account_edit.bio.add_label": "Add bio", "account_edit.bio.edit_label": "Edit bio", - "account_edit.bio.label": "bio", "account_edit.bio.placeholder": "Add a short introduction to help others identify you.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Add bio", @@ -186,7 +195,7 @@ "account_edit.field_edit_modal.discard_confirm": "Discard", "account_edit.field_edit_modal.discard_message": "You have unsaved changes. Are you sure you want to discard them?", "account_edit.field_edit_modal.edit_title": "Edit custom field", - "account_edit.field_edit_modal.limit_warning": "Recommended character limit exceeded. Mobile users might not see your field in full.", + "account_edit.field_edit_modal.length_warning": "Recommended character limit exceeded. Mobile users might not see your field in full.", "account_edit.field_edit_modal.link_emoji_warning": "We recommend against the use of custom emoji in combination with urls. Custom fields containing both will display as text only instead of as a link, in order to prevent user confusion.", "account_edit.field_edit_modal.name_hint": "E.g. “Personal website”", "account_edit.field_edit_modal.name_label": "Label", @@ -228,8 +237,10 @@ "account_edit.profile_tab.show_media.title": "Show ‘Media’ tab", "account_edit.profile_tab.show_media_replies.description": "When enabled, Media tab shows both your posts and replies to other people’s posts.", "account_edit.profile_tab.show_media_replies.title": "Include replies on ‘Media’ tab", - "account_edit.profile_tab.subtitle": "Customize the tabs on your profile and what they display.", - "account_edit.profile_tab.title": "Profile tab settings", + "account_edit.profile_tab.show_relations.description": "Shows accounts you follow and followers to other users in your profile. People will still be able to see if you are following them.", + "account_edit.profile_tab.show_relations.title": "Show ‘Followers’ and ‘Following’", + "account_edit.profile_tab.subtitle": "Customize how your profile is displayed.", + "account_edit.profile_tab.title": "Profile display settings", "account_edit.save": "Save", "account_edit.upload_modal.back": "Back", "account_edit.upload_modal.done": "Done", @@ -257,6 +268,7 @@ "account_edit_tags.search_placeholder": "Enter a hashtag…", "account_edit_tags.suggestions": "Suggestions:", "account_edit_tags.tag_status_count": "{count, plural, one {# post} other {# posts}}", + "account_list.hidden_notice": "This is only visible to you. To show this list to others, go to {page} > {modal} > {field}.", "account_list.total": "{total, plural, one {# account} other {# accounts}}", "account_note.placeholder": "Click to add note", "admin.dashboard.daily_retention": "User retention rate by day after sign-up", @@ -460,7 +472,7 @@ "closed_registrations_modal.find_another_server": "Find another server", "closed_registrations_modal.preamble": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!", "closed_registrations_modal.title": "Signing up on Mastodon", - "collection.share_modal.share_link_label": "Invite share link", + "collection.share_modal.share_link_label": "Share link", "collection.share_modal.share_via_post": "Post on Mastodon", "collection.share_modal.share_via_system": "Share to…", "collection.share_modal.title": "Share collection", @@ -468,8 +480,11 @@ "collection.share_template_other": "Check out this cool collection: {link}", "collection.share_template_own": "Check out my new collection: {link}", "collections.account_count": "{count, plural, one {# account} other {# accounts}}", - "collections.accounts.empty_description": "Add up to {count} accounts you follow", + "collections.accounts.empty_description": "Add up to {count} accounts", + "collections.accounts.empty_editor_title": "No one is in this collection yet", "collections.accounts.empty_title": "This collection is empty", + "collections.block_collection_owner": "Block account", + "collections.by_account": "by {account_handle}", "collections.collection_description": "Description", "collections.collection_language": "Language", "collections.collection_language_none": "None", @@ -478,47 +493,58 @@ "collections.confirm_account_removal": "Are you sure you want to remove this account from this collection?", "collections.content_warning": "Content warning", "collections.continue": "Continue", - "collections.create.accounts_subtitle": "Only accounts you follow who have opted into discovery can be added.", + "collections.copy_link": "Copy link", + "collections.copy_link_confirmation": "Copied collection link to clipboard", "collections.create.accounts_title": "Who will you feature in this collection?", "collections.create.basic_details_title": "Basic details", "collections.create.steps": "Step {step}/{total}", - "collections.create_a_collection_hint": "Create a collection to recommend or share your favourite accounts with others.", "collections.create_collection": "Create collection", "collections.delete_collection": "Delete collection", "collections.description_length_hint": "100 characters limit", - "collections.detail.accept_inclusion": "Okay", - "collections.detail.accounts_heading": "Accounts", - "collections.detail.author_added_you": "{author} added you to this collection", - "collections.detail.curated_by_author": "Curated by {author}", - "collections.detail.curated_by_you": "Curated by you", + "collections.detail.author_added_you_on_date": "{author} added you on {date}", "collections.detail.loading": "Loading collection…", - "collections.detail.other_accounts_in_collection": "Others in this collection:", "collections.detail.revoke_inclusion": "Remove me", + "collections.detail.sensitive_content": "Sensitive content", "collections.detail.sensitive_note": "This collection contains accounts and content that may be sensitive to some users.", "collections.detail.share": "Share this collection", + "collections.detail.you_are_in_this_collection": "You're featured in this collection", "collections.edit_details": "Edit details", - "collections.error_loading_collections": "There was an error when trying to load your collections.", - "collections.hints.accounts_counter": "{count} / {max} accounts", + "collections.error_loading_collections": "There was an error when trying to load these collections.", + "collections.hidden_accounts_description": "You’ve blocked or muted {count, plural, one {this user} other {these users}}", + "collections.hidden_accounts_link": "{count, plural, one {# hidden account} other {# hidden accounts}}", + "collections.hints.accounts_counter": "{count}/{max} accounts", "collections.last_updated_at": "Last updated: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Collection} other {# Collections}}", + "collections.list.created_by_author": "Created by {name}", + "collections.list.created_by_you": "Created by you", + "collections.list.featuring_you": "Featuring you", "collections.manage_accounts": "Manage accounts", "collections.mark_as_sensitive": "Mark as sensitive", "collections.mark_as_sensitive_hint": "Hides the collection's description and accounts behind a content warning. The collection name will still be visible.", + "collections.maximum_collection_count_description": "Your server allows creation of up to {count} collections.", + "collections.maximum_collection_count_reached": "You have created the maximum number of collections", "collections.name_length_hint": "40 characters limit", "collections.new_collection": "New collection", - "collections.no_collections_yet": "No collections yet.", - "collections.old_last_post_note": "Last posted over a week ago", - "collections.remove_account": "Remove this account", + "collections.pending_accounts.message": "Accounts may appear as pending when we’re awaiting a response from the user or their server. Only you can see pending accounts.", + "collections.pending_accounts.title": "Why am I seeing pending accounts?", + "collections.remove_account": "Remove", "collections.report_collection": "Report this collection", "collections.revoke_collection_inclusion": "Remove myself from this collection", "collections.revoke_inclusion.confirmation": "You've been removed from \"{collection}\"", "collections.revoke_inclusion.error": "There was an error, please try again later.", - "collections.search_accounts_label": "Search for accounts to add…", + "collections.search_accounts_label": "Search for an account to add", "collections.search_accounts_max_reached": "You have added the maximum number of accounts", "collections.sensitive": "Sensitive", + "collections.share_short": "Share", + "collections.suggestions.can_not_add": "Can’t be added", + "collections.suggestions.can_not_add_desc": "These accounts may have opted out of discovery, or they might be on a server that doesn’t support collections.", + "collections.suggestions.must_follow": "Must follow first", + "collections.suggestions.must_follow_desc": "These accounts review all follow requests. Followers can add them to collections.", "collections.topic_hint": "Add a hashtag that helps others understand the main topic of this collection.", "collections.topic_special_chars_hint": "Special characters will be removed when saving", + "collections.unlisted_collections_description": "These don’t appear on your profile to others. Anyone with the link can discover them.", + "collections.unlisted_collections_with_count": "Unlisted collections ({count})", "collections.view_collection": "View collection", - "collections.view_other_collections_by_user": "View other collections by this user", "collections.visibility_public": "Public", "collections.visibility_public_hint": "Discoverable in search results and other areas where recommendations appear.", "collections.visibility_title": "Visibility", @@ -532,7 +558,6 @@ "column.bookmarks": "Bookmarks", "column.circle_members": "Manage circle members", "column.circles": "Circles", - "column.collections": "My collections", "column.community": "Local timeline", "column.create_antenna": "Create antenna", "column.create_bookmark_category": "Create bookmark_category", @@ -558,9 +583,11 @@ "column.local": "Local", "column.mutes": "Muted users", "column.notifications": "Notifications", + "column.other_collections": "Collections by {name}", "column.pins": "Pinned posts", "column.public": "Federated timeline", "column.reaction_deck": "Reaction deck", + "column.your_collections": "Your Collections", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", @@ -636,12 +663,13 @@ "confirmations.discard_draft.post.title": "Discard your draft post?", "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.follow_to_collection.confirm": "Follow and add to collection", - "confirmations.follow_to_collection.message": "You need to be following {name} to add them to a collection.", - "confirmations.follow_to_collection.title": "Follow account?", "confirmations.follow_to_list.confirm": "Follow and add to list", "confirmations.follow_to_list.message": "You need to be following {name} to add them to a list.", "confirmations.follow_to_list.title": "Follow user?", + "confirmations.hide_featured_tab.confirm": "Hide tab", + "confirmations.hide_featured_tab.intro": "You can change this at any time under Edit profile > Profile tab settings.", + "confirmations.hide_featured_tab.message": "This will hide the tab for users on {serverName} and other servers running the latest version of Mastodon. Other displays may vary.", + "confirmations.hide_featured_tab.title": "Hide \"Featured\" tab?", "confirmations.logout.confirm": "Log out", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.title": "Log out?", @@ -680,6 +708,7 @@ "content_warning.hide": "Hide post", "content_warning.show": "Show anyway", "content_warning.show_more": "Show more", + "content_warning.show_short": "Show", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", @@ -721,6 +750,14 @@ "domain_pill.your_server": "Your digital home, where all of your posts live. Don’t like this one? Transfer servers at any time and bring your followers, too.", "domain_pill.your_username": "Your unique identifier on this server. It’s possible to find users with the same username on different servers.", "dropdown.empty": "Select an option", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Subscribe", + "email_subscriptions.form.bottom": "Get posts in your inbox without creating a Mastodon account. Unsubscribe at any time. For more information, refer to the Privacy Policy.", + "email_subscriptions.form.title": "Sign up for email updates from {name}", + "email_subscriptions.submitted.lead": "Check your inbox for an email to finish signing up for email updates.", + "email_subscriptions.submitted.title": "One more step", + "email_subscriptions.validation.email.blocked": "Blocked email provider", + "email_subscriptions.validation.email.invalid": "Invalid email address", "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -738,9 +775,14 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", - "empty_column.account_featured.me": "You have not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", - "empty_column.account_featured.other": "{acct} has not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", - "empty_column.account_featured_other.unknown": "This account has not featured anything yet.", + "empty_column.account_featured.other": "{acct} has not featured anything yet.", + "empty_column.account_featured_self.no_collections_button": "Create a collection", + "empty_column.account_featured_self.no_collections_hide_tab": "Hide this tab instead", + "empty_column.account_featured_self.pre_collections": "Stay tuned for Collections", + "empty_column.account_featured_self.pre_collections_desc": "Collections (coming in Mastodon 4.6) allow you to create your own curated lists of accounts to recommend to others.", + "empty_column.account_featured_self.showcase_accounts": "Showcase your favorite accounts", + "empty_column.account_featured_self.showcase_accounts_desc": "Collections are curated lists of accounts to help others discover more of the Fediverse.", + "empty_column.account_featured_unknown.other": "This account hasn’t featured anything yet.", "empty_column.account_hides_collections": "This user has chosen to not make this information available", "empty_column.account_suspended": "Account suspended", "empty_column.account_timeline": "No posts here!", @@ -749,6 +791,7 @@ "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", "empty_column.circle_statuses": "You don't have any circle posts yet. When you post one as circle, it will show up here.", + "empty_column.collections.featured_in": "You have not been added to any collections yet.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.", "empty_column.disabled_feed": "This feed has been disabled by your server administrators.", @@ -846,6 +889,7 @@ "footer.source_code": "View source code", "footer.status": "Status", "footer.terms_of_service": "Terms of service", + "form_error.blank": "Field cannot be blank.", "form_field.optional": "(optional)", "generic.saved": "Saved", "getting_started.heading": "Getting started", @@ -1040,6 +1084,7 @@ "navigation_panel.expand_followed_tags": "Expand followed hashtags menu", "navigation_panel.expand_lists": "Expand list menu", "not_signed_in_indicator.not_signed_in": "You need to login to access this resource.", + "notification.added_to_collection": "{name} added you to a collection", "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}", @@ -1049,6 +1094,7 @@ "notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up", "notification.annual_report.message": "Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!", "notification.annual_report.view": "View #Wrapstodon", + "notification.collection_update": "{name} edited a collection you’re in", "notification.emoji_reaction": "{name} reacted your post with emoji", "notification.emoji_reaction.name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}} reacted your post with emoji", "notification.favourite": "{name} favorited your post", @@ -1349,6 +1395,7 @@ "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.more_about_this_server": "More about this server", "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.", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 67de7b360b1e87..ae0f37e8eb350a 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -22,12 +22,10 @@ "account.block_domain": "Bloki la domajnon {domain}", "account.block_short": "Bloko", "account.blocked": "Blokita", - "account.blocking": "Bloko", "account.cancel_follow_request": "Nuligi peton por sekvado", "account.copy": "Kopii ligilon al profilo", "account.direct": "Private mencii @{name}", "account.disable_notifications": "Ĉesu sciigi min kiam @{name} afiŝas", - "account.domain_blocking": "Blokas domajnon", "account.edit_profile": "Redakti la profilon", "account.edit_profile_short": "Redakti", "account.enable_notifications": "Sciigu min kiam @{name} afiŝos", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "Sekvita de {name1} kaj {name2}", "account.featured": "Elstarigitaj", "account.featured.accounts": "Profiloj", - "account.featured.hashtags": "Kradvortoj", - "account.featured_tags.last_status_at": "Lasta afîŝo je {date}", - "account.featured_tags.last_status_never": "Neniu afiŝo", "account.follow": "Sekvi", "account.follow_back": "Sekvu reen", "account.follow_back_short": "Sekvu reen", @@ -68,17 +63,14 @@ "account.mute_notifications_short": "Silentigu sciigojn", "account.mute_short": "Silentigu", "account.muted": "Silentigita", - "account.muting": "Silentas", "account.mutual": "Vi sekvas unu la alian", "account.no_bio": "Neniu priskribo estas provizita.", "account.node_modal.field_label": "Persona noto", "account.open_original_page": "Malfermi la originalan paĝon", "account.posts": "Afiŝoj", - "account.posts_with_replies": "Afiŝoj kaj respondoj", "account.remove_from_followers": "Forigi {name}-n de sekvantoj", "account.report": "Raporti @{name}", "account.requested_follow": "{name} petis sekvi vin", - "account.requests_to_follow_you": "Petoj 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}}", @@ -91,7 +83,6 @@ "account.unmute": "Malsilentigi @{name}", "account.unmute_notifications_short": "Malsilentigu sciigojn", "account.unmute_short": "Ne plu silentigi", - "account_edit.featured_hashtags.item": "kradvortoj", "account_edit.featured_hashtags.title": "Elstarigitaj kradvortoj", "account_edit.save": "Konservi", "account_edit_tags.add_tag": "Aldoni #{tagName}", @@ -161,7 +152,6 @@ "closed_registrations_modal.title": "Registriĝi en Mastodon", "collections.create_collection": "Krei kolekton", "collections.delete_collection": "Forigi kolekton", - "collections.error_loading_collections": "Okazis eraro provante ŝargi viajn kolektojn.", "column.about": "Pri", "column.blocks": "Blokitaj uzantoj", "column.bookmarks": "Legosignoj", @@ -318,8 +308,6 @@ "emoji_button.search_results": "Serĉaj rezultoj", "emoji_button.symbols": "Simboloj", "emoji_button.travel": "Vojaĝoj kaj lokoj", - "empty_column.account_featured.me": "Vi ankoraŭ elstarigis nenion. Ĉu vi sciis, ke vi povas elstarigi viajn plej ofte uzatajn kradvortojn, kaj eĉ la kontojn de viaj amikoj sur via profilo?", - "empty_column.account_featured_other.unknown": "Ĉi tiu konto ankoraŭ ne elstarigis ion ajn.", "empty_column.account_hides_collections": "Ĉi tiu uzanto elektis ne disponebligi ĉi tiu informon", "empty_column.account_suspended": "Konto suspendita", "empty_column.account_timeline": "Neniuj afiŝoj ĉi tie!", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 67106dc618f975..c80e61ae952a2d 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear dominio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueado", - "account.blocking": "Bloqueo", "account.cancel_follow_request": "Dejar de seguir", "account.copy": "Copiar enlace al perfil", "account.direct": "Mención privada a @{name}", "account.disable_notifications": "Dejar de notificarme cuando @{name} envíe mensajes", - "account.domain_blocking": "Dominio bloqueado", "account.edit_note": "Editar nota personal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Destacados", "account.featured.accounts": "Perfiles", "account.featured.collections": "Colecciones", - "account.featured.hashtags": "Etiquetas", - "account.featured_tags.last_status_at": "Último mensaje: {date}", - "account.featured_tags.last_status_never": "Sin mensajes", + "account.featured.new_collection": "Nueva colección", "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar adhesiones", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar adhesiones de @{name}", "account.in_memoriam": "Cuenta conmemorativa.", + "account.join_modal.day": "Día", + "account.join_modal.me": "Te uniste a {server} el", + "account.join_modal.me_anniversary": "¡Feliz Fediversario! Te uniste a {server} el", + "account.join_modal.me_today": "¡Es tu primer día en {server}!", + "account.join_modal.other": "{name} se unió a {server} el", + "account.join_modal.other_today": "¡Es el primer día de {name} en {server}!", + "account.join_modal.share.celebrate": "Compartí un mensaje conmemorativo", + "account.join_modal.share.intro": "Compartí un mensaje introductorio", + "account.join_modal.share.welcome": "Compartí un mensaje de bienvenida", + "account.join_modal.years": "{number, plural, one {# año} other {# años}}", "account.joined_short": "En este servidor desde el", "account.languages": "Cambiar idiomas suscritos", + "account.last_active": "Última actividad", "account.link_verified_on": "La propiedad de este enlace fue verificada el {date}", "account.locked_info": "Esta cuenta es privada. El propietario manualmente revisa quién puede seguirle.", "account.media": "Medios", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Silenciar notificaciones", "account.mute_short": "Silenciar", "account.muted": "Silenciado", - "account.muting": "Silenciada", "account.mutual": "Se siguen mutuamente", + "account.name.copy": "Copiar alias", "account.name.help.domain": "«{domain}» es el servidor que hospeda el perfil y los mensajes del usuario.", "account.name.help.domain_self": "«{domain}» es tu servidor que hospeda tu perfil y tus mensajes.", - "account.name.help.footer": "Así como podés enviar correos electrónicos a personas usando diferentes clientes de email, del mismo modo podés interactuar con cuentas en otros servidores de Mastodon; y con cuentas en otras aplicaciones sociales que funcionen bajo las mismas normas que Mastodon (esto es, el protocolo ActivityPub).", + "account.name.help.footer": "Al igual que podés enviar correos electrónicos a personas usando diferentes proveedores de correo electrónico, del mismo modo podés interactuar con personas en otros servidores de Mastodon y en otras redes sociales compatibles con Mastodon.", "account.name.help.header": "Un alias es similar a una dirección de correo electrónico", "account.name.help.username": "«{username}» es el nombre de usuario de esta cuenta en su servidor. Alguien en otro servidor puede tener el mismo nombre de usuario.", "account.name.help.username_self": "«{username}» es tu nombre de usuario en este servidor. Alguien en otro servidor puede tener el mismo nombre de usuario.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Editar", "account.note.title": "Nota personal (visible solo para vos)", "account.open_original_page": "Abrir página original", + "account.pending": "Pendiente", "account.posts": "Mensajes", - "account.posts_with_replies": "Mnsjs y resp. públicas", "account.remove_from_followers": "Quitar a {name} de tus seguidores", "account.report": "Denunciar a @{name}", "account.requested_follow": "{name} solicitó seguirte", - "account.requests_to_follow_you": "Solicita seguirte", "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar adhesiones de @{name}", "account.statuses_counter": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}", @@ -141,34 +147,42 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.advanced_settings.bot_hint": "Señala a otras cuentas que esta cuenta principalmente realiza acciones automatizadas y podría no estar monitoreada", + "account_edit.advanced_settings.bot_label": "Cuenta automatizada", + "account_edit.advanced_settings.title": "Configuración avanzada", + "account_edit.bio.add_label": "Agregar biografía", + "account_edit.bio.edit_label": "Editar biografía", "account_edit.bio.placeholder": "Agregá una breve introducción para ayudar a otras personas a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Agregar biografía", "account_edit.bio_modal.edit_title": "Editar biografía", - "account_edit.button.add": "Agregar {item}", - "account_edit.button.delete": "Eliminar {item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Listo", "account_edit.column_title": "Editar perfil", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Agregar campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Agregá tus pronombres personales, enlaces externos o cualquier otra cosa que quisieras compartir.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Podés agregar fácilmente credibilidad a tu cuenta de Mastodon verificando enlaces a cualquier sitio web que tengas.", "account_edit.custom_fields.tip_title": "Consejo: Agregá enlaces verificados", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "¿Cómo agrego un enlace verificado?", + "account_edit.display_name.add_label": "Agregar nombre a mostrar", + "account_edit.display_name.edit_label": "Editar nombre a mostrar", "account_edit.display_name.placeholder": "Tu nombre a mostrar es cómo aparecerá tu nombre en tu perfil y en las líneas temporales.", "account_edit.display_name.title": "Nombre a mostrar", - "account_edit.featured_hashtags.item": "etiquetas", + "account_edit.featured_hashtags.edit_label": "Agregar etiquetas", "account_edit.featured_hashtags.placeholder": "Ayudá a otras personas a identificarte y a tener un rápido acceso a tus temas favoritos.", "account_edit.featured_hashtags.title": "Etiquetas destacadas", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "¿De verdad querés eliminar este campo personalizado? Esta acción no se puede deshacer.", "account_edit.field_delete_modal.delete_button": "Eliminar", "account_edit.field_delete_modal.title": "¿Eliminar campo personalizado?", "account_edit.field_edit_modal.add_title": "Agregar campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Tenés cambios sin guardar. ¿De verdad querés descartarlos?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", - "account_edit.field_edit_modal.limit_header": "Se excedió el límite de caracteres recomendado", - "account_edit.field_edit_modal.limit_message": "Es posible que los usuarios en dispositivos móviles no vean tu campo completamente.", + "account_edit.field_edit_modal.length_warning": "Se excedió el límite recomendado de caracteres. Es posible que los usuarios en dispositivos móviles no vean tu campo completo.", "account_edit.field_edit_modal.link_emoji_warning": "No recomendamos el uso de emojis personalizados en combinación con direcciones web. Los campos personalizados que contengan ambos solo se mostrarán como texto en lugar de como enlace, con el fin de evitar la confusión del usuario.", "account_edit.field_edit_modal.name_hint": "Por ejemplo: «Sitio web personal»", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", "account_edit.image_edit.remove_button": "Quitar imagen", "account_edit.image_edit.replace_button": "Reemplazar imagen", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Agregar nombre a mostrar", "account_edit.name_modal.edit_title": "Editar nombre a mostrar", "account_edit.profile_tab.button_label": "Personalizar", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Mostrar pestaña «Medios»", "account_edit.profile_tab.show_media_replies.description": "Cuando está habilitada, la pestaña «Medios» muestra tanto tus mensajes como tus respuestas a otras cuentas.", "account_edit.profile_tab.show_media_replies.title": "Incluir respuestas en la pestaña «Medios»", - "account_edit.profile_tab.subtitle": "Personalizá las pestañas en tu perfil y qué van a mostrar.", - "account_edit.profile_tab.title": "Configuración de pestaña de perfil", "account_edit.save": "Guardar", "account_edit.upload_modal.back": "Volver", "account_edit.upload_modal.done": "Listo", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Arrastrá para subir", "account_edit.upload_modal.step_upload.header": "Elegí una imagen", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, hasta {limit} MB.{br}La imagen será escalada a {width}x{height} píxeles.", - "account_edit.upload_modal.title_add": "Agregar imagen de perfil", - "account_edit.upload_modal.title_replace": "Reemplazar imagen de perfil", + "account_edit.upload_modal.title_add.avatar": "Agregar imagen de perfil", + "account_edit.upload_modal.title_add.header": "Agregar imagen de cubierta", + "account_edit.upload_modal.title_replace.avatar": "Reemplazar imagen de perfil", + "account_edit.upload_modal.title_replace.header": "Reemplazar imagen de cubierta", "account_edit.verified_modal.details": "Agregá credibilidad a tu perfil de Mastodon verificando enlaces a sitios web personales. Así es cómo funciona:", "account_edit.verified_modal.invisible_link.details": "Agregá el enlace a tu encabezado. La parte importante es rel=\"yo\" que evita la suplantación en sitios web con contenido generado por el usuario. Incluso podés usar una etiqueta de enlace en el encabezado de la página en lugar de {tag}, pero el código HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo hago el enlace invisible?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Agregá tu sitio web como un campo personalizado", "account_edit.verified_modal.title": "¿Cómo agregar un enlace verificado?", "account_edit_tags.add_tag": "Agregar #{tagName}", - "account_edit_tags.column_title": "Editar etiquetas destacadas", + "account_edit_tags.column_title": "Editar etiquetas", "account_edit_tags.help_text": "Las etiquetas destacadas ayudan a los usuarios a descubrir e interactuar con tu perfil. Las etiquetas destacadas aparecen como filtros en la vista de actividad de la página de tu perfil.", + "account_edit_tags.max_tags_reached": "Alcanzaste el número máximo de etiquetas destacadas.", "account_edit_tags.search_placeholder": "Ingresá una etiqueta…", "account_edit_tags.suggestions": "Sugerencias:", "account_edit_tags.tag_status_count": "{count, plural, one {voto} other {votos}}", + "account_list.total": "{total, plural, one {# hora} other {# horas}}", "account_note.placeholder": "Hacé clic par agregar una nota", "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día, después del registro", "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes, después del registro", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Buscar otro servidor", "closed_registrations_modal.preamble": "Mastodon es descentralizado, por lo que no importa dónde creés tu cuenta, podrás seguir e interactuar con cualquier persona en este servidor. ¡Incluso podés montar tu propio servidor!", "closed_registrations_modal.title": "Registrarse en Mastodon", - "collection.share_modal.share_link_label": "Enlace para compartir", + "collection.share_modal.share_link_label": "Compartir enlace", "collection.share_modal.share_via_post": "Enviar a Mastodon", "collection.share_modal.share_via_system": "Compartir en…", "collection.share_modal.title": "Compartir colección", @@ -346,8 +364,11 @@ "collection.share_template_other": "¡Mirá qué copada está esta colección! {link}", "collection.share_template_own": "Mirá mi nueva colección: {link}", "collections.account_count": "{count, plural, one {# hora} other {# horas}}", - "collections.accounts.empty_description": "Agregá hasta {count} cuentas que seguís", + "collections.accounts.empty_description": "Agregá hasta {count} cuentas", + "collections.accounts.empty_editor_title": "Todavía no hay nadie en esta colección", "collections.accounts.empty_title": "Esta colección está vacía", + "collections.block_collection_owner": "Bloquear cuenta", + "collections.by_account": "por {account_handle}", "collections.collection_description": "Descripción", "collections.collection_language": "Idioma", "collections.collection_language_none": "Ninguno", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "¿De verdad querés eliminar esta cuenta de esta colección?", "collections.content_warning": "Advertencia de contenido", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Solo las cuentas que seguís —las cuales optaron por ser descubiertas— pueden ser agregadas.", + "collections.copy_link": "Copiar enlace", + "collections.copy_link_confirmation": "Enlace a la colección copiado al portapapeles", "collections.create.accounts_title": "¿A quién vas a destacar en esta colección?", "collections.create.basic_details_title": "Detalles básicos", "collections.create.steps": "Paso {step}/{total}", - "collections.create_a_collection_hint": "Creá una colección para recomendar o compartir tus cuentas favoritas con otras personas.", "collections.create_collection": "Crear colección", "collections.delete_collection": "Eliminar colección", "collections.description_length_hint": "Límite de 100 caracteres", - "collections.detail.accept_inclusion": "Aceptar", - "collections.detail.accounts_heading": "Cuentas", - "collections.detail.author_added_you": "{author} te agregó a esta colección", - "collections.detail.curated_by_author": "Curado por {author}", - "collections.detail.curated_by_you": "Curado por vos", + "collections.detail.author_added_you_on_date": "{author} te agregó el {date}", "collections.detail.loading": "Cargando colección…", - "collections.detail.other_accounts_in_collection": "Otras cuentas en esta colección:", "collections.detail.revoke_inclusion": "Quitarme", + "collections.detail.sensitive_content": "Contenido sensible", "collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que pueden ser sensibles a algunos usuarios.", "collections.detail.share": "Compartir esta colección", + "collections.detail.you_are_in_this_collection": "Te destacaron en esta colección", "collections.edit_details": "Editar detalles", - "collections.error_loading_collections": "Hubo un error al intentar cargar tus colecciones.", - "collections.hints.accounts_counter": "{count} / {max} cuentas", + "collections.hidden_accounts_description": "Bloqueaste o silenciaste a {count, plural, one {este usuario} other {estos usuarios}}", + "collections.hidden_accounts_link": "{count, plural, one {# cuenta oculta} other {# cuentas ocultas}}", + "collections.hints.accounts_counter": "{count}/{max} cuentas", "collections.last_updated_at": "Última actualización: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Colección} other {# Colecciones}}", + "collections.list.created_by_author": "Creadas por {name}", + "collections.list.created_by_you": "Creadas por vos", + "collections.list.featuring_you": "En las que te destacan", "collections.manage_accounts": "Administrar cuentas", "collections.mark_as_sensitive": "Marcar como sensible", "collections.mark_as_sensitive_hint": "Oculta la descripción de la colección y las cuentas detrás de una advertencia de contenido. El nombre de la colección seguirá siendo visible.", + "collections.maximum_collection_count_description": "Tu servidor permite creaciones de hasta {count} colecciones.", + "collections.maximum_collection_count_reached": "Creaste el número máximo de colecciones", "collections.name_length_hint": "Límite de 40 caracteres", "collections.new_collection": "Nueva colección", - "collections.no_collections_yet": "No hay colecciones aún.", - "collections.old_last_post_note": "Último mensaje hace más de una semana", - "collections.remove_account": "Eliminar esta cuenta", + "collections.pending_accounts.message": "Las cuentas pueden aparecer como pendientes cuando estamos esperando una respuesta del usuario o su servidor. Solo vos podés ver cuentas pendientes.", + "collections.pending_accounts.title": "¿Por qué estoy viendo cuentas pendientes?", + "collections.remove_account": "Quitar", "collections.report_collection": "Denunciar esta colección", "collections.revoke_collection_inclusion": "Quitarme de esta colección", "collections.revoke_inclusion.confirmation": "Saliste de «{collection}»", "collections.revoke_inclusion.error": "Hubo un error; por favor, intentalo de nuevo más tarde.", - "collections.search_accounts_label": "Buscar cuentas para agregar…", + "collections.search_accounts_label": "Buscar una cuenta para agregar", "collections.search_accounts_max_reached": "Agregaste el número máximo de cuentas", "collections.sensitive": "Sensible", + "collections.share_short": "Compartir", + "collections.suggestions.can_not_add": "No se puede agregar", + "collections.suggestions.can_not_add_desc": "Estas cuentas pueden haber optado por no ser descubiertas, o podrían estar en un servidor que no soporta colecciones.", + "collections.suggestions.must_follow": "Deben seguirse primero", + "collections.suggestions.must_follow_desc": "Estas cuentas revisan todas las solicitudes de seguimiento. Los seguidores de estas cuentas pueden agregarlas a colecciones.", "collections.topic_hint": "Agregá una etiqueta que ayude a otros usuarios a entender el tema principal de esta colección.", "collections.topic_special_chars_hint": "Los símbolos se eliminarán al guardar", + "collections.unlisted_collections_description": "Estas colecciones no aparecen en tu perfil para ser mostradas a otras cuentas. Cualquier persona que tenga el enlace puede descubrirlas.", + "collections.unlisted_collections_with_count": "Colecciones no listadas ({count})", "collections.view_collection": "Abrir colección", - "collections.view_other_collections_by_user": "Ver otras colecciones de este usuario", "collections.visibility_public": "Pública", "collections.visibility_public_hint": "Puede ser descubierta en los resultados de búsqueda y en otras áreas donde aparezcan recomendaciones.", "collections.visibility_title": "Visibilidad", @@ -405,7 +436,6 @@ "column.about": "Información", "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", - "column.collections": "Mis colecciones", "column.community": "Línea temporal local", "column.create_list": "Crear lista", "column.direct": "Menciones privadas", @@ -422,8 +452,10 @@ "column.lists": "Listas", "column.mutes": "Usuarios silenciados", "column.notifications": "Notificaciones", + "column.other_collections": "Colecciones de {name}", "column.pins": "Mensajes fijados", "column.public": "Línea temporal federada", + "column.your_collections": "Tus colecciones", "column_back_button.label": "Volver", "column_header.hide_settings": "Ocultar configuración", "column_header.moveLeft_settings": "Mover columna a la izquierda", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "¿Descartar tu borrador?", "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.follow_to_collection.confirm": "Seguir y agregar a la colección", - "confirmations.follow_to_collection.message": "Necesitás seguir a {name} para agregarle a una colección.", - "confirmations.follow_to_collection.title": "¿Seguir cuenta?", "confirmations.follow_to_list.confirm": "Seguir y agregar a la lista", "confirmations.follow_to_list.message": "Necesitás seguir a {name} para agregarle a una lista.", "confirmations.follow_to_list.title": "¿Querés seguirle?", + "confirmations.hide_featured_tab.confirm": "Ocultar pestaña", + "confirmations.hide_featured_tab.intro": "Podés cambiar esto en cualquier momento en Editar perfil > Configuración de pestaña de perfil.", + "confirmations.hide_featured_tab.message": "Esto ocultará la pestaña para los usuarios en {serverName} y otros servidores que tengan instalada la última versión de Mastodon. Otras pantallas pueden variar.", + "confirmations.hide_featured_tab.title": "¿Ocultar la pestaña «Destacados»?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿De verdad querés cerrar la sesión?", "confirmations.logout.title": "¿Cerrar sesión?", @@ -529,6 +562,7 @@ "content_warning.hide": "Ocultar mensaje", "content_warning.show": "Mostrar de todos modos", "content_warning.show_more": "Mostrar más", + "content_warning.show_short": "Mostrar", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leída", "conversation.open": "Ver conversación", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Tu hogar digital, donde residen todos tus mensajes. ¿No te gusta este sitio? Mudate a otro servidor en cualquier momento y llevate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar cuentas con el mismo nombre de usuario en diferentes servidores.", "dropdown.empty": "Seleccioná una opción", + "email_subscriptions.email": "Correo electrónico", + "email_subscriptions.form.action": "Suscribite", + "email_subscriptions.form.bottom": "Obtené publicaciones en tu bandeja de entrada sin crear una cuenta de Mastodon. Desuscribite en cualquier momento. Para más información, consultá la Política de privacidad.", + "email_subscriptions.form.title": "Suscribite para recibir actualizaciones por correo electrónico de {name}", + "email_subscriptions.submitted.lead": "Revisá tu bandeja de entrada para confirmar tu suscripción, así podés recibir actualizaciones por correo electrónico.", + "email_subscriptions.submitted.title": "Un paso más", + "email_subscriptions.validation.email.blocked": "Proveedor de correo bloqueado", + "email_subscriptions.validation.email.invalid": "Dirección de correo electrónico no válida", "embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.", "embed.preview": "Así es cómo se verá:", "emoji_button.activity": "Actividad", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_featured.me": "Todavía no destacaste nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?", - "empty_column.account_featured.other": "{acct} todavía no destacó nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?", - "empty_column.account_featured_other.unknown": "Esta cuenta todavía no destacó nada.", + "empty_column.account_featured.other": "{acct} todavía no destacó nada.", + "empty_column.account_featured_self.no_collections_button": "Crear colección", + "empty_column.account_featured_self.no_collections_hide_tab": "En su lugar, ocultar esta pestaña", + "empty_column.account_featured_self.pre_collections": "Mantenete pendiente de las colecciones", + "empty_column.account_featured_self.pre_collections_desc": "Las colecciones (que vendrán en Mastodon 4.6) te permiten crear tus propias listas de cuentas seleccionadas para recomendar a otras personas.", + "empty_column.account_featured_self.showcase_accounts": "Mostrá tus cuentas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "Las colecciones son listas de cuentas seleccionadas para ayudar a otras personas a descubrir más del Fediverso.", + "empty_column.account_featured_unknown.other": "Esta cuenta todavía no destacó nada.", "empty_column.account_hides_collections": "Este usuario eligió no publicar esta información", "empty_column.account_suspended": "Cuenta suspendida", "empty_column.account_timeline": "¡No hay mensajes acá!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", "followers.hide_other_followers": "Este usuario eligió no hacer visibles a sus otros seguidores", + "followers.title": "Seguiendo a {name}", "following.hide_other_following": "Este usuario eligió no hacer visibles al resto de quienes lo siguen", + "following.title": "Seguido por {name}", "footer.about": "Información", "footer.about_mastodon": "Acerca de Mastodon", "footer.about_server": "Acerca de {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Ver código fuente", "footer.status": "Estado", "footer.terms_of_service": "Términos del servicio", + "form_error.blank": "El campo no puede estar en blanco.", "form_field.optional": "(opcional)", "generic.saved": "Guardado", "getting_started.heading": "Inicio de Mastodon", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Expandir menú de etiquetas seguidas", "navigation_panel.expand_lists": "Expandir menú de lista", "not_signed_in_indicator.not_signed_in": "Necesitás iniciar sesión para acceder a este recurso.", + "notification.added_to_collection": "{name} te agregó a una colección", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "Se registraron {name} y {count, plural, one {# cuenta más} other {# cuentas más}}", "notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvelá los momentos más destacados y memorables de tu año en Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editó una colección en la que estás", "notification.favourite": "{name} marcó tu mensaje como favorito", "notification.favourite.name_and_others_with_link": "{name} y {count, plural, one {# cuenta más} other {# cuentas más}} marcaron tu mensaje como favorito", "notification.favourite_pm": "{name} marcó como favorito tu mención privada", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "usuarios activos", "server_banner.administered_by": "Administrado por:", "server_banner.is_one_of_many": "{domain} es uno de los muchos servidores de Mastodon independientes que podés usar para participar en el Fediverso.", + "server_banner.more_about_this_server": "Más acerca de este servidor", "server_banner.server_stats": "Estadísticas del servidor:", "sign_in_banner.create_account": "Crear cuenta", "sign_in_banner.follow_anyone": "Seguí a cualquiera cuenta a través del Fediverso y leé todo en orden cronológico. Nada de algoritmos, publicidad o titulares engañosos.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 6057084391c5a9..67d866a1c3e2ed 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear dominio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueado", - "account.blocking": "Bloqueando", "account.cancel_follow_request": "Cancelar seguimiento", "account.copy": "Copiar enlace al perfil", "account.direct": "Mención privada @{name}", "account.disable_notifications": "Dejar de notificarme cuando @{name} publique algo", - "account.domain_blocking": "Bloqueando dominio", "account.edit_note": "Editar nota personal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Destacado", "account.featured.accounts": "Perfiles", "account.featured.collections": "Colecciones", - "account.featured.hashtags": "Etiquetas", - "account.featured_tags.last_status_at": "Última publicación el {date}", - "account.featured_tags.last_status_never": "Sin publicaciones", + "account.featured.new_collection": "Nueva colección", "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar impulsos", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar impulsos de @{name}", "account.in_memoriam": "En memoria.", + "account.join_modal.day": "Día", + "account.join_modal.me": "Te uniste a {server} el", + "account.join_modal.me_anniversary": "¡Feliz Fediversario! Te uniste a {server} el", + "account.join_modal.me_today": "¡Es tu primer día en {server}!", + "account.join_modal.other": "{name} se unió a {server} el", + "account.join_modal.other_today": "¡Es el primer día de {name} en {server}!", + "account.join_modal.share.celebrate": "Compartir una publicación para celebrarlo", + "account.join_modal.share.intro": "Compartir una publicación de presentación", + "account.join_modal.share.welcome": "Compartir una publicación de bienvenida", + "account.join_modal.years": "{number, plural, one {año} other {# años}}", "account.joined_short": "Se unió", "account.languages": "Cambiar idiomas suscritos", + "account.last_active": "Última actividad", "account.link_verified_on": "Se verificó la propiedad de este enlace el {date}", "account.locked_info": "El estado de privacidad de esta cuenta está configurado como bloqueado. El propietario revisa manualmente quién puede seguirlo.", "account.media": "Multimedia", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Silenciar notificaciones", "account.mute_short": "Silenciar", "account.muted": "Silenciado", - "account.muting": "Silenciando", "account.mutual": "Se siguen el uno al otro", + "account.name.copy": "Copiar identificador", "account.name.help.domain": "{domain} es el servidor que aloja el perfil y las publicaciones del usuario.", "account.name.help.domain_self": "{domain} es el servidor que aloja tu perfil y tus publicaciones.", - "account.name.help.footer": "Al igual que puedes enviar correos electrónicos a personas que utilizan diferentes clientes de correo electrónico, puedes interactuar con personas en otros servidores Mastodon, y con cualquier persona en otras aplicaciones sociales que funcionen con el mismo conjunto de reglas que utiliza Mastodon (el protocolo ActivityPub).", + "account.name.help.footer": "Al igual que puedes enviar correos electrónicos a personas que utilizan diferentes proveedores de correo electrónico, puedes interactuar con personas de otros servidores de Mastodon y con cualquier usuario de otras aplicaciones sociales compatibles con Mastodon.", "account.name.help.header": "Un identificador es como una dirección de correo electrónico", "account.name.help.username": "{username} es el nombre de usuario de esta cuenta en su servidor. Es posible que alguien en otro servidor tenga el mismo nombre de usuario.", "account.name.help.username_self": "{username} es tu nombre de usuario en este servidor. Es posible que alguien en otro servidor tenga el mismo nombre de usuario.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Editar", "account.note.title": "Nota personal (visible solo para ti)", "account.open_original_page": "Abrir página original", + "account.pending": "Pendiente", "account.posts": "Publicaciones", - "account.posts_with_replies": "Publicaciones y respuestas", "account.remove_from_followers": "Eliminar {name} de tus seguidores", "account.report": "Denunciar a @{name}", "account.requested_follow": "{name} ha solicitado seguirte", - "account.requests_to_follow_you": "Solicita 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}}", @@ -141,34 +147,42 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.advanced_settings.bot_hint": "Indica a los demás que la cuenta realiza principalmente acciones automatizadas y que es posible que no esté supervisada", + "account_edit.advanced_settings.bot_label": "Cuenta automatizada", + "account_edit.advanced_settings.title": "Configuración avanzada", + "account_edit.bio.add_label": "Añadir biografía", + "account_edit.bio.edit_label": "Editar biografía", "account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Añadir biografía", "account_edit.bio_modal.edit_title": "Editar biografía", - "account_edit.button.add": "Añadir {item}", - "account_edit.button.delete": "Eliminar {item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Hecho", "account_edit.column_title": "Editar perfil", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Añadir campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Añade tus pronombres, enlaces externos o cualquier otra información que quieras compartir.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Puedes añadir fácilmente credibilidad a tu cuenta de Mastodon verificando los enlaces a cualquier sitio web que poseas.", "account_edit.custom_fields.tip_title": "Consejo: Añadir enlaces verificados", "account_edit.custom_fields.title": "Campos personalizados", - "account_edit.custom_fields.verified_hint": "¿Cómo agrego un enlace verificado?", + "account_edit.custom_fields.verified_hint": "¿Cómo añado un enlace verificado?", + "account_edit.display_name.add_label": "Añadir nombre para mostrar", + "account_edit.display_name.edit_label": "Editar nombre para mostrar", "account_edit.display_name.placeholder": "Tu nombre de usuario es el nombre que aparece en tu perfil y en las líneas de tiempo.", "account_edit.display_name.title": "Nombre para mostrar", - "account_edit.featured_hashtags.item": "etiquetas", + "account_edit.featured_hashtags.edit_label": "Añadir etiquetas", "account_edit.featured_hashtags.placeholder": "Ayuda a otros a identificar tus temas favoritos y a acceder rápidamente a ellos.", "account_edit.featured_hashtags.title": "Etiquetas destacadas", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "¿Estás seguro de que deseas eliminar este campo personalizado? Esta acción no se puede deshacer.", "account_edit.field_delete_modal.delete_button": "Eliminar", "account_edit.field_delete_modal.title": "¿Eliminar campo personalizado?", "account_edit.field_edit_modal.add_title": "Agregar campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Tienes cambios sin guardar. ¿Estás seguro/a de que quieres descartarlos?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", - "account_edit.field_edit_modal.limit_header": "Se ha superado el límite de caracteres recomendado", - "account_edit.field_edit_modal.limit_message": "Es posible que los usuarios de dispositivos móviles no vean tu campo completo.", + "account_edit.field_edit_modal.length_warning": "Se ha superado el límite de caracteres recomendado. Es posible que los usuarios de dispositivos móviles no vean el campo completo.", "account_edit.field_edit_modal.link_emoji_warning": "No recomendamos el uso de emojis personalizados en combinación con direcciones URL. Los campos personalizados que contengan ambos se mostrarán solo como texto en lugar de como un enlace, con el fin de evitar confusiones al usuario.", "account_edit.field_edit_modal.name_hint": "Por ejemplo, «sitio web personal»", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", "account_edit.image_edit.remove_button": "Eliminar imagen", "account_edit.image_edit.replace_button": "Reemplazar imagen", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Añadir nombre para mostrar", "account_edit.name_modal.edit_title": "Editar nombre para mostrar", "account_edit.profile_tab.button_label": "Personalizar", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Mostrar pestaña «Multimedia»", "account_edit.profile_tab.show_media_replies.description": "Cuando está habilitada, la pestaña Multimedia muestra tanto tus publicaciones como tus respuestas a las publicaciones de otras personas.", "account_edit.profile_tab.show_media_replies.title": "Incluir respuestas en la pestaña «Multimedia»", - "account_edit.profile_tab.subtitle": "Personaliza las pestañas de tu perfil y lo que muestran.", - "account_edit.profile_tab.title": "Configuración de la pestaña de perfil", "account_edit.save": "Guardar", "account_edit.upload_modal.back": "Volver", "account_edit.upload_modal.done": "Hecho", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Arrastrar para subir", "account_edit.upload_modal.step_upload.header": "Elegir una imagen", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, con un tamaño máximo de {limit} MB.{br}La imagen se redimensionará a {width} x {height} píxeles.", - "account_edit.upload_modal.title_add": "Agregar foto de perfil", - "account_edit.upload_modal.title_replace": "Reemplazar foto de perfil", + "account_edit.upload_modal.title_add.avatar": "Añadir foto de perfil", + "account_edit.upload_modal.title_add.header": "Añadir foto de cabecera", + "account_edit.upload_modal.title_replace.avatar": "Reemplazar foto de perfil", + "account_edit.upload_modal.title_replace.header": "Reemplazar foto de cabecera", "account_edit.verified_modal.details": "Agrega credibilidad a tu perfil de Mastodon verificando los enlaces a sitios web personales. Así es como funciona:", "account_edit.verified_modal.invisible_link.details": "Agrega el enlace a tu encabezado. La parte importante es rel=\"me\", que evita la suplantación de identidad en sitios web con contenido generado por los usuarios. Incluso puedes usar una etiqueta de enlace en el encabezado de la página en lugar de {tag}, pero el HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo hago para que el enlace sea invisible?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Agrega tu sitio web como campo personalizado", "account_edit.verified_modal.title": "Cómo agregar un enlace verificado", "account_edit_tags.add_tag": "Añadir #{tagName}", - "account_edit_tags.column_title": "Editar etiquetas destacadas", + "account_edit_tags.column_title": "Editar etiquetas", "account_edit_tags.help_text": "Las etiquetas destacadas ayudan a los usuarios a descubrir tu perfil e interactuar con él. Aparecen como filtros en la vista Actividad de tu página de perfil.", + "account_edit_tags.max_tags_reached": "Has alcanzado el número máximo de etiquetas destacadas.", "account_edit_tags.search_placeholder": "Introduce una etiqueta…", "account_edit_tags.suggestions": "Sugerencias:", "account_edit_tags.tag_status_count": "{count, plural,one {# publicación} other {# publicaciones}}", + "account_list.total": "{total, plural,one {# cuenta} other {# cuentas}}", "account_note.placeholder": "Haz clic para añadir una nota", "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después de unirse", "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después de unirse", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Buscar otro servidor", "closed_registrations_modal.preamble": "Mastodon es descentralizado, por lo que no importa dónde crees tu cuenta, podrás seguir e interactuar con cualquier persona en este servidor. ¡Incluso puedes alojarlo tú mismo!", "closed_registrations_modal.title": "Registrarse en Mastodon", - "collection.share_modal.share_link_label": "Enlace para compartir", + "collection.share_modal.share_link_label": "Compartir enlace", "collection.share_modal.share_via_post": "Publicar en Mastodon", "collection.share_modal.share_via_system": "Compartir con…", "collection.share_modal.title": "Compartir la colección", @@ -346,8 +364,11 @@ "collection.share_template_other": "Echa un vistazo a esta increíble colección: {link}", "collection.share_template_own": "Echa un vistazo a mi nueva colección: {link}", "collections.account_count": "{count, plural,one {# cuenta} other {# cuentas}}", - "collections.accounts.empty_description": "Añade hasta {count} cuentas que sigues", + "collections.accounts.empty_description": "Añade hasta {count} cuentas", + "collections.accounts.empty_editor_title": "No hay nadie en esta colección todavía", "collections.accounts.empty_title": "Esta colección está vacía", + "collections.block_collection_owner": "Bloquer cuenta", + "collections.by_account": "de {account_handle}", "collections.collection_description": "Descripción", "collections.collection_language": "Idioma", "collections.collection_language_none": "Ninguno", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "¿Estás seguro/a de que quieres eliminar esta cuenta de esta colección?", "collections.content_warning": "Advertencia de contenido", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Solo se pueden añadir cuentas que sigas y que hayan optado por aparecer en los resultados de búsqueda.", + "collections.copy_link": "Copiar enlace", + "collections.copy_link_confirmation": "Se ha copiado el enlace de la colección al portapapeles", "collections.create.accounts_title": "¿A quién incluirás en esta colección?", "collections.create.basic_details_title": "Detalles básicos", "collections.create.steps": "Paso {step}/{total}", - "collections.create_a_collection_hint": "Crea una colección para recomendar o compartir tus cuentas favoritas con otras personas.", "collections.create_collection": "Crear colección", "collections.delete_collection": "Eliminar colección", "collections.description_length_hint": "Limitado a 100 caracteres", - "collections.detail.accept_inclusion": "Aceptar", - "collections.detail.accounts_heading": "Cuentas", - "collections.detail.author_added_you": "{author} te ha añadido a esta colección", - "collections.detail.curated_by_author": "Seleccionado por {author}", - "collections.detail.curated_by_you": "Seleccionado por ti", + "collections.detail.author_added_you_on_date": "{author} te agregó el {date}", "collections.detail.loading": "Cargando colección…", - "collections.detail.other_accounts_in_collection": "Otros en esta colección:", "collections.detail.revoke_inclusion": "Excluirme", + "collections.detail.sensitive_content": "Contenido sensible", "collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que pueden resultar sensibles para algunos usuarios.", "collections.detail.share": "Compartir esta colección", + "collections.detail.you_are_in_this_collection": "Apareces en esta colección", "collections.edit_details": "Editar detalles", - "collections.error_loading_collections": "Se produjo un error al intentar cargar tus colecciones.", - "collections.hints.accounts_counter": "{count} / {max} cuentas", + "collections.hidden_accounts_description": "Has bloqueado o silenciado {count, plural, one {a este usuario} other {a estos usuarios}}", + "collections.hidden_accounts_link": "{count, plural, one {# cuenta oculta} other {# cuentas ocultas}}", + "collections.hints.accounts_counter": "{count}/{max} cuentas", "collections.last_updated_at": "Última actualización: {date}", + "collections.list.collections_with_count": "{count, plural,one {# Colección} other {# Colecciones}}", + "collections.list.created_by_author": "Creado por {name}", + "collections.list.created_by_you": "Creado por ti", + "collections.list.featuring_you": "Con tu partipación", "collections.manage_accounts": "Administrar cuentas", "collections.mark_as_sensitive": "Marcar como sensible", "collections.mark_as_sensitive_hint": "Oculta la descripción y las cuentas de la colección detrás de una advertencia de contenido. El nombre de la colección seguirá siendo visible.", + "collections.maximum_collection_count_description": "Tu servidor permite la creación de hasta {count} colecciones.", + "collections.maximum_collection_count_reached": "Has alcanzado el número máximo de colecciones", "collections.name_length_hint": "Limitado a 40 caracteres", "collections.new_collection": "Nueva colección", - "collections.no_collections_yet": "No hay colecciones todavía.", - "collections.old_last_post_note": "Última publicación hace más de una semana", - "collections.remove_account": "Eliminar esta cuenta", + "collections.pending_accounts.message": "Las cuentas pueden aparecer como pendientes cuando estamos esperando una respuesta del usuario o de su servidor. Solo tú puedes ver las cuentas pendientes.", + "collections.pending_accounts.title": "¿Por qué estoy viendo cuentas pendientes?", + "collections.remove_account": "Eliminar", "collections.report_collection": "Reportar esta colección", "collections.revoke_collection_inclusion": "Excluirme de esta colección", "collections.revoke_inclusion.confirmation": "Has sido excluido de \"{collection}\"", "collections.revoke_inclusion.error": "Se ha producido un error, por favor, inténtalo de nuevo más tarde.", - "collections.search_accounts_label": "Buscar cuentas para añadir…", + "collections.search_accounts_label": "Buscar una cuenta para añadir", "collections.search_accounts_max_reached": "Has añadido el número máximo de cuentas", "collections.sensitive": "Sensible", + "collections.share_short": "Compartir", + "collections.suggestions.can_not_add": "No puede ser añadida", + "collections.suggestions.can_not_add_desc": "Es posible que estas cuentas hayan optado por no ser descubiertas, o que se encuentren en un servidor que no soporta colecciones.", + "collections.suggestions.must_follow": "Primero tienes que seguirla", + "collections.suggestions.must_follow_desc": "Estas cuentas revisan todas las solicitudes de seguimiento. Los seguidores pueden añadirlas a colecciones.", "collections.topic_hint": "Añade una etiqueta que ayude a los demás a comprender el tema principal de esta colección.", "collections.topic_special_chars_hint": "Los caracteres especiales se eliminarán al guardar", + "collections.unlisted_collections_description": "No aparecen en tu perfil. Cualquier persona que tenga el enlace puede descubrirlas.", + "collections.unlisted_collections_with_count": "Colecciones no listadas ({count})", "collections.view_collection": "Ver colección", - "collections.view_other_collections_by_user": "Ver otras colecciones de este usuario", "collections.visibility_public": "Pública", "collections.visibility_public_hint": "Visible en los resultados de búsqueda y otras áreas donde aparecen recomendaciones.", "collections.visibility_title": "Visibilidad", @@ -405,7 +436,6 @@ "column.about": "Acerca de", "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", - "column.collections": "Mis colecciones", "column.community": "Cronología local", "column.create_list": "Crear lista", "column.direct": "Menciones privadas", @@ -422,14 +452,16 @@ "column.lists": "Listas", "column.mutes": "Usuarios silenciados", "column.notifications": "Notificaciones", + "column.other_collections": "Colecciones de {name}", "column.pins": "Publicaciones fijadas", "column.public": "Cronología federada", + "column.your_collections": "Tus colecciones", "column_back_button.label": "Atrás", "column_header.hide_settings": "Ocultar configuración", "column_header.moveLeft_settings": "Mover columna a la izquierda", "column_header.moveRight_settings": "Mover columna a la derecha", "column_header.pin": "Fijar", - "column_header.show_settings": "Mostrar ajustes", + "column_header.show_settings": "Mostrar configuración", "column_header.unpin": "Dejar de fijar", "column_search.cancel": "Cancelar", "combobox.close_results": "Cerrar resultados", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "¿Deseas descartar tu borrador?", "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.follow_to_collection.confirm": "Seguir y añadir a la colección", - "confirmations.follow_to_collection.message": "Debes seguir a {name} para añadirlo a una colección.", - "confirmations.follow_to_collection.title": "¿Seguir cuenta?", "confirmations.follow_to_list.confirm": "Seguir y agregar a la lista", "confirmations.follow_to_list.message": "Tienes que seguir a {name} para añadirlo a una lista.", "confirmations.follow_to_list.title": "¿Seguir a usuario?", + "confirmations.hide_featured_tab.confirm": "Ocultar pestaña", + "confirmations.hide_featured_tab.intro": "Puedes cambiar esto en cualquier momento en Editar perfil > Configuración de la pestaña Perfil.", + "confirmations.hide_featured_tab.message": "Esto ocultará la pestaña para los usuarios de {serverName} y otros servidores que ejecuten la última versión de Mastodon. La visualización puede variar en otros casos.", + "confirmations.hide_featured_tab.title": "¿Deseas ocultar la pestaña \"Destacado\"?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Estás seguro de que quieres cerrar la sesión?", "confirmations.logout.title": "¿Deseas cerrar sesión?", @@ -529,6 +562,7 @@ "content_warning.hide": "Ocultar publicación", "content_warning.show": "Mostrar de todos modos", "content_warning.show_more": "Mostrar más", + "content_warning.show_short": "Mostrar", "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -541,7 +575,7 @@ "directory.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", "directory.recently_active": "Recientemente activo", - "disabled_account_banner.account_settings": "Ajustes de la cuenta", + "disabled_account_banner.account_settings": "Configuración de la cuenta", "disabled_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada.", "dismissable_banner.community_timeline": "Estas son las publicaciones públicas más recientes de las personas cuyas cuentas están alojadas en {domain}.", "dismissable_banner.dismiss": "Descartar", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", "dropdown.empty": "Elige una opción", + "email_subscriptions.email": "Correo electrónico", + "email_subscriptions.form.action": "Suscribirse", + "email_subscriptions.form.bottom": "Recibe publicaciones en tu bandeja de entrada sin necesidad de crear una cuenta de Mastodon. Puedes darte de baja en cualquier momento. Para obtener más información, consulta la Política de privacidad.", + "email_subscriptions.form.title": "Suscríbete para recibir actualizaciones por correo electrónico de {name}", + "email_subscriptions.submitted.lead": "Revisa tu bandeja de entrada para encontrar el correo electrónico que te permitirá completar tu suscripción a las actualizaciones por correo electrónico.", + "email_subscriptions.submitted.title": "Un paso más", + "email_subscriptions.validation.email.blocked": "Proveedor de correo electrónico bloqueado", + "email_subscriptions.validation.email.invalid": "Dirección de correo electrónico no válida", "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", - "empty_column.account_featured.other": "{acct} no ha destacado nada todavía. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", - "empty_column.account_featured_other.unknown": "Esta cuenta no ha destacado nada todavía.", + "empty_column.account_featured.other": "{acct} no ha destacado nada todavía.", + "empty_column.account_featured_self.no_collections_button": "Crear una colección", + "empty_column.account_featured_self.no_collections_hide_tab": "Ocultar esta pestaña", + "empty_column.account_featured_self.pre_collections": "No te pierdas las colecciones", + "empty_column.account_featured_self.pre_collections_desc": "Las colecciones (que llegarán en Mastodon 4.6) te permiten crear tus propias listas de cuentas seleccionadas para recomendarlas a otras personas.", + "empty_column.account_featured_self.showcase_accounts": "Destaca tus cuentas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "Las colecciones son listas de cuentas seleccionadas que ayudan a otros a descubrir más del Fediverso.", + "empty_column.account_featured_unknown.other": "Esta cuenta no ha destacado nada todavía.", "empty_column.account_hides_collections": "Este usuario ha elegido no hacer disponible esta información", "empty_column.account_suspended": "Cuenta suspendida", "empty_column.account_timeline": "¡No hay publicaciones aquí!", @@ -637,8 +684,8 @@ "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado; deberás cambiar la fecha de caducidad para que se aplique.", "filter_modal.added.expired_title": "¡Filtro expirado!", "filter_modal.added.review_and_configure": "Para revisar y configurar esta categoría de filtros, vaya a {settings_link}.", - "filter_modal.added.review_and_configure_title": "Ajustes de filtro", - "filter_modal.added.settings_link": "página de ajustes", + "filter_modal.added.review_and_configure_title": "Configuración de filtros", + "filter_modal.added.settings_link": "página de configuración", "filter_modal.added.short_explanation": "Esta publicación ha sido añadida a la siguiente categoría de filtros: {title}.", "filter_modal.added.title": "¡Filtro añadido!", "filter_modal.select_filter.context_mismatch": "no se aplica a este contexto", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Recomendamos seguir", "followed_tags": "Etiquetas seguidas", "followers.hide_other_followers": "Este usuario ha elegido no hacer visibles a sus otros seguidores", + "followers.title": "Siguiendo a {name}", "following.hide_other_following": "Este usuario ha elegido no hacer visible el resto de personas a las que sigue", + "following.title": "Seguido por {name}", "footer.about": "Acerca de", "footer.about_mastodon": "Acerca de Mastodon", "footer.about_server": "Acerca de {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Ver código fuente", "footer.status": "Estado", "footer.terms_of_service": "Condiciones del servicio", + "form_error.blank": "El campo no puede quedar en blanco.", "form_field.optional": "(opcional)", "generic.saved": "Guardado", "getting_started.heading": "Primeros pasos", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Expandir menú de etiquetas seguidas", "navigation_panel.expand_lists": "Expandir menú de lista", "not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.", + "notification.added_to_collection": "{name} te añadió a una colección", "notification.admin.report": "{name} denunció a {target}", "notification.admin.report_account": "{name} reportó {count, plural, one {una publicación} other {# publicaciones}} de {target} por {category}", "notification.admin.report_account_other": "{name} reportó {count, plural, one {una publicación} other {# publicaciones}} de {target}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# otro} other {# otros}} se registraron", "notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvela los momentos más destacados y memorables de tu año en Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editó una colección en la que estás", "notification.favourite": "{name} marcó como favorita tu publicación", "notification.favourite.name_and_others_with_link": "{name} y {count, plural, one {# otro} other {# otros}} marcaron tu publicación como favorita", "notification.favourite_pm": "{name} marcó como favorito tu mención privada", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "usuarios activos", "server_banner.administered_by": "Administrado por:", "server_banner.is_one_of_many": "{domain} es uno de los varios servidores independientes de Mastodon que puedes usar para participar en el fediverso.", + "server_banner.more_about_this_server": "Más información sobre este servidor", "server_banner.server_stats": "Estadísticas del servidor:", "sign_in_banner.create_account": "Crear cuenta", "sign_in_banner.follow_anyone": "Sigue a cualquier persona en el fediverso y velo todo en orden cronológico. Sin algoritmos, sin anuncios o titulares engañosos.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index c04df9cfd1ade8..e58e6598ba3c06 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear dominio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueado", - "account.blocking": "Bloqueando", "account.cancel_follow_request": "Retirar solicitud de seguimiento", "account.copy": "Copiar enlace al perfil", "account.direct": "Mención privada a @{name}", "account.disable_notifications": "Dejar de notificarme cuando @{name} publique algo", - "account.domain_blocking": "Bloqueando dominio", "account.edit_note": "Eidtar nota personal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Destacado", "account.featured.accounts": "Perfiles", "account.featured.collections": "Colecciones", - "account.featured.hashtags": "Etiquetas", - "account.featured_tags.last_status_at": "Última publicación el {date}", - "account.featured_tags.last_status_never": "Sin publicaciones", + "account.featured.new_collection": "Nueva colección", "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar impulsos", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ir al perfil", "account.hide_reblogs": "Ocultar impulsos de @{name}", "account.in_memoriam": "Cuenta conmemorativa.", + "account.join_modal.day": "Día", + "account.join_modal.me": "Te uniste a {server} el", + "account.join_modal.me_anniversary": "¡Feliz Fediversario! Te uniste a {server} el", + "account.join_modal.me_today": "¡Es tu primer día en {server}!", + "account.join_modal.other": "{name} se unió a {server} el", + "account.join_modal.other_today": "¡Es el primer día de {name} en {server}!", + "account.join_modal.share.celebrate": "Compartir una publicación para celebrarlo", + "account.join_modal.share.intro": "Compartir una publicación de presentación", + "account.join_modal.share.welcome": "Compartir una publicación de bienvenida", + "account.join_modal.years": "{number, plural, one {año} other {# años}}", "account.joined_short": "Se unió", "account.languages": "Cambiar idiomas suscritos", + "account.last_active": "Última actividad", "account.link_verified_on": "La propiedad de este enlace fue verificada el {date}", "account.locked_info": "El estado de privacidad de esta cuenta está configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.", "account.media": "Multimedia", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Silenciar notificaciones", "account.mute_short": "Silenciar", "account.muted": "Silenciado", - "account.muting": "Silenciando", "account.mutual": "Os seguís mutuamente", + "account.name.copy": "Copiar alias", "account.name.help.domain": "{domain} es el servidor que alberga el perfil y las publicaciones del usuario.", "account.name.help.domain_self": "{domain} es tu servidor que aloja tu perfil y publicaciones.", - "account.name.help.footer": "Al igual que puedes enviar correos electrónicos a personas usando diferentes clientes de correo electrónico, puedes interactuar con personas en otros servidores de Mastodon – y con personas en otras aplicaciones sociales que hablen el mismo idioma que Mastodon (el protocolo ActivityPub).", + "account.name.help.footer": "De la misma manera que puedes enviar correos electrónicos a personas usando diferentes proveedores de correo electrónico, puedes interactuar con personas en otros servidores de Mastodon, y con cualquiera en otras aplicaciones sociales compatibles con Mastodon.", "account.name.help.header": "Un alias es como una dirección de correo electrónico", "account.name.help.username": "{username} es el nombre de usuario de esta cuenta en su servidor. Alguien en otro servidor puede tener el mismo nombre de usuario.", "account.name.help.username_self": "{username} es tu nombre de usuario en este servidor. Alguien en otro servidor puede tener el mismo nombre de usuario.", @@ -122,11 +129,9 @@ "account.note.title": "Nota personal (visible solo para ti)", "account.open_original_page": "Abrir página original", "account.posts": "Publicaciones", - "account.posts_with_replies": "Publicaciones y respuestas", "account.remove_from_followers": "Eliminar {name} de tus seguidores", "account.report": "Reportar a @{name}", "account.requested_follow": "{name} ha solicitado seguirte", - "account.requests_to_follow_you": "Solicita 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}}", @@ -141,34 +146,42 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications_short": "Dejar de silenciar notificaciones", "account.unmute_short": "Dejar de silenciar", + "account_edit.advanced_settings.bot_hint": "Señalar a los demás que la cuenta realiza principalmente acciones automáticas y podría no estar monitorizada", + "account_edit.advanced_settings.bot_label": "Cuenta automatizada", + "account_edit.advanced_settings.title": "Ajustes avanzados", + "account_edit.bio.add_label": "Añadir biografía", + "account_edit.bio.edit_label": "Editar biografía", "account_edit.bio.placeholder": "Añade una breve introducción para ayudar a los demás a identificarte.", "account_edit.bio.title": "Biografía", "account_edit.bio_modal.add_title": "Añadir biografía", "account_edit.bio_modal.edit_title": "Editar biografía", - "account_edit.button.add": "Añadir {item}", - "account_edit.button.delete": "Eliminar {item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Hecho", "account_edit.column_title": "Editar perfil", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Añadir campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Añade tus pronombres, enlaces externos o cualquier otra cosa que quieras compartir.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Puedes añadir credibilidad fácilmente a tu cuenta de Mastodon verificando los enlaces a tus propias webs.", "account_edit.custom_fields.tip_title": "Consejo: Añade enlaces verificados", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "¿Cómo añado un enlace verificado?", + "account_edit.display_name.add_label": "Añadir nombre para mostrar", + "account_edit.display_name.edit_label": "Editar nombre para mostrar", "account_edit.display_name.placeholder": "Tu nombre de usuario es el nombre que aparece en tu perfil y en las cronologías.", "account_edit.display_name.title": "Nombre para mostrar", - "account_edit.featured_hashtags.item": "etiquetas", + "account_edit.featured_hashtags.edit_label": "Añadir etiquetas", "account_edit.featured_hashtags.placeholder": "Ayuda a otros a identificar tus temas favoritos y a acceder rápidamente a ellos.", "account_edit.featured_hashtags.title": "Etiquetas destacadas", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "¿Estás seguro de que quieres borrar este campo personalizado? La acción no se puede deshacer.", "account_edit.field_delete_modal.delete_button": "Borrar", "account_edit.field_delete_modal.title": "¿Borrar campo personalizado?", "account_edit.field_edit_modal.add_title": "Añadir campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Tienes cambios no guardados. ¿Seguro que quieres descartarlos?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", - "account_edit.field_edit_modal.limit_header": "Se ha sobrepasado el límite de caracteres recomendado", - "account_edit.field_edit_modal.limit_message": "Los usuarios de móviles no verán tu campo entero.", + "account_edit.field_edit_modal.length_warning": "Se ha superado el límite recomendado de caracteres. Es posible que los usuarios en dispositivos móviles no vean el campo completo.", "account_edit.field_edit_modal.link_emoji_warning": "Recomendamos no usar emojis personalizados combinados con enlaces. Los campos personalizados que contengan ambos solo se mostrarán como texto en vez de un enlace, para evitar confusiones.", "account_edit.field_edit_modal.name_hint": "Ej. \"Web personal\"", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -197,6 +210,8 @@ "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", "account_edit.image_edit.remove_button": "Quitar imagen", "account_edit.image_edit.replace_button": "Sustituir imagen", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Añadir nombre para mostrar", "account_edit.name_modal.edit_title": "Editar nombre para mostrar", "account_edit.profile_tab.button_label": "Personalizar", @@ -208,8 +223,6 @@ "account_edit.profile_tab.show_media.title": "Mostrar pestaña «Multimedia»", "account_edit.profile_tab.show_media_replies.description": "Cuando está activado, la pestaña Multimedia muestra tanto tus publicaciones como tus respuestas a las publicaciones de otras personas.", "account_edit.profile_tab.show_media_replies.title": "Incluir respuestas en la pestaña «Multimedia»", - "account_edit.profile_tab.subtitle": "Personaliza las pestañas de tu perfil y lo que muestran.", - "account_edit.profile_tab.title": "Configuración de la pestaña de perfil", "account_edit.save": "Guardar", "account_edit.upload_modal.back": "Atrás", "account_edit.upload_modal.done": "Hecho", @@ -219,8 +232,10 @@ "account_edit.upload_modal.step_upload.dragging": "Suelta para subir", "account_edit.upload_modal.step_upload.header": "Elige una imagen", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, hasta {limit}MB.{br}La imagen será escalada a {width}x{height}px.", - "account_edit.upload_modal.title_add": "Añadir foto de perfil", - "account_edit.upload_modal.title_replace": "Reemplazar foto de perfil", + "account_edit.upload_modal.title_add.avatar": "Añadir foto de perfil", + "account_edit.upload_modal.title_add.header": "Añadir foto de portada", + "account_edit.upload_modal.title_replace.avatar": "Reemplazar foto de perfil", + "account_edit.upload_modal.title_replace.header": "Reemplazar foto de portada", "account_edit.verified_modal.details": "Añade credibilidad a tu perfil de Mastodon verificando enlaces a tus webs personales. Así es como funciona:", "account_edit.verified_modal.invisible_link.details": "Añade el enlace en el encabezado. La parte importante es rel=\"me\", que evita la suplantación de identidad en webs con contenido generado por usuarios. Incluso puedes utilizar un enlace con etiqueta en el encabezado de la página en vez de {tag}, pero el HTML debe ser accesible sin ejecutar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "¿Cómo puedo hacer el enlace invisible?", @@ -229,11 +244,13 @@ "account_edit.verified_modal.step2.header": "Añade tu web como un campo personalizado", "account_edit.verified_modal.title": "Cómo añadir un enlace verificado", "account_edit_tags.add_tag": "Agregar #{tagName}", - "account_edit_tags.column_title": "Editar etiquetas destacadas", + "account_edit_tags.column_title": "Editar Etiquetas", "account_edit_tags.help_text": "Las etiquetas destacadas ayudan a los usuarios a descubrir e interactuar con tu perfil. Aparecen como filtros en la vista de actividad de tu página de perfil.", + "account_edit_tags.max_tags_reached": "Has alcanzado el número máximo de etiquetas destacadas.", "account_edit_tags.search_placeholder": "Introduce una etiqueta…", "account_edit_tags.suggestions": "Sugerencias:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicación} other {# publicaciones}}", + "account_list.total": "{total, plural, one {# cuenta} other {# cuentas}}", "account_note.placeholder": "Haz clic para añadir nota", "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro", "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro", @@ -338,7 +355,7 @@ "closed_registrations_modal.find_another_server": "Buscar otro servidor", "closed_registrations_modal.preamble": "Mastodon es descentralizado, por lo que no importa dónde crees tu cuenta, podrás seguir e interactuar con cualquier persona en este servidor. ¡Incluso puedes alojarlo tú mismo!", "closed_registrations_modal.title": "Registrarse en Mastodon", - "collection.share_modal.share_link_label": "Enlace para compartir", + "collection.share_modal.share_link_label": "Compartir enlace", "collection.share_modal.share_via_post": "Publicar en Mastodon", "collection.share_modal.share_via_system": "Compartir con…", "collection.share_modal.title": "Compartir la colección", @@ -346,55 +363,64 @@ "collection.share_template_other": "Echa un vistazo a esta fantástica colección: {link}", "collection.share_template_own": "Echa un vistazo a mi nueva colección: {link}", "collections.account_count": "{count, plural, one {# cuenta} other {# cuentas}}", - "collections.accounts.empty_description": "Añade hasta {count} cuentas que sigas", + "collections.accounts.empty_description": "Añade hasta {count} cuentas", + "collections.accounts.empty_editor_title": "No hay nadie en esta colección todavía", "collections.accounts.empty_title": "Esta colección está vacía", + "collections.block_collection_owner": "Bloquear cuenta", + "collections.by_account": "de {account_handle}", "collections.collection_description": "Descripción", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Ninguno", "collections.collection_name": "Nombre", "collections.collection_topic": "Tema", "collections.confirm_account_removal": "¿Estás seguro de que quieres eliminar esta cuenta de la colección?", "collections.content_warning": "Advertencia de contenido", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Solo pueden añadirse cuentas que sigues y que han activado el descubrimiento.", + "collections.copy_link": "Copiar enlace", + "collections.copy_link_confirmation": "Enlace a la colección copiado al portapapeles", "collections.create.accounts_title": "¿A quién vas a destacar en esta colección?", "collections.create.basic_details_title": "Datos básicos", "collections.create.steps": "Paso {step}/{total}", - "collections.create_a_collection_hint": "Crea una colección para recomendar o compartir tus cuentas favoritas con otros.", "collections.create_collection": "Crear colección", "collections.delete_collection": "Eliminar colección", "collections.description_length_hint": "Limitado a 100 caracteres", - "collections.detail.accept_inclusion": "De acuerdo", - "collections.detail.accounts_heading": "Cuentas", - "collections.detail.author_added_you": "{author} te añadió a esta colección", - "collections.detail.curated_by_author": "Seleccionado por {author}", - "collections.detail.curated_by_you": "Seleccionado por ti", + "collections.detail.author_added_you_on_date": "{author} te agregó el {date}", "collections.detail.loading": "Cargando colección…", - "collections.detail.other_accounts_in_collection": "Otros en esta colección:", "collections.detail.revoke_inclusion": "Sácame de aquí", + "collections.detail.sensitive_content": "Contenido sensible", "collections.detail.sensitive_note": "Esta colección contiene cuentas y contenido que puede ser sensible para algunos usuarios.", "collections.detail.share": "Compartir esta colección", + "collections.detail.you_are_in_this_collection": "Apareces en esta colección", "collections.edit_details": "Editar detalles", - "collections.error_loading_collections": "Se ha producido un error al intentar cargar tus colecciones.", - "collections.hints.accounts_counter": "{count} / {max} cuentas", + "collections.hidden_accounts_description": "Has bloqueado o silenciado {count, plural,one {a este usuario}other {a estos usuarios}}", + "collections.hidden_accounts_link": "{count, plural, one {# cuenta oculta} other {# cuentas ocultas}}", + "collections.hints.accounts_counter": "{count}/{max} cuentas", "collections.last_updated_at": "Última actualización: {date}", "collections.manage_accounts": "Administrar cuentas", "collections.mark_as_sensitive": "Marcar como sensible", "collections.mark_as_sensitive_hint": "Oculta la descripción de la colección y las cuentas detrás de una advertencia de contenido. El nombre de la colección seguirá siendo visible.", + "collections.maximum_collection_count_description": "Tu servidor permite la creación de hasta {count} colecciones.", + "collections.maximum_collection_count_reached": "Has creado el número máximo de colecciones", "collections.name_length_hint": "Límite de 40 caracteres", "collections.new_collection": "Nueva colección", - "collections.no_collections_yet": "Aún no hay colecciones.", - "collections.old_last_post_note": "Última publicación hace más de una semana", - "collections.remove_account": "Quitar esta cuenta", + "collections.remove_account": "Eliminar", "collections.report_collection": "Informar de esta colección", "collections.revoke_collection_inclusion": "Sácame de esta colección", "collections.revoke_inclusion.confirmation": "Has salido de \"{collection}\"", "collections.revoke_inclusion.error": "Se ha producido un error, inténtalo de nuevo más tarde.", - "collections.search_accounts_label": "Buscar cuentas para añadir…", + "collections.search_accounts_label": "Buscar una cuenta para añadir", "collections.search_accounts_max_reached": "Has añadido el número máximo de cuentas", "collections.sensitive": "Sensible", + "collections.share_short": "Compartir", + "collections.suggestions.can_not_add": "No puede ser añadida", + "collections.suggestions.can_not_add_desc": "Estas cuentas pueden haber optado por no ser descubiertas, o podrían estar en un servidor que no soporta colecciones.", + "collections.suggestions.must_follow": "Primero tienes que seguirla", + "collections.suggestions.must_follow_desc": "Estas cuentas revisan todas las solicitudes de seguimiento. Los seguidores pueden añadirlas a colecciones.", "collections.topic_hint": "Añadir una etiqueta que ayude a otros a entender el tema principal de esta colección.", "collections.topic_special_chars_hint": "Los caracteres especiales se eliminarán al guardar", + "collections.unlisted_collections_description": "No aparecen en tu perfil. Cualquiera que tenga un enlace puede descubrirlas.", + "collections.unlisted_collections_with_count": "Colecciones no listadas ({count})", "collections.view_collection": "Ver colección", - "collections.view_other_collections_by_user": "Ver otras colecciones de este usuario", "collections.visibility_public": "Pública", "collections.visibility_public_hint": "Puede mostrarse en los resultados de búsqueda y en otros lugares donde aparezcan recomendaciones.", "collections.visibility_title": "Visibilidad", @@ -403,7 +429,6 @@ "column.about": "Acerca de", "column.blocks": "Usuarios bloqueados", "column.bookmarks": "Marcadores", - "column.collections": "Mis colecciones", "column.community": "Cronología local", "column.create_list": "Crear lista", "column.direct": "Menciones privadas", @@ -420,6 +445,7 @@ "column.lists": "Listas", "column.mutes": "Usuarios silenciados", "column.notifications": "Notificaciones", + "column.other_collections": "Colecciones de {name}", "column.pins": "Publicaciones fijadas", "column.public": "Cronología federada", "column_back_button.label": "Atrás", @@ -483,12 +509,13 @@ "confirmations.discard_draft.post.title": "¿Descartar tu borrador?", "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.follow_to_collection.confirm": "Seguir y añadir a la colección", - "confirmations.follow_to_collection.message": "Debes seguir a {name} para añadirlo a una colección.", - "confirmations.follow_to_collection.title": "¿Seguir cuenta?", "confirmations.follow_to_list.confirm": "Seguir y añadir a la lista", "confirmations.follow_to_list.message": "Necesitas seguir a {name} para agregarlo a una lista.", "confirmations.follow_to_list.title": "¿Seguir usuario?", + "confirmations.hide_featured_tab.confirm": "Ocultar pestaña", + "confirmations.hide_featured_tab.intro": "Puedes cambiar esto en cualquier momento en Editar perfil > Configuración de pestañas del perfil.", + "confirmations.hide_featured_tab.message": "Esto esconderá la pestaña a los usuarios en {serverName} y otros servidores con la última versión de Mastodon. En otros lugares, puede variar.", + "confirmations.hide_featured_tab.title": "¿Ocultar la pestaña \"Destacado\"?", "confirmations.logout.confirm": "Cerrar sesión", "confirmations.logout.message": "¿Seguro que quieres cerrar la sesión?", "confirmations.logout.title": "¿Cerrar sesión?", @@ -527,6 +554,7 @@ "content_warning.hide": "Ocultar publicación", "content_warning.show": "Mostrar de todos modos", "content_warning.show_more": "Mostrar más", + "content_warning.show_short": "Mostrar", "conversation.delete": "Borrar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", @@ -567,6 +595,14 @@ "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", "dropdown.empty": "Selecciona una opción", + "email_subscriptions.email": "Correo electrónico", + "email_subscriptions.form.action": "Suscribirse", + "email_subscriptions.form.bottom": "Recibe publicaciones en tu bandeja de entrada sin crear una cuenta de Mastodon. Puedes darte de baja en cualquier momento. Para obtener más información, consulta la Política de Privacidad.", + "email_subscriptions.form.title": "Suscríbete para recibir actualizaciones por correo electrónico de {name}", + "email_subscriptions.submitted.lead": "Revisa tu bandeja de entrada para terminar de suscribirte y recibir actualizaciones por correo electrónico.", + "email_subscriptions.submitted.title": "Un paso más", + "email_subscriptions.validation.email.blocked": "Proveedor de correo bloqueado", + "email_subscriptions.validation.email.invalid": "Dirección de correo electrónico no válida", "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -584,9 +620,14 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", - "empty_column.account_featured.other": "{acct} aún no ha destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", - "empty_column.account_featured_other.unknown": "Esta cuenta aún no ha destacado nada.", + "empty_column.account_featured.other": "{acct} aún no ha destacado nada.", + "empty_column.account_featured_self.no_collections_button": "Crear una colección", + "empty_column.account_featured_self.no_collections_hide_tab": "Ocultar esta pestaña", + "empty_column.account_featured_self.pre_collections": "No te pierdas las Colecciones", + "empty_column.account_featured_self.pre_collections_desc": "Las colecciones (disponibles a partir de Mastodon 4.6) te permiten crear tus propias listas de cuentas seleccionadas para recomendarlas a otros.", + "empty_column.account_featured_self.showcase_accounts": "Muestra tus cuentas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "Las colecciones son listas de cuentas seleccionadas para ayudar a otros a descubrir más del Fediverso.", + "empty_column.account_featured_unknown.other": "Esta cuenta no ha destacado nada todavía.", "empty_column.account_hides_collections": "Este usuario ha decidido no mostrar esta información", "empty_column.account_suspended": "Cuenta suspendida", "empty_column.account_timeline": "¡No hay publicaciones aquí!", @@ -603,7 +644,7 @@ "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.", "empty_column.followed_tags": "No has seguido ninguna etiqueta todavía. Cuando lo hagas, se mostrarán aquí.", "empty_column.hashtag": "No hay nada en esta etiqueta todavía.", - "empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla.", + "empty_column.home": "¡Tu cronología principal está vacía! Sigue a más personas para rellenarla.", "empty_column.list": "Aún no hay nada en esta lista. Cuando los miembros de esta lista publiquen nuevos estados, estos aparecerán aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", @@ -672,7 +713,9 @@ "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", "followers.hide_other_followers": "Este usuario ha elegido no hacer visible sus otros seguidores", + "followers.title": "Siguiendo a {name}", "following.hide_other_following": "Este usuario ha elegido no hacer visible a quién más sigue", + "following.title": "Seguido por {name}", "footer.about": "Acerca de", "footer.about_mastodon": "Acerca de Mastodon", "footer.about_server": "Acerca de {domain}", @@ -684,6 +727,7 @@ "footer.source_code": "Ver código fuente", "footer.status": "Estado", "footer.terms_of_service": "Términos del servicio", + "form_error.blank": "El campo no puede estar vacío.", "form_field.optional": "(opcional)", "generic.saved": "Guardado", "getting_started.heading": "Primeros pasos", @@ -867,6 +911,7 @@ "navigation_panel.expand_followed_tags": "Expandir menú de etiquetas seguidas", "navigation_panel.expand_lists": "Expandir menú de lista", "not_signed_in_indicator.not_signed_in": "Necesitas iniciar sesión para acceder a este recurso.", + "notification.added_to_collection": "{name} te añadió a una colección", "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}", @@ -876,6 +921,7 @@ "notification.admin.sign_up.name_and_others": "{name} y {count, plural, one {# más} other {# más}} se registraron", "notification.annual_report.message": "¡Tu #Wrapstodon {year} te espera! ¡Desvela los momentos más destacados y memorables de tu año en Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editó una colección en la que estás", "notification.favourite": "{name} marcó como favorita tu publicación", "notification.favourite.name_and_others_with_link": "{name} y {count, plural, one {# más} other {# más}} marcaron tu publicación como favorita", "notification.favourite_pm": "{name} ha marcado como favorita tu mención privada", @@ -1139,6 +1185,7 @@ "server_banner.active_users": "usuarios activos", "server_banner.administered_by": "Administrado por:", "server_banner.is_one_of_many": "{domain} es uno de los varios servidores independientes de Mastodon que puedes usar para participar en el fediverso.", + "server_banner.more_about_this_server": "Más información acerca de este servidor", "server_banner.server_stats": "Estadísticas del servidor:", "sign_in_banner.create_account": "Crear cuenta", "sign_in_banner.follow_anyone": "Sigue a cualquier persona en el fediverso y velo todo en orden cronológico. Sin algoritmos, sin anuncios o titulares engañosos.", @@ -1241,7 +1288,7 @@ "status.uncached_media_warning": "Vista previa no disponible", "status.unmute_conversation": "Dejar de silenciar conversación", "status.unpin": "Dejar de fijar", - "subscribed_languages.lead": "Sólo los mensajes en los idiomas seleccionados aparecerán en su inicio y otras líneas de tiempo después del cambio. Seleccione ninguno para recibir mensajes en todos los idiomas.", + "subscribed_languages.lead": "Después del cambio, solo los mensajes en los idiomas seleccionados aparecerán en tu cronología principal y listas. Selecciona ninguno para recibir mensajes en todos los idiomas.", "subscribed_languages.save": "Guardar cambios", "subscribed_languages.target": "Cambiar idiomas suscritos para {target}", "tabs_bar.home": "Inicio", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 13ba8bd303fa6a..3ed32e176700b1 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -28,12 +28,10 @@ "account.block_domain": "Blokeeri kõik domeenist {domain}", "account.block_short": "Blokeeri", "account.blocked": "Blokeeritud", - "account.blocking": "Blokeeritud kasutaja", "account.cancel_follow_request": "Võta jälgimissoov tagasi", "account.copy": "Kopeeri profiili link", "account.direct": "Maini privaatselt kasutajat @{name}", "account.disable_notifications": "Ära teavita, kui @{name} postitab", - "account.domain_blocking": "Blokeeritud domeen", "account.edit_note": "Muuda isiklikku märget", "account.edit_profile": "Muuda profiili", "account.edit_profile_short": "Muuda", @@ -44,10 +42,8 @@ "account.familiar_followers_two": "Jälgijateks {name1} ja {name2}", "account.featured": "Esiletõstetud", "account.featured.accounts": "Profiilid", - "account.featured.collections": "Kogud", - "account.featured.hashtags": "Teemaviited", - "account.featured_tags.last_status_at": "Viimane postitus: {date}", - "account.featured_tags.last_status_never": "Postitusi pole", + "account.featured.collections": "Kogumikud", + "account.featured.new_collection": "Uus kogumik", "account.field_overflow": "Näita kogu sisu", "account.filters.all": "Kõik tegevused", "account.filters.boosts_toggle": "Näita hooandmisi", @@ -71,14 +67,25 @@ "account.follows.empty": "See kasutaja ei jälgi veel mitte kedagi.", "account.follows_you": "Jälgib sind", "account.go_to_profile": "Vaata profiili", - "account.hide_reblogs": "Peida @{name} jagamised", + "account.hide_reblogs": "Peida kasutaja @{name} hooandmised", "account.in_memoriam": "In Memoriam.", + "account.join_modal.day": "Päev", + "account.join_modal.me": "Ühinesid {server} serveriga aadressil", + "account.join_modal.me_anniversary": "Sinu tähtpäev Födiversumis! Ühinesid {server} serveriga aadressil", + "account.join_modal.me_today": "See on sinu esimene päev {server} serveris!", + "account.join_modal.other": "{name} liitus {server} severiga", + "account.join_modal.other_today": "Kasutajale {name} on see esimene päev serveris {server}!", + "account.join_modal.share.celebrate": "Koosta postitus, mis selle ära märgib", + "account.join_modal.share.intro": "Koosta sissejuhatav postitus", + "account.join_modal.share.welcome": "Koosta tervituspostitus", + "account.join_modal.years": "{number, plural, one {aasta} other {aastat}}", "account.joined_short": "Liitus", "account.languages": "Muuda tellitud keeli", - "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}", - "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab käsitsi üle, kes teda jälgida saab.", + "account.last_active": "Viimati aktiivne", + "account.link_verified_on": "Selle lingi autorsus on kontrollitud {date}", + "account.locked_info": "Selle konto privaatsusolek on „lukustatud“. Omanik vaatab üle, kes teda jälgida saab.", "account.media": "Meedium", - "account.mention": "Maini @{name}", + "account.mention": "Maini kasutajat @{name}", "account.menu.add_to_list": "Lisa loendisse…", "account.menu.block": "Blokeeri kasutajakonto", "account.menu.block_domain": "Blokeeri {domain}", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Summuta teavitused", "account.mute_short": "Summuta", "account.muted": "Summutatud", - "account.muting": "Summutatud konto", "account.mutual": "Te jälgite teineteist", + "account.name.copy": "Kopeeri kasutajatunnus", "account.name.help.domain": "{domain} on server, kus antud konto koos profiiliga asub ning kust postitused saavad alguse.", "account.name.help.domain_self": "{domain} on server, kus sinu konto koos profiiliga asub ning kust sinu postitused saavad alguse.", - "account.name.help.footer": "Nii nagu võid saata teiste e-posti serverite kasutajatele e-kirju, saad ka suhelda teiste Mastodoni serverite kasutajatega - ja tegelikult ka muude sotsiaalvõrkude kasutajatega, kus on kasutusel sama lahendus, nagu Mastodon pruugib (ActivityPubi protokoll).", + "account.name.help.footer": "Nii nagu saad saata e-kirju inimestele, kes kasutavad erinevaid e-posti teenusepakkujaid, saad suhelda ka teiste Mastodoni serverite kasutajatega ning kõigi teiste kasutajatega, kelle sotsiaalrakendused ühilduvad Mastodoniga.", "account.name.help.header": "Kasutajatunnus on nagu e-posti aadress", "account.name.help.username": "{username} on selle konto kasutajanimi tema serveris. Kellelgi teisel mõnes muus serveris võib olla sama kasutajanimi.", "account.name.help.username_self": "{username} on sinu kasutajanimi selles serveris. Kellelgi teisel mõnes muus serveris võib olla sama kasutajanimi.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Muuda", "account.note.title": "Isiklikud märked (nähtavad vaid sulle)", "account.open_original_page": "Ava algne leht", + "account.pending": "Ootel", "account.posts": "Postitused", - "account.posts_with_replies": "Postitused ja vastused", "account.remove_from_followers": "Eemalda {name} jälgijate seast", "account.report": "Teata kasutajast {name}", "account.requested_follow": "{name} on soovinud sinu jälgimist", - "account.requests_to_follow_you": "soovib sind jälgida", "account.share": "Jaga @{name} profiili", "account.show_reblogs": "Näita @{name} jagamisi", "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", @@ -141,6 +147,111 @@ "account.unmute": "Lõpeta {name} kasutaja summutamine", "account.unmute_notifications_short": "Lõpeta teavituste summutamine", "account.unmute_short": "Lõpeta summutamine", + "account_edit.advanced_settings.bot_hint": "Teavita teisi, et sel kontol tehakse peamiselt automatiseeritud toiminguid ja seda ei pruugita jälgida", + "account_edit.advanced_settings.bot_label": "Automatiseeritud kasutajakonto", + "account_edit.advanced_settings.title": "Täpsemad seadistused", + "account_edit.bio.add_label": "Lisa elulugu", + "account_edit.bio.edit_label": "Muuda elulugu", + "account_edit.bio.placeholder": "Lisa lühike tutvustus, et aidata teistel sinust pilti luua.", + "account_edit.bio.title": "Elulugu", + "account_edit.bio_modal.add_title": "Lisa elulugu", + "account_edit.bio_modal.edit_title": "Muuda elulugu", + "account_edit.column_button": "Valmis", + "account_edit.column_title": "Muuda profiili", + "account_edit.custom_fields.add_label": "Lisa väli", + "account_edit.custom_fields.edit_label": "Muuda välja", + "account_edit.custom_fields.placeholder": "Lisa oma asesõnad, välislingid või mistahes muu, mida soovid jagada.", + "account_edit.custom_fields.reorder_button": "Järjesta välju ümber", + "account_edit.custom_fields.tip_content": "Saad Mastodoni konto usaldusväärsust hõlpsasti suurendada, kinnitades lingid lehtedele, mis sulle kuuluvad.", + "account_edit.custom_fields.tip_title": "Soovitus: Kinnitatud linkide lisamine", + "account_edit.custom_fields.title": "Kohandatud väljad", + "account_edit.custom_fields.verified_hint": "Kuidas lisada kinnitatud linki?", + "account_edit.display_name.add_label": "Lisa kuvatav nimi", + "account_edit.display_name.edit_label": "Muuda kuvatavat nime", + "account_edit.display_name.placeholder": "Kuvatav nimi määrab, kuidas sinu nimi on näha sinu profiilis ja ajajoontel.", + "account_edit.display_name.title": "Kuvatav nimi", + "account_edit.featured_hashtags.edit_label": "Lisa teemaviiteid", + "account_edit.featured_hashtags.placeholder": "Aita teistel leida su lemmikteemasid ja neile kiiresti juurde pääseda.", + "account_edit.featured_hashtags.title": "Esiletõstetud teemaviited", + "account_edit.field_actions.delete": "Kustuta väli", + "account_edit.field_actions.edit": "Muuda välja", + "account_edit.field_delete_modal.confirm": "Kas oled kindel, et soovid selle kohandatud välja kustutada? Seda toimingut ei saa tagasi võtta.", + "account_edit.field_delete_modal.delete_button": "Kustuta", + "account_edit.field_delete_modal.title": "Kas kustutame kohandatud välja?", + "account_edit.field_edit_modal.add_title": "Lisa kohandatud väli", + "account_edit.field_edit_modal.discard_confirm": "Loobu", + "account_edit.field_edit_modal.discard_message": "Sul on salvestamata muudatusi. Kas soovid tõesti neist loobuda?", + "account_edit.field_edit_modal.edit_title": "Muuda kohandatud välja", + "account_edit.field_edit_modal.length_warning": "Soovitatud tähemärkide piir on ületatud. Mobiilikasutajad ei pruugi seda välja tervikuna näha.", + "account_edit.field_edit_modal.link_emoji_warning": "Soovitame vältida kohandatud emojide kasutamist koos võrguaadressidega. Mõlemat sisaldavad kohandatud väljad kuvatakse segaduse vältimiseks ainult tekstina, mitte lingina.", + "account_edit.field_edit_modal.name_hint": "Näit. \"Isiklik veebileht\"", + "account_edit.field_edit_modal.name_label": "Silt", + "account_edit.field_edit_modal.url_warning": "Lingi lisamisel lisa palun algusesse {protocol}.", + "account_edit.field_edit_modal.value_hint": "Näit. \"https://naiteks.me\"", + "account_edit.field_edit_modal.value_label": "Väärtus", + "account_edit.field_reorder_modal.drag_cancel": "Lohistamine tühistati. „{item}“ väli on eemaldatud.", + "account_edit.field_reorder_modal.drag_end": "„{item}“ väli eemaldati.", + "account_edit.field_reorder_modal.drag_instructions": "Kohandatud väljade järjestuse muutmiseks vajuta tühikut või sisestusklahvi. Lohistamise ajal kasuta nooleklahve, et liigutada välja üles või alla. Vajuta uuesti tühikut või sisestusklahvi, et paigutada väli uuele kohale, või tühistamiseks vajuta Esc-klahvi.", + "account_edit.field_reorder_modal.drag_move": "„{item}“ väli on teisaldatud.", + "account_edit.field_reorder_modal.drag_over": "„{item}“ väli teisaldati „{over}“ välja kohale.", + "account_edit.field_reorder_modal.drag_start": "Valisid „{item}“ välja.", + "account_edit.field_reorder_modal.handle_label": "Lohistad „{item}“ välja", + "account_edit.field_reorder_modal.title": "Väljade järjestuse muutmine", + "account_edit.image_alt_modal.add_title": "Lisa selgitustekst", + "account_edit.image_alt_modal.details_content": "TEE NII:
    • Kirjelda end pildil olevana
    • Kasuta kolmandat isikut (nt „Alex“ mitte „mina“)
    • Ole lakooniline – paar sõna on sageli piisav
    ÄRA TEE NII:
    • Ära alusta sõnadega „Foto“ – see on ekraanilugeja kasutajale üleliigne
    NÄIDE:
    • „Alex, kes kannab rohelist särki ja prille“
    ", + "account_edit.image_alt_modal.details_title": "Soovitus: Selgitustekst profiili fotode jaoks", + "account_edit.image_alt_modal.edit_title": "Muuda selgitusteksti", + "account_edit.image_alt_modal.text_hint": "Selgitustekst aitab ekraanilugeja kasutajatel sinu sisu mõista.", + "account_edit.image_alt_modal.text_label": "Selgitustekst", + "account_edit.image_delete_modal.confirm": "Kas oled kindel, et soovid selle pildi kustutada? Seda toimingut ei saa tagasi võtta.", + "account_edit.image_delete_modal.delete_button": "Kustuta", + "account_edit.image_delete_modal.title": "Kas kustutad pildi?", + "account_edit.image_edit.add_button": "Lisa pilt", + "account_edit.image_edit.alt_add_button": "Lisa selgitustekst", + "account_edit.image_edit.alt_edit_button": "Muuda selgitusteksti", + "account_edit.image_edit.remove_button": "Eemalda pilt", + "account_edit.image_edit.replace_button": "Asenda pilt", + "account_edit.item_list.delete": "Kustuta {name}", + "account_edit.item_list.edit": "Muuda {name}", + "account_edit.name_modal.add_title": "Lisa kuvatav nimi", + "account_edit.name_modal.edit_title": "Muuda kuvatavat nime", + "account_edit.profile_tab.button_label": "Kohanda", + "account_edit.profile_tab.hint.description": "Need seaded määravad, mida kasutajad näevad {server} ametlikes rakendustes, kuid ei pruugi kehtida teiste serverite kasutajate ja kolmandate osapoolte rakenduste puhul.", + "account_edit.profile_tab.hint.title": "Näitamine siiski erinev", + "account_edit.profile_tab.show_featured.description": "„Esiletõstetud“ on valikuline vahekaart, kus saad näidata teisi kontosid.", + "account_edit.profile_tab.show_featured.title": "Näita vahekaarti „Esiletõstetud“", + "account_edit.profile_tab.show_media.description": "„Meedium“ on valikuline vahekaart, mis näitab sinu piltide või videotega postitusi.", + "account_edit.profile_tab.show_media.title": "Näita multimeedia vahekaarti", + "account_edit.profile_tab.show_media_replies.description": "Sisselülitatuna näitab mediumi vahekaart, nii sinu postitusi kui su vastuseid teiste kasutajate postitustele.", + "account_edit.profile_tab.show_media_replies.title": "Kaasa vahekaardile „Meedium“ ka vastused", + "account_edit.save": "Salvesta", + "account_edit.upload_modal.back": "Tagasi", + "account_edit.upload_modal.done": "Valmis", + "account_edit.upload_modal.next": "Edasi", + "account_edit.upload_modal.step_crop.zoom": "Suum", + "account_edit.upload_modal.step_upload.button": "Sirvi faile", + "account_edit.upload_modal.step_upload.dragging": "Sisu üleslaadimiseks lohista ta siia", + "account_edit.upload_modal.step_upload.header": "Vali pilt", + "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- või JPG-vormingus, maksimaalselt {limit} MB.{br}Pilt skaleeritakse mõõtmeteni {width}x{height} pikselit.", + "account_edit.upload_modal.title_add.avatar": "Lisa profiilipilt", + "account_edit.upload_modal.title_add.header": "Lisa kaanepilt", + "account_edit.upload_modal.title_replace.avatar": "Profiilipildi vahetamine", + "account_edit.upload_modal.title_replace.header": "Kaanepildi vahetamine", + "account_edit.verified_modal.details": "Paranda oma Mastodoni profiili usaldusväärsust, kinnitades isiklike veebisaitide lingid. See toimib järgmiselt:", + "account_edit.verified_modal.invisible_link.details": "Lisa link oma saidi päisesse. Oluline on atribuut rel=\"me\", mis takistab identiteedivargust kasutajate loodud sisuga veebisaitides. Lehe päises võid {tag} elemendi asemel kasutada isegi silti link, kuid HTML peab olema kättesaadav ka ilma JavaScripti käivitamiseta.", + "account_edit.verified_modal.invisible_link.summary": "Kuidas ma muudan lingi nähtamatuks?", + "account_edit.verified_modal.step1.header": "Kopeeri allpool olev HTML-kood ja aseta oma veebisaidi päisesse", + "account_edit.verified_modal.step2.details": "Kui oled oma veebisaidi kohandatud väljana juba lisanud, pead kinnitamise käivitamiseks selle kustutama ja uuesti lisama.", + "account_edit.verified_modal.step2.header": "Lisa oma veebisait kohandatud väljana", + "account_edit.verified_modal.title": "Kuidas toimib kinnitatud lingi lisamine", + "account_edit_tags.add_tag": "Lisa #{tagName}", + "account_edit_tags.column_title": "Muuda silte", + "account_edit_tags.help_text": "Esiletõstetud teemaviited aitavad kasutajatel sinu profiili leida ja sellega suhestuda. Need kuvatakse filtritena sinu profiili lehe tegevuste vaates.", + "account_edit_tags.max_tags_reached": "Oled jõudnud esiletõstetud teemaviidete maksimumarvuni.", + "account_edit_tags.search_placeholder": "Sisesta teemaviide…", + "account_edit_tags.suggestions": "Soovitused:", + "account_edit_tags.tag_status_count": "{count, plural, one {# postitus} other {# postitust}}", + "account_list.total": "{total, plural, one {# konto} other {# kontot}}", "account_note.placeholder": "Klõpsa märke lisamiseks", "admin.dashboard.daily_retention": "Kasutajate päevane allesjäämine peale registreerumist", "admin.dashboard.monthly_retention": "Kasutajate kuine allesjäämine peale registreerumist", @@ -183,14 +294,14 @@ "annual_report.summary.archetype.oracle.desc_public": "{name} lõi rohkem uusi postitusi kui vastuseid, hoides Mastodoni värskena ja tulevikku suunatuna.", "annual_report.summary.archetype.oracle.desc_self": "Sa lõid rohkem uusi postitusi kui vastuseid, hoides Mastodoni värskena ja tulevikku suunatuna.", "annual_report.summary.archetype.oracle.name": "Oraakel", - "annual_report.summary.archetype.pollster.desc_public": "{name} lõi rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.", - "annual_report.summary.archetype.pollster.desc_self": "Sa lõid rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.", + "annual_report.summary.archetype.pollster.desc_public": "{name} koostas rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.", + "annual_report.summary.archetype.pollster.desc_self": "Sa koostasid rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.", "annual_report.summary.archetype.pollster.name": "Uudishimulik", "annual_report.summary.archetype.replier.desc_public": "{name} vastas sageli teiste inimeste postitustele, pakkudes Mastodonile uusi aruteluteemasid.", "annual_report.summary.archetype.replier.desc_self": "Sa vastasid sageli teiste inimeste postitustele, pakkudes Mastodonile uusi aruteluteemasid.", "annual_report.summary.archetype.replier.name": "Liblikas", "annual_report.summary.archetype.reveal": "Näita mu põhitüüpi", - "annual_report.summary.archetype.reveal_description": "Täname, et oled Mastodoni liige! Aeg on välja selgitada, millist põhitüüpi sa {year}. kehastasid.", + "annual_report.summary.archetype.reveal_description": "Täname, et oled tegutsed Mastodoni võrgus! Aeg on välja selgitada, millist põhitüüpi sa {year}. aastal kehastasid.", "annual_report.summary.archetype.title_public": "Kasutaja {name} põhitüüp", "annual_report.summary.archetype.title_self": "Sinu põhitüüp", "annual_report.summary.close": "Sulge", @@ -205,7 +316,7 @@ "annual_report.summary.most_used_hashtag.used_count": "Sa lisasid selle teemaviite {count, plural, one {ühele postitusele} other {#-le postitusele}}.", "annual_report.summary.most_used_hashtag.used_count_public": "{name} kasutas seda teemaviidet {count, plural, one {ühes postituses} other {#-s postituses}}.", "annual_report.summary.new_posts.new_posts": "uued postitused", - "annual_report.summary.percentile.text": "See paneb su top {domain} kasutajate hulka.", + "annual_report.summary.percentile.text": "See paneb su top {domain} serveri kasutajate hulka.", "annual_report.summary.percentile.we_wont_tell_bernie": "Vägev.", "annual_report.summary.share_elsewhere": "Jaga mujal", "annual_report.summary.share_message": "Minu arhetüüp on {archetype}!", @@ -215,12 +326,12 @@ "block_modal.remote_users_caveat": "Serverile {domain} edastatakse palve otsust järgida. Ometi pole see tagatud, kuna mõned serverid võivad blokeeringuid käsitleda omal moel. Avalikud postitused võivad tuvastamata kasutajatele endiselt näha olla.", "block_modal.show_less": "Kuva vähem", "block_modal.show_more": "Kuva rohkem", - "block_modal.they_cant_mention": "Ta ei saa mainida sind ega jälgida.", + "block_modal.they_cant_mention": "Ta ei saa sind mainida ega jälgida.", "block_modal.they_cant_see_posts": "Ta ei näe sinu postitusi ja sa ei näe tema omi.", "block_modal.they_will_know": "Ta näeb, et ta on blokeeritud.", - "block_modal.title": "Blokeeri kasutaja?", + "block_modal.title": "Kas blokeerid kasutaja?", "block_modal.you_wont_see_mentions": "Sa ei näe postitusi, mis mainivad teda.", - "boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta", + "boost_modal.combo": "Vajutades {combo}, saad selle edaspidi vahele jätta", "boost_modal.reblog": "Jagada postitust?", "boost_modal.undo_reblog": "Tühista postituse jagamine?", "bundle_column_error.copy_stacktrace": "Kopeeri veateade", @@ -238,33 +349,84 @@ "callout.dismiss": "Loobu", "carousel.current": "Slaid {current, number} / {max, number}", "carousel.slide": "Slaid {current, number} / {max, number}", + "character_counter.recommended": "{currentLength}/{maxLength} soovitatud märke", + "character_counter.required": "{currentLength}/{maxLength} märki", "closed_registrations.other_server_instructions": "Kuna Mastodon on detsentraliseeritud, võib konto teha teise serverisse ja sellegipoolest siinse kontoga suhelda.", "closed_registrations_modal.description": "Praegu ei ole võimalik teha {domain} peale kontot, aga pea meeles, et sul ei pea olema just {domain} konto, et Mastodoni kasutada.", "closed_registrations_modal.find_another_server": "Leia mõni muu server", "closed_registrations_modal.preamble": "Mastodon on hajutatud võrk, mis tähendab, et konto võid luua ükskõik kuhu, kuid ikkagi saad jälgida ja suhelda igaühega selles serveris. Võid isegi oma serveri püsti panna!", "closed_registrations_modal.title": "Mastodoni registreerumine", + "collection.share_modal.share_link_label": "Jaga linki", + "collection.share_modal.share_via_post": "Postita Mastodonis", + "collection.share_modal.share_via_system": "Jaga kohas…", + "collection.share_modal.title": "Jaga kogumikku", + "collection.share_modal.title_new": "Jaga oma ut kogumikku!", + "collection.share_template_other": "Vaata seda lahedat kogumikku: {link}", + "collection.share_template_own": "Vaata mu uut kogumikku: {link}", "collections.account_count": "{count, plural, one {# kasutajakonto} other {# kasutajakontot}}", + "collections.accounts.empty_description": "Lisa kuni {count} kontot", + "collections.accounts.empty_editor_title": "Selles kogumikus pole veel kedagi", + "collections.accounts.empty_title": "See kogumik on tühi", + "collections.block_collection_owner": "Konto blokeerimine", + "collections.by_account": "{account_handle} poolt", "collections.collection_description": "Kirjeldus", + "collections.collection_language": "Keel", + "collections.collection_language_none": "Pole", "collections.collection_name": "Nimi", "collections.collection_topic": "Teema", + "collections.confirm_account_removal": "Kas oled kindel, et soovid selle konto kogumikust eemaldada?", "collections.content_warning": "Sisuhoiatus", "collections.continue": "Jätka", - "collections.create.accounts_subtitle": "Lisada saad vaid kasutajakontosid, keda sa jälgid ja kes on sellise leiatvuse lubanud.", + "collections.copy_link": "Kopeeri link", + "collections.copy_link_confirmation": "Kogumiku link kopeeriti lõikelauale", "collections.create.accounts_title": "Kes saavad olema selles kogumikus?", "collections.create.basic_details_title": "Põhiandmed", "collections.create.steps": "Samm {step}/{total}", - "collections.create_a_collection_hint": "Soovitamaks oma lemmikuid teistele kasutajatele lisa asjakohane kogumik.", "collections.create_collection": "Loo kogumik", "collections.delete_collection": "Kustuta kogumik", "collections.description_length_hint": "Kuni 100 tähemärki", - "collections.error_loading_collections": "Sinu kogumike laadimisel tekkis viga.", + "collections.detail.author_added_you_on_date": "{author} lisas sind ajal {date}", + "collections.detail.loading": "Kogumiku laadimine…", + "collections.detail.revoke_inclusion": "Eemalda mind", + "collections.detail.sensitive_content": "Tundlik sisu", + "collections.detail.sensitive_note": "Selles kogumikus on kontosid ja sisu, mis võib mõne inimese jaoks olla tundlik.", + "collections.detail.share": "Jaga seda kogumikku", + "collections.detail.you_are_in_this_collection": "Sa oled selles kogumikus esile tõstetud", + "collections.edit_details": "Muuda üksikasju", + "collections.hidden_accounts_description": "Oled blokeerinud või vaigistanud {count, plural, one {selle kasutaja} other {need kasutajad}}", + "collections.hidden_accounts_link": "{count, plural, one {# peidetud konto} other {# peidetud kontot}}", + "collections.hints.accounts_counter": "{count}/{max} kontot", "collections.last_updated_at": "Viimati uuendatud: {date}", + "collections.list.collections_with_count": "{count, plural, one {# kogumik} other {# kogumikku}}", + "collections.list.created_by_author": "Looja: {name}", + "collections.list.created_by_you": "Sinu poolt loodud", + "collections.list.featuring_you": "Tõstab sind esile", "collections.manage_accounts": "Halda kasutajakontosid", "collections.mark_as_sensitive": "Märgi delikaatseks", "collections.mark_as_sensitive_hint": "Peidab kogumiku kirjelduse ja kontod sisuhoiatuse taha. Kogumiku nimi ise on sellele vaatamata nähtav.", + "collections.maximum_collection_count_description": "Sinu server lubab luua kuni {count} kogumikku.", + "collections.maximum_collection_count_reached": "Sa oled loonud nii palju kogumikke, kui on lubatud", + "collections.name_length_hint": "40 märgi piir", "collections.new_collection": "Uus kogumik", - "collections.no_collections_yet": "Kogumikke veel pole.", + "collections.pending_accounts.message": "Kui oled ootamst vastut kasutajalt oma serverist, võivad kasutajakontod tunduda olema ootel olekus. Vaid sina saad näha ootel kasutajakontosid.", + "collections.pending_accounts.title": "Miks ma näen ootel kasutajakontosid?", + "collections.remove_account": "Eemalda", + "collections.report_collection": "Raporteeri sellest kogumikust", + "collections.revoke_collection_inclusion": "Eemalda mind sellest kogumikust", + "collections.revoke_inclusion.confirmation": "Oled eemaldatud \"{collection}\"-st", + "collections.revoke_inclusion.error": "Oli viga, palun proovi hiljem uuesti.", + "collections.search_accounts_label": "Otsi kontot, mida lisada", + "collections.search_accounts_max_reached": "Oled lisanud maksimumarv kontosid", + "collections.sensitive": "Tundlik", + "collections.share_short": "Jaga", + "collections.suggestions.can_not_add": "Ei saa lisada", + "collections.suggestions.can_not_add_desc": "Need kontod võivad olla loobunud avalikustamisest või asuvad serveris, mis ei toeta kogumikke.", + "collections.suggestions.must_follow": "Kõigepealt peab jälgima", + "collections.suggestions.must_follow_desc": "Need kontod vaatavad kõik jälgimispalved läbi. Jälgijad saavad neid kogumikesse lisada.", "collections.topic_hint": "Lisa teemaviide, mis aitab teistel kasutajatel mõista selle kogumiku põhisisu.", + "collections.topic_special_chars_hint": "Erimärgid eemaldatakse salvestamisel", + "collections.unlisted_collections_description": "Need pole sinu profiilis teiste kasutajate jaoks nähtavad. Neid saavad vaadata kõik, kellel on link.", + "collections.unlisted_collections_with_count": "Loetlemata kogumikud ({count})", "collections.view_collection": "Vaata kogumikku", "collections.visibility_public": "Avalik", "collections.visibility_public_hint": "Leitav otsingutulemustes ja muudes kohtades, kus on näha soovitusi.", @@ -274,7 +436,6 @@ "column.about": "Teave", "column.blocks": "Blokeeritud kasutajad", "column.bookmarks": "Järjehoidjad", - "column.collections": "Minu kogumikud", "column.community": "Kohalik ajajoon", "column.create_list": "Loo loend", "column.direct": "Privaatsed mainimised", @@ -291,8 +452,10 @@ "column.lists": "Loetelud", "column.mutes": "Summutatud kasutajad", "column.notifications": "Teated", + "column.other_collections": "Kasutaja {name} kogumikud", "column.pins": "Esiletõstetud postitused", "column.public": "Föderatiivne ajajoon", + "column.your_collections": "Sinu kogumikud", "column_back_button.label": "Tagasi", "column_header.hide_settings": "Peida sätted", "column_header.moveLeft_settings": "Liiguta tulp vasakule", @@ -357,6 +520,10 @@ "confirmations.follow_to_list.confirm": "Jälgi ja lisa loetellu", "confirmations.follow_to_list.message": "Pead jälgima kasutajat {name}, et lisada teda loetellu.", "confirmations.follow_to_list.title": "Jälgida kasutajat?", + "confirmations.hide_featured_tab.confirm": "Peida vahekaart", + "confirmations.hide_featured_tab.intro": "Saad seda igal ajal muuta menüüs Profiili muutmine > Profiili vahekaardi seaded.", + "confirmations.hide_featured_tab.message": "See peidab vahekaardi serveri {serverName} kasutajatel ja teistel serveritel, kus kasutatakse Mastodoni uusimat versiooni. Muudel serveritel võib kuvamine erineda.", + "confirmations.hide_featured_tab.title": "Kas peidame vahekaardi „Esiletõstetud“?", "confirmations.logout.confirm": "Välju", "confirmations.logout.message": "Kas oled kindel, et soovid välja logida?", "confirmations.logout.title": "Logida välja?", @@ -380,6 +547,9 @@ "confirmations.remove_from_followers.confirm": "Eemalda jälgija", "confirmations.remove_from_followers.message": "{name} lõpetab sellega sinu jälgimise. Kas oled kindel, et soovid jätkata?", "confirmations.remove_from_followers.title": "Kas eemaldame jälgija?", + "confirmations.revoke_collection_inclusion.confirm": "Eemalda mind", + "confirmations.revoke_collection_inclusion.message": "See toiming on lõplik ja kuraator ei saa sind hiljem kogumikku uuesti lisada.", + "confirmations.revoke_collection_inclusion.title": "Kas eemaldad ennast sellest kogumikust?", "confirmations.revoke_quote.confirm": "Eemalda postitus", "confirmations.revoke_quote.message": "Seda tegevust ei saa tagasi pöörata.", "confirmations.revoke_quote.title": "Kas eemaldame postituse?", @@ -392,11 +562,13 @@ "content_warning.hide": "Peida postitus", "content_warning.show": "Näita ikkagi", "content_warning.show_more": "Näita rohkem", + "content_warning.show_short": "Näita", "conversation.delete": "Kustuta vestlus", "conversation.mark_as_read": "Märgi loetuks", "conversation.open": "Vaata vestlust", "conversation.with": "Koos {names}", "copy_icon_button.copied": "Kopeeritud vahemällu", + "copy_icon_button.copy_this_text": "Kopeeri link lõikelauale", "copypaste.copied": "Kopeeritud", "copypaste.copy_to_clipboard": "Kopeeri vahemällu", "directory.federated": "Tuntud födiversumist", @@ -431,6 +603,14 @@ "domain_pill.your_server": "Sinu digitaalne kodu, kus on kõik sinu postitused. Sulle ei meeldi see? Vaheta mistahes ajal serverit ja võta jälgijad ka.", "domain_pill.your_username": "Sinu unikaalne identifikaator siin serveris. On võimalik, et leiad teistes serverites samasuguse kasutajanimega kasutajaid.", "dropdown.empty": "Vali üks variantidest", + "email_subscriptions.email": "E-post", + "email_subscriptions.form.action": "Telli", + "email_subscriptions.form.bottom": "Saad postitusi postkasti ilma Mastodoni kontot loomata. Tellimuse saab igal ajal tühistada. Lisateave privaatsuspoliitikast.", + "email_subscriptions.form.title": "Telli {name} e-postiuuendused", + "email_subscriptions.submitted.lead": "Vaata oma postkasti, kas oled saanud kirja, et lõpetada uudiskirja tellimine.", + "email_subscriptions.submitted.title": "Veel üks samm", + "email_subscriptions.validation.email.blocked": "Blokeeritud e-posti teenusepakkuja", + "email_subscriptions.validation.email.invalid": "Sobimatu e-postiaadress", "embed.instructions": "Lisa see postitus oma veebilehele, kopeerides alloleva koodi.", "embed.preview": "Nii näeb see välja:", "emoji_button.activity": "Tegevus", @@ -448,10 +628,15 @@ "emoji_button.search_results": "Otsitulemused", "emoji_button.symbols": "Sümbolid", "emoji_button.travel": "Reisimine & kohad", - "empty_column.account_featured.me": "Sa pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid teemaviiteid või sõbra kasutajakontot?", - "empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid teemaviiteid või sõbra kasutajakontot?", - "empty_column.account_featured_other.unknown": "See kasutajakonto pole veel midagi esile tõstnud.", - "empty_column.account_hides_collections": "See kasutaja otsustas mitte teha seda infot saadavaks", + "empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud.", + "empty_column.account_featured_self.no_collections_button": "Loo kogumik", + "empty_column.account_featured_self.no_collections_hide_tab": "Selle asemel peida see vahekaart", + "empty_column.account_featured_self.pre_collections": "Jälgi kogumikke", + "empty_column.account_featured_self.pre_collections_desc": "Kogumikud (lisanduvad Mastodon V4.6) võimaldavad sul luua enda koostatud kontode nimekirju, mida teistele soovitada.", + "empty_column.account_featured_self.showcase_accounts": "Näita oma lemmikkontosid", + "empty_column.account_featured_self.showcase_accounts_desc": "Kogumikud on hoolikalt koostatud kontode nimekirjad, mis aitavad teistel Fediverse'i paremini avastada.", + "empty_column.account_featured_unknown.other": "See konto pole veel midagi esile tõstnud.", + "empty_column.account_hides_collections": "See kasutaja otsustas mitte teha seda infot kättesaadavaks", "empty_column.account_suspended": "Konto kustutatud", "empty_column.account_timeline": "Siin postitusi ei ole!", "empty_column.account_unavailable": "Profiil pole saadaval", @@ -490,6 +675,10 @@ "featured_carousel.header": "{count, plural, one {Esiletõstetud postitus} other {Esiletõstetud postitust}}", "featured_carousel.slide": "Postitus {current, number} / {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Postitasid hiljuti {items} kohta. Kas lisada need esiletõstetud teemaviideteks?", + "featured_tags.suggestions.add": "Lisa", + "featured_tags.suggestions.added": "Halda mistahes ajal oma esiletõstetud teemaviiteid kohas Muuda profiili > Esiletõstetud teemaviited.", + "featured_tags.suggestions.dismiss": "Ei, aitäh", "filter_modal.added.context_mismatch_explanation": "See filtrikategooria ei rakendu kontekstis, kuidas postituseni jõudsid. Kui tahad postitust ka selles kontekstis filtreerida, pead muutma filtrit.", "filter_modal.added.context_mismatch_title": "Konteksti mittesobivus!", "filter_modal.added.expired_explanation": "Selle filtri kategooria on aegunud. pead muutma aegumiskuupäeva, kui tahad, et filter kehtiks.", @@ -532,7 +721,9 @@ "follow_suggestions.who_to_follow": "Keda jälgida", "followed_tags": "Jälgitavad teemaviited", "followers.hide_other_followers": "See kasutaja eelistab mitte avaldada oma teisi jälgijaid", + "followers.title": "{name} jälgimine", "following.hide_other_following": "See kasutaja eelistab mitte avaldada oma teisi jälgitavaid", + "following.title": "Jälgitakse {name} poolt", "footer.about": "Teave", "footer.about_mastodon": "Mastodoni kohta", "footer.about_server": "{domain} kohta", @@ -544,6 +735,7 @@ "footer.source_code": "Lähtekood", "footer.status": "Olek", "footer.terms_of_service": "Kasutustingimused", + "form_error.blank": "Väli ei tohi olla tühi.", "form_field.optional": "(valikuline)", "generic.saved": "Salvestatud", "getting_started.heading": "Alustamine", @@ -554,7 +746,7 @@ "hashtag.column_header.tag_mode.any": "või teemaviide {additional}", "hashtag.column_header.tag_mode.none": "ilma teemaviiteta {additional}", "hashtag.column_settings.select.no_options_message": "Soovitusi ei leitud", - "hashtag.column_settings.select.placeholder": "Sisesta sildid…", + "hashtag.column_settings.select.placeholder": "Sisesta teemaviited…", "hashtag.column_settings.tag_mode.all": "Kõik need", "hashtag.column_settings.tag_mode.any": "Mõni neist", "hashtag.column_settings.tag_mode.none": "Mitte ükski neist", @@ -614,6 +806,7 @@ "keyboard_shortcuts.direct": "Ava privaatsete mainimiste veerg", "keyboard_shortcuts.down": "Liigu loetelus alla", "keyboard_shortcuts.enter": "Ava postitus", + "keyboard_shortcuts.explore": "Ava trendikate ajajoon", "keyboard_shortcuts.favourite": "Lemmikpostitus", "keyboard_shortcuts.favourites": "Ava lemmikute loetelu", "keyboard_shortcuts.federated": "Ava föderatsiooni ajajoon", @@ -700,6 +893,7 @@ "navigation_bar.automated_deletion": "Postituste automaatne kustutamine", "navigation_bar.blocks": "Blokeeritud kasutajad", "navigation_bar.bookmarks": "Järjehoidjad", + "navigation_bar.collections": "Kogumikud", "navigation_bar.direct": "Privaatsed mainimised", "navigation_bar.domain_blocks": "Peidetud domeenid", "navigation_bar.favourites": "Lemmikud", @@ -725,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Ava jälgitavate teemaviidete menüü", "navigation_panel.expand_lists": "Laienda loendimenüüd", "not_signed_in_indicator.not_signed_in": "Pead sisse logima, et saada ligipääsu sellele ressursile.", + "notification.added_to_collection": "{name} lisas sind kogumikku", "notification.admin.report": "{name} saatis teavituse {target} kohta", "notification.admin.report_account": "{name} raporteeris {count, plural, one {ühest postitusest} other {# postitusest}} kohast {target} kategooriast {category}", "notification.admin.report_account_other": "{name} raporteeris {count, plural, one {ühest postitusest} other {# postitusest}} kohast {target}", @@ -734,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# veel} other {# teist}} liitus", "notification.annual_report.message": "Sinu {year} #Wrapstodon ootab! Avalda oma aasta tipphetked ja meeldejäävad hetked Mastodonis!", "notification.annual_report.view": "Vaata #Wrapstodon", + "notification.collection_update": "{name} muutis kogumikku, kuhu sa kuulud", "notification.favourite": "{name} märkis su postituse lemmikuks", "notification.favourite.name_and_others_with_link": "{name} ja {count, plural, one {# veel} other {# teist}} märkis su postituse lemmikuks", "notification.favourite_pm": "{name} märkis sinu privaatse mainimise lemmikuks", @@ -847,14 +1043,16 @@ "notifications_permission_banner.title": "Ära jää millestki ilma", "onboarding.follows.back": "Tagasi", "onboarding.follows.empty": "Kahjuks ei saa hetkel tulemusi näidata. Proovi kasutada otsingut või lehitse uurimise lehte, et leida inimesi, keda jälgida, või proovi hiljem uuesti.", + "onboarding.follows.next": "Järgmine: Seadista oma profiil", "onboarding.follows.search": "Otsi", "onboarding.follows.title": "Jälgi inimesi, et alustada", "onboarding.profile.discoverable": "Muuda mu profiil avastatavaks", "onboarding.profile.discoverable_hint": "Kui nõustud enda avastamisega Mastodonis, võivad sinu postitused ilmuda otsingutulemustes ja trendides ning sinu profiili võidakse soovitada sinuga sarnaste huvidega inimestele.", "onboarding.profile.display_name": "Näidatav nimi", "onboarding.profile.display_name_hint": "Su täisnimi või naljanimi…", + "onboarding.profile.finish": "Valmis", "onboarding.profile.note": "Elulugu", - "onboarding.profile.note_hint": "Saad @mainida teisi kasutajaid või lisada #teemaviidet…", + "onboarding.profile.note_hint": "Saad @mainida teisi kasutajaid või lisada #teemaviiteid…", "onboarding.profile.title": "Profiili seadistamine", "onboarding.profile.upload_avatar": "Laadi üles profiilipilt", "onboarding.profile.upload_header": "Laadi üles profiili päis", @@ -924,6 +1122,7 @@ "report.category.title_account": "kontoga", "report.category.title_status": "postitusega", "report.close": "Valmis", + "report.collection_comment": "Miks soovid sellest kogumikust raporteerida?", "report.comment.title": "Kas arvad, et on veel midagi, mida me peaks teadma?", "report.forward": "Edasta ka {target} domeeni", "report.forward_hint": "See kasutaja on teisest serverist. Kas saadan anonümiseeritud koopia sellest teatest sinna ka?", @@ -945,6 +1144,8 @@ "report.rules.title": "Milliseid reegleid rikutakse?", "report.statuses.subtitle": "Vali kõik, mis sobivad", "report.statuses.title": "Kas on olemas postitusi, mis on sellele teavitusele tõenduseks?", + "report.submission_error": "Raportit ei saanud saata", + "report.submission_error_details": "Palun kontrolli internetiühendust ja proovi hiljem uuesti.", "report.submit": "Esita", "report.target": "Teatamine {target} kohta", "report.thanks.take_action": "Need on su võimalused määrata, mida Mastodonis näed:", @@ -982,7 +1183,7 @@ "search_popout.user": "kasutaja", "search_results.accounts": "Profiilid", "search_results.all": "Kõik", - "search_results.hashtags": "Sildid", + "search_results.hashtags": "Teemaviited", "search_results.no_results": "Tulemusi pole.", "search_results.no_search_yet": "Proovi otsida postitusi, profiile või teemaviiteid.", "search_results.see_all": "Vaata kõiki", @@ -992,12 +1193,16 @@ "server_banner.active_users": "aktiivset kasutajaid", "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.more_about_this_server": "Rohkem selle serveri kohta", "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", + "skip_links.hotkey": "Kiirklahv {hotkey}", + "skip_links.skip_to_content": "Hüppa põhisisuni", + "skip_links.skip_to_navigation": "Hüppa peamise navigeerimisalani", "status.admin_account": "Ava @{name} moderaatorivaates", "status.admin_domain": "Ava {domain} modeereerimisliides", "status.admin_status": "Ava postitus moderaatorivaates", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 778207fc85a578..dc58b8d677b6ab 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -21,12 +21,10 @@ "account.block_domain": "Blokeatu {domain} domeinua", "account.block_short": "Blokeatu", "account.blocked": "Blokeatuta", - "account.blocking": "Eragotzitakoak", "account.cancel_follow_request": "Baztertu jarraitzeko eskaera", "account.copy": "Kopiatu profilerako esteka", "account.direct": "Aipatu pribatuki @{name}", "account.disable_notifications": "Utzi jakinarazteari @{name} erabiltzaileak argitaratzean", - "account.domain_blocking": "Eragotzitako domeinua", "account.edit_profile": "Editatu profila", "account.edit_profile_short": "Editatu", "account.enable_notifications": "Jakinarazi @{name} erabiltzaileak argitaratzean", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "{name1}-k eta {name2}-k jarraitzen dute", "account.featured": "Gailenak", "account.featured.accounts": "Profilak", - "account.featured.hashtags": "Traolak", - "account.featured_tags.last_status_at": "Azken bidalketa {date} datan", - "account.featured_tags.last_status_never": "Bidalketarik ez", "account.follow": "Jarraitu", "account.follow_back": "Jarraitu bueltan", "account.follow_back_short": "Jarraitu bueltan", @@ -68,16 +63,13 @@ "account.mute_notifications_short": "Mututu jakinarazpenak", "account.mute_short": "Mututu", "account.muted": "Mutututa", - "account.muting": "Isilarazitakoak", "account.mutual": "Elkar jarraitzen duzue", "account.no_bio": "Ez da deskribapenik eman.", "account.open_original_page": "Ireki jatorrizko orria", "account.posts": "Bidalketa", - "account.posts_with_replies": "Bidalketak eta erantzunak", "account.remove_from_followers": "Kendu {name} zure jarraitzaileengandik", "account.report": "Salatu @{name}", "account.requested_follow": "{name}-(e)k zu jarraitzeko eskaera egin du", - "account.requests_to_follow_you": "Zu jarraitzeko eskaera egin du", "account.share": "Partekatu @{name} erabiltzailearen profila", "account.show_reblogs": "Erakutsi @{name} erabiltzailearen bultzadak", "account.statuses_counter": "{count, plural, one {{counter} bidalketa} other {{counter} bidalketa}}", @@ -359,9 +351,6 @@ "emoji_button.search_results": "Bilaketaren emaitzak", "emoji_button.symbols": "Sinboloak", "emoji_button.travel": "Bidaiak eta tokiak", - "empty_column.account_featured.me": "Oraindik ez duzu ezer nabarmendu. Ba al zenekien gehien erabiltzen dituzun traolak eta baita zure lagunen kontuak ere zure profilean nabarmendu ditzakezula?", - "empty_column.account_featured.other": "{acct}-ek ez du ezer nabarmendu oraindik. Ba al zenekien gehien erabiltzen dituzun traolak eta baita zure lagunen kontuak ere zure profilean nabarmendu ditzakezula?", - "empty_column.account_featured_other.unknown": "Kontu honek ez du ezer nabarmendu oraindik.", "empty_column.account_hides_collections": "Erabiltzaile honek informazio hau erabilgarri ez egotea aukeratu du.", "empty_column.account_suspended": "Kanporatutako kontua", "empty_column.account_timeline": "Ez dago bidalketarik hemen!", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 3cd7bfaf801d87..389a78798dd796 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -21,12 +21,10 @@ "account.block_domain": "انسداد دامنهٔ {domain}", "account.block_short": "انسداد", "account.blocked": "مسدود", - "account.blocking": "مسدود کرده", "account.cancel_follow_request": "رد کردن درخواست پی‌گیری", "account.copy": "رونوشت از پیوند به نمایه", "account.direct": "اشارهٔ خصوصی به ‪@{name}‬", "account.disable_notifications": "آگاه کردن من هنگام فرسته‌های ‎@{name} را متوقّف کن", - "account.domain_blocking": "دامنهٔ مسدود کرده", "account.edit_profile": "ویرایش نمایه", "account.edit_profile_short": "ویرایش", "account.enable_notifications": "هنگام فرسته‌های ‎@{name} مرا آگاه کن", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "پی‌گرفته از سوی {name1} و {name2}", "account.featured": "پیشنهادی", "account.featured.accounts": "نمایه‌ها", - "account.featured.hashtags": "برچسب‌ها", - "account.featured_tags.last_status_at": "آخرین فرسته در {date}", - "account.featured_tags.last_status_never": "بدون فرسته", "account.follow": "پی‌گرفتن", "account.follow_back": "پی‌گیری متقابل", "account.follow_back_short": "پی‌گیری متقابل", @@ -68,16 +63,13 @@ "account.mute_notifications_short": "خموشی آگاهی‌ها", "account.mute_short": "خموشی", "account.muted": "خموش", - "account.muting": "خموشش کرده‌اید", "account.mutual": "یکدیگر را پی می‌گیرید", "account.no_bio": "شرحی فراهم نشده.", "account.open_original_page": "گشودن صفحهٔ اصلی", "account.posts": "فرسته", - "account.posts_with_replies": "فرسته‌ها و پاسخ‌ها", "account.remove_from_followers": "برداشتن {name} از پی‌گیران", "account.report": "گزارش ‎@{name}", "account.requested_follow": "{name} درخواست پی‌گیریتان را داد", - "account.requests_to_follow_you": "درخواست پی‌گیریتان را دارد", "account.share": "هم‌رسانی نمایهٔ ‎@{name}", "account.show_reblogs": "نمایش تقویت‌های ‎@{name}", "account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}", @@ -359,9 +351,6 @@ "emoji_button.search_results": "نتایج جست‌وجو", "emoji_button.symbols": "نمادها", "emoji_button.travel": "سفر و مکان", - "empty_column.account_featured.me": "شما هنوز هیچ چیزی را پیشنهاد نکرده‌اید. می‌دانستید که می‌توانید برچسب‌هایی که بیشتر استفاده می‌کنید و حتی حساب‌های کاربری دوستان‌تان را در نمایه خودتان پیشنهاد کنید؟", - "empty_column.account_featured.other": "{acct} هنوز هیچ چیزی را پیشنهاد نکرده است. آیا می‌دانستید که می‌توانید برچسب‌هایی را که بیشتر استفاده می‌کنید و حتی حساب‌های کاربری دوستانتان را در نمایه خود پیشنهاد کنید؟", - "empty_column.account_featured_other.unknown": "این حساب هنوز چیزی را پیشنهاد نکرده.", "empty_column.account_hides_collections": "کاربر خواسته که این اطّلاعات در دسترس نباشند", "empty_column.account_suspended": "حساب معلق شد", "empty_column.account_timeline": "هیچ فرسته‌ای این‌جا نیست!", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index ffec8d59e851bb..aca15536ba34f0 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -28,12 +28,10 @@ "account.block_domain": "Estä verkkotunnus {domain}", "account.block_short": "Estä", "account.blocked": "Estetty", - "account.blocking": "Estetty", "account.cancel_follow_request": "Peruuta seurantapyyntö", "account.copy": "Kopioi linkki profiiliin", "account.direct": "Mainitse @{name} yksityisesti", "account.disable_notifications": "Lopeta ilmoittamasta minulle, kun @{name} julkaisee", - "account.domain_blocking": "Verkkotunnus estetty", "account.edit_note": "Muokkaa henkilökohtaista muistiinpanoa", "account.edit_profile": "Muokkaa profiilia", "account.edit_profile_short": "Muokkaa", @@ -45,9 +43,7 @@ "account.featured": "Esittelyssä", "account.featured.accounts": "Profiilit", "account.featured.collections": "Kokoelmat", - "account.featured.hashtags": "Aihetunnisteet", - "account.featured_tags.last_status_at": "Viimeisin julkaisu {date}", - "account.featured_tags.last_status_never": "Ei julkaisuja", + "account.featured.new_collection": "Uusi kokoelma", "account.field_overflow": "Näytä koko sisältö", "account.filters.all": "Kaikki toiminta", "account.filters.boosts_toggle": "Näytä tehostukset", @@ -73,8 +69,19 @@ "account.go_to_profile": "Siirry profiiliin", "account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset", "account.in_memoriam": "Muistoissamme.", + "account.join_modal.day": "päivä", + "account.join_modal.me": "Liityit palvelimelle {server}", + "account.join_modal.me_anniversary": "Hyvää fediversumin vuosipäivää! Liityit palvelimelle {server}", + "account.join_modal.me_today": "On ensimmäinen päiväsi palvelimella {server}!", + "account.join_modal.other": "{name} liittyi palvelimelle {server}", + "account.join_modal.other_today": "On käyttäjän {name} ensimmäinen päivä palvelimella {server}!", + "account.join_modal.share.celebrate": "Jaa juhlajulkaisu", + "account.join_modal.share.intro": "Jaa esittelyjulkaisu", + "account.join_modal.share.welcome": "Jaa tervetulojulkaisu", + "account.join_modal.years": "{number, plural, one {vuosi} other {vuotta}}", "account.joined_short": "Liittynyt", "account.languages": "Vaihda tilattuja kieliä", + "account.last_active": "Viimeksi aktiivisena", "account.link_verified_on": "Linkin omistus tarkistettiin {date}", "account.locked_info": "Tilin yksityisyystilaksi on määritetty lukittu. Tilin omistaja arvioi erikseen, kuka voi seurata häntä.", "account.media": "Media", @@ -82,7 +89,7 @@ "account.menu.add_to_list": "Lisää listaan…", "account.menu.block": "Estä tili", "account.menu.block_domain": "Estä {domain}", - "account.menu.copied": "Kopioitu tilin linkki leikepöydälle", + "account.menu.copied": "Tlin linkki kopioitu leikepöydälle", "account.menu.copy": "Kopioi linkki", "account.menu.direct": "Mainitse yksityisesti", "account.menu.hide_reblogs": "Piilota tehostukset aikajanalta", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Mykistä ilmoitukset", "account.mute_short": "Mykistä", "account.muted": "Mykistetty", - "account.muting": "Mykistetty", "account.mutual": "Seuraatte toisianne", + "account.name.copy": "Kopioi käyttäjätunnus", "account.name.help.domain": "{domain} on palvelin, jolla käyttäjän profiili ja julkaisut sijaitsevat.", "account.name.help.domain_self": "{domain} on palvelin, jolla profiilisi ja julkaisusi sijaitsevat.", - "account.name.help.footer": "Aivan kuten voit lähettää sähköpostia eri sähköpostiohjelmilla, voit olla yhteydessä muihin Mastodon-palvelimiin – ja kehen tahansa, joka käyttää sosiaalisen median sovelluksia, jotka toimivat samoilla säännöillä kuin Mastodon (hyödyntävät ActivityPub-protokollaa).", + "account.name.help.footer": "Aivan kuten voit lähettää sähköpostia eri sähköpostipalveluntarjoajien avulla, voit olla yhteydessä muihin Mastodon-palvelimiin ja kehen tahansa, joka käyttää Mastodonin kanssa yhteensopivia sosiaalisen median sovelluksia.", "account.name.help.header": "Käyttäjätunnus on kuin sähköpostiosoite", "account.name.help.username": "{username} on tämän tilin käyttäjänimi omalla palvelimellaan. Jollakin toisen palvelimen tilillä voi olla sama käyttäjänimi.", "account.name.help.username_self": "{username} on käyttäjänimesi tällä palvelimella. Jollakin toisen palvelimen tilillä voi olla sama käyttäjänimi.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Muokkaa", "account.note.title": "Henkilökohtainen muistiinpano (näkyy vain sinulle)", "account.open_original_page": "Avaa alkuperäinen sivu", + "account.pending": "Odottava", "account.posts": "Julkaisut", - "account.posts_with_replies": "Julkaisut ja vastaukset", "account.remove_from_followers": "Poista {name} seuraajista", "account.report": "Raportoi @{name}", "account.requested_follow": "{name} on pyytänyt lupaa seurata sinua", - "account.requests_to_follow_you": "Pyynnöt 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}}", @@ -141,34 +147,42 @@ "account.unmute": "Kumoa käyttäjän @{name} mykistys", "account.unmute_notifications_short": "Kumoa ilmoitusten mykistys", "account.unmute_short": "Kumoa mykistys", + "account_edit.advanced_settings.bot_hint": "Ilmaise muille, että tili suorittaa enimmäkseen automaattisia toimia eikä sitä välttämättä valvota", + "account_edit.advanced_settings.bot_label": "Bottitili", + "account_edit.advanced_settings.title": "Edistyneet asetukset", + "account_edit.bio.add_label": "Lisää elämäkerta", + "account_edit.bio.edit_label": "Muokkaa elämäkertaa", "account_edit.bio.placeholder": "Lisää lyhyt esittely, joka auttaa muita tunnistamaan sinut.", "account_edit.bio.title": "Elämäkerta", "account_edit.bio_modal.add_title": "Lisää elämäkerta", "account_edit.bio_modal.edit_title": "Muokkaa elämäkertaa", - "account_edit.button.add": "Lisää {item}", - "account_edit.button.delete": "Poista {item}", - "account_edit.button.edit": "Muokkaa {item}", "account_edit.column_button": "Valmis", "account_edit.column_title": "Muokkaa profiilia", - "account_edit.custom_fields.name": "kenttä", + "account_edit.custom_fields.add_label": "Lisää kenttä", + "account_edit.custom_fields.edit_label": "Muokkaa kenttää", "account_edit.custom_fields.placeholder": "Lisää pronominisi, ulkoisia linkkejä tai mitä tahansa muuta, jonka haluat jakaa.", "account_edit.custom_fields.reorder_button": "Järjestele kenttiä", "account_edit.custom_fields.tip_content": "Voit helposti lisätä Mastodon-tilisi uskottavuutta vahvistamalla mihin tahansa omistamaasi verkkosivustoon ohjaavat linkit.", "account_edit.custom_fields.tip_title": "Vinkki: Vahvistettujen linkkien lisääminen", "account_edit.custom_fields.title": "Mukautetut kentät", "account_edit.custom_fields.verified_hint": "Miten lisään vahvistetun linkin?", + "account_edit.display_name.add_label": "Lisää näyttönimi", + "account_edit.display_name.edit_label": "Muokkaa näyttönimeä", "account_edit.display_name.placeholder": "Näyttönimesi on nimi, joka näkyy profiilissasi ja aikajanoilla.", "account_edit.display_name.title": "Näyttönimi", - "account_edit.featured_hashtags.item": "aihetunnisteet", + "account_edit.featured_hashtags.edit_label": "Lisää aihetunnisteita", "account_edit.featured_hashtags.placeholder": "Auta muita tunnistamaan suosikkiaiheesi ja saamaan nopea pääsy niihin.", "account_edit.featured_hashtags.title": "Esiteltävät aihetunnisteet", + "account_edit.field_actions.delete": "Poista kenttä", + "account_edit.field_actions.edit": "Muokkaa kenttää", "account_edit.field_delete_modal.confirm": "Haluatko varmasti poistaa tämän mukautetun kentän? Tätä toimea ei voi peruuttaa.", "account_edit.field_delete_modal.delete_button": "Poista", "account_edit.field_delete_modal.title": "Poistetaanko mukautettu kenttä?", "account_edit.field_edit_modal.add_title": "Lisää mukautettu kenttä", + "account_edit.field_edit_modal.discard_confirm": "Hylkää", + "account_edit.field_edit_modal.discard_message": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti hylätä ne?", "account_edit.field_edit_modal.edit_title": "Muokkaa mukautettua kenttää", - "account_edit.field_edit_modal.limit_header": "Suositeltu merkkiraja ylitetty", - "account_edit.field_edit_modal.limit_message": "Mobiilikäyttäjät eivät välttämättä näe kenttää kokonaan.", + "account_edit.field_edit_modal.length_warning": "Suositeltava merkkimäärä ylitetty. Mobiilikäyttäjät eivät välttämättä näe kenttää kokonaan.", "account_edit.field_edit_modal.link_emoji_warning": "Emme suosittele käyttämään mukautettuja emojeita URL-osoitteiden kanssa. Molempia sisältävät mukautetut kentät näkyvät vain tekstinä linkin sijaan, jotta estetään käyttäjien sekaannus.", "account_edit.field_edit_modal.name_hint": "Esim. ”Henkilökohtainen verkkosivusto”", "account_edit.field_edit_modal.name_label": "Nimike", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Muokkaa tekstivastinetta", "account_edit.image_edit.remove_button": "Poista kuva", "account_edit.image_edit.replace_button": "Korvaa kuva", + "account_edit.item_list.delete": "Poista {name}", + "account_edit.item_list.edit": "Muokkaa kohdetta {name}", "account_edit.name_modal.add_title": "Lisää näyttönimi", "account_edit.name_modal.edit_title": "Muokkaa näyttönimeä", "account_edit.profile_tab.button_label": "Mukauta", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Näytä Media-välilehti", "account_edit.profile_tab.show_media_replies.description": "Kun käytössä, Media-välilehti näyttää sekä julkaisusi että vastauksesi muiden julkaisuihin.", "account_edit.profile_tab.show_media_replies.title": "Sisällytä vastaukset Media-välilehdelle", - "account_edit.profile_tab.subtitle": "Mukauta profiilisi välilehtiä ja sitä, mitä niissä näkyy.", - "account_edit.profile_tab.title": "Profiilin välilehtien asetukset", "account_edit.save": "Tallenna", "account_edit.upload_modal.back": "Takaisin", "account_edit.upload_modal.done": "Valmis", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Lähetä pudottamalla", "account_edit.upload_modal.step_upload.header": "Valitse kuva", "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- tai JPG-muotoinen, enintään {limit} Mt.{br}Kuva skaalautuu kokoon {width}×{height} px.", - "account_edit.upload_modal.title_add": "Lisää profiilikuva", - "account_edit.upload_modal.title_replace": "Korvaa profiilikuva", + "account_edit.upload_modal.title_add.avatar": "Lisää profiilikuva", + "account_edit.upload_modal.title_add.header": "Lisää kansikuva", + "account_edit.upload_modal.title_replace.avatar": "Korvaa profiilikuva", + "account_edit.upload_modal.title_replace.header": "Korvaa kansikuva", "account_edit.verified_modal.details": "Lisää Mastodon-profiiliisi uskottavuutta vahvistamalla linkit henkilökohtaisiin verkkosivustoihin. Näin se toimii:", "account_edit.verified_modal.invisible_link.details": "Lisää linkki HTML:n head-osaan. Tärkeä kohta on rel=\"me\", joka estää toiseksi tekeytymisen sivustoilla, joilla on käyttäjien luomaa sisältöä. Voit jopa käyttää link-tunnistetta sivun head-osassa {tag}-tunnisteen sijaan, mutta HTML:n tulee olla saatavilla suorittamatta JavaScriptia.", "account_edit.verified_modal.invisible_link.summary": "Miten teen linkistä näkymättömän?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Lisää verkkosivustosi mukautettuna kenttänä", "account_edit.verified_modal.title": "Miten lisätä vahvistettu linkki", "account_edit_tags.add_tag": "Lisää #{tagName}", - "account_edit_tags.column_title": "Muokkaa esiteltäviä aihetunnisteita", + "account_edit_tags.column_title": "Muokkaa tunnisteita", "account_edit_tags.help_text": "Esiteltävät aihetunnisteet auttavat käyttäjiä löytämään profiilisi ja olemaan vuorovaikutuksessa sen kanssa. Ne näkyvät suodattimina profiilisivusi Toiminta-näkymässä.", + "account_edit_tags.max_tags_reached": "Sinulla on enimmäismäärä esiteltäviä aihetunnisteita.", "account_edit_tags.search_placeholder": "Syötä aihetunniste…", "account_edit_tags.suggestions": "Ehdotuksia:", "account_edit_tags.tag_status_count": "{count, plural, one {# julkaisu} other {# julkaisua}}", + "account_list.total": "{total, plural, one {# tili} other {# tiliä}}", "account_note.placeholder": "Lisää muistiinpano napsauttamalla", "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", @@ -338,7 +356,7 @@ "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", - "collection.share_modal.share_link_label": "Kutsun jakolinkki", + "collection.share_modal.share_link_label": "Jaa linkki", "collection.share_modal.share_via_post": "Jaa Mastodonissa", "collection.share_modal.share_via_system": "Jaa kohteeseen…", "collection.share_modal.title": "Jaa kokoelma", @@ -346,8 +364,11 @@ "collection.share_template_other": "Katso tämä siisti kokoelma: {link}", "collection.share_template_own": "Katso uusi kokoelmani: {link}", "collections.account_count": "{count, plural, one {# tili} other {# tiliä}}", - "collections.accounts.empty_description": "Lisää enintään {count} seuraamaasi tiliä", + "collections.accounts.empty_description": "Lisää enintään {count} tiliä", + "collections.accounts.empty_editor_title": "Kukaan ei ole vielä tässä kokoelmassa", "collections.accounts.empty_title": "Tämä kokoelma on tyhjä", + "collections.block_collection_owner": "Estä tili", + "collections.by_account": "koonnut {account_handle}", "collections.collection_description": "Kuvaus", "collections.collection_language": "Kieli", "collections.collection_language_none": "Ei mikään", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Haluatko varmasti poistaa tämän tilin tästä kokoelmasta?", "collections.content_warning": "Sisältövaroitus", "collections.continue": "Jatka", - "collections.create.accounts_subtitle": "Lisätä voi vain tilejä, joita seuraat ja jotka ovat valinneet tulla löydetyiksi.", + "collections.copy_link": "Kopioi linkki", + "collections.copy_link_confirmation": "Kokoelman linkki kopioitu leikepöydälle", "collections.create.accounts_title": "Keitä esittelet tässä kokoelmassa?", "collections.create.basic_details_title": "Perustiedot", "collections.create.steps": "Vaihe {step}/{total}", - "collections.create_a_collection_hint": "Luomalla kokoelman voit suositella tai jakaa suosikkitilejäsi muiden kanssa.", "collections.create_collection": "Luo kokoelma", "collections.delete_collection": "Poista kokoelma", "collections.description_length_hint": "100 merkin rajoitus", - "collections.detail.accept_inclusion": "Selvä", - "collections.detail.accounts_heading": "Tilit", - "collections.detail.author_added_you": "{author} lisäsi sinut tähän kokoelmaan", - "collections.detail.curated_by_author": "Koonnut {author}", - "collections.detail.curated_by_you": "Itse kokoamasi", + "collections.detail.author_added_you_on_date": "{author} lisäsi sinut {date}", "collections.detail.loading": "Ladataan kokoelmaa…", - "collections.detail.other_accounts_in_collection": "Muut tässä kokoelmassa:", "collections.detail.revoke_inclusion": "Poista minut", + "collections.detail.sensitive_content": "Arkaluonteista sisältöä", "collections.detail.sensitive_note": "Tämä kokoelma sisältää tilejä ja sisältöä, jotka saattavat olla arkaluonteisia joillekin käyttäjille.", "collections.detail.share": "Jaa tämä kokoelma", + "collections.detail.you_are_in_this_collection": "Esiinnyt tässä kokoelmassa", "collections.edit_details": "Muokkaa tietoja", - "collections.error_loading_collections": "Kokoelmien latauksessa tapahtui virhe.", - "collections.hints.accounts_counter": "{count} / {max} tiliä", + "collections.hidden_accounts_description": "Olet estänyt tai mykistänyt {count, plural, one {tämän käyttäjän} other {nämä käyttäjät}}", + "collections.hidden_accounts_link": "{count, plural, one {# piilotettu tili} other {# piilotettua tiliä}}", + "collections.hints.accounts_counter": "{count}/{max} tiliä", "collections.last_updated_at": "Päivitetty viimeksi {date}", + "collections.list.collections_with_count": "{count, plural, one {# kokoelma} other {# kokoelmaa}}", + "collections.list.created_by_author": "Luonut {name}", + "collections.list.created_by_you": "Itse luomasi", + "collections.list.featuring_you": "Esittelevät sinua", "collections.manage_accounts": "Hallitse tilejä", "collections.mark_as_sensitive": "Merkitse arkaluonteiseksi", "collections.mark_as_sensitive_hint": "Piilottaa kokoelman kuvauksen ja tilit sisältövaroituksen taakse. Kokoelman nimi jää esiin.", + "collections.maximum_collection_count_description": "Palvelimesi sallii enintään {count} kokoelman luomisen.", + "collections.maximum_collection_count_reached": "Olet luonut enimmäismäärän kokoelmia", "collections.name_length_hint": "40 merkin rajoitus", "collections.new_collection": "Uusi kokoelma", - "collections.no_collections_yet": "Ei vielä kokoelmia.", - "collections.old_last_post_note": "Julkaissut viimeksi yli viikko sitten", - "collections.remove_account": "Poista tämä tili", + "collections.pending_accounts.message": "Tilit saattavat näkyä odottavina, kun odotetaan vastausta käyttäjältä tai hänen palvelimeltaan. Vain sinä voit nähdä odottavat tilit.", + "collections.pending_accounts.title": "Miksi näen odottavia tilejä?", + "collections.remove_account": "Poista", "collections.report_collection": "Raportoi tämä kokoelma", "collections.revoke_collection_inclusion": "Poista itseni tästä kokoelmasta", "collections.revoke_inclusion.confirmation": "Sinut on poistettu kokoelmasta ”{collection}”", "collections.revoke_inclusion.error": "Tapahtui virhe – yritä myöhemmin uudelleen.", - "collections.search_accounts_label": "Hae lisättäviä tilejä…", + "collections.search_accounts_label": "Hae lisättävää tiliä", "collections.search_accounts_max_reached": "Olet lisännyt enimmäismäärän tilejä", "collections.sensitive": "Arkaluonteinen", + "collections.share_short": "Jaa", + "collections.suggestions.can_not_add": "Ei voi lisätä", + "collections.suggestions.can_not_add_desc": "Nämä tilit ovat ehkä jättäytyneet löydettävyyden ulkopuolelle, tai ne saattavat olla palvelimella, joka ei tue kokoelmia.", + "collections.suggestions.must_follow": "Täytyy ensin seurata", + "collections.suggestions.must_follow_desc": "Nämä tilit tarkistavat kaikki seurantapyynnöt. Seuraajat voivat lisätä niitä kokoelmiinsa.", "collections.topic_hint": "Lisää aihetunniste, joka auttaa muita ymmärtämään tämän kokoelman pääaiheen.", "collections.topic_special_chars_hint": "Erikoismerkit poistetaan tallennettaessa", + "collections.unlisted_collections_description": "Nämä eivät näy muille profiilissasi. Kuka tahansa, jolla on linkki, voi löytää ne.", + "collections.unlisted_collections_with_count": "Listaamattomat kokoelmat ({count})", "collections.view_collection": "Näytä kokoelma", - "collections.view_other_collections_by_user": "Näytä muut tämän käyttäjän kokoelmat", "collections.visibility_public": "Julkinen", "collections.visibility_public_hint": "Löydettävissä hakutuloksista ja muualta, jossa ilmenee suosituksia.", "collections.visibility_title": "Näkyvyys", @@ -405,7 +436,6 @@ "column.about": "Tietoja", "column.blocks": "Estetyt käyttäjät", "column.bookmarks": "Kirjanmerkit", - "column.collections": "Omat kokoelmat", "column.community": "Paikallinen aikajana", "column.create_list": "Luo lista", "column.direct": "Yksityismaininnat", @@ -422,8 +452,10 @@ "column.lists": "Listat", "column.mutes": "Mykistetyt käyttäjät", "column.notifications": "Ilmoitukset", + "column.other_collections": "Käyttäjän {name} kokoelmat", "column.pins": "Kiinnitetyt julkaisut", "column.public": "Yleinen aikajana", + "column.your_collections": "Omat kokoelmat", "column_back_button.label": "Takaisin", "column_header.hide_settings": "Piilota asetukset", "column_header.moveLeft_settings": "Siirrä saraketta vasemmalle", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Hylätäänkö luonnosjulkaisusi?", "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.follow_to_collection.confirm": "Seuraa ja lisää kokoelmaan", - "confirmations.follow_to_collection.message": "Sinun on seurattava tiliä {name}, jotta voit lisätä sen kokoelmaan.", - "confirmations.follow_to_collection.title": "Seurataanko tiliä?", "confirmations.follow_to_list.confirm": "Seuraa ja lisää listaan", "confirmations.follow_to_list.message": "Sinun on seurattava käyttäjää {name}, jotta voit lisätä hänet listaan.", "confirmations.follow_to_list.title": "Seurataanko käyttäjää?", + "confirmations.hide_featured_tab.confirm": "Piilota välilehti", + "confirmations.hide_featured_tab.intro": "Voit muuttaa tätä milloin tahansa kohdasta Muokkaa profiilia > Profiilin välilehtien asetukset.", + "confirmations.hide_featured_tab.message": "Tämä piilottaa välilehden palvelimen {serverName} käyttäjiltä ja muilta palvelimilta, jotka toimivat Mastodonin uusimmalla versiolla. Muut näkymät voivat vaihdella.", + "confirmations.hide_featured_tab.title": "Piilotetaanko Esittelyssä-välilehti?", "confirmations.logout.confirm": "Kirjaudu ulos", "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?", "confirmations.logout.title": "Kirjaudutaanko ulos?", @@ -529,6 +562,7 @@ "content_warning.hide": "Piilota julkaisu", "content_warning.show": "Näytä kuitenkin", "content_warning.show_more": "Näytä lisää", + "content_warning.show_short": "Näytä", "conversation.delete": "Poista keskustelu", "conversation.mark_as_read": "Merkitse luetuksi", "conversation.open": "Näytä keskustelu", @@ -569,6 +603,14 @@ "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.", "dropdown.empty": "Valitse vaihtoehto", + "email_subscriptions.email": "Sähköpostiosoite", + "email_subscriptions.form.action": "Tilaa", + "email_subscriptions.form.bottom": "Saa julkaisut Saapuneet-kansioosi luomatta Mastodon-tiliä. Peruuta tilaus milloin tahansa. Jos haluat lisätietoja, katso tietosuojakäytäntö.", + "email_subscriptions.form.title": "Tilaa sähköpostipäivitykset käyttäjältä {name}", + "email_subscriptions.submitted.lead": "Viimeistele sähköpostipäivitysten tilaus tarkistamalla Saapuneet-kansiosi.", + "email_subscriptions.submitted.title": "Vielä yksi vaihe", + "email_subscriptions.validation.email.blocked": "Estetty sähköpostipalveluntarjoaja", + "email_subscriptions.validation.email.invalid": "Virheellinen sähköpostiosoite", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", "embed.preview": "Tältä se näyttää:", "emoji_button.activity": "Aktiviteetit", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu ja paikat", - "empty_column.account_featured.me": "Et esittele vielä mitään. Tiesitkö, että voit esitellä profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?", - "empty_column.account_featured.other": "{acct} ei esittele vielä mitään. Tiesitkö, että voit esitellä profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?", - "empty_column.account_featured_other.unknown": "Tämä tili ei esittele vielä mitään.", + "empty_column.account_featured.other": "{acct} ei esittele vielä mitään.", + "empty_column.account_featured_self.no_collections_button": "Luo kokoelma", + "empty_column.account_featured_self.no_collections_hide_tab": "Piilota tämä välilehti sen sijaan", + "empty_column.account_featured_self.pre_collections": "Ole valmiina kokoelmiin", + "empty_column.account_featured_self.pre_collections_desc": "Kokoelmien (tulossa Mastodon 4.6:ssa) avulla voit luoda valikoidun listan muille suosittelemistasi tileistä.", + "empty_column.account_featured_self.showcase_accounts": "Esittele suosikkitilejäsi", + "empty_column.account_featured_self.showcase_accounts_desc": "Kokoelmat ovat valikoituja listoja tileistä, jotka auttavat muita löytämään enemmän fediversumissa.", + "empty_column.account_featured_unknown.other": "Tämä tili ei esittele vielä mitään.", "empty_column.account_hides_collections": "Käyttäjä on päättänyt pitää nämä tiedot yksityisinä", "empty_column.account_suspended": "Tili jäädytetty", "empty_column.account_timeline": "Ei julkaisuja täällä!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Seurantaehdotuksia", "followed_tags": "Seurattavat aihetunnisteet", "followers.hide_other_followers": "Käyttäjä on päättänyt piilottaa muut seuraajansa", + "followers.title": "Seurattavana {name}", "following.hide_other_following": "Käyttäjä on päättänyt piilottaa muut seurattavansa", + "following.title": "Seuraajana {name}", "footer.about": "Tietoja", "footer.about_mastodon": "Tietoja Mastodonista", "footer.about_server": "Tietoja palvelimesta {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Näytä lähdekoodi", "footer.status": "Tila", "footer.terms_of_service": "Käyttöehdot", + "form_error.blank": "Kenttä ei voi olla tyhjä.", "form_field.optional": "(valinnainen)", "generic.saved": "Tallennettu", "getting_started.heading": "Näin pääset alkuun", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Laajenna seurattavien aihetunnisteiden valikko", "navigation_panel.expand_lists": "Laajenna listavalikko", "not_signed_in_indicator.not_signed_in": "Sinun on kirjauduttava sisään käyttääksesi resurssia.", + "notification.added_to_collection": "{name} lisäsi sinut kokoelmaan", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} ja {count, plural, one {# muu} other {# muuta}} rekisteröityivät", "notification.annual_report.message": "Vuoden {year} #Wrapstodon odottaa! Paljasta vuotesi kohokohdat ikimuistoiset hetket Mastodonissa!", "notification.annual_report.view": "Näytä #Wrapstodon", + "notification.collection_update": "{name} muokkasi kokoelmaa, jossa olet", "notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa", "notification.favourite.name_and_others_with_link": "{name} ja {count, plural, one {# muu} other {# muuta}} lisäsivät julkaisusi suosikkeihinsa", "notification.favourite_pm": "{name} lisäsi yksityismainintasi suosikkeihinsa", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "aktiivista käyttäjää", "server_banner.administered_by": "Ylläpitäjä:", "server_banner.is_one_of_many": "{domain} on yksi monista itsenäisistä Mastodon-palvelimista, joiden välityksellä voit toimia fediversumissa.", + "server_banner.more_about_this_server": "Lisää tästä palvelimesta", "server_banner.server_stats": "Palvelimen tilastot:", "sign_in_banner.create_account": "Luo tili", "sign_in_banner.follow_anyone": "Seuraa kenen tahansa julkaisuja fediversumissa ja näe ne kaikki aikajärjestyksessä. Ei algoritmeja, mainoksia eikä klikkausten kalastelua.", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index c31f8c7681ea35..6899544b2f1485 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -21,12 +21,10 @@ "account.block_domain": "Hadlangan ang domain na {domain}", "account.block_short": "Hadlangan", "account.blocked": "Hinadlangan", - "account.blocking": "Pagharang", "account.cancel_follow_request": "I-kansela ang pagsunod", "account.copy": "I-sipi ang kawing sa profile", "account.direct": "Palihim banggitin si @{name}", "account.disable_notifications": "I-tigil ang pagpapaalam sa akin tuwing nagpopost si @{name}", - "account.domain_blocking": "Pag-block ng domain", "account.edit_profile": "Baguhin ang profile", "account.edit_profile_short": "I-edit", "account.enable_notifications": "Ipaalam sa akin kapag nag-post si @{name}", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "Sinusindan nina {name1} at {name2}", "account.featured": "Itinatampok", "account.featured.accounts": "Mga Profile", - "account.featured.hashtags": "Mga Hashtag", - "account.featured_tags.last_status_at": "Huling post noong {date}", - "account.featured_tags.last_status_never": "Walang mga post", "account.follow": "Sundan", "account.follow_back": "Sundan pabalik", "account.follow_back_short": "I-follow back", @@ -68,16 +63,13 @@ "account.mute_notifications_short": "I-mute ang mga abiso", "account.mute_short": "I-mute", "account.muted": "Naka-mute", - "account.muting": "Pag-mute", "account.mutual": "Pina-follow nyo ang isa't-isa", "account.no_bio": "Walang nakalaan na paglalarawan.", "account.open_original_page": "Buksan ang pinagmulang pahina", "account.posts": "Mga post", - "account.posts_with_replies": "Mga Post at Reply", "account.remove_from_followers": "Alisin si {name} sa mga follower", "account.report": "I-ulat si/ang @{name}", "account.requested_follow": "Hinihiling ni {name} na sundan ka", - "account.requests_to_follow_you": "Mga Request para i-fillow ka", "account.share": "Ibahagi ang profile ni @{name}", "account.show_reblogs": "Ipakita ang mga pagpapalakas mula sa/kay {name}", "account.statuses_counter": "{count,plural,one {{counter} i-post} other {{counter} mga post}}", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 110cdd1e7f9eb2..54353cb277f7fd 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -28,12 +28,10 @@ "account.block_domain": "Banna økisnavnið {domain}", "account.block_short": "Banna", "account.blocked": "Bannað/ur", - "account.blocking": "Banni", "account.cancel_follow_request": "Strika fylgjaraumbøn", "account.copy": "Avrita leinki til vangan", "account.direct": "Umrøð @{name} privat", "account.disable_notifications": "Ikki boða mær frá, tá @{name} skrivar", - "account.domain_blocking": "Banni økisnavn", "account.edit_note": "Rætta persónliga notu", "account.edit_profile": "Broyt vanga", "account.edit_profile_short": "Rætta", @@ -45,9 +43,6 @@ "account.featured": "Sermerkt", "account.featured.accounts": "Vangar", "account.featured.collections": "Søvn", - "account.featured.hashtags": "Frámerki", - "account.featured_tags.last_status_at": "Seinasta strongur skrivaður {date}", - "account.featured_tags.last_status_never": "Einki uppslag", "account.field_overflow": "Vís alt innihaldið", "account.filters.all": "Alt virksemi", "account.filters.boosts_toggle": "Vís stimbranir", @@ -102,11 +97,9 @@ "account.mute_notifications_short": "Sløkk fráboðanir", "account.mute_short": "Doyv", "account.muted": "Sløkt/ur", - "account.muting": "Doyvir", "account.mutual": "Tit fylgja hvønn annan", "account.name.help.domain": "{domain} er ambætarin, sum hýsir vangan og postarnar hjá brúkaranum.", "account.name.help.domain_self": "{domain} er tín ambætari, sum hýsir tín vanga og postar.", - "account.name.help.footer": "Eins og tú kanst senda teldubrøv til fólk, sum brúka ymiskar teldupostskipanir, so kanst tú samvirka við fólk á øðrum Mastodon ambætarum - og við ein og hvønn á øðrum sosialum appum, ið eru bygdar á sama sett av reglum, sum Mastodon brúkar (ActivityPub protokollin).", "account.name.help.header": "Eitt hald er sum ein teldupostbústaður", "account.name.help.username": "{username} er brúkaranavnið hjá hesari kontuni á teirra ambætara. Onkur á einum øðrum ambætara kann hava sama brúkaranavn.", "account.name.help.username_self": "{username} er brúkaranavnið hjá tær á hesum ambætaranum. Onkur á einum øðrum ambætara kann hava sama brúkaranavn.", @@ -122,11 +115,9 @@ "account.note.title": "Persónlig nota (einans sjónlig fyri teg)", "account.open_original_page": "Opna upprunasíðuna", "account.posts": "Uppsløg", - "account.posts_with_replies": "Uppsløg og svar", "account.remove_from_followers": "Strika {name} av fylgjaralista", "account.report": "Melda @{name}", "account.requested_follow": "{name} hevur biðið um at fylgja tær", - "account.requests_to_follow_you": "Umbønir um at fylgja tær", "account.share": "Deil vanga @{name}'s", "account.show_reblogs": "Vís stimbran frá @{name}", "account.statuses_counter": "{count, plural, one {{counter} postur} other {{counter} postar}}", @@ -145,16 +136,12 @@ "account_edit.bio.title": "Ævilýsing", "account_edit.bio_modal.add_title": "Legg ævilýsing afturat", "account_edit.bio_modal.edit_title": "Rætta ævilýsing", - "account_edit.button.add": "Legg afturat {item}", - "account_edit.button.delete": "Strika {item}", - "account_edit.button.edit": "Broyt {item}", "account_edit.column_button": "Liðugt", "account_edit.column_title": "Rætta vanga", "account_edit.custom_fields.placeholder": "Legg tíni forheiti, uttanhýsis leinki ella okkurt annað, sum tú kundi hugsað tær at deilt.", "account_edit.custom_fields.title": "Serfelt", "account_edit.display_name.placeholder": "Títt vísta navn er soleiðis sum navnið hjá tær verður víst á vanganum og á tíðarrásum.", "account_edit.display_name.title": "Víst navn", - "account_edit.featured_hashtags.item": "frámerki", "account_edit.featured_hashtags.placeholder": "Hjálp øðrum at eyðmekja og hava skjóta atgongd til tíni yndisevni.", "account_edit.featured_hashtags.title": "Sermerkt frámerki", "account_edit.name_modal.add_title": "Legg víst navn afturat", @@ -168,11 +155,8 @@ "account_edit.profile_tab.show_media.title": "Vís 'Miðlar' spjaldur", "account_edit.profile_tab.show_media_replies.description": "Tá tað er virkið, vísir Miðlar spjaldrið bæði tínar postar og svar til postar hjá øðrum.", "account_edit.profile_tab.show_media_replies.title": "Írokna svar á 'Miðlar' spjaldrinum", - "account_edit.profile_tab.subtitle": "Tillaga spjøldrini á vanganum hjá tær og tað, tey vísa.", - "account_edit.profile_tab.title": "Stillingar fyri spjøldur á vanga", "account_edit.save": "Goym", "account_edit_tags.add_tag": "Legg #{tagName} afturat", - "account_edit_tags.column_title": "Rætta sermerkt frámerki", "account_edit_tags.help_text": "Sermerkt frámerki hjálpa brúkarum at varnast og virka saman við vanga tínum. Tey síggjast sum filtur á virksemisvísingini av vanga tínum.", "account_edit_tags.search_placeholder": "Áset eitt frámerki…", "account_edit_tags.suggestions": "Uppskot:", @@ -281,7 +265,6 @@ "closed_registrations_modal.find_another_server": "Finn ein annan ambætara", "closed_registrations_modal.preamble": "Mastodon er desentraliserað, so óansæð hvar tú stovnar tína kontu, so ber til hjá tær at fylgja og virka saman við einum og hvørjum á hesum ambætaranum. Tað ber enntá til at hýsa tí sjálvi!", "closed_registrations_modal.title": "At stovna kontu á Mastodon", - "collection.share_modal.share_link_label": "Innbjóðingarleinki at deila", "collection.share_modal.share_via_post": "Posta á Mastodon", "collection.share_modal.share_via_system": "Deil til…", "collection.share_modal.title": "Deil savn", @@ -289,7 +272,6 @@ "collection.share_template_other": "Hygg at hesum kula savninum: {link}", "collection.share_template_own": "Hygg at mínum nýggja savni: {link}", "collections.account_count": "{count, plural, one {# konta} other {# kontur}}", - "collections.accounts.empty_description": "Legg afturat upp til {count} kontur, sum tú fylgir", "collections.accounts.empty_title": "Hetta savnið er tómt", "collections.collection_description": "Lýsing", "collections.collection_name": "Navn", @@ -297,38 +279,26 @@ "collections.confirm_account_removal": "Er tú vís/ur í, at tú vilt strika hesa kontuna frá hesum savninum?", "collections.content_warning": "Innihaldsávaring", "collections.continue": "Halt fram", - "collections.create.accounts_subtitle": "Einans kontur, sum tú fylgir og sum hava játtað at blíva uppdagaðar, kunnu leggjast afturat.", "collections.create.accounts_title": "Hvønn vil tú framhevja í hesum savninum?", "collections.create.basic_details_title": "Grundleggjandi smálutir", "collections.create.steps": "Stig {step}/{total}", - "collections.create_a_collection_hint": "Ger eitt savn sum kann brúkast til at viðmæla ella deila yndiskontur við øðrum.", "collections.create_collection": "Ger savn", "collections.delete_collection": "Strika savn", "collections.description_length_hint": "Í mesta lagi 100 tekn", - "collections.detail.accounts_heading": "Kontur", - "collections.detail.curated_by_author": "Snikkað til av {author}", - "collections.detail.curated_by_you": "Snikkað til av tær", "collections.detail.loading": "Innlesi savn…", "collections.detail.share": "Deil hetta savnið", "collections.edit_details": "Rætta smálutir", - "collections.error_loading_collections": "Ein feilur hendi, tá tú royndi at finna fram søvnini hjá tær.", - "collections.hints.accounts_counter": "{count} / {max} kontur", "collections.last_updated_at": "Seinast dagført: {date}", "collections.manage_accounts": "Umsit kontur", "collections.mark_as_sensitive": "Merk sum viðkvæmt", "collections.mark_as_sensitive_hint": "Fjalið lýsingina av og konturnar hjá savninum aftan fyri eina innihaldsávaring. Savnsnavnið verður framvegis sjónligt.", "collections.name_length_hint": "Í mesta lagi 40 tekn", "collections.new_collection": "Nýtt savn", - "collections.no_collections_yet": "Eingi søvn enn.", - "collections.old_last_post_note": "Postaði seinast fyri meira enn einari viku síðani", - "collections.remove_account": "Strika hesa kontuna", "collections.report_collection": "Melda hetta savnið", - "collections.search_accounts_label": "Leita eftir kontum at leggja afturat…", "collections.search_accounts_max_reached": "Tú hevur lagt afturat mesta talið av kontum", "collections.sensitive": "Viðkvæmt", "collections.topic_hint": "Legg afturat eitt frámerki, sum hjálpir øðrum at skilja høvuðevnið í hesum savninum.", "collections.view_collection": "Vís savn", - "collections.view_other_collections_by_user": "Vís hini søvnini hjá hesum brúkaranum", "collections.visibility_public": "Alment", "collections.visibility_public_hint": "Kann uppdagast í leitiúrslitum og øðrum økjum, har viðmæli síggjast.", "collections.visibility_title": "Sýni", @@ -337,7 +307,6 @@ "column.about": "Um", "column.blocks": "Bannaðir brúkarar", "column.bookmarks": "Bókamerki", - "column.collections": "Míni søvn", "column.community": "Lokal tíðarlinja", "column.create_list": "Ger lista", "column.direct": "Privatar umrøður", @@ -417,9 +386,6 @@ "confirmations.discard_draft.post.title": "Vraka kladdupostin?", "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.follow_to_collection.confirm": "Fylg og legg afturat savni", - "confirmations.follow_to_collection.message": "Tú mást fylgja {name} fyri at leggja tey afturat einum savni.", - "confirmations.follow_to_collection.title": "Fylg kontu?", "confirmations.follow_to_list.confirm": "Fylg og legg afturat lista", "confirmations.follow_to_list.message": "Tú mást fylgja {name} fyri at leggja tey afturat einum lista.", "confirmations.follow_to_list.title": "Fylg brúkara?", @@ -515,9 +481,6 @@ "emoji_button.search_results": "Leitiúrslit", "emoji_button.symbols": "Ímyndir", "emoji_button.travel": "Ferðing og støð", - "empty_column.account_featured.me": "Tú hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?", - "empty_column.account_featured.other": "{acct} hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?", - "empty_column.account_featured_other.unknown": "Hendan kontan hevur ikki tikið nakað fram enn.", "empty_column.account_hides_collections": "Hesin brúkarin hevur valt, at hesar upplýsingarnar ikki skulu vera tøkar", "empty_column.account_suspended": "Kontan gjørd óvirkin", "empty_column.account_timeline": "Einki uppslag her!", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 23ab79e5961e06..455f3ef0bb536b 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquer le domaine {domain}", "account.block_short": "Bloquer", "account.blocked": "Bloqué·e", - "account.blocking": "Bloqué·e", "account.cancel_follow_request": "Retirer cette demande d'abonnement", "account.copy": "Copier le lien du profil", "account.direct": "Mention privée @{name}", "account.disable_notifications": "Ne plus me notifier quand @{name} publie", - "account.domain_blocking": "Domaine bloqué", "account.edit_note": "Modifier la note personnelle", "account.edit_profile": "Modifier le profil", "account.edit_profile_short": "Modifier", @@ -45,9 +43,7 @@ "account.featured": "En vedette", "account.featured.accounts": "Profils", "account.featured.collections": "Collections", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Dernière publication {date}", - "account.featured_tags.last_status_never": "Aucune publication", + "account.featured.new_collection": "Nouvelle collection", "account.field_overflow": "Voir tout", "account.filters.all": "Toutes les activités", "account.filters.boosts_toggle": "Afficher les partages", @@ -73,8 +69,19 @@ "account.go_to_profile": "Voir ce profil", "account.hide_reblogs": "Masquer les boosts de @{name}", "account.in_memoriam": "En souvenir de", + "account.join_modal.day": "Jour", + "account.join_modal.me": "Vous avez rejoint {server} le", + "account.join_modal.me_anniversary": "Joyeux Fédiversaire ! Vous avez rejoint {server} le", + "account.join_modal.me_today": "C'est votre premier jour sur {server} !", + "account.join_modal.other": "{name} a rejoint {server} le", + "account.join_modal.other_today": "C'est le premier jour de {name} sur {server} !", + "account.join_modal.share.celebrate": "Partager un message de célébration", + "account.join_modal.share.intro": "Partager un message d'introduction", + "account.join_modal.share.welcome": "Partager un message de bienvenue", + "account.join_modal.years": "{number, plural, one {an} other {ans}}", "account.joined_short": "Inscrit·e", "account.languages": "Changer les langues abonnées", + "account.last_active": "Dernière activité", "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Le statut de confidentialité de ce compte est privé. Son propriétaire vérifie manuellement qui peut le/la suivre.", "account.media": "Média", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Rendre les notifications muettes", "account.mute_short": "Rendre muet", "account.muted": "Masqué·e", - "account.muting": "Masqué", "account.mutual": "Vous vous suivez mutuellement", + "account.name.copy": "Copier l’identifiant", "account.name.help.domain": "{domain} est le serveur qui héberge le profil et les messages du compte.", "account.name.help.domain_self": "{domain} est le serveur qui héberge votre profil et vos messages.", - "account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents logiciels de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon — et avec n'importe qui sur d'autres applications sociales propulsées par le même ensemble de règles que Mastodon utilise (le protocole ActivityPub).", + "account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents fournisseurs de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon, ainsi qu'avec n'importe qui utilisant une application sociale compatible avec Mastodon.", "account.name.help.header": "Un identifiant est comme une adresse de courriel", "account.name.help.username": "{username} est le nom d'utilisateur·ice de ce compte sur son serveur. Quelqu'un sur un autre serveur peut avoir le même nom.", "account.name.help.username_self": "{username} est votre nom d'utilisateur·ice sur ce serveur. Quelqu'un sur un autre serveur peut avoir le même nom.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Modifier", "account.note.title": "Note personnelle (visible uniquement pour vous)", "account.open_original_page": "Ouvrir la page d'origine", + "account.pending": "En attente", "account.posts": "Publications", - "account.posts_with_replies": "Publications et réponses", "account.remove_from_followers": "Retirer {name} des abonnés", "account.report": "Signaler @{name}", "account.requested_follow": "{name} a demandé à vous suivre", - "account.requests_to_follow_you": "Demande à vous suivre", "account.share": "Partager le profil de @{name}", "account.show_reblogs": "Afficher les boosts de @{name}", "account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}", @@ -141,35 +147,43 @@ "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications_short": "Ne plus masquer les notifications", "account.unmute_short": "Ne plus masquer", - "account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.", + "account_edit.advanced_settings.bot_hint": "Indique que le compte effectue principalement des actions automatisées et pourrait ne pas être surveillé", + "account_edit.advanced_settings.bot_label": "Compte robot", + "account_edit.advanced_settings.title": "Paramètres avancés", + "account_edit.bio.add_label": "Ajouter une présentation", + "account_edit.bio.edit_label": "Modifier la présentation", + "account_edit.bio.placeholder": "Ajouter une courte présentation pour aider les autres à vous connaître.", "account_edit.bio.title": "Présentation", "account_edit.bio_modal.add_title": "Ajouter une présentation", "account_edit.bio_modal.edit_title": "Modifier la présentation", - "account_edit.button.add": "Ajouter {item}", - "account_edit.button.delete": "Supprimer {item}", - "account_edit.button.edit": "Modifier {item}", "account_edit.column_button": "Terminé", "account_edit.column_title": "Modifier le profil", - "account_edit.custom_fields.name": "champ", + "account_edit.custom_fields.add_label": "Ajouter un champ", + "account_edit.custom_fields.edit_label": "Modifier le champ", "account_edit.custom_fields.placeholder": "Ajouter vos pronoms, vos sites, ou tout ce que vous voulez partager.", "account_edit.custom_fields.reorder_button": "Réorganiser les champs", "account_edit.custom_fields.tip_content": "Vous pouvez facilement ajouter de la crédibilité à votre compte Mastodon en vérifiant les liens vers tous les sites Web que vous possédez.", "account_edit.custom_fields.tip_title": "Astuce : ajout de liens vérifiés", "account_edit.custom_fields.title": "Champs personnalisés", "account_edit.custom_fields.verified_hint": "Comment ajouter un lien vérifié ?", + "account_edit.display_name.add_label": "Ajouter un nom public", + "account_edit.display_name.edit_label": "Modifier le nom public", "account_edit.display_name.placeholder": "Votre nom public est le nom qui apparaît sur votre profil et dans les fils d'actualités.", "account_edit.display_name.title": "Nom public", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Ajouter des hashtags", "account_edit.featured_hashtags.placeholder": "Aider les autres à identifier et à accéder rapidement à vos sujets préférés.", "account_edit.featured_hashtags.title": "Hashtags mis en avant", + "account_edit.field_actions.delete": "Supprimer le champ", + "account_edit.field_actions.edit": "Modifier le champ", "account_edit.field_delete_modal.confirm": "Voulez-vous vraiment supprimer ce champ personnalisé ? Cette action ne peut pas être annulée.", "account_edit.field_delete_modal.delete_button": "Supprimer", "account_edit.field_delete_modal.title": "Supprimer le champ personnalisé ?", "account_edit.field_edit_modal.add_title": "Ajouter un champ personnalisé", + "account_edit.field_edit_modal.discard_confirm": "Abandonner", + "account_edit.field_edit_modal.discard_message": "Vos modifications n’ont pas été enregistrées. Voulez-vous vraiment les abandonner ?", "account_edit.field_edit_modal.edit_title": "Modifier un champ personnalisé", - "account_edit.field_edit_modal.limit_header": "Limite de caractères recommandée dépassée", - "account_edit.field_edit_modal.limit_message": "L'affichage du champ peut être tronqué sur les téléphones.", - "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émoji personnalisé avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", + "account_edit.field_edit_modal.length_warning": "Le nombre de caractères dépasse la limite recommandée. Le champ peut ne pas s'afficher entièrement sur les téléphones.", + "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émojis personnalisés avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", "account_edit.field_edit_modal.name_hint": "Par exemple « Site Web personnel »", "account_edit.field_edit_modal.name_label": "Libellé", "account_edit.field_edit_modal.url_warning": "Pour ajouter un lien, veuillez inclure {protocol} au début.", @@ -197,10 +211,12 @@ "account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif", "account_edit.image_edit.remove_button": "Supprimer l’image", "account_edit.image_edit.replace_button": "Remplacer l'image", + "account_edit.item_list.delete": "Supprimer {name}", + "account_edit.item_list.edit": "Modifier {name}", "account_edit.name_modal.add_title": "Ajouter un nom public", "account_edit.name_modal.edit_title": "Modifier le nom public", "account_edit.profile_tab.button_label": "Personnaliser", - "account_edit.profile_tab.hint.description": "Ces paramètres personnalisent ce que les personnes voient sur {server} dans les applications officielles, mais ils peuvent ne pas s'appliquer aux personnes sur d'autres serveurs ou utilisant une application tiers.", + "account_edit.profile_tab.hint.description": "Ces paramètres personnalisent ce que les personnes voient sur {server} dans les applications officielles, mais ils peuvent ne pas s'appliquer aux personnes sur d'autres serveurs ou utilisant une application tierce.", "account_edit.profile_tab.hint.title": "L'affichage peut varier", "account_edit.profile_tab.show_featured.description": "« En vedette » est un onglet facultatif où vous pouvez mettre en avant d'autres comptes.", "account_edit.profile_tab.show_featured.title": "Afficher l'onglet « En vedette »", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Afficher l'onglet « Média »", "account_edit.profile_tab.show_media_replies.description": "En activant cette option l'onglet « Média » affiche à la fois vos messages et vos réponses aux messages d'autres personnes.", "account_edit.profile_tab.show_media_replies.title": "Inclure les réponses dans l'onglet « Média »", - "account_edit.profile_tab.subtitle": "Personnaliser les onglets de votre profil et leur contenu.", - "account_edit.profile_tab.title": "Paramètres de l'onglet du profil", "account_edit.save": "Enregistrer", "account_edit.upload_modal.back": "Retour", "account_edit.upload_modal.done": "Terminé", @@ -219,21 +233,25 @@ "account_edit.upload_modal.step_upload.dragging": "Déposer pour téléverser", "account_edit.upload_modal.step_upload.header": "Choisir une image", "account_edit.upload_modal.step_upload.hint": "Format WebP, PNG, GIF ou JPEG, jusqu'à {limit} Mo.{br}L'image sera redimensionnée à {width} × {height} px.", - "account_edit.upload_modal.title_add": "Ajouter une photo de profil", - "account_edit.upload_modal.title_replace": "Remplacer la photo de profil", - "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", - "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", + "account_edit.upload_modal.title_add.avatar": "Ajouter une photo de profil", + "account_edit.upload_modal.title_add.header": "Ajouter une photo de couverture", + "account_edit.upload_modal.title_replace.avatar": "Remplacer la photo de profil", + "account_edit.upload_modal.title_replace.header": "Remplacer la photo de couverture", + "account_edit.verified_modal.details": "Ajoutez de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", + "account_edit.verified_modal.invisible_link.details": "Ajoutez le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", - "account_edit.verified_modal.step1.header": "Copier-coller le code HTML ci-dessous dans l'en-tête de votre site web", + "account_edit.verified_modal.step1.header": "Copiez le code HTML ci-dessous dans l'en-tête de votre site Web", "account_edit.verified_modal.step2.details": "Si vous avez déjà ajouté votre site Web en tant que champ personnalisé, vous devrez le supprimer et le rajouter pour déclencher la vérification.", - "account_edit.verified_modal.step2.header": "Ajouter votre site Web en tant que champ personnalisé", + "account_edit.verified_modal.step2.header": "Ajoutez votre site Web en tant que champ personnalisé", "account_edit.verified_modal.title": "Comment ajouter un lien vérifié ?", "account_edit_tags.add_tag": "Ajouter #{tagName}", - "account_edit_tags.column_title": "Modifier les hashtags mis en avant", + "account_edit_tags.column_title": "Modifier les hashtags", "account_edit_tags.help_text": "Les hashtags mis en avant aident les personnes à découvrir et interagir avec votre profil. Ils apparaissent comme des filtres dans la vue « Activité » de votre profil.", + "account_edit_tags.max_tags_reached": "Vous avez atteint le nombre maximum de hashtags mis en avant.", "account_edit_tags.search_placeholder": "Saisir un hashtag…", "account_edit_tags.suggestions": "Suggestions :", "account_edit_tags.tag_status_count": "{count, plural, one {# message} other {# messages}}", + "account_list.total": "{total, plural, one {# compte} other {# comptes}}", "account_note.placeholder": "Cliquez pour ajouter une note", "admin.dashboard.daily_retention": "Taux de rétention des comptes par jour après inscription", "admin.dashboard.monthly_retention": "Taux de rétention des comptes par mois après inscription", @@ -308,14 +326,14 @@ "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.", "block_modal.show_less": "Afficher moins", "block_modal.show_more": "Afficher plus", - "block_modal.they_cant_mention": "Il ne peut pas vous mentionner ou vous suivre.", - "block_modal.they_cant_see_posts": "Il ne peut plus voir vos messages et vous ne verrez plus les siens.", - "block_modal.they_will_know": "Il peut voir qu'il est bloqué.", - "block_modal.title": "Bloquer le compte ?", - "block_modal.you_wont_see_mentions": "Vous ne verrez pas les messages qui le mentionne.", + "block_modal.they_cant_mention": "Iel ne pourra plus vous mentionner ou vous suivre.", + "block_modal.they_cant_see_posts": "Iel ne pourra plus voir vos messages et vous ne verrez plus les siens.", + "block_modal.they_will_know": "Iel pourra voir qu'iel est bloqué·e.", + "block_modal.title": "Bloquer l'utilisateur·ice ?", + "block_modal.you_wont_see_mentions": "Vous ne verrez plus les messages qui le ou la mentionnent.", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour sauter ceci la prochaine fois", - "boost_modal.reblog": "Booster le message ?", - "boost_modal.undo_reblog": "Annuler le boost du message ?", + "boost_modal.reblog": "Partager le message ?", + "boost_modal.undo_reblog": "Annuler le partage du message ?", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela pourrait être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", "bundle_column_error.error.title": "Oh non!", @@ -330,7 +348,7 @@ "bundle_modal_error.retry": "Réessayer", "callout.dismiss": "Rejeter", "carousel.current": "Diapositive {current, number} / {max, number}", - "carousel.slide": "Diapositive {current, number} de {max, number}", + "carousel.slide": "Diapositive {current, number} sur {max, number}", "character_counter.recommended": "{currentLength}/{maxLength} caractères recommandés", "character_counter.required": "{currentLength}/{maxLength} caractères", "closed_registrations.other_server_instructions": "Puisque Mastodon est décentralisé, vous pouvez créer un compte sur un autre serveur et interagir quand même avec celui-ci.", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Trouver un autre serveur", "closed_registrations_modal.preamble": "Mastodon est décentralisé, donc peu importe où vous créez votre compte, vous serez en mesure de suivre et d'interagir avec quiconque sur ce serveur. Vous pouvez même l'héberger vous-même!", "closed_registrations_modal.title": "S'inscrire sur Mastodon", - "collection.share_modal.share_link_label": "Lien à partager", + "collection.share_modal.share_link_label": "Partager le lien", "collection.share_modal.share_via_post": "Publier sur Mastodon", "collection.share_modal.share_via_system": "Partager avec…", "collection.share_modal.title": "Partager la collection", @@ -346,8 +364,11 @@ "collection.share_template_other": "Découvrez cette collection incroyable : {link}", "collection.share_template_own": "Découvrez ma nouvelle collection : {link}", "collections.account_count": "{count, plural, one {# compte} other {# comptes}}", - "collections.accounts.empty_description": "Ajouter jusqu'à {count} comptes que vous suivez", + "collections.accounts.empty_description": "Ajoutez jusqu'à {count} comptes", + "collections.accounts.empty_editor_title": "Il n'y a personne dans cette collection", "collections.accounts.empty_title": "Cette collection est vide", + "collections.block_collection_owner": "Bloquer le compte", + "collections.by_account": "par {account_handle}", "collections.collection_description": "Description", "collections.collection_language": "Langue", "collections.collection_language_none": "Aucune", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Voulez-vous vraiment supprimer ce compte de la collection ?", "collections.content_warning": "Avertissement au public", "collections.continue": "Continuer", - "collections.create.accounts_subtitle": "Seuls les comptes que vous suivez et qui ont autorisé leur découverte peuvent être ajoutés.", + "collections.copy_link": "Copier le lien", + "collections.copy_link_confirmation": "Lien de la collection copié dans le presse-papiers", "collections.create.accounts_title": "Qui voulez-vous mettre en avant dans cette collection ?", "collections.create.basic_details_title": "Informations générales", "collections.create.steps": "Étape {step}/{total}", - "collections.create_a_collection_hint": "Créer une collection pour recommander ou partager vos comptes préférés.", "collections.create_collection": "Créer une collection", "collections.delete_collection": "Supprimer la collection", "collections.description_length_hint": "Maximum 100 caractères", - "collections.detail.accept_inclusion": "D'accord", - "collections.detail.accounts_heading": "Comptes", - "collections.detail.author_added_you": "{author} vous a ajouté·e à cette collection", - "collections.detail.curated_by_author": "Organisée par {author}", - "collections.detail.curated_by_you": "Organisée par vous", + "collections.detail.author_added_you_on_date": "{author} vous a ajouté·e le {date}", "collections.detail.loading": "Chargement de la collection…", - "collections.detail.other_accounts_in_collection": "Autres comptes dans cette collection :", "collections.detail.revoke_inclusion": "Me retirer", + "collections.detail.sensitive_content": "Contenu sensible", "collections.detail.sensitive_note": "Cette collection contient des comptes et du contenu qui peut être sensibles.", "collections.detail.share": "Partager la collection", + "collections.detail.you_are_in_this_collection": "Vous faites partie de cette collection", "collections.edit_details": "Modifier les détails", - "collections.error_loading_collections": "Une erreur s'est produite durant le chargement de vos collections.", - "collections.hints.accounts_counter": "{count} / {max} comptes", + "collections.hidden_accounts_description": "Vous avez bloqué ou masqué {count, plural, one {ce compte} other {ces comptes}}", + "collections.hidden_accounts_link": "{count, plural, one {# compte caché} other {# comptes cachés}}", + "collections.hints.accounts_counter": "{count}/{max} comptes", "collections.last_updated_at": "Dernière mise à jour : {date}", + "collections.list.collections_with_count": "{count, plural, one {# collection} other {# collections}}", + "collections.list.created_by_author": "Créée par {name}", + "collections.list.created_by_you": "Créées par vous", + "collections.list.featuring_you": "Avec vous", "collections.manage_accounts": "Gérer les comptes", "collections.mark_as_sensitive": "Marquer comme sensible", "collections.mark_as_sensitive_hint": "Masque la description et les comptes de la collection derrière un avertissement au public. Le titre reste visible.", + "collections.maximum_collection_count_description": "Votre serveur permet la création de {count} collections au maximum.", + "collections.maximum_collection_count_reached": "Vous avez créé le nombre maximum de collections", "collections.name_length_hint": "Maximum 40 caractères", "collections.new_collection": "Nouvelle collection", - "collections.no_collections_yet": "Aucune collection pour le moment.", - "collections.old_last_post_note": "Dernière publication il y a plus d'une semaine", - "collections.remove_account": "Supprimer ce compte", + "collections.pending_accounts.message": "Des comptes peuvent apparaître en attente lorsque nous attendons une réponse de l'utilisateur·ice ou de son serveur. Les comptes en attente sont visibles uniquement pour vous.", + "collections.pending_accounts.title": "Pourquoi est-ce que je vois des comptes en attente ?", + "collections.remove_account": "Supprimer", "collections.report_collection": "Signaler cette collection", "collections.revoke_collection_inclusion": "Me retirer de cette collection", "collections.revoke_inclusion.confirmation": "Vous avez été retiré·e de « {collection} »", "collections.revoke_inclusion.error": "Une erreur s'est produite, veuillez réessayer plus tard.", - "collections.search_accounts_label": "Chercher des comptes à ajouter…", + "collections.search_accounts_label": "Recherchez un compte à ajouter", "collections.search_accounts_max_reached": "Vous avez ajouté le nombre maximum de comptes", "collections.sensitive": "Sensible", + "collections.share_short": "Partager", + "collections.suggestions.can_not_add": "Ne peut pas être ajouté", + "collections.suggestions.can_not_add_desc": "Ces comptes peuvent avoir choisi de ne pas être découverts, ou ils peuvent être sur un serveur qui ne supporte pas les collections.", + "collections.suggestions.must_follow": "Vous devez d'abord suivre", + "collections.suggestions.must_follow_desc": "Ces comptes valident leurs demandes d'abonnements. Les abonné·e·s peuvent les ajouter aux collections.", "collections.topic_hint": "Ajouter un hashtag pour aider les autres personnes à comprendre le sujet de la collection.", "collections.topic_special_chars_hint": "Les caractères spéciaux seront supprimés lors de l'enregistrement", + "collections.unlisted_collections_description": "Celles-ci n'apparaissent pas sur votre profil. N'importe qui ayant leur lien peut les découvrir.", + "collections.unlisted_collections_with_count": "Collections non listées ({count})", "collections.view_collection": "Voir la collection", - "collections.view_other_collections_by_user": "Voir les autres collections par ce compte", "collections.visibility_public": "Publique", "collections.visibility_public_hint": "Visible dans les résultats de recherche et les recommandations.", "collections.visibility_title": "Visibilité", @@ -405,7 +436,6 @@ "column.about": "À propos", "column.blocks": "Comptes bloqués", "column.bookmarks": "Signets", - "column.collections": "Mes collections", "column.community": "Fil local", "column.create_list": "Créer une liste", "column.direct": "Mention privée", @@ -422,8 +452,10 @@ "column.lists": "Listes", "column.mutes": "Comptes masqués", "column.notifications": "Notifications", + "column.other_collections": "Les collections par {name}", "column.pins": "Publications épinglés", "column.public": "Fil global", + "column.your_collections": "Vos collections", "column_back_button.label": "Retour", "column_header.hide_settings": "Cacher les paramètres", "column_header.moveLeft_settings": "Déplacer cette colonne vers la gauche", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Abandonner votre brouillon ?", "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.follow_to_collection.confirm": "Suivre et ajouter à la collection", - "confirmations.follow_to_collection.message": "Vous devez suivre {name} pour l'ajouter à une collection.", - "confirmations.follow_to_collection.title": "Suivre le compte ?", "confirmations.follow_to_list.confirm": "Suivre et ajouter à la liste", "confirmations.follow_to_list.message": "Vous devez suivre {name} pour l'ajouter à une liste.", "confirmations.follow_to_list.title": "Suivre l'utilisateur·rice ?", + "confirmations.hide_featured_tab.confirm": "Cacher l'onglet", + "confirmations.hide_featured_tab.intro": "Vous pouvez modifier ce paramétrage à tout moment depuis Modifier le profil > Paramètres de l'onglet du profil.", + "confirmations.hide_featured_tab.message": "Cela masquera l'onglet pour les utilisateur·rice·s de {serverName} et des autres serveurs utilisant la dernière version de Mastodon. Pour les autres l'affichage peut varier.", + "confirmations.hide_featured_tab.title": "Cacher l'onglet « En vedette » ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter?", "confirmations.logout.title": "Se déconnecter ?", @@ -529,6 +562,7 @@ "content_warning.hide": "Masquer le message", "content_warning.show": "Montrer quand même", "content_warning.show_more": "Montrer plus", + "content_warning.show_short": "Afficher", "conversation.delete": "Supprimer cette conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher cette conversation", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.", "domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.", "dropdown.empty": "Sélectionner une option", + "email_subscriptions.email": "Adresse de courriel", + "email_subscriptions.form.action": "S’abonner", + "email_subscriptions.form.bottom": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon. Désabonnez-vous quand vous voulez. Pour plus d’information, se référer à la politique de confidentialité.", + "email_subscriptions.form.title": "Abonnez-vous pour recevoir par courriel les notifications de {name}", + "email_subscriptions.submitted.lead": "Vérifiez votre boîte de réception pour finaliser de votre inscription aux notifications par courriel.", + "email_subscriptions.submitted.title": "Une dernière chose", + "email_subscriptions.validation.email.blocked": "Fournisseur de messagerie bloqué", + "email_subscriptions.validation.email.invalid": "Adresse de courriel invalide", "embed.instructions": "Intégrez cette publication à votre site en copiant le code ci-dessous.", "embed.preview": "Voici comment il apparaîtra:", "emoji_button.activity": "Activité", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Résultats", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Voyage et lieux", - "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", - "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", - "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.", + "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant.", + "empty_column.account_featured_self.no_collections_button": "Créer une collection", + "empty_column.account_featured_self.no_collections_hide_tab": "Cacher cet onglet", + "empty_column.account_featured_self.pre_collections": "Restez connecté pour les collections", + "empty_column.account_featured_self.pre_collections_desc": "Les collections (à venir dans Mastodon 4.6) permettent d'organiser vos propres listes de comptes à recommander aux autres.", + "empty_column.account_featured_self.showcase_accounts": "Présentez vos comptes préférés", + "empty_column.account_featured_self.showcase_accounts_desc": "Les collections sont des listes de comptes sélectionnés pour aider les autres à découvrir le Fédivers.", + "empty_column.account_featured_unknown.other": "Ce compte n'a mis aucun contenu en avant pour l'instant.", "empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations", "empty_column.account_suspended": "Compte suspendu", "empty_column.account_timeline": "Aucune publication ici!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Qui suivre", "followed_tags": "Hashtags suivis", "followers.hide_other_followers": "Ce compte a choisi de ne pas rendre visible ses autres abonné·e·s", + "followers.title": "Suit {name}", "following.hide_other_following": "Ce compte a choisi de ne pas rendre visible ses autres abonnements", + "following.title": "Suivi·e par {name}", "footer.about": "À propos", "footer.about_mastodon": "À propos de Mastodon", "footer.about_server": "À propos de {domain}", @@ -686,12 +735,13 @@ "footer.source_code": "Voir le code source", "footer.status": "État", "footer.terms_of_service": "Conditions d’utilisation", + "form_error.blank": "Le champ ne peut pas être vide.", "form_field.optional": "(facultatif)", "generic.saved": "Sauvegardé", "getting_started.heading": "Pour commencer", "hashtag.admin_moderation": "Ouvrir l'interface de modération pour #{name}", - "hashtag.browse": "Parcourir les posts dans #{hashtag}", - "hashtag.browse_from_account": "Parcourir les posts de @{name} dans #{hashtag}", + "hashtag.browse": "Parcourir les messages dans #{hashtag}", + "hashtag.browse_from_account": "Parcourir les messages de @{name} dans #{hashtag}", "hashtag.column_header.tag_mode.all": "et {additional}", "hashtag.column_header.tag_mode.any": "ou {additional}", "hashtag.column_header.tag_mode.none": "sans {additional}", @@ -773,7 +823,7 @@ "keyboard_shortcuts.open_media": "Ouvrir média", "keyboard_shortcuts.pinned": "Ouvrir la liste de publications épinglés", "keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur·rice", - "keyboard_shortcuts.quote": "Citer la publication", + "keyboard_shortcuts.quote": "Citer le message", "keyboard_shortcuts.reply": "Répondre au message", "keyboard_shortcuts.requests": "Ouvrir la liste de demandes d’abonnement", "keyboard_shortcuts.search": "Focuser sur le champ de recherche", @@ -802,15 +852,15 @@ "lists.add_to_list": "Ajouter à la liste", "lists.add_to_lists": "Ajouter {name} aux listes", "lists.create": "Créer", - "lists.create_a_list_to_organize": "Créer une nouvelle liste pour organiser votre Page d'accueil", + "lists.create_a_list_to_organize": "Créer une nouvelle liste pour organiser votre fil d'actualité", "lists.create_list": "Créer une liste", "lists.delete": "Supprimer la liste", "lists.done": "Terminé", "lists.edit": "Modifier la liste", - "lists.exclusive": "Cacher les membres de la page d'accueil", - "lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil pour éviter de voir leurs messages deux fois.", + "lists.exclusive": "Cacher les membres du fil d'actualité", + "lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil d'actualité pour éviter de voir leurs messages deux fois.", "lists.find_users_to_add": "Trouver des utilisateurs à ajouter", - "lists.list_members_count": "{count, plural, one {# member} other {# members}}", + "lists.list_members_count": "{count, plural, one {# membre} other {# membres}}", "lists.list_name": "Nom de la liste", "lists.new_list_name": "Nom de la nouvelle liste", "lists.no_lists_yet": "Aucune liste pour l'instant.", @@ -831,11 +881,11 @@ "mute_modal.hide_options": "Masquer les options", "mute_modal.indefinite": "Jusqu'à ce que je l'affiche à nouveau", "mute_modal.show_options": "Afficher les options", - "mute_modal.they_can_mention_and_follow": "Il peut vous mentionner et vous suivre, mais vous ne le verrez pas.", - "mute_modal.they_wont_know": "Il ne saura pas qu'il est masqué.", - "mute_modal.title": "Masquer le compte ?", - "mute_modal.you_wont_see_mentions": "Vous ne verrez pas les messages le mentionnant.", - "mute_modal.you_wont_see_posts": "Il peut toujours voir vos messages, mais vous ne verrez pas les siens.", + "mute_modal.they_can_mention_and_follow": "Iel pourra vous mentionner et vous suivre, mais vous ne le verrez pas.", + "mute_modal.they_wont_know": "Iel ne saura pas qu'iel est masqué·e.", + "mute_modal.title": "Masquer l'utilisateur·ice ?", + "mute_modal.you_wont_see_mentions": "Vous ne verrez plus les messages qui le ou la mentionnent.", + "mute_modal.you_wont_see_posts": "Iel pourra toujours voir vos messages, mais vous ne verrez plus les siens.", "navigation_bar.about": "À propos", "navigation_bar.account_settings": "Mot de passe et sécurité", "navigation_bar.administration": "Administration", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Développer le menu des hashtags suivis", "navigation_panel.expand_lists": "Développer le menu de la liste", "not_signed_in_indicator.not_signed_in": "Vous devez vous connecter pour accéder à cette ressource.", + "notification.added_to_collection": "{name} vous a ajouté·e à une collection", "notification.admin.report": "{name} a signalé {target}", "notification.admin.report_account": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target} pour {category}", "notification.admin.report_account_other": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} et {count, plural, one {# autre} other {# autres}} se sont inscrit", "notification.annual_report.message": "Votre {year} #Wrapstodon attend ! Dévoilez les moments forts et mémorables de votre année sur Mastodon !", "notification.annual_report.view": "Voir #Wrapstodon", + "notification.collection_update": "{name} a modifié une collection dans laquelle vous figurez", "notification.favourite": "{name} a ajouté votre publication à ses favoris", "notification.favourite.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont mis votre message en favori", "notification.favourite_pm": "{name} a mis votre mention privée en favori", @@ -889,7 +941,7 @@ "notification.label.mention": "Mention", "notification.label.private_mention": "Mention privée", "notification.label.private_reply": "Réponse privée", - "notification.label.quote": "{name} a cité votre publication", + "notification.label.quote": "{name} a cité votre message", "notification.label.reply": "Réponse", "notification.mention": "Mention", "notification.mentioned_you": "{name} vous a mentionné·e", @@ -904,9 +956,9 @@ "notification.moderation_warning.action_suspend": "Votre compte a été suspendu.", "notification.own_poll": "Votre sondage est terminé", "notification.poll": "Un sondage auquel vous avez participé vient de se terminer", - "notification.quoted_update": "{name} a modifié une publication que vous avez cité", + "notification.quoted_update": "{name} a modifié un message que vous avez cité", "notification.reblog": "{name} a boosté votre message", - "notification.reblog.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont boosté votre message", + "notification.reblog.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont 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.", "notification.relationships_severance_event.domain_block": "Un·e administrateur·rice de {from} en a bloqué {target}, comprenant {followersCount} de vos abonné·e·s et {followingCount, plural, one {# compte} other {# comptes}} vous suivez.", @@ -1003,7 +1055,7 @@ "onboarding.profile.note_hint": "Vous pouvez @mentionner d'autres personnes ou #hashtags…", "onboarding.profile.title": "Configuration du profil", "onboarding.profile.upload_avatar": "Importer une photo de profil", - "onboarding.profile.upload_header": "Importer un entête de profil", + "onboarding.profile.upload_header": "Importer une image de couverture", "password_confirmation.exceeds_maxlength": "La confirmation du mot de passe dépasse la longueur maximale du mot de passe", "password_confirmation.mismatching": "Les deux mots de passe ne correspondent pas", "picture_in_picture.restore": "Remettre en place", @@ -1018,7 +1070,7 @@ "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Changer la confidentialité des messages", - "privacy.direct.long": "Toutes les personnes mentionnées dans le post", + "privacy.direct.long": "Seulement les personnes mentionnées dans le message", "privacy.direct.short": "Mention privée", "privacy.private.long": "Seulement vos abonnés", "privacy.private.short": "Abonnés", @@ -1036,7 +1088,7 @@ "quote_error.poll": "Les citations ne sont pas autorisées avec les sondages.", "quote_error.private_mentions": "La citation n'est pas autorisée avec les mentions privées.", "quote_error.quote": "Une seule citation à la fois est autorisée.", - "quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer cette publication.", + "quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer ce message.", "quote_error.upload": "La citation n'est pas autorisée avec un média joint.", "recommended": "Recommandé", "refresh": "Actualiser", @@ -1136,11 +1188,12 @@ "search_results.no_search_yet": "Essayez de rechercher des messages, des profils ou des hashtags.", "search_results.see_all": "Afficher tout", "search_results.statuses": "Publications", - "search_results.title": "Résultat de Recherche pour \"{q}\"", + "search_results.title": "Résultats pour « {q} »", "server_banner.about_active_users": "Personnes utilisant ce serveur au cours des 30 derniers jours (Comptes actifs mensuellement)", "server_banner.active_users": "comptes actifs", "server_banner.administered_by": "Administré par:", "server_banner.is_one_of_many": "{domain} est l'un des nombreux serveurs Mastodon indépendants que vous pouvez utiliser pour participer au fédivers.", + "server_banner.more_about_this_server": "En savoir plus sur ce serveur", "server_banner.server_stats": "Statistiques du serveur:", "sign_in_banner.create_account": "Créer un compte", "sign_in_banner.follow_anyone": "Suivez n'importe qui à travers le fédivers et affichez tout dans un ordre chronologique. Ni algorithmes, ni publicités, ni appâts à clics en perspective.", @@ -1301,9 +1354,9 @@ "visibility_modal.helper.direct_quoting": "Les mentions privées rédigées sur Mastodon ne peuvent pas être citées par d'autres personnes.", "visibility_modal.helper.privacy_editing": "La visibilité ne peut pas être modifiée après la publication d'un message.", "visibility_modal.helper.privacy_private_self_quote": "Les auto-citations de messages privés ne peuvent pas être rendues publiques.", - "visibility_modal.helper.private_quoting": "Les posts accessible uniquement par les followers sur Mastodon ne peuvent être cités par d'autres personnes.", + "visibility_modal.helper.private_quoting": "Les messages accessibles uniquement aux abonné·es publiés sur Mastodon ne peuvent être cités par d'autres personnes.", "visibility_modal.helper.unlisted_quoting": "Lorsque les gens vous citent, leur message sera également caché des fils tendances.", - "visibility_modal.instructions": "Contrôlez qui peut interagir avec ce post. Vous pouvez également appliquer ces paramètres à tous les futurs messages en allant dans Préférences > Valeurs par défaut de publication.", + "visibility_modal.instructions": "Contrôlez qui peut interagir avec ce message. Vous pouvez également appliquer ces paramètres à tous les futurs messages en allant dans Préférences > Paramètres de publication par défaut.", "visibility_modal.privacy_label": "Visibilité", "visibility_modal.quote_followers": "Abonné·e·s seulement", "visibility_modal.quote_label": "Autoriser les citations pour", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 9f0c6e78bc1324..ae425aefde5e1f 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -19,7 +19,7 @@ "account.add_or_remove_from_list": "Ajouter ou retirer des listes", "account.badges.admin": "Admin", "account.badges.blocked": "Bloqué·e", - "account.badges.bot": "Bot", + "account.badges.bot": "Robot", "account.badges.domain_blocked": "Domaine bloqué", "account.badges.group": "Groupe", "account.badges.muted": "Masqué·e", @@ -28,12 +28,10 @@ "account.block_domain": "Bloquer le domaine {domain}", "account.block_short": "Bloquer", "account.blocked": "Bloqué·e", - "account.blocking": "Bloqué·e", "account.cancel_follow_request": "Annuler l'abonnement", "account.copy": "Copier le lien du profil", "account.direct": "Mentionner @{name} en privé", "account.disable_notifications": "Ne plus me notifier les publications de @{name}", - "account.domain_blocking": "Domaine bloqué", "account.edit_note": "Modifier la note personnelle", "account.edit_profile": "Modifier le profil", "account.edit_profile_short": "Modifier", @@ -45,9 +43,7 @@ "account.featured": "En vedette", "account.featured.accounts": "Profils", "account.featured.collections": "Collections", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Dernier message le {date}", - "account.featured_tags.last_status_never": "Aucun message", + "account.featured.new_collection": "Nouvelle collection", "account.field_overflow": "Voir tout", "account.filters.all": "Toutes les activités", "account.filters.boosts_toggle": "Afficher les partages", @@ -73,8 +69,19 @@ "account.go_to_profile": "Voir le profil", "account.hide_reblogs": "Masquer les partages de @{name}", "account.in_memoriam": "En mémoire.", + "account.join_modal.day": "Jour", + "account.join_modal.me": "Vous avez rejoint {server} le", + "account.join_modal.me_anniversary": "Joyeux Fédiversaire ! Vous avez rejoint {server} le", + "account.join_modal.me_today": "C'est votre premier jour sur {server} !", + "account.join_modal.other": "{name} a rejoint {server} le", + "account.join_modal.other_today": "C'est le premier jour de {name} sur {server} !", + "account.join_modal.share.celebrate": "Partager un message de célébration", + "account.join_modal.share.intro": "Partager un message d'introduction", + "account.join_modal.share.welcome": "Partager un message de bienvenue", + "account.join_modal.years": "{number, plural, one {an} other {ans}}", "account.joined_short": "Ici depuis", "account.languages": "Modifier les langues d'abonnements", + "account.last_active": "Dernière activité", "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Ce compte est privé. Son ou sa propriétaire approuve manuellement qui peut le suivre.", "account.media": "Médias", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Désactiver les notifications", "account.mute_short": "Masquer", "account.muted": "Masqué·e", - "account.muting": "Masqué", "account.mutual": "Vous vous suivez mutuellement", + "account.name.copy": "Copier l’identifiant", "account.name.help.domain": "{domain} est le serveur qui héberge le profil et les messages du compte.", "account.name.help.domain_self": "{domain} est le serveur qui héberge votre profil et vos messages.", - "account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents logiciels de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon — et avec n'importe qui sur d'autres applications sociales propulsées par le même ensemble de règles que Mastodon utilise (le protocole ActivityPub).", + "account.name.help.footer": "Tout comme vous pouvez envoyer des courriels à des personnes utilisant différents fournisseurs de messagerie, vous pouvez interagir avec des personnes sur d'autres serveurs Mastodon, ainsi qu'avec n'importe qui utilisant une application sociale compatible avec Mastodon.", "account.name.help.header": "Un identifiant est comme une adresse de courriel", "account.name.help.username": "{username} est le nom d'utilisateur·ice de ce compte sur son serveur. Quelqu'un sur un autre serveur peut avoir le même nom.", "account.name.help.username_self": "{username} est votre nom d'utilisateur·ice sur ce serveur. Quelqu'un sur un autre serveur peut avoir le même nom.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Modifier", "account.note.title": "Note personnelle (visible uniquement pour vous)", "account.open_original_page": "Ouvrir la page d'origine", + "account.pending": "En attente", "account.posts": "Messages", - "account.posts_with_replies": "Messages et réponses", "account.remove_from_followers": "Retirer {name} des abonnés", "account.report": "Signaler @{name}", "account.requested_follow": "{name} a demandé à vous suivre", - "account.requests_to_follow_you": "Demande à 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}}", @@ -141,35 +147,43 @@ "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications_short": "Réactiver les notifications", "account.unmute_short": "Ne plus masquer", - "account_edit.bio.placeholder": "Ajouter une courte introduction pour aider les autres à vous connaître.", + "account_edit.advanced_settings.bot_hint": "Indique que le compte effectue principalement des actions automatisées et pourrait ne pas être surveillé", + "account_edit.advanced_settings.bot_label": "Compte robot", + "account_edit.advanced_settings.title": "Paramètres avancés", + "account_edit.bio.add_label": "Ajouter une présentation", + "account_edit.bio.edit_label": "Modifier la présentation", + "account_edit.bio.placeholder": "Ajouter une courte présentation pour aider les autres à vous connaître.", "account_edit.bio.title": "Présentation", "account_edit.bio_modal.add_title": "Ajouter une présentation", "account_edit.bio_modal.edit_title": "Modifier la présentation", - "account_edit.button.add": "Ajouter {item}", - "account_edit.button.delete": "Supprimer {item}", - "account_edit.button.edit": "Modifier {item}", "account_edit.column_button": "Terminé", "account_edit.column_title": "Modifier le profil", - "account_edit.custom_fields.name": "champ", + "account_edit.custom_fields.add_label": "Ajouter un champ", + "account_edit.custom_fields.edit_label": "Modifier le champ", "account_edit.custom_fields.placeholder": "Ajouter vos pronoms, vos sites, ou tout ce que vous voulez partager.", "account_edit.custom_fields.reorder_button": "Réorganiser les champs", "account_edit.custom_fields.tip_content": "Vous pouvez facilement ajouter de la crédibilité à votre compte Mastodon en vérifiant les liens vers tous les sites Web que vous possédez.", "account_edit.custom_fields.tip_title": "Astuce : ajout de liens vérifiés", "account_edit.custom_fields.title": "Champs personnalisés", "account_edit.custom_fields.verified_hint": "Comment ajouter un lien vérifié ?", + "account_edit.display_name.add_label": "Ajouter un nom public", + "account_edit.display_name.edit_label": "Modifier le nom public", "account_edit.display_name.placeholder": "Votre nom public est le nom qui apparaît sur votre profil et dans les fils d'actualités.", "account_edit.display_name.title": "Nom public", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Ajouter des hashtags", "account_edit.featured_hashtags.placeholder": "Aider les autres à identifier et à accéder rapidement à vos sujets préférés.", "account_edit.featured_hashtags.title": "Hashtags mis en avant", + "account_edit.field_actions.delete": "Supprimer le champ", + "account_edit.field_actions.edit": "Modifier le champ", "account_edit.field_delete_modal.confirm": "Voulez-vous vraiment supprimer ce champ personnalisé ? Cette action ne peut pas être annulée.", "account_edit.field_delete_modal.delete_button": "Supprimer", "account_edit.field_delete_modal.title": "Supprimer le champ personnalisé ?", "account_edit.field_edit_modal.add_title": "Ajouter un champ personnalisé", + "account_edit.field_edit_modal.discard_confirm": "Abandonner", + "account_edit.field_edit_modal.discard_message": "Vos modifications n’ont pas été enregistrées. Voulez-vous vraiment les abandonner ?", "account_edit.field_edit_modal.edit_title": "Modifier un champ personnalisé", - "account_edit.field_edit_modal.limit_header": "Limite de caractères recommandée dépassée", - "account_edit.field_edit_modal.limit_message": "L'affichage du champ peut être tronqué sur les téléphones.", - "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émoji personnalisé avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", + "account_edit.field_edit_modal.length_warning": "Le nombre de caractères dépasse la limite recommandée. Le champ peut ne pas s'afficher entièrement sur les téléphones.", + "account_edit.field_edit_modal.link_emoji_warning": "Nous déconseillons l'usage d'émojis personnalisés avec les URL. Les champs personnalisés contenant les deux seront affichés comme du texte et non un lien, afin d'éviter toute confusion.", "account_edit.field_edit_modal.name_hint": "Par exemple « Site Web personnel »", "account_edit.field_edit_modal.name_label": "Libellé", "account_edit.field_edit_modal.url_warning": "Pour ajouter un lien, veuillez inclure {protocol} au début.", @@ -197,10 +211,12 @@ "account_edit.image_edit.alt_edit_button": "Modifier le texte alternatif", "account_edit.image_edit.remove_button": "Supprimer l’image", "account_edit.image_edit.replace_button": "Remplacer l'image", + "account_edit.item_list.delete": "Supprimer {name}", + "account_edit.item_list.edit": "Modifier {name}", "account_edit.name_modal.add_title": "Ajouter un nom public", "account_edit.name_modal.edit_title": "Modifier le nom public", "account_edit.profile_tab.button_label": "Personnaliser", - "account_edit.profile_tab.hint.description": "Ces paramètres personnalisent ce que les personnes voient sur {server} dans les applications officielles, mais ils peuvent ne pas s'appliquer aux personnes sur d'autres serveurs ou utilisant une application tiers.", + "account_edit.profile_tab.hint.description": "Ces paramètres personnalisent ce que les personnes voient sur {server} dans les applications officielles, mais ils peuvent ne pas s'appliquer aux personnes sur d'autres serveurs ou utilisant une application tierce.", "account_edit.profile_tab.hint.title": "L'affichage peut varier", "account_edit.profile_tab.show_featured.description": "« En vedette » est un onglet facultatif où vous pouvez mettre en avant d'autres comptes.", "account_edit.profile_tab.show_featured.title": "Afficher l'onglet « En vedette »", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Afficher l'onglet « Média »", "account_edit.profile_tab.show_media_replies.description": "En activant cette option l'onglet « Média » affiche à la fois vos messages et vos réponses aux messages d'autres personnes.", "account_edit.profile_tab.show_media_replies.title": "Inclure les réponses dans l'onglet « Média »", - "account_edit.profile_tab.subtitle": "Personnaliser les onglets de votre profil et leur contenu.", - "account_edit.profile_tab.title": "Paramètres de l'onglet du profil", "account_edit.save": "Enregistrer", "account_edit.upload_modal.back": "Retour", "account_edit.upload_modal.done": "Terminé", @@ -219,21 +233,25 @@ "account_edit.upload_modal.step_upload.dragging": "Déposer pour téléverser", "account_edit.upload_modal.step_upload.header": "Choisir une image", "account_edit.upload_modal.step_upload.hint": "Format WebP, PNG, GIF ou JPEG, jusqu'à {limit} Mo.{br}L'image sera redimensionnée à {width} × {height} px.", - "account_edit.upload_modal.title_add": "Ajouter une photo de profil", - "account_edit.upload_modal.title_replace": "Remplacer la photo de profil", - "account_edit.verified_modal.details": "Ajouter de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", - "account_edit.verified_modal.invisible_link.details": "Ajouter le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", + "account_edit.upload_modal.title_add.avatar": "Ajouter une photo de profil", + "account_edit.upload_modal.title_add.header": "Ajouter une photo de couverture", + "account_edit.upload_modal.title_replace.avatar": "Remplacer la photo de profil", + "account_edit.upload_modal.title_replace.header": "Remplacer la photo de couverture", + "account_edit.verified_modal.details": "Ajoutez de la crédibilité à votre profil Mastodon en vérifiant les liens vers vos sites Web personnels. Voici comment cela fonctionne :", + "account_edit.verified_modal.invisible_link.details": "Ajoutez le lien dans votre en-tête. La partie importante est « rel=\"me\" » qui empêche l'usurpation d'identité sur des sites Web ayant du contenu généré par d'autres utilisateur·rice·s. Vous pouvez aussi utiliser une balise link dans l'en-tête de la page au lieu de {tag}, mais le code HTML doit être accessible sans avoir besoin d'exécuter du JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Comment rendre le lien invisible ?", - "account_edit.verified_modal.step1.header": "Copier-coller le code HTML ci-dessous dans l'en-tête de votre site web", + "account_edit.verified_modal.step1.header": "Copiez le code HTML ci-dessous dans l'en-tête de votre site Web", "account_edit.verified_modal.step2.details": "Si vous avez déjà ajouté votre site Web en tant que champ personnalisé, vous devrez le supprimer et le rajouter pour déclencher la vérification.", - "account_edit.verified_modal.step2.header": "Ajouter votre site Web en tant que champ personnalisé", + "account_edit.verified_modal.step2.header": "Ajoutez votre site Web en tant que champ personnalisé", "account_edit.verified_modal.title": "Comment ajouter un lien vérifié ?", "account_edit_tags.add_tag": "Ajouter #{tagName}", - "account_edit_tags.column_title": "Modifier les hashtags mis en avant", + "account_edit_tags.column_title": "Modifier les hashtags", "account_edit_tags.help_text": "Les hashtags mis en avant aident les personnes à découvrir et interagir avec votre profil. Ils apparaissent comme des filtres dans la vue « Activité » de votre profil.", + "account_edit_tags.max_tags_reached": "Vous avez atteint le nombre maximum de hashtags mis en avant.", "account_edit_tags.search_placeholder": "Saisir un hashtag…", "account_edit_tags.suggestions": "Suggestions :", "account_edit_tags.tag_status_count": "{count, plural, one {# message} other {# messages}}", + "account_list.total": "{total, plural, one {# compte} other {# comptes}}", "account_note.placeholder": "Cliquez pour ajouter une note", "admin.dashboard.daily_retention": "Taux de rétention des utilisateur·rice·s par jour après inscription", "admin.dashboard.monthly_retention": "Taux de rétention des utilisateur·rice·s par mois après inscription", @@ -308,14 +326,14 @@ "block_modal.remote_users_caveat": "Nous allons demander au serveur {domain} de respecter votre décision. Cependant, ce respect n'est pas garanti, car certains serveurs peuvent gérer différemment les blocages. Les messages publics peuvent rester visibles par les utilisateur·rice·s non connecté·e·s.", "block_modal.show_less": "Afficher moins", "block_modal.show_more": "Afficher plus", - "block_modal.they_cant_mention": "Il ne peut pas vous mentionner ou vous suivre.", - "block_modal.they_cant_see_posts": "Il ne peut plus voir vos messages et vous ne verrez plus les siens.", - "block_modal.they_will_know": "Il peut voir qu'il est bloqué.", - "block_modal.title": "Bloquer le compte ?", - "block_modal.you_wont_see_mentions": "Vous ne verrez pas les messages qui le mentionne.", + "block_modal.they_cant_mention": "Iel ne pourra plus vous mentionner ou vous suivre.", + "block_modal.they_cant_see_posts": "Iel ne pourra plus voir vos messages et vous ne verrez plus les siens.", + "block_modal.they_will_know": "Iel pourra voir qu'iel est bloqué·e.", + "block_modal.title": "Bloquer l'utilisateur·ice ?", + "block_modal.you_wont_see_mentions": "Vous ne verrez plus les messages qui le ou la mentionnent.", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois", - "boost_modal.reblog": "Booster le message ?", - "boost_modal.undo_reblog": "Annuler le boost du message ?", + "boost_modal.reblog": "Partager le message ?", + "boost_modal.undo_reblog": "Annuler le partage du message ?", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela peut être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", "bundle_column_error.error.title": "Oh non !", @@ -330,7 +348,7 @@ "bundle_modal_error.retry": "Réessayer", "callout.dismiss": "Rejeter", "carousel.current": "Diapositive {current, number} / {max, number}", - "carousel.slide": "Diapositive {current, number} de {max, number}", + "carousel.slide": "Diapositive {current, number} sur {max, number}", "character_counter.recommended": "{currentLength}/{maxLength} caractères recommandés", "character_counter.required": "{currentLength}/{maxLength} caractères", "closed_registrations.other_server_instructions": "Puisque Mastodon est décentralisé, vous pouvez créer un compte sur un autre serveur et interagir quand même avec celui-ci.", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Trouver un autre serveur", "closed_registrations_modal.preamble": "Mastodon est décentralisé : peu importe où vous créez votre compte, vous serez en mesure de suivre et d'interagir avec quiconque sur ce serveur. Vous pouvez même l'héberger !", "closed_registrations_modal.title": "Inscription sur Mastodon", - "collection.share_modal.share_link_label": "Lien à partager", + "collection.share_modal.share_link_label": "Partager le lien", "collection.share_modal.share_via_post": "Publier sur Mastodon", "collection.share_modal.share_via_system": "Partager avec…", "collection.share_modal.title": "Partager la collection", @@ -346,8 +364,11 @@ "collection.share_template_other": "Découvrez cette collection incroyable : {link}", "collection.share_template_own": "Découvrez ma nouvelle collection : {link}", "collections.account_count": "{count, plural, one {# compte} other {# comptes}}", - "collections.accounts.empty_description": "Ajouter jusqu'à {count} comptes que vous suivez", + "collections.accounts.empty_description": "Ajoutez jusqu'à {count} comptes", + "collections.accounts.empty_editor_title": "Il n'y a personne dans cette collection", "collections.accounts.empty_title": "Cette collection est vide", + "collections.block_collection_owner": "Bloquer le compte", + "collections.by_account": "par {account_handle}", "collections.collection_description": "Description", "collections.collection_language": "Langue", "collections.collection_language_none": "Aucune", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Voulez-vous vraiment supprimer ce compte de la collection ?", "collections.content_warning": "Avertissement au public", "collections.continue": "Continuer", - "collections.create.accounts_subtitle": "Seuls les comptes que vous suivez et qui ont autorisé leur découverte peuvent être ajoutés.", + "collections.copy_link": "Copier le lien", + "collections.copy_link_confirmation": "Lien de la collection copié dans le presse-papiers", "collections.create.accounts_title": "Qui voulez-vous mettre en avant dans cette collection ?", "collections.create.basic_details_title": "Informations générales", "collections.create.steps": "Étape {step}/{total}", - "collections.create_a_collection_hint": "Créer une collection pour recommander ou partager vos comptes préférés.", "collections.create_collection": "Créer une collection", "collections.delete_collection": "Supprimer la collection", "collections.description_length_hint": "Maximum 100 caractères", - "collections.detail.accept_inclusion": "D'accord", - "collections.detail.accounts_heading": "Comptes", - "collections.detail.author_added_you": "{author} vous a ajouté·e à cette collection", - "collections.detail.curated_by_author": "Organisée par {author}", - "collections.detail.curated_by_you": "Organisée par vous", + "collections.detail.author_added_you_on_date": "{author} vous a ajouté·e le {date}", "collections.detail.loading": "Chargement de la collection…", - "collections.detail.other_accounts_in_collection": "Autres comptes dans cette collection :", "collections.detail.revoke_inclusion": "Me retirer", + "collections.detail.sensitive_content": "Contenu sensible", "collections.detail.sensitive_note": "Cette collection contient des comptes et du contenu qui peut être sensibles.", "collections.detail.share": "Partager la collection", + "collections.detail.you_are_in_this_collection": "Vous faites partie de cette collection", "collections.edit_details": "Modifier les détails", - "collections.error_loading_collections": "Une erreur s'est produite durant le chargement de vos collections.", - "collections.hints.accounts_counter": "{count} / {max} comptes", + "collections.hidden_accounts_description": "Vous avez bloqué ou masqué {count, plural, one {ce compte} other {ces comptes}}", + "collections.hidden_accounts_link": "{count, plural, one {# compte caché} other {# comptes cachés}}", + "collections.hints.accounts_counter": "{count}/{max} comptes", "collections.last_updated_at": "Dernière mise à jour : {date}", + "collections.list.collections_with_count": "{count, plural, one {# collection} other {# collections}}", + "collections.list.created_by_author": "Créée par {name}", + "collections.list.created_by_you": "Créées par vous", + "collections.list.featuring_you": "Avec vous", "collections.manage_accounts": "Gérer les comptes", "collections.mark_as_sensitive": "Marquer comme sensible", "collections.mark_as_sensitive_hint": "Masque la description et les comptes de la collection derrière un avertissement au public. Le titre reste visible.", + "collections.maximum_collection_count_description": "Votre serveur permet la création de {count} collections au maximum.", + "collections.maximum_collection_count_reached": "Vous avez créé le nombre maximum de collections", "collections.name_length_hint": "Maximum 40 caractères", "collections.new_collection": "Nouvelle collection", - "collections.no_collections_yet": "Aucune collection pour le moment.", - "collections.old_last_post_note": "Dernière publication il y a plus d'une semaine", - "collections.remove_account": "Supprimer ce compte", + "collections.pending_accounts.message": "Des comptes peuvent apparaître en attente lorsque nous attendons une réponse de l'utilisateur·ice ou de son serveur. Les comptes en attente sont visibles uniquement pour vous.", + "collections.pending_accounts.title": "Pourquoi est-ce que je vois des comptes en attente ?", + "collections.remove_account": "Supprimer", "collections.report_collection": "Signaler cette collection", "collections.revoke_collection_inclusion": "Me retirer de cette collection", "collections.revoke_inclusion.confirmation": "Vous avez été retiré·e de « {collection} »", "collections.revoke_inclusion.error": "Une erreur s'est produite, veuillez réessayer plus tard.", - "collections.search_accounts_label": "Chercher des comptes à ajouter…", + "collections.search_accounts_label": "Recherchez un compte à ajouter", "collections.search_accounts_max_reached": "Vous avez ajouté le nombre maximum de comptes", "collections.sensitive": "Sensible", + "collections.share_short": "Partager", + "collections.suggestions.can_not_add": "Ne peut pas être ajouté", + "collections.suggestions.can_not_add_desc": "Ces comptes peuvent avoir choisi de ne pas être découverts, ou ils peuvent être sur un serveur qui ne supporte pas les collections.", + "collections.suggestions.must_follow": "Vous devez d'abord suivre", + "collections.suggestions.must_follow_desc": "Ces comptes valident leurs demandes d'abonnements. Les abonné·e·s peuvent les ajouter aux collections.", "collections.topic_hint": "Ajouter un hashtag pour aider les autres personnes à comprendre le sujet de la collection.", "collections.topic_special_chars_hint": "Les caractères spéciaux seront supprimés lors de l'enregistrement", + "collections.unlisted_collections_description": "Celles-ci n'apparaissent pas sur votre profil. N'importe qui ayant leur lien peut les découvrir.", + "collections.unlisted_collections_with_count": "Collections non listées ({count})", "collections.view_collection": "Voir la collection", - "collections.view_other_collections_by_user": "Voir les autres collections par ce compte", "collections.visibility_public": "Publique", "collections.visibility_public_hint": "Visible dans les résultats de recherche et les recommandations.", "collections.visibility_title": "Visibilité", @@ -405,7 +436,6 @@ "column.about": "À propos", "column.blocks": "Comptes bloqués", "column.bookmarks": "Marque-pages", - "column.collections": "Mes collections", "column.community": "Fil local", "column.create_list": "Créer une liste", "column.direct": "Mentions privées", @@ -422,8 +452,10 @@ "column.lists": "Listes", "column.mutes": "Comptes masqués", "column.notifications": "Notifications", + "column.other_collections": "Les collections par {name}", "column.pins": "Messages épinglés", "column.public": "Fil fédéré", + "column.your_collections": "Vos collections", "column_back_button.label": "Retour", "column_header.hide_settings": "Cacher les paramètres", "column_header.moveLeft_settings": "Déplacer la colonne vers la gauche", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Abandonner votre brouillon ?", "confirmations.discard_edit_media.confirm": "Supprimer", "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 les supprimer ?", - "confirmations.follow_to_collection.confirm": "Suivre et ajouter à la collection", - "confirmations.follow_to_collection.message": "Vous devez suivre {name} pour l'ajouter à une collection.", - "confirmations.follow_to_collection.title": "Suivre le compte ?", "confirmations.follow_to_list.confirm": "Suivre et ajouter à la liste", "confirmations.follow_to_list.message": "Vous devez suivre {name} pour l'ajouter à une liste.", "confirmations.follow_to_list.title": "Suivre l'utilisateur·rice ?", + "confirmations.hide_featured_tab.confirm": "Cacher l'onglet", + "confirmations.hide_featured_tab.intro": "Vous pouvez modifier ce paramétrage à tout moment depuis Modifier le profil > Paramètres de l'onglet du profil.", + "confirmations.hide_featured_tab.message": "Cela masquera l'onglet pour les utilisateur·rice·s de {serverName} et des autres serveurs utilisant la dernière version de Mastodon. Pour les autres l'affichage peut varier.", + "confirmations.hide_featured_tab.title": "Cacher l'onglet « En vedette » ?", "confirmations.logout.confirm": "Se déconnecter", "confirmations.logout.message": "Voulez-vous vraiment vous déconnecter ?", "confirmations.logout.title": "Se déconnecter ?", @@ -529,6 +562,7 @@ "content_warning.hide": "Masquer le message", "content_warning.show": "Montrer quand même", "content_warning.show_more": "Montrer plus", + "content_warning.show_short": "Afficher", "conversation.delete": "Supprimer la conversation", "conversation.mark_as_read": "Marquer comme lu", "conversation.open": "Afficher la conversation", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.", "domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.", "dropdown.empty": "Sélectionner une option", + "email_subscriptions.email": "Adresse de courriel", + "email_subscriptions.form.action": "S’abonner", + "email_subscriptions.form.bottom": "Recevez les messages dans votre boîte de réception sans créer de compte Mastodon. Désabonnez-vous quand vous voulez. Pour plus d’information, se référer à la politique de confidentialité.", + "email_subscriptions.form.title": "Abonnez-vous pour recevoir par courriel les notifications de {name}", + "email_subscriptions.submitted.lead": "Vérifiez votre boîte de réception pour finaliser de votre inscription aux notifications par courriel.", + "email_subscriptions.submitted.title": "Une dernière chose", + "email_subscriptions.validation.email.blocked": "Fournisseur de messagerie bloqué", + "email_subscriptions.validation.email.invalid": "Adresse de courriel invalide", "embed.instructions": "Intégrer ce message à votre site en copiant le code ci-dessous.", "embed.preview": "Il apparaîtra comme cela :", "emoji_button.activity": "Activités", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Voyage et lieux", - "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", - "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", - "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.", + "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant.", + "empty_column.account_featured_self.no_collections_button": "Créer une collection", + "empty_column.account_featured_self.no_collections_hide_tab": "Cacher cet onglet", + "empty_column.account_featured_self.pre_collections": "Restez connecté pour les collections", + "empty_column.account_featured_self.pre_collections_desc": "Les collections (à venir dans Mastodon 4.6) permettent d'organiser vos propres listes de comptes à recommander aux autres.", + "empty_column.account_featured_self.showcase_accounts": "Présentez vos comptes préférés", + "empty_column.account_featured_self.showcase_accounts_desc": "Les collections sont des listes de comptes sélectionnés pour aider les autres à découvrir le Fédivers.", + "empty_column.account_featured_unknown.other": "Ce compte n'a mis aucun contenu en avant pour l'instant.", "empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations", "empty_column.account_suspended": "Compte suspendu", "empty_column.account_timeline": "Aucun message ici !", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Qui suivre", "followed_tags": "Hashtags suivis", "followers.hide_other_followers": "Ce compte a choisi de ne pas rendre visible ses autres abonné·e·s", + "followers.title": "Suit {name}", "following.hide_other_following": "Ce compte a choisi de ne pas rendre visible ses autres abonnements", + "following.title": "Suivi·e par {name}", "footer.about": "À propos", "footer.about_mastodon": "À propos de Mastodon", "footer.about_server": "À propos de {domain}", @@ -686,12 +735,13 @@ "footer.source_code": "Voir le code source", "footer.status": "État", "footer.terms_of_service": "Conditions d’utilisation", + "form_error.blank": "Le champ ne peut pas être vide.", "form_field.optional": "(facultatif)", "generic.saved": "Sauvegardé", "getting_started.heading": "Pour commencer", "hashtag.admin_moderation": "Ouvrir l'interface de modération pour #{name}", - "hashtag.browse": "Parcourir les posts dans #{hashtag}", - "hashtag.browse_from_account": "Parcourir les posts de @{name} dans #{hashtag}", + "hashtag.browse": "Parcourir les messages dans #{hashtag}", + "hashtag.browse_from_account": "Parcourir les messages de @{name} dans #{hashtag}", "hashtag.column_header.tag_mode.all": "et {additional}", "hashtag.column_header.tag_mode.any": "ou {additional}", "hashtag.column_header.tag_mode.none": "sans {additional}", @@ -773,7 +823,7 @@ "keyboard_shortcuts.open_media": "Ouvrir le média", "keyboard_shortcuts.pinned": "Ouvrir la liste des messages épinglés", "keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur·rice", - "keyboard_shortcuts.quote": "Citer la publication", + "keyboard_shortcuts.quote": "Citer le message", "keyboard_shortcuts.reply": "Répondre au message", "keyboard_shortcuts.requests": "Ouvrir la liste de demandes d’abonnement", "keyboard_shortcuts.search": "Se placer dans le champ de recherche", @@ -802,15 +852,15 @@ "lists.add_to_list": "Ajouter à la liste", "lists.add_to_lists": "Ajouter {name} aux listes", "lists.create": "Créer", - "lists.create_a_list_to_organize": "Créer une nouvelle liste pour organiser votre Page d'accueil", + "lists.create_a_list_to_organize": "Créer une nouvelle liste pour organiser votre fil d'actualité", "lists.create_list": "Créer une liste", "lists.delete": "Supprimer la liste", "lists.done": "Terminé", "lists.edit": "Modifier la liste", - "lists.exclusive": "Cacher les membres de la page d'accueil", - "lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil pour éviter de voir leurs messages deux fois.", + "lists.exclusive": "Cacher les membres du fil d'actualité", + "lists.exclusive_hint": "Si quelqu'un est dans cette liste, les cacher dans votre fil d'actualité pour éviter de voir leurs messages deux fois.", "lists.find_users_to_add": "Trouver des utilisateurs à ajouter", - "lists.list_members_count": "{count, plural, one {# member} other {# members}}", + "lists.list_members_count": "{count, plural, one {# membre} other {# membres}}", "lists.list_name": "Nom de la liste", "lists.new_list_name": "Nom de la nouvelle liste", "lists.no_lists_yet": "Aucune liste pour l'instant.", @@ -831,11 +881,11 @@ "mute_modal.hide_options": "Masquer les options", "mute_modal.indefinite": "Jusqu'à ce que je l'affiche à nouveau", "mute_modal.show_options": "Afficher les options", - "mute_modal.they_can_mention_and_follow": "Il peut vous mentionner et vous suivre, mais vous ne le verrez pas.", - "mute_modal.they_wont_know": "Il ne saura pas qu'il est masqué.", - "mute_modal.title": "Masquer le compte ?", - "mute_modal.you_wont_see_mentions": "Vous ne verrez pas les messages le mentionnant.", - "mute_modal.you_wont_see_posts": "Il peut toujours voir vos messages, mais vous ne verrez pas les siens.", + "mute_modal.they_can_mention_and_follow": "Iel pourra vous mentionner et vous suivre, mais vous ne le verrez pas.", + "mute_modal.they_wont_know": "Iel ne saura pas qu'iel est masqué·e.", + "mute_modal.title": "Masquer l'utilisateur·ice ?", + "mute_modal.you_wont_see_mentions": "Vous ne verrez plus les messages qui le ou la mentionnent.", + "mute_modal.you_wont_see_posts": "Iel pourra toujours voir vos messages, mais vous ne verrez plus les siens.", "navigation_bar.about": "À propos", "navigation_bar.account_settings": "Mot de passe et sécurité", "navigation_bar.administration": "Administration", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Développer le menu des hashtags suivis", "navigation_panel.expand_lists": "Développer le menu de la liste", "not_signed_in_indicator.not_signed_in": "Vous devez vous connecter pour accéder à cette ressource.", + "notification.added_to_collection": "{name} vous a ajouté·e à une collection", "notification.admin.report": "{name} a signalé {target}", "notification.admin.report_account": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target} pour {category}", "notification.admin.report_account_other": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} et {count, plural, one {# autre} other {# autres}} se sont inscrit", "notification.annual_report.message": "Votre {year} #Wrapstodon attend ! Dévoilez les moments forts et mémorables de votre année sur Mastodon !", "notification.annual_report.view": "Voir #Wrapstodon", + "notification.collection_update": "{name} a modifié une collection dans laquelle vous figurez", "notification.favourite": "{name} a ajouté votre message à ses favoris", "notification.favourite.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont mis votre message en favori", "notification.favourite_pm": "{name} a mis votre mention privée en favori", @@ -889,7 +941,7 @@ "notification.label.mention": "Mention", "notification.label.private_mention": "Mention privée", "notification.label.private_reply": "Réponse privée", - "notification.label.quote": "{name} a cité votre publication", + "notification.label.quote": "{name} a cité votre message", "notification.label.reply": "Réponse", "notification.mention": "Mention", "notification.mentioned_you": "{name} vous a mentionné·e", @@ -904,9 +956,9 @@ "notification.moderation_warning.action_suspend": "Votre compte a été suspendu.", "notification.own_poll": "Votre sondage est terminé", "notification.poll": "Un sondage auquel vous avez participé vient de se terminer", - "notification.quoted_update": "{name} a modifié une publication que vous avez cité", + "notification.quoted_update": "{name} a modifié un message que vous avez cité", "notification.reblog": "{name} a partagé votre message", - "notification.reblog.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont boosté votre message", + "notification.reblog.name_and_others_with_link": "{name} et {count, plural, one {# autre} other {# autres}} ont 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.", "notification.relationships_severance_event.domain_block": "Un·e administrateur·rice de {from} en a bloqué {target}, comprenant {followersCount} de vos abonné·e·s et {followingCount, plural, one {# compte} other {# comptes}} vous suivez.", @@ -1003,7 +1055,7 @@ "onboarding.profile.note_hint": "Vous pouvez @mentionner d'autres personnes ou #hashtags…", "onboarding.profile.title": "Configuration du profil", "onboarding.profile.upload_avatar": "Importer une photo de profil", - "onboarding.profile.upload_header": "Importer un entête de profil", + "onboarding.profile.upload_header": "Importer une image de couverture", "password_confirmation.exceeds_maxlength": "La confirmation du mot de passe dépasse la longueur du mot de passe", "password_confirmation.mismatching": "Les deux mots de passe ne correspondent pas", "picture_in_picture.restore": "Remettre en place", @@ -1018,7 +1070,7 @@ "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Ajuster la confidentialité du message", - "privacy.direct.long": "Toutes les personnes mentionnées dans le post", + "privacy.direct.long": "Seulement les personnes mentionnées dans le message", "privacy.direct.short": "Mention privée", "privacy.private.long": "Seulement vos abonnés", "privacy.private.short": "Abonnés", @@ -1036,7 +1088,7 @@ "quote_error.poll": "Les citations ne sont pas autorisées avec les sondages.", "quote_error.private_mentions": "La citation n'est pas autorisée avec les mentions privées.", "quote_error.quote": "Une seule citation à la fois est autorisée.", - "quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer cette publication.", + "quote_error.unauthorized": "Vous n'êtes pas autorisé⋅e à citer ce message.", "quote_error.upload": "La citation n'est pas autorisée avec un média joint.", "recommended": "Recommandé", "refresh": "Actualiser", @@ -1136,11 +1188,12 @@ "search_results.no_search_yet": "Essayez de rechercher des messages, des profils ou des hashtags.", "search_results.see_all": "Afficher tout", "search_results.statuses": "Messages", - "search_results.title": "Résultat de Recherche pour \"{q}\"", + "search_results.title": "Résultats pour « {q} »", "server_banner.about_active_users": "Personnes utilisant ce serveur au cours des 30 derniers jours (Comptes actifs mensuellement)", "server_banner.active_users": "comptes actifs", "server_banner.administered_by": "Administré par :", "server_banner.is_one_of_many": "{domain} est l'un des nombreux serveurs Mastodon indépendants que vous pouvez utiliser pour participer au fédivers.", + "server_banner.more_about_this_server": "En savoir plus sur ce serveur", "server_banner.server_stats": "Statistiques du serveur :", "sign_in_banner.create_account": "Créer un compte", "sign_in_banner.follow_anyone": "Suivez n'importe qui à travers le fédivers et affichez tout dans un ordre chronologique. Ni algorithmes, ni publicités, ni appâts à clics en perspective.", @@ -1237,7 +1290,7 @@ "status.show_less_all": "Tout replier", "status.show_more_all": "Tout déplier", "status.show_original": "Afficher l’original", - "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", + "status.title.with_attachments": "{user} a publié {attachmentCount, plural, one {une pièce jointe} other {{attachmentCount} pièces jointes}}", "status.translate": "Traduire", "status.translated_from_with": "Traduit de {lang} en utilisant {provider}", "status.uncached_media_warning": "Prévisualisation non disponible", @@ -1301,9 +1354,9 @@ "visibility_modal.helper.direct_quoting": "Les mentions privées rédigées sur Mastodon ne peuvent pas être citées par d'autres personnes.", "visibility_modal.helper.privacy_editing": "La visibilité ne peut pas être modifiée après la publication d'un message.", "visibility_modal.helper.privacy_private_self_quote": "Les auto-citations de messages privés ne peuvent pas être rendues publiques.", - "visibility_modal.helper.private_quoting": "Les posts accessible uniquement par les followers sur Mastodon ne peuvent être cités par d'autres personnes.", + "visibility_modal.helper.private_quoting": "Les messages accessibles uniquement aux abonné·es publiés sur Mastodon ne peuvent être cités par d'autres personnes.", "visibility_modal.helper.unlisted_quoting": "Lorsque les gens vous citent, leur message sera également caché des fils tendances.", - "visibility_modal.instructions": "Contrôlez qui peut interagir avec ce post. Vous pouvez également appliquer ces paramètres à tous les futurs messages en allant dans Préférences > Valeurs par défaut de publication.", + "visibility_modal.instructions": "Contrôlez qui peut interagir avec ce message. Vous pouvez également appliquer ces paramètres à tous les futurs messages en allant dans Préférences > Paramètres de publication par défaut.", "visibility_modal.privacy_label": "Visibilité", "visibility_modal.quote_followers": "Abonné·e·s seulement", "visibility_modal.quote_label": "Autoriser les citations pour", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 9592886fa6c182..81e0b4edd3a9a4 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -21,12 +21,10 @@ "account.block_domain": "Domein {domain} blokkearje", "account.block_short": "Blokkearje", "account.blocked": "Blokkearre", - "account.blocking": "Blokkearre", "account.cancel_follow_request": "Folchfersyk annulearje", "account.copy": "Keppeling nei profyl kopiearje", "account.direct": "Privee fermelde @{name}", "account.disable_notifications": "Jou gjin melding mear wannear @{name} in berjocht pleatst", - "account.domain_blocking": "Domein blokkearre", "account.edit_profile": "Profyl bewurkje", "account.enable_notifications": "Jou in melding mear wannear @{name} in berjocht pleatst", "account.endorse": "Op profyl werjaan", @@ -35,9 +33,6 @@ "account.familiar_followers_two": "Folge troch {name1} en {name2}", "account.featured": "Foarsteld", "account.featured.accounts": "Profilen", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Lêste berjocht op {date}", - "account.featured_tags.last_status_never": "Gjin berjochten", "account.follow": "Folgje", "account.follow_back": "Weromfolgje", "account.followers": "Folgers", @@ -62,16 +57,13 @@ "account.mute_notifications_short": "Meldingen negearje", "account.mute_short": "Negearje", "account.muted": "Negearre", - "account.muting": "Dôve", "account.mutual": "Jim folgje inoar", "account.no_bio": "Gjin omskriuwing opjûn.", "account.open_original_page": "Orizjinele side iepenje", "account.posts": "Berjochten", - "account.posts_with_replies": "Berjochten en reaksjes", "account.remove_from_followers": "{name} as folger fuortsmite", "account.report": "@{name} rapportearje", "account.requested_follow": "{name} hat dy in folchfersyk stjoerd", - "account.requests_to_follow_you": "Fersiken om jo te folgjen", "account.share": "Profyl fan @{name} diele", "account.show_reblogs": "Boosts fan @{name} toane", "account.statuses_counter": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", @@ -289,9 +281,6 @@ "emoji_button.search_results": "Sykresultaten", "emoji_button.symbols": "Symboalen", "emoji_button.travel": "Reizgje en lokaasjes", - "empty_column.account_featured.me": "Jo hawwe noch neat útljochte. Wisten jo dat jo jo hashtags dy’t jo it meast brûke, en sels de accounts fan dyn freonen fermelde kinne op jo profyl?", - "empty_column.account_featured.other": "{acct} hat noch neat útljochte. Wisten jo dat jo jo hashtags dy’t jo it meast brûke, en sels de accounts fan dyn freonen fermelde kinne op jo profyl?", - "empty_column.account_featured_other.unknown": "Dizze account hat noch neat útljochte.", "empty_column.account_hides_collections": "Dizze brûker hat derfoar keazen dizze ynformaasje net beskikber te meitsjen", "empty_column.account_suspended": "Account beskoattele", "empty_column.account_timeline": "Hjir binne gjin berjochten!", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 0ce04407a714bd..64c8d0967a0834 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -28,12 +28,10 @@ "account.block_domain": "Bac ainm fearainn {domain}", "account.block_short": "Bac", "account.blocked": "Bactha", - "account.blocking": "Ag Blocáil", "account.cancel_follow_request": "Cealaigh leanúint", "account.copy": "Cóipeáil nasc chuig an bpróifíl", "account.direct": "Luaigh @{name} go príobháideach", "account.disable_notifications": "Stop ag cur in iúl dom nuair a dhéanann @{name} postáil", - "account.domain_blocking": "Fearann a bhlocáil", "account.edit_note": "Cuir nóta pearsanta in eagar", "account.edit_profile": "Cuir an phróifíl in eagar", "account.edit_profile_short": "Cuir in Eagar", @@ -45,9 +43,7 @@ "account.featured": "Faoi thrácht", "account.featured.accounts": "Próifílí", "account.featured.collections": "Bailiúcháin", - "account.featured.hashtags": "Haischlibeanna", - "account.featured_tags.last_status_at": "Postáil is déanaí ar {date}", - "account.featured_tags.last_status_never": "Gan aon phoist", + "account.featured.new_collection": "Bailiúchán nua", "account.field_overflow": "Taispeáin an t-ábhar iomlán", "account.filters.all": "Gach gníomhaíocht", "account.filters.boosts_toggle": "Taispeáin borradh", @@ -73,8 +69,19 @@ "account.go_to_profile": "Téigh go dtí próifíl", "account.hide_reblogs": "Folaigh moltaí ó @{name}", "account.in_memoriam": "Ón tseanaimsir.", + "account.join_modal.day": "Lá", + "account.join_modal.me": "Chuaigh tú isteach i {server} ar", + "account.join_modal.me_anniversary": "Lá Féile sona duit! Chuaigh tú isteach i {server} ar", + "account.join_modal.me_today": "Seo é do chéad lá ar {server}!", + "account.join_modal.other": "Chuaigh {name} isteach i {server} ar", + "account.join_modal.other_today": "Seo é an chéad lá ag {name} ar {server}!", + "account.join_modal.share.celebrate": "Roinn post ceiliúrtha", + "account.join_modal.share.intro": "Comhroinn post réamhrá", + "account.join_modal.share.welcome": "Roinn post fáilte", + "account.join_modal.years": "{number, plural, one {bliain} two {blianta} few {blianta} many {blianta} other {blianta}}", "account.joined_short": "Cláraithe", "account.languages": "Athraigh teangacha foscríofa", + "account.last_active": "Gníomhach deireanach", "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": "Meáin", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Balbhaigh fógraí", "account.mute_short": "Balbhaigh", "account.muted": "Balbhaithe", - "account.muting": "Ag balbhaigh", "account.mutual": "Leanann sibh a chéile", + "account.name.copy": "Láimhseáil chóipeála", "account.name.help.domain": "Is é {domain} an freastalaí a óstálann próifíl agus poist an úsáideora.", "account.name.help.domain_self": "Is é {domain} an freastalaí a óstálann do phróifíl agus do phoist.", - "account.name.help.footer": "Díreach mar is féidir leat ríomhphoist a sheoladh chuig daoine ag baint úsáide as cliaint ríomhphoist éagsúla, is féidir leat idirghníomhú le daoine ar fhreastalaithe Mastodon eile – agus le duine ar bith ar aipeanna sóisialta eile atá faoi thiomáint ag an tsraith rialacha chéanna a úsáideann Mastodon (an prótacal ActivityPub).", + "account.name.help.footer": "Díreach mar is féidir leat ríomhphoist a sheoladh chuig daoine ag baint úsáide as soláthraithe ríomhphoist éagsúla, is féidir leat idirghníomhú le daoine ar fhreastalaithe Mastodon eile, agus le duine ar bith ar aipeanna sóisialta eile atá comhoiriúnach le Mastodon.", "account.name.help.header": "Is cosúil le seoladh ríomhphoist é láimhseáil", "account.name.help.username": "Is é {username} ainm úsáideora an chuntais seo ar a bhfreastalaí. D’fhéadfadh an t-ainm úsáideora céanna a bheith ag duine éigin ar fhreastalaí eile.", "account.name.help.username_self": "Is é {username} d'ainm úsáideora ar an bhfreastalaí seo. D'fhéadfadh an t-ainm úsáideora céanna a bheith ag duine éigin ar fhreastalaí eile.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Eagar", "account.note.title": "Nóta pearsanta (le feiceáil agatsa amháin)", "account.open_original_page": "Oscail an leathanach bunaidh", + "account.pending": "Ar feitheamh", "account.posts": "Postálacha", - "account.posts_with_replies": "Postálacha agus freagraí", "account.remove_from_followers": "Bain {name} de na leantóirí", "account.report": "Tuairiscigh @{name}", "account.requested_follow": "D'iarr {name} ort do chuntas a leanúint", - "account.requests_to_follow_you": "Iarratais chun tú a leanúint", "account.share": "Roinn próifíl @{name}", "account.show_reblogs": "Taispeáin moltaí ó @{name}", "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} poist}}", @@ -141,34 +147,42 @@ "account.unmute": "Díbhalbhaigh @{name}", "account.unmute_notifications_short": "Díbhalbhaigh fógraí", "account.unmute_short": "Díbhalbhaigh", + "account_edit.advanced_settings.bot_hint": "Tabhair comhartha do dhaoine eile go ndéanann an cuntas gníomhartha uathoibrithe den chuid is mó agus nach bhféadfadh sé go ndéantar monatóireacht air", + "account_edit.advanced_settings.bot_label": "Cuntas uathoibrithe", + "account_edit.advanced_settings.title": "Socruithe ardleibhéil", + "account_edit.bio.add_label": "Cuir beathaisnéis leis", + "account_edit.bio.edit_label": "Cuir beathaisnéis in eagar", "account_edit.bio.placeholder": "Cuir réamhrá gearr leis chun cabhrú le daoine eile tú a aithint.", "account_edit.bio.title": "Beathaisnéis", "account_edit.bio_modal.add_title": "Cuir beathaisnéis leis", "account_edit.bio_modal.edit_title": "Cuir beathaisnéis in eagar", - "account_edit.button.add": "Cuir {item} leis", - "account_edit.button.delete": "Scrios {item}", - "account_edit.button.edit": "Cuir {item} in eagar", "account_edit.column_button": "Déanta", "account_edit.column_title": "Cuir Próifíl in Eagar", - "account_edit.custom_fields.name": "réimse", + "account_edit.custom_fields.add_label": "Cuir réimse leis", + "account_edit.custom_fields.edit_label": "Cuir réimse in eagar", "account_edit.custom_fields.placeholder": "Cuir do fhorainmneacha, naisc sheachtracha, nó aon rud eile ar mhaith leat a roinnt leis.", "account_edit.custom_fields.reorder_button": "Athordaigh réimsí", "account_edit.custom_fields.tip_content": "Is féidir leat creidiúnacht a chur le do chuntas Mastodon go héasca trí naisc chuig aon suíomhanna Gréasáin ar leatsa iad a fhíorú.", "account_edit.custom_fields.tip_title": "Leid: Ag cur naisc fhíoraithe leis", "account_edit.custom_fields.title": "Réimsí saincheaptha", "account_edit.custom_fields.verified_hint": "Conas a chuirim nasc fíoraithe leis?", + "account_edit.display_name.add_label": "Cuir ainm taispeána leis", + "account_edit.display_name.edit_label": "Cuir ainm taispeána in eagar", "account_edit.display_name.placeholder": "Is é d’ainm taispeána an chaoi a bhfeictear d’ainm ar do phróifíl agus in amlínte.", "account_edit.display_name.title": "Ainm taispeána", - "account_edit.featured_hashtags.item": "haischlibeanna", + "account_edit.featured_hashtags.edit_label": "Cuir haischlibanna leis", "account_edit.featured_hashtags.placeholder": "Cabhraigh le daoine eile do thopaicí is fearr leat a aithint, agus rochtain thapa a bheith acu orthu.", "account_edit.featured_hashtags.title": "Haischlibeanna Réadmhaoine", + "account_edit.field_actions.delete": "Scrios réimse", + "account_edit.field_actions.edit": "Cuir réimse in eagar", "account_edit.field_delete_modal.confirm": "An bhfuil tú cinnte gur mhaith leat an réimse saincheaptha seo a scriosadh? Ní féidir an gníomh seo a chealú.", "account_edit.field_delete_modal.delete_button": "Scrios", "account_edit.field_delete_modal.title": "An bhfuil fonn ort an réimse saincheaptha a scriosadh?", "account_edit.field_edit_modal.add_title": "Cuir réimse saincheaptha leis", + "account_edit.field_edit_modal.discard_confirm": "Caith uait", + "account_edit.field_edit_modal.discard_message": "Tá athruithe neamhshábháilte agat. An bhfuil tú cinnte gur mian leat iad a chaitheamh amach?", "account_edit.field_edit_modal.edit_title": "Cuir réimse saincheaptha in eagar", - "account_edit.field_edit_modal.limit_header": "Sáraíodh an teorainn carachtar molta", - "account_edit.field_edit_modal.limit_message": "B’fhéidir nach bhfeicfidh úsáideoirí soghluaiste do réimse ina iomláine.", + "account_edit.field_edit_modal.length_warning": "Sáraíodh an teorainn carachtar molta. B’fhéidir nach bhfeicfeadh úsáideoirí soghluaiste do réimse ina iomláine.", "account_edit.field_edit_modal.link_emoji_warning": "Molaimid gan emoji saincheaptha a úsáid i gcomhar le Urlanna. Taispeánfar réimsí saincheaptha ina bhfuil an dá cheann mar théacs amháin seachas mar nasc, chun mearbhall úsáideoirí a sheachaint.", "account_edit.field_edit_modal.name_hint": "M.sh. “Suíomh Gréasáin pearsanta”", "account_edit.field_edit_modal.name_label": "Lipéad", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Cuir téacs alt in eagar", "account_edit.image_edit.remove_button": "Bain íomhá", "account_edit.image_edit.replace_button": "Athsholáthair íomhá", + "account_edit.item_list.delete": "Scrios {name}", + "account_edit.item_list.edit": "Cuir {name} in eagar", "account_edit.name_modal.add_title": "Cuir ainm taispeána leis", "account_edit.name_modal.edit_title": "Cuir ainm taispeána in eagar", "account_edit.profile_tab.button_label": "Saincheap", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Taispeáin an cluaisín ‘Meáin’", "account_edit.profile_tab.show_media_replies.description": "Nuair a bhíonn sé cumasaithe, taispeánann an cluaisín Meáin do phoist agus freagraí ar phoist daoine eile araon.", "account_edit.profile_tab.show_media_replies.title": "Cuir freagraí san áireamh ar an táb ‘Meáin’", - "account_edit.profile_tab.subtitle": "Saincheap na cluaisíní ar do phróifíl agus a bhfuil á thaispeáint iontu.", - "account_edit.profile_tab.title": "Socruithe an chluaisín próifíle", "account_edit.save": "Sábháil", "account_edit.upload_modal.back": "Ar ais", "account_edit.upload_modal.done": "Déanta", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Scaoil le huaslódáil", "account_edit.upload_modal.step_upload.header": "Roghnaigh íomhá", "account_edit.upload_modal.step_upload.hint": "Formáid WEBP, PNG, GIF nó JPG, suas le {limit}MB.{br}Scálfar an íomhá go {width}x{height}px.", - "account_edit.upload_modal.title_add": "Cuir grianghraf próifíle leis", - "account_edit.upload_modal.title_replace": "Athsholáthar grianghraf próifíle", + "account_edit.upload_modal.title_add.avatar": "Cuir grianghraf próifíle leis", + "account_edit.upload_modal.title_add.header": "Cuir grianghraf clúdaigh leis", + "account_edit.upload_modal.title_replace.avatar": "Athsholáthar grianghraf próifíle", + "account_edit.upload_modal.title_replace.header": "Athsholáthar grianghraf clúdaigh", "account_edit.verified_modal.details": "Cuir creidiúnacht le do phróifíl Mastodon trí naisc chuig láithreáin ghréasáin phearsanta a fhíorú. Seo mar a oibríonn sé:", "account_edit.verified_modal.invisible_link.details": "Cuir an nasc le do cheanntásc. Is í an chuid thábhachtach ná rel=\"me\" a chuireann cosc ​​ar phearsanú ar shuíomhanna gréasáin a bhfuil inneachar a ghintear ag úsáideoirí. Is féidir leat clib nasc a úsáid fiú i gceanntásc an leathanaigh in ionad {tag}, ach caithfidh an HTML a bheith inrochtana gan JavaScript a chur i gcrích.", "account_edit.verified_modal.invisible_link.summary": "Conas a dhéanaim an nasc dofheicthe?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Cuir do shuíomh Gréasáin leis mar réimse saincheaptha", "account_edit.verified_modal.title": "Conas nasc fíoraithe a chur leis", "account_edit_tags.add_tag": "Cuir #{tagName} leis", - "account_edit_tags.column_title": "Cuir haischlibeanna le feiceáil in eagar", + "account_edit_tags.column_title": "Cuir Clibeanna in Eagar", "account_edit_tags.help_text": "Cuidíonn haischlibeanna le húsáideoirí do phróifíl a aimsiú agus idirghníomhú léi. Feictear iad mar scagairí ar radharc Gníomhaíochta do leathanaigh Phróifíle.", + "account_edit_tags.max_tags_reached": "Tá an líon uasta haischlibanna le feiceáil sroichte agat.", "account_edit_tags.search_placeholder": "Cuir isteach haischlib…", "account_edit_tags.suggestions": "Moltaí:", "account_edit_tags.tag_status_count": "{count, plural, one {# post} two {# poist} few {# poist} many {# poist} other {# poist}}", + "account_list.total": "{total, plural, one {# cuntas} two {# cuntais} few {# cuntais} many {# cuntais} other {# cuntais}}", "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ú", "admin.dashboard.monthly_retention": "Ráta coinneála na n-úsáideoirí de réir na míosa tar éis dóibh clárú", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Faigh freastalaí eile", "closed_registrations_modal.preamble": "Ós rud é go bhfuil Mastodon díláraithe, is cuma cá háit a chruthaíonn tú do chuntas, beidh tú in ann idirghníomhú le haon duine ar an bhfreastalaí seo agus iad a leanúint. Is féidir fiú é a féin-óstáil!", "closed_registrations_modal.title": "Cláraigh le Mastodon", - "collection.share_modal.share_link_label": "Nasc roinnte cuireadh", + "collection.share_modal.share_link_label": "Roinn an nasc", "collection.share_modal.share_via_post": "Postáil ar Mastodon", "collection.share_modal.share_via_system": "Comhroinn le…", "collection.share_modal.title": "Comhroinn bailiúchán", @@ -346,8 +364,11 @@ "collection.share_template_other": "Féach ar an mbailiúchán fionnuar seo: {link}", "collection.share_template_own": "Féach ar mo bhailiúchán nua: {link}", "collections.account_count": "{count, plural, one {# cuntas} two {# cuntais} few {# cuntais} many {# cuntais} other {# cuntais}}", - "collections.accounts.empty_description": "Cuir suas le {count} cuntas leis a leanann tú", + "collections.accounts.empty_description": "Cuir suas le {count} cuntas leis", + "collections.accounts.empty_editor_title": "Níl aon duine sa bhailiúchán seo fós", "collections.accounts.empty_title": "Tá an bailiúchán seo folamh", + "collections.block_collection_owner": "Cuntas blocáilte", + "collections.by_account": "le {account_handle}", "collections.collection_description": "Cur síos", "collections.collection_language": "Teanga", "collections.collection_language_none": "Dada", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "An bhfuil tú cinnte gur mian leat an cuntas seo a bhaint den bhailiúchán seo?", "collections.content_warning": "Rabhadh ábhair", "collections.continue": "Lean ar aghaidh", - "collections.create.accounts_subtitle": "Ní féidir ach cuntais a leanann tú atá roghnaithe le fionnachtain a chur leis.", + "collections.copy_link": "Cóipeáil nasc", + "collections.copy_link_confirmation": "Cóipeáladh nasc an bhailiúcháin chuig an ghearrthaisce", "collections.create.accounts_title": "Cé a bheidh le feiceáil agat sa bhailiúchán seo?", "collections.create.basic_details_title": "Sonraí bunúsacha", "collections.create.steps": "Céim {step}/{total}", - "collections.create_a_collection_hint": "Cruthaigh bailiúchán chun do chuntais is fearr leat a mholadh nó a roinnt le daoine eile.", "collections.create_collection": "Cruthaigh bailiúchán", "collections.delete_collection": "Scrios bailiúchán", "collections.description_length_hint": "Teorainn 100 carachtar", - "collections.detail.accept_inclusion": "Ceart go leor", - "collections.detail.accounts_heading": "Cuntais", - "collections.detail.author_added_you": "Chuir {author} leis an mbailiúchán seo thú", - "collections.detail.curated_by_author": "Curtha i dtoll a chéile ag {author}", - "collections.detail.curated_by_you": "Curtha i dtoll a chéile agatsa", + "collections.detail.author_added_you_on_date": "Chuir {author} leis thú ar {date}", "collections.detail.loading": "Ag lódáil an bhailiúcháin…", - "collections.detail.other_accounts_in_collection": "Daoine eile sa bhailiúchán seo:", "collections.detail.revoke_inclusion": "Bain mé", + "collections.detail.sensitive_content": "Ábhar íogair", "collections.detail.sensitive_note": "Tá cuntais agus ábhar sa bhailiúchán seo a d'fhéadfadh a bheith íogair do roinnt úsáideoirí.", "collections.detail.share": "Comhroinn an bailiúchán seo", + "collections.detail.you_are_in_this_collection": "Tá tú le feiceáil sa bhailiúchán seo", "collections.edit_details": "Cuir sonraí in eagar", - "collections.error_loading_collections": "Tharla earráid agus iarracht á déanamh do bhailiúcháin a luchtú.", - "collections.hints.accounts_counter": "{count} / {max} cuntais", + "collections.hidden_accounts_description": "Tá bac nó múchadh déanta agat ar {count, plural, one {an t-úsáideoir seo} two {na húsáideoirí seo} few {na húsáideoirí seo} many {na húsáideoirí seo} other {na húsáideoirí seo}}", + "collections.hidden_accounts_link": "{count, plural, one {# cuntas folaithe} two {# cuntais folaithe} few {# cuntais folaithe} many {# cuntais folaithe} other {# cuntais folaithe}}", + "collections.hints.accounts_counter": "cuntais {count}/{max}", "collections.last_updated_at": "Nuashonraithe go deireanach: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Bailiúchán} two {# Bailiúcháin} few {# Bailiúcháin} many {# Bailiúcháin} other {# Bailiúcháin}}", + "collections.list.created_by_author": "Cruthaithe ag {name}", + "collections.list.created_by_you": "Cruthaithe agatsa", + "collections.list.featuring_you": "Ag cur san áireamh thú", "collections.manage_accounts": "Bainistigh cuntais", "collections.mark_as_sensitive": "Marcáil mar íogair", "collections.mark_as_sensitive_hint": "Folaíonn sé cur síos agus cuntais an bhailiúcháin taobh thiar de rabhadh ábhair. Beidh ainm an bhailiúcháin le feiceáil fós.", + "collections.maximum_collection_count_description": "Ceadaíonn do fhreastalaí cruthú suas le {count} bailiúchán.", + "collections.maximum_collection_count_reached": "Tá an líon uasta bailiúcháin cruthaithe agat", "collections.name_length_hint": "Teorainn 40 carachtar", "collections.new_collection": "Bailiúchán nua", - "collections.no_collections_yet": "Gan aon bhailiúcháin fós.", - "collections.old_last_post_note": "Postáilte go deireanach breis agus seachtain ó shin", - "collections.remove_account": "Bain an cuntas seo", + "collections.pending_accounts.message": "Seans go bhfeicfear cuntais mar atá ar feitheamh agus muid ag fanacht ar fhreagra ón úsáideoir nó ón bhfreastalaí. Ní féidir ach leatsa cuntais atá ar feitheamh a fheiceáil.", + "collections.pending_accounts.title": "Cén fáth a bhfuil cuntais ar feitheamh á bhfaca mé?", + "collections.remove_account": "Bain", "collections.report_collection": "Tuairiscigh an bailiúchán seo", "collections.revoke_collection_inclusion": "Bain mé féin as an mbailiúchán seo", "collections.revoke_inclusion.confirmation": "Baineadh as \"{collection}\" thú", "collections.revoke_inclusion.error": "Tharla earráid, déan iarracht arís ar ball.", - "collections.search_accounts_label": "Cuardaigh cuntais le cur leis…", + "collections.search_accounts_label": "Cuardaigh cuntas le cur leis", "collections.search_accounts_max_reached": "Tá an líon uasta cuntas curtha leis agat", "collections.sensitive": "Íogair", + "collections.share_short": "Comhroinn", + "collections.suggestions.can_not_add": "Ní féidir a chur leis", + "collections.suggestions.can_not_add_desc": "B’fhéidir gur roghnaigh na cuntais seo gan a bheith san fhionnachtain, nó b’fhéidir go bhfuil siad ar fhreastalaí nach dtacaíonn le bailiúcháin.", + "collections.suggestions.must_follow": "Ní mór leanúint ar dtús", + "collections.suggestions.must_follow_desc": "Déanann na cuntais seo athbhreithniú ar gach iarratas leantach. Is féidir le leantóirí iad a chur le bailiúcháin.", "collections.topic_hint": "Cuir haischlib leis a chabhraíonn le daoine eile príomhábhar an bhailiúcháin seo a thuiscint.", "collections.topic_special_chars_hint": "Bainfear carachtair speisialta agus tú ag sábháil", + "collections.unlisted_collections_description": "Ní fheictear iad seo ar do phróifíl do dhaoine eile. Is féidir le duine ar bith a bhfuil an nasc aige iad a fháil amach.", + "collections.unlisted_collections_with_count": "Bailiúcháin neamhliostaithe ({count})", "collections.view_collection": "Féach ar bhailiúchán", - "collections.view_other_collections_by_user": "Féach ar bhailiúcháin eile ón úsáideoir seo", "collections.visibility_public": "Poiblí", "collections.visibility_public_hint": "Infheicthe i dtorthaí cuardaigh agus i réimsí eile ina bhfuil moltaí le feiceáil.", "collections.visibility_title": "Infheictheacht", @@ -405,7 +436,6 @@ "column.about": "Maidir le", "column.blocks": "Úsáideoirí blocáilte", "column.bookmarks": "Leabharmharcanna", - "column.collections": "Mo bhailiúcháin", "column.community": "Amlíne áitiúil", "column.create_list": "Cruthaigh liosta", "column.direct": "Luann príobháideach", @@ -422,8 +452,10 @@ "column.lists": "Liostaí", "column.mutes": "Úsáideoirí balbhaithe", "column.notifications": "Fógraí", + "column.other_collections": "Bailiúcháin le {name}", "column.pins": "Postálacha pionnáilte", "column.public": "Amlíne cónaidhmithe", + "column.your_collections": "Do Bhailiúcháin", "column_back_button.label": "Ar ais", "column_header.hide_settings": "Folaigh socruithe", "column_header.moveLeft_settings": "Bog an colún ar chlé", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "An bhfuil tú ag iarraidh do dhréachtphost a chaitheamh amach?", "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.follow_to_collection.confirm": "Lean agus cuir leis an mbailiúchán", - "confirmations.follow_to_collection.message": "Ní mór duit a bheith ag leanúint {name} le go gcuirfidh tú iad le bailiúchán.", - "confirmations.follow_to_collection.title": "Lean an cuntas?", "confirmations.follow_to_list.confirm": "Lean agus cuir leis an liosta", "confirmations.follow_to_list.message": "Ní mór duit {name} a leanúint chun iad a chur le liosta.", "confirmations.follow_to_list.title": "Lean an t-úsáideoir?", + "confirmations.hide_featured_tab.confirm": "Folaigh an cluaisín", + "confirmations.hide_featured_tab.intro": "Is féidir leat é seo a athrú am ar bith faoi Cuir próifíl in eagar > socruithe an chluaisín próifíle.", + "confirmations.hide_featured_tab.message": "Cuirfidh sé seo an cluaisín i bhfolach d’úsáideoirí ar {serverName} agus freastalaithe eile a bhfuil an leagan is déanaí de Mastodon á rith acu. D’fhéadfadh taispeántais eile a bheith éagsúil.", + "confirmations.hide_featured_tab.title": "An bhfuil tú ag iarraidh an cluaisín \"Réadmhaoin\" a cheilt?", "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?", @@ -529,6 +562,7 @@ "content_warning.hide": "Folaigh postáil", "content_warning.show": "Taispeáin ar aon nós", "content_warning.show_more": "Taispeáin níos mó", + "content_warning.show_short": "Taispeáin", "conversation.delete": "Scrios comhrá", "conversation.mark_as_read": "Marcáil mar léite", "conversation.open": "Féach ar comhrá", @@ -569,6 +603,14 @@ "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.", "dropdown.empty": "Roghnaigh rogha", + "email_subscriptions.email": "Ríomhphost", + "email_subscriptions.form.action": "Liostáil", + "email_subscriptions.form.bottom": "Faigh poist i do bhosca isteach gan cuntas Mastodon a chruthú. Díliostáil ag am ar bith. Le haghaidh tuilleadh eolais, féach ar an Polasaí Príobháideachta.", + "email_subscriptions.form.title": "Cláraigh le haghaidh nuashonruithe ríomhphoist ó {name}", + "email_subscriptions.submitted.lead": "Seiceáil do bhosca isteach le haghaidh ríomhphoist chun clárú le haghaidh nuashonruithe ríomhphoist a chríochnú.", + "email_subscriptions.submitted.title": "Céim amháin eile", + "email_subscriptions.validation.email.blocked": "Soláthraí ríomhphoist blocáilte", + "email_subscriptions.validation.email.invalid": "Seoladh ríomhphoist neamhbhailí", "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", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Torthaí cuardaigh", "emoji_button.symbols": "Comharthaí", "emoji_button.travel": "Taisteal ⁊ Áiteanna", - "empty_column.account_featured.me": "Níl aon rud curtha i láthair agat go fóill. An raibh a fhios agat gur féidir leat na haischlibeanna is mó a úsáideann tú, agus fiú cuntais do chairde, a chur i láthair ar do phróifíl?", - "empty_column.account_featured.other": "Níl aon rud feicthe ag {acct} go fóill. An raibh a fhios agat gur féidir leat na hashtags is mó a úsáideann tú, agus fiú cuntais do chairde, a chur ar do phróifíl?", - "empty_column.account_featured_other.unknown": "Níl aon rud le feiceáil sa chuntas seo go fóill.", + "empty_column.account_featured.other": "Níl aon rud le feiceáil ag {acct} go fóill.", + "empty_column.account_featured_self.no_collections_button": "Cruthaigh bailiúchán", + "empty_column.account_featured_self.no_collections_hide_tab": "Folaigh an cluaisín seo ina ionad", + "empty_column.account_featured_self.pre_collections": "Fan tiúnta le haghaidh bailiúcháin", + "empty_column.account_featured_self.pre_collections_desc": "Le bailiúcháin (atá ag teacht i Mastodon 4.6) is féidir leat do liostaí cuntas féin a chruthú le moladh do dhaoine eile.", + "empty_column.account_featured_self.showcase_accounts": "Taispeáin do chuntais is fearr leat", + "empty_column.account_featured_self.showcase_accounts_desc": "Is liostaí coimeádta cuntas iad bailiúcháin chun cabhrú le daoine eile níos mó den Fediverse a fháil amach.", + "empty_column.account_featured_unknown.other": "Níl aon rud le feiceáil ar an gcuntas seo go fóill.", "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!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Cé le leanúint", "followed_tags": "Hashtags le leanúint", "followers.hide_other_followers": "Tá an t-úsáideoir seo tar éis a roghnú gan a leantóirí eile a dhéanamh le feiceáil", + "followers.title": "Ag leanúint {name}", "following.hide_other_following": "Tá an t-úsáideoir seo tar éis a roghnú gan an chuid eile de na daoine a leanann siad a dhéanamh le feiceáil", + "following.title": "Ag leanúint {name}", "footer.about": "Maidir le", "footer.about_mastodon": "Maidir le Mastodon", "footer.about_server": "Maidir le {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Féach ar an gcód foinseach", "footer.status": "Stádas", "footer.terms_of_service": "Téarmaí seirbhíse", + "form_error.blank": "Ní féidir an réimse a fhágáil bán.", "form_field.optional": "(roghnach)", "generic.saved": "Sábháilte", "getting_started.heading": "Ag tosú amach", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Leathnaigh roghchlár na hashtaganna a leanann tú", "navigation_panel.expand_lists": "Leathnaigh an roghchlár liosta", "not_signed_in_indicator.not_signed_in": "Ní mór duit logáil isteach chun rochtain a fháil ar an acmhainn seo.", + "notification.added_to_collection": "Chuir {name} le bailiúchán thú", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} agus {count, plural, one {# duine eile} two {# daoine eile} few {# daoine eile} many {# daoine eile} other {# daoine eile}} a chláraigh", "notification.annual_report.message": "Tá do {year} #Wrapstodon ag fanacht! Nocht buaicphointí na bliana agus chuimhneacháin i gcuimhne ar Mastodon!", "notification.annual_report.view": "Amharc #Wrapstodon", + "notification.collection_update": "Chuir {name} bailiúchán ina bhfuil tú in eagar", "notification.favourite": "Is fearr le {name} do phostáil", "notification.favourite.name_and_others_with_link": "{name} agus {count, plural, one {# duine eile} other {# daoine eile}} thaitin le do phost", "notification.favourite_pm": "B'fhearr le {name} do lua príobháideach", @@ -1141,6 +1193,7 @@ "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.more_about_this_server": "Tuilleadh faoin bhfreastalaí seo", "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.", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 0ca7f12e3ed18f..ffb9a2c11b0ee4 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -14,19 +14,25 @@ "about.powered_by": "Lìonra sòisealta sgaoilte le cumhachd {mastodon}", "about.rules": "Riaghailtean an fhrithealaiche", "account.account_note_header": "Nòta pearsanta", + "account.activity": "Gnìomhachd", + "account.add_note": "Cuir nòta pearsanta ris", "account.add_or_remove_from_list": "Cuir ris no thoir air falbh o liostaichean", + "account.badges.admin": "Rianaire", + "account.badges.blocked": "’Ga bhacadh", "account.badges.bot": "Fèin-obrachail", + "account.badges.domain_blocked": "Àrainn bhacte", "account.badges.group": "Buidheann", + "account.badges.muted": "’Ga mhùchadh", + "account.badges.muted_until": "’Ga mhùchadh gu ruige {until}", "account.block": "Bac @{name}", "account.block_domain": "Bac an àrainn {domain}", "account.block_short": "Bac", "account.blocked": "’Ga bhacadh", - "account.blocking": "’Ga bhacadh", "account.cancel_follow_request": "Sguir dhen leantainn", "account.copy": "Dèan lethbhreac dhen cheangal dhan phròifil", "account.direct": "Thoir iomradh air @{name} gu prìobhaideach", "account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris", - "account.domain_blocking": "Àrainn ’ga bacadh", + "account.edit_note": "Deasaich an nòta pearsanta", "account.edit_profile": "Deasaich a’ phròifil", "account.edit_profile_short": "Deasaich", "account.enable_notifications": "Cuir brath thugam nuair a chuireas @{name} post ris", @@ -36,9 +42,14 @@ "account.familiar_followers_two": "’Ga leantainn le {name1} ’s {name2}", "account.featured": "’Ga bhrosnachadh", "account.featured.accounts": "Pròifilean", - "account.featured.hashtags": "Tagaichean hais", - "account.featured_tags.last_status_at": "Am post mu dheireadh {date}", - "account.featured_tags.last_status_never": "Gun phost", + "account.featured.collections": "Cruinneachaidhean", + "account.field_overflow": "Seall an t-susbaint shlàn", + "account.filters.all": "A’ ghnìomhachd air fad", + "account.filters.boosts_toggle": "Seall na brosnachaidhean", + "account.filters.posts_boosts": "Postaichean ’s brosnachaidhean", + "account.filters.posts_only": "Postaichean", + "account.filters.posts_replies": "Postaichean ’s freagairtean", + "account.filters.replies_toggle": "Seall na freagairtean", "account.follow": "Lean", "account.follow_back": "Lean air ais", "account.follow_back_short": "Lean air ais", @@ -59,28 +70,61 @@ "account.in_memoriam": "Mar chuimhneachan.", "account.joined_short": "Air ballrachd fhaighinn", "account.languages": "Atharraich fo-sgrìobhadh nan cànan", + "account.last_active": "Gnìomhach an turas mu dheireadh", "account.link_verified_on": "Chaidh dearbhadh cò leis a tha an ceangal seo {date}", "account.locked_info": "Tha prìobhaideachd ghlaiste aig a’ chunntais seo. Nì an sealbhadair lèirmheas a làimh air cò dh’fhaodas a leantainn.", "account.media": "Meadhanan", "account.mention": "Thoir iomradh air @{name}", + "account.menu.add_to_list": "Cuir ri liosta…", + "account.menu.block": "Bac an cunntas", + "account.menu.block_domain": "Bac {domain}", + "account.menu.copied": "Chaidh lethbhreac de cheangal a’ chunntais a chur air an stòr-bhòrd", + "account.menu.copy": "Dèan lethbhreac dhen cheangal", + "account.menu.direct": "Thoir iomradh air gu prìobhaideach", + "account.menu.hide_reblogs": "Falaich na brosnachaidhean air an loidhne-ama", + "account.menu.mention": "Thoir iomradh", + "account.menu.mute": "Mùch an cunntas", + "account.menu.note.description": "Chan fhaic ach thu fhèin seo", + "account.menu.open_original_page": "Seall air {domain}", + "account.menu.remove_follower": "Thoir an neach-leantainn air falbh", + "account.menu.report": "Dèan gearan mun chunntas", + "account.menu.share": "Co-roinn…", + "account.menu.show_reblogs": "Seall na brosnachaidhean air an loidhne-ama", + "account.menu.unblock": "Dì-bhac an cunntas", + "account.menu.unblock_domain": "Dì-bhac {domain}", + "account.menu.unmute": "Dì-mhùch an cunntas", "account.moved_to": "Dh’innis {name} gu bheil an cunntas ùr aca a-nis air:", "account.mute": "Mùch @{name}", "account.mute_notifications_short": "Mùch na brathan", "account.mute_short": "Mùch", "account.muted": "’Ga mhùchadh", - "account.muting": "’Ga mhùchadh", "account.mutual": "A’ leantainn càch a chèile", + "account.name.copy": "Dèan lethbhreac dhen aithnichear", + "account.name.help.domain": "Is {domain} am frithealaiche a tha ag òstadh pròifil ’s postaichean a’ chleachdaiche.", + "account.name.help.domain_self": "Is {domain} am frithealaiche agad-sa a tha ag òstadh pròifil ’s postaichean agad-sa.", + "account.name.help.header": "Tha aithnichear coltach ri seòladh puist-d", + "account.name.help.username": "Is {username} ainm-cleachdaiche a’ chunntais seo air an fhrithealaiche aca-san. Dh’fhaoidte gu bheil an t-aon ainm-cleachdaiche le cuideigin air frithealaiche eile.", + "account.name.help.username_self": "Is {username} d’ ainm-cleachdaiche air an fhrithealaiche seo. Dh’fhaoidte gu bheil an t-aon ainm-cleachdaiche le cuideigin air frithealaiche eile.", + "account.name_info": "Dè ’s ciall dha seo?", "account.no_bio": "Cha deach tuairisgeul a sholar.", + "account.node_modal.callout": "Chan fhaic ach thu fhèin na nòtaichean pearsanta.", + "account.node_modal.edit_title": "Deasaich an nòta pearsanta", + "account.node_modal.error_unknown": "Cha b’ urrainn dhuinn an nòta a shàbhaladh", + "account.node_modal.field_label": "Nòta pearsanta", + "account.node_modal.save": "Sàbhail", + "account.node_modal.title": "Cuir nòta pearsanta ris", + "account.note.edit_button": "Deasaich", + "account.note.title": "Nòta pearsanta (chan fhaic ach thu fhèin e)", "account.open_original_page": "Fosgail an duilleag thùsail", "account.posts": "Postaichean", - "account.posts_with_replies": "Postaichean ’s freagairtean", "account.remove_from_followers": "Thoir {name} air falbh on luchd-leantainn", "account.report": "Dèan gearan mu @{name}", "account.requested_follow": "Dh’iarr {name} ’gad leantainn", - "account.requests_to_follow_you": "Iarrtasan leantainn", "account.share": "Co-roinn a’ phròifil aig @{name}", "account.show_reblogs": "Seall na brosnachaidhean o @{name}", "account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", + "account.timeline.pinned": "Prìnichte", + "account.timeline.pinned.view_all": "Seall na postaichean prìnichte uile", "account.unblock": "Dì-bhac @{name}", "account.unblock_domain": "Dì-bhac an àrainn {domain}", "account.unblock_domain_short": "Dì-bhac", @@ -90,6 +134,111 @@ "account.unmute": "Dì-mhùch @{name}", "account.unmute_notifications_short": "Dì-mhùch na brathan", "account.unmute_short": "Dì-mhùch", + "account_edit.advanced_settings.bot_hint": "Comharraich do chàch gu bheil an cunntas seo ri gnìomhan fèin-obrachail gu h-àraidh is dh’fhaoidte nach doir duine sam bith sùil air idir", + "account_edit.advanced_settings.bot_label": "Cunntas fèin-obrachail", + "account_edit.advanced_settings.title": "Roghainnean adhartach", + "account_edit.bio.add_label": "Cuir ris roinn mu mo dhèidhinn", + "account_edit.bio.edit_label": "Deasaich an roinn mu mo dhèidhinn", + "account_edit.bio.placeholder": "Cuir thu fhèin an aithne càich gu goirid.", + "account_edit.bio.title": "Mu mo dhèidhinn", + "account_edit.bio_modal.add_title": "Cuir ris roinn mu mo dhèidhinn", + "account_edit.bio_modal.edit_title": "Deasaich an roinn mu mo dhèidhinn", + "account_edit.column_button": "Deiseil", + "account_edit.column_title": "Deasaich a’ phròifil", + "account_edit.custom_fields.add_label": "Cuir raon ris", + "account_edit.custom_fields.edit_label": "Deasaich an raon", + "account_edit.custom_fields.placeholder": "Cuir ris do riochdairean, ceanglaichean dhan taobh a-muigh no rud sam bith eile a bu mhiann leat co-roinneadh.", + "account_edit.custom_fields.reorder_button": "Atharraich òrdugh nan raointean", + "account_edit.custom_fields.tip_content": "Cuir ri teistealachd do chunntais Mhastodon gun duilgheadas le dearbhadh cheanglaichean gu duilleag-lìn sam bith a tha leatsa.", + "account_edit.custom_fields.tip_title": "Gliocas: Cuir ceangalaichean dearbhte ris", + "account_edit.custom_fields.title": "Raointean gnàthaichte", + "account_edit.custom_fields.verified_hint": "Ciamar a chuireas mi ceangal dearbhte ris?", + "account_edit.display_name.add_label": "Cuir ris ainm-taisbeanaidh", + "account_edit.display_name.edit_label": "Deasaich an t-ainm-taisbeanaidh", + "account_edit.display_name.placeholder": "’S e mar a nochdas d’ ainm air a’ phròifil agad agus air loidhnichean-ama a tha san ainm-taisbeanaidh agad.", + "account_edit.display_name.title": "Ainm-taisbeanaidh", + "account_edit.featured_hashtags.edit_label": "Cuir tagaichean hais ris", + "account_edit.featured_hashtags.placeholder": "Cuidich càch ach an aithnich iad na cuspairean as fheàrr leat ’s gum faigh iad grèim orra gu sgiobalta.", + "account_edit.featured_hashtags.title": "Tagaichean hais brosnaichte", + "account_edit.field_actions.delete": "Sguab às an raon", + "account_edit.field_actions.edit": "Deasaich an raon", + "account_edit.field_delete_modal.confirm": "A bheil thu cinnteach gu bheil thu airson an raon gnàthaichte seo a sguabadh às? Cha ghabh seo a neo-dhèanamh.", + "account_edit.field_delete_modal.delete_button": "Sguab às", + "account_edit.field_delete_modal.title": "A bheil thu airson an raon gnàthaichte a sguabadh às?", + "account_edit.field_edit_modal.add_title": "Cuir raon gnàthaichte ris", + "account_edit.field_edit_modal.discard_confirm": "Tilg air falbh", + "account_edit.field_edit_modal.discard_message": "Tha atharraichean gun sàbhaladh agad. A bheil thu cinnteach gu bheil airson an tilgeil air falbh?", + "account_edit.field_edit_modal.edit_title": "Deasaich an raoin gnàthaichte", + "account_edit.field_edit_modal.length_warning": "Chaidh thu thar crìoch nan caractaran a mholamaid. Dh’fhaoidte nach fhaicear an raon agad gu lèir air mobile.", + "account_edit.field_edit_modal.link_emoji_warning": "Mholamaid nach cleachd thu emojis gnàthaichte le URLaichean. Thèid raointean gnàthaichte sa bheil an dà chuid còmhla a shealltainn ’nan teacsa a-mhàin seach ’nan ceangal ach nach cuireamaid an luchd-cleachdaidh tro chèile.", + "account_edit.field_edit_modal.name_hint": "Can “Làrach-lìn phearsanta”", + "account_edit.field_edit_modal.name_label": "Leubail", + "account_edit.field_edit_modal.url_warning": "Airson ceangal a chur ris, gabh a-staigh {protocol} aig a thoiseach.", + "account_edit.field_edit_modal.value_hint": "Can “https://example.com”", + "account_edit.field_edit_modal.value_label": "Luach", + "account_edit.field_reorder_modal.drag_cancel": "Chaidh sgur dhen t-slaodadh. Chaidh an raon “{item}” a leigeil às.", + "account_edit.field_reorder_modal.drag_end": "Chaidh an raon “{item}” a leigeil às.", + "account_edit.field_reorder_modal.drag_instructions": "Airson òrdugh nan raointean gnàthaichte atharrachadh, brùth air space no enter. Fhad ’s a bhios tu ri slaodadh, cleachd na h-iuchraichean saighde a ghluasad an raoin suas no sìos. Brùth air space no enter a-rithist a leigeil às an raoin air an ionad ùr aige no brùth air escape airson sgur dheth.", + "account_edit.field_reorder_modal.drag_move": "Chaidh an raon “{item}” a ghluasad.", + "account_edit.field_reorder_modal.drag_over": "Chaidh an raon “{item}” a ghluasad thar “{over}”.", + "account_edit.field_reorder_modal.drag_start": "Chaidh an raon “{item}” a thogail.", + "account_edit.field_reorder_modal.handle_label": "Slaod an raon “{item}”", + "account_edit.field_reorder_modal.title": "Cuir òrdugh ùr air na raointean", + "account_edit.image_alt_modal.add_title": "Cuir roghainn teacsa ris", + "account_edit.image_alt_modal.details_content": "MHOLAMAID:
    • Gun doir thu dealbh ort
    • Gun cleachd thu cainnt treas pearsa (can “Ailig” seach “mise”)
    • Nach cleachd thu ach beagan fhaclan
    SEACHAINN:
    • Tòiseachadh le “Dealbh-camara de” – bhiodh sin anabarrach do leughadairean-sgrìn
    BALL-EISIMPLEIR:
    • “Ailig a’ caitheamh lèine ghorm agus speuclairean”
    ", + "account_edit.image_alt_modal.details_title": "Gliocasan: Roghainn teacsa air dealbhan pròifile", + "account_edit.image_alt_modal.edit_title": "Deasaich an roghainn teacsa", + "account_edit.image_alt_modal.text_hint": "Cuidichidh roghainn teacsa ach an tuigeadh ann fheadhainn a chleachdas leughadair-sgrìn do shusbaint.", + "account_edit.image_alt_modal.text_label": "Roghainn teacsa", + "account_edit.image_delete_modal.confirm": "A bheil thu cinnteach gu bheil thu airson an dealbh seo a sguabadh às? Cha ghabh seo a neo-dhèanamh.", + "account_edit.image_delete_modal.delete_button": "Sguab às", + "account_edit.image_delete_modal.title": "A bheil thu airson an dealbh a sguabadh às?", + "account_edit.image_edit.add_button": "Cuir dealbh ris", + "account_edit.image_edit.alt_add_button": "Cuir roghainn teacsa ris", + "account_edit.image_edit.alt_edit_button": "Deasaich an roghainn teacsa", + "account_edit.image_edit.remove_button": "Thoir air falbh an dealbh", + "account_edit.image_edit.replace_button": "Cuir dealbh ùr ’na àite", + "account_edit.item_list.delete": "Sguab às {name}", + "account_edit.item_list.edit": "Deasaich {name}", + "account_edit.name_modal.add_title": "Cuir ris ainm-taisbeanaidh", + "account_edit.name_modal.edit_title": "Deasaich an t-ainm-taisbeanaidh", + "account_edit.profile_tab.button_label": "Gnàthaich", + "account_edit.profile_tab.hint.description": "Gnàthaichidh na roghainnean seo na chì an luchd-cleachdaidh air {server} sna h-aplacaidean oifigeil ach dh’fhaoidte nach bi iad an sàs dhan luchd-cleachdaidh air frithealaichean eile is aplacaidean treas-phàrtaidh.", + "account_edit.profile_tab.hint.title": "Bidh na chithear fhathast eadar-dhealaichte", + "account_edit.profile_tab.show_featured.description": "’S e taba roghainneil a th’ ann an “’Ga bhrosnachadh” far an urrainn dhut cunntasan eile a nochdadh.", + "account_edit.profile_tab.show_featured.title": "Seall an taba “’Ga bhrosnachadh”", + "account_edit.profile_tab.show_media.description": "’S e taba roghainneil a th’ ann am “Meadhanan” a sheallas na postaichean agad ris a bheil dealbh no video.", + "account_edit.profile_tab.show_media.title": "Seall an taba “Meadhanan”", + "account_edit.profile_tab.show_media_replies.description": "Nuair a bhios seo an comas, seallaidh an taba “Meadhanan” an dà chuid na postaichean agad agus na freagairtean a rinn thu do phostaichean càich.", + "account_edit.profile_tab.show_media_replies.title": "Gabh a-staigh freagairtean air an taba “Meadhanan”", + "account_edit.save": "Sàbhail", + "account_edit.upload_modal.back": "Air ais", + "account_edit.upload_modal.done": "Deiseil", + "account_edit.upload_modal.next": "Air adhart", + "account_edit.upload_modal.step_crop.zoom": "Sùm", + "account_edit.upload_modal.step_upload.button": "Rùraich na faidhlichean", + "account_edit.upload_modal.step_upload.dragging": "Leig às airson luchdadh suas", + "account_edit.upload_modal.step_upload.header": "Tagh dealbh", + "account_edit.upload_modal.step_upload.hint": "Fòrmat WEBP, PNG, GIF no JPG, suas ri {limit}MB.{br}Thèid an dealbh a sgèileadh gu {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Cuir dealbh ris a’ phròifil", + "account_edit.upload_modal.title_add.header": "Cuir dealbh còmhdachaidh ris", + "account_edit.upload_modal.title_replace.avatar": "Cuir dealbh ùr an àite dealbh na pròifil", + "account_edit.upload_modal.title_replace.header": "Cuir dealbh ùr an àite an deilbh chòmhdachaidh", + "account_edit.verified_modal.details": "Cuir ri teistealachd do chunntais Mhastodon le dearbhadh cheanglaichean gu duilleagan-lìn parsanta. Seo mar a nì thu e:", + "account_edit.verified_modal.invisible_link.details": "Cuir an ceangal ris a’ bhann-chinn agad. ’S e rel=\"me\" a tha sa phàirt chudromach a bhacas riochd cuideigin eile air làraichean-lìn le susbaint air a gintinn o chleachdaiche. ’S urrainn dhut fiù taga link a chleachdadh ann am bann-cinn na duilleige seach {tag} ach feumaidh sinn an HTML ruigsinn gun a bhith a’ ruith JavaScript.", + "account_edit.verified_modal.invisible_link.summary": "Ciamar a dh’fhalaicheas mi an ceangal?", + "account_edit.verified_modal.step1.header": "Dèan lethbhreac dhen chòd HTML gu h-ìosal is cuir e ri bann-cinn na làraich-lìn agad", + "account_edit.verified_modal.step2.details": "Ma chuir thu an làrach-lìn agad mar raon ghnàthaichte ris cheana, feumaidh tu a sguabadh às ’s a chur ris a-rithist airson an dearbhadh a chur gu dol.", + "account_edit.verified_modal.step2.header": "Cuir an làrach-lìn agad ris ’na raon gnàthaichte", + "account_edit.verified_modal.title": "Mar a chuireas tu ceangal dearbhte ris", + "account_edit_tags.add_tag": "Cuir #{tagName} ris", + "account_edit_tags.column_title": "Deasaich na tagaichean", + "account_edit_tags.help_text": "Cuidichidh na tagaichean hais brosnaichte gun lorg an luchd-cleachdaidh a’ phròifil agad ’s ach an dèan iad conaltradh ris. Nochdaidh iad ’nan criathragan air sealladh “Gnìomhachd” duilleag na pròifil agad.", + "account_edit_tags.max_tags_reached": "Ràinig thu na tha ceadaichte dhut de thagaichean hais brosnaichte.", + "account_edit_tags.search_placeholder": "Cuir a-steach taga hais…", + "account_edit_tags.suggestions": "Molaidhean:", + "account_edit_tags.tag_status_count": "{count, plural, one {# phost} two {# phost} few {# postaichean} other {# post}}", + "account_list.total": "{total, plural, one {# chunntas} two {# chunntas} few {# cunntasan} other {# cunntas}}", "account_note.placeholder": "Briog airson nòta a chur ris", "admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha", "admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos", @@ -184,13 +333,67 @@ "bundle_modal_error.close": "Dùin", "bundle_modal_error.message": "Chaidh rudeigin ceàrr le luchdadh na sgrìn seo.", "bundle_modal_error.retry": "Feuch ris a-rithist", + "callout.dismiss": "Leig seachad", "carousel.current": "Sleamhnag {current, number} / {max, number}", "carousel.slide": "Sleamhnag {current, number} à {max, number}", + "character_counter.recommended": "{currentLength}/{maxLength} dhe na caractaran a mholamaid", + "character_counter.required": "{currentLength}/{maxLength} caractar(an)", "closed_registrations.other_server_instructions": "Air sgàth ’s gu bheil Mastodon sgaoilte, ’s urrainn dhut cunntas a chruthachadh air frithealaiche eile agus conaltradh ris an fhrithealaiche seo co-dhiù.", "closed_registrations_modal.description": "Cha ghabh cunntas a chruthachadh air {domain} aig an àm seo ach thoir an aire nach fheum thu cunntas air {domain} gu sònraichte airson Mastodon a chleachdadh.", "closed_registrations_modal.find_another_server": "Lorg frithealaiche eile", "closed_registrations_modal.preamble": "Tha Mastodon sgaoilte is mar sin dheth ge b’ e càit an cruthaich thu an cunntas agad, ’s urrainn dhut duine sam bith a leantainn air an fhrithealaiche seo is conaltradh leotha. ’S urrainn dhut fiù ’s frithealaiche agad fhèin òstadh!", "closed_registrations_modal.title": "Clàradh le Mastodon", + "collection.share_modal.share_via_post": "Postaich air Mastodon", + "collection.share_modal.share_via_system": "Co-roinn gu…", + "collection.share_modal.title": "Co-roinn an cruinneachadh", + "collection.share_modal.title_new": "Co-roinn an cruinneachadh ùr agad!", + "collection.share_template_other": "Thoir sùil air an deagh-chruinneachadh seo: {link}", + "collection.share_template_own": "Thoir sùil air a’ chruinneachadh ùr agam: {link}", + "collections.account_count": "{count, plural, one {# chunntas} two {# chunntas} few {# cunntasan} other {# cunntas}}", + "collections.accounts.empty_title": "Tha an an cruinneachadh seo falamh", + "collections.by_account": "le {account_handle}", + "collections.collection_description": "Tuairisgeul", + "collections.collection_language": "Cànan", + "collections.collection_language_none": "Chan eil gin", + "collections.collection_name": "Ainm", + "collections.collection_topic": "Cuspair", + "collections.confirm_account_removal": "A bheil thu cinnteach gu bheil thu airson an cunntas seo a thoirt air falbh on chruinneachadh seo?", + "collections.content_warning": "Rabhadh susbainte", + "collections.continue": "Lean air adhart", + "collections.create.accounts_title": "Cò bhrosnaicheas tu sa chruinneachadh seo?", + "collections.create.basic_details_title": "Bun-fhiosrachadh", + "collections.create.steps": "Ceum {step}/{total}", + "collections.create_collection": "Cruthaich cruinneachadh", + "collections.delete_collection": "Sguab an cruinneachadh às", + "collections.description_length_hint": "Crìoch de 100 caractar", + "collections.detail.author_added_you_on_date": "Chuir {author} ris thu {date}", + "collections.detail.loading": "A’ luchdadh a’ chruinneachaidh…", + "collections.detail.revoke_inclusion": "Thoir air falbh mi", + "collections.detail.sensitive_content": "Susbaint fhrionasach", + "collections.detail.sensitive_note": "Tha cunntasan is susbaint sa chruinneachadh seo a dh’fhaodadh a bhith frionasach do chuid.", + "collections.detail.share": "Co-roinn an cruinneachadh seo", + "collections.detail.you_are_in_this_collection": "Thathar do bhrosnachadh sa chruinneachadh seo", + "collections.edit_details": "Deasaich am fiosrachadh", + "collections.last_updated_at": "An tùrachadh mu dheireadh: {date}", + "collections.manage_accounts": "Stiùirich na cunntasan", + "collections.mark_as_sensitive": "Cuir comharra gu bheil e frionasach", + "collections.mark_as_sensitive_hint": "Falaichidh seo tuairisgeul is cunntasan a’ chruinneachaidh air cùlaibh rabhadh susbainte. Chithear ainm a’ chruinneachaidh fhathast.", + "collections.name_length_hint": "Crìoch de 40 caractar", + "collections.new_collection": "Cruinneachadh ùr", + "collections.report_collection": "Dèan gearan mun chruinneachadh seo", + "collections.revoke_collection_inclusion": "Thoir mi fhìn air falbh on chruinneachadh seo", + "collections.revoke_inclusion.confirmation": "Chaidh do thoirt air falbh o “{collection}”", + "collections.revoke_inclusion.error": "Thachair mearachd. Feuch ris a-rithist an ceann greis.", + "collections.search_accounts_max_reached": "Chuir thu na tha ceadaichte de chunntasan ris", + "collections.sensitive": "Frionasach", + "collections.topic_hint": "Cuir taga hais ris a chuidicheas càch le tuigse prìomh-chuspair a’ chruinneachaidh seo.", + "collections.topic_special_chars_hint": "Thèid caractaran sònraichte a thoirt air falbh nuair a thèid a shàbhaladh", + "collections.view_collection": "Seall an cruinneachadh ", + "collections.visibility_public": "Poblach", + "collections.visibility_public_hint": "Gabhaidh a rùrachadh ann an toraidhean luirg agus air àitichean eile far a nochdas molaidhean.", + "collections.visibility_title": "Faicsinneachd", + "collections.visibility_unlisted": "Falaichte o liostaichean", + "collections.visibility_unlisted_hint": "Chì duine sam bith aig a bheil ceangal e. Thèid fhalach o thoraidhean luirg ’s na molaidhean.", "column.about": "Mu dhèidhinn", "column.blocks": "Cleachdaichean bacte", "column.bookmarks": "Comharran-lìn", @@ -220,6 +423,11 @@ "column_header.show_settings": "Seall na roghainnean", "column_header.unpin": "Dì-phrìnich", "column_search.cancel": "Sguir dheth", + "combobox.close_results": "Dùin na toraidhean", + "combobox.loading": "’Ga luchdadh", + "combobox.no_results_found": "Cha deach toradh a lorg", + "combobox.open_results": "Fosgail na toraidhean", + "combobox.results_available": "Tha {count, plural, one {# mholadh} two {# mholadh} few {# molaidhean } other {# moladh}} ri fhaighinn. Cleachd an t-saighead suas no sìos airson gluasad mun cuairt. Brùth air Enter airson taghadh.", "community.column_settings.local_only": "Feadhainn ionadail a-mhàin", "community.column_settings.media_only": "Meadhanan a-mhàin", "community.column_settings.remote_only": "Feadhainn chèin a-mhàin", @@ -253,6 +461,9 @@ "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_collection.confirm": "Sguab às", + "confirmations.delete_collection.message": "Cha ghabh seo a neo-dhèanamh.", + "confirmations.delete_collection.title": "A bheil thu airson “{name}” 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?", @@ -291,6 +502,9 @@ "confirmations.remove_from_followers.confirm": "Thoir an neach-leantainn air falbh", "confirmations.remove_from_followers.message": "Cha lean {name} thu tuilleadh. A bheil thu cinnteach gu bheil thu airson leantainn air adhart?", "confirmations.remove_from_followers.title": "A bheil thu airson an neach-leantainn a thoirt air falbh?", + "confirmations.revoke_collection_inclusion.confirm": "Thoir air falbh mi", + "confirmations.revoke_collection_inclusion.message": "Tha an gnìomh seo buan agus chan urrainn dhan neach-tasgaidh do chur ris a’ chruinneachadh a-rithist an uair sin.", + "confirmations.revoke_collection_inclusion.title": "A bheil tu airson do thoirt air falbh on chruinneachadh seo?", "confirmations.revoke_quote.confirm": "Thoir am post air falbh", "confirmations.revoke_quote.message": "Cha ghabh seo a neo-dhèanamh.", "confirmations.revoke_quote.title": "A bheil thu airson am post a thoirt air falbh?", @@ -303,11 +517,13 @@ "content_warning.hide": "Falaich am post", "content_warning.show": "Seall e co-dhiù", "content_warning.show_more": "Seall barrachd dheth", + "content_warning.show_short": "Seall", "conversation.delete": "Sguab às an còmhradh", "conversation.mark_as_read": "Cuir comharra gun deach a leughadh", "conversation.open": "Seall an còmhradh", "conversation.with": "Còmhla ri {names}", "copy_icon_button.copied": "Chaidh lethbhreac dheth a chur air an stòr-bhòrd", + "copy_icon_button.copy_this_text": "Cuir lethbhreac dhen cheangal air an stòr-bhòrd", "copypaste.copied": "Chaidh lethbhreac dheth a dhèanamh", "copypaste.copy_to_clipboard": "Cuir lethbhreac dheth air an stòr-bhòrd", "directory.federated": "On cho-shaoghal aithnichte", @@ -342,6 +558,13 @@ "domain_pill.your_server": "Do dhachaigh dhigiteach far a bheil na postaichean uile agad a’ fuireach. Nach toigh leat an tè seo? Dèan imrich gu frithealaiche eile uair sam bith is thoir an luchd-leantainn agad leat cuideachd.", "domain_pill.your_username": "Seo an t-aithnichear àraidh agad air an fhrithealaiche seo. Dh’fhaoidte gu bheil luchd-cleachdaidh air a bheil an t-aon ainm air frithealaichean eile.", "dropdown.empty": "Tagh roghainn", + "email_subscriptions.email": "Post-d", + "email_subscriptions.form.action": "Fo-sgrìobh", + "email_subscriptions.form.bottom": "Faigh postaichean sa bhogsa a-steach agad às aonais cunntais Mhastodon. Cuir crìoch air an fho-sgrìobhadh uair sam bith. Airson barrachd fiosrachaidh, faic am poileasaidh prìobhaideachd.", + "email_subscriptions.form.title": "Clàraich airson naidheachdan {name} fhaighinn air a’ phost-d", + "email_subscriptions.submitted.lead": "Thoir sùil a bheil post-d sa a’ bhogsa a-steach agad airson an clàradh airson naidheachdan puist-d a choileanadh.", + "email_subscriptions.submitted.title": "Aon cheum eile", + "email_subscriptions.validation.email.invalid": "Seòladh puist-d mì-dhligheach", "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.", "embed.preview": "Seo an coltas a bhios air:", "emoji_button.activity": "Gnìomhachd", @@ -359,9 +582,8 @@ "emoji_button.search_results": "Toraidhean an luirg", "emoji_button.symbols": "Samhlaidhean", "emoji_button.travel": "Siubhal ⁊ àitichean", - "empty_column.account_featured.me": "Chan eil thu a’ brosnachadh dad fhathast. An robh fios agad gur urrainn dhut na tagaichean hais a chleachdas tu as trice agus fiù ’s cunntasan do charaidean a bhrosnachadh air a’ phròifil agad?", - "empty_column.account_featured.other": "Chan eil {acct} a’ brosnachadh dad fhathast. An robh fios agad gur urrainn dhut na tagaichean hais a chleachdas tu as trice agus fiù ’s cunntasan do charaidean a bhrosnachadh air a’ phròifil agad?", - "empty_column.account_featured_other.unknown": "Chan eil an cunntas seo a’ brosnachadh dad fhathast.", + "empty_column.account_featured_self.no_collections_button": "Cruthaich cruinneachadh", + "empty_column.account_featured_unknown.other": "Chan eil an cunntas seo a’ brosnachadh dad fhathast.", "empty_column.account_hides_collections": "Chuir an cleachdaiche seo roimhe nach eil am fiosrachadh seo ri fhaighinn", "empty_column.account_suspended": "Chaidh an cunntas a chur à rèim", "empty_column.account_timeline": "Chan eil post an-seo!", @@ -384,6 +606,7 @@ "empty_column.notification_requests": "Glan! Chan eil dad an-seo. Nuair a gheibh thu brathan ùra, nochdaidh iad an-seo a-rèir nan roghainnean agad.", "empty_column.notifications": "Cha d’ fhuair thu brath sam bith fhathast. Nuair a nì càch conaltradh leat, chì thu an-seo e.", "empty_column.public": "Chan eil dad an-seo! Sgrìobh rudeigin gu poblach no lean càch o fhrithealaichean eile a làimh airson seo a lìonadh", + "empty_state.no_results": "Gun toradh", "error.no_hashtag_feed_access": "Cruthaich cunntas no clàraich a-steach airson an taga hais seo a shealltainn is leantainn.", "error.unexpected_crash.explanation": "Air sàilleibh buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair, chan urrainn dhuinn an duilleag seo a shealltainn mar bu chòir.", "error.unexpected_crash.explanation_addons": "Cha b’ urrainn dhuinn an duilleag seo a shealltainn mar bu chòir. Tha sinn an dùil gu do dh’adhbharaich tuilleadan a’ bhrabhsair no inneal eadar-theangachaidh fèin-obrachail a’ mhearachd.", @@ -399,6 +622,11 @@ "featured_carousel.current": "Post {current, number} / {max, number}", "featured_carousel.header": "{count, plural, one {Post prìnichte} two {Postaichean prìnichte} few {Postaichean prìnichte} other {Postaichean prìnichte}}", "featured_carousel.slide": "Post {current, number} à {max, number}", + "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Sgrìobh thu mu {items} o chionn goirid. A bheil thu airson an cur ris ’nan tagaichean hais brosnaichte?", + "featured_tags.suggestions.add": "Cuir ris", + "featured_tags.suggestions.added": "Stiùirich na tagaichean hais brosnaichte agad uair sam bith aig Deasaich a’ phròifil > Tagaichean hais brosnaichte.", + "featured_tags.suggestions.dismiss": "Na cuir ris", "filter_modal.added.context_mismatch_explanation": "Chan eil an roinn-seòrsa criathraidh iom seo chaidh dhan cho-theacs san do dh’inntrig thu am post seo. Ma tha thu airson am post a chriathradh sa cho-theacs seo cuideachd, feumaidh tu a’ chriathrag a dheasachadh.", "filter_modal.added.context_mismatch_title": "Co-theacsa neo-iomchaidh!", "filter_modal.added.expired_explanation": "Dh’fhalbh an ùine air an roinn-seòrsa criathraidh seo agus feumaidh tu an ceann-là crìochnachaidh atharrachadh mus cuir thu an sàs i.", @@ -440,6 +668,10 @@ "follow_suggestions.view_all": "Seall na h-uile", "follow_suggestions.who_to_follow": "Molaidhean leantainn", "followed_tags": "Tagaichean hais ’gan leantainn", + "followers.hide_other_followers": "Chuir an cleachdaiche seo roimhe nach fhaicear an luchd-leantainn eile aca", + "followers.title": "A’ leantainn {name}", + "following.hide_other_following": "Chuir an cleachdaiche seo roimhe nach fhaicear cò eile a leanas iad", + "following.title": "’Ga leantainn le {name}", "footer.about": "Mu dhèidhinn", "footer.about_mastodon": "Mu Mhastodon", "footer.about_server": "Mu {domain}", @@ -451,6 +683,8 @@ "footer.source_code": "Seall am bun-tùs", "footer.status": "Staid", "footer.terms_of_service": "Teirmichean na seirbheise", + "form_error.blank": "Chan fhaod an raon a bhith bàn.", + "form_field.optional": "(roghainneil)", "generic.saved": "Chaidh a shàbhaladh", "getting_started.heading": "Toiseach", "hashtag.admin_moderation": "Fosgail eadar-aghaidh na maorsainneachd dha #{name}", @@ -520,6 +754,7 @@ "keyboard_shortcuts.direct": "Fosgail colbh nan iomraidhean prìobhaideach", "keyboard_shortcuts.down": "Gluais sìos air an liosta", "keyboard_shortcuts.enter": "Fosgail post", + "keyboard_shortcuts.explore": "Fosgail na treandaichean", "keyboard_shortcuts.favourite": "Cuir am post ris na h-annsachdan", "keyboard_shortcuts.favourites": "Fosgail liosta nan annsachdan", "keyboard_shortcuts.federated": "Fosgail an loidhne-ama cho-naisgte", @@ -606,6 +841,7 @@ "navigation_bar.automated_deletion": "Sguabadh às phostaichean", "navigation_bar.blocks": "Cleachdaichean bacte", "navigation_bar.bookmarks": "Comharran-lìn", + "navigation_bar.collections": "Cruinneachaidhean", "navigation_bar.direct": "Iomraidhean prìobhaideach", "navigation_bar.domain_blocks": "Àrainnean bacte", "navigation_bar.favourites": "Annsachdan", @@ -706,7 +942,7 @@ "notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath", "notifications.column_settings.follow": "Luchd-leantainn ùr:", "notifications.column_settings.follow_request": "Iarrtasan leantainn ùra:", - "notifications.column_settings.group": "Buidheann", + "notifications.column_settings.group": "Buidhnich", "notifications.column_settings.mention": "Iomraidhean:", "notifications.column_settings.poll": "Toraidhean cunntais-bheachd:", "notifications.column_settings.push": "Brathan putaidh", @@ -753,18 +989,20 @@ "notifications_permission_banner.title": "Na caill dad gu bràth tuilleadh", "onboarding.follows.back": "Air ais", "onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.", + "onboarding.follows.next": "Air adhart: Suidhich a’ phròifil agad", "onboarding.follows.search": "Lorg", "onboarding.follows.title": "Lean daoine airson tòiseachadh", "onboarding.profile.discoverable": "Bu mhath leam gun gabh a’ phròifil agam a rùrachadh", "onboarding.profile.discoverable_hint": "Ma chuir thu romhad gun gabh a’ phròifil agad a rùrachadh air Mastodon, faodaidh na postaichean agad nochdadh ann an toraidhean luirg agus treandaichean agus dh’fhaoidte gun dèid a’ phròifil agad a mholadh dhan fheadhainn aig a bheil ùidhean coltach ri d’ ùidhean-sa.", "onboarding.profile.display_name": "Ainm-taisbeanaidh", "onboarding.profile.display_name_hint": "D’ ainm slàn no spòrsail…", + "onboarding.profile.finish": "Crìochnaich", "onboarding.profile.note": "Cunntas-beatha", "onboarding.profile.note_hint": "’S urrainn dhut @iomradh a thoirt air càch no air #tagaicheanHais…", "onboarding.profile.title": "Suidheachadh na pròifile", "onboarding.profile.upload_avatar": "Luchdaich suas dealbh na pròifil", "onboarding.profile.upload_header": "Luchdaich suas bann-cinn na pròifil", - "password_confirmation.exceeds_maxlength": "Tha dearbhadh an fhacail-fhaire nas fhaide na tha ceadaichte do dh’faclan-faire", + "password_confirmation.exceeds_maxlength": "Tha dearbhadh an fhacail-fhaire nas fhaide na tha ceadaichte do dh’fhaclan-faire", "password_confirmation.mismatching": "Chan eil an dearbhadh co-ionnan ris an fhacal-fhaire", "picture_in_picture.restore": "Thoir air ais e", "poll.closed": "Dùinte", @@ -784,6 +1022,7 @@ "privacy.private.short": "Luchd-leantainn", "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", "privacy.public.short": "Poblach", + "privacy.quote.anyone": "{visibility}, luaidh ceadaichte", "privacy.quote.disabled": "{visibility}, luaidh à comas", "privacy.quote.limited": "{visibility}, luaidh cuingichte", "privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.", @@ -829,6 +1068,7 @@ "report.category.title_account": "phròifil", "report.category.title_status": "phost", "report.close": "Deiseil", + "report.collection_comment": "Carson a tha thu airson gearan a dhèanamh mun chruinneachadh seo?", "report.comment.title": "A bheil rud sam bith eile a bu toigh leat innse dhuinn?", "report.forward": "Sìn air adhart gu {target}", "report.forward_hint": "Chaidh an cunntas a chlàradh air frithealaiche eile. A bheil thu airson lethbhreac dhen ghearan a chur dha-san gun ainm cuideachd?", @@ -850,6 +1090,8 @@ "report.rules.title": "Dè na riaghailtean a tha ’gam briseadh?", "report.statuses.subtitle": "Tagh a h-uile gin a tha iomchaidh", "report.statuses.title": "A bheil postaichean sam bith ann a tha ’nam fianais dhan ghearan seo?", + "report.submission_error": "Cha b’ urrainn dhuinn an gearan a chur a-null", + "report.submission_error_details": "Thoir sùil air a’ cheangal ris an lìonra agad is feuch ris a-rithist an ceann greis.", "report.submit": "Cuir a-null", "report.target": "A’ gearan mu {target}", "report.thanks.take_action": "Seo na roghainnean a th’ agad airson stiùireadh na chì thu air Mastodon:", @@ -903,6 +1145,9 @@ "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", + "skip_links.hotkey": "Grad-iuchair {hotkey}", + "skip_links.skip_to_content": "Geàrr leum chun na prìomh-shusbainte", + "skip_links.skip_to_navigation": "Geàrr leum chun na prìomh-sheòladaireachd", "status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}", "status.admin_domain": "Fosgail eadar-aghaidh na maorsainneachd dha {domain}", "status.admin_status": "Fosgail am post seo ann an eadar-aghaidh na maorsainneachd", @@ -1004,6 +1249,7 @@ "tabs_bar.notifications": "Brathan", "tabs_bar.publish": "Post ùr", "tabs_bar.search": "Lorg", + "tag.remove": "Thoir air falbh", "terms_of_service.effective_as_of": "Èifeachdach on {date}", "terms_of_service.title": "Teirmichean na seirbheise", "terms_of_service.upcoming_changes_on": "Tha atharraichean ri thighinn air {date}", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index af372edd2b73bd..05b2fb9b2b33e2 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear o dominio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueada", - "account.blocking": "Bloqueos", "account.cancel_follow_request": "Desbotar a solicitude de seguimento", "account.copy": "Copiar ligazón ao perfil", "account.direct": "Mencionar de xeito privado a @{name}", "account.disable_notifications": "Deixar de notificarme cando @{name} publica", - "account.domain_blocking": "Bloqueo do dominio", "account.edit_note": "Editar a nota persoal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Destacado", "account.featured.accounts": "Perfís", "account.featured.collections": "Coleccións", - "account.featured.hashtags": "Cancelos", - "account.featured_tags.last_status_at": "Última publicación o {date}", - "account.featured_tags.last_status_never": "Sen publicacións", + "account.featured.new_collection": "Nova colección", "account.field_overflow": "Mostrar contido completo", "account.filters.all": "Toda actividade", "account.filters.boosts_toggle": "Mostrar promocións", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ir ao perfil", "account.hide_reblogs": "Agochar promocións de @{name}", "account.in_memoriam": "Lembranzas.", + "account.join_modal.day": "Día", + "account.join_modal.me": "Unícheste a {server} o", + "account.join_modal.me_anniversary": "Feliz Fediversario! Chegaches a {server} o", + "account.join_modal.me_today": "É o teu primeiro día en {server}!", + "account.join_modal.other": "{name} uníuse a {server} o", + "account.join_modal.other_today": "É o primeiro día de {name} en {server}!", + "account.join_modal.share.celebrate": "Comparte unha mensaxe de celebración", + "account.join_modal.share.intro": "Comparte unha mensaxe de presentación", + "account.join_modal.share.welcome": "Comparte unha mensaxe de benvida", + "account.join_modal.years": "{number, plural, one {ano} other {anos}}", "account.joined_short": "Uniuse", "account.languages": "Modificar os idiomas subscritos", + "account.last_active": "Última actividade", "account.link_verified_on": "A propiedade desta ligazón foi verificada o {date}", "account.locked_info": "Esta é unha conta privada. A propietaria revisa de xeito manual quen pode seguila.", "account.media": "Multimedia", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Silenciar notificacións", "account.mute_short": "Acalar", "account.muted": "Acalada", - "account.muting": "Silenciamento", "account.mutual": "Seguimento mútuo", + "account.name.copy": "Copiar identificador", "account.name.help.domain": "{domain} é o servidor que aloxa o perfil e as publicacións da usuaria.", "account.name.help.domain_self": "{domain} é o servidor que aloxa o teu perfil e publicacións.", - "account.name.help.footer": "Ao igual que envías correos electrónicos a persoas que usan diferentes provedores, podes interactuar con persoas en outros servidores Mastodon ― e con calquera outra que use aplicacións que sigan o mesmo sistema que usa Mastodon (o protocolo ActivityPub).", + "account.name.help.footer": "Do mesmo xeito que podes enviar un correo electrónico a unha persoa que utiliza outro provedor, podes relacionarte con persoas doutros servidores Mastodon, e con calquera das outras aplicacións sociais compatibles con Mastodon.", "account.name.help.header": "Un alcume é o como o enderezo de correo", "account.name.help.username": "{username} é o nome de usuaria da conta no seu servidor. Alguén noutro servidor podería ter o mesmo nome de usuaria.", "account.name.help.username_self": "{username} é o teu nome de usuaria nete servidor. Alguén noutro sevidor podería ter o mesmo nome de usuaria.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Editar", "account.note.title": "Nota persoal (só ti podes vela)", "account.open_original_page": "Abrir páxina orixinal", + "account.pending": "Pendente", "account.posts": "Publicacións", - "account.posts_with_replies": "Publicacións e respostas", "account.remove_from_followers": "Retirar a {name} das seguidoras", "account.report": "Informar sobre @{name}", "account.requested_follow": "{name} solicitou seguirte", - "account.requests_to_follow_you": "Solicita 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}}", @@ -141,34 +147,42 @@ "account.unmute": "Deixar de silenciar a @{name}", "account.unmute_notifications_short": "Reactivar notificacións", "account.unmute_short": "Non silenciar", + "account_edit.advanced_settings.bot_hint": "Advirte ás usuarias de que esta conta realiza principalmente accións automatizadas e podería non estar monitorizada", + "account_edit.advanced_settings.bot_label": "Conta automatizada", + "account_edit.advanced_settings.title": "Axustes avanzados", + "account_edit.bio.add_label": "Engadir biografía", + "account_edit.bio.edit_label": "Editar biografía", "account_edit.bio.placeholder": "Escribe unha breve presentación para que te coñezan mellor.", "account_edit.bio.title": "Sobre ti", "account_edit.bio_modal.add_title": "Engadir biografía", "account_edit.bio_modal.edit_title": "Editar biografía", - "account_edit.button.add": "Engadir {item}", - "account_edit.button.delete": "Eliminar {item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Feito", "account_edit.column_title": "Editar perfil", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Engadir un campo", + "account_edit.custom_fields.edit_label": "Edita o campo", "account_edit.custom_fields.placeholder": "Engade os teus pronomes, ligazóns externas, ou o que queiras compartir.", "account_edit.custom_fields.reorder_button": "Reordenar os campos", "account_edit.custom_fields.tip_content": "Podes darlle maior credibilidade á túa conta Mastodon se verificas as ligazóns a sitios web da túa propiedade.", "account_edit.custom_fields.tip_title": "Consello: Engadir ligazóns verificadas", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "Como engado unha ligazón verificada?", + "account_edit.display_name.add_label": "Engadir nome público", + "account_edit.display_name.edit_label": "Editar o nome público", "account_edit.display_name.placeholder": "O nome público é o nome que aparece no perfil e nas cronoloxías.", "account_edit.display_name.title": "Nome público", - "account_edit.featured_hashtags.item": "cancelos", + "account_edit.featured_hashtags.edit_label": "Engadir cancelos", "account_edit.featured_hashtags.placeholder": "Facilita que te identifiquen, e da acceso rápido aos teus intereses favoritos.", "account_edit.featured_hashtags.title": "Cancelos destacados", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Edita o campo", "account_edit.field_delete_modal.confirm": "Tes certeza de querer eliminar este campo persoal? A acción non se pode desfacer.", "account_edit.field_delete_modal.delete_button": "Eliminar", "account_edit.field_delete_modal.title": "Eliminar campo persoal?", "account_edit.field_edit_modal.add_title": "Engadir campo persoal", + "account_edit.field_edit_modal.discard_confirm": "Desbotar", + "account_edit.field_edit_modal.discard_message": "Tes cambios sen gardar. Tes certeza de querer desbotalos?", "account_edit.field_edit_modal.edit_title": "Editar campo persoal", - "account_edit.field_edit_modal.limit_header": "Superouse o límite de caracteres recomendado", - "account_edit.field_edit_modal.limit_message": "Nos dispositivos móbiles podería non verse o campo completo.", + "account_edit.field_edit_modal.length_warning": "Superouse o límite de caracteres recomendado. Nos móbiles podería non verse o campo completo.", "account_edit.field_edit_modal.link_emoji_warning": "Non recomendamos o uso de emojis persoais combinados con URLs. Os campos persoais que conteñen ambos móstranse só como texto e non como unha ligazón, para evitar a confusión de quen os lea.", "account_edit.field_edit_modal.name_hint": "Ex. \"Páxina web persoal\"", "account_edit.field_edit_modal.name_label": "Etiqueta", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Editar descrición", "account_edit.image_edit.remove_button": "Retirar a imaxe", "account_edit.image_edit.replace_button": "Substituír a imaxe", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Engadir nome público", "account_edit.name_modal.edit_title": "Editar o nome público", "account_edit.profile_tab.button_label": "Personalizar", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Mostrar pestana 'Multimedia'", "account_edit.profile_tab.show_media_replies.description": "Ao activala, a pestana Multimedia mostra tanto as túas publicacións como as respostas a outras persoas.", "account_edit.profile_tab.show_media_replies.title": "Incluír respostas na pestana 'Multimedia'", - "account_edit.profile_tab.subtitle": "Personaliza as pestanas e o seu contido no teu perfil.", - "account_edit.profile_tab.title": "Perfil e axustes das pestanas", "account_edit.save": "Gardar", "account_edit.upload_modal.back": "Volver", "account_edit.upload_modal.done": "Feito", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Solta aquí para subir", "account_edit.upload_modal.step_upload.header": "Escoller unha imaxe", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF ou JPG, ata {limit}MB.{br}A imaxe será comprimida a {width}x{height}px.", - "account_edit.upload_modal.title_add": "Engadir foto do perfil", - "account_edit.upload_modal.title_replace": "Substituír foto do perfil", + "account_edit.upload_modal.title_add.avatar": "Engadir foto do perfil", + "account_edit.upload_modal.title_add.header": "Engadir foto da cabeceira", + "account_edit.upload_modal.title_replace.avatar": "Substituír foto do perfil", + "account_edit.upload_modal.title_replace.header": "Substituír foto da cabeceira", "account_edit.verified_modal.details": "Engade maior credibilidade ao teu perfil Mastodon verificando as ligazóns ás túas páxinas web persoais. Funciona así:", "account_edit.verified_modal.invisible_link.details": "Engade a ligazón ao «header» da páxina web. A parte importante é rel=\"me\", que evita a suplantación en sitios web con contido creado polas usuarias. Tamén podes usar a etiqueta «link» na cabeceira da páxina no lugar de {tag}, pero o HTML ten que ser accesible sen usar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Como fago visible a ligazón?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Engade a túa páxina como campo persoal", "account_edit.verified_modal.title": "Como engadir unha ligazón verificada", "account_edit_tags.add_tag": "Engadir #{tagName}", - "account_edit_tags.column_title": "Editar cancelos destacados", + "account_edit_tags.column_title": "Editar etiquetas", "account_edit_tags.help_text": "Os cancelos destacados axúdanlle ás usuarias a atopar e interactuar co teu perfil. Aparecen como filtros na túa páxina de perfil na vista Actividade.", + "account_edit_tags.max_tags_reached": "Acadaches o número máximo de cancelos destacados.", "account_edit_tags.search_placeholder": "Escribe un cancelo…", "account_edit_tags.suggestions": "Suxestións:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicación} other {# publicacións}}", + "account_list.total": "{total, plural, one {# conta} other {# contas}}", "account_note.placeholder": "Preme para engadir nota", "admin.dashboard.daily_retention": "Ratio de retención de usuarias diaria após rexistrarse", "admin.dashboard.monthly_retention": "Ratio de retención de usuarias mensual após o rexistro", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Atopa outro servidor", "closed_registrations_modal.preamble": "Mastodon é descentralizado, así que non importa onde crees a conta, poderás seguir e interactuar con calquera conta deste servidor. Incluso podes ter o teu servidor!", "closed_registrations_modal.title": "Crear conta en Mastodon", - "collection.share_modal.share_link_label": "Ligazón para compartir", + "collection.share_modal.share_link_label": "Compartir ligazón", "collection.share_modal.share_via_post": "Publicar en Mastodon", "collection.share_modal.share_via_system": "Compartir con…", "collection.share_modal.title": "Compartir colección", @@ -346,8 +364,11 @@ "collection.share_template_other": "Mira que colección máis boa: {link}", "collection.share_template_own": "Mira a miña nova colección: {link}", "collections.account_count": "{count, plural, one {# conta} other {# contas}}", - "collections.accounts.empty_description": "Engade ata {count} contas que segues", + "collections.accounts.empty_description": "Engade ate {count} contas", + "collections.accounts.empty_editor_title": "Aínda non hai ninguén nesta colección", "collections.accounts.empty_title": "A colección está baleira", + "collections.block_collection_owner": "Bloquear conta", + "collections.by_account": "de {account_handle}", "collections.collection_description": "Descrición", "collections.collection_language": "Idioma", "collections.collection_language_none": "Ningún", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Tes certeza de querer retirar esta conta desta colección?", "collections.content_warning": "Aviso sobre o contido", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Só se poden engadir contas que segues e que optaron por ser incluídas en descubrir.", + "collections.copy_link": "Copiar ligazón", + "collections.copy_link_confirmation": "Copiouse ao portapapeis a ligazón á colección", "collections.create.accounts_title": "A quen queres incluír nesta colección?", "collections.create.basic_details_title": "Detalles básicos", "collections.create.steps": "Paso {step}/{total}", - "collections.create_a_collection_hint": "Crear unha colección para recomendar ou compartir as túas contas favoritas.", "collections.create_collection": "Crear colección", "collections.delete_collection": "Eliminar colección", "collections.description_length_hint": "Límite de 100 caracteres", - "collections.detail.accept_inclusion": "Vale", - "collections.detail.accounts_heading": "Contas", - "collections.detail.author_added_you": "{author} engadíute a esta colección", - "collections.detail.curated_by_author": "Seleccionadas por {author}", - "collections.detail.curated_by_you": "Seleccionadas por ti", + "collections.detail.author_added_you_on_date": "{author} engadiute o {date}", "collections.detail.loading": "Cargando colección…", - "collections.detail.other_accounts_in_collection": "Outras contas na colección:", - "collections.detail.revoke_inclusion": "Non quero", + "collections.detail.revoke_inclusion": "Quítame de aí", + "collections.detail.sensitive_content": "Contido sensible", "collections.detail.sensitive_note": "Esta colección presenta contas e contido que poderían ser sensibles para algunhas persoas.", "collections.detail.share": "Compartir esta colección", + "collections.detail.you_are_in_this_collection": "Engadíronte a esta colección", "collections.edit_details": "Editar detalles", - "collections.error_loading_collections": "Houbo un erro ao intentar cargar as túas coleccións.", - "collections.hints.accounts_counter": "{count} / {max} contas", + "collections.hidden_accounts_description": "Bloqueaches ou silenciaches {count, plural, one {esta conta} other {estas contas}}", + "collections.hidden_accounts_link": "{count, plural, one {# conta oculta} other {# contas ocultas}}", + "collections.hints.accounts_counter": "{count}/{max} contas", "collections.last_updated_at": "Última actualización: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Colección} other {# Coleccións}}", + "collections.list.created_by_author": "Creada por {name}", + "collections.list.created_by_you": "Creada por ti", + "collections.list.featuring_you": "Das que formas parte", "collections.manage_accounts": "Xestionar contas", "collections.mark_as_sensitive": "Marcar como sensible", "collections.mark_as_sensitive_hint": "Oculta a descrición e contas da colección detrás dun aviso sobre o contido. O nome da colección permanece visible.", + "collections.maximum_collection_count_description": "O teu servidor permíteche crear ata {count} coleccións.", + "collections.maximum_collection_count_reached": "Creaches o número máximo de coleccións", "collections.name_length_hint": "Límite de 40 caracteres", "collections.new_collection": "Nova colección", - "collections.no_collections_yet": "Aínda non tes coleccións.", - "collections.old_last_post_note": "Hai máis dunha semana da última publicación", - "collections.remove_account": "Retirar esta conta", + "collections.pending_accounts.message": "As contas poden aparecer como pendentes cando están agardando a resposta da usuaria no seu servidor. As contas pendentes só as podes ver ti.", + "collections.pending_accounts.title": "Por que vexo contas que están pendentes?", + "collections.remove_account": "Retirar", "collections.report_collection": "Denunciar esta colección", "collections.revoke_collection_inclusion": "Sácame desta colección", "collections.revoke_inclusion.confirmation": "Quitámoste da colección \"{collection}\"", "collections.revoke_inclusion.error": "Algo fallou, inténtao outra vez máis tarde.", - "collections.search_accounts_label": "Buscar contas para engadir…", + "collections.search_accounts_label": "Busca contas para engadilas", "collections.search_accounts_max_reached": "Acadaches o máximo de contas permitidas", "collections.sensitive": "Sensible", + "collections.share_short": "Compartir", + "collections.suggestions.can_not_add": "Non se pode engadir", + "collections.suggestions.can_not_add_desc": "Estas contas optaron por poder ser engadidas, ou pode que estean nun servidor que aínda non é compatible coas coleccións.", + "collections.suggestions.must_follow": "Primeiro tes que seguila", + "collections.suggestions.must_follow_desc": "Estas contas revisan todas as solicitudes de seguimento. As seguidoras poden engadilas a coleccións.", "collections.topic_hint": "Engadir un cancelo para que axudar a que outras persoas coñezan a temática desta colección.", "collections.topic_special_chars_hint": "Vanse eliminar os caracteres especiais ao gardar", + "collections.unlisted_collections_description": "Estas non se mostran no teu perfil, pero calquera que coñeza a ligazón pode velas.", + "collections.unlisted_collections_with_count": "Coleccións fóra do perfil ({count})", "collections.view_collection": "Ver colección", - "collections.view_other_collections_by_user": "Ver outras coleccións desta usuaria", "collections.visibility_public": "Pública", "collections.visibility_public_hint": "Pódese atopar nos resultados das buscas e noutras áreas onde se mostran recomendacións.", "collections.visibility_title": "Visibilidade", @@ -405,7 +436,6 @@ "column.about": "Sobre", "column.blocks": "Usuarias bloqueadas", "column.bookmarks": "Marcadores", - "column.collections": "As miñas coleccións", "column.community": "Cronoloxía local", "column.create_list": "Crear lista", "column.direct": "Mencións privadas", @@ -422,8 +452,10 @@ "column.lists": "Listaxes", "column.mutes": "Usuarias acaladas", "column.notifications": "Notificacións", + "column.other_collections": "Coleccións de {name}", "column.pins": "Publicacións fixadas", "column.public": "Cronoloxía federada", + "column.your_collections": "As túas coleccións", "column_back_button.label": "Volver", "column_header.hide_settings": "Agochar axustes", "column_header.moveLeft_settings": "Mover columna cara a esquerda", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Desbotar o borrador?", "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.follow_to_collection.confirm": "Seguir e engadir á colección", - "confirmations.follow_to_collection.message": "Tes que seguir a {name} para poder engadila a unha colección.", - "confirmations.follow_to_collection.title": "Seguir a conta?", "confirmations.follow_to_list.confirm": "Seguir e engadir á lista", "confirmations.follow_to_list.message": "Tes que seguir a {name} para poder engadila a unha lista.", "confirmations.follow_to_list.title": "Seguir á usuaria?", + "confirmations.hide_featured_tab.confirm": "Ocultar pestana", + "confirmations.hide_featured_tab.intro": "Podes cambiar isto cando queiras nos axustes en Editar perfil > pestana Perfil.", + "confirmations.hide_featured_tab.message": "Vas ocultar a pestana para as usuarias de {serverName} e outros servidores que usen a última versión de Mastodon. Noutros lugares podería ser diferente.", + "confirmations.hide_featured_tab.title": "Ocultar a pestana «Destacado»?", "confirmations.logout.confirm": "Pechar sesión", "confirmations.logout.message": "Desexas pechar a sesión?", "confirmations.logout.title": "Pechar sesión?", @@ -529,6 +562,7 @@ "content_warning.hide": "Agochar publicación", "content_warning.show": "Mostrar igualmente", "content_warning.show_more": "Mostrar máis", + "content_warning.show_short": "Mostrar", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lido", "conversation.open": "Ver conversa", @@ -569,6 +603,14 @@ "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", "dropdown.empty": "Escolle unha opción", + "email_subscriptions.email": "Correo electrónico", + "email_subscriptions.form.action": "Subscribirse", + "email_subscriptions.form.bottom": "Recibe publicacións no teu correo sen precisar crear unha conta de Mastodon. Date de baixa cando queiras. Máis información na Directiva de privacidade.", + "email_subscriptions.form.title": "Subscríbete para recibir actualizacións por correo de {name}", + "email_subscriptions.submitted.lead": "Comproba a túa caixa de correo para completar a subscrición ás actualizacións por correo.", + "email_subscriptions.submitted.title": "Un último paso", + "email_subscriptions.validation.email.blocked": "Provedor de correo bloqueado", + "email_subscriptions.validation.email.invalid": "Enderezo de correo non válido", "embed.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.", "embed.preview": "Vaise ver así:", "emoji_button.activity": "Actividade", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Resultados da procura", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes e Lugares", - "empty_column.account_featured.me": "Aínda non destacaches nada. Sabías que podes facer destacar no teu perfil os cancelos que máis usas, incluso as contas das túas amizades?", - "empty_column.account_featured.other": "{acct} aínda non escolleu nada para destacar. Sabías que podes facer destacatar no teu perfil os cancelos que máis usas, incluso os perfís das túas amizades?", - "empty_column.account_featured_other.unknown": "Esta conta aínda non destacou nada.", + "empty_column.account_featured.other": "{acct} aínda non destacou nada.", + "empty_column.account_featured_self.no_collections_button": "Crea unha colección", + "empty_column.account_featured_self.no_collections_hide_tab": "Ocultar esta pestana entonces", + "empty_column.account_featured_self.pre_collections": "Van chegar as Coleccións", + "empty_column.account_featured_self.pre_collections_desc": "Coas Coleccións (a partir de Mastodon 4.6) podes crear as túas listas persoais de contas para recomendar a outras persoas.", + "empty_column.account_featured_self.showcase_accounts": "Salienta as túas contas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "As coleccións son listas de contas para que outras persoas as coñezan e desfruten aquí no Fediverso.", + "empty_column.account_featured_unknown.other": "Esta conta aínda non destacou nada.", "empty_column.account_hides_collections": "A usuaria decideu non facer pública esta información", "empty_column.account_suspended": "Conta suspendida", "empty_column.account_timeline": "Non hai publicacións aquí!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "A quen seguir", "followed_tags": "Cancelos seguidos", "followers.hide_other_followers": "Esta usuaria escolleu non mostrar as outras persoas que a seguen", + "followers.title": "Seguindo a {name}", "following.hide_other_following": "Esta usuaria escolleu non mostrar as outras persoas que segue", + "following.title": "Seguida por {name}", "footer.about": "Sobre", "footer.about_mastodon": "Sobre Mastodon", "footer.about_server": "Sobre {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Ver código fonte", "footer.status": "Estado", "footer.terms_of_service": "Condicións do servizo", + "form_error.blank": "O campo non pode quedar baleiro.", "form_field.optional": "(optativo)", "generic.saved": "Gardado", "getting_started.heading": "Primeiros pasos", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Despregar menú de cancelos seguidos", "navigation_panel.expand_lists": "Despregar menú da lista", "not_signed_in_indicator.not_signed_in": "Debes acceder para ver este recurso.", + "notification.added_to_collection": "{name} engadíute a unha colección", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# máis} other {# máis}} crearon unha conta", "notification.annual_report.message": "#Wrapstodon de {year} agarda por ti! Desvela os momentos máis destacados e historias reseñables en Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editou unha colección na que apareces", "notification.favourite": "{name} marcou como favorita a túa publicación", "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# máis} other {# máis}} favoreceron a túa publicación", "notification.favourite_pm": "{name} favoreceu a túa mención privada", @@ -999,7 +1051,7 @@ "onboarding.profile.display_name": "Nome público", "onboarding.profile.display_name_hint": "O teu nome completo ou un nome divertido…", "onboarding.profile.finish": "Finalizar", - "onboarding.profile.note": "Acerca de ti", + "onboarding.profile.note": "Sobre ti", "onboarding.profile.note_hint": "Podes @mencionar a outras persoas ou usar #cancelos…", "onboarding.profile.title": "Configuración do perfil", "onboarding.profile.upload_avatar": "Subir imaxe do perfil", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "usuarias activas", "server_banner.administered_by": "Administrada por:", "server_banner.is_one_of_many": "{domain} é un dos moitos servidores Mastodon independentes que podes usar para participar do Fediverso.", + "server_banner.more_about_this_server": "Máis info sobre este servidor", "server_banner.server_stats": "Estatísticas do servidor:", "sign_in_banner.create_account": "Crear conta", "sign_in_banner.follow_anyone": "Sigue a quen queiras no Fediverso e le as publicacións en orde cronolóxica. Sen algoritmos, publicidade nin titulares enganosos.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 4034ce3e308db3..928c48261a426d 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -28,12 +28,10 @@ "account.block_domain": "חסמו את קהילת {domain}", "account.block_short": "לחסום", "account.blocked": "חסום", - "account.blocking": "רשימת החשבונות החסומים", "account.cancel_follow_request": "משיכת בקשת מעקב", "account.copy": "להעתיק קישור לפרופיל", "account.direct": "הודעה פרטית אל @{name}", "account.disable_notifications": "הפסק לשלוח לי התראות כש@{name} מפרסמים", - "account.domain_blocking": "רשימת השרתים החסומים", "account.edit_note": "עריכת הערה פרטית", "account.edit_profile": "עריכת פרופיל", "account.edit_profile_short": "עריכה", @@ -45,9 +43,7 @@ "account.featured": "מומלץ", "account.featured.accounts": "פרופילים", "account.featured.collections": "אוספים", - "account.featured.hashtags": "תגיות", - "account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}", - "account.featured_tags.last_status_never": "אין חצרוצים", + "account.featured.new_collection": "אוסף חדש", "account.field_overflow": "הצג תוכן מלא", "account.filters.all": "כל הפעילות", "account.filters.boosts_toggle": "הצגת הדהודים", @@ -73,8 +69,19 @@ "account.go_to_profile": "מעבר לפרופיל", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}", "account.in_memoriam": "פרופיל זכרון.", + "account.join_modal.day": "יום", + "account.join_modal.me": "הצטרפת אל {server} בתאריך", + "account.join_modal.me_anniversary": "פדילדת שמח! הצטרפת אל {server} בתאריך", + "account.join_modal.me_today": "זהו יומך הראשון על {server}!", + "account.join_modal.other": "{name} הצטרפו אל {server} בתאריך", + "account.join_modal.other_today": "זהו היום הראשון של {name} על {server}!", + "account.join_modal.share.celebrate": "שתפו הודעה לחגיגת האירוע", + "account.join_modal.share.intro": "שתפו הודעת היכרות", + "account.join_modal.share.welcome": "שתפו הודעת קבלת פנים", + "account.join_modal.years": "{number, plural, one {שנה} two {שנתיים} other {# שנים}}", "account.joined_short": "תאריך הצטרפות", "account.languages": "שנה רישום לשפות", + "account.last_active": "פעילות אחרונה", "account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}", "account.locked_info": "החשבון הזה הוגדר כנעול. צריך לקבל אישור כדי לעקוב אחריו.", "account.media": "מדיה", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "השתקת התראות", "account.mute_short": "השתקה", "account.muted": "מושתק", - "account.muting": "רשימת החשבונות המושתקים", "account.mutual": "אתם עוקביםות הדדית", + "account.name.copy": "העתקת הכינוי", "account.name.help.domain": "{domain} הוא השרת שמארח את פרופיל המשתמש(ת) וההודעות שכתב(ה).", "account.name.help.domain_self": "{domain} הוא השרת שמארח את פרופיל המשתמש(ת) שלך ואת ההודעות שכתבת.", - "account.name.help.footer": "בדיוק כמו שתוכלו לשלוח דואל לאנשים דרך תוכנות דואל שונות, ניתן להיות בקשר עם אנשים על שרתי מסטודון וכל אדם בשרתי פדיברס (המשתמשים בפרוטוכול אקטיביטיפאב ActivityPub).", + "account.name.help.footer": "באותו האופן שניתן לשלוח דואל לאנשים דרך ספקי דואל שונים, ניתן גם לעקוב ולהחליף מסרים עם אנשים בשרתי מסטודון אחרים, ומשתמשי יישומונים אחרים שתואמים למסטודון.", "account.name.help.header": "כינוי הוא כמו כתובת דואל", "account.name.help.username": "{username} הוא שם המשתמש של החשבון בשרת שלהם. מישהו משרת אחר יכול להחזיק באותו שם משתמש.", "account.name.help.username_self": "{username} הוא שם המשתמש של החשבון שלכם בשרת זה. מישהו משרת אחר יכול להחזיק באותו שם משתמש.", @@ -121,12 +128,11 @@ "account.note.edit_button": "עריכה", "account.note.title": "הערה פרטית (זמין רק לך)", "account.open_original_page": "לפתיחת העמוד המקורי", + "account.pending": "בהמתנה", "account.posts": "פוסטים", - "account.posts_with_replies": "הודעות ותגובות", "account.remove_from_followers": "הסרת {name} מעוקבי", "account.report": "דווח על @{name}", "account.requested_follow": "{name} ביקשו לעקוב אחריך", - "account.requests_to_follow_you": "ביקשו לעקוב אחריך", "account.share": "שתף את הפרופיל של @{name}", "account.show_reblogs": "הצג הדהודים מאת @{name}", "account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", @@ -141,34 +147,42 @@ "account.unmute": "הפסקת השתקת @{name}", "account.unmute_notifications_short": "הפעלת הודעות", "account.unmute_short": "ביטול השתקה", + "account_edit.advanced_settings.bot_hint": "איתות לאחרים שהחשבון מבצע בעיקר פעולות אוטומטיות ועשוי לא להיות מנוטר", + "account_edit.advanced_settings.bot_label": "חשבון ממוכן (בוט)", + "account_edit.advanced_settings.title": "הגדרות מתקדמות", + "account_edit.bio.add_label": "הוסיפו ביוגרפיה", + "account_edit.bio.edit_label": "עריכת ביוגרפיה", "account_edit.bio.placeholder": "הוסיפו הצגה קצרה כדי לעזור לאחרים לזהות אותך.", "account_edit.bio.title": "ביוגרפיה", "account_edit.bio_modal.add_title": "הוסיפו ביוגרפיה", "account_edit.bio_modal.edit_title": "עריכת ביוגרפיה", - "account_edit.button.add": "הוספת {item}", - "account_edit.button.delete": "מחיקת {item}", - "account_edit.button.edit": "עריכת {item}", "account_edit.column_button": "סיום", "account_edit.column_title": "עריכת הפרופיל", - "account_edit.custom_fields.name": "שדה", + "account_edit.custom_fields.add_label": "הוספת שדה", + "account_edit.custom_fields.edit_label": "עריכת שדה", "account_edit.custom_fields.placeholder": "הוסיפו צורת פניה, קישורים חיצוניים וכל דבר שתרצו לשתף.", "account_edit.custom_fields.reorder_button": "הגדרת סדר השדות", "account_edit.custom_fields.tip_content": "ניתן להוסיף אמינות לחשבון המסטודון שלך על ידי וידוא קישורים לאתרים שבבעלותך.", "account_edit.custom_fields.tip_title": "טיפ: הוספת קישורים מוודאים", "account_edit.custom_fields.title": "שדות בהתאמה אישית", "account_edit.custom_fields.verified_hint": "כיצד תוסיפו קישורים מוודאים?", + "account_edit.display_name.add_label": "הוספת שם תצוגה", + "account_edit.display_name.edit_label": "עריכת שם תצוגה", "account_edit.display_name.placeholder": "שם התצוגה שלכן הוא איך שהשם יופיע בפרופיל ובצירי הזמנים.", "account_edit.display_name.title": "שם תצוגה", - "account_edit.featured_hashtags.item": "תגיות", + "account_edit.featured_hashtags.edit_label": "הוספת תגיות", "account_edit.featured_hashtags.placeholder": "עזרו לאחרים לזהות ולגשת בקלות לנושאים החביבים עליכם.", "account_edit.featured_hashtags.title": "תגיות נבחרות", + "account_edit.field_actions.delete": "מחיקת שדה", + "account_edit.field_actions.edit": "עריכת שדה", "account_edit.field_delete_modal.confirm": "האם אתם בטוחיםות שברצונכן למחוק את השדה המיוחד הזה? פעולה זו לא ניתנת לביטול.", "account_edit.field_delete_modal.delete_button": "מחק", "account_edit.field_delete_modal.title": "מחיקת שדה מתואם אישית?", "account_edit.field_edit_modal.add_title": "הוסף שדה מותאם אישית", + "account_edit.field_edit_modal.discard_confirm": "השלך", + "account_edit.field_edit_modal.discard_message": "יש שינויים שלא נשמרו. לסלק אותם?", "account_edit.field_edit_modal.edit_title": "עריכת שדה מותאם אישית", - "account_edit.field_edit_modal.limit_header": "עברת את מגבלת התווים המומלצת", - "account_edit.field_edit_modal.limit_message": "משתמשים מטלפון חכם עלולים לא לראות את השדה במלואו.", + "account_edit.field_edit_modal.length_warning": "עברת את מספר התווים המירבי המומלץ. משתמשים בנייד עלולים שלא לראות את השדה המלא.", "account_edit.field_edit_modal.link_emoji_warning": "אנו ממליצים נגד שימוש באמוג'י ייחודיים ביחד עם URL. שדות מיוחדים שמכילים את שניהם יופיעו כמלל בלבד ולא כקישור, כדי למנוע בלבול משתמשים.", "account_edit.field_edit_modal.name_hint": "למשל \"אתר אישי\"", "account_edit.field_edit_modal.name_label": "תווית", @@ -197,19 +211,23 @@ "account_edit.image_edit.alt_edit_button": "עריכת מלל חלופי", "account_edit.image_edit.remove_button": "הסרת תמונה", "account_edit.image_edit.replace_button": "החלפת תמונה", + "account_edit.item_list.delete": "מחיקת {name}", + "account_edit.item_list.edit": "עריכת {name}", "account_edit.name_modal.add_title": "הוספת שם תצוגה", "account_edit.name_modal.edit_title": "עריכת שם תצוגה", "account_edit.profile_tab.button_label": "התאמה אישית", "account_edit.profile_tab.hint.description": "הגדרות אלו משנות מה משתמשים יראו על {server} ביישומונים הרשמיים, אבל הן לא בהכרח רלוונטיות למשתמשים על שרתים אחרים ועל יישומונים צד ג'.", "account_edit.profile_tab.hint.title": "התצוגה עשויה להיות שונה", - "account_edit.profile_tab.show_featured.description": "\"נבחרים\" הוא טאב לבחירה שבו תוכלו להציג חשבונות אחרים.", - "account_edit.profile_tab.show_featured.title": "הצגת טאב \"נבחרים\"", - "account_edit.profile_tab.show_media.description": "\"מדיה\" הוא טאב לבחירה שבוא יוצגו הודעות שלך שמכילות תמונות או וידאו.", - "account_edit.profile_tab.show_media.title": "הצגת טאב \"מדיה\"", - "account_edit.profile_tab.show_media_replies.description": "כשמאופשר, טאב המדיה מציג גם הודעות מקוריות וגם תשובות להודעות של אחרים.", - "account_edit.profile_tab.show_media_replies.title": "לכלול תגובות בטאב המדיה", - "account_edit.profile_tab.subtitle": "התאימו את הטאבים בפרופיל שלכם ומה שהם יציגו.", - "account_edit.profile_tab.title": "הגדרות טאבים לפרופיל", + "account_edit.profile_tab.show_featured.description": "\"נבחרים\" הוא כרטיסיה לבחירה שבו תוכלו להציג חשבונות אחרים.", + "account_edit.profile_tab.show_featured.title": "הצגת כרטיסיית \"נבחרים\"", + "account_edit.profile_tab.show_media.description": "\"מדיה\" הוא כרטיסיה לבחירה שבה יוצגו הודעות שלך שמכילות תמונות או וידאו.", + "account_edit.profile_tab.show_media.title": "הצגת כרטיסיית \"מדיה\"", + "account_edit.profile_tab.show_media_replies.description": "כשמאופשר, כרטיסיית המדיה מציגה גם הודעות מקוריות וגם תשובות להודעות של אחרים.", + "account_edit.profile_tab.show_media_replies.title": "לכלול תגובות בכרטיסיית המדיה", + "account_edit.profile_tab.show_relations.description": "מראה את העוקבים והנעקבים שלכם בפרופיל. אחרים יוכלו לראות אם אתם עוקבים אחריהם.", + "account_edit.profile_tab.show_relations.title": "לחשוף עוקבים ונעקבים", + "account_edit.profile_tab.subtitle": "בחרו בהתאמה אישית איך תרצו שהפרופיל שלכם יוצג.", + "account_edit.profile_tab.title": "הגדרות הצגת פרופיל", "account_edit.save": "שמירה", "account_edit.upload_modal.back": "חזרה", "account_edit.upload_modal.done": "בוצע", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "גרור להעלאה", "account_edit.upload_modal.step_upload.header": "בחר/י תמונה", "account_edit.upload_modal.step_upload.hint": "תכנים בתקן WEBP, PNG, GIF או JPG, עד לגודל {limit} מ\"ב.{br}התמונה תתוקן לגודל {width} על {height} פיקסלים.", - "account_edit.upload_modal.title_add": "הוספת תמונת פרופיל", - "account_edit.upload_modal.title_replace": "החלפת תמונת פרופיל", + "account_edit.upload_modal.title_add.avatar": "הוספת תמונת פרופיל", + "account_edit.upload_modal.title_add.header": "הוספת תמונת מסגרת", + "account_edit.upload_modal.title_replace.avatar": "החלפת תמונת פרופיל", + "account_edit.upload_modal.title_replace.header": "החלפת תמונת מסגרת", "account_edit.verified_modal.details": "הוספת אמינות לחשבון המסטודון על ידי הוספת קישורים מוודאים לאתרים אישיים. כך זה עובד:", "account_edit.verified_modal.invisible_link.details": "הוסיפו את הקישור בכותרת. החלק החשוב הוא rel=\"me\" שמונע התחזות על אתרים עם תוכן משתמשים. ניתן גם ליצור תגית link בכותרת העמוד במקום קישור {tag} אבל קוד ה־HTML חייב להופיע שם ללא הרצה של ג'אווהסקריפט.", "account_edit.verified_modal.invisible_link.summary": "כיצד לגרום לקישור להיות בלתי נראה?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "הוסיפו את אתרכן בשדה המיוחד", "account_edit.verified_modal.title": "כיצד תוסיפו קישורים מוודאים", "account_edit_tags.add_tag": "הוספת #{tagName}", - "account_edit_tags.column_title": "עריכת תגיות נבחרות", + "account_edit_tags.column_title": "עריכת תגיות", "account_edit_tags.help_text": "תגיות נבחרות עוזרות למשתמשים לגלות ולהשתמש בפרופיל שלך. הן יופיעו כסננים במבט הפעילויות על עמוד הפרופיל שלך.", + "account_edit_tags.max_tags_reached": "הגעת למספר התגיות הנבחרות המירבי.", "account_edit_tags.search_placeholder": "הזנת תגית…", "account_edit_tags.suggestions": "הצעות:", "account_edit_tags.tag_status_count": "{count, plural, one {הודעה אחת} two {הודעותיים} other {# הודעות}}", + "account_list.hidden_notice": "הרשימה גלויה רק לך. כדי לחשוף אותה לאחרים, יש ללכת אל {page} < {modal} < {field}.", + "account_list.total": "{total, plural, one {חשבון אחד} other {# חשבונות}}", "account_note.placeholder": "יש ללחוץ כדי להוסיף הערות", "admin.dashboard.daily_retention": "קצב שימור משתמשים יומי אחרי ההרשמה", "admin.dashboard.monthly_retention": "קצב שימור משתמשים (פר חודש) אחרי ההרשמה", @@ -338,7 +361,7 @@ "closed_registrations_modal.find_another_server": "חיפוש שרת אחר", "closed_registrations_modal.preamble": "מסטודון הוא רשת מבוזרת, כך שלא משנה היכן החשבון שלך, קיימת האפשרות לעקוב ולתקשר עם משתמשים בשרת הזה. אפשר אפילו להריץ שרת בעצמך!", "closed_registrations_modal.title": "להרשם למסטודון", - "collection.share_modal.share_link_label": "קישור להזמנה לשיתוף", + "collection.share_modal.share_link_label": "שיתוף קישור", "collection.share_modal.share_via_post": "לפרסם במסטודון", "collection.share_modal.share_via_system": "לשתף אל…", "collection.share_modal.title": "שיתוף אוסף", @@ -346,8 +369,11 @@ "collection.share_template_other": "הציצו על האוסף המעניין הזה: {link}", "collection.share_template_own": "הציצו על האוסף החדש שלי: {link}", "collections.account_count": "{count, plural, one {חשבון אחד} other {# חשבונות}}", - "collections.accounts.empty_description": "להוסיף עד ל־{count} חשבונות שאתם עוקבים אחריהם", + "collections.accounts.empty_description": "להוסיף עד ל־{count} חשבונות", + "collections.accounts.empty_editor_title": "אוסף זה ריק כרגע", "collections.accounts.empty_title": "האוסף הזה ריק", + "collections.block_collection_owner": "חסימת חשבון", + "collections.by_account": "מאת {account_handle}", "collections.collection_description": "תיאור", "collections.collection_language": "שפה", "collections.collection_language_none": "לא מצוין", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "בוודאות להסיר חשבון זה מהאוסף?", "collections.content_warning": "אזהרת תוכן", "collections.continue": "המשך", - "collections.create.accounts_subtitle": "רק חשבונות נעקבים שבחרו להופיע ב\"תגליות\" ניתנים להוספה.", + "collections.copy_link": "להעתקת הקישור", + "collections.copy_link_confirmation": "קישור לחשבון הועתק לקליפבורד", "collections.create.accounts_title": "את מי תבליטו באוסף זה?", "collections.create.basic_details_title": "פרטים בסיסיים", "collections.create.steps": "צעד {step} מתוך {total}", - "collections.create_a_collection_hint": "יצירת אוסף כדי להמליץ או לשתף את החשבונות החביבים עליך עם אחרים.", "collections.create_collection": "יצירת אוסף", "collections.delete_collection": "מחיקת האוסף", "collections.description_length_hint": "מגבלה של 100 תווים", - "collections.detail.accept_inclusion": "אישור", - "collections.detail.accounts_heading": "חשבונות", - "collections.detail.author_added_you": "{author} הוסיפו אותך לאוסף", - "collections.detail.curated_by_author": "נאצר על ידי {author}", - "collections.detail.curated_by_you": "נאצר על ידיך", + "collections.detail.author_added_you_on_date": "{author} הוסיפו אותך בתאריך {date}", "collections.detail.loading": "טוען אוסף…", - "collections.detail.other_accounts_in_collection": "אחרים באוסף:", "collections.detail.revoke_inclusion": "הסירוני", + "collections.detail.sensitive_content": "תוכן רגיש", "collections.detail.sensitive_note": "האוסף מכיל חשבונות ותכנים שאולי יחשבו רגישים לחלק מהמשתמשים.", "collections.detail.share": "שיתוף אוסף", + "collections.detail.you_are_in_this_collection": "אתם מופיעים באוסף זה", "collections.edit_details": "עריכת פרטים", - "collections.error_loading_collections": "חלה שגיאה בנסיון לטעון את אוספיך.", + "collections.error_loading_collections": "חלה שגיאה בנסיון לטעון אוספים אלו.", + "collections.hidden_accounts_description": "חסמת או השתקת {count, plural,one {המשתמש.ת}other {המשתמשים}} האלו", + "collections.hidden_accounts_link": "{count, plural, one {חשבון מוסתר אחד} other {# חשבונות מוסתרים}}", "collections.hints.accounts_counter": "{count} \\ {max} חשבונות", "collections.last_updated_at": "עדכון אחרון: {date}", + "collections.list.collections_with_count": "{count, plural, one {אוסף אחד} other {# אוספים}}", + "collections.list.created_by_author": "נוצר בידי {name}", + "collections.list.created_by_you": "נוצר על ידיך", + "collections.list.featuring_you": "כולל אותך", "collections.manage_accounts": "ניהול חשבונות", "collections.mark_as_sensitive": "מסומנים כרגישים", "collections.mark_as_sensitive_hint": "הסתרת תיאור וחשבונות האוסף מאחורי אזהרת תוכן. שם האוסף עדיין ישאר גלוי.", + "collections.maximum_collection_count_description": "השרת שלך מגביל יצירה של עד {count} אוספים.", + "collections.maximum_collection_count_reached": "יצרת את מספר האוספים המירבי", "collections.name_length_hint": "מגבלה של 40 תווים", "collections.new_collection": "אוסף חדש", - "collections.no_collections_yet": "עוד אין אוספים.", - "collections.old_last_post_note": "פרסמו לאחרונה לפני יותר משבוע", - "collections.remove_account": "הסר חשבון זה", + "collections.pending_accounts.message": "חשבונות יסומנו כממתינים כאשר מחכים לתגובה מהמשתמשים בשרת שלהם. רק אתם יכולים לראות חשבונות בהמתנה לאישור.", + "collections.pending_accounts.title": "מדוע אני רואה חשבונות ממתינים לאישור?", + "collections.remove_account": "הסרה", "collections.report_collection": "דיווח על אוסף זה", "collections.revoke_collection_inclusion": "הסירוני מאוסף זה", "collections.revoke_inclusion.confirmation": "הוסרת מֿ\"{collection}\"", "collections.revoke_inclusion.error": "הייתה שגיאה. נסו שוב מאוחר יותר.", - "collections.search_accounts_label": "לחפש חשבונות להוספה…", + "collections.search_accounts_label": "לחפש חשבון להוספה", "collections.search_accounts_max_reached": "הגעת למספר החשבונות המירבי", "collections.sensitive": "רגיש", + "collections.share_short": "שיתוף", + "collections.suggestions.can_not_add": "לא ניתן להוסיף", + "collections.suggestions.can_not_add_desc": "חשבונות אלו כנראה ביקשו לא להכלל ב\"תגליות\" או שהם משתמשים בשרת שאינו תומך באוספים.", + "collections.suggestions.must_follow": "יש לעקוב תחילה", + "collections.suggestions.must_follow_desc": "חשבונות אלו בחרו לברור בקשות מעקב. עוקבים יכולים להוסיף אותם לאוספים.", "collections.topic_hint": "הוספת תגית שמסייעת לאחרים להבין את הנושא הראשי של האוסף.", "collections.topic_special_chars_hint": "תווים מיוחדים יוסרו בעת השמירה", + "collections.unlisted_collections_description": "אוספים אלו לא מוצגים לאחרים בפרופיל שלך. למי שיקבל את הקישור תהיה גישה לגלות את התכנים.", + "collections.unlisted_collections_with_count": "אוספים שאינם לתצוגה ({count})", "collections.view_collection": "צפיה באוסף", - "collections.view_other_collections_by_user": "צפייה באוספים אחרים של משתמש.ת אלו", "collections.visibility_public": "פומבי", "collections.visibility_public_hint": "זמין לגילוי בתוצאות חיפוש ושאר אזורים בהם מופיעות המלצות.", "collections.visibility_title": "ניראות", @@ -405,7 +442,6 @@ "column.about": "אודות", "column.blocks": "משתמשים חסומים", "column.bookmarks": "סימניות", - "column.collections": "האוספים שלי", "column.community": "פיד שרת מקומי", "column.create_list": "יצירת רשימה", "column.direct": "הודעות פרטיות", @@ -422,8 +458,10 @@ "column.lists": "רשימות", "column.mutes": "משתמשים בהשתקה", "column.notifications": "התראות", + "column.other_collections": "אוספים מאת {name}", "column.pins": "חיצרוצים נעוצים", "column.public": "פיד כללי (כל השרתים)", + "column.your_collections": "האוספים שלך", "column_back_button.label": "בחזרה", "column_header.hide_settings": "הסתרת הגדרות", "column_header.moveLeft_settings": "הזזת טור לשמאל", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "לוותר על הטיוטא?", "confirmations.discard_edit_media.confirm": "השלך", "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?", - "confirmations.follow_to_collection.confirm": "עקיבה והוספה לאוסף", - "confirmations.follow_to_collection.message": "כדי להכניס את {name} לאוסף, ראשית יש לעקוב אחריהם.", - "confirmations.follow_to_collection.title": "לעקוב אחר החשבון?", "confirmations.follow_to_list.confirm": "עקיבה והוספה לרשימה", "confirmations.follow_to_list.message": "כדי להכניס את {name} לרשימה, ראשית יש לעקוב אחריהם.", "confirmations.follow_to_list.title": "לעקוב אחר המשתמש.ת?", + "confirmations.hide_featured_tab.confirm": "הסתר כרטיסייה", + "confirmations.hide_featured_tab.intro": "ניתן לשנות זאת בכל עת תחת עריכת פרופיל > העדפות כרטיסיית פרופיל.", + "confirmations.hide_featured_tab.message": "הסתרת הכרטיסיה מפני המשתמשים.ות על {serverName} ושרתים אחרים המריצים גרסא עדכנית של מסטודון. ההצגה באתרים אחרים עלולה להיות שונה.", + "confirmations.hide_featured_tab.title": "להסתיר כרטיסיית \"נבחרים\"?", "confirmations.logout.confirm": "התנתקות", "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?", "confirmations.logout.title": "להתנתק?", @@ -529,6 +568,7 @@ "content_warning.hide": "הסתרת חיצרוץ", "content_warning.show": "להציג בכל זאת", "content_warning.show_more": "הצג עוד", + "content_warning.show_short": "הצג", "conversation.delete": "מחיקת שיחה", "conversation.mark_as_read": "סמן כנקרא", "conversation.open": "צפו בשיחה", @@ -569,6 +609,14 @@ "domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.", "domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.", "dropdown.empty": "בחירת אפשרות", + "email_subscriptions.email": "דוא״ל", + "email_subscriptions.form.action": "הרשמה", + "email_subscriptions.form.bottom": "קבלו הודעות לתיבת הדואל מבלי ליצור חשבון מסטודון. ניתן לבטל בכל עת. למידע נוסף, קראו במדיניות הפרטיות.", + "email_subscriptions.form.title": "הרשמה לקבלת עידכוני דואל מאת {name}", + "email_subscriptions.submitted.lead": "יש לחפש בתיבת הדואל הודעה לסיום ההרשמה לעידכונים בדואל.", + "email_subscriptions.submitted.title": "עוד שלב אחד אחרון", + "email_subscriptions.validation.email.blocked": "ספק דואל חסום", + "email_subscriptions.validation.email.invalid": "כתובת דוא״ל לא תקינה", "embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", @@ -586,15 +634,21 @@ "emoji_button.search_results": "תוצאות חיפוש", "emoji_button.symbols": "סמלים", "emoji_button.travel": "טיולים ואתרים", - "empty_column.account_featured.me": "עוד לא קידמת תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?", - "empty_column.account_featured.other": "{acct} עוד לא קידם תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?", - "empty_column.account_featured_other.unknown": "חשבון זה עוד לא קידם תכנים.", + "empty_column.account_featured.other": "{acct} עוד לא קידם תכנים.", + "empty_column.account_featured_self.no_collections_button": "יצירת אוסף", + "empty_column.account_featured_self.no_collections_hide_tab": "הסתרת הכרטיסיה במקום הצגתה ריקה", + "empty_column.account_featured_self.pre_collections": "אוספים בקרוב על מסך זה", + "empty_column.account_featured_self.pre_collections_desc": "אוספים (מגיע במסטודון גרסא 4.6) יאפשרו לך לאצור רשימות חשבונות להמלצה לאחרים.", + "empty_column.account_featured_self.showcase_accounts": "הצגת החשבונות החביבים עליך", + "empty_column.account_featured_self.showcase_accounts_desc": "אוספים הם רשימות חשבונות שאתם אוצרים כדי לעזור לאחרים לגלות עוד תכנים בפדיוורס.", + "empty_column.account_featured_unknown.other": "חשבון זה עוד לא קידם תכנים.", "empty_column.account_hides_collections": "המשתמש.ת בחר.ה להסתיר מידע זה", "empty_column.account_suspended": "חשבון מושעה", "empty_column.account_timeline": "אין עדיין אף הודעה!", "empty_column.account_unavailable": "פרופיל לא זמין", "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.", "empty_column.bookmarked_statuses": "אין עדיין הודעות שחיבבת. כשתחבב את הראשונה, היא תופיע כאן.", + "empty_column.collections.featured_in": "עוד לא הוסיפו אותך לאף אוסף.", "empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!", "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.", "empty_column.disabled_feed": "פיד זה נחסם לשימוש על ידי מנהלי השרת שלך.", @@ -674,7 +728,9 @@ "follow_suggestions.who_to_follow": "אחרי מי לעקוב", "followed_tags": "התגיות שהחשבון שלך עוקב אחריהן", "followers.hide_other_followers": "משתשמש‎‏(ת) אלו החליטו לא לחשוף את עוקביהם האחרים", + "followers.title": "עוקבים אחרי {name}", "following.hide_other_following": "משתשמש‎‏(ת) אלו החליטו לא לחשוף את נעקביהם האחרים", + "following.title": "נעקבים על ידי {name}", "footer.about": "אודות", "footer.about_mastodon": "אודות מסטודון", "footer.about_server": "‮אודות ‭{domain}", @@ -686,6 +742,7 @@ "footer.source_code": "צפיה בקוד המקור", "footer.status": "מצב", "footer.terms_of_service": "תנאי השירות", + "form_error.blank": "שדות לא יכולים להשאר ריקים.", "form_field.optional": "(אפשרות)", "generic.saved": "נשמר", "getting_started.heading": "בואו נתחיל", @@ -744,7 +801,7 @@ "interaction_modal.on_this_server": "על שרת זה", "interaction_modal.title": "יש להזדהות כדי להמשיך", "interaction_modal.username_prompt": "למשל {example}", - "intervals.full.days": "{number, plural, one {# יום} other {# ימים}}", + "intervals.full.days": "{number, plural, one {יום} two {יומיים} other {# ימים}}", "intervals.full.hours": "{number, plural, one {# שעה} other {# שעות}}", "intervals.full.minutes": "{number, plural, one {# דקה} other {# דקות}}", "keyboard_shortcuts.back": "ניווט חזרה", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "פתיחת תפריט תגיות במעקב", "navigation_panel.expand_lists": "פתיחת תפריט רשימות", "not_signed_in_indicator.not_signed_in": "יש להיות מאומת כדי לגשת למשאב זה.", + "notification.added_to_collection": "{name} הוסיפו אותך לאוסף", "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}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} ועוד {count, plural,one {אחד אחר}other {# אחרים}} נרשמו", "notification.annual_report.message": "ה- #סיכומודון שלך לשנת {year} מחכה! גלו את רגעי השיא והזכרונות ממסטודון!", "notification.annual_report.view": "לצפייה ב- #סיכומודון", + "notification.collection_update": "{name} ערכו אוסף הכולל אותך", "notification.favourite": "הודעתך חובבה על ידי {name}", "notification.favourite.name_and_others_with_link": "{name} ועוד {count, plural,one {אחד נוסף}other {# נוספים}} חיבבו את הודעתך", "notification.favourite_pm": "{name} חיבב.ה איזכור שלך בהודעה פרטית", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "משתמשים פעילים", "server_banner.administered_by": "מנוהל ע\"י:", "server_banner.is_one_of_many": "{domain} הוא שרת אחד משרתי מסטודון עצמאיים רבים שדרגם תוכלו להשתתף בפדיוורס (רשת חברתית מבוזרת).", + "server_banner.more_about_this_server": "עוד אודות שרת זה", "server_banner.server_stats": "סטטיסטיקות שרת:", "sign_in_banner.create_account": "יצירת חשבון", "sign_in_banner.follow_anyone": "תוכלו לעקוב אחרי כל משמתמש בפדיוורס ולקרוא הכל לפי סדר הפרסום בציר הזמן. אין אלגוריתמים, פרסומות, או קליקבייט מטעם בעלי הרשת.", @@ -1255,7 +1315,7 @@ "terms_of_service.effective_as_of": "בתוקף החל מתאריך {date}", "terms_of_service.title": "תנאי השירות", "terms_of_service.upcoming_changes_on": "שינויים עתידיים שיחולו ביום {date}", - "time_remaining.days": "נותרו {number, plural, one {# יום} other {# ימים}}", + "time_remaining.days": "נותרו {number, plural, one {יום} two {יומיים} other {# ימים}}", "time_remaining.hours": "נותרו {number, plural, one {# שעה} other {# שעות}}", "time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}", "time_remaining.moments": "רגעים נותרו", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 472dff9de3845d..b5c49b217ec348 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -21,12 +21,10 @@ "account.block_domain": "{domain} के सारी चीज़े छुपाएं", "account.block_short": "ब्लॉक किया गया", "account.blocked": "ब्लॉक", - "account.blocking": "प्रतिबंधित करना", "account.cancel_follow_request": "फॉलो रिक्वेस्ट वापस लें", "account.copy": "प्रोफाइल पर लिंक कॉपी करें", "account.direct": "निजि तरीके से उल्लेख करे @{name}", "account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो", - "account.domain_blocking": "डोमेन ब्लॉक करें", "account.edit_profile": "प्रोफ़ाइल संपादित करें", "account.edit_profile_short": "संपादित करें", "account.enable_notifications": "जब @{name} पोस्ट मौजूद हो सूचित करें", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "{name1} और {name2} ने अनुसरण किया है", "account.featured": "प्रचलित", "account.featured.accounts": "प्रोफ़ाइल", - "account.featured.hashtags": "हैशटैग्स", - "account.featured_tags.last_status_at": "{date} का अंतिम पोस्ट", - "account.featured_tags.last_status_never": "कोई पोस्ट नहीं है", "account.follow": "फॉलो करें", "account.follow_back": "फॉलो करें", "account.follow_back_short": "वापस अनुसरण करें", @@ -67,7 +62,6 @@ "account.no_bio": "कोई विवरण नहि दिया गया हे", "account.open_original_page": "ओरिजिनल पोस्ट खोलें", "account.posts": "टूट्स", - "account.posts_with_replies": "टूट्स एवं जवाब", "account.report": "रिपोर्ट @{name}", "account.requested_follow": "{name} ने आपको फॉलो करने के लिए अनुरोध किया है", "account.share": "@{name} की प्रोफाइल शेयर करे", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 29b658cccb85a8..9bfd365db407d9 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -29,8 +29,6 @@ "account.edit_profile_short": "Uredi", "account.enable_notifications": "Obavjesti me kada @{name} napravi objavu", "account.endorse": "Istakni na profilu", - "account.featured_tags.last_status_at": "Zadnji post {date}", - "account.featured_tags.last_status_never": "Nema postova", "account.follow": "Prati", "account.follow_back": "Slijedi natrag", "account.follow_request_cancel": "Poništi zahtjev", @@ -64,7 +62,6 @@ "account.note.edit_button": "Uredi", "account.open_original_page": "Otvori originalnu stranicu", "account.posts": "Objave", - "account.posts_with_replies": "Objave i odgovori", "account.report": "Prijavi @{name}", "account.requested_follow": "{name} zatražio/la je praćenje", "account.share": "Podijeli profil @{name}", @@ -84,7 +81,6 @@ "account_edit.column_title": "Uredi profil", "account_edit.custom_fields.title": "Prilagođena polja", "account_edit.featured_hashtags.title": "Istaknuti hashtagovi", - "account_edit.profile_tab.title": "Prikaz kartice profila", "account_edit.save": "Spremi", "account_note.placeholder": "Kliknite za dodavanje bilješke", "admin.dashboard.daily_retention": "Stopa zadržavanja korisnika po danu nakon prijave", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index a97a7240c10c33..675e147bd31b32 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -28,12 +28,10 @@ "account.block_domain": "Domain letiltása: {domain}", "account.block_short": "Letiltás", "account.blocked": "Letiltva", - "account.blocking": "Tiltás", "account.cancel_follow_request": "Követési kérés visszavonása", "account.copy": "Hivatkozás másolása a profilba", "account.direct": "@{name} személyes említése", "account.disable_notifications": "Ne figyelmeztessen, ha @{name} bejegyzést tesz közzé", - "account.domain_blocking": "Domain tiltás", "account.edit_note": "Személyes megjegyzés szerkesztése", "account.edit_profile": "Profil szerkesztése", "account.edit_profile_short": "Szerkesztés", @@ -45,9 +43,7 @@ "account.featured": "Kiemelt", "account.featured.accounts": "Profilok", "account.featured.collections": "Gyűjtemények", - "account.featured.hashtags": "Hashtagek", - "account.featured_tags.last_status_at": "Legutolsó bejegyzés ideje: {date}", - "account.featured_tags.last_status_never": "Nincs bejegyzés", + "account.featured.new_collection": "Új gyűjtemény", "account.field_overflow": "Teljes tartalom megjelenítése", "account.filters.all": "Összes tevékenység", "account.filters.boosts_toggle": "Megtolások megjelenítése", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ugrás a profilhoz", "account.hide_reblogs": "@{name} megtolásainak elrejtése", "account.in_memoriam": "Emlékünkben.", + "account.join_modal.day": "Nap", + "account.join_modal.me": "Ekkor csatlakoztál ide: {server}", + "account.join_modal.me_anniversary": "Boldog Födinapot! Ekkor csatlakoztál ide: {server}", + "account.join_modal.me_today": "Ez az első napod itt: {server}!", + "account.join_modal.other": "{name} ekkor csatlakozott ide: {server}", + "account.join_modal.other_today": "Ez {name} első napja itt: {server}!", + "account.join_modal.share.celebrate": "Ünnepi bejegyzés megosztása", + "account.join_modal.share.intro": "Bemutatkozó bejegyzés megosztása", + "account.join_modal.share.welcome": "Üdvözlő bejegyzés megosztása", + "account.join_modal.years": "{number, plural, one {év} other {év}}", "account.joined_short": "Csatlakozott", "account.languages": "Feliratkozott nyelvek módosítása", + "account.last_active": "Utoljára aktív", "account.link_verified_on": "A linket eredetiségét ebben az időpontban ellenőriztük: {date}", "account.locked_info": "Ennek a fióknak zárolt a láthatósága. A tulajdonos kézzel engedélyezi, hogy ki követheti őt.", "account.media": "Média", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Értesítések némítása", "account.mute_short": "Némítás", "account.muted": "Némítva", - "account.muting": "Némítás", "account.mutual": "Követitek egymást", + "account.name.copy": "Fióknév másolása", "account.name.help.domain": "A(z) {domain} a kiszolgáló, amely a felhasználó profilját és bejegyzéseit szolgálja ki.", "account.name.help.domain_self": "A(z) {domain} a kiszolgáló, amely a profilodat és bejegyzéseidet szolgálja ki.", - "account.name.help.footer": "Ahogy több különböző szolgáltatónál lévő embernek lehet e-mailt küldeni, úgy más Mastodon-kiszolgálókon lévő emberrekel is kapcsolatba lehet lépni – és bárki mással is, akik ugyanazokat a szabályokat (az ActivityPub-protokollt) használó közösségimédia-alkalmazásokat használnak, mint a Mastodon.", + "account.name.help.footer": "Ahogy bárkinek küldhetsz e-mailt, annak is, aki más e-mail-szolgáltatót használ, úgy kapcsolatba léphetsz a más Mastodon-kiszolgálókon lévő emberekkel, és bárki mással, aki más Mastodonnal kompatibilis közösségimédia-alkalmazást használ.", "account.name.help.header": "A fióknév olyan, mint egy e-mail-cím", "account.name.help.username": "Ez a fiók felhasználóneve a kiszolgálóján: {username}. Lehet, hogy másnak egy másik kiszolgálón ugyanez a felhasználóneve.", "account.name.help.username_self": "Ez a felhasználóneved ezen a kiszolgálón: {username}. Lehet, hogy másnak egy másik kiszolgálón ugyanez a felhasználóneve.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Szerkesztés", "account.note.title": "Személyes megjegyzés (csak te látod)", "account.open_original_page": "Eredeti oldal megnyitása", + "account.pending": "Függőben", "account.posts": "Bejegyzések", - "account.posts_with_replies": "Bejegyzések és válaszok", "account.remove_from_followers": "{name} eltávolítása a követők közül", "account.report": "@{name} jelentése", "account.requested_follow": "{name} kérte, hogy követhessen", - "account.requests_to_follow_you": "Kéri, 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}}", @@ -141,34 +147,42 @@ "account.unmute": "@{name} némításának feloldása", "account.unmute_notifications_short": "Értesítések némításának feloldása", "account.unmute_short": "Némitás feloldása", + "account_edit.advanced_settings.bot_hint": "Jelzés másoknak, hogy ez a fiók automatikus műveleteket végez és valószínűleg nem figyeljük", + "account_edit.advanced_settings.bot_label": "Automatizált fiók", + "account_edit.advanced_settings.title": "Speciális beállítások", + "account_edit.bio.add_label": "Bemutatkozás hozzáadása", + "account_edit.bio.edit_label": "Bemutatkozás szerkesztése", "account_edit.bio.placeholder": "Adj meg egy rövid bemutatkozást, hogy mások könnyebben megtaláljanak.", "account_edit.bio.title": "Bemutatkozás", "account_edit.bio_modal.add_title": "Bemutatkozás hozzáadása", "account_edit.bio_modal.edit_title": "Bemutatkozás szerkesztése", - "account_edit.button.add": "{item} hozzáadása", - "account_edit.button.delete": "{item} törlése", - "account_edit.button.edit": "{item} szerkesztése", "account_edit.column_button": "Kész", "account_edit.column_title": "Profil szerkesztése", - "account_edit.custom_fields.name": "mező", + "account_edit.custom_fields.add_label": "Mező hozzáadása", + "account_edit.custom_fields.edit_label": "Mező szerkesztése", "account_edit.custom_fields.placeholder": "Add meg a névmásaidat, külső hivatkozásaidat vagy bármi mást, amelyet megosztanál.", "account_edit.custom_fields.reorder_button": "Mezők átrendezése", "account_edit.custom_fields.tip_content": "Könnyedén nagyobb hitelességet adhatsz a Mastodon-fiókodnak a saját weboldalaidra mutató hivatkozások megerősítésével.", "account_edit.custom_fields.tip_title": "Tipp: Ellenőrzött hivatkozások hozzáadása", "account_edit.custom_fields.title": "Egyéni mezők", "account_edit.custom_fields.verified_hint": "Hogyan kell ellenőrzött hivatkozást hozzáadni?", + "account_edit.display_name.add_label": "Megjelenítendő név hozzáadása", + "account_edit.display_name.edit_label": "Megjelenítendő név szerkesztése", "account_edit.display_name.placeholder": "A megjelenítendő név az, ahogy a neved megjelenik a profilodon és az idővonalakon.", "account_edit.display_name.title": "Megjelenítendő név", - "account_edit.featured_hashtags.item": "hashtagek", + "account_edit.featured_hashtags.edit_label": "Hashtagek hozzáadása", "account_edit.featured_hashtags.placeholder": "Segíts másoknak, hogy azonosíthassák a kedvenc témáid, és gyorsan elérjék azokat.", "account_edit.featured_hashtags.title": "Kiemelt hashtagek", + "account_edit.field_actions.delete": "Mező törlése", + "account_edit.field_actions.edit": "Mező szerkesztése", "account_edit.field_delete_modal.confirm": "Biztos, hogy törlöd ezt az egyéni mezőt? Ez a művelet nem vonható vissza.", "account_edit.field_delete_modal.delete_button": "Törlés", "account_edit.field_delete_modal.title": "Egyéni mező törlése?", "account_edit.field_edit_modal.add_title": "Egyéni mező hozzáadása", + "account_edit.field_edit_modal.discard_confirm": "Elvetés", + "account_edit.field_edit_modal.discard_message": "Nem mentett módosításaid vannak. Biztos, hogy elveted?", "account_edit.field_edit_modal.edit_title": "Egyéni mező szerkesztése", - "account_edit.field_edit_modal.limit_header": "Az ajánlott karakterkorlát túllépve", - "account_edit.field_edit_modal.limit_message": "A mobilos felhasználók lehet, hogy nem fogják a teljes mezőt látni.", + "account_edit.field_edit_modal.length_warning": "Javasolt karakterkorlát túllépve. A mobilos felhasználók lehet, hogy nem fogják látni a teljes mezőt.", "account_edit.field_edit_modal.link_emoji_warning": "Nem javasoljuk az egyéni emodzsik és webcímek együttes használatát. A mindkettőt tartalmazó egyéni mezők a felhasználók megzavarásának elkerülése érdekében csak szövegként jelennek meg, nem hivatkozásként.", "account_edit.field_edit_modal.name_hint": "Például „Személyes webhely”", "account_edit.field_edit_modal.name_label": "Címke", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Helyettesítő szöveg szerkesztése", "account_edit.image_edit.remove_button": "Kép eltávolítása", "account_edit.image_edit.replace_button": "Kép cseréje", + "account_edit.item_list.delete": "{name} törlése", + "account_edit.item_list.edit": "{name} szerkesztése", "account_edit.name_modal.add_title": "Megjelenítendő név hozzáadása", "account_edit.name_modal.edit_title": "Megjelenítendő név szerkesztése", "account_edit.profile_tab.button_label": "Testreszabás", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "„Média” lap megjelenítése", "account_edit.profile_tab.show_media_replies.description": "Ha engedélyezve van, akkor a Média lap megjeleníti a bejegyzéseidet és a mások bejegyzéseihez írt válaszaidat.", "account_edit.profile_tab.show_media_replies.title": "Válaszok megjelenítése a „Média” lapon", - "account_edit.profile_tab.subtitle": "Szabd testre a profilodon látható lapokat, és a megjelenített tartalmukat.", - "account_edit.profile_tab.title": "Profil lap beállításai", "account_edit.save": "Mentés", "account_edit.upload_modal.back": "Vissza", "account_edit.upload_modal.done": "Kész", @@ -218,8 +232,11 @@ "account_edit.upload_modal.step_upload.button": "Fájlok tallózása", "account_edit.upload_modal.step_upload.dragging": "Ejtsd ide a feltöltéshez", "account_edit.upload_modal.step_upload.header": "Válassz egy képet", - "account_edit.upload_modal.title_add": "Profilkép hozzáadása", - "account_edit.upload_modal.title_replace": "Profilkép cseréje", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF vagy JPG formátum, legfeljebb {limit} MB.{br}A kép ekkorára lesz méretezve: {width}×{height} px.", + "account_edit.upload_modal.title_add.avatar": "Profilkép hozzáadása", + "account_edit.upload_modal.title_add.header": "Borítókép hozzáadása", + "account_edit.upload_modal.title_replace.avatar": "Profilkép cseréje", + "account_edit.upload_modal.title_replace.header": "Borítókép cseréje", "account_edit.verified_modal.details": "Növeld a Mastodon-profilod hitelességét a személyes webhelyekre mutató hivatkozások ellenőrzésével. Így működik:", "account_edit.verified_modal.invisible_link.details": "A hivatkozás hozzáadása a fejlécedhez. A fontos rész a rel=\"me\", mely megakadályozza, hogy mások a nevedben lépjenek fel olyan oldalakon, ahol van felhasználók által előállított tartalom. A(z) {tag} helyett a „link” címkét is használhatod az oldal fejlécében, de a HTML-nek elérhetőnek kell lennie JavaScript futtatása nélkül is.", "account_edit.verified_modal.invisible_link.summary": "Hogyan lehet egy hivatkozás láthatatlanná tenni?", @@ -228,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Saját webhely hozzáadása egyéni mezőként", "account_edit.verified_modal.title": "Hogyan kell ellenőrzött hivatkozást hozzáadni", "account_edit_tags.add_tag": "#{tagName} hozzáadása", - "account_edit_tags.column_title": "Kiemelt hashtagek szerkesztése", + "account_edit_tags.column_title": "Címkék szerkesztése", "account_edit_tags.help_text": "A kiemelt hashtagek segítenek a felhasználóknak abban, hogy interakcióba lépjenek a profiloddal. Szűrőként jelennek meg a Profil oldalad Tevékenység nézetében.", + "account_edit_tags.max_tags_reached": "Elérted a kiemelt hashtagek maximális számát.", "account_edit_tags.search_placeholder": "Hashtag megadása…", "account_edit_tags.suggestions": "Javaslatok:", "account_edit_tags.tag_status_count": "{count, plural, one {# bejegyzés} other {# bejegyzés}}", + "account_list.total": "{total, plural, one {# fiók} other {# fiók}}", "account_note.placeholder": "Kattintás jegyzet hozzáadásához", "admin.dashboard.daily_retention": "Napi regisztráció utáni felhasználómegtartási arány", "admin.dashboard.monthly_retention": "Havi regisztráció utáni felhasználómegtartási arány", @@ -337,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Másik kiszolgáló keresése", "closed_registrations_modal.preamble": "A Mastodon decentralizált, így teljesen mindegy, hol hozod létre a fiókodat, követhetsz és kapcsolódhatsz bárkivel ezen a kiszolgálón is. Saját magad is üzemeltethetsz kiszolgálót!", "closed_registrations_modal.title": "Regisztráció a Mastodonra", - "collection.share_modal.share_link_label": "Megosztási hivatkozás", + "collection.share_modal.share_link_label": "Hivatkozás megosztása", "collection.share_modal.share_via_post": "Közzététel a Mastodonon", "collection.share_modal.share_via_system": "Megosztás…", "collection.share_modal.title": "Gyűjtemény megosztása", @@ -345,8 +364,11 @@ "collection.share_template_other": "Nézd meg ezt a gyűjteményt: {link}", "collection.share_template_own": "Nézd meg az új gyűjteményemet: {link}", "collections.account_count": "{count, plural, one {# fiók} other {# fiók}}", - "collections.accounts.empty_description": "Adj hozzá legfeljebb {count} követett fiókot", + "collections.accounts.empty_description": "Adj hozzá legfeljebb {count} fiókot", + "collections.accounts.empty_editor_title": "Még senki sincs ebben a gyűjteményben", "collections.accounts.empty_title": "Ez a gyűjtemény üres", + "collections.block_collection_owner": "Fiók letiltása", + "collections.by_account": "szerző: {account_handle}", "collections.collection_description": "Leírás", "collections.collection_language": "Nyelv", "collections.collection_language_none": "Egyik sem", @@ -355,47 +377,57 @@ "collections.confirm_account_removal": "Biztos, hogy eltávolítod ezt a fiókot ebből a gyűjteményből?", "collections.content_warning": "Tartalmi figyelmeztetés", "collections.continue": "Folytatás", - "collections.create.accounts_subtitle": "Csak azok a követett fiókok adhatóak hozzá, melyek engedélyezték a felfedezést.", + "collections.copy_link": "Hivatkozás másolása", + "collections.copy_link_confirmation": "Gyűjteményhivatkozás vágólapra másolva", "collections.create.accounts_title": "Kit emelsz ki ebben a gyűjteményben?", "collections.create.basic_details_title": "Alapvető részletek", "collections.create.steps": "{step}. lépés/{total}", - "collections.create_a_collection_hint": "Gyűjtemény létrehozása a kedvenc fiókok másoknak való ajánlásához.", "collections.create_collection": "Gyűjtemény létrehozása", "collections.delete_collection": "Gyűjtemény törlése", "collections.description_length_hint": "100 karakteres korlát", - "collections.detail.accept_inclusion": "Rendben", - "collections.detail.accounts_heading": "Fiókok", - "collections.detail.author_added_you": "{author} hozzáadott ehhez a gyűjteményhez", - "collections.detail.curated_by_author": "Válogatta: {author}", - "collections.detail.curated_by_you": "Te válogattad", + "collections.detail.author_added_you_on_date": "{author} hozzáadott ekkor: {date}", "collections.detail.loading": "Gyűjtemény betöltése…", - "collections.detail.other_accounts_in_collection": "Mások ebben a gyűjteményben:", "collections.detail.revoke_inclusion": "Saját magam eltávolítása", + "collections.detail.sensitive_content": "Kényes tartalom", "collections.detail.sensitive_note": "Ebben a gyűjteményben egyesek számára érzékeny fiókok és tartalmak vannak.", "collections.detail.share": "Gyűjtemény megosztása", + "collections.detail.you_are_in_this_collection": "Kiemeltek téged ebben a gyűjteményhez", "collections.edit_details": "Részletek szerkesztése", - "collections.error_loading_collections": "Hiba történt a gyűjtemények betöltése során.", - "collections.hints.accounts_counter": "{count} / {max} fiók", + "collections.hidden_accounts_description": "Blokkoltad vagy letiltottad {count, plural, one {ezt a felhasználót} other {ezeket a felhasználókat}}", + "collections.hidden_accounts_link": "{count, plural, one {# rejtett fiók} other {# rejtett fiók}}", + "collections.hints.accounts_counter": "{count}/{max} fiók", "collections.last_updated_at": "Utoljára frissítve: {date}", + "collections.list.collections_with_count": "{count, plural, one {# gyűjtemény} other {# gyűjtemény}}", + "collections.list.created_by_author": "Létrehozta: {name}", + "collections.list.created_by_you": "Te hoztad létre", + "collections.list.featuring_you": "Tartalmaz téged", "collections.manage_accounts": "Fiókok kezelése", "collections.mark_as_sensitive": "Megjelelölés érzénykenként", "collections.mark_as_sensitive_hint": "Tartalmi figyelmeztetés mögé rejti a gyűjtemény leírását és a fiókokat. A gyűjtemény neve továbbra is látható lesz.", + "collections.maximum_collection_count_description": "A kiszolgáló legfeljebb {count} gyűjtemény létrehozását engedélyezi.", + "collections.maximum_collection_count_reached": "Elérted a gyűjtemények maximális számát", "collections.name_length_hint": "40 karakteres korlát", "collections.new_collection": "Új gyűjtemény", - "collections.no_collections_yet": "Még nincsenek gyűjtemények.", - "collections.old_last_post_note": "Egy hete osztott meg legutóbb", - "collections.remove_account": "Fiók eltávolítása", + "collections.pending_accounts.message": "A fiókok függőben lévőként jelenhetnek meg, ha a felhasználó vagy a kiszolgálója válaszára várunk. Csak te láthatod a függőben lévő fiókokat.", + "collections.pending_accounts.title": "Miért látom a függőben lévő fiókokat?", + "collections.remove_account": "Eltávolítás", "collections.report_collection": "Gyűjtemény jelentése", "collections.revoke_collection_inclusion": "Saját magam eltávolítása ebből a gyűjteményből", "collections.revoke_inclusion.confirmation": "El lettél távolítva innen: „{collection}”", "collections.revoke_inclusion.error": "Hiba történt, próbáld újra később.", - "collections.search_accounts_label": "Hozzáadandó fiókok keresése…", + "collections.search_accounts_label": "Hozzáadandó fiók keresése", "collections.search_accounts_max_reached": "Elérte a hozzáadott fiókok maximális számát", "collections.sensitive": "Érzékeny", + "collections.share_short": "Megosztás", + "collections.suggestions.can_not_add": "Nem adható hozzá", + "collections.suggestions.can_not_add_desc": "Ezek a fiókok lehet, hogy a felfedezés kikapcsolását kérték, vagy olyan kiszolgálón lehetnek, mely nem támogatja a gyűjteményeket.", + "collections.suggestions.must_follow": "Először követni kell", + "collections.suggestions.must_follow_desc": "Ezek a fiókok átnézik az összes követési kéréseket. A követőik adhatják őket gyűjteményekhez.", "collections.topic_hint": "Egy hashtag hozzáadása segít másoknak abban, hogy megértsék a gyűjtemény fő témáját.", "collections.topic_special_chars_hint": "A különleges karakterek mentéskor el lesznek távolítva", + "collections.unlisted_collections_description": "Ezek nem jelennek meg a profilodon másoknak. A hivatkozással rendelkezők fedezhetik fel őket.", + "collections.unlisted_collections_with_count": "Fel nem sorolt gyűjtemények ({count})", "collections.view_collection": "Gyűjtemény megtekintése", - "collections.view_other_collections_by_user": "Felhasználó más gyűjteményeinek megtekintése", "collections.visibility_public": "Nyilvános", "collections.visibility_public_hint": "Felfedezhető a keresési találatokban és az egyéb helyeken, ahol ajánlások jelennek meg.", "collections.visibility_title": "Láthatóság", @@ -404,7 +436,6 @@ "column.about": "Névjegy", "column.blocks": "Letiltott felhasználók", "column.bookmarks": "Könyvjelzők", - "column.collections": "Saját gyűjtemények", "column.community": "Helyi idővonal", "column.create_list": "Lista létrehozása", "column.direct": "Személyes említések", @@ -421,8 +452,10 @@ "column.lists": "Listák", "column.mutes": "Némított felhasználók", "column.notifications": "Értesítések", + "column.other_collections": "{name} gyűjteményei", "column.pins": "Kitűzött bejegyzések", "column.public": "Föderációs idővonal", + "column.your_collections": "Saját gyűjtemények", "column_back_button.label": "Vissza", "column_header.hide_settings": "Beállítások elrejtése", "column_header.moveLeft_settings": "Oszlop áthelyezése balra", @@ -484,12 +517,13 @@ "confirmations.discard_draft.post.title": "Elveted a piszkozatot?", "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.follow_to_collection.confirm": "Követés, és gyűjteményhez adás", - "confirmations.follow_to_collection.message": "Követned kell {name} felhasználót, hogy hozzáadhasd egy gyűjteményhez.", - "confirmations.follow_to_collection.title": "Fiók követése?", "confirmations.follow_to_list.confirm": "Követés, és hozzáadás a listához", "confirmations.follow_to_list.message": "Követned kell {name} felhasználót, hogy hozzáadhasd a listához.", "confirmations.follow_to_list.title": "Felhasználó követése?", + "confirmations.hide_featured_tab.confirm": "Lap elrejtése", + "confirmations.hide_featured_tab.intro": "Ezt bármikor megváltoztathatod a Profil szerkesztése > Profillap beállításai alatt.", + "confirmations.hide_featured_tab.message": "Ez elrejti a lapot a(z) {serverName} és más olyan kiszolgálók felhasználói elől, amelyek a Mastodon legfrissebb verzióját futtatják. Más esetekben a megjelenítés eltérhet.", + "confirmations.hide_featured_tab.title": "Elrejti a „Kiemelt” lapot?", "confirmations.logout.confirm": "Kijelentkezés", "confirmations.logout.message": "Biztos, hogy kijelentkezel?", "confirmations.logout.title": "Kijelentkezel?", @@ -528,6 +562,7 @@ "content_warning.hide": "Bejegyzés elrejtése", "content_warning.show": "Megjelenítés mindenképp", "content_warning.show_more": "Több megjelenítése", + "content_warning.show_short": "Megjelenítés", "conversation.delete": "Beszélgetés törlése", "conversation.mark_as_read": "Megjelölés olvasottként", "conversation.open": "Beszélgetés megtekintése", @@ -568,6 +603,14 @@ "domain_pill.your_server": "A digitális otthonod, ahol a bejegyzéseid találhatók. Nem tetszik a mostani? Válts kiszolgálót bármikor, és vidd magaddal a követőidet is.", "domain_pill.your_username": "Az egyedi azonosítód ezen a kiszolgálón. Lehet, hogy ugyanazon felhasználónév különböző kiszolgálókon is megtalálható.", "dropdown.empty": "Válassz egy lehetőséget", + "email_subscriptions.email": "E-mail-cím", + "email_subscriptions.form.action": "Feliratkozás", + "email_subscriptions.form.bottom": "Kapj bejegyzéseket a postaládádba anélkül, hogy Mastodon-fiókot hoznál létre. Bármikor leiratkozhatsz. További információkért nézd meg az Adatvédelmi irányelveket.", + "email_subscriptions.form.title": "Regisztrálj {name} e-mailben küldött híreiért", + "email_subscriptions.submitted.lead": "Ellenőrizd a postaládádat az e-mailes hírek regisztrációs folyamatának befejezéséhez.", + "email_subscriptions.submitted.title": "Csak még egy lépés", + "email_subscriptions.validation.email.blocked": "E-mail-szolgáltató blokkolva", + "email_subscriptions.validation.email.invalid": "Érvénytelen e-mail-cím", "embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.", "embed.preview": "Így fog kinézni:", "emoji_button.activity": "Tevékenység", @@ -585,9 +628,14 @@ "emoji_button.search_results": "Keresési találatok", "emoji_button.symbols": "Szimbólumok", "emoji_button.travel": "Utazás és helyek", - "empty_column.account_featured.me": "Még semmit sem emeltél ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?", - "empty_column.account_featured.other": "{acct} még semmit sem emelt ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?", - "empty_column.account_featured_other.unknown": "Ez a fiók még semmit sem emelt ki.", + "empty_column.account_featured.other": "{acct} még nem emelt ki semmit.", + "empty_column.account_featured_self.no_collections_button": "Gyűjtemény létrehozása", + "empty_column.account_featured_self.no_collections_hide_tab": "Inkább a lap elrejtése", + "empty_column.account_featured_self.pre_collections": "Készülj fel a gyűjteményekre", + "empty_column.account_featured_self.pre_collections_desc": "A gyűjtemények (a Mastodon 4.6-ban érkezik) lehetővé teszik, hogy létrehozd a saját válogatott fióklistáidat, és ajánld másoknak.", + "empty_column.account_featured_self.showcase_accounts": "Emeld ki a kedvenc fiókjaidat", + "empty_column.account_featured_self.showcase_accounts_desc": "A gyűjtemények fiókok válogatott listái, melyek segítenek másoknak a Födiverzum még nagyobb részének felfedezésében.", + "empty_column.account_featured_unknown.other": "Ez a fiók még nem emelt ki semmit.", "empty_column.account_hides_collections": "Ez a felhasználó úgy döntött, hogy nem teszi elérhetővé ezt az információt.", "empty_column.account_suspended": "Fiók felfüggesztve", "empty_column.account_timeline": "Itt nincs bejegyzés!", @@ -627,6 +675,10 @@ "featured_carousel.header": "{count, plural, one {Kiemelt bejegyzés} other {Kiemelt bejegyzések}}", "featured_carousel.slide": "{current, number}. bejegyzés / {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Mostanában ezekről osztottál meg dolgokat: {items}. Hozzáadod ezeket a kiemelt hashtagekhez?", + "featured_tags.suggestions.add": "Hozzáadás", + "featured_tags.suggestions.added": "Kezeld a kiemelt hashtageidet bármikor a Profil szerkesztése > Kiemelt hashtagek alatt.", + "featured_tags.suggestions.dismiss": "Nem, köszönöm", "filter_modal.added.context_mismatch_explanation": "Ez a szűrőkategória nem érvényes abban a környezetben, amelyből elérted ezt a bejegyzést. Ha ebben a környezetben is szűrni szeretnéd a bejegyzést, akkor szerkesztened kell a szűrőt.", "filter_modal.added.context_mismatch_title": "Környezeti eltérés.", "filter_modal.added.expired_explanation": "Ez a szűrőkategória elévült, a használatához módosítanod kell az elévülési dátumot.", @@ -669,7 +721,9 @@ "follow_suggestions.who_to_follow": "Kit érdemes követni", "followed_tags": "Követett hashtagek", "followers.hide_other_followers": "Ez a felhasználó azt választotta, hogy ne legyenek láthatóak a követői", + "followers.title": "{name} követése", "following.hide_other_following": "Ez a felhasználó azt választotta, hogy ne legyenek láthatóak a követései", + "following.title": "{name} követi", "footer.about": "Névjegy", "footer.about_mastodon": "A Mastodonról", "footer.about_server": "A {domain} domainről", @@ -681,6 +735,7 @@ "footer.source_code": "Forráskód megtekintése", "footer.status": "Állapot", "footer.terms_of_service": "Felhasználási feltételek", + "form_error.blank": "A mező nem lehet üres.", "form_field.optional": "(nem kötelező)", "generic.saved": "Elmentve", "getting_started.heading": "Első lépések", @@ -864,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Követett hashtagek menü kibontása", "navigation_panel.expand_lists": "Listamenü kibontása", "not_signed_in_indicator.not_signed_in": "Az erőforrás eléréséhez be kell jelentkezned.", + "notification.added_to_collection": "{name} hozzáadott egy gyűjteményhez", "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}", @@ -873,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} és {count, plural, one {# másik} other {# másik}} regisztrált", "notification.annual_report.message": "Vár a {year}. év #Wrapstodon jelentése! Fedd fel az éved jelentős eseményeit és emlékezetes pillanatait a Mastodonon!", "notification.annual_report.view": "#Wrapstodon megtekintése", + "notification.collection_update": "{name} szerkesztett egy gyűjteményt, amelyben szerepelsz", "notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet", "notification.favourite.name_and_others_with_link": "{name} és {count, plural, one {# másik} other {# másik}} kedvencnek jelölte a bejegyzésedet", "notification.favourite_pm": "{name} kedvelte a privát említésedet", @@ -1136,6 +1193,7 @@ "server_banner.active_users": "aktív felhasználó", "server_banner.administered_by": "Adminisztrátor:", "server_banner.is_one_of_many": "{domain} egy a jelentős, független Mastodon kiszolgálók közül, melyet a fediverzumban való részvételre használhatsz.", + "server_banner.more_about_this_server": "Több információ a kiszolgálóról", "server_banner.server_stats": "Kiszolgálóstatisztika:", "sign_in_banner.create_account": "Fiók létrehozása", "sign_in_banner.follow_anyone": "Kövess bárkit a fediverzumon keresztül, és láss mindent időrendi sorrendben. Algoritmusok, hirdetések, kattintásvadászat nélkül.", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index df43d468943b5e..5ad93395648f7f 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -20,8 +20,6 @@ "account.edit_profile": "Խմբագրել հաշիւը", "account.enable_notifications": "Ծանուցել ինձ @{name} գրառումների մասին", "account.endorse": "Ցուցադրել անձնական էջում", - "account.featured_tags.last_status_at": "Վերջին գրառումը եղել է՝ {date}", - "account.featured_tags.last_status_never": "Գրառումներ չկան", "account.follow": "Հետեւել", "account.followers": "Հետեւողներ", "account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։", @@ -41,7 +39,6 @@ "account.no_bio": "Նկարագրութիւն չկայ:", "account.open_original_page": "Բացել իրական էջը", "account.posts": "Գրառումներ", - "account.posts_with_replies": "Գրառումներ եւ պատասխաններ", "account.report": "Բողոքել @{name}֊ի մասին", "account.requested_follow": "{name}-ը ցանկանում է հետեւել քեզ", "account.share": "Կիսուել @{name}֊ի էջով", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 3f65776b91f016..f4c473a6880d17 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -21,12 +21,10 @@ "account.block_domain": "Blocar dominio {domain}", "account.block_short": "Blocar", "account.blocked": "Blocate", - "account.blocking": "Blocate", "account.cancel_follow_request": "Cancellar sequimento", "account.copy": "Copiar ligamine a profilo", "account.direct": "Mentionar privatemente @{name}", "account.disable_notifications": "Non plus notificar me quando @{name} publica", - "account.domain_blocking": "Dominio blocate", "account.edit_profile": "Modificar profilo", "account.edit_profile_short": "Modificar", "account.enable_notifications": "Notificar me quando @{name} publica", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "Sequite per {name1} e {name2}", "account.featured": "In evidentia", "account.featured.accounts": "Profilos", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Ultime message publicate le {date}", - "account.featured_tags.last_status_never": "Necun message", "account.follow": "Sequer", "account.follow_back": "Sequer in retorno", "account.follow_back_short": "Sequer in retorno", @@ -68,16 +63,13 @@ "account.mute_notifications_short": "Silentiar le notificationes", "account.mute_short": "Silentiar", "account.muted": "Silentiate", - "account.muting": "Silentiate", "account.mutual": "Sequimento mutue", "account.no_bio": "Nulle description fornite.", "account.open_original_page": "Aperir le pagina original", "account.posts": "Messages", - "account.posts_with_replies": "Messages e responsas", "account.remove_from_followers": "Remover {name} del sequitores", "account.report": "Reportar @{name}", "account.requested_follow": "{name} ha requestate de sequer te", - "account.requests_to_follow_you": "Requestas de sequer te", "account.share": "Compartir profilo de @{name}", "account.show_reblogs": "Monstrar impulsos de @{name}", "account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}", @@ -318,9 +310,6 @@ "emoji_button.search_results": "Resultatos de recerca", "emoji_button.symbols": "Symbolos", "emoji_button.travel": "Viages e locos", - "empty_column.account_featured.me": "Tu non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?", - "empty_column.account_featured.other": "{acct} non ha ancora mittite alcun cosa in evidentia. Sapeva tu que tu pote mitter in evidentia sur tu profilo le hashtags que tu usa le plus e mesmo le contos de tu amicos?", - "empty_column.account_featured_other.unknown": "Iste conto non ha ancora mittite alcun cosa in evidentia.", "empty_column.account_hides_collections": "Le usator non ha rendite iste information disponibile", "empty_column.account_suspended": "Conto suspendite", "empty_column.account_timeline": "Nulle messages hic!", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 48c8f85fa52111..833ce291928b8a 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -21,12 +21,10 @@ "account.block_domain": "Blokir domain {domain}", "account.block_short": "Blokir", "account.blocked": "Terblokir", - "account.blocking": "Memblokir", "account.cancel_follow_request": "Batalkan permintaan ikut", "account.copy": "Salin tautan ke profil", "account.direct": "Sebut secara pribadi @{name}", "account.disable_notifications": "Berhenti memberitahu saya ketika @{name} memposting", - "account.domain_blocking": "Memblokir domain", "account.edit_profile": "Ubah profil", "account.enable_notifications": "Beritahu saya saat @{name} memposting", "account.endorse": "Tampilkan di profil", @@ -34,8 +32,6 @@ "account.familiar_followers_two": "Diikuti oleh {name1} dan {name2}", "account.featured": "Unggulan", "account.featured.accounts": "Profil", - "account.featured_tags.last_status_at": "Kiriman terakhir pada {date}", - "account.featured_tags.last_status_never": "Tidak ada kiriman", "account.follow": "Ikuti", "account.follow_back": "Ikuti balik", "account.followers": "Pengikut", @@ -62,7 +58,6 @@ "account.no_bio": "Tidak ada deskripsi yang diberikan.", "account.open_original_page": "Buka halaman asli", "account.posts": "Kiriman", - "account.posts_with_replies": "Kiriman dan balasan", "account.report": "Laporkan @{name}", "account.requested_follow": "{name} ingin mengikuti Anda", "account.share": "Bagikan profil @{name}", @@ -576,7 +571,7 @@ "ui.beforeunload": "Draf Anda akan hilang jika Anda keluar dari Mastodon.", "units.short.billion": "{count}M", "units.short.million": "{count}Jt", - "units.short.thousand": "{count}Rb", + "units.short.thousand": "{count}rb", "upload_area.title": "Seret & lepaskan untuk mengunggah", "upload_button.label": "Tambahkan media", "upload_error.limit": "Batas unggah berkas terlampaui.", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 77097b05c6482d..45b4a8f8d151e3 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -25,8 +25,6 @@ "account.edit_profile": "Redacter profil", "account.enable_notifications": "Notificar me quande @{name} posta", "account.endorse": "Recomandar sur profil", - "account.featured_tags.last_status_at": "Ultim posta ye {date}", - "account.featured_tags.last_status_never": "Null postas", "account.follow": "Sequer", "account.follow_back": "Sequer reciprocmen", "account.followers": "Sequitores", @@ -50,7 +48,6 @@ "account.no_bio": "Null descrition providet.", "account.open_original_page": "Aperter li págine original", "account.posts": "Postas", - "account.posts_with_replies": "Postas e replicas", "account.report": "Raportar @{name}", "account.requested_follow": "{name} ha petit sequer te", "account.share": "Distribuer li profil de @{name}", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index 0120d52c83805e..176cb0cfa942f9 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -9,7 +9,6 @@ "account.go_to_profile": "Jee na profaịlụ", "account.mute": "Mee ogbi @{name}", "account.posts": "Edemede", - "account.posts_with_replies": "Edemede na nzaghachị", "account.unfollow": "Kwụsị iso", "account_note.placeholder": "Click to add a note", "admin.dashboard.retention.cohort_size": "Ojiarụ ọhụrụ", diff --git a/app/javascript/mastodon/locales/intl_provider.tsx b/app/javascript/mastodon/locales/intl_provider.tsx index 94372f95b0fc41..b59458cd2d67f1 100644 --- a/app/javascript/mastodon/locales/intl_provider.tsx +++ b/app/javascript/mastodon/locales/intl_provider.tsx @@ -50,7 +50,6 @@ export const IntlProvider: React.FC< locale={locale} messages={messages} onError={onProviderError} - textComponent='span' {...props} > {children} diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 9254164374f6fd..512717621fb83f 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -1,6 +1,7 @@ { "about.blocks": "Jerata servili", "about.contact": "Kontaktajo:", + "about.default_locale": "Predeterminita", "about.disclaimer": "Mastodon esas libera, publikfonta e komercmarko di Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Expliko nedisponebla", "about.domain_blocks.preamble": "Mastodon generale permisas on vidar kontenajo e interagar kun uzanti de irga altra servilo en fediverso. Existas eceptioni quo facesis che ca partikulara servilo.", @@ -8,13 +9,21 @@ "about.domain_blocks.silenced.title": "Limitizita", "about.domain_blocks.suspended.explanation": "Nula informi de ca servili procedagesos o retenesos o interchanjesos, do irga interago o komuniko kun uzanti de ca servili esas neposibla.", "about.domain_blocks.suspended.title": "Restriktita", + "about.language_label": "Linguo", "about.not_available": "Ca informo ne igesis che ca servilo.", "about.powered_by": "Necentraligita sociala ret quo povigesas da {mastodon}", "about.rules": "Servilreguli", "account.account_note_header": "Personala noto", + "account.activity": "Ago", + "account.add_note": "Adjuntez personala noto", "account.add_or_remove_from_list": "Adjuntar o forigar de listi", + "account.badges.admin": "Administranto", + "account.badges.blocked": "Blokusita", "account.badges.bot": "Boto", + "account.badges.domain_blocked": "Blokusita domeno", "account.badges.group": "Grupo", + "account.badges.muted": "Silencigata", + "account.badges.muted_until": "Silencigita til {until}", "account.block": "Blokusar @{name}", "account.block_domain": "Blokusar {domain}", "account.block_short": "Blokusar", @@ -23,19 +32,32 @@ "account.copy": "Kopiez ligilo al profilo", "account.direct": "Private mencionez @{name}", "account.disable_notifications": "Cesez avizar me kande @{name} postas", + "account.edit_note": "Redaktez personala noto", "account.edit_profile": "Redaktar profilo", + "account.edit_profile_short": "Redaktez", "account.enable_notifications": "Avizez me kande @{name} postas", "account.endorse": "Traito di profilo", - "account.featured_tags.last_status_at": "Antea posto ye {date}", - "account.featured_tags.last_status_never": "Nula posti", + "account.featured": "Estalita", + "account.featured.accounts": "Profili", + "account.featured.collections": "Kolektaji", + "account.filters.all": "Omna ago", + "account.filters.boosts_toggle": "Montrez diskonoci", + "account.filters.posts_boosts": "Afishi e diskonoci", + "account.filters.posts_only": "Afishi", + "account.filters.posts_replies": "Afishi e respondi", + "account.filters.replies_toggle": "Montrez respondi", "account.follow": "Sequar", "account.follow_back": "Anke sequez", + "account.follow_request_cancel": "Anulez demando", + "account.follow_request_cancel_short": "Anulez", + "account.follow_request_short": "Demandez", "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} sequato} other {{counter} sequati}}", "account.follows.empty": "Ca uzanto ne sequa irgu til nun.", + "account.follows_you": "Sequas vu", "account.go_to_profile": "Irez al profilo", "account.hide_reblogs": "Celez repeti de @{name}", "account.in_memoriam": "Memorige.", @@ -45,15 +67,30 @@ "account.locked_info": "La privatesostaco di ca konto fixesas quale lokata. Proprietato manue kontrolas personi qui povas sequar.", "account.media": "Audvidaji", "account.mention": "Mencionar @{name}", + "account.menu.add_to_list": "Adjuntez ad listo…", + "account.menu.block": "Blokusez konto", + "account.menu.block_domain": "Blokuez {domain}", + "account.menu.direct": "Private mencionez", + "account.menu.hide_reblogs": "Celez diskonoci en tempolineo", + "account.menu.mention": "Mencionez", + "account.menu.mute": "Silencigez konto", + "account.menu.open_original_page": "Videz che {domain}", + "account.menu.remove_follower": "Efacez sequanto", + "account.menu.report": "Efacez konto", + "account.menu.share": "Kunhavigez…", + "account.menu.show_reblogs": "Montrez diskonoci en tempolineo", + "account.menu.unblock": "Retroblokusez konto", + "account.menu.unblock_domain": "Retroblokusez {domain}", + "account.menu.unmute": "Retrosilencigez konto", "account.moved_to": "{name} indikis ke lua nova konto es nune:", "account.mute": "Celar @{name}", "account.mute_notifications_short": "Silencigez avizi", "account.mute_short": "Silencigez", "account.muted": "Silencigata", + "account.name.help.header": "Nometo esas kam retpostadreso", "account.no_bio": "Deskriptajo ne provizesis.", "account.open_original_page": "Apertez originala pagino", "account.posts": "Mesaji", - "account.posts_with_replies": "Afishi e respondi", "account.report": "Denuncar @{name}", "account.requested_follow": "{name} demandis sequar tu", "account.share": "Partigez profilo di @{name}", @@ -62,11 +99,36 @@ "account.unblock": "Desblokusar @{name}", "account.unblock_domain": "Desblokusar {domain}", "account.unblock_short": "Desblokusar", - "account.unendorse": "Ne publikigez che profilo", + "account.unendorse": "Ne estalez che profilo", "account.unfollow": "Ne plus sequar", "account.unmute": "Ne plus celar @{name}", "account.unmute_notifications_short": "Dessilencigez avizi", "account.unmute_short": "Desilencigez", + "account_edit.custom_fields.placeholder": "Adjuntez vua pronomi, externa ligili o altra irgo quan vu volas kunhavigar.", + "account_edit.display_name.add_label": "Adjuntez nometo", + "account_edit.display_name.edit_label": "Redaktez nometo", + "account_edit.display_name.placeholder": "Vua nometo esas quale vua nomo aparas che vua profilo e en tempolinei.", + "account_edit.display_name.title": "Nometo", + "account_edit.featured_hashtags.edit_label": "Adjuntez gretvorti", + "account_edit.featured_hashtags.placeholder": "Helpez altru identifikar e havez rapida aceso por vua prizita topiki.", + "account_edit.featured_hashtags.title": "Estalita gretvorti", + "account_edit.field_edit_modal.length_warning": "Rekomendita literlimito esis ecesita.", + "account_edit.field_edit_modal.link_emoji_warning": "Ni desrekomendas uzar kustuma emoji kun url.", + "account_edit.field_edit_modal.url_warning": "Por adjuntar ligilo, inkluzez {protocol} che la komenco.", + "account_edit.name_modal.add_title": "Adjuntez nometo", + "account_edit.name_modal.edit_title": "Redaktez nometo", + "account_edit.profile_tab.button_label": "Kustumizez", + "account_edit.profile_tab.hint.description": "Ca preferaji kustumizas quon uzanti vidas che {server} per oficala softwari, me li forsan ne esas sama ad uzanti che altra servili e desoficala softwari.", + "account_edit.profile_tab.hint.title": "Vidi ankore esas chanjita", + "account_edit.profile_tab.show_featured.description": "'Estalita' esas nemusta langeto ube vu povas dismontrar altra konti.", + "account_edit.profile_tab.show_featured.title": "Montrez 'Estalita'-langeto", + "account_edit.profile_tab.show_media.description": "'Audvidajo' esas desmusta langeto qua montras vua posti qui kontenas imaji o videii.", + "account_edit.profile_tab.show_media.title": "Montrez 'Audvidajo'-langeto", + "account_edit.profile_tab.show_media_replies.description": "Kande aktivigita, audvidajlangeto montras ambe vua afishi e respondi ad afishi di altra personi.", + "account_edit.profile_tab.show_media_replies.title": "Inkluzas respondi che 'Audvidajo'-langeto", + "account_edit.verified_modal.invisible_link.details": "Adjuntez la ligilo ad vua kapimajo. Vu anke povas uzar ligiletiketo en la kapimajo di la pagino vice {tag}, ma la HTML mustas esar acesebla sen exekutar JavaScript.", + "account_edit_tags.help_text": "Estalita gretvorti helpas uzanti deskovrar e interagar kun vua profilo.", + "account_edit_tags.max_tags_reached": "Vu atingas la maxim quanto di estalita gretvorti.", "account_note.placeholder": "Klikez por adjuntar noto", "admin.dashboard.daily_retention": "Dia uzantoretenseso pos registro", "admin.dashboard.monthly_retention": "Monata uzantoreteneso pos registro", @@ -90,11 +152,23 @@ "alt_text_modal.describe_for_people_with_visual_impairments": "Priskribar co por personi kun viddeskapableso…", "alt_text_modal.done": "Finis", "announcement.announcement": "Anunco", + "annual_report.shared_page.donate": "Donacez", + "annual_report.shared_page.footer": "Igita kun {heart} da la grupo di Mastodon", + "annual_report.shared_page.footer_server_info": "{username} uzas {domain}, un de multa komunitati quin povizita da Mastodon.", + "annual_report.summary.archetype.booster.desc_public": "{name} dauras serchar afishi por diskonoci e pluigas altra kreanti.", + "annual_report.summary.archetype.booster.desc_self": "Vu dauras serchar afishi por diskonoci e pluigas altra kreanti.", + "annual_report.summary.archetype.booster.name": "La arkisto", + "annual_report.summary.archetype.lurker.desc_public": "Ni povas ke {name} esas ulaloke e juas Mastodon.", + "annual_report.summary.archetype.lurker.desc_self": "Ni savas ke vu esas ulaloke e juas Mastodon.", + "annual_report.summary.highlighted_post.boost_count": "Ca afisho esis diskonocita {count, plural,one {unfoye} other {# foye}}.", "annual_report.summary.most_used_app.most_used_app": "maxim uzita aplikajo", "annual_report.summary.most_used_hashtag.most_used_hashtag": "maxim uzita gretvorto", "annual_report.summary.new_posts.new_posts": "nova afishi", "annual_report.summary.percentile.text": "To pozas vu sur la supro di uzanti di {domain}.", "annual_report.summary.percentile.we_wont_tell_bernie": "Ni ne dicas ad Bernio.", + "annual_report.summary.share_elsewhere": "Havigez ad altra loki", + "annual_report.summary.share_message": "Me ganas la persontipo {archetype}!", + "annual_report.summary.share_on_mastodon": "Kunhavigez che Mastodon", "attachments_list.unprocessed": "(neprocedita)", "audio.hide": "Celez audio", "block_modal.remote_users_caveat": "Ni questionos {domain} di la servilo por respektar vua decido. Publika posti forsan ankore estas videbla a neenirinta uzanti.", @@ -125,6 +199,16 @@ "closed_registrations_modal.find_another_server": "Trovar altra servilo", "closed_registrations_modal.preamble": "Mastodon es descentraligita, do on povas krear konto che irga servilo e sequar e interagar kun irgu che ca servilo. On mem povas operacar servilo ipse!", "closed_registrations_modal.title": "Krear konto che Mastodon", + "collection.share_modal.share_via_post": "Afishigez che Mastodon", + "collection.share_modal.share_via_system": "Kunhavigez ad…", + "collection.share_modal.title": "Kunhavigez kolektajo", + "collection.share_modal.title_new": "Kunhavigez vua nova kolektajo!", + "collection.share_template_other": "Videz ca splendida kolektajo: {link}", + "collection.share_template_own": "Videz mia nova kolektajo: {link}", + "collections.content_warning": "Kontenajaverto", + "collections.create.accounts_title": "Quan vu estalos en ca kolektajo?", + "collections.detail.share": "Kunhavigez ca kolektajo", + "collections.mark_as_sensitive_hint": "Celas deskripto di la kolektajo e konti dop kontenajaverto.", "column.about": "Pri co", "column.blocks": "Blokusita uzeri", "column.bookmarks": "Lektosigni", @@ -200,9 +284,21 @@ "confirmations.missing_alt_text.secondary": "Mesajar irgamaniere", "confirmations.missing_alt_text.title": "Ka adjuntar alternativa texto?", "confirmations.mute.confirm": "Silencigez", + "confirmations.private_quote_notify.cancel": "Retro ad redakto", + "confirmations.private_quote_notify.confirm": "Publikigez afisho", + "confirmations.private_quote_notify.do_not_show_again": "Ne montrez ca mesajo ankorfoye ad me", + "confirmations.private_quote_notify.message": "La persono quan vua citas e altra mencioni esar savigos e povos vidar vua afisho, mem se li ne sequas vua.", + "confirmations.private_quote_notify.title": "Ka kunhavigez kun sequanti e mencionita uzanti?", + "confirmations.quiet_post_quote_info.dismiss": "Ne memorigez me ankorfoye", + "confirmations.quiet_post_quote_info.got_it": "Komprenas", + "confirmations.quiet_post_quote_info.message": "Kande citar deslauta publika afisho, vua afisho esar celitos de tendenca tempolinei.", + "confirmations.quiet_post_quote_info.title": "Citas deslauta publika afishi", "confirmations.redraft.confirm": "Efacez e riskisez", "confirmations.redraft.message": "Ka vu certe volas efacar ca posto e riskisigar ol? Favoriziti e repeti esos perdita, e respondi al posto originala esos orfanigita.", "confirmations.redraft.title": "Ka efacar & riskisar posto?", + "confirmations.revoke_quote.confirm": "Efacez afisho", + "confirmations.revoke_quote.message": "Ca ago ne povas esar retroagar.", + "confirmations.revoke_quote.title": "Ka efacez afisho?", "confirmations.unfollow.confirm": "Desequez", "content_warning.hide": "Celez posto", "content_warning.show": "Montrez nur", @@ -290,9 +386,18 @@ "errors.unexpected_crash.copy_stacktrace": "Kopiez amastraso a klipplanko", "errors.unexpected_crash.report_issue": "Reportigez problemo", "explore.suggested_follows": "Personi", + "explore.title": "Tendenca", "explore.trending_links": "Novaji", "explore.trending_statuses": "Posti", "explore.trending_tags": "Hashtagi", + "featured_carousel.current": "Afisho {current, number} / {max, number}", + "featured_carousel.header": "{count, plural, one {Pinglizita Afisho} other {Pinglizita Afishi}}", + "featured_carousel.slide": "Afisho {current, number} ek {max, number}", + "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Recente vu afishigis pri {items}. Ka adjuntez ci kom estalita gretvorti?", + "featured_tags.suggestions.add": "Adjuntez", + "featured_tags.suggestions.added": "Aranjez vua estalita gretvorti irgatempe che Redaktez Profilo > Estalita gretvorti.", + "featured_tags.suggestions.dismiss": "Nedanki", "filter_modal.added.context_mismatch_explanation": "Ca filtrilgrupo ne uzesis ad informo di ca adirita afisho.", "filter_modal.added.context_mismatch_title": "Kontenajneparigeso!", "filter_modal.added.expired_explanation": "Ca filtrilgrupo expiris, vu bezonas chanjar expirtempo por apliko.", @@ -357,7 +462,9 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} partoprenanto} other {{counter} partoprenanti}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} posto} other {{counter} posti}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} posto} other {{counter} posti}} hodie", + "hashtag.feature": "Estalez che profilo", "hashtag.follow": "Sequar gretvorto", + "hashtag.unfeature": "Ne estalez che profilo", "hashtag.unfollow": "Dessequar gretvorto", "hashtags.and_other": "…e {count, plural, one {# plusa}other {# plusa}}", "hints.profiles.followers_may_be_missing": "Sequanti di ca profilo forsan ne esas hike.", @@ -366,6 +473,7 @@ "hints.profiles.see_more_followers": "Vidar plu multa sequanti sur {domain}", "hints.profiles.see_more_follows": "Vidar plu multa sequati sur {domain}", "hints.profiles.see_more_posts": "Vidar plu multa posti sur {domain}", + "home.column_settings.show_quotes": "Montrez citi", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", "home.hide_announcements": "Celez anunci", @@ -402,6 +510,7 @@ "keyboard_shortcuts.description": "Deskripto", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.explore": "Apertez tendenca tempolineo", "keyboard_shortcuts.favourite": "Favorizez ca posto", "keyboard_shortcuts.favourites": "Apertez listo di favoriziti", "keyboard_shortcuts.federated": "to open federated timeline", @@ -417,6 +526,7 @@ "keyboard_shortcuts.open_media": "Desklozar audvidaji", "keyboard_shortcuts.pinned": "Desklozar listo di adpinglita afishi", "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.quote": "Citez afisho", "keyboard_shortcuts.reply": "to reply", "keyboard_shortcuts.requests": "to open follow requests list", "keyboard_shortcuts.search": "to focus search", @@ -477,8 +587,10 @@ "mute_modal.you_wont_see_mentions": "Vu ne vidos posti qua mencionas lu.", "mute_modal.you_wont_see_posts": "Lu ankore povas vidar vua posti, ma vu ne vidos lua.", "navigation_bar.about": "Pri co", + "navigation_bar.account_settings": "Pasvorto e sekureso", "navigation_bar.administration": "Administro", "navigation_bar.advanced_interface": "Apertez per retintervizajo", + "navigation_bar.automated_deletion": "Automata postoefaco", "navigation_bar.blocks": "Blokusita uzeri", "navigation_bar.bookmarks": "Lektosigni", "navigation_bar.direct": "Privata mencioni", @@ -488,13 +600,16 @@ "navigation_bar.follow_requests": "Demandi di sequado", "navigation_bar.followed_tags": "Hashtagi sequita", "navigation_bar.follows_and_followers": "Sequati e sequanti", + "navigation_bar.import_export": "Importaco e exportaco", "navigation_bar.lists": "Listi", "navigation_bar.logout": "Ekirar", "navigation_bar.moderation": "Jero", "navigation_bar.mutes": "Celita uzeri", "navigation_bar.opened_in_classic_interface": "Posti, konti e altra pagini specifika apertesas en la retovidilo klasika.", "navigation_bar.preferences": "Preferi", + "navigation_bar.privacy_and_reach": "Privateso e atingeso", "navigation_bar.search": "Serchez", + "navigation_bar.search_trends": "Sercho / Tendenco", "not_signed_in_indicator.not_signed_in": "Vu mustas enirar por acesar ca moyeno.", "notification.admin.report": "{name} raportizis {target}", "notification.admin.report_account": "{name} raportis {count, plural,one {1 posto} other {# posti}} de {target} pro {category}", @@ -516,6 +631,7 @@ "notification.label.mention": "Mencionez", "notification.label.private_mention": "Privata menciono", "notification.label.private_reply": "Privata respondo", + "notification.label.quote": "{name} citis vua afisho", "notification.label.reply": "Respondez", "notification.mention": "Mencionez", "notification.mentioned_you": "{name} mencionis vu", @@ -530,6 +646,7 @@ "notification.moderation_warning.action_suspend": "Vua konto restriktesis.", "notification.own_poll": "Vua votinquesto fineskis", "notification.poll": "Votinquesto ube vu votis fineskis", + "notification.quoted_update": "{name} redaktis afisho quan vu citas", "notification.reblog": "{name} repetis tua mesajo", "notification.reblog.name_and_others_with_link": "{name} e {count, plural,one {# altru} other {#altri}} repetis vua posto", "notification.relationships_severance_event": "Desganis konekteso kun {name}", @@ -573,6 +690,7 @@ "notifications.column_settings.mention": "Mencioni:", "notifications.column_settings.poll": "Votinquestorezulti:", "notifications.column_settings.push": "Pulsavizi", + "notifications.column_settings.quote": "Citi:", "notifications.column_settings.reblog": "Repeti:", "notifications.column_settings.show": "Montrar en kolumno", "notifications.column_settings.sound": "Plear sono", @@ -646,10 +764,20 @@ "privacy.private.short": "Sequanti", "privacy.public.long": "Ulu de e ne de Mastodon", "privacy.public.short": "Publike", + "privacy.quote.anyone": "{visibility}, citi permisita", + "privacy.quote.disabled": "{visibility}, citi despermisita", + "privacy.quote.limited": "{visibility}, citi limitizita", "privacy.unlisted.additional": "Co kondutas exakte kam publika, ecepte la posto ne aparos en nuna flui o gretvorti, exploro, o sercho di Mastodon, mem se vu esas volunta totkonte.", + "privacy.unlisted.long": "Celita de Mastodon-serchrezulti, tendenci e publika tempolinei", "privacy.unlisted.short": "Deslauta publiko", "privacy_policy.last_updated": "Antea novajo ye {date}", "privacy_policy.title": "Privatesguidilo", + "quote_error.edit": "Citi ne povas esar adjuntar kande redaktar afisho.", + "quote_error.poll": "Cito ne esas permisita kun votinquesti.", + "quote_error.private_mentions": "Cito ne esas permisita kun direta mencioni.", + "quote_error.quote": "Nur un cito samtempe esas permisita.", + "quote_error.unauthorized": "Vu ne esas yurizita por citar ca afisho.", + "quote_error.upload": "Cito ne esas permisita kun audvidajatachaji.", "recommended": "Rekomendata", "refresh": "Rifreshez", "regeneration_indicator.please_stand_by": "Vartez.", @@ -665,6 +793,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hodie", + "remove_quote_hint.button_label": "Komprenas", + "remove_quote_hint.message": "Vu povas agar ol de la {icon} preferajmenuo.", + "remove_quote_hint.title": "Ka volas efacar vua citita afisho?", "reply_indicator.attachments": "{count, plural, one {# addonajo} other {# addonaji}}", "reply_indicator.cancel": "Nihiligar", "reply_indicator.poll": "Votinquesto", @@ -755,10 +886,13 @@ "status.admin_account": "Apertez jerintervizajo por @{name}", "status.admin_domain": "Apertez jerintervizajo por {domain}", "status.admin_status": "Open this status in the moderation interface", + "status.all_disabled": "Diskonocigi e citi esas desaktivigita", "status.block": "Restriktez @{name}", "status.bookmark": "Lektosigno", "status.cancel_reblog_private": "Desrepetez", + "status.cannot_quote": "Vu ne esas permisita citar ca afisho", "status.cannot_reblog": "Ca posto ne povas repetesar", + "status.contains_quote": "Kontenas cito", "status.continued_thread": "Durigita postaro", "status.copy": "Copy link to status", "status.delete": "Efacar", @@ -783,18 +917,46 @@ "status.mute_conversation": "Silencigez konverso", "status.open": "Detaligar ca mesajo", "status.pin": "Pinglagez che profilo", + "status.quote": "Citez", + "status.quote.cancel": "Anulez cito", + "status.quote_error.blocked_account_hint.title": "Ca afisho esas celita por ke vu blokusis @{name}.", + "status.quote_error.blocked_domain_hint.title": "Ca afisho esas celita por ke vu blokusis @{domain}.", + "status.quote_error.filtered": "Celita por un de vua filtrili", + "status.quote_error.limited_account_hint.action": "Montrez nure", + "status.quote_error.limited_account_hint.title": "Ca konto esas celita da jeranti di {domain}.", + "status.quote_error.muted_account_hint.title": "Ca afisho esas celita por ke vu silentigis @{name}.", + "status.quote_error.not_available": "Profilo esas nedisponebla", + "status.quote_error.pending_approval": "Afisho pendas", + "status.quote_error.pending_approval_popout.body": "Che Mastodon, vu povas regar ka ulu povas citar vu.", + "status.quote_error.revoked": "Afisho esas efacita da afishiganto", + "status.quote_followers_only": "Nur sequanti povas citar ca afisho", + "status.quote_manual_review": "Afishiganto permanue kontrolos", + "status.quote_noun": "Cito", + "status.quote_policy_change": "Chanjez persono quan povas citar", + "status.quote_post_author": "Citis afisho da @{name}", + "status.quote_private": "Privata afishi ne povas esar citita", + "status.quotes.empty": "Nulu citas ca afisho ankore.", + "status.quotes.local_other_disclaimer": "Citi quan esar desaprobita da afishiganto ne esar montrita.", + "status.quotes.remote_other_disclaimer": "Nur citi de {domain} certe esas montrita hike.", + "status.quotes_count": "{count, plural,one {{counter} cito} other {{counter} citi}}", "status.read_more": "Lektez plu", "status.reblog": "Repetez", + "status.reblog_or_quote": "Diskonocez o citez", + "status.reblog_private": "Ankorfoye kunhavigez kun vua sequanti", "status.reblogged_by": "{name} repetis", "status.reblogs.empty": "Nulu ja repetis ca posto. Kande ulu facas lo, lu montresos hike.", + "status.reblogs_count": "{count, plural,one {{counter} diskonoco} other {{counter} diskonoci}}", "status.redraft": "Efacez e riskisigez", "status.remove_bookmark": "Forigar lektosigno", "status.remove_favourite": "Forigar de priziti", + "status.remove_quote": "Efacez", "status.replied_in_thread": "Respondesis en postaro", "status.replied_to": "Respondis a {name}", "status.reply": "Respondar", "status.replyAll": "Respondar a filo", "status.report": "Denuncar @{name}", + "status.request_quote": "Demandez cito", + "status.revoke_quote": "Efacez mea afisho de afisho da @{name}", "status.sensitive_warning": "Trubliva kontenajo", "status.share": "Partigez", "status.show_less_all": "Montrez min por omno", @@ -810,7 +972,10 @@ "subscribed_languages.save": "Sparez chanji", "subscribed_languages.target": "Chanjez abonita lingui por {target}", "tabs_bar.home": "Hemo", + "tabs_bar.menu": "Menuo", "tabs_bar.notifications": "Savigi", + "tabs_bar.publish": "Nova afisho", + "tabs_bar.search": "Serchez", "terms_of_service.title": "Servtermini", "time_remaining.days": "{number, plural, one {# dio} other {# dii}} restas", "time_remaining.hours": "{number, plural, one {# horo} other {# hori}} restas", @@ -827,6 +992,7 @@ "upload_button.label": "Adjuntar imaji, video o sondosiero", "upload_error.limit": "Dosieradkarglimito ecesesis.", "upload_error.poll": "Dosieradkargo ne permisesas kun votinquesti.", + "upload_error.quote": "Dosieradkargo ne esas permisita kun citi.", "upload_form.drag_and_drop.instructions": "Por tenar audvidajaddonajo, presez spaco o eniro. Presez spaco o eniro denove por destenar la audvidajatachajo en olua nova loko, o presez eskapo por nuligar.", "upload_form.drag_and_drop.on_drag_cancel": "Tiro nuligesis.", "upload_form.drag_and_drop.on_drag_end": "Audvidajaddonajo {item} destenesis.", @@ -843,5 +1009,18 @@ "video.fullscreen": "Plena skreno", "video.hide": "Celez video", "video.pause": "Pauzez", - "video.play": "Pleez" + "video.play": "Pleez", + "visibility_modal.direct_quote_warning.text": "Se vu retenas la nuna preferaji, la enpozita cito esas chanjita ad ligilo.", + "visibility_modal.direct_quote_warning.title": "Citi ne povas esar enpozita en privata mencioni", + "visibility_modal.helper.direct_quoting": "Privata mencioni quan esas igita che Mastodon ne povas mencionita da altri.", + "visibility_modal.helper.privacy_editing": "Videbleso ne povas esar chanjita pos afisho esar publikigita.", + "visibility_modal.helper.privacy_private_self_quote": "Suciti di privata afishi ne povas esar publikigita.", + "visibility_modal.helper.private_quoting": "Nursequanta afishi quan igita che Mastodon ne povas esar citita da altri.", + "visibility_modal.helper.unlisted_quoting": "Kande personi citas vu, anke lia afisho esar celitos de tendenca tempolinei.", + "visibility_modal.instructions": "Kontrolez qua povas interagar kun ca afisho. Vu povas irar ad Preferaji > Afishigpredeterminitaji.", + "visibility_modal.privacy_label": "Videbleso", + "visibility_modal.quote_followers": "Nur sequanti", + "visibility_modal.quote_label": "Qua povas citar", + "visibility_modal.quote_nobody": "Nur me", + "visibility_modal.quote_public": "Irgu" } diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 6606bef9b31bd1..c035e899dca16e 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -13,12 +13,12 @@ "about.not_available": "Þessar upplýsingar hafa ekki verið gerðar aðgengilegar á þessum netþjóni.", "about.powered_by": "Dreifhýstur samskiptamiðill keyrður með {mastodon}", "about.rules": "Reglur netþjónsins", - "account.account_note_header": "Einkaminnispunktur", + "account.account_note_header": "Mínir minnispunktar", "account.activity": "Virkni", - "account.add_note": "Bæta við einkaminnispunkti", + "account.add_note": "Bæta við persónulegum minnispunkti", "account.add_or_remove_from_list": "Bæta við eða fjarlægja af listum", "account.badges.admin": "Stjóri", - "account.badges.blocked": "Lokað á", + "account.badges.blocked": "Útilokað", "account.badges.bot": "Yrki", "account.badges.domain_blocked": "Útilokað lén", "account.badges.group": "Hópur", @@ -28,13 +28,11 @@ "account.block_domain": "Útiloka lénið {domain}", "account.block_short": "Útiloka", "account.blocked": "Útilokaður", - "account.blocking": "Útilokun", "account.cancel_follow_request": "Taka fylgjendabeiðni til baka", "account.copy": "Afrita tengil í notandasnið", "account.direct": "Einkaspjall við @{name}", "account.disable_notifications": "Hætta að láta mig vita þegar @{name} sendir inn", - "account.domain_blocking": "Útiloka lén", - "account.edit_note": "Breyta einkaminnispunkti", + "account.edit_note": "Breyta persónulegum minnispunkti", "account.edit_profile": "Breyta notandasniði", "account.edit_profile_short": "Breyta", "account.enable_notifications": "Láta mig vita þegar @{name} sendir inn", @@ -45,9 +43,7 @@ "account.featured": "Með aukið vægi", "account.featured.accounts": "Notendasnið", "account.featured.collections": "Söfn", - "account.featured.hashtags": "Myllumerki", - "account.featured_tags.last_status_at": "Síðasta færsla þann {date}", - "account.featured_tags.last_status_never": "Engar færslur", + "account.featured.new_collection": "Nýtt safn", "account.field_overflow": "Birta allt efnið", "account.filters.all": "Öll virkni", "account.filters.boosts_toggle": "Sýna endurbirtingar", @@ -57,8 +53,8 @@ "account.filters.replies_toggle": "Birta svör", "account.follow": "Fylgjast með", "account.follow_back": "Fylgjast með til baka", - "account.follow_back_short": "Fylgjast með til baka", - "account.follow_request": "Beiðni um að fylgjast með", + "account.follow_back_short": "Fylgja líka", + "account.follow_request": "Beiðni um að fylgja", "account.follow_request_cancel": "Hætta við beiðni", "account.follow_request_cancel_short": "Hætta við", "account.follow_request_short": "Beiðni", @@ -73,8 +69,19 @@ "account.go_to_profile": "Fara í notandasnið", "account.hide_reblogs": "Fela endurbirtingar fyrir @{name}", "account.in_memoriam": "Minning.", + "account.join_modal.day": "daginn", + "account.join_modal.me": "Þú skráðir þig á {server} þann", + "account.join_modal.me_anniversary": "Til hamingju með daginn! Þú skráðir þig á {server} þann", + "account.join_modal.me_today": "Þetta er fyrsti dagurinn þinn á {server}!", + "account.join_modal.other": "{name} skráði sig á {server} þann", + "account.join_modal.other_today": "Þetta er fyrsti dagurinn hjá {name} á {server}!", + "account.join_modal.share.celebrate": "Deila fagnaðarfærslu", + "account.join_modal.share.intro": "Deila kynningarfærslu", + "account.join_modal.share.welcome": "Deila móttökufærslu", + "account.join_modal.years": "{number, plural, one {ár} other {ár}}", "account.joined_short": "Gerðist þátttakandi", "account.languages": "Breyta tungumálum í áskrift", + "account.last_active": "Síðasta virkni", "account.link_verified_on": "Eignarhald á þessum tengli var athugað þann {date}", "account.locked_info": "Staða gagnaleyndar á þessum aðgangi er stillt á læsingu. Eigandinn yfirfer handvirkt hverjir geti fylgst með honum.", "account.media": "Myndefni", @@ -91,7 +98,7 @@ "account.menu.note.description": "Einungis sýnilegt þér", "account.menu.open_original_page": "Skoða á {domain}", "account.menu.remove_follower": "Fjarlægja fylgjanda", - "account.menu.report": "Kæra aðgang", + "account.menu.report": "Tilkynna aðgang", "account.menu.share": "Deila…", "account.menu.show_reblogs": "Sýna endurbirtingar í tímalínu", "account.menu.unblock": "Aflétta útilokun aðgangs", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Þagga í tilkynningum", "account.mute_short": "Þagga niður", "account.muted": "Þaggaður", - "account.muting": "Þöggun", - "account.mutual": "Þið fylgist með hvor öðrum", + "account.mutual": "Þið fylgið hvor öðrum", + "account.name.copy": "Afrita kennislóð", "account.name.help.domain": "{domain} er netþjónninn sem hýsir upplýsingasnið um notandann og færslurnar hans.", "account.name.help.domain_self": "{domain} er netþjónninn þinn sem hýsir upplýsingasniðið þitt og færslurnar þínar.", - "account.name.help.footer": "Rétt eins og að þú getur sent tölvupóst á fólk í gegnum mismunandi þjónustur og forrit, þá getur þú átt í samskiptum við fólk á öðrum Mastodon-netþjónum – og reyndar við hverja þá sem eru á öðrum þeim samfélagsmiðlum sem nota sömu samskiptareglur og Mastodon notar (sem er ActivityPub-samskiptamátinn).", + "account.name.help.footer": "Rétt eins og þú getur sent tölvupóst til fólks sem notar aðrar póstþjónustur, þá geturðu átt í samskiptum við fólk á öðrum Mastodon-þjónum, auk annarra Mastodon-samhæfðra samfélagsmiðla.", "account.name.help.header": "Kennislóð (handle) líkist tölvupóstfangi", "account.name.help.username": "{username} er notandanafn þessa aðgangs á netþjóni viðkomandi. Einhver annar á öðrum netþjóni getur verið með sama notandanafnið.", "account.name.help.username_self": "{username} er notandanafnið þitt á þessum netþjóni. Einhver annar á öðrum netþjóni getur verið með sama notandanafnið.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Breyta", "account.note.title": "Einkaminnispunktur (einungis sýnilegur þér)", "account.open_original_page": "Opna upprunalega síðu", + "account.pending": "Í bið", "account.posts": "Færslur", - "account.posts_with_replies": "Færslur og svör", "account.remove_from_followers": "Fjarlægja {name} úr fylgjendum", "account.report": "Kæra @{name}", "account.requested_follow": "{name} hefur beðið um að fylgjast með þér", - "account.requests_to_follow_you": "Bað 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 {{counter} færsla} other {{counter} færslur}}", @@ -141,34 +147,42 @@ "account.unmute": "Hætta að þagga niður í @{name}", "account.unmute_notifications_short": "Hætta að þagga í tilkynningum", "account.unmute_short": "Hætta að þagga niður", + "account_edit.advanced_settings.bot_hint": "Merki til annarra að þessi aðgangur sé aðallega til að framkvæma sjálfvirkar aðgerðir og gæti verið án þess að hann sé vaktaður reglulega", + "account_edit.advanced_settings.bot_label": "Sjálfvirkur aðgangur", + "account_edit.advanced_settings.title": "Ítarlegar stillingar", + "account_edit.bio.add_label": "Bættu við æviágripi", + "account_edit.bio.edit_label": "Breyta æviágripi", "account_edit.bio.placeholder": "Settu inn stutta kynningu á þér svo aðrir eigi betur með að auðkenna þig.", "account_edit.bio.title": "Æviágrip", "account_edit.bio_modal.add_title": "Bættu við æviágripi", "account_edit.bio_modal.edit_title": "Breyta æviágripi", - "account_edit.button.add": "Bæta við {item}", - "account_edit.button.delete": "Eyða {item}", - "account_edit.button.edit": "Breyta {item}", "account_edit.column_button": "Lokið", "account_edit.column_title": "Breyta notandasniði", - "account_edit.custom_fields.name": "reitur", + "account_edit.custom_fields.add_label": "Bæta við reit", + "account_edit.custom_fields.edit_label": "Breyta reit", "account_edit.custom_fields.placeholder": "Settu inn fornöfn sem þú vilt nota, ytri tengla eða hvaðeina sem þú vilt deila með öðrum.", "account_edit.custom_fields.reorder_button": "Endurraða reitum", "account_edit.custom_fields.tip_content": "Þú getur á einfaldan hátt aukið trúverðugleika Mastodon-aðgangsins þíns með því að bæta við staðfestingartenglum sem vísa á vefsvæði sem þú átt.", "account_edit.custom_fields.tip_title": "Ábending: Bæta við staðfestingartenglum", "account_edit.custom_fields.title": "Sérsniðnir reitir", "account_edit.custom_fields.verified_hint": "Hvernig bæti ég við staðfestingartengli?", + "account_edit.display_name.add_label": "Bættu við birtingarnafni", + "account_edit.display_name.edit_label": "Breyta birtingarnafni", "account_edit.display_name.placeholder": "Birtingarnafn er það sem birtist sem nafnið þitt á notandasniðinu þínu og í tímalínum.", "account_edit.display_name.title": "Birtingarnafn", - "account_edit.featured_hashtags.item": "myllumerki", + "account_edit.featured_hashtags.edit_label": "Bæta við myllumerkjum", "account_edit.featured_hashtags.placeholder": "Hjálpaðu öðrum að sjá og komast í eftirlætis-umfjöllunarefnin þín.", "account_edit.featured_hashtags.title": "Myllumerki með aukið vægi", + "account_edit.field_actions.delete": "Eyða reit", + "account_edit.field_actions.edit": "Breyta reit", "account_edit.field_delete_modal.confirm": "Ertu viss um að þú viljir eyða þessum sérsniðna reit? Þessa aðgerð er ekki hægt að afturkalla.", "account_edit.field_delete_modal.delete_button": "Eyða", "account_edit.field_delete_modal.title": "Eyða sérsniðnum reit?", "account_edit.field_edit_modal.add_title": "Bæta við sérsniðnum reit", + "account_edit.field_edit_modal.discard_confirm": "Henda", + "account_edit.field_edit_modal.discard_message": "Þú ert með óvistaðar breytingar, ertu viss um að þú viljir henda þeim?", "account_edit.field_edit_modal.edit_title": "Breyta sérsniðnum reit", - "account_edit.field_edit_modal.limit_header": "Fór yfir takmörk á fjölda stafa", - "account_edit.field_edit_modal.limit_message": "Notendur á símtækjum gætu lent því að sjá ekki allan reitinn.", + "account_edit.field_edit_modal.length_warning": "Hámarksfjölda stafa er náð. Farsímanotendur ná mögulega ekki að sjá allan reitinn hjá þér.", "account_edit.field_edit_modal.link_emoji_warning": "Við mælum gegn því að nota sérsniðin tjáningartákn saman með vefslóðum. Sérsniðnir reitir sem innihalda hvort tveggja munu birtast sem einungis texti í stað þess að vera tenglar, til að koma í veg fyrir að notendur taki annað í misgripum fyrir hitt.", "account_edit.field_edit_modal.name_hint": "T.d. \"Eigið vefsvæði\"", "account_edit.field_edit_modal.name_label": "Skýring", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Breyta hjálpartexta", "account_edit.image_edit.remove_button": "Fjarlægja mynd", "account_edit.image_edit.replace_button": "Skipta um mynd", + "account_edit.item_list.delete": "Eyða {name}", + "account_edit.item_list.edit": "Breyta {name}", "account_edit.name_modal.add_title": "Bættu við birtingarnafni", "account_edit.name_modal.edit_title": "Breyta birtingarnafni", "account_edit.profile_tab.button_label": "Sérsníða", @@ -208,8 +224,10 @@ "account_edit.profile_tab.show_media.title": "Birta 'Myndefni' flipa", "account_edit.profile_tab.show_media_replies.description": "Þegar þetta er virkt, sýnir myndefnisflipinn bæði færslurnar þínar og svör þín við færslum annarra.", "account_edit.profile_tab.show_media_replies.title": "Hafa með svör á flipanum ‘Myndefni’", - "account_edit.profile_tab.subtitle": "Sérsníddu flipana á notandasniðinu þínu og hvað þeir birta.", - "account_edit.profile_tab.title": "Stillingar notandasniðsflipa", + "account_edit.profile_tab.show_relations.description": "Birtir öðrum notendum á notandasniðinu þínu þá aðganga sem þú fylgist með og sem fylgjast með þér. Fólk mun áfram geta séð hvort þú fylgist með þeim.", + "account_edit.profile_tab.show_relations.title": "Sýna 'Fylgjendur’ og 'Fylgist með'", + "account_edit.profile_tab.subtitle": "Sérsníddu hvernig notandasniðið þitt birtist.", + "account_edit.profile_tab.title": "Stillingar á birtingu notandasniðs", "account_edit.save": "Vista", "account_edit.upload_modal.back": "Til baka", "account_edit.upload_modal.done": "Lokið", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "Slepptu til að senda inn", "account_edit.upload_modal.step_upload.header": "Veldu mynd", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eða JPG-snið, allt að {limit}MB.{br}Mynd verður kvörðuð í {width}x{height}px.", - "account_edit.upload_modal.title_add": "Bæta við auðkennismynd", - "account_edit.upload_modal.title_replace": "Skipta um auðkennismynd", + "account_edit.upload_modal.title_add.avatar": "Bæta við auðkennismynd", + "account_edit.upload_modal.title_add.header": "Bæta við mynd í haus", + "account_edit.upload_modal.title_replace.avatar": "Skipta um auðkennismynd", + "account_edit.upload_modal.title_replace.header": "Skipta um mynd í haus", "account_edit.verified_modal.details": "Auktu trúverðugleika Mastodon-aðgangsins þíns með því að bæta við staðfestingartenglum sem vísa á vefsvæðin þín. Hérna sérðu hvernig það virkar:", "account_edit.verified_modal.invisible_link.details": "Bættu tenglinum í hausinn hjá þér. Mikilvægi hlutinn er rel=\"me\" sem kemur í veg fyrir blekkingu verðandi persónuauðkenni á vefsvæðum með notandaframleiddu efni. Þú getur jafnvel notað tengimerkið í haus síðunnar í staðinn fyrir {tag}, en HTML-kóðinn verður samt að vera aðgengilegur án þess að keyra þurfi JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Hvernig geri ég tengilinn ósýnilegan?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "Bættu vefsvæðinu þínu inn sem sérsniðinn reit", "account_edit.verified_modal.title": "Hvernig er hægt að bæta við staðfestingartengli", "account_edit_tags.add_tag": "Bæta við #{tagName}", - "account_edit_tags.column_title": "Breyta myllumerkjum með aukið vægi", + "account_edit_tags.column_title": "Breyta merkjum", "account_edit_tags.help_text": "Myllumerki með aukið vægi hjálpa lesendum að finna og eiga við notandasíðuna þína. Þau birtast sem síur í virkniflipa notandasíðunnar þinnar.", + "account_edit_tags.max_tags_reached": "Þú hefur náð hámarksfjölda myllumerkja með aukið vægi.", "account_edit_tags.search_placeholder": "Settu inn myllumerki…", "account_edit_tags.suggestions": "Tillögur:", "account_edit_tags.tag_status_count": "{count, plural, one {# færsla} other {# færslur}}", + "account_list.hidden_notice": "Þetta er aðeins sýnilegt þér. Til að sýna öðrum þennan lista, skaltu fara á {page} > {modal} > {field}.", + "account_list.total": "{total, plural, one {# aðgangur} other {# aðgangar}}", "account_note.placeholder": "Smelltu til að bæta við minnispunkti", "admin.dashboard.daily_retention": "Hlutfall virkra notenda eftir nýskráningu eftir dögum", "admin.dashboard.monthly_retention": "Hlutfall virkra notenda eftir nýskráningu eftir mánuðum", @@ -338,7 +361,7 @@ "closed_registrations_modal.find_another_server": "Finna annan netþjón", "closed_registrations_modal.preamble": "Mastodon er ekki miðstýrt, svo það skiptir ekki máli hvar þú býrð til aðgang; þú munt get fylgt eftir og haft samskipti við hvern sem er á þessum þjóni. Þú getur jafnvel hýst þinn eigin Mastodon þjón!", "closed_registrations_modal.title": "Að nýskrá sig á Mastodon", - "collection.share_modal.share_link_label": "Tengill til að deila", + "collection.share_modal.share_link_label": "Deila tengli", "collection.share_modal.share_via_post": "Birta á Mastodon", "collection.share_modal.share_via_system": "Deila með…", "collection.share_modal.title": "Deila safni", @@ -346,8 +369,11 @@ "collection.share_template_other": "Kíktu á þetta áhugaverða safn: {link}", "collection.share_template_own": "Kíktu á nýja safnið mitt: {link}", "collections.account_count": "{count, plural, one {# aðgangur} other {# aðgangar}}", - "collections.accounts.empty_description": "Bættu við allt að {count} aðgöngum sem þú fylgist með", + "collections.accounts.empty_description": "Bættu við allt að {count} aðgöngum", + "collections.accounts.empty_editor_title": "Enginn er enn í þessu safni", "collections.accounts.empty_title": "Þetta safn er tómt", + "collections.block_collection_owner": "Útiloka notandaaðgang", + "collections.by_account": "frá {account_handle}", "collections.collection_description": "Lýsing", "collections.collection_language": "Tungumál", "collections.collection_language_none": "Ekkert", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "Ertu viss um að þú viljir fjarlægja þennan aðgang úr þessu safni?", "collections.content_warning": "Viðvörun vegna efnis", "collections.continue": "Halda áfram", - "collections.create.accounts_subtitle": "Einungis er hægt að bæta við notendum sem hafa samþykkt að vera með í opinberri birtingu.", + "collections.copy_link": "Afrita tengil", + "collections.copy_link_confirmation": "Afritaði tengil á safn á klippispjald", "collections.create.accounts_title": "Hvern vilt þú gera áberandi í þessu safni?", "collections.create.basic_details_title": "Grunnupplýsingar", "collections.create.steps": "Skref {step}/{total}", - "collections.create_a_collection_hint": "Búðu til safn með eftirlætisnotendunum þínum til að deila eða mæla með við aðra.", "collections.create_collection": "Búa til safn", "collections.delete_collection": "Eyða safni", "collections.description_length_hint": "100 stafa takmörk", - "collections.detail.accept_inclusion": "Í lagi", - "collections.detail.accounts_heading": "Aðgangar", - "collections.detail.author_added_you": "{author} bætti þér í þetta safn", - "collections.detail.curated_by_author": "Safnað saman af {author}", - "collections.detail.curated_by_you": "Safnað saman af þér", + "collections.detail.author_added_you_on_date": "{author} bætti þér við þann {date}", "collections.detail.loading": "Hleð inn safni…", - "collections.detail.other_accounts_in_collection": "Aðrir í þessu safni:", "collections.detail.revoke_inclusion": "Fjarlægja mig", + "collections.detail.sensitive_content": "Viðkvæmt efni", "collections.detail.sensitive_note": "Þetta safn inniheldur aðganga og efni sem sumir notendur gætu verið viðkvæmir fyrir.", "collections.detail.share": "Deila þessu safni", + "collections.detail.you_are_in_this_collection": "Þú kemur fyrir í þessu safni", "collections.edit_details": "Breyta ítarupplýsingum", - "collections.error_loading_collections": "Villa kom upp þegar reynt var að hlaða inn söfnunum þínum.", - "collections.hints.accounts_counter": "{count} / {max} aðgangar", + "collections.error_loading_collections": "Villa kom upp þegar reynt var að hlaða inn þessum söfnum.", + "collections.hidden_accounts_description": "Þú hefur lokað á eða þaggað niður í {count, plural, one {þessum notanda} other {þessum notendum}}", + "collections.hidden_accounts_link": "{count, plural, one {# falinn aðgangur} other {# faldir aðgangar}}", + "collections.hints.accounts_counter": "{count}/{max} aðgöngum", "collections.last_updated_at": "Síðast uppfært: {date}", + "collections.list.collections_with_count": "{count, plural, one {# safn} other {# söfn}}", + "collections.list.created_by_author": "Útbúið af {name}", + "collections.list.created_by_you": "Útbúið af þér", + "collections.list.featuring_you": "Innifelur þig", "collections.manage_accounts": "Sýsla með notandaaðganga", "collections.mark_as_sensitive": "Merkja sem viðkvæmt", "collections.mark_as_sensitive_hint": "Felur lýsingu safnsins og notendur á bakvið aðvörun vegna efnis. Nafn safnsins verður áfram sýnilegt.", + "collections.maximum_collection_count_description": "Netþjónninn þinn leyfir gerð á allt að {count} söfnum.", + "collections.maximum_collection_count_reached": "Þú hefur útbúið leyfilegan hámarksfjölda safna", "collections.name_length_hint": "40 stafa takmörk", "collections.new_collection": "Nýtt safn", - "collections.no_collections_yet": "Engin söfn ennþá.", - "collections.old_last_post_note": "Birti síðast fyrir meira en viku síðan", - "collections.remove_account": "Fjarlægja þennan aðgang", - "collections.report_collection": "Kæra þetta safn", + "collections.pending_accounts.message": "Aðgangar geta litið út fyrir að vera í biðstöðu á meðan beðið er eftir svari frá þeim eða netþjóninum þar sem þeir eru hýstir. Einungis þú getur séð aðganga sem eru í bið.", + "collections.pending_accounts.title": "Af hverju er ég að sjá aðganga sem bíða?", + "collections.remove_account": "Fjarlægja", + "collections.report_collection": "Tilkynna þetta safn", "collections.revoke_collection_inclusion": "Fjarlægja mig úr þessu safni", "collections.revoke_inclusion.confirmation": "Þú varst fjarlægð/ur úr \"{collection}\"", "collections.revoke_inclusion.error": "Upp kom villa, reyndu aftur síðar.", - "collections.search_accounts_label": "Leita að aðgöngum til að bæta við…", + "collections.search_accounts_label": "Leitaðu að aðgangi til að bæta við", "collections.search_accounts_max_reached": "Þú hefur þegar bætt við leyfilegum hámarksfjölda aðganga", "collections.sensitive": "Viðkvæmt", + "collections.share_short": "Deila", + "collections.suggestions.can_not_add": "Er ekki hægt að bæta við", + "collections.suggestions.can_not_add_desc": "Þessir aðgangar gætu hafa skráð sig úr almennri birtingu eða gætu verið á netþjónum sem ekki styðja söfn.", + "collections.suggestions.must_follow": "Verður fyrst að fylgja", + "collections.suggestions.must_follow_desc": "Þessir aðgangar yfirfara allar beiðnir um að fylgja þeim. Fylgjendur geta bætt þeim í söfn.", "collections.topic_hint": "Bættu við myllumerki sem hjálpar öðrum að skilja aðalefni þessa safns.", "collections.topic_special_chars_hint": "Sérstafir verða fjarlægðir við vistun", + "collections.unlisted_collections_description": "Þessi birtast ekki öðrum á notandasíðunni þinni. Þeir sem eru með tengil á þau geta séð þau.", + "collections.unlisted_collections_with_count": "Óskráð söfn ({count})", "collections.view_collection": "Skoða safn", - "collections.view_other_collections_by_user": "Skoða önnur söfn frá þessum notanda", "collections.visibility_public": "Opinbert", "collections.visibility_public_hint": "Hægt að finna í leitarniðurstöðum og öðrum þeim þáttum þar sem meðmæli birtast.", "collections.visibility_title": "Sýnileiki", @@ -405,7 +442,6 @@ "column.about": "Um hugbúnaðinn", "column.blocks": "Útilokaðir notendur", "column.bookmarks": "Bókamerki", - "column.collections": "Söfnin mín", "column.community": "Staðvær tímalína", "column.create_list": "Búa til lista", "column.direct": "Einkaspjall", @@ -422,8 +458,10 @@ "column.lists": "Listar", "column.mutes": "Þaggaðir notendur", "column.notifications": "Tilkynningar", + "column.other_collections": "Söfn frá {name}", "column.pins": "Festar færslur", "column.public": "Sameiginleg tímalína", + "column.your_collections": "Söfnin þín", "column_back_button.label": "Til baka", "column_header.hide_settings": "Fela stillingar", "column_header.moveLeft_settings": "Færa dálk til vinstri", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "Henda drögum að færslunni þinni?", "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.follow_to_collection.confirm": "Fylgjast með og bæta í safn", - "confirmations.follow_to_collection.message": "Þú þarft að fylgjast með {name} til að geta bætt viðkomandi í safn.", - "confirmations.follow_to_collection.title": "Fylgjast með notandaaðgangnum?", - "confirmations.follow_to_list.confirm": "Fylgjast með og bæta á lista", - "confirmations.follow_to_list.message": "Þú þarft að fylgjast með {name} til að bæta viðkomandi á lista.", - "confirmations.follow_to_list.title": "Fylgjast með notanda?", + "confirmations.follow_to_list.confirm": "Fylgja og bæta á lista", + "confirmations.follow_to_list.message": "Þú þarft að fylgja {name} til að bæta viðkomandi á lista.", + "confirmations.follow_to_list.title": "Fylgja notanda?", + "confirmations.hide_featured_tab.confirm": "Fela flipa", + "confirmations.hide_featured_tab.intro": "Þú getur breytt þessu hvenær sem er í Breyta notandasniði > Stillingar notandasniðsflipa.", + "confirmations.hide_featured_tab.message": "Þetta mun fela flipann fyrir notendum á {serverName} og öðrum netþjónum sem nota nýjustu útgáfuna af Mastodon. Birting í öðrum viðmótum gæti verið á ýmsan máta.", + "confirmations.hide_featured_tab.title": "Fela \"Með aukið vægi\" flipann?", "confirmations.logout.confirm": "Skrá út", "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?", "confirmations.logout.title": "Skrá út?", @@ -512,7 +551,7 @@ "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.remove_from_followers.confirm": "Fjarlægja fylgjanda", - "confirmations.remove_from_followers.message": "{name} mun hætta að fylgjast með þér. Ertu viss um að þú viljir halda áfram?", + "confirmations.remove_from_followers.message": "{name} mun hætta að fylgja þér. Ertu viss um að þú viljir halda áfram?", "confirmations.remove_from_followers.title": "Fjarlægja fylgjanda?", "confirmations.revoke_collection_inclusion.confirm": "Fjarlægja mig", "confirmations.revoke_collection_inclusion.message": "Þessi aðgerð er varanleg og umsjónaraðili safnsins mun ekki geta bætt þér aftur við síðar.", @@ -523,12 +562,13 @@ "confirmations.unblock.confirm": "Aflétta útilokun", "confirmations.unblock.title": "Aflétta útilokun á {name}?", "confirmations.unfollow.confirm": "Hætta að fylgja", - "confirmations.unfollow.title": "Hætta að fylgjast með {name}?", + "confirmations.unfollow.title": "Hætta að fylgja {name}?", "confirmations.withdraw_request.confirm": "Taka beiðni til baka", - "confirmations.withdraw_request.title": "Taka aftur beiðni um að fylgjast með {name}?", + "confirmations.withdraw_request.title": "Taka aftur beiðni um að fylgja {name}?", "content_warning.hide": "Fela færslu", "content_warning.show": "Birta samt", "content_warning.show_more": "Sýna meira", + "content_warning.show_short": "Sýna", "conversation.delete": "Eyða samtali", "conversation.mark_as_read": "Merkja sem lesið", "conversation.open": "Skoða samtal", @@ -569,6 +609,14 @@ "domain_pill.your_server": "Stafrænt heimili þitt, þar sem allar færslur þínar eru hýstar. Kanntu ekki við þennan netþjón? Þú getur flutt þig á milli netþjóna hvenær sem er og tekið með þér alla fylgjendurna þína.", "domain_pill.your_username": "Sértækt auðkenni þitt á þessum netþjóni. Það er mögulegt að finna notendur með sama notandanafn á mismunandi netþjónum.", "dropdown.empty": "Veldu valkost", + "email_subscriptions.email": "Tölvupóstur", + "email_subscriptions.form.action": "Gerast áskrifandi", + "email_subscriptions.form.bottom": "Fáðu færslur í tölvupósti án þess að útbúa Mastodon-aðgang. Segðu upp áskrift hvenær sem er. Nánari upplýsingar má finna í Meðferð persónuupplýsinga.", + "email_subscriptions.form.title": "Skráðu þig í áskrift í tölvupósti að færslum frá {name}", + "email_subscriptions.submitted.lead": "Athugaðu hvort þér hafi borist tölvupóstur til að ljúka áskriftarferlinu.", + "email_subscriptions.submitted.title": "Eitt skref í viðbót", + "email_subscriptions.validation.email.blocked": "Útilokuð póstþjónusta", + "email_subscriptions.validation.email.invalid": "Ógilt tölvupóstfang", "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.", "embed.preview": "Svona mun þetta líta út:", "emoji_button.activity": "Athafnir", @@ -586,15 +634,21 @@ "emoji_button.search_results": "Leitarniðurstöður", "emoji_button.symbols": "Tákn", "emoji_button.travel": "Ferðalög og staðir", - "empty_column.account_featured.me": "Þú hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?", - "empty_column.account_featured.other": "{acct} hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?", - "empty_column.account_featured_other.unknown": "Þessi notandi hefur enn ekki sett neitt sem áberandi.", + "empty_column.account_featured.other": "{acct} hefur enn ekki gefið neinu aukið vægi.", + "empty_column.account_featured_self.no_collections_button": "Búa til safn", + "empty_column.account_featured_self.no_collections_hide_tab": "Fela frekar þennan flipa", + "empty_column.account_featured_self.pre_collections": "Kynntu þér hvað séu söfn", + "empty_column.account_featured_self.pre_collections_desc": "Söfn (sem koma fram í Mastodon 4.6) gera þér kleift að búa til þina eigin ritstýrðu lista yfir þá aðganga sem þú vilt mæla með við aðra.", + "empty_column.account_featured_self.showcase_accounts": "Kynntu eftirlætisaðgangana þína", + "empty_column.account_featured_self.showcase_accounts_desc": "Söfn eru ritstýrðir listar yfir aðganga til að hjálpa öðrum að uppgötva fleira á samfélagsnetinu.", + "empty_column.account_featured_unknown.other": "Þessi notandi hefur enn ekki sett neitt með meira vægi.", "empty_column.account_hides_collections": "Notandinn hefur valið að gera ekki tiltækar þessar upplýsingar", "empty_column.account_suspended": "Notandaaðgangur í frysti", "empty_column.account_timeline": "Engar færslur hér!", "empty_column.account_unavailable": "Notandasnið ekki tiltækt", "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.", "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.", + "empty_column.collections.featured_in": "Þér hefur enn ekki verið bætt við nein söfn.", "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!", "empty_column.direct": "Þú ert ekki ennþá með neitt einkaspjall við neinn. Þegar þú sendir eða tekur við slíku, mun það birtast hér.", "empty_column.disabled_feed": "Þetta streymi hefur verið gert óvirkt af stjórnendum netþjónis þíns.", @@ -674,7 +728,9 @@ "follow_suggestions.who_to_follow": "Hverjum á að fylgjast með", "followed_tags": "Vöktuð myllumerki", "followers.hide_other_followers": "Þessi notandi hefur valið að gera ekki sýnilega aðra fylgjendur sína", + "followers.title": "Fylgist með {name}", "following.hide_other_following": "Þessi notandi hefur valið að gera ekki sýnilega aðra þá sem þeir fylgjast með", + "following.title": "Fylgt af {name}", "footer.about": "Nánari upplýsingar", "footer.about_mastodon": "Um Mastodon", "footer.about_server": "Um {domain}", @@ -686,6 +742,7 @@ "footer.source_code": "Skoða frumkóða", "footer.status": "Staða", "footer.terms_of_service": "Þjónustuskilmálar", + "form_error.blank": "Reitur má ekki vera auður.", "form_field.optional": "(valfrjálst)", "generic.saved": "Vistað", "getting_started.heading": "Komast í gang", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "Fletta út valmynd myllumerkja sem fylgst er með", "navigation_panel.expand_lists": "Fletta út valmyndalista", "not_signed_in_indicator.not_signed_in": "Þú þarft að skrá þig inn til að nota þetta tilfang.", + "notification.added_to_collection": "{name} bætti þér í safn", "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}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# í viðbót hefur} other {# í viðbót hafa}} skráð sig", "notification.annual_report.message": "Ársuppgjörið {year} bíður á #Wrapstodon! Afhjúpaðu hvað bar hæst á árinu og minnistæðustu augnablikin á Mastodon!", "notification.annual_report.view": "Skoða ársuppgjör á #Wrapstodon", + "notification.collection_update": "{name} breytti safni sem þú ert í", "notification.favourite": "{name} setti færsluna þína í eftirlæti", "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# í viðbót hefur} other {# í viðbót hafa}} sett færsluna þína í eftirlæti", "notification.favourite_pm": "{name} setti í eftirlæti færslu í einkaspjalli þar sem þú minntist á viðkomandi", @@ -1070,7 +1129,7 @@ "report.category.title_account": "notandasnið", "report.category.title_status": "færsla", "report.close": "Lokið", - "report.collection_comment": "Hvers vegna viltu kæra þetta safn?", + "report.collection_comment": "Afhverju viltu tilkynna þetta safn?", "report.comment.title": "Er eitthvað annað sem þú heldur að við ættum að vita?", "report.forward": "Áframsenda til {target}", "report.forward_hint": "Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað?", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "virkir notendur", "server_banner.administered_by": "Stýrt af:", "server_banner.is_one_of_many": "{domain} er einn af fjölmörgum óháðum Mastodon-þjónum sem þú getur notað til að taka þátt í fediverse-samfélaginu.", + "server_banner.more_about_this_server": "Nánar um þennan netþjón", "server_banner.server_stats": "Tölfræði þjóns:", "sign_in_banner.create_account": "Búa til notandaaðgang", "sign_in_banner.follow_anyone": "Fylgstu með hverjum sem er í þessum samtvinnaða heimi og skoðaðu allt í tímaröð. Engin reiknirit, auglýsingar eða smellbeitur.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 10c44a7b497c53..4da29542e11d58 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -28,12 +28,10 @@ "account.block_domain": "Blocca dominio {domain}", "account.block_short": "Blocca", "account.blocked": "Bloccato", - "account.blocking": "Account bloccato", "account.cancel_follow_request": "Annulla la richiesta di seguire", "account.copy": "Copia link del profilo", "account.direct": "Menziona privatamente @{name}", "account.disable_notifications": "Smetti di avvisarmi quando @{name} pubblica un post", - "account.domain_blocking": "Account di un dominio bloccato", "account.edit_note": "Modifica la nota personale", "account.edit_profile": "Modifica profilo", "account.edit_profile_short": "Modifica", @@ -45,9 +43,7 @@ "account.featured": "In evidenza", "account.featured.accounts": "Profili", "account.featured.collections": "Collezioni", - "account.featured.hashtags": "Hashtag", - "account.featured_tags.last_status_at": "Ultimo post il {date}", - "account.featured_tags.last_status_never": "Nessun post", + "account.featured.new_collection": "Nuova collezione", "account.field_overflow": "Mostra il contenuto completo", "account.filters.all": "Tutte le attività", "account.filters.boosts_toggle": "Mostra le condivisioni", @@ -73,8 +69,19 @@ "account.go_to_profile": "Vai al profilo", "account.hide_reblogs": "Nascondi condivisioni da @{name}", "account.in_memoriam": "In memoria.", + "account.join_modal.day": "Giorno", + "account.join_modal.me": "Ti sei iscritto/a su {server} il", + "account.join_modal.me_anniversary": "Buon Fediversario! Ti sei iscritto/a su {server} il", + "account.join_modal.me_today": "È il tuo primo giorno su {server}!", + "account.join_modal.other": "{name} si è iscritto/a su {server} il", + "account.join_modal.other_today": "È il primo giorno di {name} su {server}!", + "account.join_modal.share.celebrate": "Condividi un post celebrativo", + "account.join_modal.share.intro": "Condividi un post introduttivo", + "account.join_modal.share.welcome": "Condividi un post di benvenuto", + "account.join_modal.years": "{number, plural, one {anno} other {anni}}", "account.joined_short": "Iscritto", "account.languages": "Modifica le lingue d'iscrizione", + "account.last_active": "Ultima attività", "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.locked_info": "Lo stato della privacy di questo profilo è impostato a bloccato. Il proprietario revisiona manualmente chi può seguirlo.", "account.media": "Media", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Silenzia notifiche", "account.mute_short": "Silenzia", "account.muted": "Mutato", - "account.muting": "Account silenziato", "account.mutual": "Vi seguite a vicenda", + "account.name.copy": "Copia il nome univoco", "account.name.help.domain": "{domain} è il server che ospita il profilo e i post dell'utente.", "account.name.help.domain_self": "{domain} è il tuo server che ospita il tuo profilo e i post.", - "account.name.help.footer": "Proprio come puoi inviare email a persone che usano diversi client di posta elettronica, così puoi interagire con le persone su altri server Mastodon — e con chiunque utilizzi altre app social basate sulle stesse regole che Mastodon usa (il protocollo ActivityPub).", + "account.name.help.footer": "Così come è possibile inviare email a persone che utilizzano diversi provider di posta elettronica, è altrettanto possibile interagire con persone su altri server Mastodon e con chiunque utilizzi altre app social compatibili con Mastodon.", "account.name.help.header": "Un nome univoco è come un indirizzo email", "account.name.help.username": "{username} è il nome utente di questo account sul suo server. Qualcuno su un altro server potrebbe avere lo stesso nome utente.", "account.name.help.username_self": "{username} è il tuo nome utente su questo server. Qualcuno su un altro server potrebbe avere lo stesso nome utente.", @@ -121,17 +128,16 @@ "account.note.edit_button": "Modifica", "account.note.title": "Nota personale (visibile solo per te)", "account.open_original_page": "Apri la pagina originale", + "account.pending": "In attesa", "account.posts": "Post", - "account.posts_with_replies": "Post e risposte", "account.remove_from_followers": "Rimuovi {name} dai follower", "account.report": "Segnala @{name}", "account.requested_follow": "{name} ha richiesto di seguirti", - "account.requests_to_follow_you": "Richieste di seguirti", "account.share": "Condividi il profilo di @{name}", "account.show_reblogs": "Mostra condivisioni da @{name}", "account.statuses_counter": "{count, plural, one {{counter} post} other {{counter} post}}", - "account.timeline.pinned": "Messo in evidenza", - "account.timeline.pinned.view_all": "Visualizza tutti i post messi in evidenza", + "account.timeline.pinned": "Fissato", + "account.timeline.pinned.view_all": "Visualizza tutti i post fissati", "account.unblock": "Sblocca @{name}", "account.unblock_domain": "Sblocca il dominio {domain}", "account.unblock_domain_short": "Sblocca", @@ -140,40 +146,48 @@ "account.unfollow": "Smetti di seguire", "account.unmute": "Riattiva @{name}", "account.unmute_notifications_short": "Riattiva notifiche", - "account.unmute_short": "Attiva audio", + "account.unmute_short": "Riattiva", + "account_edit.advanced_settings.bot_hint": "Segnala ad altri che l'account esegue principalmente azioni automatizzate e potrebbe non essere monitorato", + "account_edit.advanced_settings.bot_label": "Account automatizzato", + "account_edit.advanced_settings.title": "Impostazioni avanzate", + "account_edit.bio.add_label": "Aggiungi biografia", + "account_edit.bio.edit_label": "Modifica la biografia", "account_edit.bio.placeholder": "Aggiungi una breve introduzione per aiutare gli altri a identificarti.", "account_edit.bio.title": "Biografia", "account_edit.bio_modal.add_title": "Aggiungi biografia", "account_edit.bio_modal.edit_title": "Modifica la biografia", - "account_edit.button.add": "Aggiungi {item}", - "account_edit.button.delete": "Elimina {item}", - "account_edit.button.edit": "Modifica {item}", "account_edit.column_button": "Fatto", "account_edit.column_title": "Modifica il profilo", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Aggiungi un campo", + "account_edit.custom_fields.edit_label": "Modifica il campo", "account_edit.custom_fields.placeholder": "Aggiungi i tuoi pronomi, collegamenti esterni o qualsiasi altra cosa desideri condividere.", "account_edit.custom_fields.reorder_button": "Riordina i campi", "account_edit.custom_fields.tip_content": "Puoi facilmente aggiungere credibilità al tuo account Mastodon, verificando i collegamenti a qualsiasi sito web di tua proprietà.", "account_edit.custom_fields.tip_title": "Suggerimento: aggiunta di collegamenti verificati", "account_edit.custom_fields.title": "Campi personalizzati", "account_edit.custom_fields.verified_hint": "Come aggiungo un collegamento verificato?", + "account_edit.display_name.add_label": "Aggiungi il nome mostrato", + "account_edit.display_name.edit_label": "Modifica il nome mostrato", "account_edit.display_name.placeholder": "Il tuo nome mostrato è il modo in cui il tuo nome appare sul tuo profilo e nelle timeline.", "account_edit.display_name.title": "Nome mostrato", - "account_edit.featured_hashtags.item": "hashtag", + "account_edit.featured_hashtags.edit_label": "Aggiungi hashtag", "account_edit.featured_hashtags.placeholder": "Aiuta gli altri a identificare e ad accedere rapidamente ai tuoi argomenti preferiti.", "account_edit.featured_hashtags.title": "Hashtag in evidenza", + "account_edit.field_actions.delete": "Elimina il campo", + "account_edit.field_actions.edit": "Modifica il campo", "account_edit.field_delete_modal.confirm": "Si è sicuri di voler eliminare questo campo personalizzato? Questa azione non può essere annullata.", "account_edit.field_delete_modal.delete_button": "Elimina", "account_edit.field_delete_modal.title": "Eliminare il campo personalizzato?", "account_edit.field_edit_modal.add_title": "Aggiungi campo personalizzato", + "account_edit.field_edit_modal.discard_confirm": "Abbandona", + "account_edit.field_edit_modal.discard_message": "Sono presenti modifiche non salvate. Vuoi davvero eliminarle?", "account_edit.field_edit_modal.edit_title": "Modifica campo personalizzato", - "account_edit.field_edit_modal.limit_header": "Superato il limite di caratteri consigliato", - "account_edit.field_edit_modal.limit_message": "Gli utenti dai dispositivi mobili potrebbero non visualizzare completamente il tuo campo.", + "account_edit.field_edit_modal.length_warning": "Il limite di caratteri raccomandato è stato superato. Gli utenti da dispositivi mobili potrebbero non visualizzare il tuo campo per intero.", "account_edit.field_edit_modal.link_emoji_warning": "Sconsigliamo l'uso di emoji personalizzate in combinazione con gli URL. I campi personalizzati che contengono entrambi verranno visualizzati solo come testo anziché come link, in modo da evitare confusione nell'utente.", - "account_edit.field_edit_modal.name_hint": "Per esempio: “Sito web personale”", + "account_edit.field_edit_modal.name_hint": "Per esempio: \"Sito web personale\"", "account_edit.field_edit_modal.name_label": "Etichetta", "account_edit.field_edit_modal.url_warning": "Per aggiungere un collegamento, si prega di includere {protocol} all’inizio.", - "account_edit.field_edit_modal.value_hint": "Per esempio: “https://example.me”", + "account_edit.field_edit_modal.value_hint": "Per esempio: \"https://example.me\"", "account_edit.field_edit_modal.value_label": "Valore", "account_edit.field_reorder_modal.drag_cancel": "Il trascinamento è stato annullato. Il campo \"{item}\" è stato eliminato.", "account_edit.field_reorder_modal.drag_end": "Il campo \"{item}\" è stato eliminato.", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Modifica il testo alternativo", "account_edit.image_edit.remove_button": "Rimuovi l'immagine", "account_edit.image_edit.replace_button": "Sostituisci l'immagine", + "account_edit.item_list.delete": "Elimina {name}", + "account_edit.item_list.edit": "Modifica {name}", "account_edit.name_modal.add_title": "Aggiungi il nome mostrato", "account_edit.name_modal.edit_title": "Modifica il nome mostrato", "account_edit.profile_tab.button_label": "Personalizza", @@ -208,8 +224,10 @@ "account_edit.profile_tab.show_media.title": "Mostra la scheda \"Media\"", "account_edit.profile_tab.show_media_replies.description": "Quando abilitata, la scheda Media mostra sia i tuoi post che le risposte ai post di altre persone.", "account_edit.profile_tab.show_media_replies.title": "Includi le risposte nella scheda \"Media\"", - "account_edit.profile_tab.subtitle": "Personalizza le schede del tuo profilo e ciò che mostrano.", - "account_edit.profile_tab.title": "Impostazioni della scheda del profilo", + "account_edit.profile_tab.show_relations.description": "Mostra gli account che segui e i follower ad altri utenti nel tuo profilo. Le persone saranno ancora in grado di vedere se li stai seguendo.", + "account_edit.profile_tab.show_relations.title": "Mostra \"Followers\" e \"Seguiti\"", + "account_edit.profile_tab.subtitle": "Personalizza come viene visualizzato il tuo profilo.", + "account_edit.profile_tab.title": "Impostazioni di visualizzazione del profilo", "account_edit.save": "Salva", "account_edit.upload_modal.back": "Indietro", "account_edit.upload_modal.done": "Fatto", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "Trascina per caricare", "account_edit.upload_modal.step_upload.header": "Scegli un'immagine", "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF o JPG, fino a {limit}MB.{br}L'immagine verrà ridimensionata a {width}x{height}px.", - "account_edit.upload_modal.title_add": "Aggiungi la foto del profilo", - "account_edit.upload_modal.title_replace": "Sostituisci la foto del profilo", + "account_edit.upload_modal.title_add.avatar": "Aggiungi la foto del profilo", + "account_edit.upload_modal.title_add.header": "Aggiungi la foto di copertina", + "account_edit.upload_modal.title_replace.avatar": "Sostituisci la foto del profilo", + "account_edit.upload_modal.title_replace.header": "Sostituisci la foto di copertina", "account_edit.verified_modal.details": "Aggiungi credibilità al tuo profilo Mastodon verificando i collegamenti ai siti web personali. Ecco come funziona:", "account_edit.verified_modal.invisible_link.details": "Aggiungi il collegamento alla tua intestazione. La parte importante è rel=\"me\" che impedisce l'impersonificazione sui siti web con contenuti generati dagli utenti. Puoi anche utilizzare un link tag nell'intestazione della pagina al posto di {tag}, ma il codice HTML deve essere accessibile senza eseguire JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Come faccio a rendere il collegamento invisibile?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "Aggiungi il tuo sito web come campo personalizzato", "account_edit.verified_modal.title": "Come aggiungere un collegamento verificato", "account_edit_tags.add_tag": "Aggiungi #{tagName}", - "account_edit_tags.column_title": "Modifica gli hashtag in evidenza", + "account_edit_tags.column_title": "Modifica i tag", "account_edit_tags.help_text": "Gli hashtag in evidenza aiutano gli utenti a scoprire e interagire con il tuo profilo. Appaiono come filtri nella visualizzazione Attività della tua pagina del profilo.", + "account_edit_tags.max_tags_reached": "Hai raggiunto il numero massimo di hashtag in evidenza.", "account_edit_tags.search_placeholder": "Inserisci un hashtag…", "account_edit_tags.suggestions": "Suggerimenti:", "account_edit_tags.tag_status_count": "{count, plural, one {# post} other {# post}}", + "account_list.hidden_notice": "Questo è visibile solo a te. Per mostrare questa lista ad altri, vai su {page} > {modal} > {field}.", + "account_list.total": "{total, plural, one {# account} other {# account}}", "account_note.placeholder": "Clicca per aggiungere una nota", "admin.dashboard.daily_retention": "Tasso di ritenzione dell'utente per giorno, dopo la registrazione", "admin.dashboard.monthly_retention": "Tasso di ritenzione dell'utente per mese, dopo la registrazione", @@ -338,7 +361,7 @@ "closed_registrations_modal.find_another_server": "Trova un altro server", "closed_registrations_modal.preamble": "Mastodon è decentralizzato, quindi, non importa dove crei il tuo profilo, potrai seguire e interagire con chiunque su questo server. Anche se sei tu stesso a ospitarlo!", "closed_registrations_modal.title": "Registrazione su Mastodon", - "collection.share_modal.share_link_label": "Condividi il collegamento d'invito", + "collection.share_modal.share_link_label": "Condividi il link", "collection.share_modal.share_via_post": "Pubblica su Mastodon", "collection.share_modal.share_via_system": "Condividi con…", "collection.share_modal.title": "Condividi la collezione", @@ -346,8 +369,11 @@ "collection.share_template_other": "Dai un'occhiata a questa fantastica collezione: {link}", "collection.share_template_own": "Dai un'occhiata alla mia collezione: {link}", "collections.account_count": "{count, plural, one {# account} other {# account}}", - "collections.accounts.empty_description": "Aggiungi fino a {count} account che segui", + "collections.accounts.empty_description": "Aggiungi fino a {count} account", + "collections.accounts.empty_editor_title": "Nessuno è ancora in questa collezione", "collections.accounts.empty_title": "Questa collezione è vuota", + "collections.block_collection_owner": "Blocca l'account", + "collections.by_account": "di {account_handle}", "collections.collection_description": "Descrizione", "collections.collection_language": "Lingua", "collections.collection_language_none": "Nessuna", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "Si è sicuri di voler rimuovere questo account da questa collezione?", "collections.content_warning": "Avviso sul contenuto", "collections.continue": "Continua", - "collections.create.accounts_subtitle": "Possono essere aggiunti solo gli account che segui e che hanno aderito alla funzione di scoperta.", + "collections.copy_link": "Copia il сollegamento", + "collections.copy_link_confirmation": "Collegamento della collezione copiato negli appunti", "collections.create.accounts_title": "Chi includerai in questa collezione?", "collections.create.basic_details_title": "Dettagli di base", "collections.create.steps": "Step {step}/{total}", - "collections.create_a_collection_hint": "Crea una collezione per consigliare o condividere i tuoi account preferiti con altri.", "collections.create_collection": "Crea la collezione", "collections.delete_collection": "Cancella la collezione", "collections.description_length_hint": "Limite di 100 caratteri", - "collections.detail.accept_inclusion": "Va bene", - "collections.detail.accounts_heading": "Account", - "collections.detail.author_added_you": "{author} ti ha aggiunto a questa collezione", - "collections.detail.curated_by_author": "Curata da {author}", - "collections.detail.curated_by_you": "Curata da te", + "collections.detail.author_added_you_on_date": "{author} ti ha aggiunto/a in data: {date}", "collections.detail.loading": "Caricamento della collezione…", - "collections.detail.other_accounts_in_collection": "Altri in questa collezione:", "collections.detail.revoke_inclusion": "Rimuovimi", + "collections.detail.sensitive_content": "Contenuto sensibile", "collections.detail.sensitive_note": "Questa collezione contiene account e contenuto che potrebbero essere sensibili ad alcuni utenti.", "collections.detail.share": "Condividi questa collezione", + "collections.detail.you_are_in_this_collection": "Sei presente in questa collezione", "collections.edit_details": "Modifica i dettagli", - "collections.error_loading_collections": "Si è verificato un errore durante il tentativo di caricare le tue collezioni.", - "collections.hints.accounts_counter": "{count} / {max} account", + "collections.error_loading_collections": "Si è verificato un errore durante il tentativo di caricare queste collezioni.", + "collections.hidden_accounts_description": "Hai bloccato o silenziato {count, plural, one {questo utente} other {questi utenti}}", + "collections.hidden_accounts_link": "{count, plural, one {# account nascosto} other {# account nascosti}}", + "collections.hints.accounts_counter": "{count}/{max} account", "collections.last_updated_at": "Ultimo aggiornamento: {date}", + "collections.list.collections_with_count": "{count, plural, one {# collezione} other {# collezioni}}", + "collections.list.created_by_author": "Create da {name}", + "collections.list.created_by_you": "Create da te", + "collections.list.featuring_you": "Con te", "collections.manage_accounts": "Gestisci account", "collections.mark_as_sensitive": "Segna come sensibile", "collections.mark_as_sensitive_hint": "Nasconde la descrizione e gli account della collezione dietro un avviso di contenuto. Il nome della collezione rimarrà visibile.", + "collections.maximum_collection_count_description": "Il tuo server consente la creazione di un massimo di {count} collezioni.", + "collections.maximum_collection_count_reached": "Hai creato il numero massimo di collezioni", "collections.name_length_hint": "Limite di 40 caratteri", "collections.new_collection": "Nuova collezione", - "collections.no_collections_yet": "Nessuna collezione ancora.", - "collections.old_last_post_note": "Ultimo post più di una settimana fa", - "collections.remove_account": "Rimuovi questo account", + "collections.pending_accounts.message": "Gli account potrebbero apparire in attesa quando stiamo aspettando una risposta dall'utente o dal suo server. Solo tu puoi visualizzare gli account in attesa.", + "collections.pending_accounts.title": "Perché sto vedendo gli account in attesa?", + "collections.remove_account": "Rimuovi", "collections.report_collection": "Segnala questa collezione", "collections.revoke_collection_inclusion": "Rimuovimi da questa collezione", "collections.revoke_inclusion.confirmation": "Sei stato/a rimosso/a da \"{collection}\"", "collections.revoke_inclusion.error": "Si è verificato un errore, si prega di riprovare più tardi.", - "collections.search_accounts_label": "Cerca account da aggiungere…", + "collections.search_accounts_label": "Cerca un account da aggiungere", "collections.search_accounts_max_reached": "Hai aggiunto il numero massimo di account", "collections.sensitive": "Sensibile", + "collections.share_short": "Condividi", + "collections.suggestions.can_not_add": "Non può essere aggiunto", + "collections.suggestions.can_not_add_desc": "Questi account potrebbero aver scelto di non essere scoperti, oppure potrebbero trovarsi su un server che non supporta le collezioni.", + "collections.suggestions.must_follow": "Devi prima seguire", + "collections.suggestions.must_follow_desc": "Questi account esaminano tutte le richieste di essere seguiti. I follower possono aggiungerli alle collezioni.", "collections.topic_hint": "Aggiungi un hashtag che aiuti gli altri a comprendere l'argomento principale di questa collezione.", "collections.topic_special_chars_hint": "I caratteri speciali verranno rimossi durante il salvataggio", + "collections.unlisted_collections_description": "Queste collezioni non sono visibili agli altri sul tuo profilo. Chiunque abbia i link può trovarle.", + "collections.unlisted_collections_with_count": "Collezioni non elencate ({count})", "collections.view_collection": "Visualizza la collezione", - "collections.view_other_collections_by_user": "Visualizza altre collezioni da questo utente", "collections.visibility_public": "Pubblica", "collections.visibility_public_hint": "Scopribile nei risultati di ricerca e in altre aree in cui compaiono i suggerimenti.", "collections.visibility_title": "Visibilità", @@ -405,7 +442,6 @@ "column.about": "Info", "column.blocks": "Utenti bloccati", "column.bookmarks": "Segnalibri", - "column.collections": "Le mie collezioni", "column.community": "Cronologia locale", "column.create_list": "Crea lista", "column.direct": "Menzioni private", @@ -422,8 +458,10 @@ "column.lists": "Liste", "column.mutes": "Utenti silenziati", "column.notifications": "Notifiche", + "column.other_collections": "Collezioni di {name}", "column.pins": "Post fissati", "column.public": "Timeline federata", + "column.your_collections": "Le tue collezioni", "column_back_button.label": "Indietro", "column_header.hide_settings": "Nascondi impostazioni", "column_header.moveLeft_settings": "Sposta colonna a sinistra", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "Scartare la tua bozza del post?", "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.follow_to_collection.confirm": "Segui e aggiungi alla collezione", - "confirmations.follow_to_collection.message": "Devi seguire {name} per aggiungerlo/a ad una collezione.", - "confirmations.follow_to_collection.title": "Seguire l'account?", "confirmations.follow_to_list.confirm": "Segui e aggiungi alla lista", "confirmations.follow_to_list.message": "Devi seguire {name} per aggiungerli a una lista.", "confirmations.follow_to_list.title": "Seguire l'utente?", + "confirmations.hide_featured_tab.confirm": "Nascondi la scheda", + "confirmations.hide_featured_tab.intro": "Puoi modificare questa impostazione in qualsiasi momento in Modifica profilo > Impostazioni della scheda del profilo.", + "confirmations.hide_featured_tab.message": "Questa opzione nasconderà la scheda per gli utenti su {serverName} e su altri server che eseguono l'ultima versione di Mastodon. Per gli altri utenti, la visualizzazione potrebbe variare.", + "confirmations.hide_featured_tab.title": "Nascondere la scheda \"In evidenza\"?", "confirmations.logout.confirm": "Disconnettiti", "confirmations.logout.message": "Sei sicuro di volerti disconnettere?", "confirmations.logout.title": "Uscire?", @@ -509,7 +548,7 @@ "confirmations.quiet_post_quote_info.message": "Quando citi un post pubblico silenzioso, il tuo post verrà nascosto dalle timeline di tendenza.", "confirmations.quiet_post_quote_info.title": "Citazione di post pubblici silenziosi", "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.message": "Sei sicuro di voler eliminare questo post e riscriverlo? I post aggiunti ai preferiti e condivisi andranno persi e le risposte al post originale non saranno più collegate.", "confirmations.redraft.title": "Eliminare e riformulare il post?", "confirmations.remove_from_followers.confirm": "Rimuovi il follower", "confirmations.remove_from_followers.message": "{name} smetterà di seguirti. Si è sicuri di voler procedere?", @@ -529,6 +568,7 @@ "content_warning.hide": "Nascondi post", "content_warning.show": "Mostra comunque", "content_warning.show_more": "Mostra di più", + "content_warning.show_short": "Mostra", "conversation.delete": "Elimina conversazione", "conversation.mark_as_read": "Segna come letto", "conversation.open": "Visualizza conversazione", @@ -569,6 +609,14 @@ "domain_pill.your_server": "La tua casa digitale, dove vivono tutti i tuoi post. Non ti piace questa? Cambia server in qualsiasi momento e porta con te anche i tuoi follower.", "domain_pill.your_username": "Il tuo identificatore univoco su questo server. È possibile trovare utenti con lo stesso nome utente su server diversi.", "dropdown.empty": "Seleziona un'opzione", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Iscriviti", + "email_subscriptions.form.bottom": "Ricevi i post nella tua casella di posta elettronica senza creare un account Mastodon. Puoi disiscriverti in qualsiasi momento. Per maggiori informazioni, consulta l'Informativa sulla privacy.", + "email_subscriptions.form.title": "Iscriviti per ricevere aggiornamenti via email da {name}", + "email_subscriptions.submitted.lead": "Controlla la tua casella di posta elettronica per completare l'iscrizione agli aggiornamenti via email.", + "email_subscriptions.submitted.title": "Ancora un passaggio", + "email_subscriptions.validation.email.blocked": "Provider di posta elettronica bloccato", + "email_subscriptions.validation.email.invalid": "Indirizzo email non valido", "embed.instructions": "Incorpora questo post sul tuo sito web, copiando il seguente codice.", "embed.preview": "Ecco come apparirà:", "emoji_button.activity": "Attività", @@ -586,21 +634,27 @@ "emoji_button.search_results": "Risultati della ricerca", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Viaggi & Luoghi", - "empty_column.account_featured.me": "Non hai ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?", - "empty_column.account_featured.other": "{acct} non ha ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?", - "empty_column.account_featured_other.unknown": "Questo account non ha ancora messo nulla in evidenza.", + "empty_column.account_featured.other": "{acct} non ha ancora messo nulla in evidenza.", + "empty_column.account_featured_self.no_collections_button": "Crea una collezione", + "empty_column.account_featured_self.no_collections_hide_tab": "Nascondi questa scheda invece", + "empty_column.account_featured_self.pre_collections": "Resta sintonizzato/a per le collezioni", + "empty_column.account_featured_self.pre_collections_desc": "Le collezioni (in arrivo su Mastodon 4.6) ti permettono di creare i tuoi elenchi curati di account da consigliare ad altri.", + "empty_column.account_featured_self.showcase_accounts": "Mostra i tuoi account preferiti", + "empty_column.account_featured_self.showcase_accounts_desc": "Le collezioni sono elenchi curati di account che aiutano gli altri utenti a scoprire di più sul fediverso.", + "empty_column.account_featured_unknown.other": "Questo account non ha ancora presentato nulla.", "empty_column.account_hides_collections": "Questo utente ha scelto di non rendere disponibili queste informazioni", "empty_column.account_suspended": "Profilo sospeso", "empty_column.account_timeline": "Nessun post qui!", "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Non hai ancora bloccato alcun utente.", "empty_column.bookmarked_statuses": "Non hai ancora salvato nei segnalibri alcun post. Quando lo farai, apparirà qui.", + "empty_column.collections.featured_in": "Non sei ancora stato/a aggiunto/a ad alcuna collezione.", "empty_column.community": "La cronologia locale è vuota. Scrivi qualcosa pubblicamente per dare inizio alla festa!", "empty_column.direct": "Non hai ancora alcuna menzione privata. Quando ne invierai o riceverai una, apparirà qui.", "empty_column.disabled_feed": "Questo feed è stato disabilitato dagli amministratori del tuo server.", "empty_column.domain_blocks": "Ancora nessun dominio bloccato.", "empty_column.explore_statuses": "Nulla è in tendenza al momento. Ricontrolla più tardi!", - "empty_column.favourited_statuses": "Non hai ancora alcun post preferito. Quando ne salverai uno tra i preferiti, apparirà qui.", + "empty_column.favourited_statuses": "Non hai ancora aggiunto nessun post ai preferiti. Quando ne aggiungerai uno, verrà visualizzato qui.", "empty_column.favourites": "Nessuno ha ancora messo questo post tra i preferiti. Quando qualcuno lo farà, apparirà qui.", "empty_column.follow_requests": "Non hai ancora alcuna richiesta di seguirti. Quando ne riceverai una, apparirà qui.", "empty_column.followed_tags": "Non hai ancora seguito alcun hashtag. Quando lo farai, appariranno qui.", @@ -625,7 +679,7 @@ "explore.trending_statuses": "Post", "explore.trending_tags": "Hashtag", "featured_carousel.current": "Post {current, number} / {max, number}", - "featured_carousel.header": "{count, plural, one {Post appuntato} other {Post appuntati}}", + "featured_carousel.header": "{count, plural, one {Post fissato} other {Post fissati}}", "featured_carousel.slide": "Post {current, number} di {max, number}", "featured_tags.more_items": "+{count}", "featured_tags.suggestions": "Ultimamente hai pubblicato contenuti relativi a {items}. Vuoi aggiungerli come hashtag in evidenza?", @@ -669,12 +723,14 @@ "follow_suggestions.personalized_suggestion": "Suggerimento personalizzato", "follow_suggestions.popular_suggestion": "Suggerimento frequente", "follow_suggestions.popular_suggestion_longer": "Popolare su {domain}", - "follow_suggestions.similar_to_recently_followed_longer": "Simile ai profili che hai seguito di recente", + "follow_suggestions.similar_to_recently_followed_longer": "Simile ai profili seguiti di recente", "follow_suggestions.view_all": "Vedi tutto", "follow_suggestions.who_to_follow": "Chi seguire", "followed_tags": "Hashtag seguiti", "followers.hide_other_followers": "Questo/a utente ha scelto di non rendere visibili gli altri suoi follower", + "followers.title": "Stai seguendo {name}", "following.hide_other_following": "Questo/a utente ha scelto di non rendere visibile il resto dei profili che segue", + "following.title": "Seguito/a da {name}", "footer.about": "Info", "footer.about_mastodon": "Riguardo Mastodon", "footer.about_server": "Riguardo {domain}", @@ -686,6 +742,7 @@ "footer.source_code": "Visualizza il codice sorgente", "footer.status": "Stato", "footer.terms_of_service": "Termini di servizio", + "form_error.blank": "Il campo non può essere vuoto.", "form_field.optional": "(opzionale)", "generic.saved": "Salvato", "getting_started.heading": "Per iniziare", @@ -707,7 +764,7 @@ "hashtag.feature": "In evidenza sul profilo", "hashtag.follow": "Segui l'hashtag", "hashtag.mute": "Silenzia #{hashtag}", - "hashtag.unfeature": "Non mettere in evidenza sul profilo", + "hashtag.unfeature": "Non mostrare sul profilo", "hashtag.unfollow": "Smetti di seguire l'hashtag", "hashtags.and_other": "…e {count, plural, other {# in più}}", "hints.profiles.followers_may_be_missing": "I follower per questo profilo potrebbero essere mancanti.", @@ -749,7 +806,7 @@ "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}", "keyboard_shortcuts.back": "Torna indietro", "keyboard_shortcuts.blocked": "Apre l'elenco degli utenti bloccati", - "keyboard_shortcuts.boost": "Reblogga il post", + "keyboard_shortcuts.boost": "Condividi il post", "keyboard_shortcuts.column": "Focalizza alla colonna", "keyboard_shortcuts.compose": "Focalizza l'area di composizione testuale", "keyboard_shortcuts.description": "Descrizione", @@ -846,7 +903,7 @@ "navigation_bar.collections": "Collezioni", "navigation_bar.direct": "Menzioni private", "navigation_bar.domain_blocks": "Domini bloccati", - "navigation_bar.favourites": "Preferiti", + "navigation_bar.favourites": "Apprezzamenti", "navigation_bar.filters": "Parole silenziate", "navigation_bar.follow_requests": "Richieste di seguirti", "navigation_bar.followed_tags": "Hashtag seguiti", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "Espandi il menù degli hashtag seguiti", "navigation_panel.expand_lists": "Espandi il menu elenco", "not_signed_in_indicator.not_signed_in": "Devi accedere per consultare questa risorsa.", + "notification.added_to_collection": "{name} ti ha aggiunto/a a una collezione", "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}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "Si sono iscritti: {name} e {count, plural, one {# altro utente} other {altri # utenti}}", "notification.annual_report.message": "Il tuo #Wrapstodon {year} ti aspetta! Scopri i momenti salienti e memorabili del tuo anno su Mastodon!", "notification.annual_report.view": "Visualizza #Wrapstodon", + "notification.collection_update": "{name} ha modificato una collezione in cui sei presente", "notification.favourite": "{name} ha aggiunto il tuo post ai preferiti", "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# altro} other {altri #}} hanno aggiunto il tuo post ai preferiti", "notification.favourite_pm": "{name} ha aggiunto ai preferiti la tua menzione privata", @@ -949,7 +1008,7 @@ "notifications.column_settings.poll": "Risultati del sondaggio:", "notifications.column_settings.push": "Notifiche push", "notifications.column_settings.quote": "Citazioni:", - "notifications.column_settings.reblog": "Reblog:", + "notifications.column_settings.reblog": "Post condivisi:", "notifications.column_settings.show": "Mostra nella colonna", "notifications.column_settings.sound": "Riproduci suono", "notifications.column_settings.status": "Nuovi post:", @@ -957,7 +1016,7 @@ "notifications.column_settings.unread_notifications.highlight": "Evidenzia le notifiche non lette", "notifications.column_settings.update": "Modifiche:", "notifications.filter.all": "Tutti", - "notifications.filter.boosts": "Reblog", + "notifications.filter.boosts": "Condivisioni", "notifications.filter.favourites": "Preferiti", "notifications.filter.follows": "Seguaci", "notifications.filter.mentions": "Menzioni", @@ -996,7 +1055,7 @@ "onboarding.follows.title": "Segui le persone per iniziare", "onboarding.profile.discoverable": "Rendi il mio profilo rilevabile", "onboarding.profile.discoverable_hint": "Quando attivi la rilevabilità su Mastodon, i tuoi post potrebbero apparire nei risultati di ricerca e nelle tendenze e il tuo profilo potrebbe essere suggerito a persone con interessi simili ai tuoi.", - "onboarding.profile.display_name": "Nome da visualizzare", + "onboarding.profile.display_name": "Nome mostrato", "onboarding.profile.display_name_hint": "Il tuo nome completo o il tuo nome divertente…", "onboarding.profile.finish": "Fine", "onboarding.profile.note": "Biografia", @@ -1045,7 +1104,7 @@ "relative_time.days": "{number}g", "relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa", "relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa", - "relative_time.full.just_now": "adesso", + "relative_time.full.just_now": "proprio ora", "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} fa", "relative_time.full.seconds": "{number, plural, one {# secondo} other {# secondi}} fa", "relative_time.hours": "{number}h", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "utenti attivi", "server_banner.administered_by": "Amministrato da:", "server_banner.is_one_of_many": "{domain} è uno dei tanti server Mastodon indipendenti che puoi usare per partecipare al fediverso.", + "server_banner.more_about_this_server": "Maggiori informazioni su questo server", "server_banner.server_stats": "Statistiche del server:", "sign_in_banner.create_account": "Crea un profilo", "sign_in_banner.follow_anyone": "Segui chiunque nel fediverso e vedi tutto in ordine cronologico. Nessun algoritmo, annunci o clickbait in vista.", @@ -1177,7 +1237,7 @@ "status.edited": "Ultima modifica {date}", "status.edited_x_times": "Modificato {count, plural, one {{count} volta} other {{count} volte}}", "status.embed": "Ottieni codice incorporato", - "status.favourite": "Preferito", + "status.favourite": "Aggiungi ai preferiti", "status.favourites_count": "{count, plural, one {{counter} apprezzamento} other {{counter} apprezzamenti}}", "status.filter": "Filtra questo post", "status.history.created": "Creato da {name} il {date}", @@ -1215,10 +1275,10 @@ "status.quotes.remote_other_disclaimer": "Solo le citazioni provenienti da {domain} saranno mostrate qui. Le citazioni rifiutate dall'autore non saranno mostrate.", "status.quotes_count": "{count, plural, one {{counter} citazione} other {{counter} citazioni}}", "status.read_more": "Leggi di più", - "status.reblog": "Reblog", + "status.reblog": "Condividi", "status.reblog_or_quote": "Condividi o cita", "status.reblog_private": "Condividi di nuovo con i tuoi follower", - "status.reblogged_by": "Rebloggato da {name}", + "status.reblogged_by": "{name} ha condiviso", "status.reblogs.empty": "Ancora nessuno ha rebloggato questo post. Quando qualcuno lo farà, apparirà qui.", "status.reblogs_count": "{count, plural, one {{counter} condivisione} other {{counter} condivisioni}}", "status.redraft": "Elimina e riscrivi", @@ -1255,11 +1315,11 @@ "terms_of_service.effective_as_of": "In vigore a partire dal giorno {date}", "terms_of_service.title": "Termini di Servizio", "terms_of_service.upcoming_changes_on": "Prossime modifiche nel giorno {date}", - "time_remaining.days": "{number, plural, one {# giorno} other {# giorni}} left", - "time_remaining.hours": "{number, plural, one {# ora} other {# ore}} left", - "time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} left", + "time_remaining.days": "{number, plural, one {# giorno rimanente} other {# giorni rimanenti}}", + "time_remaining.hours": "{number, plural, one {# ora rimanente} other {# ore rimanenti}}", + "time_remaining.minutes": "{number, plural, one {# minuto rimanente} other {# minuti rimanenti}}", "time_remaining.moments": "Restano pochi istanti", - "time_remaining.seconds": "{number, plural, one {# secondo} other {# secondi}} left", + "time_remaining.seconds": "{number, plural, one {# secondo rimanente} other {# secondi rimanenti}}", "trends.counter_by_accounts": "{count, plural, one {{count} persona} other {{count} persone}} {days, plural, one {nell'ultimo giorno} other {negli ultimi {days} giorni}}", "trends.trending_now": "Ora in tendenza", "ui.beforeunload": "La tua bozza andrà persa, se abbandoni Mastodon.", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 78fa8de0f0e373..7bc8f63db17593 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -23,22 +23,28 @@ "about.public_visibility": "公開投稿を許可", "about.rules": "サーバーのルール", "account.account_note_header": "自分用メモ", + "account.activity": "アクティビティ", "account.add_or_remove_from_antenna": "アンテナから追加または外す", "account.add_or_remove_from_exclude_antenna": "アンテナ除外条件から追加または外す", "account.add_or_remove_from_circle": "サークルから追加または外す", + "account.add_note": "個人的なメモを追加する", "account.add_or_remove_from_list": "リストから追加または外す", + "account.badges.admin": "管理者", + "account.badges.blocked": "ブロック中", "account.badges.bot": "Bot", + "account.badges.domain_blocked": "ブロック中のドメイン", "account.badges.group": "Group", + "account.badges.muted": "ミュート中", + "account.badges.muted_until": "{until} までミュート中", "account.block": "@{name}さんをブロック", "account.block_domain": "{domain}全体をブロック", "account.block_short": "ブロック", "account.blocked": "ブロック済み", - "account.blocking": "ブロック中", "account.cancel_follow_request": "フォローリクエストの取り消し", "account.copy": "プロフィールへのリンクをコピー", "account.direct": "@{name}さんに非公開でメンション", "account.disable_notifications": "@{name}さんの投稿時の通知を停止", - "account.domain_blocking": "ブロックしているドメイン", + "account.edit_note": "個人的なメモを編集する", "account.edit_profile": "プロフィール編集", "account.edit_profile_short": "編集", "account.enable_notifications": "@{name}さんの投稿時に通知", @@ -48,9 +54,14 @@ "account.familiar_followers_two": "{name1} さんと {name2} さんもフォローしています", "account.featured": "注目", "account.featured.accounts": "プロフィール", - "account.featured.hashtags": "ハッシュタグ", - "account.featured_tags.last_status_at": "最終投稿 {date}", - "account.featured_tags.last_status_never": "投稿がありません", + "account.featured.collections": "コレクション", + "account.featured.new_collection": "新規のコレクション", + "account.filters.all": "全てのアクティビティ", + "account.filters.boosts_toggle": "ブーストを表示", + "account.filters.posts_boosts": "投稿とブースト", + "account.filters.posts_only": "投稿", + "account.filters.posts_replies": "投稿と返信", + "account.filters.replies_toggle": "返信を表示", "account.follow": "フォロー", "account.follow_back": "フォローバック", "account.follow_back_short": "フォローバック", @@ -76,22 +87,36 @@ "account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。", "account.media": "メディア", "account.mention": "@{name}さんにメンション", + "account.menu.add_to_list": "リストに追加する…", + "account.menu.block": "アカウントをブロックする", + "account.menu.block_domain": "{domain} をブロックする", + "account.menu.copy": "リンクをコピーする", + "account.menu.direct": "非公開でメンションする", + "account.menu.hide_reblogs": "タイムラインでブーストを隠す", + "account.menu.mention": "メンションする", + "account.menu.mute": "アカウントをミュートする", + "account.menu.note.description": "あなただけが見られます", + "account.menu.open_original_page": "{domain} で表示する", + "account.menu.remove_follower": "フォロワーを削除する", + "account.menu.report": "アカウントを報告する", + "account.menu.unblock": "アカウントのブロックを解除する", + "account.menu.unblock_domain": "{domain} のブロックを解除する", + "account.menu.unmute": "アカウントのミュートを解除する", "account.moved_to": "{name}さんはこちらのアカウントに引っ越しました:", "account.mute": "@{name}さんをミュート", "account.mute_notifications_short": "通知をオフにする", "account.mute_short": "ミュート", "account.muted": "ミュート済み", - "account.muting": "ミュート中", "account.mutual": "相互フォロー中", "account.name.help.domain": "{domain} is the server that hosts the user’s profile and posts. このサーバーはunknownという名前のソフトウェアを使用していますが、他のサーバーと同様に投稿を表示したり、会話に参加できます。", "account.no_bio": "説明が提供されていません。", + "account.node_modal.callout": "個人的なメモはあなただけが見られます。", + "account.note.title": "個人的なメモ (あなただけが見られます)", "account.open_original_page": "元のページを開く", "account.posts": "投稿", - "account.posts_with_replies": "投稿と返信", "account.remove_from_followers": "{name}さんをフォロワーから削除", "account.report": "@{name}さんを通報", "account.requested_follow": "{name}さんがあなたにフォローリクエストしました", - "account.requests_to_follow_you": "フォローリクエスト", "account.share": "@{name}さんのプロフィールを共有する", "account.show_reblogs": "@{name}さんからのブーストを表示", "account.statuses_counter": "{count, plural, other {{counter} 投稿}}", @@ -132,6 +157,7 @@ "annual_report.summary.followers.new_followers": "{count, plural, other {新しいフォロワー}}", "annual_report.summary.highlighted_post.boost_count": "この投稿は {count, plural, other {# 回}}ブーストされました。", "annual_report.summary.highlighted_post.favourite_count": "この投稿は {count, plural, other {# 回}}お気に入りされました。", + "annual_report.summary.highlighted_post.reply_count": "この投稿には {count, plural, other {# 回}}返信がありました。", "annual_report.summary.highlighted_post.title": "最も人気のある投稿", "annual_report.summary.most_used_app.most_used_app": "最も使用されているアプリ", "annual_report.summary.most_used_hashtag.most_used_hashtag": "最も使用されたハッシュタグ", @@ -250,6 +276,42 @@ "closed_registrations_modal.find_another_server": "別のサーバーを探す", "closed_registrations_modal.preamble": "Mastodonは分散型なのでどのサーバーでアカウントを作成してもこのサーバーのユーザーを誰でもフォローして交流することができます。また自分でホスティングすることもできます!", "closed_registrations_modal.title": "Mastodonでアカウントを作成", + "collection.share_modal.share_via_post": "Mastodonに投稿", + "collection.share_modal.share_via_system": "共有…", + "collection.share_modal.title": "コレクションを共有", + "collection.share_modal.title_new": "新しいコレクションを共有しよう!", + "collection.share_template_other": "この素敵なコレクションを見てみてください: {link}", + "collection.share_template_own": "私の新しいコレクションを見てみてください: {link}", + "collections.accounts.empty_title": "このコレクションは空です", + "collections.by_account": "{account_handle} による", + "collections.collection_description": "詳細", + "collections.collection_language": "言語", + "collections.collection_name": "名前", + "collections.collection_topic": "トピック", + "collections.confirm_account_removal": "このコレクションからこのアカウントを削除してもよろしいですか?", + "collections.content_warning": "閲覧注意", + "collections.continue": "次に進む", + "collections.create.accounts_title": "このコレクションで誰に注目しますか?", + "collections.create.basic_details_title": "基本情報", + "collections.create.steps": "ステップ {step}/{total}", + "collections.create_collection": "コレクションを作成", + "collections.delete_collection": "コレクションを削除", + "collections.description_length_hint": "100 文字まで", + "collections.detail.author_added_you_on_date": "{author} があなたを {date} に追加しました", + "collections.detail.loading": "コレクションを読み込み中…", + "collections.detail.share": "コレクションを共有", + "collections.detail.you_are_in_this_collection": "あなたはこのコレクションで紹介されています", + "collections.mark_as_sensitive": "閲覧注意としてマーク", + "collections.mark_as_sensitive_hint": "コレクションの説明とアカウントを閲覧注意で隠します。コレクション名は表示されます。", + "collections.name_length_hint": "40 文字まで", + "collections.new_collection": "新規のコレクション", + "collections.report_collection": "このコレクションを通報する", + "collections.topic_hint": "ハッシュタグを追加して、このコレクションの主なトピックを知ってもらいましょう。", + "collections.visibility_public": "公開", + "collections.visibility_public_hint": "検索結果やその他おすすめに表示されて、見つけてもらうことができます。", + "collections.visibility_title": "公開範囲", + "collections.visibility_unlisted": "ひかえめな公開", + "collections.visibility_unlisted_hint": "リンクを知っている人が見られます。検索結果やその他おすすめには表示さません。", "column.about": "概要", "column.antennas": "アンテナ", "column.blocks": "ブロックしたユーザー", @@ -281,6 +343,7 @@ "column.local": "ローカル", "column.mutes": "ミュートしたユーザー", "column.notifications": "通知", + "column.other_collections": "{name} によるコレクション", "column.pins": "固定された投稿", "column.public": "連合タイムライン", "column.reaction_deck": "絵文字デッキ", @@ -292,6 +355,8 @@ "column_header.show_settings": "設定を表示", "column_header.unpin": "ピン留めを外す", "column_search.cancel": "キャンセル", + "combobox.loading": "読み込み中", + "combobox.no_results_found": "検索結果はありません", "community.column_settings.local_only": "ローカルのみ表示", "community.column_settings.media_only": "メディアのみ表示", "community.column_settings.remote_only": "リモートのみ表示", @@ -436,9 +501,6 @@ "emoji_button.search_results": "検索結果", "emoji_button.symbols": "記号", "emoji_button.travel": "旅行と場所", - "empty_column.account_featured.me": "まだ何もフィーチャーしていません。最もよく使うハッシュタグや、更には友達のアカウントまでプロフィール上でフィーチャーできると知っていましたか?", - "empty_column.account_featured.other": "{acct}ではまだ何もフィーチャーされていません。最もよく使うハッシュタグや、更には友達のアカウントまでプロフィール上でフィーチャーできると知っていましたか?", - "empty_column.account_featured_other.unknown": "このアカウントにはまだ何も投稿されていません。", "empty_column.account_hides_collections": "このユーザーはこの情報を開示しないことにしています。", "empty_column.account_suspended": "アカウントは停止されています", "empty_column.account_timeline": "投稿がありません!", @@ -530,6 +592,7 @@ "footer.source_code": "ソースコードを表示", "footer.status": "ステータス", "footer.terms_of_service": "サービス利用規約", + "form_field.optional": "(省略可能)", "generic.saved": "保存しました", "getting_started.heading": "スタート", "hashtag.admin_moderation": "#{name}のモデレーション画面を開く", @@ -690,6 +753,7 @@ "navigation_bar.blocks": "ブロックしたユーザー", "navigation_bar.bookmarks": "ブックマーク", "navigation_bar.circles": "サークル", + "navigation_bar.collections": "コレクション", "navigation_bar.community_timeline": "ローカルタイムライン", "navigation_bar.deep_timeline": "ディープタイムライン", "navigation_bar.direct": "非公開の返信", @@ -702,6 +766,8 @@ "navigation_bar.follows_and_followers": "フォロー・フォロワー", "navigation_bar.import_export": "インポートとエクスポート", "navigation_bar.lists": "リスト", + "navigation_bar.live_feed_local": "リアルタイムフィード (このサーバー)", + "navigation_bar.live_feed_public": "リアルタイムフィード (すべて)", "navigation_bar.logout": "ログアウト", "navigation_bar.moderation": "モデレーション", "navigation_bar.more": "もっと見る", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 12acb715e2a1b1..c6a56055b63d6e 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -10,7 +10,6 @@ "account.cancel_follow_request": "Withdraw follow request", "account.edit_profile": "პროფილის ცვლილება", "account.endorse": "გამორჩევა პროფილზე", - "account.featured_tags.last_status_never": "პოსტების გარეშე", "account.follow": "გაყოლა", "account.followers": "მიმდევრები", "account.hide_reblogs": "დაიმალოს ბუსტები @{name}-სგან", @@ -19,7 +18,6 @@ "account.mute": "გააჩუმე @{name}", "account.muted": "დადუმებულია", "account.posts": "პოსტები", - "account.posts_with_replies": "ტუტები და პასუხები", "account.report": "დაარეპორტე @{name}", "account.share": "გააზიარე @{name}-ის პროფილი", "account.show_reblogs": "აჩვენე ბუსტები @{name}-სგან", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index a3f09b73201814..d777d269824e1c 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -19,6 +19,7 @@ "account.badges.blocked": "Yettusewḥel", "account.badges.bot": "Aṛubut", "account.badges.group": "Agraw", + "account.badges.muted": "Yettwasgugem", "account.block": "Seḥbes @{name}", "account.block_domain": "Ffer kra i d-yekkan seg {domain}", "account.block_short": "Sewḥel", @@ -36,15 +37,18 @@ "account.familiar_followers_one": "Yeṭṭafar-it {name1}", "account.familiar_followers_two": "Yeṭṭafar-it {name1} akked {name2}", "account.featured.accounts": "Imeɣna", - "account.featured.hashtags": "Ihacṭagen", - "account.featured_tags.last_status_at": "Tasuffeɣt taneggarut ass n {date}", - "account.featured_tags.last_status_never": "Ulac tisuffaɣ", + "account.featured.collections": "Tilkensa", + "account.featured.new_collection": "Talkensit tamaynut", + "account.filters.all": "Akk irmad", + "account.filters.boosts_toggle": "Sken-d izuzar", + "account.filters.posts_boosts": "Tisuffaɣ akked tizuzar", "account.filters.posts_only": "Tisuffaɣ", "account.filters.posts_replies": "Tisuffaɣ d tririyin", "account.filters.replies_toggle": "Sken-d tiririyin", "account.follow": "Ḍfer", "account.follow_back": "Ḍfer-it ula d kečč·mm", "account.follow_back_short": "Ḍfer-it ula d kečč·mm", + "account.follow_request": "Suter taḍfart", "account.follow_request_cancel": "Semmet asuter", "account.follow_request_cancel_short": "Semmet", "account.follow_request_short": "Asuter", @@ -60,6 +64,7 @@ "account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}", "account.joined_short": "Izeddi da seg ass n", "account.languages": "Beddel tutlayin yettwajerden", + "account.last_active": "Armud aneggaru", "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", @@ -67,6 +72,7 @@ "account.menu.add_to_list": "Rnu ɣer tebdart…", "account.menu.block": "Sewḥel amiḍan", "account.menu.block_domain": "Sewḥel {domain}", + "account.menu.copied": "Aseɣwen n umiḍan yettwanɣel ɣer tecwafit", "account.menu.copy": "Nɣel aseɣwen", "account.menu.mention": "Bder-d", "account.menu.mute": "Sgugem amiḍan", @@ -81,6 +87,8 @@ "account.mute_short": "Sgugem", "account.muted": "Yettwasgugem", "account.mutual": "Temmeḍfaṛem", + "account.name.copy": "Nɣel asulay", + "account.name.help.header": "Asulay am tansa imayl", "account.name_info": "D acu i d lmeεna-s?", "account.no_bio": "Ulac aglam i d-yettunefken.", "account.node_modal.edit_title": "Ẓreg tazmilt tudmawant", @@ -92,13 +100,14 @@ "account.note.title": "Tazmilt tudmawant (tettbin-d i kečč·mm kan)", "account.open_original_page": "Ldi asebter anasli", "account.posts": "Tisuffaɣ", - "account.posts_with_replies": "Tisuffaɣ d tririyin", "account.remove_from_followers": "Kkes {name} seg ineḍfaren", "account.report": "Cetki ɣef @{name}", "account.requested_follow": "{name} yessuter ad k·m-yeḍfer", "account.share": "Bḍu amaɣnu n @{name}", - "account.show_reblogs": "Ssken-d inebḍa n @{name}", + "account.show_reblogs": "Sken-d izuzar n @{name}", "account.statuses_counter": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}", + "account.timeline.pinned": "Yettwasenṭeḍ", + "account.timeline.pinned.view_all": "Wali akk tisuffaɣ tunṭiḍin", "account.unblock": "Serreḥ i @{name}", "account.unblock_domain": "Ssken-d {domain}", "account.unblock_domain_short": "Serreḥ", @@ -108,6 +117,67 @@ "account.unmute": "Kkes asgugem ɣef @{name}", "account.unmute_notifications_short": "Serreḥ i yilɣa", "account.unmute_short": "Kkes asgugem", + "account_edit.advanced_settings.bot_label": "Amiḍan awurman", + "account_edit.advanced_settings.title": "Iɣewwaren leqqayen", + "account_edit.bio.add_label": "Rnu tameddurt", + "account_edit.bio.edit_label": "Ẓreg tameddurt", + "account_edit.bio.title": "Tameddurt", + "account_edit.bio_modal.add_title": "Rnu tameddurt", + "account_edit.bio_modal.edit_title": "Ẓreg tameddurt", + "account_edit.column_button": "Immed", + "account_edit.column_title": "Ẓreg amaɣnu", + "account_edit.custom_fields.add_label": "Rnu urti", + "account_edit.custom_fields.edit_label": "Ẓreg urti", + "account_edit.custom_fields.reorder_button": "Amizzwer n urtiyen", + "account_edit.custom_fields.title": "Urtiyen udmawanen", + "account_edit.custom_fields.verified_hint": "Amek ara rnuɣ aseɣwen yettuselknen?", + "account_edit.display_name.add_label": "Rnu isem ara d-yettwaskanen", + "account_edit.display_name.edit_label": "Ẓreg isem ara d-yettwaskanen", + "account_edit.display_name.title": "Isem ara d-yettwaskanen", + "account_edit.featured_hashtags.edit_label": "Rnu ihacṭagen", + "account_edit.field_actions.delete": "Kkes urti", + "account_edit.field_actions.edit": "Ẓreg urti", + "account_edit.field_delete_modal.delete_button": "Kkes", + "account_edit.field_delete_modal.title": "Ad tekkseḍ urti udmawan?", + "account_edit.field_edit_modal.add_title": "Rnu urti udmawan", + "account_edit.field_edit_modal.discard_confirm": "Eǧǧ-it", + "account_edit.field_edit_modal.edit_title": "Ẓreg urti udmawan", + "account_edit.field_edit_modal.name_hint": "Amedya “Asmel-iw Web”", + "account_edit.field_edit_modal.name_label": "Tabzimt", + "account_edit.field_edit_modal.value_hint": "Amedya “https://example.me”", + "account_edit.field_edit_modal.value_label": "Azal", + "account_edit.image_alt_modal.add_title": "Rnu aḍris amlellay", + "account_edit.image_alt_modal.edit_title": "Ẓreg aḍris amlellay", + "account_edit.image_alt_modal.text_label": "Aḍris amlellay", + "account_edit.image_delete_modal.delete_button": "Kkes", + "account_edit.image_delete_modal.title": "Ad tekkseḍ tugna?", + "account_edit.image_edit.add_button": "Rnu tugna", + "account_edit.image_edit.alt_add_button": "Rnu aḍris amlellay", + "account_edit.image_edit.alt_edit_button": "Ẓreg aḍris amlellay", + "account_edit.image_edit.remove_button": "Kkes tugna", + "account_edit.image_edit.replace_button": "Semselsi tugna", + "account_edit.item_list.delete": "Kkes {name}", + "account_edit.item_list.edit": "Ẓreg {name}", + "account_edit.name_modal.add_title": "Rnu isem ara d-yettwaskanen", + "account_edit.name_modal.edit_title": "Ẓreg isem ara d-yettwaskanen", + "account_edit.profile_tab.button_label": "Sagen", + "account_edit.save": "Sekles", + "account_edit.upload_modal.back": "Uɣal", + "account_edit.upload_modal.done": "Dayen", + "account_edit.upload_modal.next": "Uḍfiṛ", + "account_edit.upload_modal.step_crop.zoom": "Simɣeṛ", + "account_edit.upload_modal.step_upload.button": "Snirem ifuyla", + "account_edit.upload_modal.step_upload.dragging": "Ẓuɣer-it-id akken ad tt-saliḍt", + "account_edit.upload_modal.step_upload.header": "Fren tugna", + "account_edit.upload_modal.title_add.avatar": "Rnu tawlaft n umaɣnu", + "account_edit.upload_modal.title_add.header": "Rnu tawlaft n tduli", + "account_edit.upload_modal.title_replace.avatar": "Semselsi tawlaft n umaɣnu", + "account_edit.upload_modal.title_replace.header": "Semselsi tawlaft n tduli", + "account_edit_tags.add_tag": "Rnu #{tagName}", + "account_edit_tags.column_title": "Asiẓreg n yihacṭagen", + "account_edit_tags.search_placeholder": "Sekcem-d ahacṭag…", + "account_edit_tags.suggestions": "Isumren:", + "account_edit_tags.tag_status_count": "{count, plural, one {# n yizen} other {# n yiznan}}", "account_note.placeholder": "Ulac iwenniten", "admin.dashboard.retention.cohort_size": "Iseqdacen imaynuten", "alert.rate_limited.message": "Ma ulac aɣilif ɛreḍ tikelt-nniḍen akka {retry_time, time, medium}.", @@ -160,13 +230,48 @@ "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Mdel", "bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen", + "callout.dismiss": "Zgel-it", "closed_registrations_modal.description": "Asnulfu n umiḍan deg {domain} mačči d ayen izemren ad yili, maca ttxil-k·m, err deg lbal-ik·im belli ur teḥwaǧeḍ ara amiḍan s wudem ibanen ɣef {domain} akken ad tesqedceḍ Mastodon.", "closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen", "closed_registrations_modal.title": "Ajerred deg Masṭudun", + "collection.share_modal.share_link_label": "Bḍu aseɣwen", + "collection.share_modal.share_via_post": "Asuffeɣ deg Matodon", + "collection.share_modal.share_via_system": "Zuzer s…", + "collection.share_modal.title": "Bḍu talkensit", + "collection.share_modal.title_new": "Zuzer talkensit-ik·im tamaynut!", + "collections.account_count": "{count, plural, one {# n umiḍan} other {# n imiḍanen}}", + "collections.accounts.empty_title": "Talkensit-a d tilemt", + "collections.block_collection_owner": "Sewḥel amiḍan", + "collections.by_account": "sɣur {account_handle}", "collections.collection_description": "Aglam", + "collections.collection_language": "Tutlayt", + "collections.collection_language_none": "Ula yiwet", "collections.collection_name": "Isem", + "collections.collection_topic": "Asentel", "collections.continue": "Kemmel", + "collections.copy_link": "Nɣel aseɣwen", + "collections.create.steps": "Asurif wis {step}/{total}", + "collections.create_collection": "Snulfu-d talkensit", + "collections.delete_collection": "Kkes talkensit", + "collections.description_length_hint": "talast n 100 n yisekkilen", + "collections.detail.author_added_you_on_date": "{author} yerna-k·em ass n {date}", + "collections.detail.loading": "Aɛebbi n telkensit…", + "collections.detail.revoke_inclusion": "Kkes-iyi", + "collections.detail.sensitive_content": "Agbur amḥulfu", + "collections.detail.share": "Zuzer talkensit-a", + "collections.edit_details": "Ẓreg talqayt", + "collections.hidden_accounts_link": "{count, plural, one {# n umiḍan uffir} other {# n imiḍanen yettwaffaren}}", + "collections.hints.accounts_counter": "{count}/{max} n imiḍanen", "collections.manage_accounts": "Sefrek imiḍanen", + "collections.name_length_hint": "talast n 40 n yisekkilen", + "collections.new_collection": "Talkensit tamaynut", + "collections.remove_account": "Kkes", + "collections.report_collection": "Cetki ɣef telkensit-a", + "collections.revoke_collection_inclusion": "Kkes-iyi seg telkensit-a", + "collections.share_short": "Bḍu", + "collections.view_collection": "Wali talkensit", + "collections.visibility_public": "Azayaz", + "collections.visibility_title": "Abani", "column.about": "Ɣef", "column.blocks": "Imiḍanen yettusḥebsen", "column.bookmarks": "Ticraḍ", @@ -184,6 +289,7 @@ "column.lists": "Tibdarin", "column.mutes": "Imiḍanen yettwasgugmen", "column.notifications": "Ilɣa", + "column.other_collections": "Tilkensa sɣur {name}", "column.pins": "Tisuffaɣ yettwasenṭḍen", "column.public": "Tasuddemt tamatut", "column_back_button.label": "Tuɣalin", @@ -200,6 +306,7 @@ "community.column_settings.local_only": "Adigan kan", "community.column_settings.media_only": "Imidyaten kan", "community.column_settings.remote_only": "Anmeggag kan", + "compose.error.blank_post": "Ur yezmir ara ad yili yizen d ilem.", "compose.language.change": "Beddel tutlayt", "compose.language.search": "Nadi tutlayin …", "compose.published.body": "Yeffeɣ-d yizen-nni.", @@ -240,6 +347,7 @@ "confirmations.discard_edit_media.confirm": "Sefsex", "confirmations.follow_to_list.confirm": "Ḍfeṛ-it sakin rnu-t ɣer tebdart", "confirmations.follow_to_list.title": "Ḍfer aseqdac?", + "confirmations.hide_featured_tab.confirm": "Ffer accer", "confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.logout.title": "Tebɣiḍ ad teffɣeḍ ssya?", @@ -247,12 +355,15 @@ "confirmations.missing_alt_text.secondary": "Suffeɣ akken yebɣu yili", "confirmations.missing_alt_text.title": "Rnu aḍris amlellay?", "confirmations.mute.confirm": "Sgugem", + "confirmations.private_quote_notify.cancel": "Tuɣalin ɣer usiẓreg", "confirmations.private_quote_notify.confirm": "Suffeɣ tasuffeɣt", + "confirmations.private_quote_notify.do_not_show_again": "Ur-d skanay ara izen-a tikkelt-nniḍen", "confirmations.quiet_post_quote_info.dismiss": "Ur iyi-d-smektay ara", "confirmations.quiet_post_quote_info.got_it": "Gziɣ-t", "confirmations.redraft.confirm": "Kkes sakin ɛiwed tira", "confirmations.redraft.title": "Kkes sakin ɛiwed tira n tsuffeɣt?", "confirmations.remove_from_followers.confirm": "Kkes aneḍfar", + "confirmations.revoke_collection_inclusion.confirm": "Kkes-iyi", "confirmations.revoke_quote.confirm": "Kkes tasuffeɣt", "confirmations.revoke_quote.title": "Kkes tasuffeɣt?", "confirmations.unblock.confirm": "Serreḥ", @@ -263,11 +374,13 @@ "content_warning.hide": "Ffer tasuffeɣt", "content_warning.show": "Ssken-d akken tebɣu tili", "content_warning.show_more": "Sken-d ugar", + "content_warning.show_short": "Sken-d", "conversation.delete": "Kkes adiwenni", "conversation.mark_as_read": "Creḍ yettwaɣṛa", "conversation.open": "Ssken adiwenni", "conversation.with": "Akked {names}", "copy_icon_button.copied": "Yettwanɣel ɣer ufus", + "copy_icon_button.copy_this_text": "Nɣel aseɣwen ɣer tecwafit", "copypaste.copied": "Yettwanɣel", "copypaste.copy_to_clipboard": "Nɣel ɣer afus", "directory.federated": "Deg fedivers yettwasnen", @@ -291,6 +404,8 @@ "domain_pill.your_handle": "Asulay-ik·im:", "domain_pill.your_server": "D axxam-inek·inem umḍin, anda i zedɣent akk tsuffaɣ-ik·im. Ur k·m-yeεǧib ara wa? Ssenfel-d iqeddacen melmi i ak·m-yehwa, awi-d daɣen ineḍfaren-ik·im yid-k·m.", "dropdown.empty": "Fren taxtiṛit", + "email_subscriptions.email": "Imayl", + "email_subscriptions.validation.email.invalid": "Tansa imayl d tarameɣtut", "embed.instructions": "Ẓẓu addad-agi deg usmel-inek·inem s wenɣal n tangalt yellan sdaw-agi.", "embed.preview": "Akka ara d-iban:", "emoji_button.activity": "Aqeddic", @@ -308,6 +423,7 @@ "emoji_button.search_results": "Igemmaḍ n unadi", "emoji_button.symbols": "Izamulen", "emoji_button.travel": "Imeḍqan d Yinigen", + "empty_column.account_featured_self.no_collections_button": "Snulfu-d talkensit", "empty_column.account_suspended": "Amiḍan yettwaḥbas", "empty_column.account_timeline": "Ulac tisuffaɣ da !", "empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi", @@ -332,8 +448,11 @@ "explore.trending_links": "Isallen", "explore.trending_statuses": "Tisuffaɣ", "explore.trending_tags": "Ihacṭagen", + "featured_carousel.current": "Izen wis {current, number} / {max, number}", "featured_carousel.header": "{count, plural, one {n tsuffeɣt tunṭiḍt} other {n tsuffaɣ tunṭiḍin}}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions.add": "Rnu", + "featured_tags.suggestions.dismiss": "Uhu, tanemmirt", "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}.", @@ -355,11 +474,13 @@ "follow_suggestions.friends_of_friends_longer": "D aɣeṛfan ar wid i teṭṭafareḍ", "follow_suggestions.hints.featured": "Amaɣnu-a ifren-it-id wegraw n {domain} s ufus.", "follow_suggestions.hints.friends_of_friends": "Amaɣnu-a d aɣeṛfan ɣer wid i teṭṭafaṛeḍ.", + "follow_suggestions.personalized_suggestion": "Asumer udmawan", "follow_suggestions.popular_suggestion": "Asumer aɣeṛfan", "follow_suggestions.popular_suggestion_longer": "D aɣeṛfan deg {domain}", "follow_suggestions.view_all": "Wali-ten akk", "follow_suggestions.who_to_follow": "Ad tḍefreḍ?", "followed_tags": "Ihacṭagen yettwaḍfaren", + "followers.title": "Yeṭṭafaṛ {name}", "footer.about": "Ɣef", "footer.about_mastodon": "Ɣef Mastodon", "footer.about_server": "Ɣef {domain}", @@ -395,7 +516,7 @@ "hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}", "hints.profiles.see_more_posts": "Wali ugar n tsuffaɣ ɣef {domain}", "home.column_settings.show_quotes": "Sken-d tibdarin", - "home.column_settings.show_reblogs": "Ssken-d beṭṭu", + "home.column_settings.show_reblogs": "Sken-d izuzar", "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", "home.pending_critical_update.body": "Ma ulac aɣilif, leqqem aqeddac-ik Mastodon akken kan tzemreḍ !", @@ -494,6 +615,7 @@ "navigation_bar.automated_deletion": "Tukksa tawurmant n tsuffaɣ", "navigation_bar.blocks": "Iseqdacen yettusḥebsen", "navigation_bar.bookmarks": "Ticraḍ", + "navigation_bar.collections": "Tilkensa", "navigation_bar.direct": "Tibdarin tusligin", "navigation_bar.domain_blocks": "Tiɣula yeffren", "navigation_bar.favourites": "Imenyafen", @@ -516,6 +638,7 @@ "navigation_bar.search_trends": "Anadi / Anezzuɣ", "navigation_panel.collapse_lists": "Sneḍfes umuɣ n tebdart", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "notification.added_to_collection": "{name} yerna-k·em ɣer yiwen n telkensit", "notification.admin.report": "Yemla-t-id {name} {target}", "notification.admin.sign_up": "Ijerred {name}", "notification.annual_report.view": "Wali #Wrapstodon", @@ -539,6 +662,7 @@ "notification.reblog.name_and_others_with_link": "{name} akked {count, plural, one {# nnayeḍ} other {# nniḍen}} zzuzren tasuffeɣt-ik·im", "notification.relationships_severance_event.learn_more": "Issin ugar", "notification.status": "{name} akken i d-yessufeɣ", + "notification.update": "{name} ibeddel tira n yiwen n yizen", "notification_requests.accept": "Qbel", "notification_requests.dismiss": "Agi", "notification_requests.edit_selection": "Ẓreg", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 9fab41c3d170e3..c7bad1cc561ee6 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -20,11 +20,9 @@ "account.block_domain": "{domain} доменін бұғаттау", "account.block_short": "Бұғаттау", "account.blocked": "Бұғатталған", - "account.blocking": "Бұғаттау", "account.cancel_follow_request": "Withdraw follow request", "account.direct": "@{name} жеке айту", "account.disable_notifications": "@{name} постары туралы ескертпеу", - "account.domain_blocking": "Доменді бұғаттау", "account.edit_profile": "Профильді өңдеу", "account.edit_profile_short": "Түзеу", "account.enable_notifications": "@{name} постары туралы ескерту", @@ -34,9 +32,6 @@ "account.familiar_followers_two": "{name1} мен {name2} жазылған", "account.featured": "Ерекшеленген", "account.featured.accounts": "Профильдер", - "account.featured.hashtags": "Хэштегтер", - "account.featured_tags.last_status_at": "Соңғы жазба {date} күні", - "account.featured_tags.last_status_never": "Пост жоқ", "account.follow": "Жазылу", "account.follow_back": "Кері жазылу", "account.followers": "Жазылушы", @@ -60,16 +55,13 @@ "account.mute_notifications_short": "Хабарландыруларды өшіру", "account.mute_short": "Өшіру", "account.muted": "Еленбейді", - "account.muting": "Өшіру", "account.mutual": "Сіздер бір-біріңізге жазылғансыздар", "account.no_bio": "Сипаттама берілмеген.", "account.open_original_page": "Бастапқы бетті ашу", "account.posts": "Пост", - "account.posts_with_replies": "Постар мен жауаптар", "account.remove_from_followers": "{name} жазылушылардан жою", "account.report": "Шағымдану @{name}", "account.requested_follow": "{name} сізге жазылуға сұраныс жіберді", - "account.requests_to_follow_you": "Сізге жазылу сұраныстары", "account.share": "@{name} профилін бөлісу\"", "account.show_reblogs": "@{name} бөліскендерін көрсету", "account.statuses_counter": "{count, plural, one {{counter} жазба} other {{counter} жазба}}", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 41dcecc509e4c7..b1332fd5a45d47 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -12,7 +12,6 @@ "account.follow": "ಹಿಂಬಾಲಿಸಿ", "account.followers": "ಹಿಂಬಾಲಕರು", "account.posts": "ಟೂಟ್‌ಗಳು", - "account.posts_with_replies": "Toots and replies", "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 953fa1fb9196cd..c0daf196bc4903 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -28,12 +28,10 @@ "account.block_domain": "{domain} 도메인 차단", "account.block_short": "차단", "account.blocked": "차단함", - "account.blocking": "차단함", "account.cancel_follow_request": "팔로우 취소", "account.copy": "프로필 링크 복사", "account.direct": "@{name} 님에게 개인 멘션", "account.disable_notifications": "@{name} 의 게시물 알림 끄기", - "account.domain_blocking": "도메인 차단함", "account.edit_note": "개인 메모 편집", "account.edit_profile": "프로필 편집", "account.edit_profile_short": "수정", @@ -44,9 +42,6 @@ "account.familiar_followers_two": "{name1}, {name2} 님이 팔로우함", "account.featured": "추천", "account.featured.accounts": "프로필", - "account.featured.hashtags": "해시태그", - "account.featured_tags.last_status_at": "{date}에 마지막으로 게시", - "account.featured_tags.last_status_never": "게시물 없음", "account.field_overflow": "내용 전체 보기", "account.filters.all": "모든 활동", "account.filters.boosts_toggle": "부스트 보기", @@ -95,7 +90,6 @@ "account.mute_notifications_short": "알림 뮤트", "account.mute_short": "뮤트", "account.muted": "뮤트됨", - "account.muting": "뮤트함", "account.mutual": "서로 팔로우", "account.no_bio": "제공된 설명이 없습니다.", "account.node_modal.save": "저장", @@ -103,11 +97,9 @@ "account.note.edit_button": "편집", "account.open_original_page": "원본 페이지 열기", "account.posts": "게시물", - "account.posts_with_replies": "게시물과 답장", "account.remove_from_followers": "팔로워에서 {name} 제거", "account.report": "@{name} 신고", "account.requested_follow": "{name} 님이 팔로우 요청을 보냈습니다", - "account.requests_to_follow_you": "팔로우 요청", "account.share": "@{name}의 프로필 공유", "account.show_reblogs": "@{name}의 부스트 보기", "account.statuses_counter": "{count, plural, other {게시물 {counter}개}}", @@ -123,9 +115,6 @@ "account_edit.bio.title": "자기소개", "account_edit.bio_modal.add_title": "자기소개 추가", "account_edit.bio_modal.edit_title": "자기소개 편집", - "account_edit.button.add": "{item} 추가", - "account_edit.button.delete": "{item} 제거", - "account_edit.button.edit": "{item} 편집", "account_edit.column_button": "완료", "account_edit.column_title": "프로필 편집", "account_note.placeholder": "클릭하여 노트 추가", @@ -232,7 +221,6 @@ "collections.delete_collection": "컬렉션 지우기", "collections.manage_accounts": "계정 관리하기", "collections.new_collection": "새 컬렉션", - "collections.no_collections_yet": "아직 컬렉션이 없습니다.", "collections.view_collection": "컬렉션 보기", "collections.visibility_public": "공개", "column.about": "정보", @@ -404,9 +392,6 @@ "emoji_button.search_results": "검색 결과", "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", - "empty_column.account_featured.me": "아직 아무 것도 추천하지 않았습니다. 자주 사용하는 해시태그, 친구의 계정까지 내 계정에서 추천할 수 있다는 것을 알고 계셨나요?", - "empty_column.account_featured.other": "{acct} 님은 아직 아무 것도 추천하지 않았습니다. 자주 사용하는 해시태그, 친구의 계정까지 내 계정에서 추천할 수 있다는 것을 알고 계셨나요?", - "empty_column.account_featured_other.unknown": "이 계정은 아직 아무 것도 추천하지 않았습니다.", "empty_column.account_hides_collections": "이 사용자는 이 정보를 사용할 수 없도록 설정했습니다", "empty_column.account_suspended": "계정 정지됨", "empty_column.account_timeline": "이곳에는 게시물이 없습니다!", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index c0033379adb877..68181f03317dce 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -14,6 +14,7 @@ "about.powered_by": "Medyaya civakî ya nenavendî bi hêzdariya {mastodon}", "about.rules": "Rêbazên rajekar", "account.account_note_header": "Nîşeyên kesane", + "account.activity": "Çalakî", "account.add_or_remove_from_list": "Li lîsteyan zêde bike yan jî rake", "account.badges.bot": "Bot", "account.badges.group": "Kom", @@ -21,7 +22,6 @@ "account.block_domain": "Navpera {domain} asteng bike", "account.block_short": "Asteng bike", "account.blocked": "Astengkirî", - "account.blocking": "Astengkirin", "account.cancel_follow_request": "Daxwaza şopandinê vekişîne", "account.copy": "Girêdanê bo profîlê jê bigire", "account.direct": "Bi taybetî qale @{name} bike", @@ -31,11 +31,12 @@ "account.enable_notifications": "Min agahdar bike gava @{name} diweşîne", "account.endorse": "Taybetiyên li ser profîl", "account.featured.accounts": "Profîl", - "account.featured.hashtags": "Hashtag", - "account.featured_tags.last_status_at": "Şandiya dawî di {date} de", - "account.featured_tags.last_status_never": "Şandî tune ne", + "account.filters.posts_only": "Şandî", + "account.filters.posts_replies": "Şandî û bersiv", + "account.filters.replies_toggle": "Bersivan nîşan bide", "account.follow": "Bişopîne", "account.follow_back": "Bişopîne", + "account.follow_back_short": "Bişopîne", "account.follow_request": "Bo şopandinê daxwaz bike", "account.follow_request_cancel": "Daxwazê têk bibe", "account.follow_request_cancel_short": "Têk bibe", @@ -43,6 +44,7 @@ "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.followers_you_know_counter": "{counter} tu nas dikî", "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.", @@ -52,21 +54,25 @@ "account.in_memoriam": "Di bîranînê de.", "account.joined_short": "Dîroka tevlîbûnê", "account.languages": "Zimanên beşdarbûyî biguherîne", + "account.last_active": "Çalakiya dawî", "account.link_verified_on": "Xwedaniya li vê girêdanê di {date} de hatiye kontrolkirin", "account.locked_info": "Rewşa vê ajimêrê wek kilîtkirî hatiye sazkirin. Xwediyê ajimêrê, bi destan dinirxîne şopandinê dinirxîne.", "account.media": "Medya", "account.mention": "Qal @{name} bike", + "account.menu.add_to_list": "Tevlî lîsteyê bike…", + "account.menu.block": "Jimarê asteng bike", + "account.menu.block_domain": "{domain} asteng bike", + "account.menu.share": "Parve bike…", + "account.menu.show_reblogs": "Di demnameyê de şandiyên bilindkirî nîşan bide", "account.moved_to": "{name} diyar kir ku ajimêra nû ya wan niha ev e:", "account.mute": "@{name} bêdeng bike", "account.mute_notifications_short": "Agahdariyan bêdeng bike", "account.mute_short": "Bêdeng bike", "account.muted": "Bêdengkirî", - "account.muting": "Bêdengkirin", "account.mutual": "Hûn hevdû dişopînin", "account.no_bio": "Ti danasîn nehatiye tevlîkirin.", "account.open_original_page": "Rûpela resen veke", "account.posts": "Şandî", - "account.posts_with_replies": "Şandî û bersiv", "account.report": "@{name} ragihîne", "account.requested_follow": "{name} dixwaze te bişopîne", "account.share": "Profîla @{name} parve bike", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index ecf16bc4dec10f..7bf8af9fc90dde 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -23,7 +23,6 @@ "account.mute": "Tawhe @{name}", "account.muted": "Tawhes", "account.posts": "Postow", - "account.posts_with_replies": "Postow ha gorthebow", "account.report": "Reportya @{name}", "account.share": "Kevrenna profil @{name}", "account.show_reblogs": "Diskwedhes kenerthow a @{name}", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index 4156f151f3e917..d6c88a68d16f56 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -21,12 +21,10 @@ "account.block_domain": "Imperire dominium {domain}", "account.block_short": "Imperire", "account.blocked": "Impeditum est", - "account.blocking": "Clausus", "account.cancel_follow_request": "Petitio sequī retrāhere", "account.copy": "Transcribo connexi ut catagraphum", "account.direct": "Callim loqui @{name}", "account.disable_notifications": "Desine me certiorem facere cum @{name} scribit", - "account.domain_blocking": "Domenium obstructum", "account.edit_profile": "Recolere notionem", "account.enable_notifications": "Desine me certiorem facere cum @{name} scribit", "account.endorse": "Notatio in profilo", @@ -35,9 +33,6 @@ "account.familiar_followers_two": "Sequitur {name1} et {name2}", "account.featured": "Praeclara", "account.featured.accounts": "Profilia", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Ultimum nuntium die {date}", - "account.featured_tags.last_status_never": "Nulla contributa", "account.follow": "Sequere", "account.follow_back": "Sequere retro", "account.followers": "Sectatores", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index f53292c751e37f..313e2f62d4a9e1 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -21,12 +21,10 @@ "account.block_domain": "Bloka el domeno {domain}", "account.block_short": "Bloka", "account.blocked": "Blokado", - "account.blocking": "Blokando", "account.cancel_follow_request": "Anula solisitud de segir", "account.copy": "Kopia atadijo de profil", "account.direct": "Enmenta a @{name} en privado", "account.disable_notifications": "Desha de avizarme sovre publikasyones de @{name}", - "account.domain_blocking": "Blokando el domeno", "account.edit_profile": "Edita profil", "account.edit_profile_short": "Edita", "account.enable_notifications": "Avizame kuando @{name} publike", @@ -35,9 +33,6 @@ "account.familiar_followers_two": "Segido por {name1} i {name2}", "account.featured": "Avaliado", "account.featured.accounts": "Profiles", - "account.featured.hashtags": "Etiketas", - "account.featured_tags.last_status_at": "Ultima publikasyon de {date}", - "account.featured_tags.last_status_never": "No ay publikasyones", "account.follow": "Sige", "account.follow_back": "Sige tamyen", "account.follow_back_short": "Sige tambyen", @@ -67,15 +62,12 @@ "account.mute_notifications_short": "Silensia avizos", "account.mute_short": "Silensia", "account.muted": "Silensiado", - "account.muting": "Silensyando", "account.mutual": "Vos sigesh mutualmente", "account.no_bio": "No ay deskripsion.", "account.open_original_page": "Avre pajina orijnala", "account.posts": "Publikasyones", - "account.posts_with_replies": "Kon repuestas", "account.report": "Raporta @{name}", "account.requested_follow": "{name} tiene solisitado segirte", - "account.requests_to_follow_you": "Solisita 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}}", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 82a7eb9858e481..6cd6c55f1d0373 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -27,12 +27,10 @@ "account.block_domain": "Blokuoti serverį {domain}", "account.block_short": "Blokuoti", "account.blocked": "Užblokuota", - "account.blocking": "Blokavimas", "account.cancel_follow_request": "Atšaukti sekimą", "account.copy": "Kopijuoti nuorodą į profilį", "account.direct": "Privačiai paminėti @{name}", "account.disable_notifications": "Nustoti man pranešti, kai @{name} paskelbia", - "account.domain_blocking": "Blokuoti domeną", "account.edit_note": "Redaguoti asmeninę pastabą", "account.edit_profile": "Redaguoti profilį", "account.edit_profile_short": "Redaguoti", @@ -43,9 +41,6 @@ "account.familiar_followers_two": "{name1} ir {name2} seka", "account.featured": "Rodomi", "account.featured.accounts": "Profiliai", - "account.featured.hashtags": "Grotažymės", - "account.featured_tags.last_status_at": "Paskutinis įrašas {date}", - "account.featured_tags.last_status_never": "Nėra įrašų", "account.filters.all": "Visa veikla", "account.filters.boosts_toggle": "Rodyti pasidalinimus", "account.filters.posts_boosts": "Įrašai ir pasidalinimai", @@ -80,7 +75,6 @@ "account.mute_notifications_short": "Nutildyti pranešimus", "account.mute_short": "Nutildyti", "account.muted": "Nutildytas", - "account.muting": "Užtildymas", "account.mutual": "Sekate vienas kitą", "account.no_bio": "Nėra pateikto aprašymo.", "account.node_modal.callout": "Asmeninės pastabos matomos tik jums.", @@ -93,11 +87,9 @@ "account.note.title": "Asmeninės pastabos (matomos tik jums)", "account.open_original_page": "Atidaryti originalų puslapį", "account.posts": "Įrašai", - "account.posts_with_replies": "Įrašai ir atsakymai", "account.remove_from_followers": "Šalinti {name} iš sekėjų", "account.report": "Pranešti apie @{name}", "account.requested_follow": "{name} paprašė tave sekti", - "account.requests_to_follow_you": "Prašymai sekti jus", "account.share": "Bendrinti @{name} profilį", "account.show_reblogs": "Rodyti pasidalinimus iš @{name}", "account.statuses_counter": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}}", @@ -354,9 +346,6 @@ "emoji_button.search_results": "Paieškos rezultatai", "emoji_button.symbols": "Simboliai", "emoji_button.travel": "Kelionės ir vietos", - "empty_column.account_featured.me": "Jūs dar nieko neparyškinote. Ar žinojote, kad savo profilyje galite parodyti dažniausiai naudojamas grotažymes ir netgi savo draugų paskyras?", - "empty_column.account_featured.other": "{acct} dar nieko neparyškino. Ar žinojote, kad savo profilyje galite pateikti dažniausiai naudojamus grotžymes ir netgi savo draugų paskyras?", - "empty_column.account_featured_other.unknown": "Ši paskyra dar nieko neparodė.", "empty_column.account_hides_collections": "Šis (-i) naudotojas (-a) pasirinko nepadaryti šią informaciją prieinamą.", "empty_column.account_suspended": "Paskyra pristabdyta.", "empty_column.account_timeline": "Nėra čia įrašų.", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 83e436c75638d7..da87d2d9f5fcc7 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -14,19 +14,23 @@ "about.powered_by": "Decentralizētu sabiedrisko tīklu darbina {mastodon}", "about.rules": "Servera noteikumi", "account.account_note_header": "Personīga piezīme", + "account.activity": "Darbības", "account.add_or_remove_from_list": "Pievienot vai Noņemt no sarakstiem", + "account.badges.admin": "Pārvaldītājs", + "account.badges.blocked": "Liegts", "account.badges.bot": "Automatizēts", + "account.badges.domain_blocked": "Liegts domēns", "account.badges.group": "Grupa", + "account.badges.muted": "Apklusināts", + "account.badges.muted_until": "Apklusināts līdz {until}", "account.block": "Bloķēt @{name}", "account.block_domain": "Bloķēt domēnu {domain}", "account.block_short": "Bloķēt", "account.blocked": "Bloķēts", - "account.blocking": "Bloķēts", "account.cancel_follow_request": "Atsaukt sekošanas pieprasījumu", "account.copy": "Ievietot saiti uz profilu starpliktuvē", "account.direct": "Pieminēt @{name} privāti", "account.disable_notifications": "Pārtraukt man paziņot, kad @{name} izveido ierakstu", - "account.domain_blocking": "Liegts domēns", "account.edit_profile": "Labot profilu", "account.edit_profile_short": "Labot", "account.enable_notifications": "Paziņot man, kad @{name} izveido ierakstu", @@ -36,9 +40,15 @@ "account.familiar_followers_two": "Kam seko {name1} un {name2}", "account.featured": "Izcelts", "account.featured.accounts": "Profili", - "account.featured.hashtags": "Tēmturi", - "account.featured_tags.last_status_at": "Pēdējais ieraksts {date}", - "account.featured_tags.last_status_never": "Nav ierakstu", + "account.featured.collections": "Krājumi", + "account.featured.new_collection": "Jauns krājums", + "account.field_overflow": "Rādīt visu saturu", + "account.filters.all": "Visas darbības", + "account.filters.boosts_toggle": "Rādīt pastiprinātos ierakstus", + "account.filters.posts_boosts": "Ieraksti un pastiprinātie ieraksti", + "account.filters.posts_only": "Ieraksti", + "account.filters.posts_replies": "Ieraksti un atbildes", + "account.filters.replies_toggle": "Rādīt atbildes", "account.follow": "Sekot", "account.follow_back": "Sekot atpakaļ", "account.follow_back_short": "Sekot atpakaļ", @@ -57,27 +67,43 @@ "account.go_to_profile": "Doties uz profilu", "account.hide_reblogs": "Paslēpt @{name} pastiprinātos ierakstus", "account.in_memoriam": "Piemiņai.", + "account.join_modal.day": "Diena", + "account.join_modal.me": "Tu pievienojies {server}", "account.joined_short": "Pievienojās", "account.languages": "Mainīt abonētās valodas", "account.link_verified_on": "Šīs saites piederība tika pārbaudīta {date}", "account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.", "account.media": "Multivide", "account.mention": "Pieminēt @{name}", + "account.menu.add_to_list": "Pievienot sarakstam…", + "account.menu.block": "Bloķēt kontu", + "account.menu.block_domain": "Liegt {domain}", + "account.menu.copy": "Kopēt saiti", + "account.menu.mute": "Apklusināt kontu", + "account.menu.note.description": "Redzams tikai Tev", + "account.menu.open_original_page": "Apskatīt {domain}", + "account.menu.remove_follower": "Noņemt sekotāju", + "account.menu.report": "Ziņot par kontu", + "account.menu.share": "Kopīgot…", + "account.menu.show_reblogs": "Laika joslā rādīt pastiprinātos ierakstus", + "account.menu.unblock": "Atcelt konta liegumu", + "account.menu.unblock_domain": "Atcelt {domain} liegumu", + "account.menu.unmute": "Atcelt konta apklusināšanu", "account.moved_to": "{name} norādīja, ka viņu jaunais konts tagad ir:", "account.mute": "Apklusināt @{name}", "account.mute_notifications_short": "Apklusināt paziņojumus", "account.mute_short": "Apklusināt", "account.muted": "Apklusināts", - "account.muting": "Apklusināts", "account.mutual": "Jūs sekojat viens otram", + "account.name_info": "Ko tas nozīmē?", "account.no_bio": "Apraksts nav sniegts.", + "account.node_modal.save": "Saglabāt", + "account.note.edit_button": "Labot", "account.open_original_page": "Atvērt pirmavota lapu", "account.posts": "Ieraksti", - "account.posts_with_replies": "Ieraksti un atbildes", "account.remove_from_followers": "Dzēst sekotāju {name}", "account.report": "Ziņot par @{name}", "account.requested_follow": "{name} nosūtīja Tev sekošanas pieprasījumu", - "account.requests_to_follow_you": "Sekošanas pieprasījumi", "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}}", @@ -90,6 +116,31 @@ "account.unmute": "Noņemt apklusinājumu @{name}", "account.unmute_notifications_short": "Atcelet paziņojumu apklusināšanu", "account.unmute_short": "Noņemt apklusinājumu", + "account_edit.bio.edit_label": "Labot biogrāfiju", + "account_edit.bio.title": "Biogrāfija", + "account_edit.bio_modal.add_title": "Pievienot biogrāfiju", + "account_edit.bio_modal.edit_title": "Labot biogrāfiju", + "account_edit.column_button": "Darīts", + "account_edit.column_title": "Labot profilu", + "account_edit.custom_fields.add_label": "Pievienot lauku", + "account_edit.custom_fields.edit_label": "Labot lauku", + "account_edit.field_actions.delete": "Dzēst lauku", + "account_edit.field_actions.edit": "Labot lauku", + "account_edit.field_delete_modal.delete_button": "Dzēst", + "account_edit.field_edit_modal.discard_confirm": "Atmest", + "account_edit.image_delete_modal.delete_button": "Dzēst", + "account_edit.image_delete_modal.title": "Dzēst attēlu?", + "account_edit.image_edit.add_button": "Pievienot attēlu", + "account_edit.image_edit.remove_button": "Noņemt attēlu", + "account_edit.save": "Saglabāt", + "account_edit.upload_modal.back": "Atpakaļ", + "account_edit.upload_modal.done": "Gatavs", + "account_edit.upload_modal.step_upload.button": "Pārlūkot failus", + "account_edit.upload_modal.title_add.avatar": "Pievienot profila fotoattēlu", + "account_edit.upload_modal.title_add.header": "Pievienot titullapas fotoattēlu", + "account_edit.upload_modal.title_replace.avatar": "Nomainīt profila fotoattēlu", + "account_edit.upload_modal.title_replace.header": "Nomainīt titullapas fotoattēlu", + "account_edit_tags.suggestions": "Ieteikumi:", "account_note.placeholder": "Noklikšķini, lai pievienotu piezīmi", "admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās", "admin.dashboard.monthly_retention": "Lietotāju saglabāšanas rādītājs mēnesī pēc reģistrēšanās", @@ -113,6 +164,11 @@ "alt_text_modal.describe_for_people_with_visual_impairments": "Aprakstīt šo cilvēkiem ar redzes traucējumiem…", "alt_text_modal.done": "Gatavs", "announcement.announcement": "Paziņojums", + "annual_report.shared_page.donate": "Ziedot", + "annual_report.summary.archetype.title_public": "Lietotāja \"{name}\" arhetips", + "annual_report.summary.archetype.title_self": "Tavs arhetips", + "annual_report.summary.close": "Aizvērt", + "annual_report.summary.copy_link": "Kopēt saiti", "annual_report.summary.most_used_app.most_used_app": "visizmantotākā lietotne", "annual_report.summary.most_used_hashtag.most_used_hashtag": "visizmantotākais tēmturis", "annual_report.summary.new_posts.new_posts": "jauni ieraksti", @@ -134,7 +190,7 @@ "bundle_column_error.copy_stacktrace": "Ievietot kļūdu ziņojumu starpliktuvē", "bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.", "bundle_column_error.error.title": "Ak vai!", - "bundle_column_error.network.body": "Kļūda lapas ielādēšanas laikā. Tas varētu būt īzlaicīgs sarežģījums ar interneta savienojumu vai šo serveri.", + "bundle_column_error.network.body": "Kļūda lapas ielādēšanas laikā. Tas varētu būt īslaicīgs sarežģījums ar interneta savienojumu vai šo serveri.", "bundle_column_error.network.title": "Tīkla kļūda", "bundle_column_error.retry": "Mēģināt vēlreiz", "bundle_column_error.return": "Atgriezties", @@ -148,6 +204,19 @@ "closed_registrations_modal.find_another_server": "Atrast citu serveri", "closed_registrations_modal.preamble": "Mastodon ir decentralizēts, tāpēc neatkarīgi no tā, kur Tu izveido savu kontu, varēsi sekot un mijiedarboties ar ikvienu šajā serverī. Tu pat vari to pašizvietot!", "closed_registrations_modal.title": "Reģistrēšanās Mastodon", + "collections.accounts.empty_title": "Šī kolekcija ir tukša", + "collections.block_collection_owner": "Bloķēt kontu", + "collections.collection_description": "Apraksts", + "collections.collection_language": "Valoda", + "collections.collection_language_none": "Nav", + "collections.collection_name": "Nosaukums", + "collections.collection_topic": "Tēma", + "collections.continue": "Turpināt", + "collections.copy_link": "Kopēt saiti", + "collections.manage_accounts": "Pārvaldīt kontus", + "collections.remove_account": "Noņemt", + "collections.suggestions.can_not_add": "Nevar pievienot", + "collections.visibility_title": "Redzamība", "column.about": "Par", "column.blocks": "Liegtie lietotāji", "column.bookmarks": "Grāmatzīmes", @@ -175,6 +244,8 @@ "column_header.show_settings": "Rādīt iestatījumus", "column_header.unpin": "Atspraust", "column_search.cancel": "Atcelt", + "combobox.loading": "Ielādē", + "combobox.open_results": "Atvērt rezultātus", "community.column_settings.local_only": "Tikai vietējie", "community.column_settings.media_only": "Tikai multivide", "community.column_settings.remote_only": "Tikai attālinātie", @@ -208,6 +279,7 @@ "confirmations.delete.confirm": "Dzēst", "confirmations.delete.message": "Vai tiešām izdzēst šo ierakstu?", "confirmations.delete.title": "Izdzēst ierakstu?", + "confirmations.delete_collection.confirm": "Dzēst", "confirmations.delete_list.confirm": "Dzēst", "confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?", "confirmations.delete_list.title": "Izdzēst sarakstu?", @@ -303,7 +375,6 @@ "emoji_button.search_results": "Meklēšanas rezultāti", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Ceļošana un vietas", - "empty_column.account_featured_other.unknown": "Šis lietotājs vēl neko nav licis attēlot savā profilā.", "empty_column.account_hides_collections": "Šis lietotājs ir izvēlējies nedarīt šo informāciju pieejamu", "empty_column.account_suspended": "Konta darbība ir apturēta", "empty_column.account_timeline": "Šeit nav ierakstu.", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index 5dae604d07ec2b..05f0b979fc6490 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -31,7 +31,6 @@ "account.mute": "Зачути го @{name}", "account.muted": "Зачутено", "account.posts": "Тутови", - "account.posts_with_replies": "Тутови и реплики", "account.report": "Пријави @{name}", "account.share": "Сподели @{name} профил", "account.show_reblogs": "Прикажи бустови од @{name}", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index d8f4a977ec5555..7734e072c1c904 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -20,7 +20,6 @@ "account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക", "account.enable_notifications": "@{name} പോസ്റ്റ് ചെയ്യുമ്പോൾ എന്നെ അറിയിക്കുക", "account.endorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കുക", - "account.featured_tags.last_status_never": "എഴുത്തുകളില്ല", "account.follow": "പിന്തുടരുക", "account.follow_back": "തിരിച്ചു പിന്തുടരുക", "account.followers": "പിന്തുടരുന്നവർ", @@ -42,7 +41,6 @@ "account.no_bio": "വിവരണം നല്കുിയിട്ടില്ല.", "account.open_original_page": "ആദ്യത്തു് താൾ തുറക്കുക", "account.posts": "പോസ്റ്റുകൾ", - "account.posts_with_replies": "പോസ്റ്റുകളും മറുപടികളും", "account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}", "account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കിടുക", "account.show_reblogs": "@{name} ൽ നിന്നുള്ള ബൂസ്റ്റുകൾ കാണിക്കുക", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index b38b138bcc8275..6f0e927f120e6a 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -25,8 +25,6 @@ "account.edit_profile": "प्रोफाइल एडिट करा", "account.enable_notifications": "जेव्हा @{name} पोस्ट करते तेव्हा मला सूचित करा", "account.endorse": "प्रोफाइलवरील वैशिष्ट्य", - "account.featured_tags.last_status_at": "शेवटचे पोस्ट {date} रोजी", - "account.featured_tags.last_status_never": "पोस्ट नाहीत", "account.follow": "अनुयायी व्हा", "account.follow_back": "आपणही अनुसरण करा", "account.followers": "अनुयायी", @@ -47,7 +45,6 @@ "account.muted": "मौन", "account.open_original_page": "मूळ पृष्ठ उघडा", "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", "account.report": "@{name} ची तक्रार करा", "account.requested_follow": "{name} ने आपल्याला फॉलो करण्याची रिक्वेस्ट केली आहे", "account.share": "@{name} चे प्रोफाइल शेअर करा", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 49a54815d8ab14..d984de72cc7c3c 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -21,19 +21,15 @@ "account.block_domain": "Sekat domain {domain}", "account.block_short": "Sekat", "account.blocked": "Disekat", - "account.blocking": "Blocking", "account.cancel_follow_request": "Batalkan permintaan ikut", "account.copy": "Salin pautan ke profil", "account.direct": "Sebut secara persendirian @{name}", "account.disable_notifications": "Berhenti maklumkan saya apabila @{name} mengirim hantaran", - "account.domain_blocking": "Blocking domain", "account.edit_profile": "Sunting profil", "account.edit_profile_short": "Sunting", "account.enable_notifications": "Maklumi saya apabila @{name} mengirim hantaran", "account.endorse": "Tampilkan di profil", "account.familiar_followers_one": "melayuikutikut{name1}", - "account.featured_tags.last_status_at": "Hantaran terakhir pada {date}", - "account.featured_tags.last_status_never": "Tiada hantaran", "account.follow": "Ikuti", "account.follow_back": "Ikut balik", "account.followers": "Pengikut", @@ -59,7 +55,6 @@ "account.no_bio": "Tiada penerangan diberikan.", "account.open_original_page": "Buka halaman asal", "account.posts": "Hantaran", - "account.posts_with_replies": "Hantaran dan balasan", "account.report": "Laporkan @{name}", "account.requested_follow": "{name} has requested to follow you", "account.share": "Kongsi profil @{name}", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index ba1e90e5b9369e..87604e5912d357 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -25,8 +25,6 @@ "account.edit_profile": "ကိုယ်ရေးမှတ်တမ်းပြင်ဆင်မည်", "account.enable_notifications": "@{name} ပို့စ်တင်သည့်အခါ ကျွန်ုပ်ကို အကြောင်းကြားပါ။", "account.endorse": "အကောင့်ပရိုဖိုင်တွင်ဖော်ပြပါ", - "account.featured_tags.last_status_at": "နောက်ဆုံးပို့စ်ကို {date} တွင် တင်ခဲ့သည်။", - "account.featured_tags.last_status_never": "ပို့စ်တင်ထားခြင်းမရှိပါ", "account.follow": "စောင့်ကြည့်", "account.followers": "စောင့်ကြည့်သူများ", "account.followers.empty": "ဤသူကို စောင့်ကြည့်သူ မရှိသေးပါ။", @@ -49,7 +47,6 @@ "account.no_bio": "ဖော်ပြချက် မပေးထားပါ။", "account.open_original_page": "မူလစာမျက်နှာကိုဖွင့်ပါ", "account.posts": "ပို့စ်များ", - "account.posts_with_replies": "ပို့စ်နှင့် ရီပလိုင်းများ", "account.report": "တိုင်ကြားမည်{name}", "account.requested_follow": "{name} က သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုထားသည်", "account.share": "{name}၏ပရိုဖိုင်ကိုမျှဝေပါ", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index f26df41d4f5e9d..a1036662c5ec53 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -28,12 +28,10 @@ "account.block_domain": "封鎖域名 {domain}", "account.block_short": "封鎖", "account.blocked": "Hőng封鎖", - "account.blocking": "Teh封鎖", "account.cancel_follow_request": "取消跟tuè", "account.copy": "Khóo-pih個人資料ê連結", "account.direct": "私人提起 @{name}", "account.disable_notifications": "停止佇 {name} PO文ê時通知我", - "account.domain_blocking": "Teh封鎖ê域名", "account.edit_note": "編私人ê註解", "account.edit_profile": "編輯個人資料", "account.edit_profile_short": "編輯", @@ -45,9 +43,7 @@ "account.featured": "精選ê", "account.featured.accounts": "個人資料", "account.featured.collections": "收藏", - "account.featured.hashtags": "Hashtag", - "account.featured_tags.last_status_at": "頂kái tī {date} Po文", - "account.featured_tags.last_status_never": "無PO文", + "account.featured.new_collection": "新ê收藏", "account.field_overflow": "展示規篇內容", "account.filters.all": "逐ē活動", "account.filters.boosts_toggle": "顯示轉PO", @@ -73,8 +69,19 @@ "account.go_to_profile": "行kàu個人資料", "account.hide_reblogs": "Tshàng tuì @{name} 來ê轉PO", "account.in_memoriam": "佇tsia追悼。", + "account.join_modal.day": "Kang", + "account.join_modal.me": "Lí加入 {server} 佇", + "account.join_modal.me_anniversary": "加入聯邦宇宙周年快樂!Lí加入 {server} 佇", + "account.join_modal.me_today": "Che是lí加入 {server} ê頭一kang!", + "account.join_modal.other": "{name} 加入 {server} 佇", + "account.join_modal.other_today": "Che是 {name} 加入 {server} ê頭一kang!", + "account.join_modal.share.celebrate": "分享慶祝ê PO文", + "account.join_modal.share.intro": "分享介紹ê PO文", + "account.join_modal.share.welcome": "分享歡迎ê PO文", + "account.join_modal.years": "{number, plural, other {年}}", "account.joined_short": "加入ê時", "account.languages": "變更訂閱的語言", + "account.last_active": "頂kái活動ê時間", "account.link_verified_on": "Tsit ê連結ê所有權佇 {date} 受檢查", "account.locked_info": "Tsit ê口座ê隱私狀態鎖起來ah。所有者ē手動審查thang kā跟tuè ê lâng。", "account.media": "媒體", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Kā通知消音", "account.mute_short": "消音", "account.muted": "消音ah", - "account.muting": "消音", "account.mutual": "Lín sio跟tuè", + "account.name.copy": "Khóo-pih口座ê名", "account.name.help.domain": "", "account.name.help.domain_self": "{domain} 是管理lí ê個人資料hām PO文ê服侍器。", - "account.name.help.footer": "Tiō親像lí通用別款電子phue程式寄電子phue予別lâng,lí ē當佇別ê Mastodon服侍器hām別lâng交流,koh ē當hām用kap Mastodon kâng款規則(ActivityPub 協定)ê別款社里軟體ê lâng交流。", + "account.name.help.footer": "就像lí通寄電子phue予用無kâng電子批服務者ê儂kâng款,lí ē當hām佇無kâng Mastodon服侍器ê,kap佇其他相容Mastodon ê社群軟體ê lâng互動。", "account.name.help.header": "@handle 親像電子批地址", "account.name.help.username": "{username} 是tsit ê口座佇in ê服侍器ê用者名。佇別ê服侍器可能有kâng名ê別lâng。", "account.name.help.username_self": "{username} 是lí ê口座佇tsit ê服侍器ê用者名。佇別ê服侍器可能有kâng名ê別lâng。", @@ -122,11 +129,9 @@ "account.note.title": "私人ê筆記(kan-ta lí ē當看)", "account.open_original_page": "開原來ê頁", "account.posts": "PO文", - "account.posts_with_replies": "PO文kap回應", "account.remove_from_followers": "Kā {name} tuì跟tuè lí ê ê內底suá掉", "account.report": "檢舉 @{name}", "account.requested_follow": "{name} 請求跟tuè lí", - "account.requests_to_follow_you": "請求跟tuè lí", "account.share": "分享 @{name} ê個人資料", "account.show_reblogs": "顯示uì @{name} 來ê轉PO", "account.statuses_counter": "{count, plural, other {{count} ê PO文}}", @@ -141,35 +146,43 @@ "account.unmute": "取消消音 @{name}", "account.unmute_notifications_short": "Kā通知取消消音", "account.unmute_short": "取消消音", + "account_edit.advanced_settings.bot_hint": "Kā別lâng講tsit ê口座主要行自動操作,可能無lâng監控", + "account_edit.advanced_settings.bot_label": "機器lâng ê口座", + "account_edit.advanced_settings.title": "進一步ê設定", + "account_edit.bio.add_label": "加添個人紹介", + "account_edit.bio.edit_label": "編個人紹介", "account_edit.bio.placeholder": "加一段短紹介,幫tsān別lâng認捌lí。", "account_edit.bio.title": "個人紹介", "account_edit.bio_modal.add_title": "加添個人紹介", "account_edit.bio_modal.edit_title": "編個人紹介", - "account_edit.button.add": "加 {item}", - "account_edit.button.delete": "Thâi {item}", - "account_edit.button.edit": "編 {item}", "account_edit.column_button": "做好ah", "account_edit.column_title": "編輯個人資料", - "account_edit.custom_fields.name": "框á", + "account_edit.custom_fields.add_label": "加框á", + "account_edit.custom_fields.edit_label": "編框á", "account_edit.custom_fields.placeholder": "加lí ê代名詞、外部連結,á是其他lí beh分享ê。", "account_edit.custom_fields.reorder_button": "重排框á", "account_edit.custom_fields.tip_content": "Lí通用驗證連kàu lí 所有ê網站ê連結,來增加lí ê Mastodon口座ê通信ê程度。", "account_edit.custom_fields.tip_title": "撇步:加驗證過ê連結", "account_edit.custom_fields.title": "自訂欄", "account_edit.custom_fields.verified_hint": "我beh án-tsuánn加驗證過ê連結?", + "account_edit.display_name.add_label": "加添顯示ê名", + "account_edit.display_name.edit_label": "編顯示ê名", "account_edit.display_name.placeholder": "Lí ê顯示ê名是lí ê名佇lí ê個人資料kap時間線出現ê方式。", "account_edit.display_name.title": "顯示ê名", - "account_edit.featured_hashtags.item": "hashtag", + "account_edit.featured_hashtags.edit_label": "加hashtag", "account_edit.featured_hashtags.placeholder": "幫tsān別lâng認捌,kap緊緊接近使用lí收藏ê主題。", "account_edit.featured_hashtags.title": "特色ê hashtag", + "account_edit.field_actions.delete": "Thâi掉框á", + "account_edit.field_actions.edit": "編框á", "account_edit.field_delete_modal.confirm": "Lí敢確定beh thâi掉tsit ê自訂ê框á?Tsit ê動作bē當改倒轉。", "account_edit.field_delete_modal.delete_button": "Thâi掉", "account_edit.field_delete_modal.title": "敢beh thâi掉自訂ê框á?", "account_edit.field_edit_modal.add_title": "加自訂ê框á", + "account_edit.field_edit_modal.discard_confirm": "棄sak", + "account_edit.field_edit_modal.discard_message": "Lí有iáu bē儲存ê改變。Lí kám確定想欲棄sak in?", "account_edit.field_edit_modal.edit_title": "編自訂ê框á", - "account_edit.field_edit_modal.limit_header": "超過建議ê字數限制ah", - "account_edit.field_edit_modal.limit_message": "行動設備ê用者有可能bē當看著lí所有ê框á。", - "account_edit.field_edit_modal.link_emoji_warning": "Lán無建議佇URL內底用自訂ê emoji。為著避免用者舞花去,自訂ê框á若包含自訂emoji kap URL,kan-ta ē顯示做文字。", + "account_edit.field_edit_modal.length_warning": "建議ê字數限制超過ah。行動設備ê用者可能bē當讀著kui个框á ê內容。", + "account_edit.field_edit_modal.link_emoji_warning": "Gún無建議佇URL內底用自訂ê emoji。為著避免用者舞花去,自訂ê框á若包含自訂emoji kap URL,kan-ta ē顯示做文字。", "account_edit.field_edit_modal.name_hint": "例:「個人網站」", "account_edit.field_edit_modal.name_label": "標簽", "account_edit.field_edit_modal.url_warning": "若beh加連結,請佇起頭包含 {protocol}。", @@ -197,6 +210,8 @@ "account_edit.image_edit.alt_edit_button": "編說明文字", "account_edit.image_edit.remove_button": "Suá掉圖片", "account_edit.image_edit.replace_button": "取代圖片", + "account_edit.item_list.delete": "Thâi {name}", + "account_edit.item_list.edit": "編 {name}", "account_edit.name_modal.add_title": "加添顯示ê名", "account_edit.name_modal.edit_title": "編顯示ê名", "account_edit.profile_tab.button_label": "自訂", @@ -208,8 +223,6 @@ "account_edit.profile_tab.show_media.title": "展示「媒體」分頁", "account_edit.profile_tab.show_media_replies.description": "若是啟用,媒體分頁展示lí ê PO文kap對別lâng ê PO文ê回應。", "account_edit.profile_tab.show_media_replies.title": "佇媒體分頁內包含回應", - "account_edit.profile_tab.subtitle": "自訂lí ê個人資料ê分頁kap顯示ê內容。", - "account_edit.profile_tab.title": "個人資料分頁設定", "account_edit.save": "儲存", "account_edit.upload_modal.back": "轉去", "account_edit.upload_modal.done": "做好ah", @@ -219,8 +232,10 @@ "account_edit.upload_modal.step_upload.dragging": "Giú kàu tsia傳上去", "account_edit.upload_modal.step_upload.header": "揀圖片", "account_edit.upload_modal.step_upload.hint": "WEBP、PNG、GIF á是 JPG 格式,上大 {limit}MB。{br}圖會伸kiu kàu {width}x{height} px。", - "account_edit.upload_modal.title_add": "加個人資料ê相", - "account_edit.upload_modal.title_replace": "替換個人資料ê相", + "account_edit.upload_modal.title_add.avatar": "加個人資料ê相", + "account_edit.upload_modal.title_add.header": "加封面ê相片", + "account_edit.upload_modal.title_replace.avatar": "替換個人資料ê相", + "account_edit.upload_modal.title_replace.header": "替換封面ê相片", "account_edit.verified_modal.details": "用驗證連kàu個人網站ê連結來加添lí ê Mastodon個人檔案ê通信ê程度。下kha是運作ê方法:", "account_edit.verified_modal.invisible_link.details": "加連結kàu lí ê網頁頭(header)。上重要ê部份是 rel=\"me\",伊防止通過用者生成ê網站內容來做假包。Lí甚至佇網頁ê header毋免用 {tag},反轉用link標簽,但是HTML定著佇無執行JavaScript ê時陣,就ē當接近使用。", "account_edit.verified_modal.invisible_link.summary": "Án-tsuánn khàm掉tsit ê連結?", @@ -229,11 +244,13 @@ "account_edit.verified_modal.step2.header": "Kā lí ê網站加做自訂ê框á", "account_edit.verified_modal.title": "Án-tsuánn加驗證過ê連結", "account_edit_tags.add_tag": "加 #{tagName}", - "account_edit_tags.column_title": "編收藏ê hashtag", - "account_edit_tags.help_text": "收藏ê hashtag幫tsān用者發現kap hām lí ê個人資料互動。In會成做過濾器,佇lí ê個人資料頁ê活動內底出現。", + "account_edit_tags.column_title": "編標簽", + "account_edit_tags.help_text": "特色ê hashtag幫tsān用者發現kap hām lí ê個人資料互動。In會成做過濾器,佇lí ê個人資料頁ê活動內底出現。", + "account_edit_tags.max_tags_reached": "Lí已經加kàu特色ê hashtag數ê盡磅ah。", "account_edit_tags.search_placeholder": "編輯hashtag……", "account_edit_tags.suggestions": "建議:", "account_edit_tags.tag_status_count": "{count, plural, other {# 篇PO文}}", + "account_list.total": "{total, plural, other {# ê口座}}", "account_note.placeholder": "Tshi̍h tse加註kha", "admin.dashboard.daily_retention": "註冊以後ê用者維持率(用kang計算)", "admin.dashboard.monthly_retention": "註冊以後ê用者維持率", @@ -338,7 +355,7 @@ "closed_registrations_modal.find_another_server": "Tshuē別ê服侍器", "closed_registrations_modal.preamble": "因為Mastodon非中心化,所以bô論tī tá tsi̍t ê服侍器建立口座,lí lóng ē當跟tuè tsi̍t ê服侍器ê逐ê lâng,kap hām in交流。Lí iā ē當ka-tī起tsi̍t ê站!", "closed_registrations_modal.title": "註冊 Mastodon ê口座", - "collection.share_modal.share_link_label": "邀請分享ê連結", + "collection.share_modal.share_link_label": "分享連結", "collection.share_modal.share_via_post": "PO佇Mastodon頂", "collection.share_modal.share_via_system": "分享kàu……", "collection.share_modal.title": "分享收藏", @@ -346,8 +363,11 @@ "collection.share_template_other": "緊看覓chit ê時行ê收藏:{link}", "collection.share_template_own": "緊看覓我ê收藏:{link}", "collections.account_count": "{count, plural, other {# ê口座}}", - "collections.accounts.empty_description": "加lí跟tuè ê口座,上tsē {count} ê", + "collections.accounts.empty_description": "加上tsē {count} ê口座", + "collections.accounts.empty_editor_title": "Tsit ê 收藏內底iáu無半ê lâng", "collections.accounts.empty_title": "收藏內底無半項", + "collections.block_collection_owner": "封鎖口座", + "collections.by_account": "tuì {account_handle}", "collections.collection_description": "說明", "collections.collection_language": "語言", "collections.collection_language_none": "無", @@ -356,47 +376,51 @@ "collections.confirm_account_removal": "Lí確定beh對收藏suá掉tsit ê口座?", "collections.content_warning": "內容警告", "collections.continue": "繼續", - "collections.create.accounts_subtitle": "Kan-ta通加lí所綴而且選擇加入探索ê。", + "collections.copy_link": "Khóo-pih連結", + "collections.copy_link_confirmation": "Khóo-pih收藏ê連結kàu剪貼簿á", "collections.create.accounts_title": "Lí想beh佇收藏內底予siáng標做特色ê?", "collections.create.basic_details_title": "基本ê資料", "collections.create.steps": "第 {step} 步,總共 {total} 步", - "collections.create_a_collection_hint": "建立收藏來hām別lâng推薦á是分享lí上kah意ê口座。", "collections.create_collection": "建立收藏", "collections.delete_collection": "Thâi掉收藏", "collections.description_length_hint": "限制 100 字", - "collections.detail.accept_inclusion": "OK", - "collections.detail.accounts_heading": "口座", - "collections.detail.author_added_you": "{author} kā lí加kàu tsit ê收藏", - "collections.detail.curated_by_author": "{author} 揀ê", - "collections.detail.curated_by_you": "Lí揀ê", + "collections.detail.author_added_you_on_date": "{author} 佇 {date} kā lí加入", "collections.detail.loading": "載入收藏……", - "collections.detail.other_accounts_in_collection": "Tsit ê收藏內ê別lâng:", "collections.detail.revoke_inclusion": "Kā我suá掉", + "collections.detail.sensitive_content": "敏感ê內容", "collections.detail.sensitive_note": "Tsit ê收藏包含對一寡用者敏感ê口座kap內容。", "collections.detail.share": "分享tsit ê收藏", + "collections.detail.you_are_in_this_collection": "Lí已經hőng加kàu tsit ê收藏", "collections.edit_details": "編輯詳細", - "collections.error_loading_collections": "佇載入lí ê收藏ê時陣出tshê。", - "collections.hints.accounts_counter": "{count} / {max} ê口座", + "collections.hidden_accounts_description": "您有封鎖á是靜音{count, plural, one {tsit ê用者} other {tsiah ê用者}}", + "collections.hidden_accounts_link": "{count, plural, other {# ê隱藏ê口座}}", + "collections.hints.accounts_counter": "{count}/{max} ê口座", "collections.last_updated_at": "上尾更新tī:{date}", "collections.manage_accounts": "管理口座", "collections.mark_as_sensitive": "標做敏感ê", "collections.mark_as_sensitive_hint": "Kā收藏ê描述kap口座tshàng佇內容警告ê後壁。收藏ê名猶原會當看。", + "collections.maximum_collection_count_description": "Lí ê服侍器允准增加kàu上tsē {count} ê收藏。", + "collections.maximum_collection_count_reached": "Lí已經建立kàu收藏數ê盡磅ah", "collections.name_length_hint": "限制 40 字", "collections.new_collection": "新ê收藏", - "collections.no_collections_yet": "Iáu無收藏。", - "collections.old_last_post_note": "頂改佇超過一禮拜進前PO文", - "collections.remove_account": "Suá掉tsit ê口座", + "collections.remove_account": "Suá掉", "collections.report_collection": "檢舉tsit ê收藏", "collections.revoke_collection_inclusion": "Kā我對收藏內底suá掉", "collections.revoke_inclusion.confirmation": "Lí已經對「{collection}」hőng suá掉", "collections.revoke_inclusion.error": "出tshê ah,請小等leh koh試。", - "collections.search_accounts_label": "Tshuē口座來加添……", + "collections.search_accounts_label": "Tshuē口座來加添", "collections.search_accounts_max_reached": "Lí已經加kàu口座數ê盡磅ah。", "collections.sensitive": "敏感ê", + "collections.share_short": "分享", + "collections.suggestions.can_not_add": "Bē當hőng加添", + "collections.suggestions.can_not_add_desc": "Tsiah ê口座可能選擇退出探索,或者是in可能佇無支援收藏ê服侍器頂。", + "collections.suggestions.must_follow": "Lí著sing跟tuè", + "collections.suggestions.must_follow_desc": "Tsiah ê口座審查所有跟tuè ê請求。跟tuè ê tsiah通kā in加入去收藏內底。", "collections.topic_hint": "加 hashtag,幫tsān別lâng了解tsit ê收藏ê主題。", "collections.topic_special_chars_hint": "儲存ê時陣ê suá掉特殊字元", + "collections.unlisted_collections_description": "Chiah ê buē佇lí ê個人資料顯示予別lâng看。毋koh有tsit ê連結ê ē當發現in。", + "collections.unlisted_collections_with_count": "無公開ê收藏({count})", "collections.view_collection": "看收藏", - "collections.view_other_collections_by_user": "看tsit ê用者ê別ê收藏", "collections.visibility_public": "公共ê", "collections.visibility_public_hint": "佇tshiau-tshuē結果kap別位有推薦ê所在通發現。", "collections.visibility_title": "通看ê程度", @@ -405,7 +429,6 @@ "column.about": "概要", "column.blocks": "封鎖ê用者", "column.bookmarks": "冊籤", - "column.collections": "我ê收藏", "column.community": "本地ê時間線", "column.create_list": "建立列單", "column.direct": "私人ê提起", @@ -422,6 +445,7 @@ "column.lists": "列單", "column.mutes": "消音ê用者", "column.notifications": "通知", + "column.other_collections": "{name} ê收藏", "column.pins": "釘起來ê PO文", "column.public": "聯邦ê時間線", "column_back_button.label": "頂頁", @@ -485,12 +509,13 @@ "confirmations.discard_draft.post.title": "Kám beh棄sak lí PO文ê草稿?", "confirmations.discard_edit_media.confirm": "棄sak", "confirmations.discard_edit_media.message": "Lí佇媒體敘述á是先看māi ê所在有iáu buē儲存ê改變,kám beh kā in棄sak?", - "confirmations.follow_to_collection.confirm": "跟tuè,加入kàu收藏", - "confirmations.follow_to_collection.message": "Beh kā {name} 加添kàu收藏,lí tio̍h先跟tuè伊。", - "confirmations.follow_to_collection.title": "敢beh跟tuè口座?", "confirmations.follow_to_list.confirm": "跟tuè,加入kàu列單", "confirmations.follow_to_list.message": "Beh kā {name} 加添kàu列單,lí tio̍h先跟tuè伊。", "confirmations.follow_to_list.title": "Kám beh跟tuè tsit ê用者?", + "confirmations.hide_featured_tab.confirm": "Khàm掉分頁", + "confirmations.hide_featured_tab.intro": "Lí不管時ē當佇編輯個人資料→個人資料分頁設定下kha改tse。", + "confirmations.hide_featured_tab.message": "Tse ē kā佇 {serverName} kap別ê pháng上新版本ê Mastodon ê服侍器ê用者khàm掉分頁。其他界面ê顯示可能無kâng款。", + "confirmations.hide_featured_tab.title": "敢beh khàm掉「精選ê」分頁?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "Lí kám確定beh登出?", "confirmations.logout.title": "Lí kám beh登出?", @@ -529,6 +554,7 @@ "content_warning.hide": "Am-khàm PO文", "content_warning.show": "Mā tio̍h顯示", "content_warning.show_more": "其他內容", + "content_warning.show_short": "顯示", "conversation.delete": "Thâi掉會話", "conversation.mark_as_read": "標做有讀", "conversation.open": "顯示會話", @@ -569,6 +595,14 @@ "domain_pill.your_server": "Lí數位ê厝,內底有lí所有ê PO文。無kah意?Ē當轉kàu別ê服侍器,koh保有跟tuè lí êl âng。.", "domain_pill.your_username": "Lí 佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。", "dropdown.empty": "揀選項", + "email_subscriptions.email": "電子phue箱", + "email_subscriptions.form.action": "訂", + "email_subscriptions.form.bottom": "無開Mastodon ê口座,mā ē當佇收件箱收著PO文。不管時lóng ē當取消訂。其他資訊,請參考隱私權政策。", + "email_subscriptions.form.title": "訂 {name} ê電子phue更新", + "email_subscriptions.submitted.lead": "請檢查lí ê收件箱來完成訂電子批ê更新。", + "email_subscriptions.submitted.title": "上尾步", + "email_subscriptions.validation.email.blocked": "封鎖ê電子phue箱提供者", + "email_subscriptions.validation.email.invalid": "無效ê電子phue地址", "embed.instructions": "Khóo-pih 下kha ê程式碼,來kā tsit篇PO文tàu佇lí ê網站。", "embed.preview": "伊e án-ne顯示:\n", "emoji_button.activity": "活動", @@ -586,9 +620,9 @@ "emoji_button.search_results": "Tshiau-tshuē ê結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅行kap地點", - "empty_column.account_featured.me": "Lí iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?", - "empty_column.account_featured.other": "{acct} iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?", - "empty_column.account_featured_other.unknown": "Tsit ê口座iáu無任何ê特色內容。", + "empty_column.account_featured_self.no_collections_button": "建立收藏", + "empty_column.account_featured_self.pre_collections": "請期待收藏", + "empty_column.account_featured_unknown.other": "Tsit ê口座iáu無收藏siánn物。", "empty_column.account_hides_collections": "Tsit位用者選擇無愛公開tsit ê資訊", "empty_column.account_suspended": "口座已經受停止", "empty_column.account_timeline": "Tsia無PO文!", @@ -628,6 +662,10 @@ "featured_carousel.header": "{count, plural, one {{counter} 篇} other {{counter} 篇}} 釘起來ê PO文", "featured_carousel.slide": "{max, number} 篇PO文內底ê第 {current, number} 篇", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Tsit tsām-á lí有PO關係{items} ê文。敢beh加tsiah ê kàu 特色ê hashtag?", + "featured_tags.suggestions.add": "加", + "featured_tags.suggestions.added": "請隨時佇編輯個人資料 > 特色hashtag管理lí ê特色hashtag。", + "featured_tags.suggestions.dismiss": "毋免,多謝。", "filter_modal.added.context_mismatch_explanation": "Tsit ê過濾器類別bē當適用佇lí所接近使用ê PO文ê情境。若是lí mā beh佇tsit ê情境過濾tsit ê PO文,lí著編輯過濾器。.", "filter_modal.added.context_mismatch_title": "本文無sio合!", "filter_modal.added.expired_explanation": "Tsit ê過濾器類別過期ah,lí需要改到期ê日期來繼續用。", @@ -670,7 +708,9 @@ "follow_suggestions.who_to_follow": "Thang tuè ê", "followed_tags": "跟tuè ê hashtag", "followers.hide_other_followers": "Tsit位用者選擇mài公開跟tuè伊ê", + "followers.title": "Teh跟tuè {name}", "following.hide_other_following": "Tsit位用者選擇mài公開伊跟tuè ê別lâng", + "following.title": "Hōo {name} 跟tuè", "footer.about": "概要", "footer.about_mastodon": "關係Mastodon", "footer.about_server": "關係 {domain}", @@ -682,6 +722,7 @@ "footer.source_code": "看原始碼", "footer.status": "狀態", "footer.terms_of_service": "服務規定", + "form_error.blank": "框á bē當空白。", "form_field.optional": "(通揀)", "generic.saved": "儲存ah", "getting_started.heading": "開始用", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index 2d861e470be3a1..9ab7a536583353 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -18,19 +18,15 @@ "account.block_domain": "{domain} डोमेनलाई ब्लक गर्नुहोस्", "account.block_short": "ब्लक", "account.blocked": "ब्लक गरिएको", - "account.blocking": "ब्लक गरिएको", "account.cancel_follow_request": "फलो अनुरोध रद्द गर्नुहोस", "account.copy": "प्रोफाइलको लिङ्क प्रतिलिपि गर्नुहोस्", "account.direct": "@{name} लाई निजी रूपमा उल्लेख गर्नुहोस्", "account.disable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित नगर्नुहोस्", - "account.domain_blocking": "ब्लक गरिएको डोमेन", "account.edit_profile": "प्रोफाइल सम्पादन गर्नुहोस्", "account.enable_notifications": "@{name} ले पोस्ट गर्दा मलाई सूचित गर्नुहोस्", "account.endorse": "प्रोफाइलमा फिचर गर्नुहोस्", "account.featured": "फिचर गरिएको", "account.featured.accounts": "प्रोफाइलहरू", - "account.featured.hashtags": "ह्यासट्यागहरू", - "account.featured_tags.last_status_never": "कुनै पोस्ट छैन", "account.follow": "फलो गर्नुहोस", "account.follow_back": "फलो ब्याक गर्नुहोस्", "account.followers": "फलोअरहरु", @@ -50,11 +46,9 @@ "account.mute_notifications_short": "सूचनाहरू म्यूट गर्नुहोस्", "account.mute_short": "म्युट", "account.muted": "म्युट गरिएको", - "account.muting": "म्यूट गरिएको", "account.mutual": "तपाईंहरु एकअर्कालाई फलो गर्नुहुन्छ", "account.no_bio": "कुनै विवरण प्रदान गरिएको छैन।", "account.posts": "पोस्टहरू", - "account.posts_with_replies": "पोस्ट र जवाफहरू", "account.remove_from_followers": "{name}लाई फलोअरहरूबाट हटाउनुहोस्", "account.report": "@{name}लाई रिपोर्ट गर्नुहोस्", "account.requested_follow": "{name} ले तपाईंलाई फलो गर्न अनुरोध गर्नुभएको छ", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 3be1d0981468b8..67173f6eae0e2e 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -28,12 +28,10 @@ "account.block_domain": "Alles van {domain} blokkeren", "account.block_short": "Blokkeren", "account.blocked": "Geblokkeerd", - "account.blocking": "Geblokkeerd", "account.cancel_follow_request": "Ontvolgen", "account.copy": "Link naar profiel kopiëren", "account.direct": "@{name} een privébericht sturen", "account.disable_notifications": "Geen melding meer geven wanneer @{name} een bericht plaatst", - "account.domain_blocking": "Server geblokkeerd", "account.edit_note": "Persoonlijke opmerking bewerken", "account.edit_profile": "Profiel bewerken", "account.edit_profile_short": "Bewerken", @@ -45,9 +43,7 @@ "account.featured": "Uitgelicht", "account.featured.accounts": "Profielen", "account.featured.collections": "Verzamelingen", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Laatste bericht op {date}", - "account.featured_tags.last_status_never": "Geen berichten", + "account.featured.new_collection": "Nieuwe verzameling", "account.field_overflow": "Volledige inhoud tonen", "account.filters.all": "Alle activiteit", "account.filters.boosts_toggle": "Boosts tonen", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ga naar profiel", "account.hide_reblogs": "Boosts van @{name} verbergen", "account.in_memoriam": "In memoriam.", - "account.joined_short": "Geregistreerd op", + "account.join_modal.day": "Dag", + "account.join_modal.me": "Je bent op {server} sinds", + "account.join_modal.me_anniversary": "Fijne Fediversary! Je bent op {server} sinds", + "account.join_modal.me_today": "Het is je eerste dag op {server}!", + "account.join_modal.other": "{name} is op {server} sinds", + "account.join_modal.other_today": "Het is voor {name} de eerste dag op {server}!", + "account.join_modal.share.celebrate": "Deel een feestelijk bericht", + "account.join_modal.share.intro": "Deel een introductie", + "account.join_modal.share.welcome": "Deel een welkomstbericht", + "account.join_modal.years": "{number, plural, one {jaar} other {jaar}}", + "account.joined_short": "Sinds", "account.languages": "Getoonde talen wijzigen", + "account.last_active": "Laatst actief", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is ingesteld op vergrendeld. De eigenaar beoordeelt handmatig wie diegene kan volgen.", "account.media": "Media", @@ -86,7 +93,7 @@ "account.menu.copy": "Link kopiëren", "account.menu.direct": "Privébericht", "account.menu.hide_reblogs": "Boosts op tijdlijn verbergen", - "account.menu.mention": "Vermelding", + "account.menu.mention": "Vermelden", "account.menu.mute": "Account negeren", "account.menu.note.description": "Alleen voor jou zichtbaar", "account.menu.open_original_page": "Op {domain} bekijken", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Meldingen negeren", "account.mute_short": "Negeren", "account.muted": "Genegeerd", - "account.muting": "Genegeerd", "account.mutual": "Jullie volgen elkaar", + "account.name.copy": "Fediverse-adres kopiëren", "account.name.help.domain": "{domain} is de server waar zich het profiel en de berichten van de gebruiker bevinden.", "account.name.help.domain_self": "{domain} is jouw server waar zich jouw profiel en berichten bevinden.", - "account.name.help.footer": "Net zoals je e-mails kunt verzenden naar mensen met verschillende e-mailproviders, kun je interactie hebben met mensen op andere Mastodon-servers – en met iedereen op andere social apps, die met behulp van het ActivityPub-protocol met Mastodon kunnen communiceren.", + "account.name.help.footer": "Net zoals je e-mails kunt verzenden naar mensen met verschillende e-mailproviders, kun je interactie hebben met mensen op andere Mastodon-servers en met iedereen op andere sociale apps die met Mastodon compatibel zijn.", "account.name.help.header": "Een fediverse-adres valt te vergelijken met een e-mailadres", "account.name.help.username": "{username} is de gebruikersnaam van het account op hun server. Het is mogelijk dat iemand anders dezelfde gebruikersnaam op een andere server heeft.", "account.name.help.username_self": "{username} is jouw gebruikersnaam op deze server. Het is mogelijk dat iemand anders dezelfde gebruikersnaam op een andere server heeft.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Bewerken", "account.note.title": "Persoonlijke opmerking (alleen zichtbaar voor jou)", "account.open_original_page": "Originele pagina openen", + "account.pending": "In afwachting", "account.posts": "Berichten", - "account.posts_with_replies": "Reacties", "account.remove_from_followers": "{name} als volger verwijderen", "account.report": "@{name} rapporteren", "account.requested_follow": "{name} wil jou graag volgen", - "account.requests_to_follow_you": "Wil jou graag volgen", "account.share": "Account van @{name} delen", "account.show_reblogs": "Boosts van @{name} tonen", "account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}", @@ -141,35 +147,43 @@ "account.unmute": "@{name} niet langer negeren", "account.unmute_notifications_short": "Meldingen niet langer negeren", "account.unmute_short": "Niet langer negeren", + "account_edit.advanced_settings.bot_hint": "Maak aan anderen duidelijk dat dit account voornamelijk automatische acties uitvoert en dat deze waarschijnlijk niet wordt gecontroleerd", + "account_edit.advanced_settings.bot_label": "Geautomatiseerd account", + "account_edit.advanced_settings.title": "Geavanceerde instellingen", + "account_edit.bio.add_label": "Biografie toevoegen", + "account_edit.bio.edit_label": "Biografie bewerken", "account_edit.bio.placeholder": "Vertel iets over jezelf, zodat anderen inzicht krijgen in wat voor persoon je bent.", "account_edit.bio.title": "Biografie", "account_edit.bio_modal.add_title": "Biografie toevoegen", "account_edit.bio_modal.edit_title": "Biografie bewerken", - "account_edit.button.add": "{item} toevoegen", - "account_edit.button.delete": "{item} verwijderen", - "account_edit.button.edit": "{item} bewerken", "account_edit.column_button": "Klaar", "account_edit.column_title": "Profiel bewerken", - "account_edit.custom_fields.name": "veld", + "account_edit.custom_fields.add_label": "Veld toevoegen", + "account_edit.custom_fields.edit_label": "Veld bewerken", "account_edit.custom_fields.placeholder": "Voeg je voornaamwoorden, externe links of iets anders toe dat je wilt delen.", "account_edit.custom_fields.reorder_button": "Velden opnieuw ordenen", "account_edit.custom_fields.tip_content": "Je kunt gemakkelijk je Mastodon-account geloofwaardig maken door links naar websites die van jou zijn te laten verifiëren.", "account_edit.custom_fields.tip_title": "Tip: Geverifieerde links toevoegen", "account_edit.custom_fields.title": "Extra velden", "account_edit.custom_fields.verified_hint": "Hoe voeg ik een geverifieerde link toe?", + "account_edit.display_name.add_label": "Weergavenaam toevoegen", + "account_edit.display_name.edit_label": "Weergavenaam bewerken", "account_edit.display_name.placeholder": "Je weergavenaam wordt op jouw profiel en op tijdlijnen weergegeven.", "account_edit.display_name.title": "Weergavenaam", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Hashtags toevoegen", "account_edit.featured_hashtags.placeholder": "Geef anderen een overzicht van en snel toegang tot je favoriete onderwerpen.", "account_edit.featured_hashtags.title": "Uitgelichte hashtags", - "account_edit.field_delete_modal.confirm": "Weet je zeker dat je dit aangepaste veld wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "account_edit.field_actions.delete": "Veld verwijderen", + "account_edit.field_actions.edit": "Veld bewerken", + "account_edit.field_delete_modal.confirm": "Weet je zeker dat je dit extra veld wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "account_edit.field_delete_modal.delete_button": "Verwijderen", - "account_edit.field_delete_modal.title": "Aangepast veld verwijderen?", - "account_edit.field_edit_modal.add_title": "Aangepast veld toevoegen", - "account_edit.field_edit_modal.edit_title": "Aangepast veld bewerken", - "account_edit.field_edit_modal.limit_header": "Aanbevolen tekenlimiet overschreden", - "account_edit.field_edit_modal.limit_message": "Mobiele gebruikers zien mogelijk het veld niet volledig.", - "account_edit.field_edit_modal.link_emoji_warning": "We raden aan om geen lokale emoji in combinatie met URL's te gebruiken. Aangepaste velden die beide bevatten worden alleen als tekst weergegeven, in plaats van als een link. Dit om verwarring voor de gebruiker te voorkomen.", + "account_edit.field_delete_modal.title": "Extra veld verwijderen?", + "account_edit.field_edit_modal.add_title": "Extra veld toevoegen", + "account_edit.field_edit_modal.discard_confirm": "Weggooien", + "account_edit.field_edit_modal.discard_message": "Je hebt niet-opgeslagen wijzigingen. Weet je zeker dat je ze wilt weggooien?", + "account_edit.field_edit_modal.edit_title": "Extra veld bewerken", + "account_edit.field_edit_modal.length_warning": "Aanbevolen tekenlimiet overschreden. Mobiele gebruikers zien mogelijk niet volledig je veld.", + "account_edit.field_edit_modal.link_emoji_warning": "We raden aan om geen lokale emoji in combinatie met URL's te gebruiken. Extra velden die beide bevatten worden alleen als tekst weergegeven, in plaats van als een link. Dit om verwarring voor de gebruiker te voorkomen.", "account_edit.field_edit_modal.name_hint": "Bijv. \"Persoonlijke website\"", "account_edit.field_edit_modal.name_label": "Label", "account_edit.field_edit_modal.url_warning": "Voeg {protocol} aan het begin toe om een link toe te voegen.", @@ -177,7 +191,7 @@ "account_edit.field_edit_modal.value_label": "Waarde", "account_edit.field_reorder_modal.drag_cancel": "Slepen is geannuleerd. Veld \"{item}\" werd geschrapt.", "account_edit.field_reorder_modal.drag_end": "Veld \"{item}\" werd geschrapt.", - "account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om de aangepaste velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld op diens nieuwe positie te laten vallen, of druk op escape om te annuleren.", + "account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om de extra velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld op diens nieuwe positie te laten vallen, of druk op escape om te annuleren.", "account_edit.field_reorder_modal.drag_move": "Veld \"{item}\" is verplaatst.", "account_edit.field_reorder_modal.drag_over": "Veld \"{item}\" is over \"{over}\" geplaatst.", "account_edit.field_reorder_modal.drag_start": "Opgepakt veld \"{item}\".", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Alt-tekst bewerken", "account_edit.image_edit.remove_button": "Afbeelding verwijderen", "account_edit.image_edit.replace_button": "Afbeelding vervangen", + "account_edit.item_list.delete": "{name} verwijderen", + "account_edit.item_list.edit": "{name} bewerken", "account_edit.name_modal.add_title": "Weergavenaam toevoegen", "account_edit.name_modal.edit_title": "Weergavenaam bewerken", "account_edit.profile_tab.button_label": "Aanpassen", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Tabblad 'Media' tonen", "account_edit.profile_tab.show_media_replies.description": "Wanneer dit is ingeschakeld, worden op het tabblad Media zowel jouw berichten en reacties op berichten van anderen weergegeven.", "account_edit.profile_tab.show_media_replies.title": "Jouw reacties aan het tabblad 'Media' toevoegen", - "account_edit.profile_tab.subtitle": "De tabbladen op je profiel aanpassen en wat er op wordt weergegeven.", - "account_edit.profile_tab.title": "Instellingen voor tabblad Profiel", "account_edit.save": "Opslaan", "account_edit.upload_modal.back": "Terug", "account_edit.upload_modal.done": "Klaar", @@ -219,21 +233,25 @@ "account_edit.upload_modal.step_upload.dragging": "Hierheen slepen om te uploaden", "account_edit.upload_modal.step_upload.header": "Kies een afbeelding", "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- of JPG-formaat, tot max. {limit}MB.{br}Afbeelding wordt geschaald naar {width}x{height}px.", - "account_edit.upload_modal.title_add": "Profielfoto toevoegen", - "account_edit.upload_modal.title_replace": "Profielfoto vervangen", + "account_edit.upload_modal.title_add.avatar": "Profielfoto toevoegen", + "account_edit.upload_modal.title_add.header": "Omslagfoto toevoegen", + "account_edit.upload_modal.title_replace.avatar": "Profielfoto vervangen", + "account_edit.upload_modal.title_replace.header": "Omslagfoto vervangen", "account_edit.verified_modal.details": "Maak je Mastodonprofiel geloofwaardig door links naar persoonlijke websites te verifiëren. Zo werkt het:", "account_edit.verified_modal.invisible_link.details": "Voeg de link aan de HTML van je website toe. Het belangrijkste onderdeel is rel=\"me\", waarmee wordt voorkomen dat websites met user-generated content geïmpersoneerd kunnen worden. Je kunt zelfs een -tag gebruiken binnen de -tag van je website in plaats van {tag}, maar de HTML moet zonder JavaScript toegankelijk zijn.", "account_edit.verified_modal.invisible_link.summary": "Hoe maak ik de link onzichtbaar?", "account_edit.verified_modal.step1.header": "Kopieer de onderstaande HTML-code en plak deze binnen de -tag van je website", - "account_edit.verified_modal.step2.details": "Als je je website al als een aangepast veld hebt toegevoegd, moet je deze verwijderen en opnieuw toevoegen om de verificatie te activeren.", - "account_edit.verified_modal.step2.header": "Voeg je website toe als een aangepast veld", + "account_edit.verified_modal.step2.details": "Wanneer je je website al als een extra veld hebt toegevoegd, moet je deze verwijderen en opnieuw toevoegen om de verificatie te activeren.", + "account_edit.verified_modal.step2.header": "Je website als een extra veld toevoegen", "account_edit.verified_modal.title": "Hoe voeg je een geverifieerde link toe", "account_edit_tags.add_tag": "#{tagName} toevoegen", - "account_edit_tags.column_title": "Uitgelichte hashtags bewerken", + "account_edit_tags.column_title": "Labels bewerken", "account_edit_tags.help_text": "Uitgelichte hashtags helpen gebruikers je profiel te ontdekken en om er interactie mee te communiceren. Ze verschijnen als filters op je Profielpagina onder het tabblad Activiteit.", + "account_edit_tags.max_tags_reached": "Maximum aantal uitgelichte hashtags bereikt.", "account_edit_tags.search_placeholder": "Voer een hashtag in…", "account_edit_tags.suggestions": "Suggesties:", "account_edit_tags.tag_status_count": "{count, plural, one {# bericht} other {# berichten}}", + "account_list.total": "{total, plural, one {# account} other {# accounts}}", "account_note.placeholder": "Klik om een opmerking toe te voegen", "admin.dashboard.daily_retention": "Retentiegraad van gebruikers per dag, vanaf registratie", "admin.dashboard.monthly_retention": "Retentiegraad van gebruikers per maand, vanaf registratie", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Een andere server zoeken", "closed_registrations_modal.preamble": "Mastodon is gedecentraliseerd. Op welke server je ook een account hebt, je kunt overal vandaan mensen op deze server volgen en er mee interactie hebben. Je kunt zelfs zelf een Mastodon-server hosten!", "closed_registrations_modal.title": "Registreren op Mastodon", - "collection.share_modal.share_link_label": "Uitnodigingslink delen", + "collection.share_modal.share_link_label": "Link delen", "collection.share_modal.share_via_post": "Bericht op Mastodon", "collection.share_modal.share_via_system": "Delen met…", "collection.share_modal.title": "Verzameling delen", @@ -346,8 +364,11 @@ "collection.share_template_other": "Bekijk deze coole verzameling: {link}", "collection.share_template_own": "Bekijk mijn nieuwe verzameling: {link}", "collections.account_count": "{count, plural, one {# account} other {# accounts}}", - "collections.accounts.empty_description": "Tot {count} accounts die je volgt toevoegen", + "collections.accounts.empty_description": "Tot {count} accounts toevoegen", + "collections.accounts.empty_editor_title": "Er is nog nog niemand in deze verzameling", "collections.accounts.empty_title": "Deze verzameling is leeg", + "collections.block_collection_owner": "Account blokkeren", + "collections.by_account": "door {account_handle}", "collections.collection_description": "Omschrijving", "collections.collection_language": "Taal", "collections.collection_language_none": "Geen", @@ -356,56 +377,65 @@ "collections.confirm_account_removal": "Weet je zeker dat je dit account uit deze verzameling wilt verwijderen?", "collections.content_warning": "Inhoudswaarschuwing", "collections.continue": "Doorgaan", - "collections.create.accounts_subtitle": "Alleen accounts die je volgt en ontdekt willen worden, kunnen worden toegevoegd.", + "collections.copy_link": "Link kopiëren", + "collections.copy_link_confirmation": "Verzamelinglink naar het klembord gekopieerd", "collections.create.accounts_title": "Wie wil je aan deze verzameling toevoegen?", "collections.create.basic_details_title": "Basisgegevens", "collections.create.steps": "Stap {step}/{total}", - "collections.create_a_collection_hint": "Een verzameling aanmaken om je favoriete accounts aan te bevelen of te delen met anderen.", "collections.create_collection": "Verzameling aanmaken", "collections.delete_collection": "Verzameling verwijderen", "collections.description_length_hint": "Maximaal 100 karakters", - "collections.detail.accept_inclusion": "Oké", - "collections.detail.accounts_heading": "Accounts", - "collections.detail.author_added_you": "{author} heeft je aan deze verzameling toegevoegd", - "collections.detail.curated_by_author": "Samengesteld door {author}", - "collections.detail.curated_by_you": "Samengesteld door jou", + "collections.detail.author_added_you_on_date": "{author} heeft je op {date} toegevoegd", "collections.detail.loading": "Verzameling laden…", - "collections.detail.other_accounts_in_collection": "Anderen in deze verzameling:", "collections.detail.revoke_inclusion": "Verwijder mij", + "collections.detail.sensitive_content": "Gevoelige inhoud", "collections.detail.sensitive_note": "Deze verzameling bevat accounts en inhoud die mogelijk gevoelig zijn voor sommige gebruikers.", "collections.detail.share": "Deze verzameling delen", + "collections.detail.you_are_in_this_collection": "Je wordt in deze verzameling uitgelicht", "collections.edit_details": "Gegevens bewerken", - "collections.error_loading_collections": "Er is een fout opgetreden bij het laden van je verzamelingen.", - "collections.hints.accounts_counter": "{count} / {max} accounts", + "collections.hidden_accounts_description": "Je hebt {count, plural, one {deze gebruiker} other {deze gebruikers}} geblokkeerd", + "collections.hidden_accounts_link": "{count, plural, one {# verborgen account} other {# verborgen accounts}}", + "collections.hints.accounts_counter": "{count}/{max} accounts", "collections.last_updated_at": "Laatst bijgewerkt: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Verzameling} other {# Verzamelingen}}", + "collections.list.created_by_author": "Aangemaakt door {name}", + "collections.list.created_by_you": "Aangemaakt door jou", + "collections.list.featuring_you": "Uitgelicht door jou", "collections.manage_accounts": "Accounts beheren", "collections.mark_as_sensitive": "Als gevoelig markeren", "collections.mark_as_sensitive_hint": "Verbergt de omschrijving en de accounts van de verzameling achter een waarschuwing. De naam van de verzameling blijft zichtbaar.", + "collections.maximum_collection_count_description": "Je server maakt het mogelijk om maximaal {count} verzamelingen aan te maken.", + "collections.maximum_collection_count_reached": "Je hebt het maximum aantal lijsten aangemaakt", "collections.name_length_hint": "Limiet van 40 tekens", "collections.new_collection": "Nieuwe verzameling", - "collections.no_collections_yet": "Nog geen verzamelingen.", - "collections.old_last_post_note": "Meer dan een week geleden voor het laatst een bericht geplaatst", - "collections.remove_account": "Dit account verwijderen", + "collections.pending_accounts.message": "Accounts tonen als in afwachting wanneer we wachten op een reactie van de gebruiker of hun server. Alleen jij kunt zien wanneer accounts in afwachting zijn.", + "collections.pending_accounts.title": "Waarom zie ik accounts die in afwachting zijn?", + "collections.remove_account": "Verwijderen", "collections.report_collection": "Deze verzameling rapporteren", "collections.revoke_collection_inclusion": "Mezelf uit deze verzameling verwijderen", "collections.revoke_inclusion.confirmation": "Je bent uit \"{collection}\" verwijderd", "collections.revoke_inclusion.error": "Er is een fout opgetreden. Probeer het later opnieuw.", - "collections.search_accounts_label": "Naar accounts zoeken om toe te voegen…", + "collections.search_accounts_label": "Naar een account zoeken om toe te voegen", "collections.search_accounts_max_reached": "Je hebt het maximum aantal accounts toegevoegd", "collections.sensitive": "Gevoelig", + "collections.share_short": "Delen", + "collections.suggestions.can_not_add": "Kan niet worden toegevoegd", + "collections.suggestions.can_not_add_desc": "Deze accounts willen mogelijk niet worden uitgelicht, of ze bevinden zich op een server die geen verzamelingen ondersteunt.", + "collections.suggestions.must_follow": "Moeten eerst gevolgd worden", + "collections.suggestions.must_follow_desc": "Deze accounts beoordelen alle volgverzoeken. Volgers kunnen hun aan verzamelingen toevoegen.", "collections.topic_hint": "Voeg een hashtag toe die anderen helpt het hoofdonderwerp van deze verzameling te begrijpen.", "collections.topic_special_chars_hint": "Speciale tekens worden bij het opslaan verwijderd", + "collections.unlisted_collections_description": "Deze verschijnen niet voor anderen op je profiel. Iedereen met de link kan ze ontdekken.", + "collections.unlisted_collections_with_count": "Onzichtbare verzamelingen ({count})", "collections.view_collection": "Verzameling bekijken", - "collections.view_other_collections_by_user": "Bekijk andere verzamelingen van deze gebruiker", "collections.visibility_public": "Openbaar", "collections.visibility_public_hint": "Te zien onder zoekresultaten en in andere gebieden waar aanbevelingen verschijnen.", "collections.visibility_title": "Zichtbaarheid", - "collections.visibility_unlisted": "Niet zichtbaar", + "collections.visibility_unlisted": "Onzichtbaar", "collections.visibility_unlisted_hint": "Zichtbaar voor iedereen met een link. Verborgen onder zoekresultaten en aanbevelingen.", "column.about": "Over", "column.blocks": "Geblokkeerde gebruikers", "column.bookmarks": "Bladwijzers", - "column.collections": "Mijn verzamelingen", "column.community": "Lokale tijdlijn", "column.create_list": "Lijst aanmaken", "column.direct": "Privéberichten", @@ -422,8 +452,10 @@ "column.lists": "Lijsten", "column.mutes": "Genegeerde gebruikers", "column.notifications": "Meldingen", + "column.other_collections": "Verzamelingen door {name}", "column.pins": "Vastgezette berichten", "column.public": "Globale tijdlijn", + "column.your_collections": "Jouw Verzamelingen", "column_back_button.label": "Terug", "column_header.hide_settings": "Instellingen verbergen", "column_header.moveLeft_settings": "Kolom naar links verplaatsen", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Conceptbericht verwijderen?", "confirmations.discard_edit_media.confirm": "Verwijderen", "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch verwijderen?", - "confirmations.follow_to_collection.confirm": "Volgen en aan verzameling toevoegen", - "confirmations.follow_to_collection.message": "Je moet {name} volgen om dit account aan een verzameling toe te kunnen voegen.", - "confirmations.follow_to_collection.title": "Account volgen?", "confirmations.follow_to_list.confirm": "Volgen en toevoegen aan de lijst", "confirmations.follow_to_list.message": "Je moet {name} volgen om dit account aan een lijst toe te kunnen voegen.", "confirmations.follow_to_list.title": "Gebruiker volgen?", + "confirmations.hide_featured_tab.confirm": "Tabblad verbergen", + "confirmations.hide_featured_tab.intro": "Je kunt dit op elk moment wijzigen onder Profiel bewerken > Instellingen voor Profieltabblad.", + "confirmations.hide_featured_tab.message": "Dit verbergt het tabblad voor gebruikers op {serverName} en andere servers met de meest recente versie van Mastodon. Dit kan op andere apparaten afwijken.", + "confirmations.hide_featured_tab.title": "Tabblad \"Uitgelicht\" verbergen?", "confirmations.logout.confirm": "Uitloggen", "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", "confirmations.logout.title": "Uitloggen?", @@ -529,6 +562,7 @@ "content_warning.hide": "Bericht verbergen", "content_warning.show": "Alsnog tonen", "content_warning.show_more": "Meer tonen", + "content_warning.show_short": "Tonen", "conversation.delete": "Gesprek verwijderen", "conversation.mark_as_read": "Als gelezen markeren", "conversation.open": "Gesprek tonen", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Jouw digitale thuis, waar al jouw berichten zich bevinden. Is deze server toch niet naar jouw wens? Dan kun je op elk moment naar een andere server verhuizen en ook jouw volgers overbrengen.", "domain_pill.your_username": "Jouw unieke identificatie-adres op deze server. Het is mogelijk dat er gebruikers met dezelfde gebruikersnaam op verschillende servers te vinden zijn.", "dropdown.empty": "Selecteer een optie", + "email_subscriptions.email": "E-mailadres", + "email_subscriptions.form.action": "Abonneren", + "email_subscriptions.form.bottom": "Krijg berichten in je e-mail zonder een Mastodon-account aan te maken. Je kunt je op elk moment uitschrijven. Bekijk het Privacybeleid voor meer informatie.", + "email_subscriptions.form.title": "Op e-mailupdates van {name} abonneren", + "email_subscriptions.submitted.lead": "Kijk in je e-mail voor een mail waarmee je het abbonement op de e-mailupdates kunt bevestigen.", + "email_subscriptions.submitted.title": "Nog één stap", + "email_subscriptions.validation.email.blocked": "Geblokkeerde e-mailprovider", + "email_subscriptions.validation.email.invalid": "Ongeldig e-mailadres", "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Zoekresultaten", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en locaties", - "empty_column.account_featured.me": "Je hebt nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?", - "empty_column.account_featured.other": "{acct} heeft nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?", - "empty_column.account_featured_other.unknown": "Dit account heeft nog niets uitgelicht.", + "empty_column.account_featured.other": "{acct} heeft nog niks uitgelicht.", + "empty_column.account_featured_self.no_collections_button": "Een verzameling aanmaken", + "empty_column.account_featured_self.no_collections_hide_tab": "In plaats daarvan dit tabblad verbergen", + "empty_column.account_featured_self.pre_collections": "Binnenkort: Verzamelingen", + "empty_column.account_featured_self.pre_collections_desc": "Met Verzamelingen (vanaf Mastodon 4.6) kun je jouw eigen gecureerde lijsten met accounts samenstellen om aan anderen aan te bevelen.", + "empty_column.account_featured_self.showcase_accounts": "Jouw favoriete accounts aanbevelen", + "empty_column.account_featured_self.showcase_accounts_desc": "Verzamelingen zijn gecureerde lijsten met accounts, om anderen te helpen meer van de Fediverse te ontdekken.", + "empty_column.account_featured_unknown.other": "Dit account heeft nog niks uitgelicht.", "empty_column.account_hides_collections": "Deze gebruiker heeft ervoor gekozen deze informatie niet beschikbaar te maken", "empty_column.account_suspended": "Account opgeschort", "empty_column.account_timeline": "Hier zijn geen berichten!", @@ -628,6 +675,10 @@ "featured_carousel.header": "{count, plural, one {Vastgezet bericht} other {Vastgezette berichten}}", "featured_carousel.slide": "Bericht {current, number} van {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Je hebt de afgelopen periode over {items} bericht. Deze toevoegen als uitgelichte hashtags?", + "featured_tags.suggestions.add": "Toevoegen", + "featured_tags.suggestions.added": "Je kunt je uitgelichte hashtags beheren onder Profiel bewerken > Uitgelichte hashtags.", + "featured_tags.suggestions.dismiss": "Nee, bedankt", "filter_modal.added.context_mismatch_explanation": "Deze filtercategorie is niet van toepassing op de context waarin je dit bericht hebt benaderd. Als je wilt dat het bericht ook in deze context wordt gefilterd, moet je het filter bewerken.", "filter_modal.added.context_mismatch_title": "Context komt niet overeen!", "filter_modal.added.expired_explanation": "Deze filtercategorie is verlopen. Je moet de vervaldatum wijzigen om de categorie toe te kunnen passen.", @@ -670,7 +721,9 @@ "follow_suggestions.who_to_follow": "Wie te volgen", "followed_tags": "Gevolgde hashtags", "followers.hide_other_followers": "Deze gebruiker heeft ervoor gekozen diens andere volgers niet zichtbaar te maken", + "followers.title": "{name} volgen", "following.hide_other_following": "Deze gebruiker heeft ervoor gekozen de rest van diens gevolgde accounts niet zichtbaar te maken", + "following.title": "Gevolgd door {name}", "footer.about": "Over", "footer.about_mastodon": "Over Mastodon", "footer.about_server": "Over {domain}", @@ -682,6 +735,7 @@ "footer.source_code": "Broncode bekijken", "footer.status": "Status", "footer.terms_of_service": "Gebruiksvoorwaarden", + "form_error.blank": "Veld mag niet leeg zijn.", "form_field.optional": "(optioneel)", "generic.saved": "Opgeslagen", "getting_started.heading": "Aan de slag", @@ -818,7 +872,7 @@ "lists.replies_policy.none": "Niemand", "lists.save": "Opslaan", "lists.search": "Zoeken", - "lists.show_replies_to": "Voeg antwoorden van lijstleden toe aan", + "lists.show_replies_to": "Ook reacties van lijstleden toevoegen", "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", "loading_indicator.label": "Laden…", "media_gallery.hide": "Verberg", @@ -865,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Menu voor gevolgde hashtags uitklappen", "navigation_panel.expand_lists": "Lijstmenu uitklappen", "not_signed_in_indicator.not_signed_in": "Je moet inloggen om toegang tot deze informatie te krijgen.", + "notification.added_to_collection": "{name} heeft jou aan een verzameling toegevoegd", "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}", @@ -874,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben zich geregistreerd", "notification.annual_report.message": "Jouw {year} #Wrapstodon staat klaar! Laat de hoogtepunten en memorabele momenten van jouw jaar zien op Mastodon!", "notification.annual_report.view": "#Wrapstodon bekijken", + "notification.collection_update": "{name} bewerkte een verzameling waar jij in zit", "notification.favourite": "{name} markeerde jouw bericht als favoriet", "notification.favourite.name_and_others_with_link": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben jouw bericht als favoriet gemarkeerd", "notification.favourite_pm": "{name} heeft je privébericht als favoriet gemarkeerd", @@ -904,7 +960,7 @@ "notification.reblog": "{name} boostte jouw bericht", "notification.reblog.name_and_others_with_link": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben jouw bericht geboost", "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.", + "notification.relationships_severance_event.account_suspension": "Een beheerder van {from} heeft {target} geschorst, wat betekent dat je geen updates meer van deze gebruiker kunt ontvangen of met deze gebruiker kunt communiceren.", "notification.relationships_severance_event.domain_block": "Een beheerder van {from} heeft {target} geblokkeerd, inclusief {followersCount} van jouw volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt.", "notification.relationships_severance_event.learn_more": "Meer informatie", "notification.relationships_severance_event.user_domain_block": "Je hebt {target} geblokkeerd, waarmee je {followersCount} van je volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt, bent verloren.", @@ -1137,6 +1193,7 @@ "server_banner.active_users": "actieve gebruikers", "server_banner.administered_by": "Beheerd door:", "server_banner.is_one_of_many": "{domain} is een van de vele onafhankelijke Mastodon-servers die je kunt gebruiken om deel te nemen aan de fediverse.", + "server_banner.more_about_this_server": "Meer informatie over deze server", "server_banner.server_stats": "Serverstats:", "sign_in_banner.create_account": "Registreren", "sign_in_banner.follow_anyone": "Volg iedereen in de fediverse en zie het allemaal in chronologische volgorde. Geen algoritmes, advertenties of clickbaits.", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index feb88565f8cfb2..3fbc7621eb775e 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -28,12 +28,10 @@ "account.block_domain": "Skjul alt frå {domain}", "account.block_short": "Blokker", "account.blocked": "Blokkert", - "account.blocking": "Blokkerer", "account.cancel_follow_request": "Trekk attende fylgeførespurnad", "account.copy": "Kopier lenka til profilen", "account.direct": "Nemn @{name} privat", "account.disable_notifications": "Slutt å varsle meg når @{name} skriv innlegg", - "account.domain_blocking": "Blokkerer domenet", "account.edit_note": "Rediger det personlege notatet", "account.edit_profile": "Rediger profil", "account.edit_profile_short": "Rediger", @@ -45,9 +43,6 @@ "account.featured": "Utvald", "account.featured.accounts": "Profilar", "account.featured.collections": "Samlingar", - "account.featured.hashtags": "Emneknaggar", - "account.featured_tags.last_status_at": "Sist nytta {date}", - "account.featured_tags.last_status_never": "Ingen innlegg", "account.field_overflow": "Vis heile innhaldet", "account.filters.all": "All aktivitet", "account.filters.boosts_toggle": "Vis framhevingar", @@ -75,6 +70,7 @@ "account.in_memoriam": "Til minne om.", "account.joined_short": "Vart med", "account.languages": "Endre språktingingar", + "account.last_active": "Sist aktiv", "account.link_verified_on": "Eigarskap for denne lenkja vart sist sjekka {date}", "account.locked_info": "Denne kontoen er privat. Eigaren kan sjølv velja kven som kan fylgja han.", "account.media": "Media", @@ -102,11 +98,10 @@ "account.mute_notifications_short": "Demp varslingar", "account.mute_short": "Demp", "account.muted": "Målbunden", - "account.muting": "Dempa", "account.mutual": "De fylgjer kvarandre", + "account.name.copy": "Kopier brukaradressa", "account.name.help.domain": "{domain} er tenaren som lagrar brukarprofilen og innlegga.", "account.name.help.domain_self": "{domain} er tenaren som lagrar brukarprofilen og innlegga dine.", - "account.name.help.footer": "På same måten som du kan senda epost til folk med ulike epostprogram og -kontoar, kan du kommunisera med folk på andre Mastodon-tenarar, og med folk på andre sosiale nettverk som samhandlar på same måte som Mastodon. Det er ActivityPub-protokollen.", "account.name.help.header": "Ei brukaradresse er som ei epostadresse", "account.name.help.username": "{username} er brukarnamnet til denne kontoen på tenaren deira. Folk på andre tenarar kan ha same brukarnamnet.", "account.name.help.username_self": "{username} er brukarnamnet ditt på denne tenaren. Folk på andre tenarar kan ha same brukarnamnet.", @@ -122,11 +117,9 @@ "account.note.title": "Personleg notat (berre synleg for deg)", "account.open_original_page": "Opne originalsida", "account.posts": "Tut", - "account.posts_with_replies": "Tut og svar", "account.remove_from_followers": "Fjern {name} frå fylgjarane dine", "account.report": "Rapporter @{name}", "account.requested_follow": "{name} har bedt om å få fylgja deg", - "account.requests_to_follow_you": "Folk som vil fylgja deg", "account.share": "Del @{name} sin profil", "account.show_reblogs": "Vis framhevingar frå @{name}", "account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", @@ -141,34 +134,42 @@ "account.unmute": "Opphev demping av @{name}", "account.unmute_notifications_short": "Opphev demping av varslingar", "account.unmute_short": "Opphev demping", + "account_edit.advanced_settings.bot_hint": "Varsla andre om at denne kontoen for det meste er automatisert og truleg ikkje blir sjekka jamnleg", + "account_edit.advanced_settings.bot_label": "Automatisert konto", + "account_edit.advanced_settings.title": "Avanserte innstillingar", + "account_edit.bio.add_label": "Skriv om deg sjølv", + "account_edit.bio.edit_label": "Rediger bio", "account_edit.bio.placeholder": "Skriv ei kort innleiing slik at andre kan sjå kven du er.", "account_edit.bio.title": "Om meg", "account_edit.bio_modal.add_title": "Skriv om deg sjølv", "account_edit.bio_modal.edit_title": "Endre bio", - "account_edit.button.add": "Legg til {item}", - "account_edit.button.delete": "Slett {item}", - "account_edit.button.edit": "Rediger {item}", "account_edit.column_button": "Ferdig", "account_edit.column_title": "Rediger profil", - "account_edit.custom_fields.name": "felt", + "account_edit.custom_fields.add_label": "Legg til felt", + "account_edit.custom_fields.edit_label": "Rediger felt", "account_edit.custom_fields.placeholder": "Legg til pronomen, lenkjer eller kva du elles vil dela.", "account_edit.custom_fields.reorder_button": "Omorganiser felt", "account_edit.custom_fields.tip_content": "Du kan auka truverdet til Mastodon-kontoen din ved å stadfesta lenker til nettstader du eig.", "account_edit.custom_fields.tip_title": "Tips: Legg til stadfesta lenker", "account_edit.custom_fields.title": "Eigne felt", "account_edit.custom_fields.verified_hint": "Korleis legg eg til ei stadfesta lenke?", + "account_edit.display_name.add_label": "Legg til synleg namn", + "account_edit.display_name.edit_label": "Endre synleg namn", "account_edit.display_name.placeholder": "Det synlege namnet ditt er det som syner på profilen din og i tidsliner.", "account_edit.display_name.title": "Synleg namn", - "account_edit.featured_hashtags.item": "emneknaggar", + "account_edit.featured_hashtags.edit_label": "Legg til emneknaggar", "account_edit.featured_hashtags.placeholder": "Hjelp andre å finna og få rask tilgang til favorittemna dine.", "account_edit.featured_hashtags.title": "Utvalde emneknaggar", + "account_edit.field_actions.delete": "Slett felt", + "account_edit.field_actions.edit": "Rediger felt", "account_edit.field_delete_modal.confirm": "Vil du sletta dette tilpassa feltet? Du kan ikkje angra.", "account_edit.field_delete_modal.delete_button": "Slett", "account_edit.field_delete_modal.title": "Slett tilpassa felt?", "account_edit.field_edit_modal.add_title": "Legg til eit tilpassa felt", + "account_edit.field_edit_modal.discard_confirm": "Forkast", + "account_edit.field_edit_modal.discard_message": "Du har ulagra endringar. Er du sikker på at du vil forkasta dei?", "account_edit.field_edit_modal.edit_title": "Rediger tilpassa felt", - "account_edit.field_edit_modal.limit_header": "Over maksgrensa for teikn", - "account_edit.field_edit_modal.limit_message": "Det er ikkje sikkert mobilbrukarar ser heile feltet ditt.", + "account_edit.field_edit_modal.length_warning": "Du har nåd den tilrådde maksgrensa for teikn. Mobilbrukarar ser truleg ikkje heile feltet.", "account_edit.field_edit_modal.link_emoji_warning": "Me rår frå å bruka eigne smilefjes kombinert med adresser. Tilpassa felt som inneheld båe, vil syna som berre tekst i staden for ei lenke, slik at lesarane ikkje blir forvirra.", "account_edit.field_edit_modal.name_hint": "Til dømes «Personleg nettstad»", "account_edit.field_edit_modal.name_label": "Etikett", @@ -197,6 +198,8 @@ "account_edit.image_edit.alt_edit_button": "Rediger skildring", "account_edit.image_edit.remove_button": "Fjern bilete", "account_edit.image_edit.replace_button": "Erstatt bilete", + "account_edit.item_list.delete": "Slett {name}", + "account_edit.item_list.edit": "Rediger {name}", "account_edit.name_modal.add_title": "Legg til synleg namn", "account_edit.name_modal.edit_title": "Endre synleg namn", "account_edit.profile_tab.button_label": "Tilpass", @@ -208,8 +211,6 @@ "account_edit.profile_tab.show_media.title": "Vis «Medium»-fana", "account_edit.profile_tab.show_media_replies.description": "Når medium-fana er i bruk, syner ho både innlegga dine og svar på andre folk sine innlegg.", "account_edit.profile_tab.show_media_replies.title": "Ta med svar i «Medium»-fana", - "account_edit.profile_tab.subtitle": "Tilpass fanene på profilen din og kva dei syner.", - "account_edit.profile_tab.title": "Innstillingar for profilfane", "account_edit.save": "Lagre", "account_edit.upload_modal.back": "Tilbake", "account_edit.upload_modal.done": "Ferdig", @@ -219,8 +220,10 @@ "account_edit.upload_modal.step_upload.dragging": "Slepp for å lasta opp", "account_edit.upload_modal.step_upload.header": "Vel eit bilete", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eller JPG-format, opp til {limit}MB.{br}Biletet blir skalert til {width}*{height} punkt.", - "account_edit.upload_modal.title_add": "Legg til profilbilete", - "account_edit.upload_modal.title_replace": "Byt ut profilbilete", + "account_edit.upload_modal.title_add.avatar": "Legg til profilbilete", + "account_edit.upload_modal.title_add.header": "Legg til forsidebilete", + "account_edit.upload_modal.title_replace.avatar": "Byt ut profilbilete", + "account_edit.upload_modal.title_replace.header": "Byt ut forsidebilete", "account_edit.verified_modal.details": "Auk truverdet til Mastodon-profilen din ved å stadfesta lenker til personlege nettstader. Slik verkar det:", "account_edit.verified_modal.invisible_link.details": "Den viktige delen er rel=\"me\", som på nettstader med brukargenerert innhald vil hindra at andre kan låst som dei er deg. Du kan til og med bruka link i staden for {tag} i toppteksten til sida, men HTML-koden må vera tilgjengeleg utan å måtte køyra JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Korleis gjer eg lenka usynleg?", @@ -229,11 +232,13 @@ "account_edit.verified_modal.step2.header": "Legg til nettstaden din som eige felt", "account_edit.verified_modal.title": "Korleis legg eg til ei stadfesta lenke", "account_edit_tags.add_tag": "Legg til #{tagName}", - "account_edit_tags.column_title": "Rediger utvalde emneknaggar", + "account_edit_tags.column_title": "Endre merkelappar", "account_edit_tags.help_text": "Utvalde emneknaggar hjelper folk å oppdaga og samhandla med profilen din. Dei blir viste som filter på aktivitetsoversikta på profilsida di.", + "account_edit_tags.max_tags_reached": "Du har nådd grensa for kor mange emneknaggar du kan ha.", "account_edit_tags.search_placeholder": "Skriv ein emneknagg…", "account_edit_tags.suggestions": "Framlegg:", "account_edit_tags.tag_status_count": "{count, plural, one {# innlegg} other {# innlegg}}", + "account_list.total": "{total, plural, one {# konto} other {# kontoar}}", "account_note.placeholder": "Klikk for å leggja til merknad", "admin.dashboard.daily_retention": "Mengda brukarar aktive ved dagar etter registrering", "admin.dashboard.monthly_retention": "Mengda brukarar aktive ved månader etter registrering", @@ -338,7 +343,6 @@ "closed_registrations_modal.find_another_server": "Finn ein annan tenar", "closed_registrations_modal.preamble": "Mastodon er desentralisert, så uansett kvar du opprettar ein konto, vil du kunne fylgje og samhandle med alle på denne tenaren. Du kan til og med ha din eigen tenar!", "closed_registrations_modal.title": "Registrer deg på Mastodon", - "collection.share_modal.share_link_label": "Delingslenke", "collection.share_modal.share_via_post": "Legg ut på Mastodon", "collection.share_modal.share_via_system": "Del med…", "collection.share_modal.title": "Del ei samling", @@ -346,55 +350,45 @@ "collection.share_template_other": "Sjekk denne samlinga: {link}", "collection.share_template_own": "Sjekk den nye samlinga mi: {link}", "collections.account_count": "{count, plural, one {# konto} other {# kontoar}}", - "collections.accounts.empty_description": "Legg til opp til {count} kontoar du fylgjer", "collections.accounts.empty_title": "Denne samlinga er tom", + "collections.by_account": "av {account_handle}", "collections.collection_description": "Skildring", + "collections.collection_language": "Språk", + "collections.collection_language_none": "Ingen", "collections.collection_name": "Namn", "collections.collection_topic": "Emne", "collections.confirm_account_removal": "Er du sikker på at du vil fjerna denne brukarkontoen frå samlinga?", "collections.content_warning": "Innhaldsåtvaring", "collections.continue": "Hald fram", - "collections.create.accounts_subtitle": "Du kan berre leggja til kontoar du fylgjer og som har sagt ja til å bli oppdaga.", "collections.create.accounts_title": "Kven vil du leggja vekt på denne samlinga?", "collections.create.basic_details_title": "Grunnleggjande opplysingar", "collections.create.steps": "Steg {step}/{total}", - "collections.create_a_collection_hint": "Lag ei samling for å tilrå eller dela favorittbrukarkontoane dine med andre.", "collections.create_collection": "Lag ei samling", "collections.delete_collection": "Slett samlinga", "collections.description_length_hint": "Maks 100 teikn", - "collections.detail.accept_inclusion": "Ok", - "collections.detail.accounts_heading": "Kontoar", - "collections.detail.author_added_you": "{author} la deg til i denne samlinga", - "collections.detail.curated_by_author": "Kuratert av {author}", - "collections.detail.curated_by_you": "Kuratert av deg", + "collections.detail.author_added_you_on_date": "{author} la deg til {date}", "collections.detail.loading": "Lastar inn samling…", - "collections.detail.other_accounts_in_collection": "Andre i denne samlinga:", "collections.detail.revoke_inclusion": "Fjern meg", + "collections.detail.sensitive_content": "Ømtolig innhald", "collections.detail.sensitive_note": "Denne samlinga inneheld kontoar og innhald som kan vera ømtolige for nokre menneske.", "collections.detail.share": "Del denne samlinga", + "collections.detail.you_are_in_this_collection": "Du er framheva i denne samlinga", "collections.edit_details": "Rediger detaljar", - "collections.error_loading_collections": "Noko gjekk gale då me prøvde å henta samlingane dine.", - "collections.hints.accounts_counter": "{count} av {max} kontoar", "collections.last_updated_at": "Sist oppdatert: {date}", "collections.manage_accounts": "Handter kontoar", "collections.mark_as_sensitive": "Merk som ømtolig", "collections.mark_as_sensitive_hint": "Gøymer skildringa og kontoane i samlinga bak ei innhaldsåtvaring. Namnet på samlinga blir framleis synleg.", "collections.name_length_hint": "Maks 40 teikn", "collections.new_collection": "Ny samling", - "collections.no_collections_yet": "Du har ingen samlingar enno.", - "collections.old_last_post_note": "Sist lagt ut for over ei veke sidan", - "collections.remove_account": "Fjern denne kontoen", "collections.report_collection": "Rapporter denne samlinga", "collections.revoke_collection_inclusion": "Fjern meg frå denne samlinga", "collections.revoke_inclusion.confirmation": "Du er fjerna frå «{collection}»", "collections.revoke_inclusion.error": "Noko gjekk gale, prøv att seinare.", - "collections.search_accounts_label": "Søk etter kontoar å leggja til…", "collections.search_accounts_max_reached": "Du har nådd grensa for kor mange kontoar du kan leggja til", "collections.sensitive": "Ømtolig", "collections.topic_hint": "Legg til ein emneknagg som hjelper andre å forstå hovudemnet for denne samlinga.", "collections.topic_special_chars_hint": "Spesialteikn vil bli fjerna ved lagring", "collections.view_collection": "Sjå samlinga", - "collections.view_other_collections_by_user": "Sjå andre samlingar frå denne personen", "collections.visibility_public": "Offentleg", "collections.visibility_public_hint": "Kan koma opp i søkjeresultat og andre stader der tilrådingar syner.", "collections.visibility_title": "Vising", @@ -403,7 +397,6 @@ "column.about": "Om", "column.blocks": "Blokkerte brukarar", "column.bookmarks": "Bokmerke", - "column.collections": "Samlingane mine", "column.community": "Lokal tidsline", "column.create_list": "Lag liste", "column.direct": "Private omtaler", @@ -483,9 +476,6 @@ "confirmations.discard_draft.post.title": "Forkast kladden?", "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.follow_to_collection.confirm": "Fylg og legg til samlinga", - "confirmations.follow_to_collection.message": "Du må fylgja {name} for å leggja dei til ei samling.", - "confirmations.follow_to_collection.title": "Fylg kontoen?", "confirmations.follow_to_list.confirm": "Fylg og legg til lista", "confirmations.follow_to_list.message": "Du må fylgja {name} for å leggja dei til ei liste.", "confirmations.follow_to_list.title": "Vil du fylgja brukaren?", @@ -527,6 +517,7 @@ "content_warning.hide": "Gøym innlegg", "content_warning.show": "Vis likevel", "content_warning.show_more": "Vis meir", + "content_warning.show_short": "Vis", "conversation.delete": "Slett samtale", "conversation.mark_as_read": "Marker som lesen", "conversation.open": "Sjå samtale", @@ -567,6 +558,14 @@ "domain_pill.your_server": "Din digitale heim, der alle innlegga dine bur. Liker du ikkje dette? Byt til ein ny tenar når som helst og ta med fylgjarane dine òg.", "domain_pill.your_username": "Din unike identifikator på denne tenaren. Det er mogleg å finne brukarar med same brukarnamn på forskjellige tenarar.", "dropdown.empty": "Vel eit alternativ", + "email_subscriptions.email": "Epost", + "email_subscriptions.form.action": "Abonner", + "email_subscriptions.form.bottom": "Få innlegg i innboksen din utan å laga ein Mastodon-konto. Meld deg av når du vil. Sjå personvernsida for meir info.", + "email_subscriptions.form.title": "Meld deg på epostoppdateringar frå {name}", + "email_subscriptions.submitted.lead": "Sjekk innboksen din for ein epost om korleis du fullfører abonnementet på epostoppdateringar.", + "email_subscriptions.submitted.title": "Eitt steg til", + "email_subscriptions.validation.email.blocked": "Blokkert epostleverandør", + "email_subscriptions.validation.email.invalid": "Ugyldig epostadresse", "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden nedanfor.", "embed.preview": "Slik kjem det til å sjå ut:", "emoji_button.activity": "Aktivitet", @@ -584,9 +583,9 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symbol", "emoji_button.travel": "Reise & stader", - "empty_column.account_featured.me": "Du har ikkje valt ut noko enno. Visste du at du kan velja ut emneknaggar du bruker mykje, og til og med venekontoar på profilen din?", - "empty_column.account_featured.other": "{acct} har ikkje valt ut noko enno. Visste du at du kan velja ut emneknaggar du bruker mykje, og til og med venekontoar på profilen din?", - "empty_column.account_featured_other.unknown": "Denne kontoen har ikkje valt ut noko enno.", + "empty_column.account_featured_self.no_collections_button": "Lag ei samling", + "empty_column.account_featured_self.pre_collections": "Fylg med for å sjå samlingar", + "empty_column.account_featured_unknown.other": "Denne kontoen har ikkje valt ut noko enno.", "empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg", "empty_column.account_suspended": "Kontoen er utestengd", "empty_column.account_timeline": "Ingen tut her!", @@ -626,6 +625,10 @@ "featured_carousel.header": "{count, plural, one {Festa innlegg} other {Festa innlegg}}", "featured_carousel.slide": "Innlegg {current, number} av {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "I det siste har du skrive om {items}. Vil du leggja til desse som framheva emneknaggar?", + "featured_tags.suggestions.add": "Legg til", + "featured_tags.suggestions.added": "Handter dei framheva emneknaggane dine når som helst under Rediger profil > Framheva emneknaggar.", + "featured_tags.suggestions.dismiss": "Nei takk", "filter_modal.added.context_mismatch_explanation": "Denne filterkategorien gjeld ikkje i den samanhengen du har lese dette innlegget. Viss du vil at innlegget skal filtrerast i denne samanhengen òg, må du endra filteret.", "filter_modal.added.context_mismatch_title": "Konteksten passar ikkje!", "filter_modal.added.expired_explanation": "Denne filterkategorien har gått ut på dato. Du må endre best før datoen for at den skal gjelde.", @@ -668,7 +671,9 @@ "follow_suggestions.who_to_follow": "Kven du kan fylgja", "followed_tags": "Fylgde emneknaggar", "followers.hide_other_followers": "Denne personen har valt å ikkje syna dei andre fylgjarane sine", + "followers.title": "Fylgjer {name}", "following.hide_other_following": "Denne personen har valt å ikkje syna kven andre dei fylgjer", + "following.title": "Fylgd av {name}", "footer.about": "Om", "footer.about_mastodon": "Om Mastodon", "footer.about_server": "Om {domain}", @@ -680,6 +685,7 @@ "footer.source_code": "Vis kjeldekode", "footer.status": "Status", "footer.terms_of_service": "Brukarvilkår", + "form_error.blank": "Feltet kan ikkje vera tomt.", "form_field.optional": "(valfritt)", "generic.saved": "Lagra", "getting_started.heading": "Kom i gang", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index c1a1e33e8452e5..47ffd1bd928e83 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -28,12 +28,10 @@ "account.block_domain": "Blokker domenet {domain}", "account.block_short": "Blokker", "account.blocked": "Blokkert", - "account.blocking": "Blokkerer", "account.cancel_follow_request": "Avbryt følgeforespørselen", "account.copy": "Kopier lenke til profil", "account.direct": "Nevn @{name} privat", "account.disable_notifications": "Slutt å varsle meg når @{name} legger ut innlegg", - "account.domain_blocking": "Blokkerer domene", "account.edit_note": "Rediger personlig notat", "account.edit_profile": "Rediger profil", "account.edit_profile_short": "Rediger", @@ -45,9 +43,6 @@ "account.featured": "Utvalgt", "account.featured.accounts": "Profiler", "account.featured.collections": "Samlinger", - "account.featured.hashtags": "Emneknagger", - "account.featured_tags.last_status_at": "Siste innlegg {date}", - "account.featured_tags.last_status_never": "Ingen Innlegg", "account.field_overflow": "Vis fullt innhold", "account.filters.all": "All aktivitet", "account.filters.boosts_toggle": "Vis fremhevinger", @@ -100,7 +95,6 @@ "account.mute_notifications_short": "Demp varsler", "account.mute_short": "Demp", "account.muted": "Dempet", - "account.muting": "Demper", "account.mutual": "Dere følger hverandre", "account.name.help.domain": "{domain} er serveren som inneholder profilen og innleggene for brukeren.", "account.name.help.domain_self": "{domain} er serveren som inneholder profilen og innleggene dine.", @@ -119,11 +113,9 @@ "account.note.title": "Personlig notat (bare synlig for deg)", "account.open_original_page": "Gå til originalsiden", "account.posts": "Innlegg", - "account.posts_with_replies": "Innlegg med svar", "account.remove_from_followers": "Fjern {name} fra følgere", "account.report": "Rapporter @{name}", "account.requested_follow": "{name} har bedt om å få følge deg", - "account.requests_to_follow_you": "Forespørsler om å 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}}", @@ -139,12 +131,8 @@ "account.unmute_notifications_short": "Opphev demping av varsler", "account.unmute_short": "Opphev demping", "account_edit.bio.placeholder": "Legg til en kort introduksjon for å hjelpe andre med å identifisere deg.", - "account_edit.button.add": "Legg til {item}", - "account_edit.button.delete": "Slett {item}", - "account_edit.button.edit": "Rediger {item}", "account_edit.column_button": "Ferdig", "account_edit.column_title": "Rediger profil", - "account_edit.custom_fields.name": "felt", "account_edit.custom_fields.reorder_button": "Omorganiser felter", "account_edit.custom_fields.tip_content": "Du kan enkelt øke troverdighet til Mastodon-kontoen din ved å verifisere koblinger til nettsider du eier.", "account_edit.custom_fields.tip_title": "Legg til bekreftede lenker", @@ -218,7 +206,6 @@ "closed_registrations_modal.find_another_server": "Finn en annen server", "closed_registrations_modal.preamble": "Mastodon er desentralisert, så uansett hvor du oppretter kontoen din, vil du kunne følge og samhandle med alle på denne serveren. Du kan til og med kjøre serveren selv!", "closed_registrations_modal.title": "Registrerer deg på Mastodon", - "collection.share_modal.share_link_label": "Invitasjonslenke for deling", "collection.share_modal.share_via_post": "Publiser på Mastodon", "collection.share_modal.share_via_system": "Del med…", "collection.share_modal.title": "Del samling", @@ -287,7 +274,6 @@ "confirmations.delete_list.title": "Slett liste?", "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.follow_to_collection.title": "Følg konto?", "confirmations.follow_to_list.confirm": "Følg og legg til i liste", "confirmations.follow_to_list.message": "Du må følge {name} for å kunne legge vedkommende til i en liste.", "confirmations.follow_to_list.title": "Følg bruker?", @@ -380,9 +366,6 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Reise & steder", - "empty_column.account_featured.me": "Du har ikke fremhevet noe ennå. Visste du at du kan fremheve emneknaggene du bruker mest, eller til og med dine venners profilsider?", - "empty_column.account_featured.other": "{acct} har ikke fremhevet noe ennå. Visste du at du kan fremheve emneknaggene du bruker mest, eller til og med dine venners profilsider?", - "empty_column.account_featured_other.unknown": "Denne kontoen har ikke fremhevet noe ennå.", "empty_column.account_hides_collections": "Denne brukeren har valgt å ikke gjøre denne informasjonen tilgjengelig", "empty_column.account_suspended": "Kontoen er suspendert", "empty_column.account_timeline": "Ingen innlegg her!", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index a00a2ab6c11404..cf13737c7bc976 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -20,7 +20,6 @@ "account.block_domain": "Tot amagar del domeni {domain}", "account.block_short": "Blocar", "account.blocked": "Blocat", - "account.blocking": "Blocatge", "account.cancel_follow_request": "Retirar la demanda d’abonament", "account.copy": "Copiar lo ligam del perfil", "account.direct": "Mencionar @{name} en privat", @@ -33,9 +32,6 @@ "account.familiar_followers_one": "Seguit per {name1}", "account.familiar_followers_two": "Seguit per {name1} e {name2}", "account.featured.accounts": "Perfils", - "account.featured.hashtags": "Etiquetas", - "account.featured_tags.last_status_at": "Darrièra publicacion lo {date}", - "account.featured_tags.last_status_never": "Cap de publicacion", "account.follow": "Sègre", "account.follow_back": "Sègre en retorn", "account.follow_request_cancel": "Anullar la demanda", @@ -72,11 +68,9 @@ "account.note.edit_button": "Modificar", "account.open_original_page": "Dobrir la pagina d’origina", "account.posts": "Tuts", - "account.posts_with_replies": "Tuts e responsas", "account.remove_from_followers": "Tirar {name} dels seguidors", "account.report": "Senhalar @{name}", "account.requested_follow": "{name} a demandat a vos sègre", - "account.requests_to_follow_you": "Demanda a vos sègre", "account.share": "Partejar lo perfil a @{name}", "account.show_reblogs": "Mostrar los partatges de @{name}", "account.timeline.pinned": "Penjat", @@ -90,7 +84,6 @@ "account.unmute_notifications_short": "Restablir las notificacions", "account.unmute_short": "Tornar afichar", "account_edit.column_title": "Modificar lo perfil", - "account_edit.custom_fields.name": "camp", "account_edit.field_delete_modal.delete_button": "Suprimir", "account_edit.field_edit_modal.value_label": "Valor", "account_note.placeholder": "Clicar per ajustar una nòta", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 68dd9d6f68421e..b1a610cfa5cd00 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -23,12 +23,10 @@ "account.block_domain": "{domain} ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "account.block_short": "ਪਾਬੰਦੀ", "account.blocked": "ਪਾਬੰਦੀਸ਼ੁਦਾ", - "account.blocking": "ਪਾਬੰਦੀ ਲਾਉਣੀ", "account.cancel_follow_request": "ਫ਼ਾਲੋ ਕਰਨ ਨੂੰ ਰੱਦ ਕਰੋ", "account.copy": "ਪਰੋਫਾਇਲ ਲਈ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", "account.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ @{name}", "account.disable_notifications": "ਜਦੋਂ {name} ਕੋਈ ਪੋਸਟ ਕਰੇ ਤਾਂ ਮੈਨੂੰ ਸੂਚਨਾ ਨਾ ਦਿਓ", - "account.domain_blocking": "ਡੋਮੇਨ ਉੱਤੇ ਪਾਬੰਦੀ", "account.edit_note": "ਨਿੱਜੀ ਨੋਟ ਨੂੰ ਸੋਧੋ", "account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", "account.edit_profile_short": "ਸੋਧੋ", @@ -38,9 +36,6 @@ "account.familiar_followers_two": "{name1} ਅਤੇ {name2} ਵਲੋਂ ਫ਼ਾਲੋ ਕੀਤਾ", "account.featured": "ਫ਼ੀਚਰ", "account.featured.accounts": "ਪਰੋਫਾਈਲ", - "account.featured.hashtags": "ਹੈਸ਼ਟੈਗ", - "account.featured_tags.last_status_at": "{date} ਨੂੰ ਆਖਰੀ ਪੋਸਟ", - "account.featured_tags.last_status_never": "ਕੋਈ ਪੋਸਟ ਨਹੀਂ", "account.filters.all": "ਸਾਰੀਆਂ ਸਰਗਰਮੀਆਂ", "account.filters.posts_only": "ਪੋਸਟਾਂ", "account.filters.posts_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ", @@ -91,11 +86,9 @@ "account.note.title": "ਨਿੱਜੀ ਨੋਟ (ਸਿਰਫ਼ ਤੁਹਾਨੂੰ ਹੀ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ)", "account.open_original_page": "ਅਸਲ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹੋ", "account.posts": "ਪੋਸਟਾਂ", - "account.posts_with_replies": "ਪੋਸਟਾਂ ਅਤੇ ਜਵਾਬ", "account.remove_from_followers": "{name} ਨੂੰ ਫ਼ਾਲੋਅਰ ਵਿੱਚੋਂ ਹਟਾਓ", "account.report": "{name} ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", "account.requested_follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", - "account.requests_to_follow_you": "ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀਆਂ ਬੇਨਤੀਆਂ", "account.share": "{name} ਦਾ ਪਰੋਫ਼ਾਇਲ ਸਾਂਝਾ ਕਰੋ", "account.show_reblogs": "@{name} ਵਲੋਂ ਬੂਸਟ ਨੂੰ ਵੇਖਾਓ", "account.statuses_counter": "{count, plural, one {{counter} ਪੋਸਟ} other {{counter} ਪੋਸਟਾਂ}}", @@ -160,7 +153,6 @@ "column.about": "ਸਾਡੇ ਬਾਰੇ", "column.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", "column.bookmarks": "ਬੁੱਕਮਾਰਕ", - "column.collections": "ਮੇਰਾ ਭੰਡਾਰ", "column.community": "ਲੋਕਲ ਸਮਾਂ-ਲਾਈਨ", "column.create_list": "ਸੂਚੀ ਬਣਾਓ", "column.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 88b21f47caecf7..803cb5ecb3635b 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -14,19 +14,25 @@ "about.powered_by": "Zdecentralizowane media społecznościowe napędzane przez {mastodon}", "about.rules": "Regulamin serwera", "account.account_note_header": "Notatka", + "account.activity": "Aktywność", + "account.add_note": "Dodaj osobistą notkę", "account.add_or_remove_from_list": "Dodaj lub usuń z list", + "account.badges.admin": "Admin", + "account.badges.blocked": "Zablokowane", "account.badges.bot": "Bot", + "account.badges.domain_blocked": "Zablokowana domena", "account.badges.group": "Grupa", + "account.badges.muted": "Wyciszone", + "account.badges.muted_until": "Wyciszone do {until}", "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", "account.block_short": "Zablokuj", "account.blocked": "Zablokowano", - "account.blocking": "Blokowanie", "account.cancel_follow_request": "Nie obserwuj", "account.copy": "Skopiuj link do profilu", "account.direct": "Napisz bezpośrednio do @{name}", "account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}", - "account.domain_blocking": "Blokowanie domeny", + "account.edit_note": "Edytuj osobistą notkę", "account.edit_profile": "Edytuj profil", "account.edit_profile_short": "Edytuj", "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}", @@ -36,9 +42,14 @@ "account.familiar_followers_two": "To konto jest obserwowane przez {name1} i {name2}", "account.featured": "Wyróżnione", "account.featured.accounts": "Profile", - "account.featured.hashtags": "Tagi", - "account.featured_tags.last_status_at": "Ostatni post {date}", - "account.featured_tags.last_status_never": "Brak postów", + "account.featured.collections": "Kolekcje", + "account.field_overflow": "Pokaż całą zawartość", + "account.filters.all": "Wszystkie aktywności", + "account.filters.boosts_toggle": "Pokaż ulepszenia", + "account.filters.posts_boosts": "Posty i ulepszenia", + "account.filters.posts_only": "Posty", + "account.filters.posts_replies": "Posty i odpowiedzi", + "account.filters.replies_toggle": "Pokaż odpowiedzi", "account.follow": "Obserwuj", "account.follow_back": "Również obserwuj", "account.follow_back_short": "Również obserwuj", @@ -63,24 +74,50 @@ "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go obserwować.", "account.media": "Multimedia", "account.mention": "Wspomnij o @{name}", + "account.menu.add_to_list": "Dodaj do listy…", + "account.menu.block": "Zablokuj konto", + "account.menu.block_domain": "Zablokuj {domain}", + "account.menu.copied": "Skopiowano link do konta do schowka", + "account.menu.copy": "Skopiuj link", + "account.menu.direct": "Prywatna wzmianka", + "account.menu.hide_reblogs": "Ukryj ulepszenia na osi czasu", + "account.menu.mention": "Wzmianka", + "account.menu.mute": "Wycisz konta", + "account.menu.note.description": "Widoczne tylko dla Ciebie", + "account.menu.open_original_page": "Zobacz na {domain}", + "account.menu.remove_follower": "Usuń obserwującego", + "account.menu.report": "Zgłoś konto", + "account.menu.share": "Udostępnij...", + "account.menu.show_reblogs": "Pokaż ulepszenia na osi czasu", + "account.menu.unblock": "Odblokuj konto", + "account.menu.unblock_domain": "Odblokuj {domain}", + "account.menu.unmute": "Odcisz konto", "account.moved_to": "{name} jako swoje nowe konto wskazał/a:", "account.mute": "Wycisz @{name}", "account.mute_notifications_short": "Wycisz powiadomienia", "account.mute_short": "Wycisz", "account.muted": "Wyciszony", - "account.muting": "Wyciszanie", "account.mutual": "Obserwujecie się wzajemnie", + "account.name_info": "Co to oznacza?", "account.no_bio": "Brak opisu.", + "account.node_modal.callout": "Osobiste notatki są widoczne tylko dla Ciebie.", + "account.node_modal.edit_title": "Edytuj osobistą notkę", + "account.node_modal.error_unknown": "Nie można zapisać notatki", + "account.node_modal.field_label": "Notatka osobista", + "account.node_modal.save": "Zapisz", + "account.node_modal.title": "Dodaj osobistą notkę", + "account.note.edit_button": "Edytuj", + "account.note.title": "Osobista notatka (widoczna tylko dla Ciebie)", "account.open_original_page": "Otwórz stronę oryginalną", "account.posts": "Wpisy", - "account.posts_with_replies": "Wpisy i odpowiedzi", "account.remove_from_followers": "Usuń {name} z obserwujących", "account.report": "Zgłoś @{name}", "account.requested_follow": "{name} chce cię obserwować", - "account.requests_to_follow_you": "Prośby o obserwowanie", "account.share": "Udostępnij profil @{name}", "account.show_reblogs": "Pokazuj podbicia od @{name}", "account.statuses_counter": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}", + "account.timeline.pinned": "Przypięte", + "account.timeline.pinned.view_all": "Zobacz wszystkie przypięte posty", "account.unblock": "Odblokuj @{name}", "account.unblock_domain": "Odblokuj domenę {domain}", "account.unblock_domain_short": "Odblokuj", @@ -90,6 +127,55 @@ "account.unmute": "Nie wyciszaj @{name}", "account.unmute_notifications_short": "Nie wyciszaj powiadomień", "account.unmute_short": "Nie wyciszaj", + "account_edit.bio.add_label": "Szczegóły profilu", + "account_edit.bio.edit_label": "Edytuj szczegóły profilu", + "account_edit.bio.placeholder": "Dodaj krótkie wprowadzenie, aby pomóc innym zidentyfikować cię.", + "account_edit.bio.title": "Opis", + "account_edit.bio_modal.add_title": "Szczegóły profilu", + "account_edit.bio_modal.edit_title": "Edytuj szczegóły profilu", + "account_edit.column_button": "Gotowe", + "account_edit.column_title": "Edytuj profil", + "account_edit.custom_fields.add_label": "Dodaj pole", + "account_edit.custom_fields.edit_label": "Edytuj pole", + "account_edit.custom_fields.placeholder": "Dodaj swoje zaimki, linki zewnętrzne lub cokolwiek innego, które chcesz udostępnić.", + "account_edit.custom_fields.reorder_button": "Zmień kolejność pól", + "account_edit.custom_fields.tip_content": "Możesz z łatwością zwiększyć wiarygodność swojego konta Mastodon poprzez weryfikację linków do wszelkich stron internetowych, które posiadasz.", + "account_edit.custom_fields.tip_title": "Wskazówka: Dodawanie zweryfikowanych linków", + "account_edit.custom_fields.title": "Pola niestandardowe", + "account_edit.custom_fields.verified_hint": "Jak dodać zweryfikowany link?", + "account_edit.display_name.add_label": "Dodaj nazwę wyświetlaną", + "account_edit.display_name.edit_label": "Edytuj nazwę wyświetlaną", + "account_edit.display_name.placeholder": "Twoja nazwa wyświetlana jest jak Twoja nazwa pojawia się na Twoim profilu i na osi czasu.", + "account_edit.display_name.title": "Wyświetlana nazwa", + "account_edit.featured_hashtags.edit_label": "Dodaj hashtagi", + "account_edit.featured_hashtags.placeholder": "Pomóż innym zidentyfikować i mieć szybki dostęp do Twoich ulubionych tematów.", + "account_edit.featured_hashtags.title": "Wyróżnione hashtagi", + "account_edit.field_actions.delete": "Usuń pole", + "account_edit.field_actions.edit": "Edytuj pole", + "account_edit.field_delete_modal.confirm": "Czy na pewno chcesz usunąć to pole niestandardowe? Tej czynności nie można cofnąć.", + "account_edit.field_delete_modal.delete_button": "Usuń", + "account_edit.field_delete_modal.title": "Usuń pole niestandardowe ", + "account_edit.field_edit_modal.add_title": "Dodaj pole niestandardowe", + "account_edit.field_edit_modal.discard_confirm": "Odrzuć", + "account_edit.field_edit_modal.discard_message": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?", + "account_edit.field_edit_modal.edit_title": "Edytuj dodatkowe pole", + "account_edit.field_edit_modal.name_label": "Etykieta", + "account_edit.field_edit_modal.value_label": "Wartość", + "account_edit.image_alt_modal.add_title": "Dodaj tekst alternatywny", + "account_edit.image_alt_modal.text_label": "Tekst alternatywny", + "account_edit.image_delete_modal.delete_button": "Usuń", + "account_edit.image_delete_modal.title": "Usunąć obraz?", + "account_edit.image_edit.add_button": "Dodaj obraz", + "account_edit.image_edit.alt_add_button": "Dodaj tekst alternatywny", + "account_edit.image_edit.alt_edit_button": "Dodaj tekst alternatywny", + "account_edit.image_edit.remove_button": "Usuń obraz", + "account_edit.image_edit.replace_button": "Zastąp obraz", + "account_edit.profile_tab.button_label": "Dostosuj", + "account_edit.save": "Zapisz", + "account_edit.upload_modal.back": "Wstecz", + "account_edit.upload_modal.done": "Gotowe", + "account_edit.upload_modal.next": "Następne", + "account_edit.upload_modal.step_crop.zoom": "Powiększenie", "account_note.placeholder": "Kliknij, aby dodać notatkę", "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji", "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników według miesięcy od rejestracji", @@ -344,9 +430,6 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", - "empty_column.account_featured.me": "Nie dodano jeszcze żadnych polecanych treści. Czy wiesz, że możesz wyróżnić najczęściej używane hashtagi, a nawet konta znajomych na swoim profilu?", - "empty_column.account_featured.other": "Konto {acct} nie wyróżniło jeszcze żadnych treści. Czy wiesz, że możesz wyróżnić najczęściej używane hashtagi, a nawet konta znajomych w swoim profilu?", - "empty_column.account_featured_other.unknown": "To konto nie zostało jeszcze wyróżnione.", "empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji", "empty_column.account_suspended": "Konto zawieszone", "empty_column.account_timeline": "Brak wpisów!", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 03e356313ecfbd..99becf0916be61 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear domínio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueado", - "account.blocking": "Bloqueando", "account.cancel_follow_request": "Cancelar solicitação para seguir", "account.copy": "Copiar link do perfil", "account.direct": "Mencione em privado @{name}", "account.disable_notifications": "Cancelar notificações de @{name}", - "account.domain_blocking": "Bloqueando domínio", "account.edit_note": "Editar a nota pessoal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Em destaque", "account.featured.accounts": "Perfis", "account.featured.collections": "Coleções", - "account.featured.hashtags": "Hashtags", - "account.featured_tags.last_status_at": "Última publicação em {date}", - "account.featured_tags.last_status_never": "Sem publicações", + "account.featured.new_collection": "Nova coleção", "account.field_overflow": "Mostrar todo conteúdo", "account.filters.all": "Todas atividades", "account.filters.boosts_toggle": "Mostrar impulsos", @@ -73,8 +69,19 @@ "account.go_to_profile": "Ir ao perfil", "account.hide_reblogs": "Ocultar impulsos de @{name}", "account.in_memoriam": "In Memoriam.", + "account.join_modal.day": "Dia", + "account.join_modal.me": "Você uniu-se a {server} em", + "account.join_modal.me_anniversary": "Feliz Fediversário! Você uniu-se a {server} em", + "account.join_modal.me_today": "É o seu primeiro dia em {server}!", + "account.join_modal.other": "{name} uniu-se a {server} em", + "account.join_modal.other_today": "Este é o primeiro dia de {name} em {server}!", + "account.join_modal.share.celebrate": "Compartilhe uma postagem comemorativa", + "account.join_modal.share.intro": "Compartilhe uma postagem de introdução", + "account.join_modal.share.welcome": "Compartilhe uma postagem de boas-vindas", + "account.join_modal.years": "{number, plural, one {ano} other {anos}}", "account.joined_short": "Entrou", "account.languages": "Mudar idiomas inscritos", + "account.last_active": "Última atividade", "account.link_verified_on": "A propriedade deste link foi verificada em {date}", "account.locked_info": "Trancado. Seguir requer aprovação manual do perfil.", "account.media": "Mídia", @@ -89,24 +96,24 @@ "account.menu.mention": "Mencionar", "account.menu.mute": "Silenciar conta", "account.menu.note.description": "Visível apenas para você", - "account.menu.open_original_page": "Ver em {domain}", + "account.menu.open_original_page": "Veja em {domain}", "account.menu.remove_follower": "Remover seguidor", "account.menu.report": "Denunciar conta", "account.menu.share": "Compartilhar…", "account.menu.show_reblogs": "Mostrar impulsos na linha do tempo", "account.menu.unblock": "Desbloquear conta", "account.menu.unblock_domain": "Desbloquear {domain}", - "account.menu.unmute": "Dessilenciar conta", + "account.menu.unmute": "Deixar de silenciar a conta", "account.moved_to": "{name} indicou que sua nova conta agora é:", "account.mute": "Silenciar @{name}", "account.mute_notifications_short": "Silenciar notificações", "account.mute_short": "Silenciar", "account.muted": "Silenciado", - "account.muting": "Silenciando", "account.mutual": "Vocês se seguem", + "account.name.copy": "Copiar usuário", "account.name.help.domain": "{domain} é o servidor que hospeda o perfil e publicações do usuário.", "account.name.help.domain_self": "{domain} é o seu servidor que hospeda seu perfil e publicações.", - "account.name.help.footer": "Assim como pode enviar mensagens eletrônicas de serviços diferentes, você pode interagir com pessoas de outros servidores Mastodon — e qualquer pessoa em um aplicativo alimentado com as regras utilizadas pelo Mastodon (protocolo ActivityPub).", + "account.name.help.footer": "Assim como você pode enviar emails para pessoas que usam diferentes provedores de email, você pode interagir com pessoas em outros servidores de Mastodon, e com qualquer um em outros aplicativos sociais compatíveis com Mastodon.", "account.name.help.header": "Um identificador é como um endereço de endereço eletrônico", "account.name.help.username": "{username} é o nome de usuário da conta neste servidor. Alguém em outro servidor pode ter o mesmo nome de usuário.", "account.name.help.username_self": "{username} é seu nome de usuário neste servidor. Alguém em outro servidor pode ter o mesmo nome de usuário.", @@ -122,11 +129,9 @@ "account.note.title": "Nota pessoal (visível apenas para você)", "account.open_original_page": "Abrir a página original", "account.posts": "Publicações", - "account.posts_with_replies": "Com respostas", "account.remove_from_followers": "Remover {name} dos seguidores", "account.report": "Denunciar @{name}", "account.requested_follow": "{name} quer te seguir", - "account.requests_to_follow_you": "Pediu para seguir você", "account.share": "Compartilhar perfil de @{name}", "account.show_reblogs": "Mostrar impulsos de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", @@ -141,46 +146,76 @@ "account.unmute": "Dessilenciar @{name}", "account.unmute_notifications_short": "Ativar som de notificações", "account.unmute_short": "Desativar silêncio", - "account_edit.bio.placeholder": "Insira uma breve introdução para ajudar os outros a lhe identificar.", + "account_edit.advanced_settings.bot_hint": "Sinalizar a outros que a conta realiza principalmente ações automatizadas e pode não ser monitoriada", + "account_edit.advanced_settings.bot_label": "Conta automatizada", + "account_edit.advanced_settings.title": "Configurações avançadas", + "account_edit.bio.add_label": "Adicionar biografia", + "account_edit.bio.edit_label": "Editar Biografia", + "account_edit.bio.placeholder": "Insira uma breve introdução para ajudar as outras pessoas a te identificar.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Adicionar biografia", "account_edit.bio_modal.edit_title": "Editar biografia", - "account_edit.button.add": "Adicionar {item}", - "account_edit.button.delete": "Remover {item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Feito", "account_edit.column_title": "Editar perfil", - "account_edit.custom_fields.name": "Campo", + "account_edit.custom_fields.add_label": "Acrescentar campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Insira seus pronomes, links externos ou qualquer coisa que queira compartilhar.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Você pode facilmente dar credibilidade à sua conta Mastodon verificando os links para os seus sites.", "account_edit.custom_fields.tip_title": "Dica: Adicionando links verificados", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "Como adiciono um link verificado?", + "account_edit.display_name.add_label": "Acrescentar nome de exibição", + "account_edit.display_name.edit_label": "Editar nome de exibição", "account_edit.display_name.placeholder": "Seu nome de exibição é a forma com que seu nome aparece em seu perfil e em suas linhas do tempo.", "account_edit.display_name.title": "Nome de exibição", - "account_edit.featured_hashtags.item": "hashtags", + "account_edit.featured_hashtags.edit_label": "Acrescentar hashtags", "account_edit.featured_hashtags.placeholder": "Ajude outros a identificar e ter acesso rápido a seus tópicos favoritos.", "account_edit.featured_hashtags.title": "Hashtags em destaque", + "account_edit.field_actions.delete": "Remover campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "Tem certeza que deseja excluir este campo personalizado? Esta ação não pode ser desfeita.", "account_edit.field_delete_modal.delete_button": "Excluir", "account_edit.field_delete_modal.title": "Excluir campo personalizado?", "account_edit.field_edit_modal.add_title": "Adicionar campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Você possui alterações não salvas. Tem certeza de que deseja descartá-las?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", - "account_edit.field_edit_modal.limit_header": "Limite recomendado de caracteres excedido", - "account_edit.field_edit_modal.limit_message": "Usuários de dispositivos móveis podem não ver seu campo completo.", + "account_edit.field_edit_modal.length_warning": "Limite de caracteres recomendados ultrapassado. Usuários em telefones podem não conseguir ver o espaço completo.", "account_edit.field_edit_modal.link_emoji_warning": "Recomendamos não utilizar emojis personalizados combinados com URLs. Campos personalizados contendo ambos serão exibidos apenas como texto em vez de link, para evitar confusão dos usuários.", "account_edit.field_edit_modal.name_hint": "Ex. \"Site pessoal\"", "account_edit.field_edit_modal.name_label": "Descrição", - "account_edit.field_edit_modal.url_warning": "Para adicionar um link, por favor inclia {protocol} no início.", + "account_edit.field_edit_modal.url_warning": "Para adicionar um link, inclua {protocol} no início.", "account_edit.field_edit_modal.value_hint": "Ex.: \"https://example.me\"", "account_edit.field_edit_modal.value_label": "Valor", "account_edit.field_reorder_modal.drag_cancel": "O arrasto foi cancelado. O campo \"{item}\" foi descartado.", "account_edit.field_reorder_modal.drag_end": "O campo \"{item}\" foi descartado.", + "account_edit.field_reorder_modal.drag_instructions": "Para reordenar campos personalizados, pressione espaço ou enter. Enquanto arrasta, utilize as teclas de seta para mover o campo para cima ou para baixo. Pressione espaço ou enter novamente para colocar o campo em sua nova posição, ou pressione 'Esc' para cancelar.", + "account_edit.field_reorder_modal.drag_move": "Campo \"{item}\" foi movido.", + "account_edit.field_reorder_modal.drag_over": "Campo \"{item}\" foi movido para \"{over}\".", + "account_edit.field_reorder_modal.drag_start": "Campo \"{item}\" foi pego.", + "account_edit.field_reorder_modal.handle_label": "Arrastar campo \"{item}\"", + "account_edit.field_reorder_modal.title": "Reordenar campos", + "account_edit.image_alt_modal.add_title": "Acrescentar texto alternativo", + "account_edit.image_alt_modal.details_content": "FAÇA:
    • Descreva-se como retratado/a
    • Utilize linguagem em terceira pessoa (p. ex.: \"Alex\" em vez de \"eu\")
    • Seja sucinto/a — algumas palavras costumam ser o suficiente
    NÃO FAÇA:
    • Comece com \"Foto de\" — é redundante para leitores de tela
    EXEMPLO:
    • \"Alex vestindo uma camisa verde e óvulos\"
    ", + "account_edit.image_alt_modal.details_title": "Dicas: Texto alternativo para fotos", + "account_edit.image_alt_modal.edit_title": "Editar texto alternativo", + "account_edit.image_alt_modal.text_hint": "Texto alternativo ajuda leitores de tela a entender seu conteúdo.", + "account_edit.image_alt_modal.text_label": "Texto alternativo", + "account_edit.image_delete_modal.confirm": "Tem certeza de que deseja excluir esta imagem? Esta ação não pode ser desfeita.", + "account_edit.image_delete_modal.delete_button": "Deletar", + "account_edit.image_delete_modal.title": "Deletar imagem?", + "account_edit.image_edit.add_button": "Adicionar imagem", + "account_edit.image_edit.alt_add_button": "Adicionar texto alternativo", + "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", + "account_edit.image_edit.remove_button": "Remover imagem", + "account_edit.image_edit.replace_button": "Substituir imagem", + "account_edit.item_list.delete": "Deletar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Inserir nome de exibição", "account_edit.name_modal.edit_title": "Editar nome de exibição", "account_edit.profile_tab.button_label": "Personalizar", - "account_edit.profile_tab.hint.description": "Essas configurações definem o que os usuários veem no {servidor} nos apps oficiais, mas podem não se aplicar a usuários em servidores e apps de terceiros.", + "account_edit.profile_tab.hint.description": "Essas configurações definem o que os usuários veem no {server} nos apps oficiais, mas podem não se aplicar a usuários em servidores e apps de terceiros.", "account_edit.profile_tab.hint.title": "Exibições divergem", "account_edit.profile_tab.show_featured.description": "'Em Destaque' é uma aba opcional onde você pode exibir outras contas.", "account_edit.profile_tab.show_featured.title": "Mostrar aba \"Destaque\"", @@ -188,21 +223,34 @@ "account_edit.profile_tab.show_media.title": "Mostrar aba \"Mídia\"", "account_edit.profile_tab.show_media_replies.description": "Quando ativa, a aba Mídia mostra seus posts e respostas nos posts de outras pessoas.", "account_edit.profile_tab.show_media_replies.title": "Incluir respostas na aba \"Mídia\"", - "account_edit.profile_tab.subtitle": "Personalizar as abas em seu perfil e o que elas exibem.", - "account_edit.profile_tab.title": "Configurações da aba de perfil", "account_edit.save": "Salvar", + "account_edit.upload_modal.back": "Voltar", + "account_edit.upload_modal.done": "Concluído", + "account_edit.upload_modal.next": "Próximo", + "account_edit.upload_modal.step_crop.zoom": "Aproximar", + "account_edit.upload_modal.step_upload.button": "Procurar arquivos", + "account_edit.upload_modal.step_upload.dragging": "Solte para enviar", + "account_edit.upload_modal.step_upload.header": "Escolha uma imagem", + "account_edit.upload_modal.step_upload.hint": "WEBP, formatos GIF ou JPG, até {limit}MB.{br} imagem será redimensionada para {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Adicionar foto de perfil", + "account_edit.upload_modal.title_add.header": "Adicionar foto de capa", + "account_edit.upload_modal.title_replace.avatar": "Substituir foto de perfil", + "account_edit.upload_modal.title_replace.header": "Substituir foto de capa", "account_edit.verified_modal.details": "Dê credibilidade ao seu perfil do Mastodon, verificando links para sites pessoais. Veja como funciona:", + "account_edit.verified_modal.invisible_link.details": "Adicione o link para seu HTML do site. A parte importante é rel=\"eu\" onde previne falsificação de identidade em sites com conteúdo gerado por usuários. Você pode até mesmo usar um link tag no HTML da página ao invés de {tag}, mas o HTML deve ser acessível sem a execução do JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Como posso tornar o link invisível?", "account_edit.verified_modal.step1.header": "Copie o código HTML abaixo e cole no cabeçalho do seu site", "account_edit.verified_modal.step2.details": "Se já adicionou seu site como um campo personalizado, deverá excluí-lo e adicioná-lo novamente para acionar a verificação.", "account_edit.verified_modal.step2.header": "Adicione seu site como um campo personalizado", "account_edit.verified_modal.title": "Como adicionar um link verificado", "account_edit_tags.add_tag": "Adicionar #{tagName}", - "account_edit_tags.column_title": "Editar hashtags em destaque", + "account_edit_tags.column_title": "Editar Tags", "account_edit_tags.help_text": "Hashtags em destaque ajudam os usuários a descobrir e interagir com seu perfil. Elas aparecem como filtros na visualização de Atividade da sua página de Perfil.", + "account_edit_tags.max_tags_reached": "Você atingiu o número máximo de hashtags em destaque.", "account_edit_tags.search_placeholder": "Insira uma hashtag…", "account_edit_tags.suggestions": "Sugestões:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicação} other {# publicações}}", + "account_list.total": "{total, plural,one {#conta}other {#contas}}", "account_note.placeholder": "Nota pessoal sobre este perfil aqui", "admin.dashboard.daily_retention": "Taxa de retenção de usuários por dia, após a inscrição", "admin.dashboard.monthly_retention": "Taxa de retenção de usuários por mês, após a inscrição", @@ -307,62 +355,72 @@ "closed_registrations_modal.find_another_server": "Encontrar outro servidor", "closed_registrations_modal.preamble": "O Mastodon é descentralizado, não importa onde você criou a sua conta, será possível seguir e interagir com qualquer pessoa neste servidor. Você pode até mesmo criar o seu próprio servidor!", "closed_registrations_modal.title": "Inscrevendo-se no Mastodon", - "collection.share_modal.share_link_label": "Link para convite", + "collection.share_modal.share_link_label": "Compartilhar link", "collection.share_modal.share_via_post": "Postar no Mastodon", - "collection.share_modal.share_via_system": "Enviar para...", + "collection.share_modal.share_via_system": "Enviar para…", "collection.share_modal.title": "Compartilhar coleção", "collection.share_modal.title_new": "Compartilhe sua nova coleção!", "collection.share_template_other": "Confira esta coleção incrível: {link}", "collection.share_template_own": "Confira minha nova coleção: {link}", "collections.account_count": "{count, plural, one {# conta} other {# conta}}", - "collections.accounts.empty_description": "Adicionar até {count} contas que você segue", + "collections.accounts.empty_description": "Adicione até {count} contas", + "collections.accounts.empty_editor_title": "Ainda não há ninguém nesta coleção", "collections.accounts.empty_title": "Esta coleção está vazia", + "collections.block_collection_owner": "Bloquear conta", + "collections.by_account": "por {account_handle}", "collections.collection_description": "Descrição", + "collections.collection_language": "Língua", + "collections.collection_language_none": "Nenhum", "collections.collection_name": "Nome", "collections.collection_topic": "Tópico", "collections.confirm_account_removal": "Tem certeza que deseja remover esta conta da sua coleção?", "collections.content_warning": "Aviso de conteúdo", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Somente é possível adicionar contas que você segue e que optaram por serem descobertas.", + "collections.copy_link": "Copiar link", + "collections.copy_link_confirmation": "Link de coleção copiado", "collections.create.accounts_title": "Quen você vai apresentar nesta coleção?", "collections.create.basic_details_title": "Detalhes básicos", "collections.create.steps": "Passo {step}/{total}", - "collections.create_a_collection_hint": "Criar uma coleção para recomendar ou compartilhar suas contas favoritas com outras pessoas.", "collections.create_collection": "Criar coleção", "collections.delete_collection": "Eliminar coleção", "collections.description_length_hint": "Limite de 100 caracteres", - "collections.detail.accept_inclusion": "OK", - "collections.detail.accounts_heading": "Contas", - "collections.detail.author_added_you": "{author} adicionou você a esta coleção", - "collections.detail.curated_by_author": "Curadoria de {author}", - "collections.detail.curated_by_you": "Curadoria por você", + "collections.detail.author_added_you_on_date": "{author} te adicionou em {date}", "collections.detail.loading": "Carregando coleção…", - "collections.detail.other_accounts_in_collection": "Outros nesta coleção:", "collections.detail.revoke_inclusion": "Remover-me", + "collections.detail.sensitive_content": "Conteúdo sensível", "collections.detail.sensitive_note": "Esta coleção contém contas e conteúdo que podem ser sensíveis a alguns usuários.", "collections.detail.share": "Compartilhar esta coleção", + "collections.detail.you_are_in_this_collection": "Você aparece nesta coleção", "collections.edit_details": "Editar detalhes", - "collections.error_loading_collections": "Houve um erro ao tentar carregar suas coleções.", - "collections.hints.accounts_counter": "{count} / {max} contas", + "collections.hidden_accounts_description": "Você bloqueou ou silencilou {count, plural, one{este usuário} other {estes usuários}}", + "collections.hidden_accounts_link": "{count, plural, one {# conta oculta} other {# contas ocultas}}", + "collections.hints.accounts_counter": "{count}/{max} contas", "collections.last_updated_at": "Atualizado pela última vez em {date}", "collections.manage_accounts": "Gerenciar contas", "collections.mark_as_sensitive": "Marcar como sensível", "collections.mark_as_sensitive_hint": "Oculta a descrição e as contas da coleção por trás de um aviso de conteúdo. O nome da coleção ainda será visível.", + "collections.maximum_collection_count_description": "Seu servidor permite a criação de, no máximo, {count} coleções.", + "collections.maximum_collection_count_reached": "Você criou a quantidade máxima de coleções", "collections.name_length_hint": "limite de 40 caracteres", "collections.new_collection": "Nova coleção", - "collections.no_collections_yet": "Ainda não há coleções.", - "collections.old_last_post_note": "Publicado pela última vez semana passada", - "collections.remove_account": "Remover esta conta", + "collections.remove_account": "Remover", "collections.report_collection": "Denunciar esta coleção", "collections.revoke_collection_inclusion": "Remover-me desta coleção", "collections.revoke_inclusion.confirmation": "Você foi removido de \"{collection}\"", "collections.revoke_inclusion.error": "Houve um erro, por favor tente novamente mais tarde.", - "collections.search_accounts_label": "Buscar contas para adicionar…", - "collections.search_accounts_max_reached": "Você acrescentou o numero máximo de contas", + "collections.search_accounts_label": "Pesquisar por uma conta para adicionar", + "collections.search_accounts_max_reached": "Você acrescentou o número máximo de contas", "collections.sensitive": "Sensível", + "collections.share_short": "Compartilhar", + "collections.suggestions.can_not_add": "Não pôde ser adicionado", + "collections.suggestions.can_not_add_desc": "Estas contas podem ter optado para não serem exibidas na página de descobrir, ou podem estar em um servidor que não suporta coleções.", + "collections.suggestions.must_follow": "Você deve seguir primeiro", + "collections.suggestions.must_follow_desc": "Essas contas revisam todas as solicitações de seguir. Seguidores podem os adicionar às coleções.", "collections.topic_hint": "Adicione uma hashtag que ajude os outros a entender o tópico principal desta coleção.", + "collections.topic_special_chars_hint": "Caracteres especiais serão removidos ao salvar", + "collections.unlisted_collections_description": "Estes não aparecem em seu perfil aos outros. Qualquer um com um link pode os descobrir.", + "collections.unlisted_collections_with_count": "Coleções não listadas ({count})", "collections.view_collection": "Ver coleção", - "collections.view_other_collections_by_user": "Ver outras coleções deste usuário", "collections.visibility_public": "Público", "collections.visibility_public_hint": "Localizável em resultados de buscas e outras áreas onde recomendações aparecem.", "collections.visibility_title": "Visibilidade", @@ -371,7 +429,6 @@ "column.about": "Sobre", "column.blocks": "Usuários bloqueados", "column.bookmarks": "Salvos", - "column.collections": "Minhas coleções", "column.community": "Linha local", "column.create_list": "Criar lista", "column.direct": "Menções privadas", @@ -388,6 +445,7 @@ "column.lists": "Listas", "column.mutes": "Usuários silenciados", "column.notifications": "Notificações", + "column.other_collections": "Coleções de {name}", "column.pins": "Publicações fixadas", "column.public": "Linha global", "column_back_button.label": "Voltar", @@ -451,12 +509,13 @@ "confirmations.discard_draft.post.title": "Eliminar seu rascunho de publicação?", "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.follow_to_collection.confirm": "Seguir e adicionar a coleção", - "confirmations.follow_to_collection.message": "Você deve seguir {name} para adicionar a uma coleção.", - "confirmations.follow_to_collection.title": "Seguir conta?", "confirmations.follow_to_list.confirm": "Seguir e adicionar à lista", "confirmations.follow_to_list.message": "Você precisa seguir {name} para adicioná-lo à lista.", "confirmations.follow_to_list.title": "Seguir usuário?", + "confirmations.hide_featured_tab.confirm": "Ocultar aba", + "confirmations.hide_featured_tab.intro": "Você pode alterar isto a qualquer momento em Editar Perfil > Configurações da aba de perfil.", + "confirmations.hide_featured_tab.message": "Isto ocultará a aba para usuários em {serverName} e outros servidores executando a versão mais recente do Mastodon. Outras exibições podem variar.", + "confirmations.hide_featured_tab.title": "Ocultar aba \"Em destaque\"?", "confirmations.logout.confirm": "Sair", "confirmations.logout.message": "Você tem certeza de que deseja sair?", "confirmations.logout.title": "Sair da sessão?", @@ -495,6 +554,7 @@ "content_warning.hide": "Ocultar publicação", "content_warning.show": "Mostrar mesmo assim", "content_warning.show_more": "Mostrar mais", + "content_warning.show_short": "Exibir", "conversation.delete": "Excluir conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -535,6 +595,14 @@ "domain_pill.your_server": "Sua casa digital, onde ficam todas as suas postagens. Não gosta deste? Transfira servidores a qualquer momento e traga seus seguidores também.", "domain_pill.your_username": "Seu identificador exclusivo neste servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.", "dropdown.empty": "Escolha uma opção", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Inscrever-se", + "email_subscriptions.form.bottom": "Receba publicações em sua caixa de entrada sem criar uma conta do Mastodon. Desinscreva-se a qualquer momento. Para mais informações, consulte a Política de Privacidade.", + "email_subscriptions.form.title": "Inscrever-se para atualizações por email de {name}", + "email_subscriptions.submitted.lead": "Verifique sua caixa de entrada para finalizar sua inscrição para receber atualizações por email.", + "email_subscriptions.submitted.title": "Mais um passo", + "email_subscriptions.validation.email.blocked": "Provedor de email bloqueado", + "email_subscriptions.validation.email.invalid": "Endereço de email inválido", "embed.instructions": "Incorpore esta publicação no seu site ao copiar o código abaixo.", "embed.preview": "Aqui está como vai ficar:", "emoji_button.activity": "Atividade", @@ -552,9 +620,14 @@ "emoji_button.search_results": "Resultado da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagem e Lugares", - "empty_column.account_featured.me": "Você ainda não destacou nada. Você sabia que pode destacar seus posts, hashtags que você mais usa e até mesmo contas de seus amigos no seu perfil?", - "empty_column.account_featured.other": "{acct} Ainda não destacou nada. Você sabia que pode destacar suas publicações, hashtags que você mais usa e até mesmo contas de seus amigos no seu perfil?", - "empty_column.account_featured_other.unknown": "Esta conta ainda não destacou nada.", + "empty_column.account_featured.other": "{acct} ainda não colocou nada em destaque.", + "empty_column.account_featured_self.no_collections_button": "Criar uma coleção", + "empty_column.account_featured_self.no_collections_hide_tab": "Ocultar esta aba em vez disso", + "empty_column.account_featured_self.pre_collections": "Acompanhe este espaço para Coleções", + "empty_column.account_featured_self.pre_collections_desc": "Coleções (chegando no Mastodon 4.6) permitem que você crie sua própria lista curada de contas para recomendar aos outros.", + "empty_column.account_featured_self.showcase_accounts": "Exibir suas contas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "Coleções são listas curadas de contas que ajudam os outros a descobrir mais do Fediverso.", + "empty_column.account_featured_unknown.other": "Esta conta ainda não pôs nada em destaque.", "empty_column.account_hides_collections": "A pessoa optou por não disponibilizar esta informação", "empty_column.account_suspended": "Conta suspensa", "empty_column.account_timeline": "Nada aqui.", @@ -571,7 +644,7 @@ "empty_column.follow_requests": "Nada aqui. Quando você tiver seguidores pendentes, eles aparecerão aqui.", "empty_column.followed_tags": "Você ainda não seguiu nenhuma hashtag. Quando seguir, elas serão exibidas aqui.", "empty_column.hashtag": "Nada aqui.", - "empty_column.home": "Sua página inicial está vazia! Siga mais pessoas para começar: {suggestions}", + "empty_column.home": "Sua página inicial está vazia! Siga mais pessoas para preenchê-la.", "empty_column.list": "Nada aqui. Quando membros da lista publicarem, elas aparecerão aqui.", "empty_column.mutes": "Nada aqui.", "empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando você receber novas notificações, elas aparecerão aqui de acordo com suas configurações.", @@ -594,6 +667,10 @@ "featured_carousel.header": "{count, plural, one {Publicação fixada} other {Publicações fixadas}}", "featured_carousel.slide": "Publicação {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Anteriormente você postou sobre {items}. Adicionar estas como hashtags em destaque?", + "featured_tags.suggestions.add": "Adicionar", + "featured_tags.suggestions.added": "Gerencie suas hashtags a qualquer momento sob Editar Perfil > Hashtags em destaque.", + "featured_tags.suggestions.dismiss": "Não, obrigado", "filter_modal.added.context_mismatch_explanation": "Esta categoria de filtro não se aplica ao contexto no qual você acessou esta publicação. Se quiser que a publicação seja filtrada nesse contexto também, você terá que editar o filtro.", "filter_modal.added.context_mismatch_title": "Incompatibilidade de contexto!", "filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, você precisará alterar a data de expiração para aplicar.", @@ -636,9 +713,11 @@ "follow_suggestions.who_to_follow": "Quem seguir", "followed_tags": "Hashtags seguidas", "followers.hide_other_followers": "Este usuário escolheu não deixar visíveis seus seguidores", + "followers.title": "Seguinte {name}", "following.hide_other_following": "Este usuário escolheu não deixar visíveis aqueles a quem segue", + "following.title": "Seguido por {name}", "footer.about": "Sobre", - "footer.about_mastodon": "Sobre o mastodon", + "footer.about_mastodon": "Sobre o Mastodon", "footer.about_server": "Sobre {domain}", "footer.about_this_server": "Sobre", "footer.directory": "Diretório de perfis", @@ -648,6 +727,7 @@ "footer.source_code": "Exibir código-fonte", "footer.status": "Status", "footer.terms_of_service": "Termos de serviço", + "form_error.blank": "O espaço não pode estar em branco.", "form_field.optional": "(opcional)", "generic.saved": "Salvo", "getting_started.heading": "Primeiros passos", @@ -831,6 +911,7 @@ "navigation_panel.expand_followed_tags": "Expandir o menu de hashtags seguidas", "navigation_panel.expand_lists": "Expandir lista de menu", "not_signed_in_indicator.not_signed_in": "Você precisa se autenticar para acessar este recurso.", + "notification.added_to_collection": "{name} te adicionou a uma coleção", "notification.admin.report": "{name} denunciou {target}", "notification.admin.report_account": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target} para {category}", "notification.admin.report_account_other": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target}", @@ -840,6 +921,7 @@ "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} se inscreveram", "notification.annual_report.message": "O seu #Wrapstodon de {year} está esperando! Desvende seus destaques do ano e momentos memoráveis no Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editou uma coleção em que você está", "notification.favourite": "{name} favoritou sua publicação", "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# others}} favoritaram a publicação", "notification.favourite_pm": "{name} favoritou sua menção privada", @@ -953,12 +1035,14 @@ "notifications_permission_banner.title": "Nunca perca nada", "onboarding.follows.back": "Voltar", "onboarding.follows.empty": "Infelizmente, não é possível mostrar resultados agora. Você pode tentar usar a busca ou navegar na página de exploração para encontrar pessoas para seguir, ou tentar novamente mais tarde.", + "onboarding.follows.next": "Próximo: Configure seu perfil", "onboarding.follows.search": "Buscar", "onboarding.follows.title": "Comece seguindo pessoas", "onboarding.profile.discoverable": "Tornar meu perfil descobrível", "onboarding.profile.discoverable_hint": "Quando você aceita a capacidade de descoberta no Mastodon, suas postagens podem aparecer nos resultados de busca e nas tendências, e seu perfil pode ser sugerido a pessoas com interesses similares aos seus.", "onboarding.profile.display_name": "Nome de exibição", "onboarding.profile.display_name_hint": "Seu nome completo ou apelido…", + "onboarding.profile.finish": "Finalizar", "onboarding.profile.note": "Biografia", "onboarding.profile.note_hint": "Você pode @mencionar outras pessoas ou usar #hashtags…", "onboarding.profile.title": "Configuração do perfil", @@ -1101,12 +1185,14 @@ "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.more_about_this_server": "Saiba mais sobre este servidor", "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", + "skip_links.hotkey": "Tecla de atalho{hotkey}", "skip_links.skip_to_content": "Conteúdo principal", "skip_links.skip_to_navigation": "Navegação principal", "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 d51565bb25e9fe..b5e49b090e3be9 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -28,12 +28,10 @@ "account.block_domain": "Bloquear domínio {domain}", "account.block_short": "Bloquear", "account.blocked": "Bloqueado", - "account.blocking": "A bloquear", "account.cancel_follow_request": "Retirar pedido para seguir", "account.copy": "Copiar hiperligação do perfil", "account.direct": "Mencionar @{name} em privado", "account.disable_notifications": "Parar de me notificar das publicações de @{name}", - "account.domain_blocking": "A bloquear domínio", "account.edit_note": "Editar nota pessoal", "account.edit_profile": "Editar perfil", "account.edit_profile_short": "Editar", @@ -45,9 +43,7 @@ "account.featured": "Destaques", "account.featured.accounts": "Perfis", "account.featured.collections": "Coleções", - "account.featured.hashtags": "Etiquetas", - "account.featured_tags.last_status_at": "Última publicação em {date}", - "account.featured_tags.last_status_never": "Sem publicações", + "account.featured.new_collection": "Nova coleção", "account.field_overflow": "Mostrar todo o conteúdo", "account.filters.all": "Toda a atividade", "account.filters.boosts_toggle": "Mostrar partilhas", @@ -75,9 +71,10 @@ "account.in_memoriam": "Em Memória.", "account.joined_short": "Juntou-se a", "account.languages": "Alterar idiomas subscritos", + "account.last_active": "Última atividade", "account.link_verified_on": "O proprietário desta hiperligação foi verificado em {date}", "account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.", - "account.media": "Multimédia", + "account.media": "Media", "account.mention": "Mencionar @{name}", "account.menu.add_to_list": "Adicionar à lista…", "account.menu.block": "Bloquear conta", @@ -102,11 +99,11 @@ "account.mute_notifications_short": "Ocultar notificações", "account.mute_short": "Ocultar", "account.muted": "Ocultada", - "account.muting": "A silenciar", "account.mutual": "Seguem-se mutuamente", + "account.name.copy": "Copiar identificador", "account.name.help.domain": "{domain} é o servidor onde estão alojados o perfil e publicações do utilizador.", "account.name.help.domain_self": "{domain} é o servidor que hospeda o teu perfil e publicações.", - "account.name.help.footer": "Tal como podes enviar mensagens para pessoas que usam diferentes aplicações de correio eletrónico, podes interagir com as pessoas noutros servidores Mastodon — e com qualquer pessoa noutras aplicações sociais suportadas pelas mesmas regras usadas pelo Mastodon (o protocolo ActivityPub).", + "account.name.help.footer": "Tal como podes enviar e-mails a pessoas que utilizam diferentes serviços de e-mail, podes interagir com pessoas noutros servidores Mastodon e com qualquer pessoa noutras aplicações sociais compatíveis com o Mastodon.", "account.name.help.header": "Um identificador é como um endereço de correio eletrónico", "account.name.help.username": "{username} é o nome de utilizador desta conta no seu servidor. Alguém pode ter o mesmo nome de utilizador noutro servidor.", "account.name.help.username_self": "{username} é o teu nome de utilizador neste servidor. Alguém pode ter o mesmo nome de utilizador noutro servidor.", @@ -122,11 +119,9 @@ "account.note.title": "Nota pessoal (visível apenas por si)", "account.open_original_page": "Abrir a página original", "account.posts": "Publicações", - "account.posts_with_replies": "Publicações e respostas", "account.remove_from_followers": "Remover {name} dos seguidores", "account.report": "Denunciar @{name}", "account.requested_follow": "{name} pediu para seguir-te", - "account.requests_to_follow_you": "Pediu para seguir-te", "account.share": "Partilhar o perfil @{name}", "account.show_reblogs": "Mostrar partilhas de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", @@ -141,37 +136,46 @@ "account.unmute": "Desocultar @{name}", "account.unmute_notifications_short": "Desocultar notificações", "account.unmute_short": "Desocultar", + "account_edit.advanced_settings.bot_hint": "Indique aos outros que a conta realiza principalmente ações automatizadas e pode não estar a ser monitorizada", + "account_edit.advanced_settings.bot_label": "Conta automatizada", + "account_edit.advanced_settings.title": "Definições avançadas", + "account_edit.bio.add_label": "Adicionar biografia", + "account_edit.bio.edit_label": "Editar biografia", "account_edit.bio.placeholder": "Adicione uma breve apresentação para ajudar os outros a identificá-lo.", "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Adicionar biografia", "account_edit.bio_modal.edit_title": "Editar biografia", - "account_edit.button.add": "Adicionar {item}", - "account_edit.button.delete": "Eliminar \"{item}", - "account_edit.button.edit": "Editar {item}", "account_edit.column_button": "Concluído", "account_edit.column_title": "Editar Perfil", - "account_edit.custom_fields.name": "campo", + "account_edit.custom_fields.add_label": "Adicionar campo", + "account_edit.custom_fields.edit_label": "Editar campo", "account_edit.custom_fields.placeholder": "Adicione os seus pronomes, hiperligações externas ou qualquer outra coisa que queira partilhar.", "account_edit.custom_fields.reorder_button": "Reordenar campos", "account_edit.custom_fields.tip_content": "Pode adicionar facilmente credibilidade à sua conta Mastodon, verificando ligações para qualquer website que possua.", "account_edit.custom_fields.tip_title": "Dica: Adicionando links verificados", "account_edit.custom_fields.title": "Campos personalizados", "account_edit.custom_fields.verified_hint": "Como adiciono um link verificado?", + "account_edit.display_name.add_label": "Adicionar nome a apresentar", + "account_edit.display_name.edit_label": "Editar nome a apresentar", "account_edit.display_name.placeholder": "O seu nome de exibição é como o seu nome aparece no seu perfil e nas linhas do tempo.", "account_edit.display_name.title": "Nome a mostrar", - "account_edit.featured_hashtags.item": "etiquetas", + "account_edit.featured_hashtags.edit_label": "Adicionar etiquetas", "account_edit.featured_hashtags.placeholder": "Ajude à sua identificação por outros e tenha acesso rápido aos seus tópicos favoritos.", "account_edit.featured_hashtags.title": "Etiquetas em destaque", + "account_edit.field_actions.delete": "Eliminar campo", + "account_edit.field_actions.edit": "Editar campo", "account_edit.field_delete_modal.confirm": "Tem certeza de que deseja excluir este campo personalizado? Esta ação não pode ser desfeita.", "account_edit.field_delete_modal.delete_button": "Excluir", "account_edit.field_delete_modal.title": "Excluir campo personalizado?", "account_edit.field_edit_modal.add_title": "Adicionar campo personalizado", + "account_edit.field_edit_modal.discard_confirm": "Descartar", + "account_edit.field_edit_modal.discard_message": "Tem alterações não guardadas. Tem a certeza de que quer descartá-las?", "account_edit.field_edit_modal.edit_title": "Editar campo personalizado", - "account_edit.field_edit_modal.limit_header": "Limite de caracteres recomendado excedido", - "account_edit.field_edit_modal.limit_message": "Os utilizadores de dispositivos móveis podem não conseguir ver o seu campo na totalidade.", + "account_edit.field_edit_modal.length_warning": "O limite de caracteres recomendado foi excedido. Os utilizadores de dispositivos móveis poderão não ver o seu campo na íntegra.", "account_edit.field_edit_modal.link_emoji_warning": "Não recomendamos o uso de emojis personalizados em combinação com URLs. Campos personalizados que contenham ambos serão exibidos apenas como texto, em vez de como hiperligação, para evitar confusão aos utilizadores.", "account_edit.field_edit_modal.name_hint": "Ex.: \"Site pessoal\"", "account_edit.field_edit_modal.name_label": "Rótulo", + "account_edit.field_edit_modal.url_warning": "Para adicionar uma hiperligação, inclua {protocol} no início.", "account_edit.field_edit_modal.value_hint": "Ex.: \"https://exemplo.eu\"", "account_edit.field_edit_modal.value_label": "Valor", "account_edit.field_reorder_modal.drag_cancel": "O arrastamento foi cancelado. O campo \"{item}\" foi largado.", @@ -183,6 +187,8 @@ "account_edit.field_reorder_modal.handle_label": "Arrastar o campo \"{item}\"", "account_edit.field_reorder_modal.title": "Reordenar campos", "account_edit.image_alt_modal.add_title": "Adicionar texto alternativo", + "account_edit.image_alt_modal.details_content": "FAZER:
    • Descreva-se tal como aparece na imagem
    • Utilize a terceira pessoa (por exemplo, “João” em vez de “eu”)
    • Seja sucinto – algumas palavras são, muitas vezes, o suficiente
    NÃO FAZER:
    • Começar com “Foto de” – é redundante para os leitores de ecrã
    EXEMPLO:
    • “João a usar uma camisa verde e óculos”
    ", + "account_edit.image_alt_modal.details_title": "Dicas: Texto alternativo para fotos de perfil", "account_edit.image_alt_modal.edit_title": "Editar texto alternativo", "account_edit.image_alt_modal.text_hint": "O texto alternativo ajuda os utilizadores que usam um leitor de ecrã a entender seu conteúdo.", "account_edit.image_alt_modal.text_label": "Texto alternativo", @@ -194,18 +200,19 @@ "account_edit.image_edit.alt_edit_button": "Editar texto alternativo", "account_edit.image_edit.remove_button": "Remover imagem", "account_edit.image_edit.replace_button": "Substituir imagem", + "account_edit.item_list.delete": "Eliminar {name}", + "account_edit.item_list.edit": "Editar {name}", "account_edit.name_modal.add_title": "Adicionar nome a mostrar", "account_edit.name_modal.edit_title": "Editar o nome a mostrar", "account_edit.profile_tab.button_label": "Personalizar", "account_edit.profile_tab.hint.description": "Estas configurações personalizam o que os utilizadores veem no {server} nas aplicações oficiais, mas podem não se aplicar aos utilizadores de outros servidores nem aplicações de terceiros.", "account_edit.profile_tab.hint.title": "A apresentação ainda pode variar", - "account_edit.profile_tab.show_featured.description": "\"Destaques\" é uma aba opcional onde pode mostrar outras contas.", - "account_edit.profile_tab.show_featured.title": "Exibir aba “Destaques”", - "account_edit.profile_tab.show_media.description": "\"Mídia\" é uma aba opcional que mostra as suas publicações contendo imagens ou vídeos.", - "account_edit.profile_tab.show_media.title": "Exibir aba \"Mídia\"", - "account_edit.profile_tab.show_media_replies.description": "Quando ativada, a aba \"Mídia\" exibe tanto as suas publicações quanto as suas respostas às publicações de outras pessoas.", - "account_edit.profile_tab.subtitle": "Personalize as abas do seu perfil e o que elas exibem.", - "account_edit.profile_tab.title": "Configurações da aba do perfil", + "account_edit.profile_tab.show_featured.description": "\"Destaques\" é um separador opcional onde pode promover outras contas.", + "account_edit.profile_tab.show_featured.title": "Mostrar separador “Destaques”", + "account_edit.profile_tab.show_media.description": "'Media' é um separador opcional que mostra as suas publicações que contêm imagens ou vídeos.", + "account_edit.profile_tab.show_media.title": "Mostrar separador 'Media'", + "account_edit.profile_tab.show_media_replies.description": "Quando ativado, o separador 'Media' mostra tanto as suas publicações quanto as suas respostas às publicações de outras pessoas.", + "account_edit.profile_tab.show_media_replies.title": "Incluir respostas no separador 'Media'", "account_edit.save": "Guardar", "account_edit.upload_modal.back": "Voltar", "account_edit.upload_modal.done": "Concluído", @@ -214,8 +221,11 @@ "account_edit.upload_modal.step_upload.button": "Explorar ficheiros", "account_edit.upload_modal.step_upload.dragging": "Solte para transferir", "account_edit.upload_modal.step_upload.header": "Escolha uma imagem", - "account_edit.upload_modal.title_add": "Adicionar foto de perfil", - "account_edit.upload_modal.title_replace": "Substituir foto de perfil", + "account_edit.upload_modal.step_upload.hint": "Formato WEBP, PNG, GIF ou JPG, até {limit} MB.{br}A imagem será redimensionada para {width}x{height} px.", + "account_edit.upload_modal.title_add.avatar": "Adicionar foto de perfil", + "account_edit.upload_modal.title_add.header": "Adicionar foto de capa", + "account_edit.upload_modal.title_replace.avatar": "Substituir foto de perfil", + "account_edit.upload_modal.title_replace.header": "Substituir foto de capa", "account_edit.verified_modal.details": "Adicione credibilidade ao seu perfil no Mastodon verificando links para sites pessoais. Veja como funciona:", "account_edit.verified_modal.invisible_link.details": "Adicione o link ao seu cabeçalho. A parte importante é rel=\"me\", que evita a personificação em sites com conteúdo gerado por utilizadores. Você também pode usar uma tag de link no cabeçalho da página em vez de {tag}, mas o HTML deve ser acessível sem executar JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Como faço para tornar o link invisível?", @@ -224,11 +234,13 @@ "account_edit.verified_modal.step2.header": "Adicione o seu site como um campo personalizado", "account_edit.verified_modal.title": "Como adicionar um link verificado", "account_edit_tags.add_tag": "Adicionar #{tagName}", - "account_edit_tags.column_title": "Editar etiquetas em destaque", + "account_edit_tags.column_title": "Editar Etiquetas", "account_edit_tags.help_text": "As etiquetas destacadas ajudam os utilizadores a descobrir e interagir com o seu perfil. Aparecem como filtros na vista de atividade da sua página de perfil.", + "account_edit_tags.max_tags_reached": "Atingiu o número máximo de etiquetas destacadas.", "account_edit_tags.search_placeholder": "Insira uma etiqueta…", "account_edit_tags.suggestions": "Sugestões:", "account_edit_tags.tag_status_count": "{count, plural, one {# publicação} other {# publicações}}", + "account_list.total": "{total, plural, one {# conta} other {# contas}}", "account_note.placeholder": "Clicar para adicionar nota", "admin.dashboard.daily_retention": "Taxa de retenção de utilizadores por dia após a inscrição", "admin.dashboard.monthly_retention": "Taxa de retenção de utilizadores por mês após a inscrição", @@ -333,7 +345,7 @@ "closed_registrations_modal.find_another_server": "Procurar outro servidor", "closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso, não importa onde crie a sua conta: poderá seguir e interagir com qualquer utilizador neste servidor. Pode até alojá-lo você próprio!", "closed_registrations_modal.title": "Criar uma conta no Mastodon", - "collection.share_modal.share_link_label": "Link de convite para partilha", + "collection.share_modal.share_link_label": "Partilhar hiperligação", "collection.share_modal.share_via_post": "Publicar no Mastodon", "collection.share_modal.share_via_system": "Compartilhar com…", "collection.share_modal.title": "Partilhar coleção", @@ -341,55 +353,62 @@ "collection.share_template_other": "Veja esta coleção interessante: {link}", "collection.share_template_own": "Veja a minha nova coleção: {link}", "collections.account_count": "{count, plural, one {# conta} other {# contas}}", - "collections.accounts.empty_description": "Adicione até {count} contas que segue", + "collections.accounts.empty_description": "Adicione até {count} contas", + "collections.accounts.empty_editor_title": "Ainda não há ninguém nesta coleção", "collections.accounts.empty_title": "Esta coleção está vazia", + "collections.block_collection_owner": "Bloquear conta", + "collections.by_account": "por {account_handle}", "collections.collection_description": "Descrição", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Nenhum", "collections.collection_name": "Nome", "collections.collection_topic": "Tópico", "collections.confirm_account_removal": "Tem a certeza que quer remover esta conta desta coleção?", "collections.content_warning": "Aviso de conteúdo", "collections.continue": "Continuar", - "collections.create.accounts_subtitle": "Apenas as contas que segue e que optaram por ser descobertas podem ser adicionadas.", + "collections.copy_link": "Copiar hiperligação", + "collections.copy_link_confirmation": "A hiperligação da coleção foi copiada para a área de transferência", "collections.create.accounts_title": "Quem vai destacar nesta coleção?", "collections.create.basic_details_title": "Informações básicas", "collections.create.steps": "Passo {step}/{total}", - "collections.create_a_collection_hint": "Crie uma coleção para recomendar ou partilhar as suas contas favoritas com outras pessoas.", "collections.create_collection": "Criar coleção", "collections.delete_collection": "Eliminar coleção", "collections.description_length_hint": "Limite de 100 caracteres", - "collections.detail.accept_inclusion": "OK / Aceitar", - "collections.detail.accounts_heading": "Contas", - "collections.detail.author_added_you": "{author} adicionou-o a esta coleção", - "collections.detail.curated_by_author": "Curado por {author}", - "collections.detail.curated_by_you": "Curado por si", + "collections.detail.author_added_you_on_date": "{author} adicionou-o em {date}", "collections.detail.loading": "A carregar a coleção…", - "collections.detail.other_accounts_in_collection": "Outros nesta coleção:", "collections.detail.revoke_inclusion": "Remover-me", + "collections.detail.sensitive_content": "Conteúdo sensível", "collections.detail.sensitive_note": "Esta coleção contém contas e conteúdos que podem ser sensíveis para alguns utilizadores.", "collections.detail.share": "Partilhar esta coleção", + "collections.detail.you_are_in_this_collection": "Está em destaque nesta coleção", "collections.edit_details": "Editar detalhes", - "collections.error_loading_collections": "Ocorreu um erro ao tentar carregar as suas coleções.", - "collections.hints.accounts_counter": "{count} / {max} contas", + "collections.hidden_accounts_description": "Bloqueou ou silenciou {count, plural, one {este utilizador} other {estes utilizadores}}", + "collections.hidden_accounts_link": "{count, plural, one {# conta escondida} other {# contas escondidas}}", + "collections.hints.accounts_counter": "{count}/{max} contas", "collections.last_updated_at": "Última atualização: {date}", "collections.manage_accounts": "Gerir contas", "collections.mark_as_sensitive": "Marcar como sensível", "collections.mark_as_sensitive_hint": "Oculta a descrição e as contas da coleção por trás de um aviso de conteúdo. O nome da coleção ainda estará visível.", "collections.name_length_hint": "Limite de 40 carateres", "collections.new_collection": "Nova coleção", - "collections.no_collections_yet": "Ainda não existem coleções.", - "collections.old_last_post_note": "Última publicação há mais de uma semana", - "collections.remove_account": "Remover esta conta", + "collections.remove_account": "Remover", "collections.report_collection": "Denunciar esta coleção", "collections.revoke_collection_inclusion": "Remover-me desta coleção", "collections.revoke_inclusion.confirmation": "Foi removido da coleção \"{collection}\"", "collections.revoke_inclusion.error": "Ocorreu um erro, por favor tente novamente mais tarde.", - "collections.search_accounts_label": "Procurar contas para adicionar…", + "collections.search_accounts_label": "Procurar uma conta para adicionar", "collections.search_accounts_max_reached": "Já adicionou o máximo de contas", "collections.sensitive": "Sensível", + "collections.share_short": "Partilhar", + "collections.suggestions.can_not_add": "Não pode ser adicionada", + "collections.suggestions.can_not_add_desc": "Estas contas podem ter optado por não participar nas funcionalidades de descoberta, ou podem estar num servidor que não suporta coleções.", + "collections.suggestions.must_follow": "Deve seguir primeiro", + "collections.suggestions.must_follow_desc": "Estas contas revêm todos os pedidos de seguidores. Apenas seguidores podem adicioná-las a coleções.", "collections.topic_hint": "Adicione uma etiqueta para ajudar outros a entender o tópico principal desta coleção.", "collections.topic_special_chars_hint": "Os carateres especiais serão removidos ao guardar", + "collections.unlisted_collections_description": "Estas não aparecem publicamente no seu perfil. Qualquer pessoa com a hiperligação pode visualizá-las.", + "collections.unlisted_collections_with_count": "Coleções não listadas ({count})", "collections.view_collection": "Ver coleções", - "collections.view_other_collections_by_user": "Ver outras coleções deste utilizador", "collections.visibility_public": "Pública", "collections.visibility_public_hint": "Visível nos resultados de pesquisa e outras áreas onde aparecem recomendações.", "collections.visibility_title": "Visibilidade", @@ -398,7 +417,6 @@ "column.about": "Sobre", "column.blocks": "Utilizadores bloqueados", "column.bookmarks": "Favoritos", - "column.collections": "As minhas coleções", "column.community": "Cronologia local", "column.create_list": "Criar lista", "column.direct": "Menções privadas", @@ -415,6 +433,7 @@ "column.lists": "Listas", "column.mutes": "Utilizadores ocultados", "column.notifications": "Notificações", + "column.other_collections": "Coleções de {name}", "column.pins": "Publicações afixadas", "column.public": "Cronologia federada", "column_back_button.label": "Voltar", @@ -431,7 +450,7 @@ "combobox.open_results": "Ver resultados", "combobox.results_available": "{count, plural, one {# sugestão disponível} other {# sugestões disponíveis}}. Utilize as setas para cima e para baixo para navegar. Pressione a tecla Enter para selecionar.", "community.column_settings.local_only": "Apenas local", - "community.column_settings.media_only": "Apenas multimédia", + "community.column_settings.media_only": "Apenas media", "community.column_settings.remote_only": "Apenas remoto", "compose.error.blank_post": "As publicações não podem ficar em branco.", "compose.language.change": "Alterar idioma", @@ -477,18 +496,19 @@ "confirmations.discard_draft.post.message": "Continuar irá descartar a publicação que está a escrever.", "confirmations.discard_draft.post.title": "Descartar o rascunho da publicação?", "confirmations.discard_edit_media.confirm": "Descartar", - "confirmations.discard_edit_media.message": "Tens alterações por guardar na descrição da multimédia ou pré-visualização do conteúdo. Descartar mesmo assim?", - "confirmations.follow_to_collection.confirm": "Seguir e adicionar à coleção", - "confirmations.follow_to_collection.message": "Precisa de seguir {name} para o/a adicionar a uma coleção.", - "confirmations.follow_to_collection.title": "Seguir conta?", + "confirmations.discard_edit_media.message": "Tem alterações não guardadas na descrição ou na pré-visualização do ficheiro multimédia. Deseja ignorá-las na mesma?", "confirmations.follow_to_list.confirm": "Seguir e adicionar à lista", "confirmations.follow_to_list.message": "Tens de seguir {name} para o adicionares a uma lista.", "confirmations.follow_to_list.title": "Seguir utilizador?", + "confirmations.hide_featured_tab.confirm": "Esconder separador", + "confirmations.hide_featured_tab.intro": "Pode alterar esta configuração a qualquer momento em Editar perfil > Definições dos separadores de perfil.", + "confirmations.hide_featured_tab.message": "Isto irá ocultar o separador para os utilizadores em {serverName} e noutros servidores que executem a versão mais recente do Mastodon. A apresentação pode variar noutros casos.", + "confirmations.hide_featured_tab.title": "Esconder o separador \"Destaques\"?", "confirmations.logout.confirm": "Terminar sessão", "confirmations.logout.message": "Tens a certeza de que queres terminar a sessão?", "confirmations.logout.title": "Terminar sessão?", "confirmations.missing_alt_text.confirm": "Adicionar texto alternativo", - "confirmations.missing_alt_text.message": "A tua publicação contém multimédia sem texto alternativo. A adição de descrições ajuda a tornar o conteúdo acessível a mais pessoas.", + "confirmations.missing_alt_text.message": "A sua publicação contém ficheiros multimédia sem texto alternativo. Adicionar descrições ajuda a tornar o seu conteúdo acessível a mais pessoas.", "confirmations.missing_alt_text.secondary": "Publicar mesmo assim", "confirmations.missing_alt_text.title": "Adicionar texto alternativo?", "confirmations.mute.confirm": "Ocultar", @@ -522,6 +542,7 @@ "content_warning.hide": "Ocultar publicação", "content_warning.show": "Mostrar mesmo assim", "content_warning.show_more": "Mostrar mais", + "content_warning.show_short": "Mostrar", "conversation.delete": "Eliminar conversa", "conversation.mark_as_read": "Marcar como lida", "conversation.open": "Ver conversa", @@ -562,6 +583,14 @@ "domain_pill.your_server": "A tua casa digital, onde se encontram todas as tuas publicações. Não gostas deste? Muda de servidor a qualquer momento e leva também os teus seguidores.", "domain_pill.your_username": "O teu identificador único neste servidor. É possível encontrares utilizadores com o mesmo nome de utilizador em diferentes servidores.", "dropdown.empty": "Selecione uma opção", + "email_subscriptions.email": "E-mail", + "email_subscriptions.form.action": "Subscrever", + "email_subscriptions.form.bottom": "Receba publicações na sua caixa de correio sem criar uma conta no Mastodon. Pode cancelar a qualquer momento. Para mais informações, consulte a Política de Privacidade.", + "email_subscriptions.form.title": "Inscreva-se para receber por e-mail atualizações de {name}", + "email_subscriptions.submitted.lead": "Verifique a sua caixa de correio para concluir o registo para receber atualizações por e-mail.", + "email_subscriptions.submitted.title": "Mais um passo", + "email_subscriptions.validation.email.blocked": "Fornecedor de e-mail bloqueado", + "email_subscriptions.validation.email.invalid": "Endereço de e-mail inválido", "embed.instructions": "Incorpora esta publicação no teu site copiando o código abaixo.", "embed.preview": "Eis o aspeto que terá:", "emoji_button.activity": "Atividade", @@ -579,9 +608,14 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagens e lugares", - "empty_column.account_featured.me": "Ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?", - "empty_column.account_featured.other": "{acct} ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?", - "empty_column.account_featured_other.unknown": "Esta conta ainda não colocou nada em destaque.", + "empty_column.account_featured.other": "{acct} ainda não destacou nada.", + "empty_column.account_featured_self.no_collections_button": "Criar uma coleção", + "empty_column.account_featured_self.no_collections_hide_tab": "Ao invés disso, ocultar este separador", + "empty_column.account_featured_self.pre_collections": "Fique atento às Coleções", + "empty_column.account_featured_self.pre_collections_desc": "As coleções (disponíveis na versão 4.6 do Mastodon) permitem-lhe criar as suas próprias listas curadas de contas para recomendar a outras pessoas.", + "empty_column.account_featured_self.showcase_accounts": "Destaque as suas contas favoritas", + "empty_column.account_featured_self.showcase_accounts_desc": "As coleções são listas curadas de contas destinadas a ajudar outras pessoas a descobrir mais do Fediverso.", + "empty_column.account_featured_unknown.other": "Esta conta ainda não destacou nada.", "empty_column.account_hides_collections": "Este utilizador escolheu não disponibilizar esta informação", "empty_column.account_suspended": "Conta suspensa", "empty_column.account_timeline": "Sem publicações por aqui!", @@ -621,6 +655,10 @@ "featured_carousel.header": "{count, plural, one {Publicação Afixada} other {Publicações Afixadas}}", "featured_carousel.slide": "Publicação {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Ultimamente, tem publicado sobre {items}. Quer adicioná-las às etiquetas destacadas?", + "featured_tags.suggestions.add": "Adicionar", + "featured_tags.suggestions.added": "Pode gerir as suas etiquetas destacadas a qualquer momento em Editar perfil > Etiquetas destacadas.", + "featured_tags.suggestions.dismiss": "Não, obrigado", "filter_modal.added.context_mismatch_explanation": "Esta categoria de filtro não se aplica ao contexto em que acedeste a esta publicação. Se pretenderes que esta publicação seja filtrada também neste contexto, terás que editar o filtro.", "filter_modal.added.context_mismatch_title": "O contexto não coincide!", "filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, tens de alterar a data de validade para que ele seja aplicado.", @@ -663,7 +701,9 @@ "follow_suggestions.who_to_follow": "Quem seguir", "followed_tags": "Etiquetas seguidas", "followers.hide_other_followers": "Este utilizador optou por não mostrar os seus outros seguidores", + "followers.title": "A seguir {name}", "following.hide_other_following": "Este utilizador optou por não mostrar quem mais segue", + "following.title": "Seguido por {name}", "footer.about": "Sobre", "footer.about_mastodon": "Sobre o Mastodon", "footer.about_server": "Sobre {domain}", @@ -675,6 +715,7 @@ "footer.source_code": "Ver código-fonte", "footer.status": "Estado", "footer.terms_of_service": "Termos de serviço", + "form_error.blank": "O campo não pode ficar em branco.", "form_field.optional": "(opcional)", "generic.saved": "Guardado", "getting_started.heading": "Primeiros passos", @@ -759,7 +800,7 @@ "keyboard_shortcuts.muted": "abrir a lista dos utilizadores ocultados", "keyboard_shortcuts.my_profile": "abrir o teu perfil", "keyboard_shortcuts.notifications": "abrir a coluna das notificações", - "keyboard_shortcuts.open_media": "abrir multimédia", + "keyboard_shortcuts.open_media": "Abrir media", "keyboard_shortcuts.pinned": "abrir lista de publicações fixadas", "keyboard_shortcuts.profile": "abrir o perfil do autor", "keyboard_shortcuts.quote": "Citar publicação", @@ -769,7 +810,7 @@ "keyboard_shortcuts.spoilers": "para mostrar/esconder o campo AC", "keyboard_shortcuts.start": "abrir a coluna dos \"primeiros passos\"", "keyboard_shortcuts.toggle_hidden": "mostrar / esconder texto atrás do aviso de conteúdo", - "keyboard_shortcuts.toggle_sensitivity": "mostrar / ocultar multimédia", + "keyboard_shortcuts.toggle_sensitivity": "Mostrar / Ocultar media", "keyboard_shortcuts.toot": "criar uma nova publicação", "keyboard_shortcuts.top": "Mover para o topo da lista", "keyboard_shortcuts.translate": "traduzir uma publicação", @@ -814,7 +855,7 @@ "lists.show_replies_to": "Incluir respostas da lista de membros para", "load_pending": "{count, plural, one {# novo item} other {# novos itens}}", "loading_indicator.label": "A carregar…", - "media_gallery.hide": "Esconder", + "media_gallery.hide": "Ocultar", "moved_to_account_banner.text": "A tua conta {disabledAccount} está neste momento desativada porque migraste para {movedToAccount}.", "mute_modal.hide_from_notifications": "Ocultar das notificações", "mute_modal.hide_options": "Ocultar opções", @@ -858,6 +899,7 @@ "navigation_panel.expand_followed_tags": "Expandir o menu de etiquetas seguidas", "navigation_panel.expand_lists": "Expandir lista de menu", "not_signed_in_indicator.not_signed_in": "Tens de iniciar a sessão para utilizares esta funcionalidade.", + "notification.added_to_collection": "{name} adicionou-o a uma coleção", "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}", @@ -867,6 +909,7 @@ "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} inscreveram-se", "notification.annual_report.message": "O teu #Wrapstodon {year} está à espera! Ele revela os destaques e os momentos memoráveis do teu ano no Mastodon!", "notification.annual_report.view": "Ver #Wrapstodon", + "notification.collection_update": "{name} editou uma coleção em está incluído", "notification.favourite": "{name} assinalou a tua publicação como favorita", "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} assinalaram a tua publicação como favorita", "notification.favourite_pm": "{name} assinalou como favorita a sua menção privada", @@ -1026,7 +1069,7 @@ "quote_error.private_mentions": "A citação não é permitida em menções privadas.", "quote_error.quote": "Apenas é permitida uma citação de cada vez.", "quote_error.unauthorized": "Não está autorizado a citar esta publicação.", - "quote_error.upload": "Não é permitida a citação com anexos de multimédia.", + "quote_error.upload": "Não é permitida a citação com anexos multimédia.", "recommended": "Recomendado", "refresh": "Atualizar", "regeneration_indicator.please_stand_by": "Aguarda um momento.", @@ -1174,7 +1217,7 @@ "status.load_more": "Carregar mais", "status.media.open": "Clicar para abrir", "status.media.show": "Clicar para ver", - "status.media_hidden": "Multimédia oculta", + "status.media_hidden": "Media oculta", "status.mention": "Mencionar @{name}", "status.more": "Mais", "status.mute": "Ocultar @{name}", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index fd7dfcc56927b2..e4875ef36507f7 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -28,7 +28,6 @@ "account.block_domain": "Blochează domeniul {domain}", "account.block_short": "Blochează", "account.blocked": "Blocat", - "account.blocking": "Blocarea", "account.cancel_follow_request": "Retrage cererea de urmărire", "account.copy": "Copiază link-ul profilului", "account.direct": "Menționează pe @{name} în privat", @@ -38,8 +37,6 @@ "account.edit_profile_short": "Editare", "account.enable_notifications": "Trimite-mi o notificare când postează @{name}", "account.endorse": "Promovează pe profil", - "account.featured_tags.last_status_at": "Ultima postare pe {date}", - "account.featured_tags.last_status_never": "Fără postări", "account.follow": "Urmărește", "account.follow_back": "Urmăreşte înapoi", "account.followers": "Urmăritori", @@ -65,7 +62,6 @@ "account.no_bio": "Nicio descriere furnizată.", "account.open_original_page": "Deschide pagina originală", "account.posts": "Postări", - "account.posts_with_replies": "Postări și răspunsuri", "account.report": "Raportează pe @{name}", "account.requested_follow": "{name} A cerut să vă urmărească", "account.share": "Distribuie profilul lui @{name}", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 44dd60505ac61c..28cefe2e04d512 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -13,20 +13,26 @@ "about.not_available": "Администраторы сервера предпочли не раскрывать эту информацию.", "about.powered_by": "Децентрализованная социальная сеть на базе {mastodon}", "about.rules": "Правила сервера", - "account.account_note_header": "Личная заметка", + "account.account_note_header": "Заметка для себя", + "account.activity": "Посты", + "account.add_note": "Добавить заметку для себя", "account.add_or_remove_from_list": "Добавить в списки", + "account.badges.admin": "Администратор", + "account.badges.blocked": "Заблокирован(а)", "account.badges.bot": "Бот", + "account.badges.domain_blocked": "Домен заблокирован", "account.badges.group": "Группа", + "account.badges.muted": "Игнорируется", + "account.badges.muted_until": "Игнорируется до {until}", "account.block": "Заблокировать @{name}", "account.block_domain": "Заблокировать {domain}", "account.block_short": "Заблокировать", "account.blocked": "Заблокирован(а)", - "account.blocking": "Заблокирован(а)", "account.cancel_follow_request": "Отозвать запрос на подписку", "account.copy": "Копировать ссылку на профиль", "account.direct": "Упомянуть @{name} лично", "account.disable_notifications": "Не уведомлять о постах пользователя @{name}", - "account.domain_blocking": "Домен заблокирован", + "account.edit_note": "Редактировать заметку для себя", "account.edit_profile": "Редактировать", "account.edit_profile_short": "Редактировать", "account.enable_notifications": "Уведомлять о постах пользователя @{name}", @@ -36,9 +42,14 @@ "account.familiar_followers_two": "В подписках у {name1} и {name2}", "account.featured": "Рекомендации", "account.featured.accounts": "Профили", - "account.featured.hashtags": "Хештеги", - "account.featured_tags.last_status_at": "Последний пост опубликован {date}", - "account.featured_tags.last_status_never": "Нет постов", + "account.featured.collections": "Подборки", + "account.field_overflow": "Показать полностью", + "account.filters.all": "Всё вместе", + "account.filters.boosts_toggle": "Показывать продвижения", + "account.filters.posts_boosts": "Посты и продвижения", + "account.filters.posts_only": "Только посты", + "account.filters.posts_replies": "Посты и ответы", + "account.filters.replies_toggle": "Показывать ответы", "account.follow": "Подписаться", "account.follow_back": "Подписаться в ответ", "account.follow_back_short": "Подписаться", @@ -59,28 +70,60 @@ "account.in_memoriam": "In Memoriam.", "account.joined_short": "Дата регистрации", "account.languages": "Изменить языки подписки", + "account.last_active": "Последняя активность", "account.link_verified_on": "Владение этой ссылкой было проверено {date}", "account.locked_info": "Это закрытая учётная запись. Её владелец вручную одобряет подписчиков.", "account.media": "Медиа", "account.mention": "Упомянуть @{name}", + "account.menu.add_to_list": "Добавить в список…", + "account.menu.block": "Заблокировать", + "account.menu.block_domain": "Заблокировать {domain}", + "account.menu.copied": "Ссылка на профиль скопирована в буфер обмена", + "account.menu.copy": "Копировать ссылку", + "account.menu.direct": "Упомянуть лично", + "account.menu.hide_reblogs": "Скрыть продвижения", + "account.menu.mention": "Упомянуть", + "account.menu.mute": "Игнорировать", + "account.menu.note.description": "Не видно никому, кроме вас", + "account.menu.open_original_page": "Открыть на {domain}", + "account.menu.remove_follower": "Убрать из подписчиков", + "account.menu.report": "Пожаловаться", + "account.menu.share": "Поделиться…", + "account.menu.show_reblogs": "Показывать продвижения", + "account.menu.unblock": "Разблокировать", + "account.menu.unblock_domain": "Разблокировать {domain}", + "account.menu.unmute": "Не игнорировать", "account.moved_to": "У {name} теперь новая учётная запись:", "account.mute": "Игнорировать @{name}", "account.mute_notifications_short": "Скрыть уведомления", "account.mute_short": "Игнорировать", "account.muted": "Игнорируется", - "account.muting": "Игнорируется", "account.mutual": "Вы подписаны друг на друга", + "account.name.help.domain": "{domain} — это сервер, на котором размещены профиль и посты пользователя.", + "account.name.help.domain_self": "{domain} — это ваш сервер, на котором размещены ваши профиль и посты.", + "account.name.help.header": "Адрес пользователя напоминает адрес электронной почты", + "account.name.help.username": "{username} — это имя пользователя на сервере. На разных серверах могут встречаться люди с тем же именем пользователя.", + "account.name.help.username_self": "{username} — это ваше имя пользователя на этом сервере. На других серверах могут встречаться люди с тем же именем пользователя.", + "account.name_info": "Что это значит?", "account.no_bio": "Описание профиля отсутствует.", + "account.node_modal.callout": "Эта заметка будет видна только вам.", + "account.node_modal.edit_title": "Редактировать заметку для себя", + "account.node_modal.error_unknown": "Не удалось сохранить заметку", + "account.node_modal.field_label": "Текст заметки", + "account.node_modal.save": "Сохранить", + "account.node_modal.title": "Добавить заметку для себя", + "account.note.edit_button": "Редактировать", + "account.note.title": "Заметка для себя (никто, кроме вас, её не видит)", "account.open_original_page": "Открыть исходную страницу", "account.posts": "Посты", - "account.posts_with_replies": "Посты и ответы", "account.remove_from_followers": "Убрать {name} из подписчиков", "account.report": "Пожаловаться на @{name}", "account.requested_follow": "{name} отправил(а) вам запрос на подписку", - "account.requests_to_follow_you": "Отправил(а) вам запрос на подписку", "account.share": "Поделиться профилем @{name}", "account.show_reblogs": "Показывать продвижения от @{name}", "account.statuses_counter": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}", + "account.timeline.pinned": "Закреплён", + "account.timeline.pinned.view_all": "Показать все закреплённые посты", "account.unblock": "Разблокировать @{name}", "account.unblock_domain": "Разблокировать {domain}", "account.unblock_domain_short": "Разблокировать", @@ -90,6 +133,109 @@ "account.unmute": "Не игнорировать @{name}", "account.unmute_notifications_short": "Показать уведомления", "account.unmute_short": "Не игнорировать", + "account_edit.advanced_settings.title": "Расширенные настройки", + "account_edit.bio.add_label": "Добавить описание профиля", + "account_edit.bio.edit_label": "Редактировать описание профиля", + "account_edit.bio.placeholder": "Добавьте немного информации о себе, чтобы другие люди могли легче узнать вас.", + "account_edit.bio.title": "О себе", + "account_edit.bio_modal.add_title": "Добавить описание профиля", + "account_edit.bio_modal.edit_title": "Редактировать описание профиля", + "account_edit.column_button": "Готово", + "account_edit.column_title": "Редактировать профиль", + "account_edit.custom_fields.add_label": "Создать", + "account_edit.custom_fields.edit_label": "Редактировать поле профиля", + "account_edit.custom_fields.placeholder": "Добавьте свои местоимения, ссылки на сайты — всё, что посчитаете нужным указать в профиле.", + "account_edit.custom_fields.reorder_button": "Упорядочить", + "account_edit.custom_fields.tip_content": "Вы без особого труда сможете повысить доверие к своему профилю в Mastodon, если верифицируете ссылки на принадлежащие вам сайты.", + "account_edit.custom_fields.tip_title": "Подсказка: Добавьте верифицированные ссылки", + "account_edit.custom_fields.title": "Дополнительные поля", + "account_edit.custom_fields.verified_hint": "Как мне добавить верифицированную ссылку?", + "account_edit.display_name.add_label": "Добавить отображаемое имя", + "account_edit.display_name.edit_label": "Редактировать отображаемое имя", + "account_edit.display_name.placeholder": "Отображаемое имя — это то, как вы будете подписаны в профиле и лентах.", + "account_edit.display_name.title": "Отображаемое имя", + "account_edit.featured_hashtags.edit_label": "Добавить", + "account_edit.featured_hashtags.placeholder": "Укажите наиболее интересные для вас темы и предоставьте быстрый доступ к ним.", + "account_edit.featured_hashtags.title": "Рекомендации хештегов", + "account_edit.field_actions.delete": "Удалить поле профиля", + "account_edit.field_actions.edit": "Редактировать поле профиля", + "account_edit.field_delete_modal.confirm": "Вы уверены, что хотите удалить поле профиля? Это действие невозможно отменить.", + "account_edit.field_delete_modal.delete_button": "Удалить", + "account_edit.field_delete_modal.title": "Удалить поле профиля?", + "account_edit.field_edit_modal.add_title": "Создать поле профиля", + "account_edit.field_edit_modal.discard_confirm": "Сбросить", + "account_edit.field_edit_modal.discard_message": "У вас есть несохраненные изменения. Вы уверены, хотите сбросить их?", + "account_edit.field_edit_modal.edit_title": "Редактировать поле профиля", + "account_edit.field_edit_modal.length_warning": "Превышено рекомендуемое количество символов. Пользователи, просматривающие ваш профиль с мобильных устройств, могут не увидеть всю строку целиком.", + "account_edit.field_edit_modal.link_emoji_warning": "Мы не рекомендуем использовать нестандартные эмодзи вместе со ссылками. Если поле профиля содержит и URL-адрес, и эмодзи, оно будет отображено без форматирования, чтобы не сбивать с толку пользователей.", + "account_edit.field_edit_modal.name_hint": "Например: «Сайт»", + "account_edit.field_edit_modal.name_label": "Свойство", + "account_edit.field_edit_modal.url_warning": "Ссылка не будет создана, если вы не укажете {protocol} в начале.", + "account_edit.field_edit_modal.value_hint": "Например: «https://example.me»", + "account_edit.field_edit_modal.value_label": "Значение", + "account_edit.field_reorder_modal.drag_cancel": "Перемещение отменено. Поле \"{item}\" было оставлено на прежнем месте.", + "account_edit.field_reorder_modal.drag_end": "Поле \"{item}\" было перемещено.", + "account_edit.field_reorder_modal.drag_instructions": "Чтобы упорядочить дополнительные поля, нажмите \"Пробел\" (Space) или \"Ввод\" (Enter). Используйте клавиши со стрелками, чтобы передвинуть поле вверх или вниз. Нажмите \"Пробел\" (Space) или \"Ввод\" (Enter) ещё раз, чтобы переместить поле на новое место, либо нажмите кнопку \"Выйти\" (Escape) для отмены перемещения.", + "account_edit.field_reorder_modal.drag_move": "Поле \"{item}\" было передвинуто.", + "account_edit.field_reorder_modal.drag_over": "Поле \"{item}\" было передвинуто на поле \"{over}\".", + "account_edit.field_reorder_modal.drag_start": "Выбрано поле \"{item}\".", + "account_edit.field_reorder_modal.handle_label": "Переместить поле \"{item}\"", + "account_edit.field_reorder_modal.title": "Упорядочить поля профиля", + "account_edit.image_alt_modal.add_title": "Добавить альтернативный текст", + "account_edit.image_alt_modal.details_content": "НУЖНО:
    • Описывать себя по изображению
    • Говорить о себе в третьем лице, то есть, например, писать «Саша» вместо «я»
    • Придерживаться краткости и лаконичности — нескольких слов вполне достаточно
    НЕ НУЖНО:
    • Начинать со слова «Фото» — это избыточная информация для программ чтения с экрана
    ПРИМЕР:
    • «Саша в зелёной рубашке и очках»
    ", + "account_edit.image_alt_modal.details_title": "Советы по описанию фото профиля", + "account_edit.image_alt_modal.edit_title": "Редактировать альтернативный текст", + "account_edit.image_alt_modal.text_hint": "Альтернативный текст помогает пользователям программ для чтения с экрана понимать визуальное содержимое.", + "account_edit.image_alt_modal.text_label": "Альтернативный текст", + "account_edit.image_delete_modal.confirm": "Вы уверены, что хотите удалить изображение? Это действие невозможно отменить.", + "account_edit.image_delete_modal.delete_button": "Удалить", + "account_edit.image_delete_modal.title": "Удалить изображение?", + "account_edit.image_edit.add_button": "Загрузить изображение", + "account_edit.image_edit.alt_add_button": "Добавить описание", + "account_edit.image_edit.alt_edit_button": "Редактировать описание", + "account_edit.image_edit.remove_button": "Удалить изображение", + "account_edit.image_edit.replace_button": "Заменить изображение", + "account_edit.item_list.delete": "Удалить {name}", + "account_edit.item_list.edit": "Редактировать {name}", + "account_edit.name_modal.add_title": "Добавить отображаемое имя", + "account_edit.name_modal.edit_title": "Редактировать отображаемое имя", + "account_edit.profile_tab.button_label": "Настроить", + "account_edit.profile_tab.hint.description": "Эти настройки определяют, что будет видно пользователям сервера {server} в официальных приложениях, в то время как пользователи других серверов и сторонних приложений могут не учитывать эти настройки.", + "account_edit.profile_tab.hint.title": "Внешний вид может отличаться", + "account_edit.profile_tab.show_featured.description": "«Рекомендации» — это дополнительная вкладка, на которой вы можете показать другие профили.", + "account_edit.profile_tab.show_featured.title": "Показывать вкладку «Рекомендации»", + "account_edit.profile_tab.show_media.description": "«Медиа» — это дополнительная вкладка, на которой будут показаны ваши посты, содержащие изображения и видео.", + "account_edit.profile_tab.show_media.title": "Показывать вкладку «Медиа»", + "account_edit.profile_tab.show_media_replies.description": "Когда эта опция включена, на вкладке «Медиа» будут показаны в том числе ваши ответы на посты других людей.", + "account_edit.profile_tab.show_media_replies.title": "Показывать ответы на вкладке «Медиа»", + "account_edit.save": "Сохранить", + "account_edit.upload_modal.back": "Назад", + "account_edit.upload_modal.done": "Готово", + "account_edit.upload_modal.next": "Далее", + "account_edit.upload_modal.step_crop.zoom": "Масштаб", + "account_edit.upload_modal.step_upload.button": "Обзор файлов", + "account_edit.upload_modal.step_upload.dragging": "Перетащите сюда, чтобы загрузить", + "account_edit.upload_modal.step_upload.header": "Выберите изображение", + "account_edit.upload_modal.step_upload.hint": "Поддерживаются файлы WEBP, PNG, GIF и JPG размером не более {limit} МБ.{br}Изображение будет уменьшено до {width}x{height} пикселей.", + "account_edit.upload_modal.title_add.avatar": "Добавить фото профиля", + "account_edit.upload_modal.title_add.header": "Добавить обложку профиля", + "account_edit.upload_modal.title_replace.avatar": "Заменить фото профиля", + "account_edit.upload_modal.title_replace.header": "Заменить обложку профиля", + "account_edit.verified_modal.details": "Чтобы развеять сомнения в подлинности профиля, вы можете верифицировать ссылки на ваш сайт. Делается это так:", + "account_edit.verified_modal.invisible_link.details": "Разместите на своём сайте ссылку на ваш профиль. Ключевое значение имеет атрибут rel=\"me\", который не даёт выдать себя за другое лицо на сайтах, где контент создают сами пользователи. Вместо тега {tag} можно использовать тег в -секции страницы, но необходимо, чтобы HTML-код был доступен без выполнения JavaScript.", + "account_edit.verified_modal.invisible_link.summary": "Как сделать ссылку невидимой?", + "account_edit.verified_modal.step1.header": "Скопируйте и вставьте следующий код в HTML-разметку вашего сайта:", + "account_edit.verified_modal.step2.details": "Если в вашем профиле уже есть дополнительное поле со ссылкой на ваш сайт, вам нужно будет удалить его и добавить заново, чтобы запустить верификацию.", + "account_edit.verified_modal.step2.header": "Создайте новое поле профиля со ссылкой на ваш сайт", + "account_edit.verified_modal.title": "Добавление верифицированных ссылок", + "account_edit_tags.add_tag": "Добавить #{tagName}", + "account_edit_tags.column_title": "Редактировать теги", + "account_edit_tags.help_text": "Рекомендации хештегов помогают другим пользователям изучить ваш профиль и взаимодействовать с вами. Они будут показаны в виде фильтров над постами на странице вашего профиля.", + "account_edit_tags.max_tags_reached": "Вы достигли максимального количества рекомендаций хештегов.", + "account_edit_tags.search_placeholder": "Введите хештег…", + "account_edit_tags.suggestions": "Подсказки:", + "account_edit_tags.tag_status_count": "{count, plural, one {# пост} few {# поста} other {# постов}}", + "account_list.total": "{total, plural, one {# пользователь} few {# пользователя} other {# пользователей}}", "account_note.placeholder": "Текст заметки", "admin.dashboard.daily_retention": "Уровень удержания пользователей после регистрации, в днях", "admin.dashboard.monthly_retention": "Уровень удержания пользователей после регистрации, в месяцах", @@ -119,11 +265,12 @@ "annual_report.nav_item.badge": "Новый", "annual_report.shared_page.donate": "Пожертвовать", "annual_report.shared_page.footer": "Сгенерировано с {heart} командой Mastodon", - "annual_report.summary.archetype.booster.name": "Лучник", + "annual_report.summary.archetype.booster.name": "Репостер", "annual_report.summary.archetype.die_drei_fragezeichen": "???", "annual_report.summary.archetype.lurker.name": "Стоик", - "annual_report.summary.archetype.oracle.name": "Оракул", - "annual_report.summary.archetype.replier.name": "Бабочка", + "annual_report.summary.archetype.oracle.name": "Гуру", + "annual_report.summary.archetype.pollster.name": "Опросчик", + "annual_report.summary.archetype.replier.name": "Душа компании", "annual_report.summary.archetype.reveal": "Показать мой архетип", "annual_report.summary.archetype.title_public": "Архетип {name}", "annual_report.summary.archetype.title_self": "Ваш архетип", @@ -134,7 +281,6 @@ "annual_report.summary.new_posts.new_posts": "новых постов", "annual_report.summary.percentile.text": "Всё это помещает вас в топпользователей {domain}.", "annual_report.summary.percentile.we_wont_tell_bernie": "Роскомнадзор об этом не узнает.", - "annual_report.summary.share_elsewhere": "Поделиться на других", "annual_report.summary.share_on_mastodon": "Поделиться в Mastodon", "attachments_list.unprocessed": "(не обработан)", "audio.hide": "Скрыть аудио", @@ -161,12 +307,57 @@ "bundle_modal_error.close": "Закрыть", "bundle_modal_error.message": "Кое-что пошло не так при загрузке этой страницы.", "bundle_modal_error.retry": "Попробовать снова", + "callout.dismiss": "Закрыть", + "carousel.current": "Слайд {current, number} / {max, number}", "carousel.slide": "Слайд {current, number} из {max, number}", + "character_counter.recommended": "{currentLength}/{maxLength} символов", + "character_counter.required": "{currentLength}/{maxLength} символов", "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.title": "Регистрация в Mastodon", + "collection.share_modal.share_via_post": "Опубликовать в Mastodon", + "collection.share_modal.share_via_system": "Поделиться…", + "collection.share_modal.title": "Поделиться подборкой", + "collection.share_modal.title_new": "Поделитесь вашей новой подборкой!", + "collection.share_template_other": "Зацените эту замечательную подборку: {link}", + "collection.share_template_own": "Зацените мою новую подборку: {link}", + "collections.account_count": "{count, plural, one {# пользователь} few {# пользователя} other {# пользователей}}", + "collections.accounts.empty_title": "В этой подборке пока никого нет", + "collections.by_account": "составил(а) {account_handle}", + "collections.collection_description": "Описание", + "collections.collection_language": "Язык", + "collections.collection_language_none": "Не выбран", + "collections.collection_name": "Название", + "collections.collection_topic": "Тематика", + "collections.confirm_account_removal": "Вы уверены, что хотите исключить этого пользователя из подборки?", + "collections.content_warning": "Предупреждение о содержании", + "collections.continue": "Продолжить", + "collections.create.accounts_title": "Кого вы выберете для этой подборки?", + "collections.create.basic_details_title": "Основная информация", + "collections.create.steps": "Шаг {step}/{total}", + "collections.create_collection": "Создать подборку", + "collections.delete_collection": "Удалить подборку", + "collections.description_length_hint": "Не более 100 символов", + "collections.detail.author_added_you_on_date": "{author} добавил(а) вас {date}", + "collections.detail.sensitive_content": "Чувствительный контент", + "collections.edit_details": "Изменить параметры", + "collections.last_updated_at": "Последнее обновление: {date}", + "collections.manage_accounts": "Управление аккаунтами", + "collections.name_length_hint": "Не более 40 символов", + "collections.new_collection": "Новая подборка", + "collections.report_collection": "Пожаловаться на подборку", + "collections.revoke_collection_inclusion": "Исключить себя из этой подборки", + "collections.revoke_inclusion.confirmation": "Вы были исключены из подборки «{collection}»", + "collections.search_accounts_max_reached": "Вы добавили максимальное количество пользователей", + "collections.sensitive": "Чувствительный", + "collections.topic_hint": "Добавьте хештег, чтобы помочь другим пользователям лучше понять главную тему этой подборки.", + "collections.view_collection": "Посмотреть коллекцию", + "collections.visibility_public": "Публичная", + "collections.visibility_title": "Видимость", + "collections.visibility_unlisted": "Скрытая", + "collections.visibility_unlisted_hint": "Доступна всем, у кого есть ссылка. Скрыта из результатов поиска и рекомендаций.", "column.about": "О проекте", "column.blocks": "Заблокированные пользователи", "column.bookmarks": "Закладки", @@ -196,6 +387,11 @@ "column_header.show_settings": "Показать настройки", "column_header.unpin": "Открепить", "column_search.cancel": "Отмена", + "combobox.close_results": "Скрыть результаты", + "combobox.loading": "Загрузка", + "combobox.no_results_found": "Поиск не дал результатов", + "combobox.open_results": "Показать результаты", + "combobox.results_available": "Поиск дал {count, plural, one {# результат} few {# результата} other {# результатов}}. Используйте клавиши со стрелками для навигации. Чтобы выбрать, нажмите Enter.", "community.column_settings.local_only": "Только локальные", "community.column_settings.media_only": "Только с медиафайлами", "community.column_settings.remote_only": "Только с других серверов", @@ -229,6 +425,9 @@ "confirmations.delete.confirm": "Удалить", "confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?", "confirmations.delete.title": "Удалить пост?", + "confirmations.delete_collection.confirm": "Удалить", + "confirmations.delete_collection.message": "Это действие невозможно отменить.", + "confirmations.delete_collection.title": "Удалить «{name}»?", "confirmations.delete_list.confirm": "Удалить", "confirmations.delete_list.message": "Вы уверены, что хотите навсегда удалить этот список?", "confirmations.delete_list.title": "Удалить список?", @@ -267,6 +466,9 @@ "confirmations.remove_from_followers.confirm": "Убрать подписчика", "confirmations.remove_from_followers.message": "Пользователь {name} перестанет быть подписан на вас. Продолжить?", "confirmations.remove_from_followers.title": "Убрать подписчика?", + "confirmations.revoke_collection_inclusion.confirm": "Исключить меня", + "confirmations.revoke_collection_inclusion.message": "Это действие необратимо, и куратор подборки не сможет добавить вас в неё заново.", + "confirmations.revoke_collection_inclusion.title": "Исключить вас из подборки?", "confirmations.revoke_quote.confirm": "Убрать пост", "confirmations.revoke_quote.message": "Это действие невозможно отменить.", "confirmations.revoke_quote.title": "Убрать пост?", @@ -279,11 +481,13 @@ "content_warning.hide": "Скрыть пост", "content_warning.show": "Всё равно показать", "content_warning.show_more": "Развернуть", + "content_warning.show_short": "Показать", "conversation.delete": "Удалить беседу", "conversation.mark_as_read": "Отметить как прочитанное", "conversation.open": "Просмотр беседы", "conversation.with": "С {names}", "copy_icon_button.copied": "Скопировано в буфер обмена", + "copy_icon_button.copy_this_text": "Копировать ссылку в буфер обмена", "copypaste.copied": "Скопировано", "copypaste.copy_to_clipboard": "Копировать в буфер обмена", "directory.federated": "Со всего федивёрса", @@ -317,7 +521,13 @@ "domain_pill.your_handle": "Ваш адрес:", "domain_pill.your_server": "Ваш цифровой дом, где находятся все ваши посты. Если вам не нравится этот сервер, вы можете в любое время перенести свою учётную запись на другой сервер, не теряя подписчиков.", "domain_pill.your_username": "Ваш уникальный идентификатор на этом сервере. На разных серверах могут встречаться люди с тем же именем пользователя.", - "dropdown.empty": "Выберите опцию", + "dropdown.empty": "Выберите вариант", + "email_subscriptions.email": "Адрес электронной почты", + "email_subscriptions.form.action": "Подписаться", + "email_subscriptions.form.title": "Оформите email-подписку на этого пользователя", + "email_subscriptions.submitted.title": "Ещё один шаг", + "email_subscriptions.validation.email.blocked": "Почтовый сервис заблокирован", + "email_subscriptions.validation.email.invalid": "Некорректный адрес электронной почты", "embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:", "embed.preview": "Так это будет выглядеть:", "emoji_button.activity": "Занятия", @@ -335,9 +545,6 @@ "emoji_button.search_results": "Результаты поиска", "emoji_button.symbols": "Символы", "emoji_button.travel": "Путешествия и места", - "empty_column.account_featured.me": "Вы ещё ничего не рекомендовали в своём профиле. Знаете ли вы, что вы можете рекомендовать в своём профиле часто используемые вами хештеги и даже профили друзей?", - "empty_column.account_featured.other": "{acct} ещё ничего не рекомендовал(а) в своём профиле. Знаете ли вы, что вы можете рекомендовать в своём профиле часто используемые вами хештеги и даже профили друзей?", - "empty_column.account_featured_other.unknown": "Этот пользователь ещё ничего не рекомендовал в своём профиле.", "empty_column.account_hides_collections": "Пользователь предпочёл не раскрывать эту информацию", "empty_column.account_suspended": "Учётная запись заблокирована", "empty_column.account_timeline": "Здесь нет постов!", @@ -360,7 +567,8 @@ "empty_column.notification_requests": "Здесь ничего нет! Когда вы получите новые уведомления, они здесь появятся согласно вашим настройкам.", "empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.", "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других серверов, чтобы заполнить ленту", - "error.no_hashtag_feed_access": "Зарегистрируйтесь или войдите, чтобы читать и подписаться на этот хэштег.", + "empty_state.no_results": "Ничего не найдено", + "error.no_hashtag_feed_access": "Чтобы просматривать этот хештег или подписаться на него, необходимо зарегистрироваться или войти.", "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде эта страница не может быть корректно отображена.", "error.unexpected_crash.explanation_addons": "Эта страница не может быть корректно отображена. Скорее всего, ошибка вызвана расширением браузера или инструментом автоматического перевода.", "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если это не поможет, вы, возможно, всё ещё сможете использовать Mastodon в другом браузере или приложении.", @@ -375,6 +583,9 @@ "featured_carousel.current": "Пост {current, number} / {max, number}", "featured_carousel.header": "{count, plural, other {Закреплённые посты}}", "featured_carousel.slide": "Пост {current, number} из {max, number}", + "featured_tags.more_items": "+{count}", + "featured_tags.suggestions.add": "Добавить", + "featured_tags.suggestions.dismiss": "Нет, спасибо", "filter_modal.added.context_mismatch_explanation": "Этот фильтр не применяется в том контексте, в котором вы видели этот пост. Если вы хотите, чтобы пост был отфильтрован в текущем контексте, необходимо редактировать фильтр.", "filter_modal.added.context_mismatch_title": "Несоответствие контекста", "filter_modal.added.expired_explanation": "Этот фильтр истёк. Чтобы он был применён, вам нужно изменить срок действия фильтра.", @@ -416,8 +627,11 @@ "follow_suggestions.view_all": "Посмотреть все", "follow_suggestions.who_to_follow": "На кого подписаться", "followed_tags": "Подписки на хештеги", + "followers.title": "Подписчики", + "following.title": "Подписки", "footer.about": "О проекте", "footer.about_mastodon": "О Mastodon", + "footer.about_server": "О сервере {domain}", "footer.about_this_server": "Об этом сервере", "footer.directory": "Каталог профилей", "footer.get_app": "Скачать приложение", @@ -426,6 +640,8 @@ "footer.source_code": "Исходный код", "footer.status": "Состояние сервера", "footer.terms_of_service": "Пользовательское соглашение", + "form_error.blank": "Это поле должно быть заполнено.", + "form_field.optional": "(необязательно)", "generic.saved": "Сохранено", "getting_started.heading": "Добро пожаловать", "hashtag.admin_moderation": "Открыть интерфейс модератора для #{name}", @@ -482,7 +698,7 @@ "interaction_modal.on_another_server": "На другом сервере", "interaction_modal.on_this_server": "На этом сервере", "interaction_modal.title": "Войдите, чтобы продолжить", - "interaction_modal.username_prompt": "Например, {example}", + "interaction_modal.username_prompt": "Например: {example}", "intervals.full.days": "{number, plural, one {# день} few {# дня} other {# дней}}", "intervals.full.hours": "{number, plural, one {# час} few {# часа} other {# часов}}", "intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}", @@ -492,6 +708,7 @@ "keyboard_shortcuts.column": "фокус на одном из столбцов", "keyboard_shortcuts.compose": "фокус на поле ввода", "keyboard_shortcuts.description": "Описание", + "keyboard_shortcuts.direct": "перейти к личным упоминаниям", "keyboard_shortcuts.down": "вниз по списку", "keyboard_shortcuts.enter": "открыть пост", "keyboard_shortcuts.favourite": "добавить пост в избранное", @@ -579,6 +796,7 @@ "navigation_bar.automated_deletion": "Автоудаление постов", "navigation_bar.blocks": "Заблокированные пользователи", "navigation_bar.bookmarks": "Закладки", + "navigation_bar.collections": "Подборки", "navigation_bar.direct": "Личные упоминания", "navigation_bar.domain_blocks": "Заблокированные домены", "navigation_bar.favourites": "Избранное", @@ -726,12 +944,14 @@ "notifications_permission_banner.title": "Будьте в курсе происходящего", "onboarding.follows.back": "Назад", "onboarding.follows.empty": "К сожалению, на данный момент предложения отсутствуют. Чтобы найти, на кого подписаться, вы можете просматривать раздел «Актуальное» или воспользоваться поиском.", + "onboarding.follows.next": "Следующий шаг: Создайте профиль", "onboarding.follows.search": "Поиск", "onboarding.follows.title": "Начните подписываться на людей", "onboarding.profile.discoverable": "Сделать мой профиль доступным для поиска", "onboarding.profile.discoverable_hint": "Если вы согласитесь сделать профиль доступным для поиска в Mastodon, ваши посты могут быть показаны в результатах поиска и в разделе «Актуальное», а ваш профиль может быть предложен людям со схожими интересами.", "onboarding.profile.display_name": "Отображаемое имя", "onboarding.profile.display_name_hint": "Ваше полное имя или псевдоним…", + "onboarding.profile.finish": "Готово", "onboarding.profile.note": "О себе", "onboarding.profile.note_hint": "Вы можете @упоминать других людей, а также использовать #хештеги…", "onboarding.profile.title": "Создайте свой профиль", @@ -757,6 +977,7 @@ "privacy.private.short": "Для подписчиков", "privacy.public.long": "Для кого угодно в интернете", "privacy.public.short": "Публичный", + "privacy.quote.anyone": "{visibility}, с возможностью цитирования", "privacy.quote.disabled": "{visibility}, без возможности цитирования", "privacy.quote.limited": "{visibility}, с ограничениями цитирования", "privacy.unlisted.additional": "Похоже на «Публичный» за исключением того, что пост не появится ни в живых лентах, ни в лентах хештегов, ни в разделе «Актуальное», ни в поиске Mastodon, даже если вы разрешили поиск по своим постам в настройках профиля.", @@ -802,6 +1023,7 @@ "report.category.title_account": "этим профилем", "report.category.title_status": "этим постом", "report.close": "Готово", + "report.collection_comment": "Почему вы хотите пожаловаться на эту подборку?", "report.comment.title": "Есть ли ещё подробности, о которых нам стоит знать?", "report.forward": "Переслать в {target}", "report.forward_hint": "Эта учётная запись расположена на другом сервере. Отправить туда обезличенную копию вашей жалобы?", @@ -823,6 +1045,7 @@ "report.rules.title": "Какие правила нарушены?", "report.statuses.subtitle": "Отметьте все подходящие посты", "report.statuses.title": "Выберите посты, которые относятся к вашей жалобе.", + "report.submission_error": "Не удалось отправить жалобу", "report.submit": "Отправить", "report.target": "Жалоба на {target}", "report.thanks.take_action": "Вот несколько средств, с помощью которых можно контролировать, что вы видите в Mastodon:", @@ -876,6 +1099,7 @@ "sign_in_banner.mastodon_is": "Mastodon — лучший способ быть в курсе всего происходящего.", "sign_in_banner.sign_in": "Войти", "sign_in_banner.sso_redirect": "Вход/Регистрация", + "skip_links.skip_to_content": "Перейти к основному содержимому", "status.admin_account": "Открыть интерфейс модератора для @{name}", "status.admin_domain": "Открыть интерфейс модератора для {domain}", "status.admin_status": "Открыть этот пост в интерфейсе модератора", @@ -975,6 +1199,7 @@ "tabs_bar.notifications": "Уведомления", "tabs_bar.publish": "Создать пост", "tabs_bar.search": "Поиск", + "tag.remove": "Удалить", "terms_of_service.effective_as_of": "Действует с {date}", "terms_of_service.title": "Пользовательское соглашение", "terms_of_service.upcoming_changes_on": "Изменения вступают в силу с {date}", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index 9426a9c5c07662..dbaf6f7136be82 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -25,8 +25,6 @@ "account.edit_profile": "Управити профіл", "account.enable_notifications": "Уповістити ня, кой {name} пише", "account.endorse": "Указовати на профілови", - "account.featured_tags.last_status_at": "Датум послідньої публикації {date}", - "account.featured_tags.last_status_never": "Ниє публикацій", "account.follow": "Пудписати ся", "account.follow_back": "Пудписати ся тоже", "account.followers": "Пудписникы", @@ -49,7 +47,6 @@ "account.no_bio": "Описа ниє.", "account.open_original_page": "Удоперти ориґіналну сторунку", "account.posts": "Публикації", - "account.posts_with_replies": "Публикації тай удповіді", "account.report": "Скарговати ся на {name}", "account.requested_follow": "Хосновач {name} просит ся пудписати ся на вас", "account.share": "Пошырити профіл хосновача {name}", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 129f1cd3e56a1e..d4d93e292c6657 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -23,8 +23,6 @@ "account.edit_profile": "सम्पाद्यताम्", "account.enable_notifications": "यदा @{name} स्थापयति तदा मां ज्ञापय", "account.endorse": "व्यक्तिगतविवरणे वैशिष्ट्यम्", - "account.featured_tags.last_status_at": "{date} दिने गतस्थापनम्", - "account.featured_tags.last_status_never": "न पत्रम्", "account.follow": "अनुस्रियताम्", "account.followers": "अनुसर्तारः", "account.followers.empty": "नाऽनुसर्तारो वर्तन्ते", @@ -44,7 +42,6 @@ "account.muted": "निःशब्दम्", "account.open_original_page": "मूलपृष्ठमुट्घाटय", "account.posts": "पत्राणि", - "account.posts_with_replies": "पत्राणि प्रत्युत्तराणि च", "account.report": "आविद्यताम् @{name}", "account.requested_follow": "{name} त्वामनुसर्तुमयाचीत्", "account.share": "@{name} मित्रस्य विवरणं विभाज्यताम्", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index d05c906d68d2bf..5bbeef42c21a13 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -21,12 +21,10 @@ "account.block_domain": "Bloca su domìniu {domain}", "account.block_short": "Bloca", "account.blocked": "Blocadu", - "account.blocking": "Blocadu", "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_blocking": "Blocamus su domìniu", "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", @@ -35,9 +33,6 @@ "account.familiar_followers_two": "Sighidu dae {name1} e {name2}", "account.featured": "In evidèntzia", "account.featured.accounts": "Profilos", - "account.featured.hashtags": "Etichetas", - "account.featured_tags.last_status_at": "Ùrtima publicatzione in su {date}", - "account.featured_tags.last_status_never": "Peruna publicatzione", "account.follow": "Sighi", "account.follow_back": "Sighi tue puru", "account.followers": "Sighiduras", @@ -62,15 +57,12 @@ "account.mute_notifications_short": "Pone is notìficas a sa muda", "account.mute_short": "A sa muda", "account.muted": "A sa muda", - "account.muting": "A sa muda", "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.remove_from_followers": "Cantzella a {name} dae is sighiduras", "account.report": "Signala @{name}", "account.requested_follow": "{name} at dimandadu de ti sighire", - "account.requests_to_follow_you": "Rechestas de sighidura", "account.share": "Cumpartzi su profilu de @{name}", "account.show_reblogs": "Ammustra is cumpartziduras de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index fe01061b4ddeaa..73fd8211019b09 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -22,8 +22,6 @@ "account.edit_profile": "Edit profile", "account.enable_notifications": "Notify me whan @{name} posts", "account.endorse": "Shaw oan profile", - "account.featured_tags.last_status_at": "Last post oan {date}", - "account.featured_tags.last_status_never": "Nae posts", "account.follow": "Follae", "account.followers": "Follaers", "account.followers.empty": "Naebody follaes this uiser yit.", @@ -42,7 +40,6 @@ "account.muted": "Whesht", "account.open_original_page": "Open the furst page", "account.posts": "Posts", - "account.posts_with_replies": "Posts an repones", "account.report": "Clype @{name}", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Shaw heezes frae @{name}", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 126fc4d0720990..d0fd49ad7fc3ec 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -20,12 +20,10 @@ "account.block_domain": "{domain} වසම අවහිර කරන්න", "account.block_short": "අවහිර", "account.blocked": "අවහිර කර ඇත", - "account.blocking": "අවහිර කිරීම", "account.cancel_follow_request": "අනුගමනය කිරීම අවලංගු කරන්න", "account.copy": "පැතිකඩට සබැඳිය පිටපත් කරන්න", "account.direct": "පෞද්ගලිකව @{name}සඳහන් කරන්න", "account.disable_notifications": "@{name} පළ කරන විට මට දැනුම් නොදෙන්න", - "account.domain_blocking": "වසම අවහිර කිරීම", "account.edit_profile": "පැතිකඩ සංස්කරණය", "account.enable_notifications": "@{name} පළ කරන විට මට දැනුම් දෙන්න", "account.endorse": "පැතිකඩෙහි විශේෂාංගය", @@ -34,9 +32,6 @@ "account.familiar_followers_two": "පසුව {name1} සහ {name2}", "account.featured": "විශේෂාංග සහිත", "account.featured.accounts": "පැතිකඩ", - "account.featured.hashtags": "හැෂ් ටැග්", - "account.featured_tags.last_status_at": "අවසාන ලිපිය: {date}", - "account.featured_tags.last_status_never": "ලිපි නැත", "account.follow": "අනුගමනය", "account.follow_back": "ආපසු අනුගමනය කරන්න", "account.followers": "අනුගාමිකයින්", @@ -60,16 +55,13 @@ "account.mute_notifications_short": "දැනුම්දීම් නිහඬ කරන්න", "account.mute_short": "නිහඬ", "account.muted": "නිහඬ කළා", - "account.muting": "නිහඬ කිරීම", "account.mutual": "ඔබ එකිනෙකා අනුගමනය කරන්න.", "account.no_bio": "විස්තරයක් සපයා නැත.", "account.open_original_page": "මුල් පිටුව අරින්න", "account.posts": "ලිපි", - "account.posts_with_replies": "ලිපි සහ පිළිතුරු", "account.remove_from_followers": "අනුගාමිකයින්ගෙන් {name} ඉවත් කරන්න", "account.report": "@{name} වාර්තා කරන්න", "account.requested_follow": "{name} ඔබව අනුගමනය කිරීමට ඉල්ලා ඇත.", - "account.requests_to_follow_you": "ඔබව අනුගමනය කිරීමට ඉල්ලීම්", "account.share": "@{name} ගේ පැතිකඩ බෙදාගන්න", "account.show_reblogs": "@{name}වෙතින් බූස්ට් පෙන්වන්න", "account.statuses_counter": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}}", @@ -280,7 +272,6 @@ "emoji_button.search_results": "සෙවුම් ප්‍රතිඵල", "emoji_button.symbols": "සංකේත", "emoji_button.travel": "චාරිකා සහ ස්ථාන", - "empty_column.account_featured_other.unknown": "මෙම ගිණුමේ තවමත් කිසිවක් විශේෂාංගගත කර නොමැත.", "empty_column.account_hides_collections": "මෙම පරිශීලකයා මෙම තොරතුරු ලබා ගත නොහැකි ලෙස සකස් කර ඇත.", "empty_column.account_suspended": "ගිණුම අත්හිටුවා ඇත", "empty_column.account_timeline": "මෙහි ලිපි නැත!", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 0d073db623793b..05ac8dbac6ac3c 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -22,12 +22,10 @@ "account.block_domain": "Blokovať doménu {domain}", "account.block_short": "Blokovať", "account.blocked": "Účet blokovaný", - "account.blocking": "Blokované", "account.cancel_follow_request": "Zrušiť žiadosť o sledovanie", "account.copy": "Skopírovať odkaz na profil", "account.direct": "Súkromne označiť @{name}", "account.disable_notifications": "Zrušiť upozornenia na príspevky od @{name}", - "account.domain_blocking": "Blokované domény", "account.edit_profile": "Upraviť profil", "account.edit_profile_short": "Upraviť", "account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}", @@ -37,9 +35,6 @@ "account.familiar_followers_two": "Nasledovanie od {name1} a {name2}", "account.featured": "Zviditeľnené", "account.featured.accounts": "Profily", - "account.featured.hashtags": "Hashtagy", - "account.featured_tags.last_status_at": "Posledný príspevok dňa {date}", - "account.featured_tags.last_status_never": "Žiadne príspevky", "account.filters.posts_only": "Príspevky", "account.filters.posts_replies": "Príspevky a odpovede", "account.follow": "Sledovať", @@ -71,16 +66,13 @@ "account.mute_notifications_short": "Stíšiť upozornenia", "account.mute_short": "Stíšiť", "account.muted": "Účet stíšený", - "account.muting": "Stíšenie", "account.mutual": "Sledujete sa navzájom", "account.no_bio": "Nie je uvedený žiadny popis.", "account.open_original_page": "Otvoriť pôvodnú stránku", "account.posts": "Príspevky", - "account.posts_with_replies": "Príspevky a odpovede", "account.remove_from_followers": "Zrušiť sledovanie od {name}", "account.report": "Nahlásiť @{name}", "account.requested_follow": "{name} vás chce sledovať", - "account.requests_to_follow_you": "Žiadosti o sledovanie", "account.share": "Zdieľaj profil @{name}", "account.show_reblogs": "Zobrazovať zdieľania od @{name}", "account.statuses_counter": "{count, plural, one {{counter} príspevok} other {{counter} príspevkov}}", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index b13ae55d10579b..3157b06a33c61e 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -21,12 +21,10 @@ "account.block_domain": "Blokiraj domeno {domain}", "account.block_short": "Blokiraj", "account.blocked": "Blokirano", - "account.blocking": "Blokirano", "account.cancel_follow_request": "Umakni zahtevo za sledenje", "account.copy": "Kopiraj povezavo do profila", "account.direct": "Zasebno omeni @{name}", "account.disable_notifications": "Ne obveščaj me več, ko ima @{name} novo objavo", - "account.domain_blocking": "Blokirana domena", "account.edit_profile": "Uredi profil", "account.edit_profile_short": "Uredi", "account.enable_notifications": "Obvesti me, ko ima @{name} novo objavo", @@ -34,9 +32,6 @@ "account.familiar_followers_one": "Sledi {name1}", "account.featured": "Izpostavljeni", "account.featured.accounts": "Profili", - "account.featured.hashtags": "Ključniki", - "account.featured_tags.last_status_at": "Zadnja objava {date}", - "account.featured_tags.last_status_never": "Ni objav", "account.follow": "Sledi", "account.follow_back": "Sledi nazaj", "account.follow_back_short": "Sledi nazaj", @@ -66,16 +61,13 @@ "account.mute_notifications_short": "Utišaj obvestila", "account.mute_short": "Utišaj", "account.muted": "Utišan", - "account.muting": "Izklop zvoka", "account.mutual": "Drug drugemu sledita", "account.no_bio": "Ni opisa.", "account.open_original_page": "Odpri izvirno stran", "account.posts": "Objave", - "account.posts_with_replies": "Objave in odgovori", "account.remove_from_followers": "Odstrani {name} iz sledilcev", "account.report": "Prijavi @{name}", "account.requested_follow": "{name} vam želi slediti", - "account.requests_to_follow_you": "Vas prosi za sledenje", "account.share": "Deli profil osebe @{name}", "account.show_reblogs": "Pokaži izpostavitve osebe @{name}", "account.statuses_counter": "{count, plural, one {{counter} objava} two {{counter} objavi} few {{counter} objave} other {{counter} objav}}", @@ -173,7 +165,6 @@ "column.about": "O programu", "column.blocks": "Blokirani uporabniki", "column.bookmarks": "Zaznamki", - "column.collections": "Moje zbirke", "column.community": "Krajevna časovnica", "column.create_list": "Ustvari seznam", "column.direct": "Zasebne omembe", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 076830d3f31d1e..3e7f274aa51976 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -28,12 +28,10 @@ "account.block_domain": "Blloko përkatësinë {domain}", "account.block_short": "Bllokoje", "account.blocked": "E bllokuar", - "account.blocking": "Bllokim", "account.cancel_follow_request": "Tërhiq mbrapsht kërkesë për ndjekje", "account.copy": "Kopjoje lidhjen te profili", "account.direct": "Përmendje private për @{name}", "account.disable_notifications": "Resht së njoftuari mua, kur poston @{name}", - "account.domain_blocking": "Bllokim përkatësie", "account.edit_note": "Përpunoni shënim personal", "account.edit_profile": "Përpunoni profilin", "account.edit_profile_short": "Përpunojeni", @@ -45,9 +43,7 @@ "account.featured": "Të zgjedhur", "account.featured.accounts": "Profile", "account.featured.collections": "Koleksione", - "account.featured.hashtags": "Hashtag-ë", - "account.featured_tags.last_status_at": "Postimi i fundit më {date}", - "account.featured_tags.last_status_never": "Pa postime", + "account.featured.new_collection": "Koleksion i ri", "account.field_overflow": "Shfaq lëndë të plotë", "account.filters.all": "Krejt veprimtarinë", "account.filters.boosts_toggle": "Shfaq përforcime", @@ -73,8 +69,19 @@ "account.go_to_profile": "Kalo te profili", "account.hide_reblogs": "Fshih përforcime nga @{name}", "account.in_memoriam": "In Memoriam.", + "account.join_modal.day": "Ditë", + "account.join_modal.me": "U bëtë pjesë e {server} më", + "account.join_modal.me_anniversary": "Gëzuar përvjetorin në Fedivers! U bëtë pjesë e {server} më", + "account.join_modal.me_today": "Është dita jua e parë në {server}!", + "account.join_modal.other": "{name} erdhi në {server} më", + "account.join_modal.other_today": "Është dita e parë në {server} për {name}!", + "account.join_modal.share.celebrate": "Ndani me të tjerë një postim kremtimi", + "account.join_modal.share.intro": "Ndani me të tjerë një postim hyrës", + "account.join_modal.share.welcome": "Mdani me të tjerë një postim mirëseardhjeje", + "account.join_modal.years": "{number, plural, one {vit} other {vjet}}", "account.joined_short": "U bë pjesë", "account.languages": "Ndryshoni gjuhë pajtimesh", + "account.last_active": "Aktiv së fundi më", "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}", "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.", "account.media": "Media", @@ -102,11 +109,10 @@ "account.mute_notifications_short": "Mos shfaq njoftime", "account.mute_short": "Mos i shfaq", "account.muted": "Heshtuar", - "account.muting": "Heshtim", "account.mutual": "Ndiqni njëri-tjetrin", "account.name.help.domain": "{domain} është shërbyesi që strehon profilin dhe postimet e përdoruesit.", "account.name.help.domain_self": "{domain} është shërbyesi juaj që strehon profilin dhe postimet tuaja.", - "account.name.help.footer": "Ashtu siç mund të dërgoni email-e për persona që përdorin shërbime të ndryshëm email, mund të ndërveproni me persona në shërbyes të tjerë Mastodon – dhe me këdo në aplikacione të tjerë shoqërorë të ngritur mbi të njëjtin grup rregullash që përdor Mastodon-i (protokollin ActivityPub).", + "account.name.help.footer": "Ashtu siç mund të dërgoni email-e te persona që përdorin shërbime të ndryshëm email-i, mund të ndërveproni me persona në shërbyes të tjerë Mastodon dhe me këdo në aplikacione të tjerë shoqërorë të përputhshëm me Mastodon-in.", "account.name.help.header": "Handle-i është i ngashëm me një adresë email", "account.name.help.username": "{username} është emri i përdoruesit të kësaj llogarie në shërbyesin e tij. Dikush në një tjetër shërbyes mund të ketë të njëjtin emër përdoruesi.", "account.name.help.username_self": "{username} është emri juaj i përdoruesit në këtë shërbyes. Dikush në një tjetër shërbyes mund të ketë të njëjtin emër përdoruesi.", @@ -121,12 +127,11 @@ "account.note.edit_button": "Përpunojeni", "account.note.title": "Shënim personal (i dukshëm vetëm për ju)", "account.open_original_page": "Hap faqen origjinale", + "account.pending": "Në pritje të shqyrtimit", "account.posts": "Mesazhe", - "account.posts_with_replies": "Mesazhe dhe përgjigje", "account.remove_from_followers": "Hiqe {name} nga ndjekësit", "account.report": "Raportojeni @{name}", "account.requested_follow": "{name} ka kërkuar t’ju ndjekë", - "account.requests_to_follow_you": "Kërkesa për t’ju ndjekur", "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} postim} other {{counter} postime}}", @@ -141,34 +146,42 @@ "account.unmute": "Ktheji zërin @{name}", "account.unmute_notifications_short": "Shfaqi njoftimet", "account.unmute_short": "Çheshtoje", + "account_edit.advanced_settings.bot_hint": "Sinjalizojuni të tjerëve se llogari kryesisht kryen veprime të automatizuara dhe mund të mos vëzhgohet", + "account_edit.advanced_settings.bot_label": "Llogari e automatizuar", + "account_edit.advanced_settings.title": "Rregullime të mëtejshme", + "account_edit.bio.add_label": "Shtoni jetëshkrim", + "account_edit.bio.edit_label": "Përpunoni jetëshkrim", "account_edit.bio.placeholder": "Shtoni një hyrje të shkurtër për të ndihmuar të tjerët t’ju identifikojnë.", "account_edit.bio.title": "Jetëshkrim", "account_edit.bio_modal.add_title": "Shtoni jetëshkrim", "account_edit.bio_modal.edit_title": "Përpunoni jetëshkrim", - "account_edit.button.add": "Shtoje {item}", - "account_edit.button.delete": "Fshije {item}", - "account_edit.button.edit": "Përpunojeni {item}", "account_edit.column_button": "U bë", "account_edit.column_title": "Përpunoni Profil", - "account_edit.custom_fields.name": "fushë", + "account_edit.custom_fields.add_label": "Shtoni fushë", + "account_edit.custom_fields.edit_label": "Përpunoni fushë", "account_edit.custom_fields.placeholder": "Shtoni përemrat tuaj, lidhje të jashme, ose gjithçka tjetë që do të donit të ndanit me të tjerë.", "account_edit.custom_fields.reorder_button": "Rirenditi fushat", "account_edit.custom_fields.tip_content": "Mundeni të shtoni kollak besueshmëri për llogarinë tuaj Mastodon duke verifikuar lidhje për te çfarëdo sajti që është pronë e juaja.", "account_edit.custom_fields.tip_title": "Ndihmëz: Duke shtuar lidhje të verifikuara", "account_edit.custom_fields.title": "Fusha vetjake", "account_edit.custom_fields.verified_hint": "Si të shtoj një lidhje të verifikuar?", + "account_edit.display_name.add_label": "Shtoni emër në ekran", + "account_edit.display_name.edit_label": "Përpunoni emër në ekran", "account_edit.display_name.placeholder": "Emri juaj në ekran është ajo si duket emri juaj në profilikin dhe rrjedhat tuaja kohore.", "account_edit.display_name.title": "Emër në ekran", - "account_edit.featured_hashtags.item": "hashtag-ë", + "account_edit.featured_hashtags.edit_label": "Shtoni hashtag-ë", "account_edit.featured_hashtags.placeholder": "Ndihmoni të tjerët të identifikojnë dhe të hyjnë shpejt e shpejt te subjektet tuaj të parapëlqyer.", "account_edit.featured_hashtags.title": "Hashtag-ë të zgjedhur", + "account_edit.field_actions.delete": "Fshije fushën", + "account_edit.field_actions.edit": "Përpunoni fushën", "account_edit.field_delete_modal.confirm": "Jeni i sigurt se doni të fshihet kjo fushë e përshtatur? Ky veprim s’mund të zhbëhet.", "account_edit.field_delete_modal.delete_button": "Fshije", "account_edit.field_delete_modal.title": "Të fshihet fushë e përshtatur?", "account_edit.field_edit_modal.add_title": "Shtoni fushë të përshtatur", + "account_edit.field_edit_modal.discard_confirm": "Hidhe tej", + "account_edit.field_edit_modal.discard_message": "Keni ndryshime të paruajtura. Jeni i sigurt se doni të hidhen tej?", "account_edit.field_edit_modal.edit_title": "Përpunoni fushë të përshtatur", - "account_edit.field_edit_modal.limit_header": "U tejkalua kufi i rekomanduar shenjash", - "account_edit.field_edit_modal.limit_message": "Përdorues me celular mund të mos e shohin të plotë fushën tuaj.", + "account_edit.field_edit_modal.length_warning": "U tejkaluar kufi i rekomanduar shenjash. Përdorues në celular mund të mos shohin të plotë fushën tuaj.", "account_edit.field_edit_modal.link_emoji_warning": "Rekomandojmë të mos përdoren emoji të përshtatur tok me url-ra. Fusha të përshtatura që i përmbajnë të dyja llojetn do t’i shfaqin si tekst, në vend se si një lidhje, për të parandaluar ngatërrim të përdoruesve.", "account_edit.field_edit_modal.name_hint": "P.sh., “Sajt personal”", "account_edit.field_edit_modal.name_label": "Etiketë", @@ -196,6 +209,8 @@ "account_edit.image_edit.alt_edit_button": "Përpunoni tekst alternativ", "account_edit.image_edit.remove_button": "Hiqe figurën", "account_edit.image_edit.replace_button": "Zëvendësoje figurën", + "account_edit.item_list.delete": "Fshije {name}", + "account_edit.item_list.edit": "Përpunojeni {name}", "account_edit.name_modal.add_title": "Shtoni emër në ekran", "account_edit.name_modal.edit_title": "Përpunoni emër në ekran", "account_edit.profile_tab.button_label": "Përshtateni", @@ -207,8 +222,6 @@ "account_edit.profile_tab.show_media.title": "Shfaq skedë “Media”", "account_edit.profile_tab.show_media_replies.description": "Kur aktivizohet, skeda Media shfaq si postimet tuaja, ashtu edhe përgjigje te postime nga persona të tjerë.", "account_edit.profile_tab.show_media_replies.title": "Përfshi te skeda “Media” përgjigje", - "account_edit.profile_tab.subtitle": "Përshtatni skedat në profilin tuaj dhe ato çka shfaqet në to.", - "account_edit.profile_tab.title": "Rregullime skede profili", "account_edit.save": "Ruaje", "account_edit.upload_modal.back": "Mbrapsht", "account_edit.upload_modal.done": "U bë", @@ -218,8 +231,10 @@ "account_edit.upload_modal.step_upload.dragging": "Lëreni, që të ngarkohet", "account_edit.upload_modal.step_upload.header": "Zgjidhni një figurë", "account_edit.upload_modal.step_upload.hint": "Format WEBP, PNG, GIF ose JPG, deri në {limit}MB.{br}Figura do të ripërmasohet në {width}x{height}px.", - "account_edit.upload_modal.title_add": "Shtoni figurë profili", - "account_edit.upload_modal.title_replace": "Zëvendësoni figurë profili", + "account_edit.upload_modal.title_add.avatar": "Shtoni foto profili", + "account_edit.upload_modal.title_add.header": "Shtoni foto profili", + "account_edit.upload_modal.title_replace.avatar": "Zëvendësoni foto profili", + "account_edit.upload_modal.title_replace.header": "Zëvendësoni foto profili", "account_edit.verified_modal.details": "Shtoni besueshmëri te profili juaj Mastodon duke verifikuar lidhje për te sajte personalë. Ja se si funksionon:", "account_edit.verified_modal.invisible_link.details": "Shtojeni lidhjen te kryet tuaja. Pjesa e rëndësishme është rel=\"me\", e cila pengon imitime në sajte me lëndë të prodhuar nga përdoruesit. Mundeni madje të përdorni një etiketë lidhjeje te kryet e faqes në vend të {tag}, por HTML-ja duhet të jetë e përdorshme pa ekzekutim të JavaScript-it.", "account_edit.verified_modal.invisible_link.summary": "Si ta bëj lidhjen të padukshme?", @@ -228,11 +243,13 @@ "account_edit.verified_modal.step2.header": "Shtojeni sajtin tuaj si një fushë të përshtatur", "account_edit.verified_modal.title": "Si të shtohet një lidhje e verifikuar", "account_edit_tags.add_tag": "Shtoje #{tagName}", - "account_edit_tags.column_title": "Përpunoni hashtag-ë të zgjedhur", + "account_edit_tags.column_title": "Përpunoni Etiketa", "account_edit_tags.help_text": "Hashtag-ët e zgjedhur i ndihmojnë përdoruesit të zbulojnë dhe ndërveprojnë me profilin tuaj. Ata duken si filtra te pamja Veprimtari e faqes tuaj të Profilit.", + "account_edit_tags.max_tags_reached": "Keni mbërritur në numrin maksimum të hashtag-ëve të zgjedhur.", "account_edit_tags.search_placeholder": "Jepni një hashtag…", "account_edit_tags.suggestions": "Sugjerime:", "account_edit_tags.tag_status_count": "{count, plural, one {# postim} other {# postime}}", + "account_list.total": "{total, plural, one {# llogari} other {# llogari}}", "account_note.placeholder": "Klikoni për të shtuar shënim", "admin.dashboard.daily_retention": "Shkallë mbajtjeje përdoruesi, në ditë, pas regjistrimit", "admin.dashboard.monthly_retention": "Shkallë mbajtjeje përdoruesi, në muaj, pas regjistrimit", @@ -342,7 +359,11 @@ "collection.share_template_other": "Shihni këtë koleksion të hijshëm: {link}", "collection.share_template_own": "Shihni koleksionin tim të ri: {link}", "collections.account_count": "{count, plural, one {# llogari} other {# llogari}}", + "collections.accounts.empty_description": "Shtoni deri në {count} llogari", + "collections.accounts.empty_editor_title": "Në këtë koleksion s’ka ende njeri", "collections.accounts.empty_title": "Ky koleksion është i zbrazët", + "collections.block_collection_owner": "Bllokoje llogarinë", + "collections.by_account": "nga {account_handle}", "collections.collection_description": "Përshkrim", "collections.collection_language": "Gjuhë", "collections.collection_language_none": "Asnjë", @@ -351,46 +372,57 @@ "collections.confirm_account_removal": "Jeni i sigurt se doni të hiqet kjo llogari nga ky koleksion?", "collections.content_warning": "Sinjalizim lënde", "collections.continue": "Vazhdo", - "collections.create.accounts_subtitle": "Mund të shtohen vetëm llogari që ju ndiqni të cilat kanë zgjedhur të jenë të zbulueshme.", + "collections.copy_link": "Kopjoji lidhjen", + "collections.copy_link_confirmation": "U kopjua në të papastër lidhja e koleksionit", "collections.create.accounts_title": "Kë do të shfaqni në këtë koleksion?", "collections.create.basic_details_title": "Hollësi bazë", "collections.create.steps": "Hapi {step}/{total}", - "collections.create_a_collection_hint": "Krijoni një koleksion për ta rekomanduar, ose për të ndarë me të tjerët llogaritë tuaja të parapëlqyera.", "collections.create_collection": "Krijoni koleksion", "collections.delete_collection": "Fshije koleksionin", "collections.description_length_hint": "Kufi prej 100 shenjash", - "collections.detail.accounts_heading": "Llogari", - "collections.detail.author_added_you": "{author} ju shtoi te ky koleksion", - "collections.detail.curated_by_author": "Në kujdesin e {author}", - "collections.detail.curated_by_you": "Nën kujdesin tuaj", + "collections.detail.author_added_you_on_date": "{author} ju shtoi më {date}", "collections.detail.loading": "Po ngarkohet koleksion…", - "collections.detail.other_accounts_in_collection": "Të tjerë në këtë koleksion:", "collections.detail.revoke_inclusion": "Hiqmëni", + "collections.detail.sensitive_content": "Lëndë rezervat", "collections.detail.sensitive_note": "Ky koleksion përmban llogari dhe lëndë që mund të jetë me spec për disa përdorues.", "collections.detail.share": "Ndajeni këtë koleksion me të tjerë", + "collections.detail.you_are_in_this_collection": "Shfaqeni te ky koleksion", "collections.edit_details": "Përpunoni hollësi", - "collections.error_loading_collections": "Pati një gabim teksa provohej të ngarkoheshin koleksionet tuaj.", - "collections.hints.accounts_counter": "{count} / {max} llogari", + "collections.hidden_accounts_description": "Bllokuat, ose heshtuat {count, plural, one {këtë përdorues} other {këta përdorues}}", + "collections.hidden_accounts_link": "{count, plural, one {# llogari e fshehur} other {# llogari të fshehura}}", + "collections.hints.accounts_counter": "{count}/{max} llogari", "collections.last_updated_at": "Përditësuar së fundi më: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Koleksion} other {# Koleksione}}", + "collections.list.created_by_author": "Krijuar nga {name}", + "collections.list.created_by_you": "Krijuar nga ju", + "collections.list.featuring_you": "Që ju përmban", "collections.manage_accounts": "Administroni llogari", "collections.mark_as_sensitive": "Vëri shenjë si rezervat", "collections.mark_as_sensitive_hint": "Bën fshehjen e përshkrimit të koleksionit dhe llogarive prapa një sinjalizimi lënde. Emri i koleksionit do të jetë ende i dukshëm.", + "collections.maximum_collection_count_description": "Shërbyesi juaj lejon krijimin e deri në {count} koleksioneve.", + "collections.maximum_collection_count_reached": "Keni krijuar një numër maksimum koleksionesh", "collections.name_length_hint": "Kufi 40 shenja", "collections.new_collection": "Koleksion i ri", - "collections.no_collections_yet": "Ende pa koleksione.", - "collections.old_last_post_note": "Të postuarat e fundit gjatë një jave më parë", - "collections.remove_account": "Hiqe këtë llogari", + "collections.pending_accounts.message": "Llogaritë mund të shfaqen si në pritje të shqyrtimit, kur pritet një përgjigje nga përdoruesi, ose shërbyesi i tij. Llogari në pritje të shqyrtimit mund të shihni vetëm ju.", + "collections.pending_accounts.title": "Pse shoh llogari në pritje të shqyrtimit?", + "collections.remove_account": "Hiqe", "collections.report_collection": "Raportojeni këtë koleksion", "collections.revoke_collection_inclusion": "Hiqmëni nga ky koleksion", "collections.revoke_inclusion.confirmation": "U hoqët nga “{collection}”", "collections.revoke_inclusion.error": "Pati një gabim, ju lutemi, riprovoni më vonë.", - "collections.search_accounts_label": "Kërkoni për llogari për shtim…", + "collections.search_accounts_label": "Kërkoni për një llogari për t’u shtuar", "collections.search_accounts_max_reached": "Keni shtuar numrin maksimum të llogarive", "collections.sensitive": "Rezervat", + "collections.share_short": "Ndajeni me të tjerë", + "collections.suggestions.can_not_add": "S’mund të shtohet", + "collections.suggestions.can_not_add_desc": "Këto llogari kanë zgjedhur të lihen jashtë zbulimi, ose mund të gjenden në një shërbyes që s’mbulon koleksione.", + "collections.suggestions.must_follow": "Duhet të ndjekin së pari", + "collections.suggestions.must_follow_desc": "Këto llogari shqyrtojnë krejt kërkesat për ndjekje. Ndjekësit mund t’i shtojnë te koleksione.", "collections.topic_hint": "Shtoni një hashtag që ndihmon të tjerët të kuptojnë temën kryesore të këtij koleksion.", "collections.topic_special_chars_hint": "Shenjat e posaçme do të hiqen, kur ruhet", + "collections.unlisted_collections_description": "Këto nuk shfaqen në profilin tuaj për të tjerët. Cilido me lidhjen mund t’i zbulojë.", + "collections.unlisted_collections_with_count": "Koleksione të pashfaqur ({count})", "collections.view_collection": "Shiheni koleksionin", - "collections.view_other_collections_by_user": "Shihni koleksione të tjera nga ky përdorues", "collections.visibility_public": "Publik", "collections.visibility_public_hint": "I zbulueshëm në përfundime kërkimi dhe fusha të tjera ku shfaqen rekomandime.", "collections.visibility_title": "Dukshmëri", @@ -399,7 +431,6 @@ "column.about": "Mbi", "column.blocks": "Përdorues të bllokuar", "column.bookmarks": "Faqerojtës", - "column.collections": "Koleksionet e mi", "column.community": "Rrjedhë kohore vendore", "column.create_list": "Krijo listë", "column.direct": "Përmendje private", @@ -416,8 +447,10 @@ "column.lists": "Lista", "column.mutes": "Përdorues të heshtuar", "column.notifications": "Njoftime", + "column.other_collections": "Koleksione nga {name}", "column.pins": "Mesazhe të fiksuar", "column.public": "Rrjedhë kohore e të federuarave", + "column.your_collections": "Koleksionet Tuaja", "column_back_button.label": "Mbrapsht", "column_header.hide_settings": "Fshihi rregullimet", "column_header.moveLeft_settings": "Shpjere shtyllën majtas", @@ -479,12 +512,13 @@ "confirmations.discard_draft.post.title": "Të hidhet tej skica e postimit tuaj?", "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.follow_to_collection.confirm": "Ndiqe dhe shtoje në koleksion", - "confirmations.follow_to_collection.message": "Që ta shtoni te një koleksion, duhet të jeni duke e ndjekur {name}.", - "confirmations.follow_to_collection.title": "Të ndiqet llogaria?", "confirmations.follow_to_list.confirm": "Ndiqe dhe shtoje te listë", "confirmations.follow_to_list.message": "Lypset të jeni duke e ndjekur {name}, që të shtohte te një listë.", "confirmations.follow_to_list.title": "Të ndiqet përdoruesi?", + "confirmations.hide_featured_tab.confirm": "Fshihe skedën", + "confirmations.hide_featured_tab.intro": "Mund ta ndryshoni kurdo këtë, që nga Përpunoni profil > Rregullime skede profili.", + "confirmations.hide_featured_tab.message": "Kjo do ta fshehë skedën për përdorues në {serverName} dhe shërbyes të tjerë që xhirojnë versionin më të ri të Mastodon. Se si shfaqet te të tjera… varet.", + "confirmations.hide_featured_tab.title": "Të fshihet skeda “Të zgjedhur”?", "confirmations.logout.confirm": "Dilni", "confirmations.logout.message": "Jeni i sigurt se doni të dilet?", "confirmations.logout.title": "Të dilet?", @@ -523,6 +557,7 @@ "content_warning.hide": "Fshihe postimin", "content_warning.show": "Shfaqe, sido qoftë", "content_warning.show_more": "Shfaq më tepër", + "content_warning.show_short": "Shfaqe", "conversation.delete": "Fshije bisedën", "conversation.mark_as_read": "Vëri shenjë si të lexuar", "conversation.open": "Shfaq bisedën", @@ -563,6 +598,14 @@ "domain_pill.your_server": "Shtëpia juaj dixhitale, kur gjenden krejt postimet tuaja. S’ju pëlqen kjo këtu? Shpërngulni shërbyes kur të doni dhe sillni edhe ndjekësit tuaj.", "domain_pill.your_username": "Identifikuesi juja unik në këtë shërbyes. Është e mundur të gjenden përdorues me të njëjtin emër përdoruesi në shërbyes të ndryshëm.", "dropdown.empty": "Përzgjidhni një mundësi", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Pajtohuni", + "email_subscriptions.form.bottom": "Merrni postime në email-in tuaj, pa krijuar një llogari Mastodon. Shpajtohuni në çfarëdo kohe. Për më tepër informacion, shihni te Rregulla Privatësie.", + "email_subscriptions.form.title": "Regjistrohuni për përditësime me email nga {name}", + "email_subscriptions.submitted.lead": "Shihni te mesazhet tuaj të marrë për një email, që të përfundoni regjistrimin për përditësime me email.", + "email_subscriptions.submitted.title": "Edhe një hap", + "email_subscriptions.validation.email.blocked": "Shërbim email i bllokuar", + "email_subscriptions.validation.email.invalid": "Adresë email e pavlefshme", "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", "embed.preview": "Ja si do të duket:", "emoji_button.activity": "Veprimtari", @@ -580,9 +623,14 @@ "emoji_button.search_results": "Përfundime kërkimi", "emoji_button.symbols": "Simbole", "emoji_button.travel": "Udhëtime & Vende", - "empty_column.account_featured.me": "S’keni ende të zgjedhur diçka. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?", - "empty_column.account_featured.other": "{acct} s’ka të zgjedhur ende ndonjë gjë. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?", - "empty_column.account_featured_other.unknown": "Kjo llogari s’ka ende gjë të zgjedhur.", + "empty_column.account_featured.other": "{acct} s’ka ende ndonjë gjë të zgjedhur.", + "empty_column.account_featured_self.no_collections_button": "Krijoni një koleksion", + "empty_column.account_featured_self.no_collections_hide_tab": "Fshihe këtë skedë, më mirë", + "empty_column.account_featured_self.pre_collections": "Ndiqeni për Koleksione", + "empty_column.account_featured_self.pre_collections_desc": "Koleksionet (që vijnë me Mastodon 4.6) ju lejojnë të krijoni lista tuajat llogarish për t’ua rekomanduar të tjerëve.", + "empty_column.account_featured_self.showcase_accounts": "Shpalosni llogaritë tuaja të parapëlqyera", + "empty_column.account_featured_self.showcase_accounts_desc": "Koleksionet janë lista llogarish për të ndihmuar të tjerët të zbulojnë më tepër gjëra në Fedivers.", + "empty_column.account_featured_unknown.other": "Kjo llogari s’ka zgjedhur gjë ende.", "empty_column.account_hides_collections": "Ky përdorues ka zgjedhur të mos e japë këtë informacion", "empty_column.account_suspended": "Llogaria u pezullua", "empty_column.account_timeline": "S’ka mesazhe këtu!", @@ -622,6 +670,10 @@ "featured_carousel.header": "{count, plural, one {Postim i Fiksuar} other {Postime të Fiksuar}}", "featured_carousel.slide": "Postimi {current, number} nga {max, number} gjithsej", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Tani së fundi keni postuar rreth {items}. Të shtohen këto si hashtag-ë të zgjedhur?", + "featured_tags.suggestions.add": "Shtoji", + "featured_tags.suggestions.added": "Administroni kurdo hashtag-ët tuaj të zgjedhur, nën Përpunoni Profil > Hashtag-ë të zgjedhur.", + "featured_tags.suggestions.dismiss": "Jo, faleminderit", "filter_modal.added.context_mismatch_explanation": "Kjo kategori filtrash nuk aplikohet për kontekstin nën të cilin po merreni me këtë postim. Nëse doni që postimi të filtrohet edhe në këtë kontekst, do t’ju duhet të përpunoni filtrin.", "filter_modal.added.context_mismatch_title": "Mospërputhje kontekstesh!", "filter_modal.added.expired_explanation": "Kjo kategori filtrash ka skaduar, do t’ju duhet të ndryshoni datën e skadimit për të, pa të aplikohet.", @@ -664,7 +716,9 @@ "follow_suggestions.who_to_follow": "Cilët të ndiqen", "followed_tags": "Hashtag-ë të ndjekur", "followers.hide_other_followers": "Ky përdorues ka zgjedhur të mos i bëjë të dukshëm ndjekësit e vet të tjerë", + "followers.title": "Ndjekje e {name}", "following.hide_other_following": "Ky përdorues ka zgjedhur të mos bëjë të dukshëm pjesën tjetër të përdoruesve që ndjek", + "following.title": "Ndjekur nga {name}", "footer.about": "Mbi", "footer.about_mastodon": "Mbi Mastodon-in", "footer.about_server": "Mbi {domain}", @@ -676,6 +730,7 @@ "footer.source_code": "Shihni kodin burim", "footer.status": "Gjendje", "footer.terms_of_service": "Kushte shërbimi", + "form_error.blank": "Fusha s’mund të jetë e zbrazët.", "form_field.optional": "(opsionale)", "generic.saved": "U ruajt", "getting_started.heading": "Si t’ia fillohet", @@ -859,6 +914,7 @@ "navigation_panel.expand_followed_tags": "Zgjeroje menunë e hashtag-ëve të ndjekur", "navigation_panel.expand_lists": "Hape menunë listë", "not_signed_in_indicator.not_signed_in": "Që të përdorni këtë burim, lypset të bëni hyrjen.", + "notification.added_to_collection": "{name} ju shtoi në koleksion", "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}", @@ -868,6 +924,7 @@ "notification.admin.sign_up.name_and_others": "U regjistrua {name} dhe {count, plural, one {# tjetër} other {# të tjerë}}", "notification.annual_report.message": "#Wrapstodon juaj për {year} pret! Zbuloni pikat e theksuara dhe çastet e paharrueshëm të këtij viti për ju në Mastodon!", "notification.annual_report.view": "Shihni #Wrapstodon", + "notification.collection_update": "{name} përpunoi një koleksion në të cilin gjendeni", "notification.favourite": "{name} i vuri shenjë postimit tuaj si të parapëlqyer", "notification.favourite.name_and_others_with_link": "{name} dhe {count, plural, one {# tjetër} other {# të tjerë}} i vunë shenjë postimit tuaj si të parapëlqyer", "notification.favourite_pm": "{name} i vuri shenjë si të parapëlqyer përmendjes tuaj private", @@ -1131,6 +1188,7 @@ "server_banner.active_users": "përdorues aktivë", "server_banner.administered_by": "Administruar nga:", "server_banner.is_one_of_many": "{domain} është një nga mjaft shërbyes të pavarur Mastodon te të cilët mund të merrni pjesë në Fedivers.", + "server_banner.more_about_this_server": "Më tepër rreth këtij shërbyesi", "server_banner.server_stats": "Statistika shërbyesi:", "sign_in_banner.create_account": "Krijoni llogari", "sign_in_banner.follow_anyone": "Ndiqni këdo në Fedivers dhe shihni gjithçka në rend kohor. Pa algortime, apo marifete.", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index c9d62e2a9ff252..2b517b4209591c 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -8,10 +8,14 @@ "about.domain_blocks.silenced.title": "Ograničen", "about.domain_blocks.suspended.explanation": "Podaci sa ovog servera neće se obrađivati, čuvati niti razmenjivati, što će onemogućiti bilo kakvu interakciju ili komunikaciju sa korisnicima sa ovog servera.", "about.domain_blocks.suspended.title": "Suspendovan", + "about.language_label": "Jezik", "about.not_available": "Ove informacije nisu dostupne na ovom serveru.", "about.powered_by": "Decentralizovana društvena mreža koju pokreće {mastodon}", "about.rules": "Pravila servera", + "account.activity": "Aktivnosti", "account.add_or_remove_from_list": "Dodaj ili ukloni sa lista", + "account.badges.admin": "Admin", + "account.badges.blocked": "Blokiran", "account.badges.bot": "Automatizovano", "account.badges.group": "Grupa", "account.block": "Blokiraj @{name}", @@ -23,18 +27,29 @@ "account.direct": "Privatno pomeni @{name}", "account.disable_notifications": "Zaustavi obaveštavanje za objave korisnika @{name}", "account.edit_profile": "Uredi profil", + "account.edit_profile_short": "Uredi", "account.enable_notifications": "Obavesti me kada @{name} objavi", "account.endorse": "Istakni na profilu", - "account.featured_tags.last_status_at": "Poslednja objava {date}", - "account.featured_tags.last_status_never": "Nema objava", + "account.featured.accounts": "Profili", + "account.filters.all": "Sve aktivnosti", + "account.filters.posts_only": "Objave", + "account.filters.posts_replies": "Objave i odgovori", + "account.filters.replies_toggle": "Prikaži odgovore", "account.follow": "Prati", "account.follow_back": "Uzvrati praćenje", + "account.follow_back_short": "Uzvrati praćenje", + "account.follow_request": "Zahtevaj praćenje", + "account.follow_request_cancel": "Poništi zahtev", + "account.follow_request_cancel_short": "Poništi", + "account.follow_request_short": "Zahtevaj", "account.followers": "Pratioci", "account.followers.empty": "Još uvek niko ne prati ovog korisnika.", "account.followers_counter": "{count, plural, one {{counter} pratilac} few {{counter} pratioca} other {{counter} pratilaca}}", + "account.followers_you_know_counter": "{counter} koje ti poznaješ", "account.following": "Prati", "account.following_counter": "{count, plural, one {{counter} prati} few {{counter} prati} other {{counter} prati}}", "account.follows.empty": "Ovaj korisnik još uvek nikog ne prati.", + "account.follows_you": "Prati te", "account.go_to_profile": "Idi na profil", "account.hide_reblogs": "Sakrij podržavanja @{name}", "account.in_memoriam": "U znak sećanja na.", @@ -44,6 +59,12 @@ "account.locked_info": "Status privatnosti ovog naloga je podešen na „zaključano”. Vlasnik ručno pregleda ko ga može pratiti.", "account.media": "Multimedija", "account.mention": "Pomeni korisnika @{name}", + "account.menu.add_to_list": "Dodaj u listu", + "account.menu.block": "Blokiraj nalog", + "account.menu.block_domain": "Blokiraj {domain}", + "account.menu.copy": "Kopiraj link", + "account.menu.remove_follower": "Ukloni pratioca", + "account.menu.report": "Prijavi nalog", "account.moved_to": "Korisnik {name} je naznačio da je njegov novi nalog sada:", "account.mute": "Ignoriši korisnika @{name}", "account.mute_notifications_short": "Isključi obaveštenja", @@ -52,7 +73,6 @@ "account.no_bio": "Nema opisa.", "account.open_original_page": "Otvori originalnu stranicu", "account.posts": "Objave", - "account.posts_with_replies": "Objave i odgovori", "account.report": "Prijavi @{name}", "account.requested_follow": "{name} je zatražio da vas prati", "account.share": "Podeli profil korisnika @{name}", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 7313eaca462dcc..ee12b86e132982 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -25,8 +25,6 @@ "account.edit_profile": "Уреди профил", "account.enable_notifications": "Обавести ме када @{name} објави", "account.endorse": "Истакни на профилу", - "account.featured_tags.last_status_at": "Последња објава {date}", - "account.featured_tags.last_status_never": "Нема објава", "account.follow": "Прати", "account.follow_back": "Узврати праћење", "account.followers": "Пратиоци", @@ -52,7 +50,6 @@ "account.no_bio": "Нема описа.", "account.open_original_page": "Отвори оригиналну страницу", "account.posts": "Објаве", - "account.posts_with_replies": "Објаве и одговори", "account.report": "Пријави @{name}", "account.requested_follow": "{name} је затражио да вас прати", "account.share": "Подели профил корисника @{name}", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 17613601e9884f..93b62f8af5f4b0 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -28,12 +28,10 @@ "account.block_domain": "Blockera domänen {domain}", "account.block_short": "Blockera", "account.blocked": "Blockerad", - "account.blocking": "Blockerar", "account.cancel_follow_request": "Återkalla din begäran om att få följa", "account.copy": "Kopiera länk till profil", "account.direct": "Nämn @{name} privat", "account.disable_notifications": "Sluta meddela mig när @{name} skriver ett inlägg", - "account.domain_blocking": "Blockerad domän", "account.edit_note": "Redigera personlig anteckning", "account.edit_profile": "Redigera profil", "account.edit_profile_short": "Redigera", @@ -45,9 +43,7 @@ "account.featured": "Utvalda", "account.featured.accounts": "Profiler", "account.featured.collections": "Samlingar", - "account.featured.hashtags": "Fyrkantstaggar", - "account.featured_tags.last_status_at": "Senaste inlägg den {date}", - "account.featured_tags.last_status_never": "Inga inlägg", + "account.featured.new_collection": "Ny samling", "account.field_overflow": "Visa hela innehållet", "account.filters.all": "All aktivitet", "account.filters.boosts_toggle": "Visa förstärkningar", @@ -73,8 +69,19 @@ "account.go_to_profile": "Gå till profilen", "account.hide_reblogs": "Dölj boostar från @{name}", "account.in_memoriam": "Till minne av.", + "account.join_modal.day": "Dag", + "account.join_modal.me": "Du gick med i {server} den", + "account.join_modal.me_anniversary": "Grattis på ditt fediversum-jubileum! Du anslöt till {server} på", + "account.join_modal.me_today": "Det är din första dag på {server}!", + "account.join_modal.other": "{name} gick med i {server} den", + "account.join_modal.other_today": "Det är {name}s första dag på {server}!", + "account.join_modal.share.celebrate": "Dela ett firande inlägg", + "account.join_modal.share.intro": "Dela ett introduktionsinlägg", + "account.join_modal.share.welcome": "Dela ett välkomstinlägg", + "account.join_modal.years": "{number, plural, one {# år} other {# år}}", "account.joined_short": "Gick med", "account.languages": "Ändra vilka språk du helst vill se i ditt flöde", + "account.last_active": "Senast aktiv", "account.link_verified_on": "Ägarskap för denna länk kontrollerades den {date}", "account.locked_info": "Detta konto har låst integritetsstatus. Ägaren väljer manuellt vem som kan följa det.", "account.media": "Media", @@ -102,12 +109,19 @@ "account.mute_notifications_short": "Stäng av aviseringsljud", "account.mute_short": "Tysta", "account.muted": "Tystad", - "account.muting": "Stänger av ljud", "account.mutual": "Ni följer varandra", + "account.name.copy": "Kopiera handtag", "account.name.help.domain": "{domain} är servern som är värd för användarens profil och inlägg.", "account.name.help.domain_self": "{domain} är din server som är värd för användarens profil och inlägg.", - "account.name.help.footer": "Precis som du kan skicka e-post till personer med olika e-postklienter, du kan interagera med personer på andra Mastodon-servrar – och med vem som helst på andra sociala appar som drivs av samma uppsättning regler som Mastodon använder (ActivityPub-protokollet).", + "account.name.help.footer": "Precis som du kan skicka e-post till personer som använder olika e-postleverantörer, kan du interagera med personer på andra Mastodon-servrar, och med vem som helst på andra Mastodon-kompatibla sociala appar.", + "account.name.help.header": "Ett handtag är som en e-postadress", + "account.name.help.username": "{username} är kontots användarnamn på deras server. Någon på en annan server kan ha samma användarnamn.", + "account.name.help.username_self": "{username} är ditt användarnamn på denna server. Någon på en annan server kan ha samma användarnamn.", + "account.name_info": "Vad betyder detta?", "account.no_bio": "Ingen beskrivning angiven.", + "account.node_modal.callout": "Personlig anteckningar är endast synliga för dig.", + "account.node_modal.edit_title": "Redigera en personlig anteckning", + "account.node_modal.error_unknown": "Kunde inte spara anteckningen", "account.node_modal.field_label": "Personlig anteckning", "account.node_modal.save": "Spara", "account.node_modal.title": "Lägg till en personlig anteckning", @@ -115,11 +129,9 @@ "account.note.title": "Personlig anteckning (endast synlig för dig)", "account.open_original_page": "Öppna den ursprungliga sidan", "account.posts": "Inlägg", - "account.posts_with_replies": "Inlägg och svar", "account.remove_from_followers": "Ta bort {name} från följare", "account.report": "Rapportera @{name}", "account.requested_follow": "{name} har begärt att följa dig", - "account.requests_to_follow_you": "Fråga om att följa dig", "account.share": "Dela @{name}s profil", "account.show_reblogs": "Visa boostar från @{name}", "account.statuses_counter": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}", @@ -134,44 +146,111 @@ "account.unmute": "Sluta tysta @{name}", "account.unmute_notifications_short": "Aktivera aviseringsljud", "account.unmute_short": "Avtysta", + "account_edit.advanced_settings.bot_hint": "Signalera till andra att kontot huvudsakligen utför automatiserade åtgärder och kanske inte övervakas", + "account_edit.advanced_settings.bot_label": "Automatiserat konto", + "account_edit.advanced_settings.title": "Avancerade inställningar", + "account_edit.bio.add_label": "Lägg till biografi", + "account_edit.bio.edit_label": "Redigera biografi", "account_edit.bio.placeholder": "Lägg till en kort introduktion för att hjälpa andra att identifiera dig.", "account_edit.bio.title": "Biografi", "account_edit.bio_modal.add_title": "Lägg till biografi", "account_edit.bio_modal.edit_title": "Redigera biografi", - "account_edit.button.add": "Lägg till {item}", - "account_edit.button.delete": "Radera {item}", - "account_edit.button.edit": "Redigera {item}", "account_edit.column_button": "Klar", "account_edit.column_title": "Redigera profil", - "account_edit.custom_fields.name": "fält", + "account_edit.custom_fields.add_label": "Lägg till fält", + "account_edit.custom_fields.edit_label": "Redigera fält", "account_edit.custom_fields.placeholder": "Lägg till dina pronomen, externa länkar eller något annat du vill dela.", "account_edit.custom_fields.reorder_button": "Ändra ordning för fält", "account_edit.custom_fields.tip_content": "Du kan enkelt lägga till trovärdighet till ditt Mastodon-konto genom att verifiera länkar till alla webbplatser du äger.", "account_edit.custom_fields.tip_title": "Tips: Lägga till verifierade länkar", "account_edit.custom_fields.title": "Tilläggsfält", "account_edit.custom_fields.verified_hint": "Hur lägger jag till en verifierad länk?", + "account_edit.display_name.add_label": "Lägg till visningsnamn", + "account_edit.display_name.edit_label": "Redigera visningsnamn", "account_edit.display_name.placeholder": "Visningsnamnet är hur ditt namn ser ut på din profil och i tidslinjer.", "account_edit.display_name.title": "Visningsnamn", - "account_edit.featured_hashtags.item": "hashtaggar", + "account_edit.featured_hashtags.edit_label": "Lägg till hashtaggar", "account_edit.featured_hashtags.placeholder": "Hjälp andra att identifiera, och få snabb tillgång till, dina favoritämnen.", "account_edit.featured_hashtags.title": "Utvalda hashtaggar", + "account_edit.field_actions.delete": "Radera fält", + "account_edit.field_actions.edit": "Redigera fält", "account_edit.field_delete_modal.confirm": "Är du säker på att du vill ta bort detta tilläggsfält? Denna åtgärd kan inte ångras.", "account_edit.field_delete_modal.delete_button": "Radera", "account_edit.field_delete_modal.title": "Radera tilläggsfält?", "account_edit.field_edit_modal.add_title": "Lägg till tilläggsfält", + "account_edit.field_edit_modal.discard_confirm": "Ta bort", + "account_edit.field_edit_modal.discard_message": "Du har osparade ändringar. Är du säker på att du vill ta bort dem?", "account_edit.field_edit_modal.edit_title": "Redigera tilläggsfält", - "account_edit.field_edit_modal.limit_header": "Rekommenderad teckengräns överskriden", - "account_edit.field_edit_modal.limit_message": "Mobilanvändare kanske inte ser ditt fält i sin helhet.", + "account_edit.field_edit_modal.length_warning": "Rekommenderad teckengräns överskrids. Mobilanvändare kanske inte ser ditt fält i sin helhet.", + "account_edit.field_edit_modal.link_emoji_warning": "Vi rekommenderar att anpassade emoji inte används i kombination med webbadresser. Anpassade fält som innehåller båda kommer endast att visas som text i stället för som en länk för att förhindra förvirring bland användare.", "account_edit.field_edit_modal.name_hint": "T.ex. “Personlig webbplats”", "account_edit.field_edit_modal.name_label": "Etikett", "account_edit.field_edit_modal.url_warning": "För att lägga till en länk, vänligen inkludera {protocol} i början.", "account_edit.field_edit_modal.value_hint": "T.ex. \"https://example.me”", + "account_edit.field_edit_modal.value_label": "Värde", + "account_edit.field_reorder_modal.drag_cancel": "Flytten avbröts. Fältet \"{item}\" släpptes.", + "account_edit.field_reorder_modal.drag_end": "Fältet \"{item}\" har tagits bort.", + "account_edit.field_reorder_modal.drag_instructions": "För att organisera om anpassade fält, tryck på mellanslag eller retur. Använd piltangenterna för att flytta fältet upp eller ner. Tryck på mellanslag eller retur igen för att släppa fältet i sin nya position, eller tryck Esc för att avbryta.", + "account_edit.field_reorder_modal.drag_move": "Fältet \"{item}\" har flyttats.", + "account_edit.field_reorder_modal.drag_over": "Fältet \"{item}\" flyttades över \"{over}\".", + "account_edit.field_reorder_modal.drag_start": "Plockade upp fält \"{item}\".", + "account_edit.field_reorder_modal.handle_label": "Dra fält \"{item}\"", + "account_edit.field_reorder_modal.title": "Organisera om fält", + "account_edit.image_alt_modal.add_title": "Lägg till alternativ text", + "account_edit.image_alt_modal.details_content": "RÄTT:
    • Beskriv dig själv som avbildad
    • Tala om din själv i tredje person (t.ex. “Alex” istället för “jag”)
    • Var kortfattad – några ord räcker ofta
    FEL:
    • Börja med “Foto av” – det är överflödigt för skärmläsarna
    EXEMPEL:
    • “Alex iklädd en grön skjorta och glasögon”
    ", + "account_edit.image_alt_modal.details_title": "Tips: Alternativ text för profilbilder", + "account_edit.image_alt_modal.edit_title": "Redigera alternativ text", + "account_edit.image_alt_modal.text_hint": "Alternativ text hjälper användare av skärmläsare att förstå ditt innehåll.", + "account_edit.image_alt_modal.text_label": "Alternativ text", + "account_edit.image_delete_modal.confirm": "Är du säker du vill ta bort denna bild? Denna åtgärd kan inte ångras.", + "account_edit.image_delete_modal.delete_button": "Radera", + "account_edit.image_delete_modal.title": "Radera bild?", "account_edit.image_edit.add_button": "Lägg till bild", "account_edit.image_edit.alt_add_button": "Lägg till alternativtext", "account_edit.image_edit.alt_edit_button": "Redigera alternativtext", "account_edit.image_edit.remove_button": "Ta bort bild", "account_edit.image_edit.replace_button": "Ersätt bild", + "account_edit.item_list.delete": "Radera {name}", + "account_edit.item_list.edit": "Redigera {name}", + "account_edit.name_modal.add_title": "Lägg till visningsnamn", + "account_edit.name_modal.edit_title": "Redigera visningsnamn", "account_edit.profile_tab.button_label": "Anpassa", + "account_edit.profile_tab.hint.description": "Dessa inställningar anpassar vad användare ser på {server} i de officiella apparna, men de kanske inte gäller för användare på andra servrar och tredjepartsappar.", + "account_edit.profile_tab.hint.title": "Hur detta visas varierar fortfarande", + "account_edit.profile_tab.show_featured.description": "‘Utvalda’ är en valfri flik där du kan visa upp andra konton.", + "account_edit.profile_tab.show_featured.title": "Visa fliken 'Utvalda'", + "account_edit.profile_tab.show_media.description": "‘Media’ är en valfri flik som visar dina inlägg som innehåller bilder eller videor.", + "account_edit.profile_tab.show_media.title": "Visa fliken ‘Media’", + "account_edit.profile_tab.show_media_replies.description": "När den är aktiverad visar fliken Media både dina inlägg och svar på andras inlägg.", + "account_edit.profile_tab.show_media_replies.title": "Inkludera svar på fliken Media", + "account_edit.save": "Spara", + "account_edit.upload_modal.back": "Tillbaka", + "account_edit.upload_modal.done": "Färdig", + "account_edit.upload_modal.next": "Nästa", + "account_edit.upload_modal.step_crop.zoom": "Zooma", + "account_edit.upload_modal.step_upload.button": "Bläddra bland filer", + "account_edit.upload_modal.step_upload.dragging": "Släpp för att ladda upp", + "account_edit.upload_modal.step_upload.header": "Välj en bild", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF eller JPG-format, upp till {limit}MB.{br}Bild kommer att skalas till {width}x{height}px.", + "account_edit.upload_modal.title_add.avatar": "Lägg till profilbild", + "account_edit.upload_modal.title_add.header": "Lägg till omslagsbild", + "account_edit.upload_modal.title_replace.avatar": "Ersätt profilbild", + "account_edit.upload_modal.title_replace.header": "Ersätt omslagsbild", + "account_edit.verified_modal.details": "Öka trovärdigheten för din Mastodon-profil genom att verifiera länkar till personliga webbplatser. Så här fungerar det:", + "account_edit.verified_modal.invisible_link.details": "Lägg till länken till din överskrift. Den viktiga delen är rel=\"me\" som förhindrar personifiering på webbplatser med användargenererat innehåll. Du kan även använda en länktagg i överskriften på sidan istället för {tag}, men HTML:en måste vara tillgänglig utan att exekvera JavaScript.", + "account_edit.verified_modal.invisible_link.summary": "Hur gör jag länken osynlig?", + "account_edit.verified_modal.step1.header": "Kopiera HTML-koden nedan och klistra in i överskriften för din webbplats", + "account_edit.verified_modal.step2.details": "Om du redan har lagt till din webbplats som ett anpassat fält måste du ta bort och lägga till den igen för att utlösa verifiering.", + "account_edit.verified_modal.step2.header": "Lägg till din webbplats som ett anpassat fält", + "account_edit.verified_modal.title": "Hur man lägger till en verifierad länk", + "account_edit_tags.add_tag": "Lägg till #{tagName}", + "account_edit_tags.column_title": "Redigera taggar", + "account_edit_tags.help_text": "Utvalda hashtaggar hjälper användare att upptäcka och interagera med din profil. De visas som filter på din profilsidas aktivitetsvy.", + "account_edit_tags.max_tags_reached": "Du har nått det maximala antalet utvalda hashtaggar.", + "account_edit_tags.search_placeholder": "Ange en hashtagg…", + "account_edit_tags.suggestions": "Förslag:", + "account_edit_tags.tag_status_count": "{count, plural, one {# inlägg} other {# inlägg}}", + "account_list.total": "{total, plural, one {# konto} other {# konton}}", "account_note.placeholder": "Klicka för att lägga till anteckning", "admin.dashboard.daily_retention": "Användarlojalitet per dag efter registrering", "admin.dashboard.monthly_retention": "Användarlojalitet per månad efter registrering", @@ -276,27 +355,80 @@ "closed_registrations_modal.find_another_server": "Hitta en annan server", "closed_registrations_modal.preamble": "Mastodon är decentraliserat så oavsett var du skapar ditt konto kommer du att kunna följa och interagera med någon på denna server. Du kan också köra din egen server!", "closed_registrations_modal.title": "Registrera sig på Mastodon", - "collections.accounts.empty_description": "Lägg till upp till {count} konton som du följer", + "collection.share_modal.share_link_label": "Dela länk", + "collection.share_modal.share_via_post": "Publicera på Mastodon", + "collection.share_modal.share_via_system": "Dela med…", + "collection.share_modal.title": "Dela samling", + "collection.share_modal.title_new": "Dela din nya samling!", + "collection.share_template_other": "Kolla in denna coola samling: {link}", + "collection.share_template_own": "Kolla in min nya samling: {link}", + "collections.account_count": "{count, plural, one {# konto} other {# konton}}", + "collections.accounts.empty_description": "Lägg till upp till {count} konton", + "collections.accounts.empty_editor_title": "Ingen finns i denna samling ännu", + "collections.accounts.empty_title": "Denna samling är tom", + "collections.block_collection_owner": "Blockera konto", + "collections.by_account": "av {account_handle}", + "collections.collection_description": "Beskrivning", "collections.collection_language": "Språk", "collections.collection_language_none": "Inga", - "collections.create_a_collection_hint": "Skapa en samling för att rekommendera eller dela dina favoritkonton med andra.", + "collections.collection_name": "Namn", + "collections.collection_topic": "Ämne", + "collections.confirm_account_removal": "Är du säker på att du vill ta bort detta konto från denna samling?", + "collections.content_warning": "Innehållsvarning", + "collections.continue": "Fortsätt", + "collections.copy_link": "Kopiera länk", + "collections.copy_link_confirmation": "Kopierade samlingslänk till urklipp", + "collections.create.accounts_title": "Vem kommer du att visa i den här samlingen?", + "collections.create.basic_details_title": "Grundläggande detaljer", + "collections.create.steps": "Steg {step}/{total}", "collections.create_collection": "Skapa samling", "collections.delete_collection": "Radera samling", - "collections.detail.accept_inclusion": "Okej", - "collections.detail.accounts_heading": "Konton", + "collections.description_length_hint": "Begränsat till 100 tecken", + "collections.detail.author_added_you_on_date": "{author} lade till dig {date}", + "collections.detail.loading": "Laddar samling…", "collections.detail.revoke_inclusion": "Ta bort mig", - "collections.error_loading_collections": "Det uppstod ett fel när dina samlingar skulle laddas.", - "collections.hints.accounts_counter": "{count} / {max} konton", - "collections.no_collections_yet": "Inga samlingar än.", - "collections.remove_account": "Ta bort detta konto", + "collections.detail.sensitive_content": "Känsligt innehåll", + "collections.detail.sensitive_note": "Denna samling innehåller konton och innehåll som kan vara känsliga för vissa användare.", + "collections.detail.share": "Dela denna samling", + "collections.detail.you_are_in_this_collection": "Du är med i denna samling", + "collections.edit_details": "Redigera detaljer", + "collections.hidden_accounts_description": "Du har blockerat eller tystat {count, plural, one {denna användare} other {dessa användare}}", + "collections.hidden_accounts_link": "{count, plural, one {# gömt konto} other {# gömda konton}}", + "collections.hints.accounts_counter": "{count}/{max} konton", + "collections.last_updated_at": "Senast uppdaterad: {date}", + "collections.manage_accounts": "Hantera konton", + "collections.mark_as_sensitive": "Markera som känsligt innehåll", + "collections.mark_as_sensitive_hint": "Döljer samlingens beskrivning och konton bakom en innehållsvarning. Samlingsnamnet kommer fortfarande att vara synligt.", + "collections.maximum_collection_count_description": "Din server gör det möjligt att skapa upp till {count} samlingar.", + "collections.maximum_collection_count_reached": "Du har skapat det maximala antalet samlingar", + "collections.name_length_hint": "Begränsat till 40 tecken", + "collections.new_collection": "Ny samling", + "collections.remove_account": "Ta bort", + "collections.report_collection": "Rapportera denna samling", + "collections.revoke_collection_inclusion": "Ta bort mig själv från denna samling", + "collections.revoke_inclusion.confirmation": "Du har tagits bort från \"{collection}\"", "collections.revoke_inclusion.error": "Ett fel uppstod, försök igen senare.", - "collections.search_accounts_label": "Sök efter konton för att lägga till…", + "collections.search_accounts_label": "Sök efter ett konto att lägga till", "collections.search_accounts_max_reached": "Du har lagt till maximalt antal konton", + "collections.sensitive": "Känsligt", + "collections.share_short": "Dela", + "collections.suggestions.can_not_add": "Kan inte läggas till", + "collections.suggestions.can_not_add_desc": "Dessa konton kan ha valt bort upptäckt, eller kan de vara på en server som inte stöder samlingar.", + "collections.suggestions.must_follow": "Måste följa först", + "collections.suggestions.must_follow_desc": "Dessa konton granskar alla följa förfrågningar. Följare kan lägga till dem i samlingar.", + "collections.topic_hint": "Lägg till en hashtagg som hjälper andra att förstå huvudämnet i denna samling.", + "collections.topic_special_chars_hint": "Specialtecken kommer att tas bort när du sparar", + "collections.unlisted_collections_description": "Dessa visas inte på din profil till andra. Vem som helst med länken kan upptäcka dem.", + "collections.unlisted_collections_with_count": "Olistade samlingar ({count})", "collections.view_collection": "Visa samling", + "collections.visibility_public": "Offentlig", + "collections.visibility_public_hint": "Upptäckbar i sökresultat och andra områden där rekommendationer visas.", + "collections.visibility_title": "Synlighet", + "collections.visibility_unlisted": "Olistad", + "collections.visibility_unlisted_hint": "Synlig för alla med en länk. Gömd från sökresultat och rekommendationer.", "column.about": "Om", "column.blocks": "Blockerade användare", "column.bookmarks": "Bokmärken", - "column.collections": "Mina samlingar", "column.community": "Lokal tidslinje", "column.create_list": "Skapa lista", "column.direct": "Privata omnämnande", @@ -313,6 +445,7 @@ "column.lists": "Listor", "column.mutes": "Tystade användare", "column.notifications": "Notifikationer", + "column.other_collections": "Samlingar av {name}", "column.pins": "Fästa inlägg", "column.public": "Global tidslinje", "column_back_button.label": "Tillbaka", @@ -323,6 +456,11 @@ "column_header.show_settings": "Visa inställningar", "column_header.unpin": "Ångra fäst", "column_search.cancel": "Avbryt", + "combobox.close_results": "Stäng resultat", + "combobox.loading": "Laddar", + "combobox.no_results_found": "Inga resultat för denna sökning", + "combobox.open_results": "Öppna resultat", + "combobox.results_available": "{count, plural, one {# förslag tillgängligt} other {# förslag tillgängliga}}. Använd upp- och ner-piltangenterna för att navigera. Tryck på Retur för att välja.", "community.column_settings.local_only": "Endast lokalt", "community.column_settings.media_only": "Endast media", "community.column_settings.remote_only": "Endast fjärr", @@ -356,6 +494,9 @@ "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_collection.confirm": "Radera", + "confirmations.delete_collection.message": "Denna åtgärd kan inte ångras.", + "confirmations.delete_collection.title": "Radera \"{name}\"?", "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?", @@ -371,6 +512,10 @@ "confirmations.follow_to_list.confirm": "Följ och lägg till i listan", "confirmations.follow_to_list.message": "Du måste följa {name} för att lägga till dem i en lista.", "confirmations.follow_to_list.title": "Följ användare?", + "confirmations.hide_featured_tab.confirm": "Dölj flik", + "confirmations.hide_featured_tab.intro": "Du kan ändra detta när som helst under Redigera profil > Inställningar för profilfliken.", + "confirmations.hide_featured_tab.message": "Detta kommer att dölja fliken för användare på {serverName} och andra servrar som kör den senaste versionen av Mastodon. Andra visningssätt kan variera.", + "confirmations.hide_featured_tab.title": "Dölj fliken \"Utvald\"?", "confirmations.logout.confirm": "Logga ut", "confirmations.logout.message": "Är du säker på att du vill logga ut?", "confirmations.logout.title": "Logga ut?", @@ -395,6 +540,8 @@ "confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?", "confirmations.remove_from_followers.title": "Ta bort följare?", "confirmations.revoke_collection_inclusion.confirm": "Ta bort mig", + "confirmations.revoke_collection_inclusion.message": "Denna åtgärd är permanent, och kuratorn kommer inte att kunna lägga till dig till samlingen senare.", + "confirmations.revoke_collection_inclusion.title": "Ta bort dig själv från denna samling?", "confirmations.revoke_quote.confirm": "Ta bort inlägg", "confirmations.revoke_quote.message": "Denna åtgärd kan inte ångras.", "confirmations.revoke_quote.title": "Ta bort inlägg?", @@ -407,11 +554,13 @@ "content_warning.hide": "Dölj inlägg", "content_warning.show": "Visa ändå", "content_warning.show_more": "Visa mer", + "content_warning.show_short": "Visa", "conversation.delete": "Radera konversation", "conversation.mark_as_read": "Markera som läst", "conversation.open": "Visa konversation", "conversation.with": "Med {names}", "copy_icon_button.copied": "Kopierad till urklipp", + "copy_icon_button.copy_this_text": "Kopiera länken till urklipp", "copypaste.copied": "Kopierad", "copypaste.copy_to_clipboard": "Kopiera till urklipp", "directory.federated": "Från känt fediversum", @@ -441,11 +590,19 @@ "domain_pill.username": "Användarnamn", "domain_pill.whats_in_a_handle": "Vad finns i ett handtag?", "domain_pill.who_they_are": "Eftersom handtag säger vem någon är och var de är, kan du interagera med människor på det sociala nätet av .", - "domain_pill.who_you_are": "Eftersom handtag säger vem någon är och var de är, kan människor interagera med dig på det sociala nätet av .", + "domain_pill.who_you_are": "Eftersom ditt handtag säger vem du är och var du är kan människor interagera med dig på det sociala nätet på .", "domain_pill.your_handle": "Ditt handtag:", "domain_pill.your_server": "Ditt digitala hem, där alla dina inlägg bor. Gillar du inte just denna? Byt server när som helst och ta med dina anhängare också.", "domain_pill.your_username": "Din unika identifierare på denna server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.", "dropdown.empty": "Välj ett alternativ", + "email_subscriptions.email": "E-post", + "email_subscriptions.form.action": "Prenumerera", + "email_subscriptions.form.bottom": "Få inlägg i din inkorg utan att skapa ett Mastodon-konto. Avsluta prenumerationen när som helst. För mer information, se vår sekretesspolicy.", + "email_subscriptions.form.title": "Registrera dig för e-postuppdateringar från {name}", + "email_subscriptions.submitted.lead": "Kolla din inkorg efter ett e-postmeddelande för att slutföra registreringen för e-postuppdateringar.", + "email_subscriptions.submitted.title": "Ett steg kvar", + "email_subscriptions.validation.email.blocked": "Blockerad e-postleverantör", + "email_subscriptions.validation.email.invalid": "Ogiltig epostadress", "embed.instructions": "Bädda in detta inlägg på din webbplats genom att kopiera koden nedan.", "embed.preview": "Så här kommer det att se ut:", "emoji_button.activity": "Aktivitet", @@ -463,9 +620,14 @@ "emoji_button.search_results": "Sökresultat", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Resor & platser", - "empty_column.account_featured.me": "Du har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar du använder mest och även din väns konton på din profil?", - "empty_column.account_featured.other": "{acct} har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar som du använder mest och även din väns konton på din profil?", - "empty_column.account_featured_other.unknown": "Detta konto har inte presenterat något ännu.", + "empty_column.account_featured.other": "{acct} har inte visat något ännu.", + "empty_column.account_featured_self.no_collections_button": "Skapa en samling", + "empty_column.account_featured_self.no_collections_hide_tab": "Dölj denna flik istället", + "empty_column.account_featured_self.pre_collections": "Håll ögonen öppna för samlingar", + "empty_column.account_featured_self.pre_collections_desc": "Samlingar (kommer i Mastodon 4.6) låter dig skapa en egen anpassad lista med konton för att rekommendera till andra.", + "empty_column.account_featured_self.showcase_accounts": "Visa dina favoritkonton", + "empty_column.account_featured_self.showcase_accounts_desc": "Samlingarna är anpassade listor över konton för att hjälpa andra att upptäcka mer av Fediverse:t.", + "empty_column.account_featured_unknown.other": "Detta konto har inte presenterat något ännu.", "empty_column.account_hides_collections": "Användaren har valt att inte göra denna information tillgänglig", "empty_column.account_suspended": "Kontot är avstängt", "empty_column.account_timeline": "Inga inlägg här!", @@ -488,6 +650,7 @@ "empty_column.notification_requests": "Allt klart! Det finns inget mer här. När du får nya meddelanden visas de här enligt dina inställningar.", "empty_column.notifications": "Du har inga meddelanden än. Interagera med andra för att starta konversationen.", "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det", + "empty_state.no_results": "Inga resultat", "error.no_hashtag_feed_access": "Gå med eller logga in för att visa och följa denna hashtag.", "error.unexpected_crash.explanation": "På grund av en bugg i vår kod eller kompatiblitetsproblem i webbläsaren kan den här sidan inte visas korrekt.", "error.unexpected_crash.explanation_addons": "Denna sida kunde inte visas korrekt. Detta beror troligen på ett webbläsartillägg eller ett automatiskt översättningsverktyg.", @@ -503,6 +666,7 @@ "featured_carousel.current": "Inlägg {current, number} / {max, number}", "featured_carousel.header": "{count, plural,one {Fäst inlägg} other {Fästa inlägg}}", "featured_carousel.slide": "Inlägg {current, number} av {max, number}", + "featured_tags.more_items": "+{count}", "featured_tags.suggestions": "På senare tid har du skrivit om {items}. Lägg till dessa som utvalda hashtaggar?", "featured_tags.suggestions.add": "Lägg till", "featured_tags.suggestions.added": "Hantera dina utvalda hashtaggar när som helst under Redigera profil > Utvalda hashtaggar.", @@ -549,7 +713,9 @@ "follow_suggestions.who_to_follow": "Rekommenderade profiler", "followed_tags": "Följda hashtags", "followers.hide_other_followers": "Denna användare har valt att inte göra sina andra följare synliga", + "followers.title": "Följer {name}", "following.hide_other_following": "Denna användare har valt att inte göra resten av vilka de följer synliga", + "following.title": "Följs av {name}", "footer.about": "Om", "footer.about_mastodon": "Om Mastodon", "footer.about_server": "Om {domain}", @@ -561,6 +727,8 @@ "footer.source_code": "Visa källkod", "footer.status": "Status", "footer.terms_of_service": "Användarvillkor", + "form_error.blank": "Fältet får inte vara tomt.", + "form_field.optional": "(valfritt)", "generic.saved": "Sparad", "getting_started.heading": "Kom igång", "hashtag.admin_moderation": "Öppet modereringsgränssnittet för #{name}", @@ -630,6 +798,7 @@ "keyboard_shortcuts.direct": "Öppna kolumnen med privata omnämnanden", "keyboard_shortcuts.down": "Flytta ner i listan", "keyboard_shortcuts.enter": "Öppna inlägg", + "keyboard_shortcuts.explore": "Öppna trendande tidslinje", "keyboard_shortcuts.favourite": "Favoritmarkera inlägg", "keyboard_shortcuts.favourites": "Öppna favoritlistan", "keyboard_shortcuts.federated": "Öppna federerad tidslinje", @@ -716,6 +885,7 @@ "navigation_bar.automated_deletion": "Automatisk radering av inlägg", "navigation_bar.blocks": "Blockerade användare", "navigation_bar.bookmarks": "Bokmärken", + "navigation_bar.collections": "Samlingar", "navigation_bar.direct": "Privata omnämnande", "navigation_bar.domain_blocks": "Dolda domäner", "navigation_bar.favourites": "Favoriter", @@ -741,6 +911,7 @@ "navigation_panel.expand_followed_tags": "Expandera menyn för följda fyrkantstaggar", "navigation_panel.expand_lists": "Expandera listmeny", "not_signed_in_indicator.not_signed_in": "Du behöver logga in för att få åtkomst till denna resurs.", + "notification.added_to_collection": "{name} lade till dig i en samling", "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}", @@ -750,6 +921,7 @@ "notification.admin.sign_up.name_and_others": "{name} och {count, plural, one {# en annan} other {# andra}} har registrerat sig", "notification.annual_report.message": "Din {year} #Wrapstodon väntar! Upptäck ditt års höjdpunkter och minnesvärda stunder på Mastodon!", "notification.annual_report.view": "Visa #Wrapstodon", + "notification.collection_update": "{name} redigerade en samling du är med i", "notification.favourite": "{name} favoritmarkerade ditt inlägg", "notification.favourite.name_and_others_with_link": "{name} och {count, plural, one {# annan} other {# andra}} har favoritmarkerat ditt inlägg", "notification.favourite_pm": "{name} favoritmarkerade ditt privata omnämnande", @@ -896,6 +1068,7 @@ "privacy.private.short": "Följare", "privacy.public.long": "Alla på och utanför Mastodon", "privacy.public.short": "Offentlig", + "privacy.quote.anyone": "{visibility}, citat tillåtna", "privacy.quote.disabled": "{visibility}, citat inaktiverade", "privacy.quote.limited": "{visibility}, citat begränsade", "privacy.unlisted.additional": "Detta fungerar precis som offentlig, förutom att inlägget inte visas i liveflöden eller hashtaggar, utforska eller Mastodon-sökning, även om du har valt detta för hela kontot.", @@ -941,6 +1114,7 @@ "report.category.title_account": "profil", "report.category.title_status": "inlägg", "report.close": "Färdig", + "report.collection_comment": "Varför vill du rapportera denna samling?", "report.comment.title": "Finns det något annat vi borde veta?", "report.forward": "Vidarebefordra till {target}", "report.forward_hint": "Kontot är från en annan server. Skicka även en anonymiserad kopia av anmälan dit?", @@ -962,6 +1136,7 @@ "report.rules.title": "Vilka regler överträds?", "report.statuses.subtitle": "Välj alla som stämmer", "report.statuses.title": "Finns det några inlägg som stöder denna rapport?", + "report.submission_error": "Rapporten kunde inte skickas", "report.submission_error_details": "Kontrollera din nätverksanslutning och försök igen senare.", "report.submit": "Skicka", "report.target": "Rapporterar {target}", @@ -1010,12 +1185,16 @@ "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.more_about_this_server": "Mer om denna server", "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Skapa konto", "sign_in_banner.follow_anyone": "Följ vem som helst över Fediversum och se allt i kronologisk ordning. Inga algoritmer, annonser eller 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", + "skip_links.hotkey": "Snabbtangent {hotkey}", + "skip_links.skip_to_content": "Hoppa över till huvudinnehållet", + "skip_links.skip_to_navigation": "Hoppa till huvudnavigering", "status.admin_account": "Öppet modereringsgränssnitt för @{name}", "status.admin_domain": "Öppet modereringsgränssnitt för @{domain}", "status.admin_status": "Öppna detta inlägg i modereringsgränssnittet", @@ -1117,6 +1296,7 @@ "tabs_bar.notifications": "Aviseringar", "tabs_bar.publish": "Nytt inlägg", "tabs_bar.search": "Sök", + "tag.remove": "Ta bort", "terms_of_service.effective_as_of": "Gäller från och med {date}", "terms_of_service.title": "Användarvillkor", "terms_of_service.upcoming_changes_on": "Kommande ändringar {date}", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index 9f03864932df84..d699a97721260a 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -18,7 +18,6 @@ "account.media": "Media", "account.mute": "Wycisz @{name}", "account.posts": "Posty", - "account.posts_with_replies": "Posty i ôdpowiedzi", "account_note.placeholder": "Wybier, żeby przidac notka", "column.bookmarks": "Zokłodki", "column.direct": "Prywatne spōmniynia", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index d6fa60aa6ec4c9..d55dc9016676bb 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -16,7 +16,6 @@ "account.edit_profile": "சுயவிவரத்தை மாற்று", "account.enable_notifications": "@{name} பதிவிட்டல் எனக்குத் தெரியப்படுத்தவும்", "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து", - "account.featured_tags.last_status_never": "இடுகைகள் இல்லை", "account.follow": "பின்தொடர்", "account.follow_back": "பின்தொடரு", "account.followers": "பின்தொடர்பவர்கள்", @@ -35,7 +34,6 @@ "account.muted": "முடக்கியது", "account.no_bio": "விளக்கம் எதுவும் வழங்கப்படவில்லை.", "account.posts": "டூட்டுகள்", - "account.posts_with_replies": "Toots மற்றும் பதில்கள்", "account.report": "@{name} -ஐப் புகாரளி", "account.share": "@{name} உடைய விவரத்தை பகிர்", "account.show_reblogs": "காட்டு boosts இருந்து @{name}", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index 09e7450067fa3d..8a4399e27112c9 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -7,7 +7,6 @@ "account.media": "Mûi-thé", "account.mention": "Thê-khí @{name}", "account.posts": "Huah-siann", - "account.posts_with_replies": "Huah-siann kah huê-ìng", "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 c8039ecd3a0dd7..0981a878ff1bcc 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -8,7 +8,6 @@ "account.cancel_follow_request": "Withdraw follow request", "account.edit_profile": "ప్రొఫైల్ని సవరించండి", "account.endorse": "ప్రొఫైల్లో చూపించు", - "account.featured.hashtags": "హ్యాష్‌ట్యాగ్‌లు", "account.follow": "అనుసరించు", "account.followers": "అనుచరులు", "account.followers.empty": "ఈ వినియోగదారుడిని ఇంకా ఎవరూ అనుసరించడంలేదు.", @@ -22,7 +21,6 @@ "account.mute": "@{name}ను మ్యూట్ చెయ్యి", "account.muted": "మ్యూట్ అయినవి", "account.posts": "టూట్లు", - "account.posts_with_replies": "టూట్లు మరియు ప్రత్యుత్తరములు", "account.report": "@{name}పై ఫిర్యాదుచేయు", "account.share": "@{name} యొక్క ప్రొఫైల్ను పంచుకోండి", "account.show_reblogs": "@{name}నుంచి బూస్ట్ లను చూపించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 0377c38240798a..fcfa54e5ef4e48 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -27,12 +27,10 @@ "account.block_domain": "ปิดกั้นโดเมน {domain}", "account.block_short": "ปิดกั้น", "account.blocked": "ปิดกั้นอยู่", - "account.blocking": "กำลังปิดกั้น", "account.cancel_follow_request": "ยกเลิกการติดตาม", "account.copy": "คัดลอกลิงก์ไปยังโปรไฟล์", "account.direct": "กล่าวถึง @{name} แบบส่วนตัว", "account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์", - "account.domain_blocking": "กำลังปิดกั้นโดเมน", "account.edit_note": "แก้ไขโน้ตส่วนบุคคล", "account.edit_profile": "แก้ไขโปรไฟล์", "account.edit_profile_short": "แก้ไข", @@ -43,9 +41,6 @@ "account.familiar_followers_two": "ติดตามโดย {name1} และ {name2}", "account.featured": "น่าสนใจ", "account.featured.accounts": "โปรไฟล์", - "account.featured.hashtags": "แฮชแท็ก", - "account.featured_tags.last_status_at": "โพสต์ล่าสุดเมื่อ {date}", - "account.featured_tags.last_status_never": "ไม่มีโพสต์", "account.follow": "ติดตาม", "account.follow_back": "ติดตามกลับ", "account.follow_back_short": "ติดตามกลับ", @@ -76,16 +71,13 @@ "account.mute_notifications_short": "ซ่อนการแจ้งเตือน", "account.mute_short": "ซ่อน", "account.muted": "ซ่อนอยู่", - "account.muting": "กำลังซ่อน", "account.mutual": "คุณติดตามกันและกัน", "account.no_bio": "ไม่ได้ให้คำอธิบาย", "account.open_original_page": "เปิดหน้าดั้งเดิม", "account.posts": "โพสต์", - "account.posts_with_replies": "โพสต์และการตอบกลับ", "account.remove_from_followers": "เอา {name} ออกจากผู้ติดตาม", "account.report": "รายงาน @{name}", "account.requested_follow": "{name} ได้ขอติดตามคุณ", - "account.requests_to_follow_you": "ส่งคำขอติดตามคุณ", "account.share": "แชร์โปรไฟล์ของ @{name}", "account.show_reblogs": "แสดงการดันจาก @{name}", "account.statuses_counter": "{count, plural, other {{counter} โพสต์}}", @@ -156,7 +148,6 @@ "closed_registrations_modal.find_another_server": "ค้นหาเซิร์ฟเวอร์อื่น", "closed_registrations_modal.preamble": "Mastodon เป็นแบบกระจายศูนย์ ดังนั้นไม่ว่าคุณจะสร้างบัญชีของคุณที่ใด คุณจะสามารถติดตามและโต้ตอบกับใครก็ตามในเซิร์ฟเวอร์นี้ คุณยังสามารถโฮสต์บัญชีด้วยตนเองได้อีกด้วย!", "closed_registrations_modal.title": "การลงทะเบียนใน Mastodon", - "collections.accounts.empty_description": "สามารถเพิ่มได้สูงสุด {count} บัญชีที่คุณติดตาม", "column.about": "เกี่ยวกับ", "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", "column.bookmarks": "ที่คั่นหน้า", @@ -225,9 +216,6 @@ "confirmations.discard_draft.post.title": "ละทิ้งโพสต์แบบร่างของคุณ?", "confirmations.discard_edit_media.confirm": "ละทิ้ง", "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงเหล่านั้นต่อไป?", - "confirmations.follow_to_collection.confirm": "ติดตามและเพิ่มไปยังคอลเล็กชัน", - "confirmations.follow_to_collection.message": "คุณต้องติดตาม {name} ถึงจะสามารถเพิ่มพวกเขาลงคอลเล็กชันได้", - "confirmations.follow_to_collection.title": "ติดตามบัญชีนี้ไหม?", "confirmations.follow_to_list.confirm": "ติดตามและเพิ่มไปยังรายการ", "confirmations.follow_to_list.message": "คุณต้องติดตาม {name} ถึงจะสามารถเพิ่มพวกเขาลงลิสต์ได้", "confirmations.follow_to_list.title": "ติดตามผู้ใช้?", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 941097c900cc1e..09edda7fac3cc1 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -21,12 +21,10 @@ "account.block_domain": "o len e ma {domain}", "account.block_short": "o len", "account.blocked": "jan li len", - "account.blocking": "mi len e jan ni", "account.cancel_follow_request": "o kute ala", "account.copy": "o pali same e linja pi lipu jan", "account.direct": "o mu len e @{name}", "account.disable_notifications": "@{name} li toki la o mu ala e mi", - "account.domain_blocking": "mi len e ma ni", "account.edit_profile": "o ante e lipu mi", "account.edit_profile_short": "o ante", "account.enable_notifications": "@{name} li toki la o mu e mi", @@ -36,9 +34,6 @@ "account.familiar_followers_two": "{name1} en {name2} li kute e jan ni", "account.featured": "suli", "account.featured.accounts": "lipu jan", - "account.featured.hashtags": "kulupu lipu", - "account.featured_tags.last_status_at": "sitelen pini pi jan ni li tan {date}", - "account.featured_tags.last_status_never": "toki ala li lon", "account.follow": "o kute", "account.follow_back": "jan ni li kute e sina. o kute", "account.follow_back_short": "o kute", @@ -67,16 +62,13 @@ "account.mute_notifications_short": "o kute ala e mu tan jan ni", "account.mute_short": "o kute ala", "account.muted": "sina kute ala e jan ni", - "account.muting": "lukin ala", "account.mutual": "ona li kute e sina. sina kute e ona.", "account.no_bio": "lipu li weka.", "account.open_original_page": "o open e lipu open", "account.posts": "toki suli", - "account.posts_with_replies": "toki ale", "account.remove_from_followers": "sijelo kute la o weka e sijelo \"{name}\".", "account.report": "@{name} la o toki e jaki tawa lawa", "account.requested_follow": "{name} li wile kute e sina", - "account.requests_to_follow_you": "jan ni li wile kute e sina", "account.share": "o pana e lipu tan @{name}", "account.show_reblogs": "o lukin e pana toki tan @{name}", "account.statuses_counter": "{count, plural, other {toki {counter}}}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 9f93fbf24b9898..96d1e9a8cde294 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -28,12 +28,10 @@ "account.block_domain": "{domain} alan adını engelle", "account.block_short": "Engelle", "account.blocked": "Engellendi", - "account.blocking": "Engelli", "account.cancel_follow_request": "Takibi bırak", "account.copy": "Profil bağlantısını kopyala", "account.direct": "@{name} kullanıcısından özel olarak bahset", "account.disable_notifications": "@{name} kişisinin gönderi bildirimlerini kapat", - "account.domain_blocking": "Alan adını engelle", "account.edit_note": "Kişisel notu düzenle", "account.edit_profile": "Profili düzenle", "account.edit_profile_short": "Düzenle", @@ -45,9 +43,7 @@ "account.featured": "Öne çıkan", "account.featured.accounts": "Profiller", "account.featured.collections": "Koleksiyonlar", - "account.featured.hashtags": "Etiketler", - "account.featured_tags.last_status_at": "Son gönderinin tarihi {date}", - "account.featured_tags.last_status_never": "Gönderi yok", + "account.featured.new_collection": "Yeni koleksiyon", "account.field_overflow": "Tüm içeriği göster", "account.filters.all": "Tüm aktiviteler", "account.filters.boosts_toggle": "Yeniden paylaşımları göster", @@ -73,8 +69,19 @@ "account.go_to_profile": "Profile git", "account.hide_reblogs": "@{name} kişisinin yeniden paylaşımlarını gizle", "account.in_memoriam": "Hatırasına.", + "account.join_modal.day": "Gün", + "account.join_modal.me": "{server} sunucusuna katıldığınız tarih", + "account.join_modal.me_anniversary": "Fediversary kutlu olsun! {server} sunucusuna katıldığınız tarih", + "account.join_modal.me_today": "{server} sunucusunda ilk gününüz!", + "account.join_modal.other": "{name}, {server} sunucusuna katıldığı tarih", + "account.join_modal.other_today": "{name} kişisinin {server} sunucusunda ilk günü!", + "account.join_modal.share.celebrate": "Kutlama amaçlı bir paylaşım yapın", + "account.join_modal.share.intro": "Tanıtım için bir paylaşım yapın", + "account.join_modal.share.welcome": "Bir hoşgeldiniz paylaşımı yapın", + "account.join_modal.years": "{number, plural, one {yıl} other {yıl}}", "account.joined_short": "Katıldı", "account.languages": "Abone olunan dilleri değiştir", + "account.last_active": "Son etkin", "account.link_verified_on": "Bu bağlantının sahipliği {date} tarihinde denetlendi", "account.locked_info": "Bu hesabın gizlilik durumu gizli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle onaylıyor.", "account.media": "Medya", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Bildirimleri sessize al", "account.mute_short": "Sessize al", "account.muted": "Susturuldu", - "account.muting": "Sessize alınıyor", "account.mutual": "Birbirinizi takip ediyorsunuz", + "account.name.copy": "İsmi Kopyala", "account.name.help.domain": "{domain} kullanıcının profilini ve gönderilerini barındıran sunucudur.", "account.name.help.domain_self": "{domain} profilinizi ve gönderilerinizi barındıran sunucunuzdur.", - "account.name.help.footer": "Farklı e-posta istemcileri kullanan kişilere e-posta gönderebileceğiniz gibi, diğer Mastodon sunucularındaki kişilerle ve Mastodon'un kullandığı kurallarla (ActivityPub protokolü) çalışan diğer sosyal uygulamalardaki herkesle etkileşim kurabilirsiniz.", + "account.name.help.footer": "Tıpkı farklı e-posta sağlayıcılarını kullanan kişilere e-posta gönderebileceğiniz gibi, diğer Mastodon sunucularındaki kullanıcılarla ve diğer Mastodon uyumlu sosyal uygulamalardaki herkesle etkileşim kurabilirsiniz.", "account.name.help.header": "Takma ad bir e-posta adresi gibidir", "account.name.help.username": "{username} bu hesabın sunucudaki kullanıcı adıdır. Başka bir sunucudaki başka bir kişi de aynı kullanıcı adına sahip olabilir.", "account.name.help.username_self": "{username} bu sunucudaki kullanıcı adınızdır. Başka bir sunucudaki başka bir kullanıcı da aynı kullanıcı adına sahip olabilir.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Düzenle", "account.note.title": "Kişisel not (sadece siz görüntüleyebilirsiniz)", "account.open_original_page": "Asıl sayfayı aç", + "account.pending": "Beklemede", "account.posts": "Gönderiler", - "account.posts_with_replies": "Gönderiler ve yanıtlar", "account.remove_from_followers": "{name} takipçilerinden kaldır", "account.report": "@{name} adlı kişiyi bildir", "account.requested_follow": "{name} size takip isteği gönderdi", - "account.requests_to_follow_you": "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}}", @@ -141,34 +147,42 @@ "account.unmute": "@{name} adlı kişinin sesini aç", "account.unmute_notifications_short": "Bildirimlerin sesini aç", "account.unmute_short": "Susturmayı kaldır", + "account_edit.advanced_settings.bot_hint": "Bu hesap temelde otomatik eylemler gerçekleştirir ve izlenmeyebiliri diğerlerine bildir", + "account_edit.advanced_settings.bot_label": "Otomatik hesap", + "account_edit.advanced_settings.title": "Gelişmiş ayarlar", + "account_edit.bio.add_label": "Kişisel bilgi ekle", + "account_edit.bio.edit_label": "Kişisel bilgiyi düzenle", "account_edit.bio.placeholder": "Diğerlerinin sizi tanımasına yardımcı olmak için kısa bir tanıtım ekleyin.", "account_edit.bio.title": "Kişisel bilgiler", "account_edit.bio_modal.add_title": "Kişisel bilgi ekle", "account_edit.bio_modal.edit_title": "Kişisel bilgiyi düzenle", - "account_edit.button.add": "{item} ekle", - "account_edit.button.delete": "{item} sil", - "account_edit.button.edit": "{item} düzenle", "account_edit.column_button": "Tamamlandı", "account_edit.column_title": "Profili Düzenle", - "account_edit.custom_fields.name": "alan", + "account_edit.custom_fields.add_label": "Alan ekle", + "account_edit.custom_fields.edit_label": "Alanı düzenle", "account_edit.custom_fields.placeholder": "Zamirlerinizi, harici bağlantılarınızı veya paylaşmak istediğiniz diğer bilgileri ekleyin.", "account_edit.custom_fields.reorder_button": "Alanları yeniden sırala", "account_edit.custom_fields.tip_content": "Sahip olduğunuz web sitelerine bağlantıları doğrulayarak Mastodon hesabınıza kolayca güvenilirlik katabilirsiniz.", "account_edit.custom_fields.tip_title": "İpucu: Doğrulanmış bağlantılar ekleme", "account_edit.custom_fields.title": "Özel alanlar", "account_edit.custom_fields.verified_hint": "Doğrulanmış bir bağlantı nasıl eklerim?", + "account_edit.display_name.add_label": "Görüntülenecek ad ekle", + "account_edit.display_name.edit_label": "Görüntülenecek adı düzenle", "account_edit.display_name.placeholder": "Görünen adınız profilinizde ve zaman akışlarında adınızın nasıl göründüğüdür.", "account_edit.display_name.title": "Görünen ad", - "account_edit.featured_hashtags.item": "etiketler", + "account_edit.featured_hashtags.edit_label": "Etiket ekle", "account_edit.featured_hashtags.placeholder": "Başkalarının favori konularınızı tanımlamasına ve bunlara hızlı bir şekilde erişmesine yardımcı olun.", "account_edit.featured_hashtags.title": "Öne çıkan etiketler", + "account_edit.field_actions.delete": "Alanı sil", + "account_edit.field_actions.edit": "Alanı düzenle", "account_edit.field_delete_modal.confirm": "Bu özel alanı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "account_edit.field_delete_modal.delete_button": "Sil", "account_edit.field_delete_modal.title": "Özel alanı sil?", "account_edit.field_edit_modal.add_title": "Özel alan ekle", + "account_edit.field_edit_modal.discard_confirm": "Yoksay", + "account_edit.field_edit_modal.discard_message": "Kaydedilmemiş değişiklikleriniz var. Bunları silmek istediğinizden emin misiniz?", "account_edit.field_edit_modal.edit_title": "Özel alanı düzenle", - "account_edit.field_edit_modal.limit_header": "Önerilen karakter sınırı aşıldı", - "account_edit.field_edit_modal.limit_message": "Mobil cihaz kullanıcıları sahayı tam olarak görmeyebilir.", + "account_edit.field_edit_modal.length_warning": "Önerilen karakter sınırı aşıldı. Mobil kullanıcılar sahayı tam olarak görmeyebilirler.", "account_edit.field_edit_modal.link_emoji_warning": "Url'lerle birlikte özel emoji kullanmamanızı öneririz. Her ikisini de içeren özel alanlar, kullanıcıların kafasını karıştırmamak için bağlantı yerine yalnızca metin olarak görüntülenir.", "account_edit.field_edit_modal.name_hint": "Örn. \"Kişisel web sitesi\"", "account_edit.field_edit_modal.name_label": "Etiket", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Alternatif metni düzenle", "account_edit.image_edit.remove_button": "Görseli kaldır", "account_edit.image_edit.replace_button": "Görseli değiştir", + "account_edit.item_list.delete": "{name} sil", + "account_edit.item_list.edit": "{name} düzenle", "account_edit.name_modal.add_title": "Görünen ad ekle", "account_edit.name_modal.edit_title": "Görünen adı düzenle", "account_edit.profile_tab.button_label": "Özelleştir", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "\"Medya\" sekmesini göster", "account_edit.profile_tab.show_media_replies.description": "Etkinleştirildiğinde Medya sekmesi hem kendi gönderilerinizi hem de diğer kişilerin gönderilerine verdiğiniz yanıtları gösterir.", "account_edit.profile_tab.show_media_replies.title": "\"Medya\" sekmesinde yanıtları göster", - "account_edit.profile_tab.subtitle": "Profilinizdeki sekmeleri ve bunların görüntülediği bilgileri özelleştirin.", - "account_edit.profile_tab.title": "Profil sekme ayarları", "account_edit.save": "Kaydet", "account_edit.upload_modal.back": "Geri", "account_edit.upload_modal.done": "Tamamlandı", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Yüklemek için bırakın", "account_edit.upload_modal.step_upload.header": "Bir resim seç", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF veya JPG formatında, en fazla {limit} MB.{br}Görsel {width}x{height} piksel boyutuna getirilir.", - "account_edit.upload_modal.title_add": "Profil fotoğrafı ekle", - "account_edit.upload_modal.title_replace": "Profil fotoğrafını değiştir", + "account_edit.upload_modal.title_add.avatar": "Profil fotoğrafı ekle", + "account_edit.upload_modal.title_add.header": "Kapak fotoğrafı ekle", + "account_edit.upload_modal.title_replace.avatar": "Profil fotoğrafını değiştir", + "account_edit.upload_modal.title_replace.header": "Kapak fotoğrafını değiştirin", "account_edit.verified_modal.details": "Kişisel web sitelerine bağlantıları doğrulayarak Mastodon profilinize güvenilirlik katın. İşte böyle çalışıyor:", "account_edit.verified_modal.invisible_link.details": "Bağlantıyı başlığınıza ekleyin. Önemli olan kısım, kullanıcı tarafından oluşturulan içeriğe sahip web sitelerinde kimlik sahtekarlığını önleyen rel=\"me\" özniteliğidir. {tag} yerine sayfanın başlığında bir bağlantı etiketi bile kullanabilirsiniz, ancak HTML, JavaScript çalıştırılmadan erişilebilir olmalıdır.", "account_edit.verified_modal.invisible_link.summary": "Bağlantıyı nasıl görünmez hale getirebilirim?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Web sitenizi özel bir alan olarak ekleyin", "account_edit.verified_modal.title": "Doğrulanmış bir bağlantı nasıl eklenir", "account_edit_tags.add_tag": "#{tagName} ekle", - "account_edit_tags.column_title": "Öne çıkarılmış etiketleri düzenle", + "account_edit_tags.column_title": "Etiketleri Düzenle", "account_edit_tags.help_text": "Öne çıkan etiketler kullanıcıların profilinizi keşfetmesine ve etkileşim kurmasına yardımcı olur. Profil sayfanızın Etkinlik görünümünde filtreler olarak görünürler.", + "account_edit_tags.max_tags_reached": "Azami öne çıkan etiket sayısına ulaştınız.", "account_edit_tags.search_placeholder": "Bir etiket girin…", "account_edit_tags.suggestions": "Öneriler:", "account_edit_tags.tag_status_count": "{count, plural, one {# gönderi} other {# gönderi}}", + "account_list.total": "{total, plural, one {# hesap} other {# hesap}}", "account_note.placeholder": "Not eklemek için tıklayın", "admin.dashboard.daily_retention": "Kayıttan sonra günlük kullanıcı saklama oranı", "admin.dashboard.monthly_retention": "Kayıttan sonra aylık kullanıcı saklama oranı", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Başka sunucu bul", "closed_registrations_modal.preamble": "Mastodon merkeziyetsizdir, bu yüzden hesabınızı nerede oluşturursanız oluşturun, bu sunucudaki herhangi birini takip edebilecek veya onunla etkileşebileceksiniz. Hatta kendi sunucunuzu bile barındırabilirsiniz!", "closed_registrations_modal.title": "Mastodon'a kayıt olmak", - "collection.share_modal.share_link_label": "Davet bağlantısı", + "collection.share_modal.share_link_label": "Bağlantıyı paylaş", "collection.share_modal.share_via_post": "Mastodon'da paylaş", "collection.share_modal.share_via_system": "Paylaş…", "collection.share_modal.title": "Koleksiyonu paylaş", @@ -346,8 +364,11 @@ "collection.share_template_other": "Bu harika koleksiyona göz atın: {link}", "collection.share_template_own": "Yeni koleksiyonuma göz atın: {link}", "collections.account_count": "{count, plural, one {# hesap} other {# hesap}}", - "collections.accounts.empty_description": "Takip ettiğiniz hesapların sayısını {count} kadar artırın", + "collections.accounts.empty_description": "{count} hesap ekleyebilirsiniz", + "collections.accounts.empty_editor_title": "Koleksiyonda henüz kimse yok", "collections.accounts.empty_title": "Bu koleksiyon boş", + "collections.block_collection_owner": "Hesabı engelle", + "collections.by_account": "yazan {account_handle}", "collections.collection_description": "Açıklama", "collections.collection_language": "Dil", "collections.collection_language_none": "Hiçbiri", @@ -356,47 +377,57 @@ "collections.confirm_account_removal": "Bu hesabı bu koleksiyondan çıkarmak istediğinizden emin misiniz?", "collections.content_warning": "İçerik uyarısı", "collections.continue": "Devam et", - "collections.create.accounts_subtitle": "Yalnızca keşif seçeneğini etkinleştirmiş takip ettiğiniz hesaplar eklenebilir.", + "collections.copy_link": "Bağlantıyı kopyala", + "collections.copy_link_confirmation": "Koleksiyon bağlantısı panoya kopyalandı", "collections.create.accounts_title": "Bu koleksiyonda kimleri öne çıkaracaksınız?", "collections.create.basic_details_title": "Temel bilgiler", "collections.create.steps": "Adım {step}/{total}", - "collections.create_a_collection_hint": "En sevdiğiniz hesapları başkalarına önermek veya paylaşmak için bir koleksiyon oluşturun.", "collections.create_collection": "Koleksiyon oluştur", "collections.delete_collection": "Koleksiyonu sil", "collections.description_length_hint": "100 karakterle sınırlı", - "collections.detail.accept_inclusion": "Tamam", - "collections.detail.accounts_heading": "Hesaplar", - "collections.detail.author_added_you": "{author} sizi koleksiyonuna ekledi", - "collections.detail.curated_by_author": "{author} tarafından derlenen", - "collections.detail.curated_by_you": "Sizin derledikleriniz", + "collections.detail.author_added_you_on_date": "{author}, sizi {date} tarihinde ekledi", "collections.detail.loading": "Koleksiyon yükleniyor…", - "collections.detail.other_accounts_in_collection": "Bu koleksiyondaki diğer kişiler:", "collections.detail.revoke_inclusion": "Beni çıkar", + "collections.detail.sensitive_content": "Hassas içerik", "collections.detail.sensitive_note": "Bu koleksiyon bazı kullanıcılar için hassas olabilecek hesap ve içerik içerebilir.", "collections.detail.share": "Bu koleksiyonu paylaş", + "collections.detail.you_are_in_this_collection": "Bu koleksiyonda öne çıkanlardasınız", "collections.edit_details": "Ayrıntıları düzenle", - "collections.error_loading_collections": "Koleksiyonlarınızı yüklemeye çalışırken bir hata oluştu.", - "collections.hints.accounts_counter": "{count} / {max} hesap", + "collections.hidden_accounts_description": "Bu {count, plural, one {kullanıcıyı} other {kullanıcıları}} engellediniz veya sessize aldınız", + "collections.hidden_accounts_link": "{count, plural, one {# gizli hesap} other {# gizli hesap}}", + "collections.hints.accounts_counter": "{count}/{max} hesap", "collections.last_updated_at": "Son güncelleme: {date}", + "collections.list.collections_with_count": "{count, plural, one {# Koleksiyon} other {# Koleksiyon}}", + "collections.list.created_by_author": "{name} tarafından oluşturuldu", + "collections.list.created_by_you": "Sizin tarafınızdan oluşturuldu", + "collections.list.featuring_you": "Sizi içeriyor", "collections.manage_accounts": "Hesapları yönet", "collections.mark_as_sensitive": "Hassas olarak işaretle", "collections.mark_as_sensitive_hint": "Koleksiyonun açıklamasını ve hesaplarını içerik uyarısının arkasında gizler. Koleksiyon adı hala görünür olacaktır.", + "collections.maximum_collection_count_description": "Sunucusunuz en fazla {count} koleksiyon oluşturmanıza izin veriyor.", + "collections.maximum_collection_count_reached": "Maksimum koleksiyon sayısına ulaştınız", "collections.name_length_hint": "40 karakterle sınırlı", "collections.new_collection": "Yeni koleksiyon", - "collections.no_collections_yet": "Henüz hiçbir koleksiyon yok.", - "collections.old_last_post_note": "Son gönderi bir haftadan önce", - "collections.remove_account": "Bu hesabı çıkar", + "collections.pending_accounts.message": "Kullanıcıdan veya sunucusundan yanıt beklediğimizde hesaplar \"beklemede\" olarak görünebilir. Beklemede olan hesapları yalnızca siz görebilirsiniz.", + "collections.pending_accounts.title": "Neden beklemede olan hesapları görüyorum?", + "collections.remove_account": "Kaldır", "collections.report_collection": "Bu koleksiyonu bildir", "collections.revoke_collection_inclusion": "Beni bu koleksiyondan çıkar", "collections.revoke_inclusion.confirmation": "\"{collection}\" koleksiyonundan çıkarıldınız", "collections.revoke_inclusion.error": "Bir hata oluştu, lütfen daha sonra tekrar deneyin.", - "collections.search_accounts_label": "Eklemek için hesap arayın…", + "collections.search_accounts_label": "Eklemek için hesap arayın", "collections.search_accounts_max_reached": "Maksimum hesabı eklediniz", "collections.sensitive": "Hassas", + "collections.share_short": "Paylaş", + "collections.suggestions.can_not_add": "Eklenemez", + "collections.suggestions.can_not_add_desc": "Bu hesaplar, keşfedilmek istemiyor veya koleksiyonları desteklemeyen bir sunucuda yer alıyor olabilirler.", + "collections.suggestions.must_follow": "İlk önce takip etmelisiniz", + "collections.suggestions.must_follow_desc": "Bu hesaplar tüm takip isteklerini inceler. Takipçileri bunları koleksiyonlarına ekleyebilir.", "collections.topic_hint": "Bu koleksiyonun ana konusunu başkalarının anlamasına yardımcı olacak bir etiket ekleyin.", "collections.topic_special_chars_hint": "Kaydederken özel karakterler silinecektir", + "collections.unlisted_collections_description": "Bunlar profilinizde başkalarına görünmez. Bağlantıya sahip olan herkes bunları görebilir.", + "collections.unlisted_collections_with_count": "Listelenmeyen koleksiyonlar ({count})", "collections.view_collection": "Koleksiyonu görüntüle", - "collections.view_other_collections_by_user": "Bu kullanıcının diğer koleksiyonlarını görüntüle", "collections.visibility_public": "Herkese açık", "collections.visibility_public_hint": "Arama sonuçlarında ve önerilerin görüntülendiği diğer alanlarda keşfedilebilir.", "collections.visibility_title": "Görünürlük", @@ -405,7 +436,6 @@ "column.about": "Hakkında", "column.blocks": "Engellenen kullanıcılar", "column.bookmarks": "Yer İşaretleri", - "column.collections": "Koleksiyonlarım", "column.community": "Yerel ağ akışı", "column.create_list": "Liste oluştur", "column.direct": "Özel bahsetmeler", @@ -422,8 +452,10 @@ "column.lists": "Listeler", "column.mutes": "Sessize alınmış kullanıcılar", "column.notifications": "Bildirimler", + "column.other_collections": "{name} koleksiyonları", "column.pins": "Sabitlenmiş gönderiler", "column.public": "Federe ağ akışı", + "column.your_collections": "Koleksiyonlarınız", "column_back_button.label": "Geri", "column_header.hide_settings": "Ayarları gizle", "column_header.moveLeft_settings": "Sütunu sola taşı", @@ -485,12 +517,13 @@ "confirmations.discard_draft.post.title": "Taslak gönderiniz silinsin mi?", "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.follow_to_collection.confirm": "Takip et ve koleksiyona ekle", - "confirmations.follow_to_collection.message": "Bir koleksiyona eklemek için {name} kişisini takip etmeniz gerekiyor.", - "confirmations.follow_to_collection.title": "Hesabı takip et?", "confirmations.follow_to_list.confirm": "Takip et ve yapılacaklar listesine ekle", "confirmations.follow_to_list.message": "Bir listeye eklemek için {name} kişisini takip etmeniz gerekiyor.", "confirmations.follow_to_list.title": "Kullanıcıyı takip et?", + "confirmations.hide_featured_tab.confirm": "Sekmeyi Gizle", + "confirmations.hide_featured_tab.intro": "Bunu istediğiniz zaman Profil düzenle > Profil sekmesi ayarları bölümünden değiştirebilirsiniz.", + "confirmations.hide_featured_tab.message": "Bu, {serverName} ve Mastodon'un en son sürümünü çalıştıran diğer sunuculardaki kullanıcılar için sekmeyi gizleyecektir. Diğer sunucularda görüntü farklılık gösterebilir.", + "confirmations.hide_featured_tab.title": "\"Öne Çıkanlar\" sekmesi gizlensin mi?", "confirmations.logout.confirm": "Oturumu kapat", "confirmations.logout.message": "Oturumu kapatmak istediğinden emin misin?", "confirmations.logout.title": "Oturumu kapat?", @@ -529,6 +562,7 @@ "content_warning.hide": "Gönderiyi gizle", "content_warning.show": "Yine de göster", "content_warning.show_more": "Daha fazla göster", + "content_warning.show_short": "Göster", "conversation.delete": "Sohbeti sil", "conversation.mark_as_read": "Okundu olarak işaretle", "conversation.open": "Sohbeti görüntüle", @@ -569,6 +603,14 @@ "domain_pill.your_server": "Dijital anasayfanız, tüm gönderilerinizin yaşadığı yerdir. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de getirin.", "domain_pill.your_username": "Bu sunucudaki tekil tanımlayıcınız. Farklı sunucularda aynı kullanıcı adına sahip kullanıcıları bulmak mümkündür.", "dropdown.empty": "Bir seçenek seçin", + "email_subscriptions.email": "E-posta", + "email_subscriptions.form.action": "Abone ol", + "email_subscriptions.form.bottom": "Gönderiler Mastodon hesabı oluşturmadan e-posta kutunuza gelsin. İstediğiniz zaman aboneliğinizi iptal edebilirsiniz. Daha fazla bilgi için Gizlilik Politikası'na bakın.", + "email_subscriptions.form.title": "{name} kişisinin e-posta güncellemelerine kaydolun", + "email_subscriptions.submitted.lead": "E-posta güncellemelerine kaydolma işlemini tamamlamak için gelen kutunuzu kontrol edin.", + "email_subscriptions.submitted.title": "Bir adım daha", + "email_subscriptions.validation.email.blocked": "Engellenmiş e-posta sağlayıcı", + "email_subscriptions.validation.email.invalid": "Geçersiz eposta adresi", "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.", "embed.preview": "İşte böyle görünecek:", "emoji_button.activity": "Aktivite", @@ -586,9 +628,14 @@ "emoji_button.search_results": "Arama sonuçları", "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", - "empty_column.account_featured.me": "Henüz hiçbir şeyi öne çıkarmadınız. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?", - "empty_column.account_featured.other": "{acct} henüz hiçbir şeyi öne çıkarmadı. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?", - "empty_column.account_featured_other.unknown": "Bu hesap henüz hiçbir şeyi öne çıkarmadı.", + "empty_column.account_featured.other": "{acct} henüz hiçbir şeyi öne çıkarmadı.", + "empty_column.account_featured_self.no_collections_button": "Bir koleksiyon oluştur", + "empty_column.account_featured_self.no_collections_hide_tab": "Onun yerine bu sekmeyi gizle", + "empty_column.account_featured_self.pre_collections": "Koleksiyonlar için beklemede kalın", + "empty_column.account_featured_self.pre_collections_desc": "“Koleksiyonlar” (Mastodon 4.6 sürümünde kullanıma sunulacak) özelliği başkalarına önermek üzere kendi seçtiğiniz hesap listelerini oluşturmanıza olanak tanır.", + "empty_column.account_featured_self.showcase_accounts": "Sevdiğiniz hesapları öne çıkarın", + "empty_column.account_featured_self.showcase_accounts_desc": "Koleksiyonlar başkalarının Fediverse'i daha iyi keşfetmesine yardımcı olmak amacıyla derlenmiş hesap listeleridir.", + "empty_column.account_featured_unknown.other": "Bu hesap henüz hiçbir şeyi öne çıkarmadı.", "empty_column.account_hides_collections": "Bu kullanıcı bu bilgiyi sağlamayı tercih etmemiştir", "empty_column.account_suspended": "Hesap askıya alındı", "empty_column.account_timeline": "Burada hiç gönderi yok!", @@ -674,7 +721,9 @@ "follow_suggestions.who_to_follow": "Takip edebileceklerin", "followed_tags": "Takip edilen etiketler", "followers.hide_other_followers": "Bu kullanıcı diğer takipçilerini görünür kılmamayı seçmiştir", + "followers.title": "{name} takip ediliyor", "following.hide_other_following": "Bu kullanıcı takip ettiği diğer kişileri görünür kılmamayı seçmiştir", + "following.title": "{name} takip ediyor", "footer.about": "Hakkında", "footer.about_mastodon": "Mastodon Hakkında", "footer.about_server": "{domain} Hakkında", @@ -686,6 +735,7 @@ "footer.source_code": "Kaynak kodu görüntüle", "footer.status": "Durum", "footer.terms_of_service": "Hizmet şartları", + "form_error.blank": "Alan boş bırakılamaz.", "form_field.optional": "(isteğe bağlı)", "generic.saved": "Kaydet", "getting_started.heading": "Başlarken", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Takip edilen etiketler menüsünü genişlet", "navigation_panel.expand_lists": "Liste menüsünü genişlet", "not_signed_in_indicator.not_signed_in": "Bu kaynağa erişmek için oturum açmanız gerekir.", + "notification.added_to_collection": "{name} sizi bir koleksiyona ekledi", "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", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} ve {count, plural, one {# diğer kişi} other {# diğer kişi}} kaydoldu", "notification.annual_report.message": "{year} yılı #Wrapstodon'unuz bekliyor! Yılınızın Mastodon'daki öne çıkanlarını ve anılarınızı gösterin!", "notification.annual_report.view": "#Wrapstodon'u Görüntüle", + "notification.collection_update": "{name} olduğunuz bir koleksiyonu düzenledi", "notification.favourite": "{name} gönderinizi beğendi", "notification.favourite.name_and_others_with_link": "{name} ve {count, plural, one {# diğer kişi} other {# diğer kişi}} gönderinizi beğendi", "notification.favourite_pm": "{name} özel değininizi beğendi", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "etkin kullanıcılar", "server_banner.administered_by": "Yönetici:", "server_banner.is_one_of_many": "{domain} fediverse katılımı için kullanabileceğiniz birçok bağımsız Mastodon sunucusundan biridir.", + "server_banner.more_about_this_server": "Bu sunucu hakkında daha fazla bilgi", "server_banner.server_stats": "Sunucu istatistikleri:", "sign_in_banner.create_account": "Hesap oluştur", "sign_in_banner.follow_anyone": "Fediverse çapında herhangi bir kimseyi takip edin ve tümünü kronolojik sırada görüntüleyin. Algoritma, reklam veya tıklama tuzağı yok.", @@ -1300,7 +1353,7 @@ "visibility_modal.header": "Görünürlük ve etkileşim", "visibility_modal.helper.direct_quoting": "Mastodon'da özel değiniler başkaları tarafından alıntılanamaz.", "visibility_modal.helper.privacy_editing": "Gönderi yayınlandıktan sonra görünürlük değiştirilemez.", - "visibility_modal.helper.privacy_private_self_quote": "Özel gönderilerin kendi alıntıları herkese açık hale getirilemez.", + "visibility_modal.helper.privacy_private_self_quote": "Özel mesajların kendi kendine alıntılanması herkese açık hale getirilemez.", "visibility_modal.helper.private_quoting": "Mastodon'da sadece takipçilere yönelik gönderiler başkaları tarafından alıntılanamaz.", "visibility_modal.helper.unlisted_quoting": "İnsanlar sizden alıntı yaptığında, onların gönderileri de trend zaman tünellerinden gizlenecektir.", "visibility_modal.instructions": "Bu gönderiyle kimlerin etkileşime girebileceğini kontrol edin. Ayrıca, Tercihler > Gönderme varsayılanları bölümüne giderek tüm gelecek gönderiler için ayarlayabilirsiniz.", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 12c3363a984d79..228dcc40045977 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -1,6 +1,7 @@ { "about.blocks": "Модерациялана торган серверлар", "about.contact": "Бәйләнеш:", + "about.default_locale": "Килешү буенча", "about.disclaimer": "Mastodon-бушлай ачык чыганак программасы һәм Mastodon gmbh сәүдә маркасы.", "about.domain_blocks.no_reason_available": "Сәбәбе юк", "about.domain_blocks.preamble": "Mastodon гадәттә сезгә бүтән fediverse серверыннан эчтәлекне карарга һәм аның белән кулланучылар белән аралашырга мөмкинлек бирә. Бу конкрет серверда ясалган искәрмәләр.", @@ -12,25 +13,31 @@ "about.not_available": "Бу серверда бу мәгълүмат юк иде.", "about.powered_by": "{mastodon} нигезендә үзәкчелеге бетерелгән социаль челтәр нигезендә", "about.rules": "Сервер кагыйдәләре", + "account.account_note_header": "Шәхси искәрмәләр", "account.activity": "Активлык", + "account.add_note": "Шәхси искәрмә өстәү", "account.add_or_remove_from_list": "Исемлеккә кушу яки бетерү", + "account.badges.admin": "Админ", + "account.badges.blocked": "Блокланган", "account.badges.bot": "Бот", + "account.badges.domain_blocked": "Блокланган доменнар", "account.badges.group": "Төркем", + "account.badges.muted": "Тавышсыз", + "account.badges.muted_until": "{until}-га кадәр игнорлау", "account.block": "@{name} кулланучыны блоклау", "account.block_domain": "{domain} доменын блоклау", "account.block_short": "Блокла", "account.blocked": "Блокланган", "account.cancel_follow_request": "Киләсе сорау", "account.copy": "Профиль сылтамасын күчереп ал", + "account.direct": "{name}-ны шәхсән икә алу", "account.disable_notifications": "@{name} язулары өчен белдерүләр сүндерү", + "account.edit_note": "Шәхси искәрмәне төзәтү", "account.edit_profile": "Профильне үзгәртү", "account.edit_profile_short": "Үзгәрт", "account.enable_notifications": "@{name} язулары өчен белдерүләр яндыру", "account.endorse": "Профильдә тәкъдим итү", "account.featured.accounts": "Профильләр", - "account.featured.hashtags": "Һәштэглар", - "account.featured_tags.last_status_at": "Соңгы хәбәр {date}", - "account.featured_tags.last_status_never": "Хәбәрләр юк", "account.filters.all": "Барлык активлык", "account.filters.boosts_toggle": "Бустларны күрсәт", "account.follow": "Язылу", @@ -54,7 +61,6 @@ "account.muted": "Әһәмият бирмәнгән", "account.open_original_page": "Чыганак битен ачу", "account.posts": "Язма", - "account.posts_with_replies": "Язма һәм җавап", "account.report": "@{name} кулланучыга шикаять итү", "account.requested_follow": "{name} Сезгә язылу соравын җиберде", "account.share": "@{name} профиле белән уртаклашу", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 20706b09430734..97edc4e8b24c9c 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -11,7 +11,6 @@ "account.block_domain": "{domain} دائىرىنى توس", "account.block_short": "توس", "account.blocked": "توسۇلدى", - "account.blocking": "توسۇۋاتىدۇ", "account.cancel_follow_request": "ئەگىشىش ئىلتىماسىدىن ۋاز كەچ", "account.copy": "تەرجىمىھال ئۇلانمىسىنى كۆچۈر", "account.direct": "@{name} نى يوشۇرۇن ئاتا", @@ -28,7 +27,6 @@ "account.follows_you": "سىزگە ئەگەشتى", "account.go_to_profile": "تەرجىمىھالغا يۆتكەل", "account.posts": "يازما", - "account.posts_with_replies": "يازما ۋە ئىنكاس", "account.report": "@{name} نى پاش قىل", "account_note.placeholder": "چېكىلسە ئىزاھات قوشىدۇ", "column.pins": "چوققىلانغان يازما", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 67fe49725ae640..88f09f9b0ea103 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -40,9 +40,6 @@ "account.familiar_followers_two": "Має серед підписників {name1} та {name2}", "account.featured": "Рекомендоване", "account.featured.accounts": "Профілі", - "account.featured.hashtags": "Хештеги", - "account.featured_tags.last_status_at": "Останній допис {date}", - "account.featured_tags.last_status_never": "Немає дописів", "account.field_overflow": "Показати повністю", "account.filters.all": "Усі дії", "account.filters.boosts_toggle": "Показати поширення", @@ -98,11 +95,9 @@ "account.node_modal.save": "Зберегти", "account.open_original_page": "Відкрити оригінальну сторінку", "account.posts": "Дописи", - "account.posts_with_replies": "Дописи й відповіді", "account.remove_from_followers": "Вилучити {name} із підписників", "account.report": "Поскаржитися на @{name}", "account.requested_follow": "{name} надсилає запит на стеження", - "account.requests_to_follow_you": "Просить дозвіл на вас підписатись", "account.share": "Поділитися профілем @{name}", "account.show_reblogs": "Показати поширення від @{name}", "account.statuses_counter": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", @@ -193,9 +188,7 @@ "closed_registrations_modal.find_another_server": "Знайти інший сервер", "closed_registrations_modal.preamble": "Mastodon децентралізований, тож незалежно від того, де ви створюєте свій обліковий запис, ви зможете слідкувати та взаємодіяти з будь-ким на цьому сервері. Ви навіть можете розмістити його самостійно!", "closed_registrations_modal.title": "Реєстрація на Mastodon", - "collections.detail.accounts_heading": "Облікові записи", "collections.edit_details": "Редагувати подробиці", - "collections.remove_account": "Вилучити обліковий запис", "column.about": "Про застосунок", "column.blocks": "Заблоковані користувачі", "column.bookmarks": "Закладки", @@ -358,7 +351,6 @@ "emoji_button.search_results": "Результати пошуку", "emoji_button.symbols": "Символи", "emoji_button.travel": "Подорожі та місця", - "empty_column.account_featured_other.unknown": "Цей обліковий запис ще не виділив нічого.", "empty_column.account_hides_collections": "Цей користувач вирішив не робити цю інформацію доступною", "empty_column.account_suspended": "Обліковий запис заблоковано", "empty_column.account_timeline": "Тут немає дописів!", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 3e589dc80b342c..1e518485a79dfb 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -19,8 +19,6 @@ "account.edit_profile": "مشخص ترمیم کریں", "account.enable_notifications": "جب @{name} پوسٹ کرے تو مجھ مطلع کریں", "account.endorse": "مشکص پر نمایاں کریں", - "account.featured_tags.last_status_at": "آخری پوسٹ {date} کو", - "account.featured_tags.last_status_never": "کوئی مراسلہ نہیں", "account.follow": "پیروی کریں", "account.follow_back": "اکاؤنٹ کو فالو بیک ", "account.followers": "پیروکار", @@ -44,7 +42,6 @@ "account.no_bio": "کوئی تفصیل نہیں دی گئی۔", "account.open_original_page": "اصل صفحہ کھولیں", "account.posts": "ٹوٹ", - "account.posts_with_replies": "ٹوٹ اور جوابات", "account.report": "@{name} اطلاع کریں", "account.requested_follow": "{name} آپ کو فالو کرنا چھاتا ہے۔", "account.share": "@{name} کے مشخص کو بانٹیں", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 94b83f30ac1134..32f5da4cb42f52 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -22,8 +22,6 @@ "account.edit_profile": "Profilni tahrirlash", "account.enable_notifications": "@{name} post qo‘yganida menga xabar olish", "account.endorse": "Profildagi xususiyat", - "account.featured_tags.last_status_at": "Oxirgi post: {date}", - "account.featured_tags.last_status_never": "Habarlar yo'q", "account.follow": "Obuna bo‘lish", "account.followers": "Obunachilar", "account.followers.empty": "Bu foydalanuvchini hali hech kim kuzatmaydi.", @@ -42,7 +40,6 @@ "account.muted": "Ovozsiz", "account.open_original_page": "Original post sahifasi", "account.posts": "Postlar", - "account.posts_with_replies": "Xabarlar va javoblar", "account.report": "@{name} xabar berish", "account.requested_follow": "{name} sizni kuzatishni soʻradi", "account.share": "@{name} profilini ulashing", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index bbaae71d13e39e..c88f1f4bfaaaf5 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -15,7 +15,7 @@ "about.rules": "Nội quy máy chủ", "account.account_note_header": "Ghi chú", "account.activity": "Hoạt động", - "account.add_note": "Thêm ghi chú", + "account.add_note": "Ghi chú", "account.add_or_remove_from_list": "Sửa danh sách", "account.badges.admin": "Quản trị viên", "account.badges.blocked": "Đã chặn", @@ -28,12 +28,10 @@ "account.block_domain": "Chặn mọi thứ từ {domain}", "account.block_short": "Chặn", "account.blocked": "Đã chặn", - "account.blocking": "Đang chặn", "account.cancel_follow_request": "Thu hồi yêu cầu theo dõi", "account.copy": "Sao chép địa chỉ", "account.direct": "Nhắn riêng @{name}", "account.disable_notifications": "Tắt thông báo khi @{name} đăng tút", - "account.domain_blocking": "Máy chủ đang chủ", "account.edit_note": "Sửa ghi chú", "account.edit_profile": "Sửa hồ sơ", "account.edit_profile_short": "Sửa", @@ -45,9 +43,7 @@ "account.featured": "Nêu bật", "account.featured.accounts": "Tài khoản", "account.featured.collections": "Gói khởi đầu", - "account.featured.hashtags": "Hashtag thường dùng", - "account.featured_tags.last_status_at": "Tút gần nhất {date}", - "account.featured_tags.last_status_never": "Chưa có tút", + "account.featured.new_collection": "Gói khởi đầu mới", "account.field_overflow": "Hiện đầy đủ nội dung", "account.filters.all": "Tất cả hoạt động", "account.filters.boosts_toggle": "Hiện những lượt đăng lại", @@ -62,25 +58,36 @@ "account.follow_request_cancel": "Hủy yêu cầu", "account.follow_request_cancel_short": "Hủy bỏ", "account.follow_request_short": "Yêu cầu", - "account.followers": "Người theo dõi", + "account.followers": "Người theo", "account.followers.empty": "Chưa có người theo dõi nào.", "account.followers_counter": "{count, plural, other {{counter} người theo dõi}}", "account.followers_you_know_counter": "{counter} bạn biết", - "account.following": "Đang theo dõi", + "account.following": "Đang theo", "account.following_counter": "{count, plural, other {{counter} theo dõi}}", "account.follows.empty": "Tài khoản này chưa theo dõi ai.", "account.follows_you": "Đang theo dõi bạn", "account.go_to_profile": "Xem hồ sơ", "account.hide_reblogs": "Ẩn tút @{name} đăng lại", "account.in_memoriam": "Tưởng Niệm.", - "account.joined_short": "Tham gia", + "account.join_modal.day": "Ngày", + "account.join_modal.me": "Bạn đã tham gia {server} vào", + "account.join_modal.me_anniversary": "Happy Fediversary! Bạn đã tham gia {server} vào", + "account.join_modal.me_today": "Đó là ngày đầu tiên của bạn trên {server}!", + "account.join_modal.other": "{name} đã tham gia {server} vào", + "account.join_modal.other_today": "Đó là ngày đầu tiên của {name} trên {server}!", + "account.join_modal.share.celebrate": "Chia sẻ một tút kỷ niệm", + "account.join_modal.share.intro": "Chia sẻ một tút giới thiệu", + "account.join_modal.share.welcome": "Chia sẻ một tút chào mừng", + "account.join_modal.years": "{number, plural, other {năm}}", + "account.joined_short": "Năm", "account.languages": "Đổi ngôn ngữ mong muốn", + "account.last_active": "Hoạt động lần cuối", "account.link_verified_on": "Liên kết này đã được xác minh vào {date}", "account.locked_info": "Đây là tài khoản riêng tư. Chủ tài khoản tự mình xét duyệt các yêu cầu theo dõi.", "account.media": "Phương tiện", "account.mention": "Nhắc đến @{name}", - "account.menu.add_to_list": "Thêm vào danh sách…", - "account.menu.block": "Chặn người này", + "account.menu.add_to_list": "Thêm vào danh sách", + "account.menu.block": "Chặn tài khoản", "account.menu.block_domain": "Chặn {domain}", "account.menu.copied": "Đã sao chép liên kết tài khoản vào clipboard", "account.menu.copy": "Sao chép liên kết", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "Phớt lờ thông báo", "account.mute_short": "Phớt lờ", "account.muted": "Đã phớt lờ", - "account.muting": "Đang ẩn", "account.mutual": "Theo dõi nhau", + "account.name.copy": "Sao chép địa chỉ", "account.name.help.domain": "{domain} là máy chủ lưu trữ hồ sơ và tút của tài khoản.", "account.name.help.domain_self": "{domain} là máy chủ lưu trữ hồ sơ và tút của bạn.", - "account.name.help.footer": "Giống như bạn có thể gửi email cho mọi người trên các dịch vụ email khác nhau, bạn có thể tương tác với mọi người trên các máy chủ Mastodon khác – và trên các ứng dụng xã hội khác sử dụng cùng giao thức mà Mastodon sử dụng (ActivityPub).", + "account.name.help.footer": "Giống như việc bạn có thể gửi email cho những người sử dụng các nhà cung cấp email khác nhau, bạn cũng có thể tương tác với những người trên các máy chủ Mastodon khác và với bất kỳ ai trên các ứng dụng mạng xã hội tương thích với Mastodon khác.", "account.name.help.header": "Một địa chỉ giống như địa chỉ email", "account.name.help.username": "{username} là tên người dùng duy nhất trên máy chủ này. Các máy chủ khác có thể cũng có tên người dùng giống vậy.", "account.name.help.username_self": "{username} là tên người dùng của bạn trên máy chủ này. Các máy chủ khác cũng có thể có tên người dùng giống bạn.", @@ -121,12 +128,11 @@ "account.note.edit_button": "Sửa", "account.note.title": "Ghi chú (chỉ hiển thị với bạn)", "account.open_original_page": "Mở liên kết gốc", + "account.pending": "Đợi duyệt", "account.posts": "Tút", - "account.posts_with_replies": "Trả lời", "account.remove_from_followers": "Xóa người theo dõi {name}", "account.report": "Báo cáo @{name}", "account.requested_follow": "{name} yêu cầu theo dõi bạn", - "account.requests_to_follow_you": "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, other {{counter} Tút}}", @@ -141,34 +147,42 @@ "account.unmute": "Bỏ phớt lờ @{name}", "account.unmute_notifications_short": "Bỏ phớt lờ thông báo", "account.unmute_short": "Bỏ phớt lờ", - "account_edit.bio.placeholder": "Thêm một dòng giới thiệu để giúp mọi người nhận ra bạn.", + "account_edit.advanced_settings.bot_hint": "Tài khoản này tự động thực hiện các hành động và không cần thiết theo dõi", + "account_edit.advanced_settings.bot_label": "Tài khoản tự động", + "account_edit.advanced_settings.title": "Thiết lập nâng cao", + "account_edit.bio.add_label": "Thêm giới thiệu", + "account_edit.bio.edit_label": "Sửa giới thiệu", + "account_edit.bio.placeholder": "Giúp mọi người nhận ra bạn là ai.", "account_edit.bio.title": "Giới thiệu", "account_edit.bio_modal.add_title": "Thêm giới thiệu", "account_edit.bio_modal.edit_title": "Sửa giới thiệu", - "account_edit.button.add": "Thêm {item}", - "account_edit.button.delete": "Xóa {item}", - "account_edit.button.edit": "Sửa {item}", "account_edit.column_button": "Xong", "account_edit.column_title": "Sửa hồ sơ", - "account_edit.custom_fields.name": "trường", + "account_edit.custom_fields.add_label": "Thêm trường", + "account_edit.custom_fields.edit_label": "Sửa trường", "account_edit.custom_fields.placeholder": "Thêm nghề nghiệp, liên kết ngoài hoặc bất kỳ gì mà bạn muốn.", "account_edit.custom_fields.reorder_button": "Sắp xếp trường", "account_edit.custom_fields.tip_content": "Bạn có thể dễ dàng tăng độ tin cậy cho tài khoản Mastodon của mình bằng cách xác minh liên kết đến bất kỳ trang web nào bạn sở hữu.", "account_edit.custom_fields.tip_title": "Mẹo: Thêm liên kết xác minh", "account_edit.custom_fields.title": "Trường tùy chỉnh", "account_edit.custom_fields.verified_hint": "Làm thế nào để thêm liên kết xác minh?", - "account_edit.display_name.placeholder": "Tên gọi là tên hiển thị trên hồ sơ của bạn, cũng như bảng tin.", + "account_edit.display_name.add_label": "Thêm tên gọi", + "account_edit.display_name.edit_label": "Sửa tên gọi", + "account_edit.display_name.placeholder": "Tên gọi là tên hiển thị trên hồ sơ của bạn và bảng tin.", "account_edit.display_name.title": "Tên gọi", - "account_edit.featured_hashtags.item": "hashtag", + "account_edit.featured_hashtags.edit_label": "Thêm hashtag", "account_edit.featured_hashtags.placeholder": "Giúp mọi người nhận diện và truy cập nhanh những chủ đề mà bạn thích.", "account_edit.featured_hashtags.title": "Hashtag thường dùng", + "account_edit.field_actions.delete": "Xóa trường", + "account_edit.field_actions.edit": "Sửa trường", "account_edit.field_delete_modal.confirm": "Bạn có chắc muốn xóa trường này? Hành động này không thể hoàn tác.", "account_edit.field_delete_modal.delete_button": "Xóa", "account_edit.field_delete_modal.title": "Xóa trường tùy chỉnh?", "account_edit.field_edit_modal.add_title": "Thêm trường tùy chỉnh", + "account_edit.field_edit_modal.discard_confirm": "Loại bỏ", + "account_edit.field_edit_modal.discard_message": "Bạn có các thay đổi chưa được lưu. Bạn có muốn loại bỏ chúng?", "account_edit.field_edit_modal.edit_title": "Sửa trường tùy chỉnh", - "account_edit.field_edit_modal.limit_header": "Đã vượt giới hạn ký tự đề xuất", - "account_edit.field_edit_modal.limit_message": "Người dùng di động sẽ không thể thấy đầy đủ trường.", + "account_edit.field_edit_modal.length_warning": "Vượt quá giới hạn ký tự. Người dùng điện thoại sẽ không thể thấy đầy đủ.", "account_edit.field_edit_modal.link_emoji_warning": "Không nên dùng emoji tùy chỉnh với url. Trường tùy chỉnh chứa cả hai sẽ chỉ hiển thị văn bản, để ngăn chặn việc bối rối.", "account_edit.field_edit_modal.name_hint": "Vd: “Website cá nhân”", "account_edit.field_edit_modal.name_label": "Nhãn", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "Sửa văn bản thay thế", "account_edit.image_edit.remove_button": "Gỡ ảnh", "account_edit.image_edit.replace_button": "Thay thế ảnh", + "account_edit.item_list.delete": "Xóa {name}", + "account_edit.item_list.edit": "Sửa {name}", "account_edit.name_modal.add_title": "Thêm tên gọi", "account_edit.name_modal.edit_title": "Sửa tên gọi", "account_edit.profile_tab.button_label": "Tùy chỉnh", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "Hiện tab ‘Phương tiện’", "account_edit.profile_tab.show_media_replies.description": "Nếu bật, tab Phương tiện sẽ hiện cả những tút của bạn lẫn những trả lời tới tút của người khác.", "account_edit.profile_tab.show_media_replies.title": "Bao gồm tút dạng trả lời trong tab ‘Phương tiện’", - "account_edit.profile_tab.subtitle": "Tùy chỉnh tab trên hồ sơ của bạn và những gì chúng hiển thị.", - "account_edit.profile_tab.title": "Thiết lập tab hồ sơ", "account_edit.save": "Lưu", "account_edit.upload_modal.back": "Quay lại", "account_edit.upload_modal.done": "Xong", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "Thả để tải lên", "account_edit.upload_modal.step_upload.header": "Chọn ảnh", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF hoặc JPG, tối đa {limit}MB.{br}Sẽ bị thu xuống {width}x{height}px.", - "account_edit.upload_modal.title_add": "Thêm ảnh đại diện", - "account_edit.upload_modal.title_replace": "Thay thế ảnh đại diện", + "account_edit.upload_modal.title_add.avatar": "Thêm ảnh đại diện", + "account_edit.upload_modal.title_add.header": "Thêm ảnh bìa", + "account_edit.upload_modal.title_replace.avatar": "Thay thế ảnh đại diện", + "account_edit.upload_modal.title_replace.header": "Thay thế ảnh bìa", "account_edit.verified_modal.details": "Tăng độ tin cậy cho hồ sơ Mastodon của bạn bằng cách xác minh liên kết đến trang web cá nhân. Cách thức thực hiện như sau:", "account_edit.verified_modal.invisible_link.details": "Thêm liên kết trên header của trang. Quan trọng là rel=\"me\" giúp ngăn chặn việc mạo danh trên các trang web có nội dung do người dùng tạo. Bạn cũng có thể sử dụng một thẻ link thay vì {tag}, nhưng HTML phải có thể truy cập được mà không cần thực thi JavaScript.", "account_edit.verified_modal.invisible_link.summary": "Làm thế nào để ẩn liên kết?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "Thêm trang web của bạn dưới dạng trường tùy chỉnh", "account_edit.verified_modal.title": "Làm thế nào để thêm liên kết xác minh", "account_edit_tags.add_tag": "Thêm #{tagName}", - "account_edit_tags.column_title": "Sửa hashtag thường dùng", + "account_edit_tags.column_title": "Sửa nhãn", "account_edit_tags.help_text": "Hashtag thường dùng giúp bạn mọi người khám phá và tương tác với hồ sơ của bạn. Chúng xuất hiện như những bộ lọc trên phần Hoạt động hồ sơ.", + "account_edit_tags.max_tags_reached": "Bạn đã đạt số lượng hashtag thường dùng tối đa.", "account_edit_tags.search_placeholder": "Nhập một hashtag…", "account_edit_tags.suggestions": "Được đề xuất:", "account_edit_tags.tag_status_count": "{count, plural, other {# tút}}", + "account_list.total": "{total, plural, other {# tài khoản}}", "account_note.placeholder": "Nhấn để thêm", "admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày", "admin.dashboard.monthly_retention": "Tỉ lệ người dùng ở lại sau khi đăng ký", @@ -338,7 +356,7 @@ "closed_registrations_modal.find_another_server": "Tìm máy chủ khác", "closed_registrations_modal.preamble": "Mastodon liên hợp nên bất kể bạn tạo tài khoản ở đâu, bạn cũng sẽ có thể theo dõi và tương tác với tài khoản trên máy chủ này. Bạn thậm chí có thể tự mở máy chủ!", "closed_registrations_modal.title": "Đăng ký Mastodon", - "collection.share_modal.share_link_label": "Liên kết mời chia sẻ", + "collection.share_modal.share_link_label": "Chia sẻ liên kết", "collection.share_modal.share_via_post": "Đăng lên Mastodon", "collection.share_modal.share_via_system": "Chia sẻ qua…", "collection.share_modal.title": "Chia sẻ gói khởi đầu", @@ -346,8 +364,11 @@ "collection.share_template_other": "Xem ngay gói khởi đầu tuyệt vời này: {link}", "collection.share_template_own": "Xem ngay gói khởi đầu mới của tôi: {link}", "collections.account_count": "{count, plural, other {# tài khoản}}", - "collections.accounts.empty_description": "Thêm tối đa {count} tài khoản mà bạn theo dõi", + "collections.accounts.empty_description": "Thêm tối đa {count} tài khoản", + "collections.accounts.empty_editor_title": "Chưa có ai trong gói khởi đầu này", "collections.accounts.empty_title": "Gói khởi đầu này trống", + "collections.block_collection_owner": "Chặn tài khoản", + "collections.by_account": "bởi {account_handle}", "collections.collection_description": "Mô tả", "collections.collection_language": "Ngôn ngữ", "collections.collection_language_none": "Không", @@ -356,47 +377,56 @@ "collections.confirm_account_removal": "Bạn có chắc muốn gỡ tài khoản này khỏi gói khởi đầu?", "collections.content_warning": "Nội dung ẩn", "collections.continue": "Tiếp tục", - "collections.create.accounts_subtitle": "Chỉ những tài khoản bạn theo dõi và đã chọn khám phá mới có thể được thêm vào.", + "collections.copy_link": "Sao chép liên kết", + "collections.copy_link_confirmation": "Sao chép liên kết tài khoản vào clipboard", "collections.create.accounts_title": "Bạn sẽ chọn ai để giới thiệu trong gói khởi đầu này?", "collections.create.basic_details_title": "Thông tin cơ bản", "collections.create.steps": "Bước {step}/{total}", - "collections.create_a_collection_hint": "Tạo một gói khởi đầu để giới thiệu hoặc chia sẻ những tài khoản yêu thích của bạn với người khác.", "collections.create_collection": "Tạo gói khởi đầu", "collections.delete_collection": "Xóa gói khởi đầu", "collections.description_length_hint": "Giới hạn 100 ký tự", - "collections.detail.accept_inclusion": "Okay", - "collections.detail.accounts_heading": "Tài khoản", - "collections.detail.author_added_you": "{author} đã thêm bạn vào gói khởi đầu này", - "collections.detail.curated_by_author": "Tuyển chọn bởi {author}", - "collections.detail.curated_by_you": "Tuyển chọn bởi bạn", + "collections.detail.author_added_you_on_date": "{author} đã thêm bạn vào {date}", "collections.detail.loading": "Đang tải gói khởi đầu…", - "collections.detail.other_accounts_in_collection": "Những người khác trong gói khởi đầu này:", "collections.detail.revoke_inclusion": "Xóa tôi", + "collections.detail.sensitive_content": "Nội dung nhạy cảm", "collections.detail.sensitive_note": "Gói khởi đầu này chứa các tài khoản và nội dung có thể nhạy cảm đối với một số người.", "collections.detail.share": "Chia sẻ gói khởi đầu này", + "collections.detail.you_are_in_this_collection": "Bạn đã được thêm vào gói khởi đầu này", "collections.edit_details": "Sửa chi tiết", - "collections.error_loading_collections": "Đã xảy ra lỗi khi tải những gói khởi đầu của bạn.", - "collections.hints.accounts_counter": "{count} / {max} tài khoản", + "collections.error_loading_collections": "Đã xảy ra lỗi khi tải những gói khởi đầu này.", + "collections.hidden_accounts_description": "Bạn vừa chặn hoặc phớt lờ {count, plural, other {tài khoản này}}", + "collections.hidden_accounts_link": "{count, plural, other {# tài khoản đã ẩn}}", + "collections.hints.accounts_counter": "{count}/{max} tài khoản", "collections.last_updated_at": "Lần cuối cập nhật: {date}", + "collections.list.collections_with_count": "{count, plural, other {# Gói khởi đầu}}", + "collections.list.created_by_author": "Tạo bởi {name}", + "collections.list.created_by_you": "Được tạo bởi bạn", + "collections.list.featuring_you": "Có mặt bạn", "collections.manage_accounts": "Quản lý tài khoản", "collections.mark_as_sensitive": "Đánh dấu nhạy cảm", "collections.mark_as_sensitive_hint": "Ẩn phần mô tả và các tài khoản của gói khởi đầu phía sau cảnh báo nội dung. Tên gói khởi đầu vẫn hiển thị.", + "collections.maximum_collection_count_description": "Máy chủ của bạn cho phép tạo tối đa {count} gói khởi đầu.", + "collections.maximum_collection_count_reached": "Bạn đã đạt đến số lượng gói khởi đầu tối đa", "collections.name_length_hint": "Giới hạn 40 ký tự", "collections.new_collection": "Gói khởi đầu mới", - "collections.no_collections_yet": "Chưa có gói khởi đầu.", - "collections.old_last_post_note": "Đăng lần cuối hơn một tuần trước", - "collections.remove_account": "Gỡ tài khoản này", + "collections.remove_account": "Gỡ", "collections.report_collection": "Báo cáo gói khởi đầu này", "collections.revoke_collection_inclusion": "Xóa tôi khỏi gói khởi đầu này", "collections.revoke_inclusion.confirmation": "Bạn đã được gỡ khỏi \"{collection}\"", "collections.revoke_inclusion.error": "Đã có lỗi, xin vui lòng thử lại.", - "collections.search_accounts_label": "Tìm tài khoản để thêm…", + "collections.search_accounts_label": "Tìm tài khoản để thêm", "collections.search_accounts_max_reached": "Bạn đã đạt đến số lượng tài khoản tối đa", "collections.sensitive": "Nhạy cảm", + "collections.share_short": "Chia sẻ", + "collections.suggestions.can_not_add": "Không thể thêm", + "collections.suggestions.can_not_add_desc": "Những tài khoản này không muốn khám phá, hoặc họ ở trên máy chủ chưa hỗ trợ gói khởi đầu.", + "collections.suggestions.must_follow": "Cần theo dõi trước", + "collections.suggestions.must_follow_desc": "Những tài khoản này phê duyệt yêu cầu theo dõi. Người theo dõi mới có thể thêm họ vào gói khởi đầu.", "collections.topic_hint": "Thêm hashtag giúp người khác hiểu chủ đề chính của gói khởi đầu này.", "collections.topic_special_chars_hint": "Những ký tự đặc biệt sẽ bị xóa khi lưu", + "collections.unlisted_collections_description": "Những thông tin này sẽ không hiển thị trên hồ sơ của bạn. Bất cứ ai có liên kết đều có thể tìm thấy chúng.", + "collections.unlisted_collections_with_count": "Gói khởi đầu hạn chế ({count})", "collections.view_collection": "Xem gói khởi đầu", - "collections.view_other_collections_by_user": "Xem những gói khởi đầu khác từ tài khoản này", "collections.visibility_public": "Công khai", "collections.visibility_public_hint": "Có thể tìm thấy trong kết quả tìm kiếm và các khu vực khác nơi xuất hiện đề xuất.", "collections.visibility_title": "Hiển thị", @@ -405,7 +435,6 @@ "column.about": "Giới thiệu", "column.blocks": "Tài khoản đã chặn", "column.bookmarks": "Những tút đã lưu", - "column.collections": "Những gói khởi đầu của tôi", "column.community": "Máy chủ này", "column.create_list": "Tạo danh sách", "column.direct": "Nhắn riêng", @@ -422,8 +451,10 @@ "column.lists": "Danh sách", "column.mutes": "Tài khoản đã phớt lờ", "column.notifications": "Thông báo", + "column.other_collections": "Gói khởi đầu bởi {name}", "column.pins": "Tút ghim", "column.public": "Liên hợp", + "column.your_collections": "Gói khởi đầu của bạn", "column_back_button.label": "Quay lại", "column_header.hide_settings": "Ẩn bộ lọc", "column_header.moveLeft_settings": "Dời cột sang bên trái", @@ -449,7 +480,7 @@ "compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm", "compose_form.encryption_warning": "Các tút trên Mastodon không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào qua Mastodon.", "compose_form.hashtag_warning": "Tút này sẽ không xuất hiện công khai. Chỉ những tút công khai mới có thể được tìm kiếm thông qua hashtag.", - "compose_form.lock_disclaimer": "Tài khoản của bạn không {locked}. Bất cứ ai cũng có thể theo dõi và xem tút chỉ dành cho người theo dõi bạn.", + "compose_form.lock_disclaimer": "Tài khoản của bạn không {locked}. Bất kỳ ai cũng có thể theo dõi và xem tút chỉ dành cho người theo dõi bạn.", "compose_form.lock_disclaimer.lock": "khóa", "compose_form.placeholder": "Bạn đang nghĩ gì?", "compose_form.poll.duration": "Hết hạn sau", @@ -485,12 +516,13 @@ "confirmations.discard_draft.post.title": "Bỏ tút đang soạn?", "confirmations.discard_edit_media.confirm": "Bỏ qua", "confirmations.discard_edit_media.message": "Bạn chưa lưu thay đổi của phần mô tả hoặc bản xem trước của media, vẫn bỏ qua?", - "confirmations.follow_to_collection.confirm": "Theo dõi & thêm vào gói khởi đầu", - "confirmations.follow_to_collection.message": "Bạn cần theo dõi {name} trước khi thêm họ vào gói khởi đầu.", - "confirmations.follow_to_collection.title": "Theo dõi tài khoản?", "confirmations.follow_to_list.confirm": "Theo dõi & thêm vào danh sách", "confirmations.follow_to_list.message": "Bạn cần theo dõi {name} trước khi thêm họ vào danh sách.", "confirmations.follow_to_list.title": "Theo dõi tài khoản?", + "confirmations.hide_featured_tab.confirm": "Ẩn tab", + "confirmations.hide_featured_tab.intro": "Bạn có thể thay đổi bất kỳ lúc nào trong Sửa hồ sơ > Thiết lập Tab hồ sơ.", + "confirmations.hide_featured_tab.message": "Việc này khiến ẩn tab cho tài khoản trên {serverName} và những máy chủ Mastodon khác. Kiểu hiển thị có thể khác nhau.", + "confirmations.hide_featured_tab.title": "Ẩn tab \"Nêu bật\"?", "confirmations.logout.confirm": "Đăng xuất", "confirmations.logout.message": "Bạn có chắc muốn thoát?", "confirmations.logout.title": "Đăng xuất", @@ -529,6 +561,7 @@ "content_warning.hide": "Thu gọn", "content_warning.show": "Vẫn xem", "content_warning.show_more": "Mở rộng", + "content_warning.show_short": "Hiện", "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", @@ -569,6 +602,14 @@ "domain_pill.your_server": "Nơi lưu trữ tút của bạn. Không thích ở đây? Chuyển sang máy chủ khác và giữ nguyên người theo dõi của bạn.", "domain_pill.your_username": "Chỉ riêng bạn trên máy chủ này. Những máy chủ khác có thể cũng có tên người dùng giống vậy.", "dropdown.empty": "Chọn một lựa chọn", + "email_subscriptions.email": "Email", + "email_subscriptions.form.action": "Đăng ký", + "email_subscriptions.form.bottom": "Nhận tút được gửi đến hộp thư đến mà không cần tài khoản Mastodon. Hủy nhận bất cứ lúc nào. Xem thêm chi tiết tại Chính sách bảo mật.", + "email_subscriptions.form.title": "Đăng ký nhận cập nhật qua email từ {name}", + "email_subscriptions.submitted.lead": "Kiểm tra hộp thư đến của bạn để tìm email hoàn tất đăng ký nhận thông báo qua email.", + "email_subscriptions.submitted.title": "Một bước nữa", + "email_subscriptions.validation.email.blocked": "Dịch vụ email đã bị chặn", + "email_subscriptions.validation.email.invalid": "Địa chỉ email không hợp lệ", "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.", "embed.preview": "Nó sẽ hiển thị như vầy:", "emoji_button.activity": "Hoạt động", @@ -586,15 +627,21 @@ "emoji_button.search_results": "Kết quả tìm kiếm", "emoji_button.symbols": "Biểu tượng", "emoji_button.travel": "Du lịch", - "empty_column.account_featured.me": "Bạn chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag thường dùng và hồ sơ của bạn bè trên trang cá nhân của mình không?", - "empty_column.account_featured.other": "{acct} chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag thường dùng và hồ sơ của bạn bè trên trang cá nhân của mình không?", - "empty_column.account_featured_other.unknown": "Tài khoản này chưa nêu bật gì.", + "empty_column.account_featured.other": "{acct} chưa nêu bật gì.", + "empty_column.account_featured_self.no_collections_button": "Tạo một gói khởi đầu", + "empty_column.account_featured_self.no_collections_hide_tab": "Ẩn tab này", + "empty_column.account_featured_self.pre_collections": "Hãy đón chờ Gói khởi đầu", + "empty_column.account_featured_self.pre_collections_desc": "Gói khởi đầu (sẽ có trong Mastodon 4.6) cho phép bạn tạo danh sách các tài khoản được tuyển chọn để giới thiệu cho người khác.", + "empty_column.account_featured_self.showcase_accounts": "Hiện những tài khoản yêu thích của bạn", + "empty_column.account_featured_self.showcase_accounts_desc": "Gói khởi đầu là những danh sách chứa những tài khoản tuyển chọn để giúp khám phá mọi người trên Fediverse.", + "empty_column.account_featured_unknown.other": "Tài khoản này chưa nêu bật gì.", "empty_column.account_hides_collections": "Tài khoản này đã chọn ẩn thông tin", "empty_column.account_suspended": "Tài khoản vô hiệu hóa", "empty_column.account_timeline": "Chưa có tút nào!", "empty_column.account_unavailable": "Tài khoản bị đình chỉ", - "empty_column.blocks": "Bạn chưa chặn bất cứ ai.", + "empty_column.blocks": "Bạn chưa chặn ai.", "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.", + "empty_column.collections.featured_in": "Bạn chưa được thêm vào gói khởi đầu nào.", "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!", "empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.", "empty_column.disabled_feed": "Bảng tin này bị vô hiệu hóa bởi quản trị viên máy chủ của bạn.", @@ -630,7 +677,7 @@ "featured_tags.more_items": "+{count}", "featured_tags.suggestions": "Gần đây bạn đã đăng về {items}. Thêm cái này vào hashtag thường dùng?", "featured_tags.suggestions.add": "Thêm", - "featured_tags.suggestions.added": "Quản lý hashtag bạn thường dùng vào bất cứ lúc nào tại Sửa hồ sơ > Hashtag thường dùng.", + "featured_tags.suggestions.added": "Quản lý hashtag bạn thường dùng vào bất kỳ lúc nào tại Sửa hồ sơ > Hashtag thường dùng.", "featured_tags.suggestions.dismiss": "Không, cảm ơn", "filter_modal.added.context_mismatch_explanation": "Danh mục bộ lọc này không áp dụng cho ngữ cảnh mà bạn đã truy cập tút này. Nếu bạn muốn tút cũng được lọc trong ngữ cảnh này, bạn sẽ phải chỉnh sửa bộ lọc.", "filter_modal.added.context_mismatch_title": "Bối cảnh không phù hợp!", @@ -672,9 +719,11 @@ "follow_suggestions.similar_to_recently_followed_longer": "Tương tự những tài khoản mà bạn theo dõi gần đây", "follow_suggestions.view_all": "Xem tất cả", "follow_suggestions.who_to_follow": "Gợi ý theo dõi", - "followed_tags": "Hashtag theo dõi", + "followed_tags": "Những hashtag đã theo dõi", "followers.hide_other_followers": "Tài khoản này đã ẩn người theo dõi của họ", + "followers.title": "Đang theo dõi {name}", "following.hide_other_following": "Tài khoản này đã ẩn người mà họ theo dõi", + "following.title": "Theo dõi bởi {name}", "footer.about": "Giới thiệu", "footer.about_mastodon": "Về Mastodon", "footer.about_server": "Về {domain}", @@ -686,6 +735,7 @@ "footer.source_code": "Mã nguồn", "footer.status": "Trạng thái", "footer.terms_of_service": "Điều khoản dịch vụ", + "form_error.blank": "Không thể để trống trường.", "form_field.optional": "(tùy chọn)", "generic.saved": "Đã lưu", "getting_started.heading": "Quản lý", @@ -777,7 +827,7 @@ "keyboard_shortcuts.reply": "trả lời", "keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi", "keyboard_shortcuts.search": "mở tìm kiếm", - "keyboard_shortcuts.spoilers": "hiện/ẩn nội dung nhạy cảm", + "keyboard_shortcuts.spoilers": "ẩn/hiện nội dung nhạy cảm", "keyboard_shortcuts.start": "mở \"Dành cho người mới\"", "keyboard_shortcuts.toggle_hidden": "ẩn/hiện nội dung ẩn", "keyboard_shortcuts.toggle_sensitivity": "ẩn/hiện ảnh hoặc video", @@ -840,16 +890,16 @@ "navigation_bar.account_settings": "Bảo mật", "navigation_bar.administration": "Quản trị", "navigation_bar.advanced_interface": "Dùng bố cục nhiều cột", - "navigation_bar.automated_deletion": "Tự động xóa tút cũ", + "navigation_bar.automated_deletion": "Xóa tút cũ tự động", "navigation_bar.blocks": "Tài khoản đã chặn", - "navigation_bar.bookmarks": "Tút lưu", + "navigation_bar.bookmarks": "Tút đã lưu", "navigation_bar.collections": "Gói khởi đầu", "navigation_bar.direct": "Nhắn riêng", "navigation_bar.domain_blocks": "Máy chủ đã ẩn", - "navigation_bar.favourites": "Tút thích", + "navigation_bar.favourites": "Tút đã thích", "navigation_bar.filters": "Từ khóa đã lọc", "navigation_bar.follow_requests": "Yêu cầu theo dõi", - "navigation_bar.followed_tags": "Hashtag theo dõi", + "navigation_bar.followed_tags": "Hashtag", "navigation_bar.follows_and_followers": "Quan hệ", "navigation_bar.import_export": "Nhập và xuất", "navigation_bar.lists": "Danh sách", @@ -869,6 +919,7 @@ "navigation_panel.expand_followed_tags": "Mở rộng menu hashtag theo dõi", "navigation_panel.expand_lists": "Mở rộng menu danh sách", "not_signed_in_indicator.not_signed_in": "Bạn cần đăng nhập để truy cập mục này.", + "notification.added_to_collection": "{name} đã thêm bạn vào một gói khởi đầu", "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}", @@ -878,6 +929,7 @@ "notification.admin.sign_up.name_and_others": "{name} và {count, plural, other {# người}} đã đăng ký", "notification.annual_report.message": "#Wrapstodon {year} của bạn có rồi đây! Hãy chia sẻ những điểm nhấn và khoảnh khắc đáng nhớ trên Mastodon của bạn trong năm qua!", "notification.annual_report.view": "Xem #Wrapstodon", + "notification.collection_update": "{name} đã chỉnh sửa một gói khởi đầu có bạn", "notification.favourite": "{name} đã thích tút của bạn", "notification.favourite.name_and_others_with_link": "{name} và {count, plural, other {# người khác}} đã thích tút của bạn", "notification.favourite_pm": "{name} đã thích nhắn riêng từ bạn", @@ -1022,13 +1074,13 @@ "privacy.direct.short": "Nhắn riêng", "privacy.private.long": "Chỉ người theo dõi", "privacy.private.short": "Người theo dõi", - "privacy.public.long": "Bất cứ ai", + "privacy.public.long": "Bất kỳ ai", "privacy.public.short": "Công khai", "privacy.quote.anyone": "{visibility}, cho phép trích dẫn", "privacy.quote.disabled": "{visibility}, tắt trích dẫn", "privacy.quote.limited": "{visibility}, hạn chế trích dẫn", "privacy.unlisted.additional": "Công khai, nhưng tút sẽ không hiện trong bảng tin, hashtag, khám phá hoặc tìm kiếm Mastodon, kể cả trong cài đặt tài khoản bạn chọn cho phép.", - "privacy.unlisted.long": "Ẩn khỏi kết quả tìm kiếm, xu hướng và dòng thời gian công khai của Mastodon", + "privacy.unlisted.long": "Ẩn khỏi kết quả tìm kiếm, xu hướng và bảng tin công khai", "privacy.unlisted.short": "Hạn chế", "privacy_policy.last_updated": "Cập nhật lần cuối {date}", "privacy_policy.title": "Chính sách bảo mật", @@ -1056,7 +1108,7 @@ "remove_quote_hint.button_label": "Đã hiểu", "remove_quote_hint.message": "Bạn cũng có thể làm trong menu tùy chọn {icon}", "remove_quote_hint.title": "Gỡ tút mà bạn đã trích dẫn?", - "reply_indicator.attachments": "{count, plural, other {# tập tin đính kèm}}", + "reply_indicator.attachments": "{count, plural, other {# đính kèm}}", "reply_indicator.cancel": "Hủy bỏ", "reply_indicator.poll": "Vốt", "report.block": "Chặn", @@ -1141,6 +1193,7 @@ "server_banner.active_users": "người hoạt động", "server_banner.administered_by": "Vận hành:", "server_banner.is_one_of_many": "{domain} là một trong nhiều máy chủ Mastodon độc lập mà bạn có thể sử dụng để tham gia vào Fediverse.", + "server_banner.more_about_this_server": "Về máy chủ này", "server_banner.server_stats": "Thống kê:", "sign_in_banner.create_account": "Đăng ký", "sign_in_banner.follow_anyone": "Theo dõi bất kỳ ai trên Fediverse và đọc tút theo thứ tự thời gian. Không thuật toán, quảng cáo hoặc clickbait.", @@ -1268,14 +1321,14 @@ "units.short.thousand": "{count}K", "upload_area.title": "Kéo và thả để tải lên", "upload_button.label": "Thêm media (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "Tập tin tải lên vượt quá giới hạn cho phép.", - "upload_error.poll": "Không cho phép đính kèm tập tin.", - "upload_error.quote": "Không cho phép đính kèm tập tin với trích dẫn.", - "upload_form.drag_and_drop.instructions": "Để chọn tập tin đính kèm, hãy nhấn phím cách hoặc phím Enter. Trong khi kéo, sử dụng các phím mũi tên để di chuyển tập tin đính kèm theo bất kỳ hướng nào. Nhấn phím cách hoặc phím Enter một lần nữa để thả tập tin đính kèm vào vị trí mới hoặc nhấn phím thoát để hủy.", - "upload_form.drag_and_drop.on_drag_cancel": "Kéo thả đã bị hủy bỏ. Tập tin đính kèm {item} bị bỏ qua.", - "upload_form.drag_and_drop.on_drag_end": "Tập tin đính kèm {item} bị bỏ qua.", - "upload_form.drag_and_drop.on_drag_over": "Tập tin đính kèm {item} đã bị dời.", - "upload_form.drag_and_drop.on_drag_start": "Đã chọn tập tin đính kèm {item}.", + "upload_error.limit": "Tệp tải lên vượt quá giới hạn cho phép.", + "upload_error.poll": "Không cho phép đính kèm tệp.", + "upload_error.quote": "Không cho phép đính kèm tệp với trích dẫn.", + "upload_form.drag_and_drop.instructions": "Để chọn tệp đính kèm, hãy nhấn phím cách hoặc phím Enter. Trong khi kéo, sử dụng các phím mũi tên để di chuyển tệp đính kèm theo bất kỳ hướng nào. Nhấn phím cách hoặc phím Enter một lần nữa để thả tệp đính kèm vào vị trí mới hoặc nhấn phím thoát để hủy.", + "upload_form.drag_and_drop.on_drag_cancel": "Kéo thả đã bị hủy bỏ. Tệp đính kèm {item} bị bỏ qua.", + "upload_form.drag_and_drop.on_drag_end": "Tệp đính kèm {item} bị bỏ qua.", + "upload_form.drag_and_drop.on_drag_over": "Tệp đính kèm {item} bị di chuyển.", + "upload_form.drag_and_drop.on_drag_start": "Đã chọn tệp đính kèm {item}.", "upload_form.edit": "Biên tập", "upload_progress.label": "Đang tải lên...", "upload_progress.processing": "Đang tải lên…", @@ -1308,6 +1361,6 @@ "visibility_modal.quote_followers": "Chỉ người theo dõi", "visibility_modal.quote_label": "Ai có thể trích dẫn", "visibility_modal.quote_nobody": "Chỉ tôi", - "visibility_modal.quote_public": "Bất cứ ai", + "visibility_modal.quote_public": "Bất kỳ ai", "visibility_modal.save": "Lưu" } diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index fa8e101fa01324..0d14451b497318 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -13,7 +13,6 @@ "account.mute": "ⵥⵥⵉⵥⵏ @{name}", "account.muted": "ⵉⵜⵜⵓⵥⵉⵥⵏ", "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", "account.share": "ⴱⴹⵓ ⵉⴼⵔⵙ ⵏ @{name}", "account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ", "account_note.placeholder": "Click to add a note", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index c49c882c29d635..a1b3b4eedabb56 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -28,12 +28,10 @@ "account.block_domain": "屏蔽 {domain} 实例", "account.block_short": "屏蔽", "account.blocked": "已屏蔽", - "account.blocking": "屏蔽中", "account.cancel_follow_request": "撤回关注请求", "account.copy": "复制个人资料链接", "account.direct": "私下提及 @{name}", "account.disable_notifications": "当 @{name} 发布嘟文时不要通知我", - "account.domain_blocking": "正在屏蔽中的域名", "account.edit_note": "编辑个人备注", "account.edit_profile": "修改个人资料", "account.edit_profile_short": "编辑", @@ -45,11 +43,9 @@ "account.featured": "精选", "account.featured.accounts": "个人资料", "account.featured.collections": "收藏列表", - "account.featured.hashtags": "话题", - "account.featured_tags.last_status_at": "上次发言于 {date}", - "account.featured_tags.last_status_never": "暂无嘟文", + "account.featured.new_collection": "新建收藏列表", "account.field_overflow": "显示完整内容", - "account.filters.all": "所有活动", + "account.filters.all": "全部活动", "account.filters.boosts_toggle": "显示转嘟", "account.filters.posts_boosts": "嘟文与转嘟", "account.filters.posts_only": "嘟文", @@ -73,40 +69,51 @@ "account.go_to_profile": "前往个人资料页", "account.hide_reblogs": "隐藏来自 @{name} 的转嘟", "account.in_memoriam": "谨此悼念。", + "account.join_modal.day": "天", + "account.join_modal.me": "你加入 {server} 的时间为", + "account.join_modal.me_anniversary": "加入 Mastodon 一周年快乐!你加入 {server} 的时间为", + "account.join_modal.me_today": "这是你加入 {server} 的第一天!", + "account.join_modal.other": "{name} 加入 {server} 的时间为", + "account.join_modal.other_today": "这是 {name} 加入 {server} 的第一天!", + "account.join_modal.share.celebrate": "分享纪念嘟文", + "account.join_modal.share.intro": "分享介绍嘟文", + "account.join_modal.share.welcome": "分享欢迎嘟文", + "account.join_modal.years": "{number, plural, other {年}}", "account.joined_short": "加入于", "account.languages": "更改订阅语言", + "account.last_active": "上次活跃", "account.link_verified_on": "此链接的所有权已在 {date} 检查", "account.locked_info": "此账号已锁嘟。账号所有人会手动审核新关注者。", "account.media": "媒体", "account.mention": "提及 @{name}", "account.menu.add_to_list": "添加到列表…", - "account.menu.block": "屏蔽账户", + "account.menu.block": "屏蔽账号", "account.menu.block_domain": "屏蔽 {domain}", - "account.menu.copied": "已复制账户链接到剪贴板", + "account.menu.copied": "已复制账号链接到剪贴板", "account.menu.copy": "复制链接", "account.menu.direct": "私下提及", "account.menu.hide_reblogs": "在时间线中隐藏转嘟", "account.menu.mention": "提及", - "account.menu.mute": "停止提醒账户", + "account.menu.mute": "停止提醒账号", "account.menu.note.description": "仅对你可见", "account.menu.open_original_page": "在 {domain} 上查看", "account.menu.remove_follower": "移除关注者", - "account.menu.report": "举报账户", + "account.menu.report": "举报账号", "account.menu.share": "分享…", "account.menu.show_reblogs": "在时间线中显示转嘟", - "account.menu.unblock": "取消屏蔽账户", + "account.menu.unblock": "取消屏蔽账号", "account.menu.unblock_domain": "取消屏蔽 {domain}", - "account.menu.unmute": "恢复提醒账户", + "account.menu.unmute": "恢复提醒账号", "account.moved_to": "{name} 的新账号是:", "account.mute": "隐藏 @{name}", "account.mute_notifications_short": "关闭通知", "account.mute_short": "隐藏", "account.muted": "已隐藏", - "account.muting": "正在静音", "account.mutual": "你们互相关注", + "account.name.copy": "复制用户名", "account.name.help.domain": "{domain} 是托管该用户个人资料及嘟文的服务器。", "account.name.help.domain_self": "{domain} 是托管你的个人资料及嘟文的服务器。", - "account.name.help.footer": "就像你可以用不同的电子邮件客户端向其他人发送同样的电子邮件一般,你也可以和其他 Mastodon 服务器上的用户互动,甚至还能和与 Mastodon 采用相同规则(即 ActivityPub 协议)的其他社交软件上的任何人互动。", + "account.name.help.footer": "就像你可以用不同的电子邮箱向其他人发送同样的电子邮件一般,你也可以和其他 Mastodon 服务器上的用户互动,甚至还能和与 Mastodon 兼容的其他社交软件上的任何人互动。", "account.name.help.header": "用户名类似电子邮件地址", "account.name.help.username": "{username} 是此账号在其服务器上的用户名。另一个服务器上的其他人可能拥有相同的用户名。", "account.name.help.username_self": "{username} 是你在此服务器上的用户名。另一个服务器上的其他人可能拥有相同的用户名。", @@ -121,17 +128,16 @@ "account.note.edit_button": "编辑", "account.note.title": "个人备注(仅对你可见)", "account.open_original_page": "打开原始页面", + "account.pending": "待定", "account.posts": "嘟文", - "account.posts_with_replies": "嘟文和回复", "account.remove_from_followers": "从关注者中移除 {name}", "account.report": "举报 @{name}", "account.requested_follow": "{name} 向你发送了关注请求", - "account.requests_to_follow_you": "请求关注你", "account.share": "分享 @{name} 的个人资料", "account.show_reblogs": "显示来自 @{name} 的转嘟", "account.statuses_counter": "{count, plural, other {{counter} 条嘟文}}", "account.timeline.pinned": "已置顶", - "account.timeline.pinned.view_all": "查看所有置顶嘟文", + "account.timeline.pinned.view_all": "查看全部置顶嘟文", "account.unblock": "取消屏蔽 @{name}", "account.unblock_domain": "取消屏蔽 {domain} 域名", "account.unblock_domain_short": "取消屏蔽", @@ -141,34 +147,42 @@ "account.unmute": "不再隐藏 @{name}", "account.unmute_notifications_short": "恢复通知", "account.unmute_short": "取消隐藏", + "account_edit.advanced_settings.bot_hint": "来自这个账号的绝大多数操作都是自动进行的,并且可能无人监控", + "account_edit.advanced_settings.bot_label": "机器人账号", + "account_edit.advanced_settings.title": "高级设置", + "account_edit.bio.add_label": "添加个人简介", + "account_edit.bio.edit_label": "编辑个人简介", "account_edit.bio.placeholder": "添加一段简短介绍,帮助其他人认识你。", "account_edit.bio.title": "简介", "account_edit.bio_modal.add_title": "添加个人简介", "account_edit.bio_modal.edit_title": "编辑个人简介", - "account_edit.button.add": "添加 {item}", - "account_edit.button.delete": "删除 {item}", - "account_edit.button.edit": "编辑 {item}", "account_edit.column_button": "完成", "account_edit.column_title": "修改个人资料", - "account_edit.custom_fields.name": "字段", + "account_edit.custom_fields.add_label": "添加字段", + "account_edit.custom_fields.edit_label": "编辑字段", "account_edit.custom_fields.placeholder": "添加你的人称代词、外部链接,或其他你想分享的内容。", "account_edit.custom_fields.reorder_button": "重新排序字段", "account_edit.custom_fields.tip_content": "通过验证任意你拥有网站的链接,你可以轻松增加 Mastodon 账号的可信度。", "account_edit.custom_fields.tip_title": "小贴士:添加已验证的链接", "account_edit.custom_fields.title": "自定义字段", "account_edit.custom_fields.verified_hint": "我如何添加已验证的链接?", + "account_edit.display_name.add_label": "添加显示名称", + "account_edit.display_name.edit_label": "编辑显示名称", "account_edit.display_name.placeholder": "你的显示名称是指你的名字在个人资料及时间线上出现时的样子。", "account_edit.display_name.title": "显示名称", - "account_edit.featured_hashtags.item": "话题标签", + "account_edit.featured_hashtags.edit_label": "添加话题标签", "account_edit.featured_hashtags.placeholder": "帮助其他人认识并快速访问你最喜欢的话题。", "account_edit.featured_hashtags.title": "精选话题标签", + "account_edit.field_actions.delete": "删除字段", + "account_edit.field_actions.edit": "编辑字段", "account_edit.field_delete_modal.confirm": "你确定要删除此自定义字段吗?此操作无法撤消。", "account_edit.field_delete_modal.delete_button": "删除", "account_edit.field_delete_modal.title": "删除自定义字段?", "account_edit.field_edit_modal.add_title": "添加自定义字段", + "account_edit.field_edit_modal.discard_confirm": "丢弃", + "account_edit.field_edit_modal.discard_message": "你有尚未保存的更改。确定要丢弃这些更改吗?", "account_edit.field_edit_modal.edit_title": "编辑自定义字段", - "account_edit.field_edit_modal.limit_header": "已超过建议字数限制", - "account_edit.field_edit_modal.limit_message": "移动端用户可能无法完整看见字段内容。", + "account_edit.field_edit_modal.length_warning": "已超过建议字数限制。移动端用户可能无法完整看见字段内容。", "account_edit.field_edit_modal.link_emoji_warning": "我们建议不要同时使用自定义表情和网址。同时包含两者的自定义字段将会显示为纯文本而不是链接形式,以避免用户混淆。", "account_edit.field_edit_modal.name_hint": "例如:“个人网站”", "account_edit.field_edit_modal.name_label": "标签", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "编辑替代文本", "account_edit.image_edit.remove_button": "移除图片", "account_edit.image_edit.replace_button": "替换图片", + "account_edit.item_list.delete": "删除 {name}", + "account_edit.item_list.edit": "编辑 {name}", "account_edit.name_modal.add_title": "添加显示名称", "account_edit.name_modal.edit_title": "编辑显示名称", "account_edit.profile_tab.button_label": "自定义", @@ -208,8 +224,10 @@ "account_edit.profile_tab.show_media.title": "显示“媒体”选项卡", "account_edit.profile_tab.show_media_replies.description": "如果启用,媒体选项卡将同时显示你的嘟文及你对其他人嘟文的回复。", "account_edit.profile_tab.show_media_replies.title": "在“媒体”选项卡中包括回复", - "account_edit.profile_tab.subtitle": "自定义你个人资料的标签页及其显示的内容。", - "account_edit.profile_tab.title": "个人资料标签页设置", + "account_edit.profile_tab.show_relations.description": "在个人资料中向其他人显示你关注的账号及关注你的账号。无论设置为是否,其他用户总是可以看到你是否关注了他。", + "account_edit.profile_tab.show_relations.title": "公开“关注者”与“我关注的”", + "account_edit.profile_tab.subtitle": "自定义你个人资料的显示方式。", + "account_edit.profile_tab.title": "个人资料显示设置", "account_edit.save": "保存", "account_edit.upload_modal.back": "上一步", "account_edit.upload_modal.done": "完成", @@ -219,8 +237,10 @@ "account_edit.upload_modal.step_upload.dragging": "将文件拖放到此处开始上传", "account_edit.upload_modal.step_upload.header": "选择图片", "account_edit.upload_modal.step_upload.hint": "支持 WEBP、PNG、GIF 或 JPG 格式,最大 {limit} MB。{br}图片将被缩放至 {width}×{height}px。", - "account_edit.upload_modal.title_add": "添加头像", - "account_edit.upload_modal.title_replace": "替换头像", + "account_edit.upload_modal.title_add.avatar": "添加头像", + "account_edit.upload_modal.title_add.header": "添加封面图", + "account_edit.upload_modal.title_replace.avatar": "替换头像", + "account_edit.upload_modal.title_replace.header": "替换封面图", "account_edit.verified_modal.details": "要增加 Mastodon 个人资料的可信度,可以验证指向个人网站的链接。运作方式如下:", "account_edit.verified_modal.invisible_link.details": "将链接添加到标头(header)中。其中很重要的部分是 rel=\"me\",可以防止他人通过用户生成内容模仿。你甚至可以在页面标头中使用 link 标签而不是 {tag},但包含该部分的 HTML 必须在没有 JavaScript 执行环境下访问时依然存在。", "account_edit.verified_modal.invisible_link.summary": "如何隐藏此链接?", @@ -229,11 +249,14 @@ "account_edit.verified_modal.step2.header": "将你的网站添加到自定义字段", "account_edit.verified_modal.title": "如何添加已验证的链接", "account_edit_tags.add_tag": "添加 #{tagName}", - "account_edit_tags.column_title": "编辑精选话题标签", + "account_edit_tags.column_title": "编辑标签​​​​​", "account_edit_tags.help_text": "精选话题标签可以帮助他人发现并与你的个人资料互动。这些标签会作为过滤器条件出现在你个人资料页面的活动视图中。", + "account_edit_tags.max_tags_reached": "你已达到精选话题标签数量的上限。", "account_edit_tags.search_placeholder": "输入话题标签…", "account_edit_tags.suggestions": "建议:", "account_edit_tags.tag_status_count": "{count, plural, other {# 条嘟文}}", + "account_list.hidden_notice": "此内容仅对你可见。要让此列表对其他人可见,请前往{page} > {modal} > {field}。", + "account_list.total": "{total, plural, other {# 个账号}}", "account_note.placeholder": "点击添加备注", "admin.dashboard.daily_retention": "注册后用户留存率(按日计算)", "admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)", @@ -346,8 +369,11 @@ "collection.share_template_other": "发现了个收藏列表,来看看:{link}", "collection.share_template_own": "我的新收藏列表,来看看:{link}", "collections.account_count": "{count, plural, other {# 个账号}}", - "collections.accounts.empty_description": "添加你关注的账号,最多 {count} 个", + "collections.accounts.empty_description": "添加最多 {count} 个账号", + "collections.accounts.empty_editor_title": "此收藏列表中暂无用户", "collections.accounts.empty_title": "收藏列表为空", + "collections.block_collection_owner": "屏蔽账号", + "collections.by_account": "由 {account_handle}", "collections.collection_description": "说明", "collections.collection_language": "语言", "collections.collection_language_none": "无", @@ -356,47 +382,58 @@ "collections.confirm_account_removal": "你确定要将从收藏列表中移除此账号吗?", "collections.content_warning": "内容警告", "collections.continue": "继续", - "collections.create.accounts_subtitle": "只有你关注的且已经主动加入发现功能的账号可以添加。", + "collections.copy_link": "复制链接", + "collections.copy_link_confirmation": "已复制收藏列表链接到剪贴板", "collections.create.accounts_title": "你想在收藏列表中添加哪些人?", "collections.create.basic_details_title": "基本信息", "collections.create.steps": "第 {step} 步(共 {total} 步)", - "collections.create_a_collection_hint": "创建用于向其他人推荐或分享你最喜欢账号的收藏列表。", "collections.create_collection": "创建收藏列表", "collections.delete_collection": "删除收藏列表", "collections.description_length_hint": "100字限制", - "collections.detail.accept_inclusion": "确定", - "collections.detail.accounts_heading": "账号", - "collections.detail.author_added_you": "{author} 将你添加到了此收藏列表", - "collections.detail.curated_by_author": "由 {author} 精心挑选", - "collections.detail.curated_by_you": "由你精心挑选", + "collections.detail.author_added_you_on_date": "{author} 于 {date} 将你加入", "collections.detail.loading": "正在加载收藏列表…", - "collections.detail.other_accounts_in_collection": "此收藏列表中的其他人:", "collections.detail.revoke_inclusion": "移除我", + "collections.detail.sensitive_content": "敏感内容", "collections.detail.sensitive_note": "此收藏列表可能包含某些对部分用户而言为敏感内容的账号或内容。", "collections.detail.share": "分享此收藏列表", + "collections.detail.you_are_in_this_collection": "你被添加到了此收藏列表", "collections.edit_details": "编辑详情", - "collections.error_loading_collections": "加载你的收藏列表时发生错误。", - "collections.hints.accounts_counter": "{count} / {max} 个账号", + "collections.error_loading_collections": "加载收藏列表时发生错误。", + "collections.hidden_accounts_description": "你已屏蔽或隐藏{count, plural, other {部分用户}}", + "collections.hidden_accounts_link": "{count, plural, other {# 个隐藏账号}}", + "collections.hints.accounts_counter": "{count}/{max} 个账号", "collections.last_updated_at": "最后更新:{date}", - "collections.manage_accounts": "管理账户", + "collections.list.collections_with_count": "{count, plural, other {# 个收藏列表}}", + "collections.list.created_by_author": "由 {name} 创建", + "collections.list.created_by_you": "由你创建", + "collections.list.featuring_you": "精选了你", + "collections.manage_accounts": "管理账号", "collections.mark_as_sensitive": "标记为敏感内容", "collections.mark_as_sensitive_hint": "将此收藏列表的说明用内容警告隐藏。此收藏列表的名称仍将可见。", + "collections.maximum_collection_count_description": "你的服务器最多只支持创建 {count} 个收藏列表。", + "collections.maximum_collection_count_reached": "你创建的收藏列表数量已达上限", "collections.name_length_hint": "40 字限制", "collections.new_collection": "新建收藏列表", - "collections.no_collections_yet": "尚无收藏列表。", - "collections.old_last_post_note": "上次发言于一周多以前", - "collections.remove_account": "移除此账号", + "collections.pending_accounts.message": "如果系统正在等待来自用户或其服务器的回应,则相应账号会显示为待定状态。只有你可以看见待定账号。", + "collections.pending_accounts.title": "为什么我会看到待定账号?", + "collections.remove_account": "移除", "collections.report_collection": "举报此收藏列表", "collections.revoke_collection_inclusion": "将自己从此收藏列表中移除", "collections.revoke_inclusion.confirmation": "你已被从“{collection}”中移除", "collections.revoke_inclusion.error": "出现错误,请稍后重试。", - "collections.search_accounts_label": "搜索要添加的账号…", + "collections.search_accounts_label": "搜索要添加的账号", "collections.search_accounts_max_reached": "你添加的账号数量已达上限", "collections.sensitive": "敏感内容", + "collections.share_short": "分享", + "collections.suggestions.can_not_add": "无法添加", + "collections.suggestions.can_not_add_desc": "这些账号可能已主动选择不可被发现,或是他们所在的服务器尚不支持收藏列表。", + "collections.suggestions.must_follow": "必须先关注", + "collections.suggestions.must_follow_desc": "这些账号会主动审核所有的关注请求。仅关注者可以将他们加入收藏列表。", "collections.topic_hint": "添加话题标签,帮助他人了解此收藏列表的主题。", "collections.topic_special_chars_hint": "保存时将自动移除特殊字符", + "collections.unlisted_collections_description": "这些收藏列表在他人查看时不会出现在你的个人资料上。任何知晓链接的人可以发现这些列表。", + "collections.unlisted_collections_with_count": "静默公开的收藏列表({count})", "collections.view_collection": "查看收藏列表", - "collections.view_other_collections_by_user": "查看此用户的其他收藏列表", "collections.visibility_public": "公开", "collections.visibility_public_hint": "可在搜索结果及其他推荐功能可用的区域被发现。", "collections.visibility_title": "可见性", @@ -405,7 +442,6 @@ "column.about": "关于", "column.blocks": "屏蔽的用户", "column.bookmarks": "书签", - "column.collections": "我的收藏列表", "column.community": "本站时间线", "column.create_list": "创建列表", "column.direct": "私下提及", @@ -422,8 +458,10 @@ "column.lists": "列表", "column.mutes": "已隐藏的用户", "column.notifications": "通知", + "column.other_collections": "{name} 的收藏列表", "column.pins": "置顶嘟文", "column.public": "跨站公共时间线", + "column.your_collections": "你的收藏列表", "column_back_button.label": "返回", "column_header.hide_settings": "隐藏设置", "column_header.moveLeft_settings": "将此栏左移", @@ -485,12 +523,13 @@ "confirmations.discard_draft.post.title": "丢弃你的嘟文草稿?", "confirmations.discard_edit_media.confirm": "丢弃", "confirmations.discard_edit_media.message": "你还有未保存的媒体描述或预览修改,仍要丢弃吗?", - "confirmations.follow_to_collection.confirm": "关注并添加到收藏列表", - "confirmations.follow_to_collection.message": "你需要先关注 {name},才能将其添加到收藏列表。", - "confirmations.follow_to_collection.title": "要关注账号吗?", "confirmations.follow_to_list.confirm": "关注并添加到列表", "confirmations.follow_to_list.message": "你需要先关注 {name},才能将其添加到列表。", "confirmations.follow_to_list.title": "确定要关注此用户?", + "confirmations.hide_featured_tab.confirm": "隐藏选项卡", + "confirmations.hide_featured_tab.intro": "你可以在修改个人资料 > 个人资料选项卡设置下随时更改此设置。", + "confirmations.hide_featured_tab.message": "这将会为 {serverName} 及运行最新版本 Mastodon 的其他实例隐藏此选项卡。其他实例的显示情况可能不同。", + "confirmations.hide_featured_tab.title": "隐藏“精选”选项卡吗?", "confirmations.logout.confirm": "退出登录", "confirmations.logout.message": "确定要退出登录吗?", "confirmations.logout.title": "确定要退出登录?", @@ -529,6 +568,7 @@ "content_warning.hide": "隐藏嘟文", "content_warning.show": "仍要显示", "content_warning.show_more": "展开", + "content_warning.show_short": "显示", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", @@ -569,6 +609,14 @@ "domain_pill.your_server": "你的数字家园,你的全部嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。", "domain_pill.your_username": "你在此服务器上的唯一标识。不同服务器上可能存在相同用户名的用户。", "dropdown.empty": "选项", + "email_subscriptions.email": "电子邮件", + "email_subscriptions.form.action": "订阅", + "email_subscriptions.form.bottom": "无需注册 Mastodon 账号,在收件箱中获取嘟文。如果想退订了你可以随时退订。更多信息参见隐私政策。", + "email_subscriptions.form.title": "订阅 {name} 的电子邮件推送", + "email_subscriptions.submitted.lead": "请检查你的收件箱来完成邮件订阅注册。", + "email_subscriptions.submitted.title": "最后一步", + "email_subscriptions.validation.email.blocked": "电子邮件提供商已封禁", + "email_subscriptions.validation.email.invalid": "电子邮件地址无效", "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", "embed.preview": "这是它的预览效果:", "emoji_button.activity": "活动", @@ -586,15 +634,21 @@ "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行与地点", - "empty_column.account_featured.me": "你尚未设置任何精选。你知道吗?你可以将自己最常使用的话题标签,甚至是好友的账号,在你的个人主页上设为精选。", - "empty_column.account_featured.other": "{acct} 尚未设置任何精选。你知道吗?你可以将自己最常使用的话题标签,甚至是好友的账号,在你的个人主页上设为精选。", - "empty_column.account_featured_other.unknown": "此账号尚未设置任何精选。", + "empty_column.account_featured.other": "{acct} 尚未设置任何精选。", + "empty_column.account_featured_self.no_collections_button": "创建收藏列表", + "empty_column.account_featured_self.no_collections_hide_tab": "改为隐藏此选项卡", + "empty_column.account_featured_self.pre_collections": "敬请期待收藏列表", + "empty_column.account_featured_self.pre_collections_desc": "收藏列表(将于 Mastodon 4.6 版本上线)允许你创建自己的精选账号列表,方便你将这些账号推荐给其他人。", + "empty_column.account_featured_self.showcase_accounts": "展示你最喜欢的账号", + "empty_column.account_featured_self.showcase_accounts_desc": "收藏列表包含一些作者精选的账号,可以帮助他人探索更多联邦宇宙的内容。", + "empty_column.account_featured_unknown.other": "此账号尚未设置任何精选。", "empty_column.account_hides_collections": "该用户选择不公开此信息", "empty_column.account_suspended": "账号已被停用", "empty_column.account_timeline": "这里没有嘟文!", "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你还未屏蔽任何用户。", "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加书签。添加书签后的嘟文会显示在这里。", + "empty_column.collections.featured_in": "你还没有被添加到收藏列表过。", "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", "empty_column.direct": "你还未使用过私下提及。当你发出或者收到私下提及时,它将显示在此。", "empty_column.disabled_feed": "此动态已被你的服务器管理员禁用。", @@ -674,7 +728,9 @@ "follow_suggestions.who_to_follow": "推荐关注", "followed_tags": "已关注话题", "followers.hide_other_followers": "该用户选择不展示其他关注者", + "followers.title": "已关注 {name}", "following.hide_other_following": "该用户选择不展示其关注的其他人", + "following.title": "{name} 关注了此账号", "footer.about": "关于", "footer.about_mastodon": "关于 Mastodon", "footer.about_server": "关于 {domain}", @@ -686,6 +742,7 @@ "footer.source_code": "查看源代码", "footer.status": "状态", "footer.terms_of_service": "服务条款", + "form_error.blank": "字段不能为空。", "form_field.optional": "(选填)", "generic.saved": "已保存", "getting_started.heading": "开始使用", @@ -869,6 +926,7 @@ "navigation_panel.expand_followed_tags": "展开已关注话题菜单", "navigation_panel.expand_lists": "展开菜单列表", "not_signed_in_indicator.not_signed_in": "你需要登录才能访问此资源。", + "notification.added_to_collection": "{name} 将你添加到了收藏列表", "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 {# 条嘟文}}", @@ -878,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} 和 {count, plural, other {另外 # 人}}注册了", "notification.annual_report.message": "你的 {year} #Wrapstodon 年度回顾来啦!快来看看这一年你在 Mastodon 上的精彩瞬间!", "notification.annual_report.view": "查看 #Wrapstodon 年度回顾", + "notification.collection_update": "{name} 编辑了你所在的收藏列表", "notification.favourite": "{name} 喜欢了你的嘟文", "notification.favourite.name_and_others_with_link": "{name} 和 {count, plural, other {另外 # 人}} 喜欢了你的嘟文", "notification.favourite_pm": "{name} 喜欢了你的私下提及", @@ -1141,6 +1200,7 @@ "server_banner.active_users": "活跃用户", "server_banner.administered_by": "本站管理员:", "server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 站点之一。", + "server_banner.more_about_this_server": "关于此服务器的更多信息", "server_banner.server_stats": "服务器统计数据:", "sign_in_banner.create_account": "创建账号", "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看全部内容。没有算法、广告或诱导链接。", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index e7e449a23973b3..309a87546fc905 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -14,19 +14,25 @@ "about.powered_by": "由 {mastodon} 提供之去中心化社交媒體", "about.rules": "伺服器規則", "account.account_note_header": "個人筆記", + "account.activity": "活動", + "account.add_note": "新增個人筆記", "account.add_or_remove_from_list": "從列表中新增或移除", + "account.badges.admin": "管理員", + "account.badges.blocked": "已封鎖", "account.badges.bot": "機械人", + "account.badges.domain_blocked": "已封鎖的網域", "account.badges.group": "群組", + "account.badges.muted": "已靜音", + "account.badges.muted_until": "靜音至 {until}", "account.block": "封鎖 @{name}", "account.block_domain": "封鎖網域 {domain}", "account.block_short": "封鎖", "account.blocked": "已封鎖", - "account.blocking": "封鎖", "account.cancel_follow_request": "撤回追蹤請求", "account.copy": "複製個人檔案連結", "account.direct": "私下提及 @{name}", "account.disable_notifications": "當 @{name} 發文時不要再通知我", - "account.domain_blocking": "封鎖網域", + "account.edit_note": "編輯個人筆記", "account.edit_profile": "修改個人檔案", "account.edit_profile_short": "編輯", "account.enable_notifications": "當 @{name} 發文時通知我", @@ -36,9 +42,11 @@ "account.familiar_followers_two": "{name1} 及 {name2} 已追蹤", "account.featured": "精選", "account.featured.accounts": "個人檔案", - "account.featured.hashtags": "標籤", - "account.featured_tags.last_status_at": "上次帖文於 {date}", - "account.featured_tags.last_status_never": "暫無文章", + "account.featured.collections": "珍藏", + "account.field_overflow": "顯示全部內容", + "account.filters.all": "所有活動", + "account.filters.posts_only": "帖文", + "account.filters.replies_toggle": "顯示回覆", "account.follow": "關注", "account.follow_back": "追蹤對方", "account.follow_back_short": "追蹤對方", @@ -58,26 +66,54 @@ "account.in_memoriam": "謹此悼念。", "account.joined_short": "加入於", "account.languages": "變更訂閱語言", + "account.last_active": "上次活躍時間", "account.link_verified_on": "已於 {date} 檢查此連結的所有權", "account.locked_info": "這位使用者將私隱設定為「不公開」,會手動審批誰能關注他/她。", "account.media": "媒體", "account.mention": "提及 @{name}", + "account.menu.add_to_list": "新增到列表", + "account.menu.block": "封鎖帳號", + "account.menu.block_domain": "封鎖 {domain}", + "account.menu.copied": "複製帳號連結到剪貼簿", + "account.menu.copy": "複製連結", + "account.menu.direct": "私下提及", + "account.menu.mention": "提及", + "account.menu.mute": "帳號滅聲", + "account.menu.note.description": "只有你見到", + "account.menu.open_original_page": "在 {domain} 觀看", + "account.menu.remove_follower": "移除追隨者", + "account.menu.report": "擧報帳號", + "account.menu.share": "分享…", + "account.menu.unblock": "解除封鎖帳號", + "account.menu.unblock_domain": "解除封鎖 {domain}", + "account.menu.unmute": "解除帳號滅聲", "account.moved_to": "{name} 表示現在的新帳號是:", "account.mute": "將 @{name} 靜音", "account.mute_notifications_short": "靜音通知", "account.mute_short": "靜音", "account.muted": "靜音", - "account.muting": "靜音", "account.mutual": "你們已互相追蹤", + "account.name.help.username": "{username} 係你喺呢個 Server 嘅 Account 嘅 Username,可能會有條友喺第二個 Server 用緊同一個 Username。", + "account.name.help.username_self": "{username} 係你喺呢個 Server 嘅 Username,可能會有條友喺第二個 Server 用緊同一個 Username。", + "account.name_info": "咩意思?", "account.no_bio": "未提供描述。", + "account.node_modal.callout": "只有你可以見到個人筆記", + "account.node_modal.edit_title": "編輯個人筆記", + "account.node_modal.error_unknown": "未能儲存筆記", + "account.node_modal.field_label": "個人筆記", + "account.node_modal.save": "儲存", + "account.node_modal.title": "新增個人筆記", + "account.note.edit_button": "編輯", + "account.note.title": "個人筆記(得你先睇到)", "account.open_original_page": "打開原始頁面", "account.posts": "帖文", - "account.posts_with_replies": "帖文與回覆", "account.remove_from_followers": "移除追蹤者{name}", "account.report": "檢舉 @{name}", "account.requested_follow": "{name} 要求追蹤你", "account.share": "分享 @{name} 的個人檔案", "account.show_reblogs": "顯示 @{name} 的轉推", + "account.timeline.pinned": "釘起咗", + "account.timeline.pinned.view_all": "睇晒所有釘起咗嘅 Post", "account.unblock": "解除封鎖 @{name}", "account.unblock_domain": "解除封鎖網域 {domain}", "account.unblock_domain_short": "解除封鎖", @@ -87,6 +123,35 @@ "account.unmute": "取消靜音 @{name}", "account.unmute_notifications_short": "解除靜音通知", "account.unmute_short": "解除靜音", + "account_edit.bio.add_label": "增加個人簡介", + "account_edit.bio.edit_label": "編輯個人簡介", + "account_edit.bio.placeholder": "打少少嘢介紹吓自己等人認到你", + "account_edit.bio.title": "個人簡介", + "account_edit.bio_modal.add_title": "新增個人簡介", + "account_edit.bio_modal.edit_title": "編輯個人簡介", + "account_edit.column_button": "搞掂", + "account_edit.column_title": "編輯個人資料", + "account_edit.custom_fields.add_label": "增加欄目", + "account_edit.custom_fields.edit_label": "修改欄目", + "account_edit.custom_fields.reorder_button": "欄目重新排位", + "account_edit.custom_fields.tip_title": "貼士:增加認證咗嘅 LINK", + "account_edit.custom_fields.title": "自訂欄目", + "account_edit.custom_fields.verified_hint": "我點可以增加認證咗嘅 LINK?", + "account_edit.display_name.add_label": "增加顯示嘅名", + "account_edit.display_name.edit_label": "修改顯示嘅名", + "account_edit.display_name.title": "顯示嘅名", + "account_edit.featured_hashtags.edit_label": "增加 #hashtag", + "account_edit.featured_hashtags.placeholder": "等其他人認得你同更加快加入你鐘意嘅話提", + "account_edit.featured_hashtags.title": "推薦嘅 #hashtag", + "account_edit.field_actions.delete": "剷咗個欄目", + "account_edit.field_actions.edit": "修改欄目", + "account_edit.field_delete_modal.confirm": "你係咪堅想剷咗啲自訂嘅欄目?剷咗冇得返轉頭", + "account_edit.field_delete_modal.delete_button": "剷咗佢", + "account_edit.field_delete_modal.title": "剷咗個自訂欄目?", + "account_edit.field_edit_modal.add_title": "增加自訂欄目", + "account_edit.field_edit_modal.discard_confirm": "散啦", + "account_edit.field_edit_modal.discard_message": "你有啲嘢改咗未 Save, 係咪真係要閃㗎?", + "account_edit.field_edit_modal.edit_title": "修改自訂欄目", "account_note.placeholder": "點擊添加備注", "admin.dashboard.daily_retention": "註冊後按天計算的使用者存留率", "admin.dashboard.monthly_retention": "註冊後按月計算的使用者存留率", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 06fabfced7fdbd..92f685c4d49960 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -28,12 +28,10 @@ "account.block_domain": "封鎖來自 {domain} 網域之所有內容", "account.block_short": "封鎖", "account.blocked": "已封鎖", - "account.blocking": "封鎖中", "account.cancel_follow_request": "收回跟隨請求", "account.copy": "複製個人檔案連結", "account.direct": "私訊 @{name}", "account.disable_notifications": "取消來自 @{name} 嘟文之通知", - "account.domain_blocking": "封鎖中網域", "account.edit_note": "編輯個人備註", "account.edit_profile": "編輯個人檔案", "account.edit_profile_short": "編輯", @@ -45,9 +43,7 @@ "account.featured": "精選內容", "account.featured.accounts": "個人檔案", "account.featured.collections": "收藏名單", - "account.featured.hashtags": "主題標籤", - "account.featured_tags.last_status_at": "上次發嘟於 {date}", - "account.featured_tags.last_status_never": "沒有嘟文", + "account.featured.new_collection": "新收藏名單", "account.field_overflow": "顯示完整內容", "account.filters.all": "所有活動", "account.filters.boosts_toggle": "顯示轉嘟", @@ -73,8 +69,19 @@ "account.go_to_profile": "前往個人檔案", "account.hide_reblogs": "隱藏來自 @{name} 之轉嘟", "account.in_memoriam": "謹此悼念。", + "account.join_modal.day": "日", + "account.join_modal.me": "您加入 {server} 的時間為", + "account.join_modal.me_anniversary": "歡慶聯邦宇宙週年!您加入 {server} 的時間為", + "account.join_modal.me_today": "這是您在 {server} 的第一天!", + "account.join_modal.other": "{name} 加入 {server} 的時間為", + "account.join_modal.other_today": "這是 {name} 在 {server} 的第一天!", + "account.join_modal.share.celebrate": "發一則慶祝嘟文", + "account.join_modal.share.intro": "發一則介紹嘟文", + "account.join_modal.share.welcome": "發一則歡迎嘟文", + "account.join_modal.years": "{number, plural, other {年}}", "account.joined_short": "加入時間", "account.languages": "變更訂閱的語言", + "account.last_active": "上次活躍時間", "account.link_verified_on": "已於 {date} 檢查此連結的擁有者權限", "account.locked_info": "此帳號的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳號的人。", "account.media": "媒體", @@ -102,11 +109,11 @@ "account.mute_notifications_short": "靜音推播通知", "account.mute_short": "靜音", "account.muted": "已靜音", - "account.muting": "靜音", "account.mutual": "跟隨彼此", + "account.name.copy": "複製帳號", "account.name.help.domain": "{domain} 為託管此使用者個人檔案與嘟文之伺服器。", "account.name.help.domain_self": "{domain} 為託管您個人檔案與嘟文之伺服器。", - "account.name.help.footer": "就像是您的以不同 email 程式寄信給他人一樣,您能與其他 Mastodon 伺服器中的人們互動,並且能和使用與 Mastodon 一樣規則 (ActivityPub 協定) 的其他社群軟體上任何人互動。", + "account.name.help.footer": "就像是您能與使用不同電子郵件提供商的其他人互動一般,您能與其他 Mastodon 伺服器上的人們互動,也能與其他 Mastodon 相容社群軟體上的任何人互動。", "account.name.help.header": "@handle 就像是 email 地址一樣", "account.name.help.username": "{username} 為該使用者於他們伺服器上的帳號名稱。其他伺服器上的某個人可能擁有一樣的使用者名稱。", "account.name.help.username_self": "{username} 為您於此伺服器上的帳號名稱。其他伺服器上的某個人可能擁有一樣的使用者名稱。", @@ -121,12 +128,11 @@ "account.note.edit_button": "編輯", "account.note.title": "個人備註(僅有您可見)", "account.open_original_page": "檢視原始頁面", + "account.pending": "等待中", "account.posts": "嘟文", - "account.posts_with_replies": "嘟文與回覆", "account.remove_from_followers": "自跟隨者中移除 {name}", "account.report": "檢舉 @{name}", "account.requested_follow": "{name} 要求跟隨您", - "account.requests_to_follow_you": "要求跟隨您", "account.share": "分享 @{name} 的個人檔案", "account.show_reblogs": "顯示來自 @{name} 的轉嘟", "account.statuses_counter": "{count, plural, other {{counter} 則嘟文}}", @@ -141,34 +147,42 @@ "account.unmute": "解除靜音 @{name}", "account.unmute_notifications_short": "解除靜音推播通知", "account.unmute_short": "解除靜音", + "account_edit.advanced_settings.bot_hint": "告知他人此帳號主要執行自動化操作且可能未受人為監控", + "account_edit.advanced_settings.bot_label": "機器人帳號", + "account_edit.advanced_settings.title": "進階設定", + "account_edit.bio.add_label": "新增個人簡介", + "account_edit.bio.edit_label": "編輯個人簡介", "account_edit.bio.placeholder": "加入一段簡短介紹以幫助其他人識別您。", "account_edit.bio.title": "個人簡介", "account_edit.bio_modal.add_title": "新增個人簡介", "account_edit.bio_modal.edit_title": "編輯個人簡介", - "account_edit.button.add": "加入 {item}", - "account_edit.button.delete": "刪除 {item}", - "account_edit.button.edit": "編輯 {item}", "account_edit.column_button": "完成", "account_edit.column_title": "編輯個人檔案", - "account_edit.custom_fields.name": "欄位", + "account_edit.custom_fields.add_label": "新增欄位", + "account_edit.custom_fields.edit_label": "編輯欄位", "account_edit.custom_fields.placeholder": "加入您的稱謂、外部連結、或其他您想分享的。", "account_edit.custom_fields.reorder_button": "重新排序欄位", "account_edit.custom_fields.tip_content": "您能透過驗證任何您擁有網站之連結,以輕鬆增加您 Mastodon 帳號之可信度。", "account_edit.custom_fields.tip_title": "小撇步:新增驗證連結", "account_edit.custom_fields.title": "自訂欄位", "account_edit.custom_fields.verified_hint": "如何新增驗證連結?", + "account_edit.display_name.add_label": "新增顯示名稱", + "account_edit.display_name.edit_label": "編輯顯示名稱", "account_edit.display_name.placeholder": "您的顯示名稱是您將於個人檔案與時間軸的出現方式。", "account_edit.display_name.title": "顯示名稱", - "account_edit.featured_hashtags.item": "主題標籤", + "account_edit.featured_hashtags.edit_label": "新增主題標籤", "account_edit.featured_hashtags.placeholder": "協助其他人識別、以及快速存取您的最愛主題。", "account_edit.featured_hashtags.title": "推薦主題標籤", + "account_edit.field_actions.delete": "刪除欄位", + "account_edit.field_actions.edit": "編輯欄位", "account_edit.field_delete_modal.confirm": "您確定要刪除此自訂欄位嗎?此動作無法復原。", "account_edit.field_delete_modal.delete_button": "刪除", "account_edit.field_delete_modal.title": "是否刪除自訂欄位?", "account_edit.field_edit_modal.add_title": "新增自訂欄位", + "account_edit.field_edit_modal.discard_confirm": "捨棄", + "account_edit.field_edit_modal.discard_message": "您有尚未儲存之變更。您是否確定要捨棄這些變更?", "account_edit.field_edit_modal.edit_title": "編輯自訂欄位", - "account_edit.field_edit_modal.limit_header": "已超過建議字數限制", - "account_edit.field_edit_modal.limit_message": "行動裝置使用者可能無法看見您完整欄位。", + "account_edit.field_edit_modal.length_warning": "已超過建議字數。行動裝置使用者可能無法檢視您的欄位完整內容。", "account_edit.field_edit_modal.link_emoji_warning": "我們不建議於 URL 中使用自訂 emoji 表情符號。為了避免使用者混淆,包含兩者之自訂欄位將僅顯示為文字,而不是顯示為連結。", "account_edit.field_edit_modal.name_hint": "例如:「個人網站」", "account_edit.field_edit_modal.name_label": "標籤", @@ -197,6 +211,8 @@ "account_edit.image_edit.alt_edit_button": "編輯 ALT 說明文字", "account_edit.image_edit.remove_button": "移除圖片", "account_edit.image_edit.replace_button": "替換圖片", + "account_edit.item_list.delete": "刪除 {name}", + "account_edit.item_list.edit": "編輯 {name}", "account_edit.name_modal.add_title": "新增顯示名稱", "account_edit.name_modal.edit_title": "編輯顯示名稱", "account_edit.profile_tab.button_label": "自訂", @@ -208,8 +224,6 @@ "account_edit.profile_tab.show_media.title": "顯示「媒體」分頁", "account_edit.profile_tab.show_media_replies.description": "當啟用時,媒體分頁將顯示您的嘟文與對其他人嘟文之回嘟。", "account_edit.profile_tab.show_media_replies.title": "於「媒體」分頁中包含回嘟", - "account_edit.profile_tab.subtitle": "自訂您個人檔案之分頁與內容。", - "account_edit.profile_tab.title": "個人檔案分頁設定", "account_edit.save": "儲存", "account_edit.upload_modal.back": "上一步", "account_edit.upload_modal.done": "完成", @@ -219,8 +233,10 @@ "account_edit.upload_modal.step_upload.dragging": "拖曳以上傳", "account_edit.upload_modal.step_upload.header": "選擇圖片", "account_edit.upload_modal.step_upload.hint": "WEBP、PNG、GIF 或 JPG 格式,最大 {limit}MB。{br}圖片將會縮放至 {width}x{height} 像素。", - "account_edit.upload_modal.title_add": "新增個人檔案照片", - "account_edit.upload_modal.title_replace": "更換個人檔案照片", + "account_edit.upload_modal.title_add.avatar": "新增個人檔案照片", + "account_edit.upload_modal.title_add.header": "新增封面圖片", + "account_edit.upload_modal.title_replace.avatar": "更換個人檔案照片", + "account_edit.upload_modal.title_replace.header": "更換封面圖片", "account_edit.verified_modal.details": "藉由驗證連結至個人網站增加您 Mastodon 個人檔案之可信度。運作方式如下:", "account_edit.verified_modal.invisible_link.details": "新增連結至您的標頭 (header)。其重要的部分是 rel=\"me\" ,防止透過使用者產生內容模擬。您甚至能使用頁面標頭之 link 標籤取代頁面中的 {tag},但 HTML 必須能於不執行 JavaScript 情況下所存取。", "account_edit.verified_modal.invisible_link.summary": "如何隱藏此連結?", @@ -229,11 +245,13 @@ "account_edit.verified_modal.step2.header": "將您的網站加入為自訂欄位", "account_edit.verified_modal.title": "如何新增驗證連結", "account_edit_tags.add_tag": "加入 #{tagName}", - "account_edit_tags.column_title": "編輯推薦主題標籤", + "account_edit_tags.column_title": "編輯主題標籤", "account_edit_tags.help_text": "推薦主題標籤幫助其他人發現並與您的個人檔案互動。它們將作為過濾器出現於您個人檔案頁面之動態中。", + "account_edit_tags.max_tags_reached": "您已達推薦主題標籤數量上限。", "account_edit_tags.search_placeholder": "請輸入主題標籤…", "account_edit_tags.suggestions": "建議:", "account_edit_tags.tag_status_count": "{count, plural, other {# 則嘟文}}", + "account_list.total": "{total, plural, other {# 個帳號}}", "account_note.placeholder": "點擊以新增備註", "admin.dashboard.daily_retention": "註冊後使用者存留率(日)", "admin.dashboard.monthly_retention": "註冊後使用者存留率(月)", @@ -346,8 +364,11 @@ "collection.share_template_other": "來看看這個酷酷的收藏名單:{link}", "collection.share_template_own": "來看看我的新收藏名單:{link}", "collections.account_count": "{count, plural, other {# 個帳號}}", - "collections.accounts.empty_description": "加入最多 {count} 個您跟隨之帳號", + "collections.accounts.empty_description": "加入最多 {count} 個帳號", + "collections.accounts.empty_editor_title": "此收藏名單尚未有任何人", "collections.accounts.empty_title": "此收藏名單是空的", + "collections.block_collection_owner": "封鎖帳號", + "collections.by_account": "來自 {account_handle}", "collections.collection_description": "說明", "collections.collection_language": "語言", "collections.collection_language_none": "無", @@ -356,47 +377,54 @@ "collections.confirm_account_removal": "您是否確定要自此收藏名單中移除此帳號?", "collections.content_warning": "內容警告", "collections.continue": "繼續", - "collections.create.accounts_subtitle": "僅能加入您跟隨並選擇加入探索功能之帳號。", + "collections.copy_link": "複製連結", + "collections.copy_link_confirmation": "複製收藏名單連結至剪貼簿", "collections.create.accounts_title": "您想於此收藏名單推薦誰?", "collections.create.basic_details_title": "基本資料", "collections.create.steps": "步驟 {step}/{total}", - "collections.create_a_collection_hint": "建立用以向其他人推薦或分享您最喜愛帳號之收藏名單。", "collections.create_collection": "建立收藏名單", "collections.delete_collection": "刪除收藏名單", "collections.description_length_hint": "100 字限制", - "collections.detail.accept_inclusion": "Okay", - "collections.detail.accounts_heading": "帳號", - "collections.detail.author_added_you": "{author} 將您加入至此收藏名單", - "collections.detail.curated_by_author": "由 {author} 精選", - "collections.detail.curated_by_you": "由您精選", + "collections.detail.author_added_you_on_date": "{author} 於 {date} 將您加入", "collections.detail.loading": "讀取收藏名單中...", - "collections.detail.other_accounts_in_collection": "此收藏名單中其他人:", "collections.detail.revoke_inclusion": "移除我", + "collections.detail.sensitive_content": "敏感內容", "collections.detail.sensitive_note": "此收藏名單可能包含對某些使用者敏感之帳號或內容。", "collections.detail.share": "分享此收藏名單", + "collections.detail.you_are_in_this_collection": "您已被加入至此收藏名單", "collections.edit_details": "編輯詳細資料", - "collections.error_loading_collections": "讀取您的收藏名單時發生錯誤。", - "collections.hints.accounts_counter": "{count} / {max} 個帳號", + "collections.hidden_accounts_description": "您已封鎖或靜音{count, plural, other {這些使用者}}", + "collections.hidden_accounts_link": "{count, plural, other {# 個隱藏帳號}}", + "collections.hints.accounts_counter": "{count}/{max} 個帳號", "collections.last_updated_at": "最後更新:{date}", + "collections.list.collections_with_count": "{count, plural, other {# 份收藏名單}}", + "collections.list.created_by_author": "由 {name} 建立", + "collections.list.created_by_you": "由您建立", "collections.manage_accounts": "管理帳號", "collections.mark_as_sensitive": "標記為敏感內容", "collections.mark_as_sensitive_hint": "將此收藏名單之說明隱藏於內容警告之後。此收藏名單名稱仍將可見。", + "collections.maximum_collection_count_description": "您的伺服器允許新增至多 {count} 個收藏名單。", + "collections.maximum_collection_count_reached": "您所建立之收藏名單數量已達上限", "collections.name_length_hint": "40 字限制", "collections.new_collection": "新增收藏名單", - "collections.no_collections_yet": "您沒有任何收藏名單。", - "collections.old_last_post_note": "上次發表嘟文已超過一週", - "collections.remove_account": "移除此帳號", + "collections.remove_account": "移除", "collections.report_collection": "檢舉此收藏名單", "collections.revoke_collection_inclusion": "將我自此收藏名單中移除", "collections.revoke_inclusion.confirmation": "您已自「{collection}」中被移除", "collections.revoke_inclusion.error": "發生錯誤,請稍候重試。", - "collections.search_accounts_label": "搜尋帳號以加入...", + "collections.search_accounts_label": "搜尋帳號以加入", "collections.search_accounts_max_reached": "您新增之帳號數已達上限", "collections.sensitive": "敏感內容", + "collections.share_short": "分享", + "collections.suggestions.can_not_add": "無法被新增", + "collections.suggestions.can_not_add_desc": "這些帳號可能選擇退出探索功能,或他們所在之伺服器未支援收藏名單。", + "collections.suggestions.must_follow": "您必須先跟隨", + "collections.suggestions.must_follow_desc": "這些帳號審查所有跟隨請求。跟隨者才能將他們加入至收藏名單內。", "collections.topic_hint": "新增主題標籤以協助其他人瞭解此收藏名單之主題。", "collections.topic_special_chars_hint": "特殊字元將於儲存時被移除", + "collections.unlisted_collections_description": "這些將不會於您的個人檔案對他人顯示。但任何擁有連結之人皆能發現其內容。", + "collections.unlisted_collections_with_count": "未公開收藏名單 ({count})", "collections.view_collection": "檢視收藏名單", - "collections.view_other_collections_by_user": "檢視此使用者之其他收藏名單", "collections.visibility_public": "公開", "collections.visibility_public_hint": "可於搜尋結果與其他推薦處可見。", "collections.visibility_title": "可見性", @@ -405,7 +433,6 @@ "column.about": "關於", "column.blocks": "已封鎖使用者", "column.bookmarks": "書籤", - "column.collections": "我的收藏名單", "column.community": "本站時間軸", "column.create_list": "建立列表", "column.direct": "私訊", @@ -422,8 +449,10 @@ "column.lists": "列表", "column.mutes": "已靜音使用者", "column.notifications": "推播通知", + "column.other_collections": "{name} 的收藏名單", "column.pins": "釘選的嘟文", "column.public": "聯邦時間軸", + "column.your_collections": "您的收藏名單", "column_back_button.label": "上一頁", "column_header.hide_settings": "隱藏設定", "column_header.moveLeft_settings": "將欄位向左移動", @@ -485,12 +514,13 @@ "confirmations.discard_draft.post.title": "是否捨棄您的嘟文草稿?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您於媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?", - "confirmations.follow_to_collection.confirm": "跟隨並加入至收藏名單", - "confirmations.follow_to_collection.message": "您必須先跟隨 {name} 以將其加入至收藏名單。", - "confirmations.follow_to_collection.title": "是否跟隨此帳號?", "confirmations.follow_to_list.confirm": "跟隨並加入至列表", "confirmations.follow_to_list.message": "您必須先跟隨 {name} 以將其加入至列表。", "confirmations.follow_to_list.title": "是否跟隨該使用者?", + "confirmations.hide_featured_tab.confirm": "隱藏分頁", + "confirmations.hide_featured_tab.intro": "您可以於編輯個人檔案→個人檔案分頁設定下變更此設定。", + "confirmations.hide_featured_tab.message": "這將會隱藏 {serverName} 及其他執行最新版本 Mastodon 伺服器上使用者所見之分頁。其他介面顯示可能有所不同。", + "confirmations.hide_featured_tab.title": "是否隱藏「精選內容」分頁?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "您確定要登出嗎?", "confirmations.logout.title": "您確定要登出嗎?", @@ -529,6 +559,7 @@ "content_warning.hide": "隱藏嘟文", "content_warning.show": "仍要顯示", "content_warning.show_more": "顯示更多", + "content_warning.show_short": "顯示", "conversation.delete": "刪除對話", "conversation.mark_as_read": "標記為已讀", "conversation.open": "檢視對話", @@ -569,6 +600,14 @@ "domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。", "domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。", "dropdown.empty": "請選擇一個選項", + "email_subscriptions.email": "電子郵件", + "email_subscriptions.form.action": "訂閱", + "email_subscriptions.form.bottom": "於不建立 Mastodon 帳號的情況下,將透過電子郵件取得嘟文。您可以任何時候取消訂閱。欲了解更多資訊,請參考隱私權政策。", + "email_subscriptions.form.title": "訂閱 {name} 之電子郵件通訊", + "email_subscriptions.submitted.lead": "請檢查您的收件夾以完成訂閱電子郵件通訊。", + "email_subscriptions.submitted.title": "最後一步", + "email_subscriptions.validation.email.blocked": "已封鎖之電子郵件提供商", + "email_subscriptions.validation.email.invalid": "無效的電子郵件地址", "embed.instructions": "請複製以下程式碼以於您的網站嵌入此嘟文。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", @@ -586,9 +625,14 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", - "empty_column.account_featured.me": "您尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?", - "empty_column.account_featured.other": "{acct} 尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?", - "empty_column.account_featured_other.unknown": "此帳號尚未有任何精選內容。", + "empty_column.account_featured.other": "{acct} 尚未有任何精選內容。", + "empty_column.account_featured_self.no_collections_button": "建立收藏名單", + "empty_column.account_featured_self.no_collections_hide_tab": "改為隱藏此分頁", + "empty_column.account_featured_self.pre_collections": "敬請期待收藏名單", + "empty_column.account_featured_self.pre_collections_desc": "收藏名單功能(將於 Mastodon 4.6 上線)允許您建立自己的精選帳號名單並推薦予其他人。", + "empty_column.account_featured_self.showcase_accounts": "展示您最喜歡的帳號", + "empty_column.account_featured_self.showcase_accounts_desc": "收藏名單為幫助其他人探索 Fediverse 之精選帳號名單。", + "empty_column.account_featured_unknown.other": "此帳號尚未有任何精選內容。", "empty_column.account_hides_collections": "這位使用者選擇不提供此資訊", "empty_column.account_suspended": "帳號已被停權", "empty_column.account_timeline": "這裡還沒有嘟文!", @@ -628,7 +672,7 @@ "featured_carousel.header": "{count, plural, other {# 則釘選嘟文}}", "featured_carousel.slide": "{max, number} 則嘟文中之第 {current, number} 則", "featured_tags.more_items": "+{count}", - "featured_tags.suggestions": "最近您曾發有關 {items} 之嘟文。是否新增其為推薦主題標籤?", + "featured_tags.suggestions": "最近您曾發過有關 {items} 之嘟文。是否新增其為推薦主題標籤?", "featured_tags.suggestions.add": "新增", "featured_tags.suggestions.added": "於 編輯個人檔案 > 推薦主題標籤 隨時管理您的推薦主題標籤。", "featured_tags.suggestions.dismiss": "不需要,謝謝", @@ -674,7 +718,9 @@ "follow_suggestions.who_to_follow": "推薦跟隨帳號", "followed_tags": "已跟隨主題標籤", "followers.hide_other_followers": "此使用者選擇不公開跟隨者", + "followers.title": "正在跟隨 {name}", "following.hide_other_following": "此使用者選擇不公開跟隨中", + "following.title": "被 {name} 跟隨", "footer.about": "關於", "footer.about_mastodon": "關於 Mastodon", "footer.about_server": "關於 {domain}", @@ -686,6 +732,7 @@ "footer.source_code": "檢視原始碼", "footer.status": "狀態", "footer.terms_of_service": "服務條款", + "form_error.blank": "欄位內容無法為空白。", "form_field.optional": "(可選的)", "generic.saved": "已儲存", "getting_started.heading": "開始使用", @@ -730,16 +777,16 @@ "ignore_notifications_modal.filter_to_avoid_confusion": "過濾器有助於避免潛在的混淆", "ignore_notifications_modal.filter_to_review_separately": "您能單獨檢視已過濾推播通知", "ignore_notifications_modal.ignore": "忽略推播通知", - "ignore_notifications_modal.limited_accounts_title": "忽略來自受管制帳號之推播通知?", - "ignore_notifications_modal.new_accounts_title": "忽略來自新帳號之推播通知?", - "ignore_notifications_modal.not_followers_title": "忽略來自未跟隨您帳號之推播通知?", - "ignore_notifications_modal.not_following_title": "忽略來自您未跟隨帳號之推播通知?", - "ignore_notifications_modal.private_mentions_title": "忽略來自不請自來私訊之推播通知?", + "ignore_notifications_modal.limited_accounts_title": "是否忽略來自受管制帳號之推播通知?", + "ignore_notifications_modal.new_accounts_title": "是否忽略來自新帳號之推播通知?", + "ignore_notifications_modal.not_followers_title": "是否忽略來自未跟隨您帳號之推播通知?", + "ignore_notifications_modal.not_following_title": "是否忽略來自您未跟隨帳號之推播通知?", + "ignore_notifications_modal.private_mentions_title": "是否忽略來自不請自來私訊之推播通知?", "info_button.label": "幫助", "info_button.what_is_alt_text": "

    何謂 ALT 說明文字?

    ALT 說明文字為視覺障礙者、低網路頻寬或尋求額外上下文語境的人們提供圖片描述。

    您可以透過撰寫清晰、簡潔及客觀的說明文字以替所有人改善無障礙特性與協助理解。

    • 掌握幾個重要元素
    • 替圖片提供文字摘要
    • 使用常規行文結構
    • 避免冗贅資訊
    • 聚焦於趨勢與複雜視覺中之關鍵(如圖表或地圖)
    ", "interaction_modal.action": "若欲與 {name} 之嘟文互動,您必須登入您帳號所註冊之 Mastodon 伺服器。", - "interaction_modal.go": "Go!", - "interaction_modal.no_account_yet": "仍尚未有帳號嗎?", + "interaction_modal.go": "Go!", + "interaction_modal.no_account_yet": "仍尚未擁有帳號嗎?", "interaction_modal.on_another_server": "於不同伺服器", "interaction_modal.on_this_server": "於此伺服器", "interaction_modal.title": "請先登入以繼續", @@ -755,9 +802,9 @@ "keyboard_shortcuts.description": "說明", "keyboard_shortcuts.direct": "開啟私訊對話欄", "keyboard_shortcuts.down": "向下移動", - "keyboard_shortcuts.enter": "檢視嘟文", + "keyboard_shortcuts.enter": "開啟嘟文", "keyboard_shortcuts.explore": "開啟熱門趨勢時間軸", - "keyboard_shortcuts.favourite": "加到最愛", + "keyboard_shortcuts.favourite": "加至最愛", "keyboard_shortcuts.favourites": "開啟最愛列表", "keyboard_shortcuts.federated": "開啟聯邦時間軸", "keyboard_shortcuts.heading": "鍵盤快速鍵", @@ -774,14 +821,14 @@ "keyboard_shortcuts.pinned": "開啟釘選的嘟文列表", "keyboard_shortcuts.profile": "開啟作者的個人檔案頁面", "keyboard_shortcuts.quote": "引用嘟文", - "keyboard_shortcuts.reply": "回應嘟文", + "keyboard_shortcuts.reply": "回覆嘟文", "keyboard_shortcuts.requests": "開啟跟隨請求列表", "keyboard_shortcuts.search": "將游標移至搜尋框", "keyboard_shortcuts.spoilers": "顯示或隱藏內容警告之嘟文", "keyboard_shortcuts.start": "開啟「開始使用」欄位", "keyboard_shortcuts.toggle_hidden": "顯示或隱藏於內容警告之後的嘟文", "keyboard_shortcuts.toggle_sensitivity": "顯示或隱藏媒體", - "keyboard_shortcuts.toot": "發個新嘟文", + "keyboard_shortcuts.toot": "發表新嘟文", "keyboard_shortcuts.top": "移至列表最上方", "keyboard_shortcuts.translate": "翻譯嘟文", "keyboard_shortcuts.unfocus": "跳離文字撰寫區塊或搜尋框", @@ -869,6 +916,7 @@ "navigation_panel.expand_followed_tags": "展開已跟隨主題標籤選單", "navigation_panel.expand_lists": "展開列表選單", "not_signed_in_indicator.not_signed_in": "您需要登入才能存取此資源。", + "notification.added_to_collection": "{name} 將您加入至收藏名單", "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 {# 則嘟文}}", @@ -878,6 +926,7 @@ "notification.admin.sign_up.name_and_others": "{name} 與{count, plural, other {其他 # 個人}}已註冊", "notification.annual_report.message": "您的 {year} #Wrapstodon 正等著您!揭開您 Mastodon 上的年度精彩時刻與值得回憶的難忘時光!", "notification.annual_report.view": "檢視 #Wrapstodon 年度回顧", + "notification.collection_update": "{name} 已編輯您所在之收藏名單", "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.favourite.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的嘟文加入最愛", "notification.favourite_pm": "{name} 將您的私訊加入最愛", @@ -1037,7 +1086,7 @@ "quote_error.private_mentions": "無法引用私訊嘟文。", "quote_error.quote": "一次僅能引用一則嘟文。", "quote_error.unauthorized": "您不被授權允許引用此嘟文。", - "quote_error.upload": "無法引用多媒體內容嘟文。", + "quote_error.upload": "無法引用含有多媒體附加檔案之嘟文。", "recommended": "推薦設定", "refresh": "重新整理", "regeneration_indicator.please_stand_by": "請稍候。", @@ -1141,6 +1190,7 @@ "server_banner.active_users": "活躍使用者", "server_banner.administered_by": "管理者:", "server_banner.is_one_of_many": "{domain} 為許多獨立的 Mastodon 伺服器之一,您能透過該伺服器參與聯邦宇宙。", + "server_banner.more_about_this_server": "更多關於此伺服器", "server_banner.server_stats": "伺服器統計:", "sign_in_banner.create_account": "新增帳號", "sign_in_banner.follow_anyone": "跟隨聯邦宇宙中的任何人,並且以時間順序瀏覽所有內容。沒有演算法、廣告、或騙點擊連結。", diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts index 87e63702c5ff18..c05608b4e58789 100644 --- a/app/javascript/mastodon/models/account.ts +++ b/app/javascript/mastodon/models/account.ts @@ -92,6 +92,7 @@ export const accountDefaultValues: AccountShape = { acct: '', avatar: '', avatar_static: '', + avatar_description: '', bot: false, created_at: '', discoverable: false, @@ -110,6 +111,7 @@ export const accountDefaultValues: AccountShape = { group: false, header: '', header_static: '', + header_description: '', id: '', last_status_at: '', locked: false, @@ -134,6 +136,7 @@ export const accountDefaultValues: AccountShape = { moved: null, hide_collections: false, other_settings: AccountOtherSettingsFactory(), + email_subscriptions: false, // This comes from `ApiMutedAccountJSON`, but we should eventually // store that in a different object. mute_expires_at: null, diff --git a/app/javascript/mastodon/models/notification_group.ts b/app/javascript/mastodon/models/notification_group.ts index ca8ec43b03e425..c44df83be78d58 100644 --- a/app/javascript/mastodon/models/notification_group.ts +++ b/app/javascript/mastodon/models/notification_group.ts @@ -12,6 +12,8 @@ import type { } from 'mastodon/api_types/notifications'; import type { ApiReportJSON } from 'mastodon/api_types/reports'; +import type { ApiCollectionJSON } from '../api_types/collections'; + // Maximum number of avatars displayed in a notification group // This corresponds to the max length of `group.sampleAccountIds` export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; @@ -113,6 +115,15 @@ export interface NotificationGroupAdminReport extends BaseNotification<'admin.re report: Report; } +type Collection = ApiCollectionJSON; +export interface NotificationGroupAddedToCollection extends BaseNotification<'added_to_collection'> { + collection: Collection | null; +} + +export interface NotificationGroupCollectionUpdate extends BaseNotification<'collection_update'> { + collection: Collection | null; +} + export type NotificationGroup = | NotificationGroupFavourite | NotificationGroupEmojiReaction @@ -131,7 +142,9 @@ export type NotificationGroup = | NotificationGroupSeveredRelationships | NotificationGroupAdminSignUp | NotificationGroupAdminReport - | NotificationGroupAnnualReport; + | NotificationGroupAnnualReport + | NotificationGroupAddedToCollection + | NotificationGroupCollectionUpdate; function createReportFromJSON(reportJSON: ApiReportJSON): Report { const { target_account, ...report } = reportJSON; @@ -336,6 +349,13 @@ export function createNotificationGroupFromNotificationJSON( notification.moderation_warning, ), }; + case 'added_to_collection': + case 'collection_update': + return { + ...group, + type: notification.type, + collection: notification.collection, + }; default: return { ...group, diff --git a/app/javascript/mastodon/models/status.ts b/app/javascript/mastodon/models/status.ts index b043edb9ca65d6..668546ea261ad8 100644 --- a/app/javascript/mastodon/models/status.ts +++ b/app/javascript/mastodon/models/status.ts @@ -1,5 +1,6 @@ import type { RecordOf } from 'immutable'; +import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; import type { ApiPreviewCardJSON } from 'mastodon/api_types/statuses'; export type { StatusVisibility } from 'mastodon/api_types/statuses'; @@ -10,3 +11,5 @@ export type Status = Immutable.Map; export type Card = RecordOf; export type MediaAttachment = Immutable.Map; + +export type CollectionAttachment = RecordOf; diff --git a/app/javascript/mastodon/polyfills/intl.ts b/app/javascript/mastodon/polyfills/intl.ts index b1157557e5bad8..ea09ee6bf64cb0 100644 --- a/app/javascript/mastodon/polyfills/intl.ts +++ b/app/javascript/mastodon/polyfills/intl.ts @@ -1,6 +1,6 @@ // import { shouldPolyfill as shouldPolyfillCanonicalLocales } from '@formatjs/intl-getcanonicallocales/should-polyfill'; // import { shouldPolyfill as shouldPolyfillLocale } from '@formatjs/intl-locale/should-polyfill'; -import { shouldPolyfill as shoudPolyfillPluralRules } from '@formatjs/intl-pluralrules/should-polyfill'; +import { shouldPolyfill as shoudPolyfillPluralRules } from '@formatjs/intl-pluralrules/should-polyfill.js'; // import { shouldPolyfill as shouldPolyfillNumberFormat } from '@formatjs/intl-numberformat/should-polyfill'; // import { shouldPolyfill as shouldPolyfillIntlDateTimeFormat } from '@formatjs/intl-datetimeformat/should-polyfill'; // import { shouldPolyfill as shouldPolyfillIntlRelativeTimeFormat } from '@formatjs/intl-relativetimeformat/should-polyfill'; @@ -54,7 +54,7 @@ async function loadIntlPluralRulesPolyfills(locale: string) { return; } // Load the polyfill 1st BEFORE loading data - await import('@formatjs/intl-pluralrules/polyfill-force'); + await import('@formatjs/intl-pluralrules/polyfill-force.js'); await import( `../../../../node_modules/@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}.js` ); diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 6e0036a4e0d2ce..89b06d8f2b542b 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -754,7 +754,10 @@ export const composeReducer = (state = initialState, action) => { case COMPOSE_LANGUAGE_CHANGE: return state.set('language', action.language); case COMPOSE_FOCUS: - return state.set('focusDate', new Date()).update('text', text => text.length > 0 ? text : action.defaultText); + return state + .set('focusDate', new Date()) + .update('text', text => text.length > 0 ? text : action.defaultText) + .update('caretPosition', position => action.caretStart ? 0 : position); case COMPOSE_CHANGE_MEDIA_ORDER: return state.update('media_attachments', list => { const indexA = list.findIndex(x => x.get('id') === action.a); diff --git a/app/javascript/mastodon/reducers/custom_emojis.js b/app/javascript/mastodon/reducers/custom_emojis.js deleted file mode 100644 index 47aa3edbbb6032..00000000000000 --- a/app/javascript/mastodon/reducers/custom_emojis.js +++ /dev/null @@ -1,17 +0,0 @@ -import { List as ImmutableList, fromJS as ConvertToImmutable } from 'immutable'; - -import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom_emojis'; -import { buildCustomEmojis } from '../features/emoji/emoji'; -import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light'; - -/** @type {ImmutableList} */ -const initialState = ImmutableList([]); - -export default function custom_emojis(state = initialState, action) { - if(action.type === CUSTOM_EMOJIS_FETCH_SUCCESS) { - state = ConvertToImmutable(action.custom_emojis); - emojiSearch('', { custom: buildCustomEmojis(state) }); - } - - return state; -} diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts index 8d83e38bb1e959..c2243424a57ee2 100644 --- a/app/javascript/mastodon/reducers/index.ts +++ b/app/javascript/mastodon/reducers/index.ts @@ -14,7 +14,6 @@ import { circlesReducer } from './circles'; import { composeReducer } from './compose'; import { contextsReducer } from './contexts'; import conversations from './conversations'; -import custom_emojis from './custom_emojis'; import { dropdownMenuReducer } from './dropdown_menu'; import filters from './filters'; import height_cache from './height_cache'; @@ -71,7 +70,6 @@ const reducers = { notifications, notificationGroups: notificationGroupsReducer, height_cache, - custom_emojis, lists: listsReducer, antennas: antennasReducer, circles: circlesReducer, diff --git a/app/javascript/mastodon/reducers/relationships.ts b/app/javascript/mastodon/reducers/relationships.ts index 9df81c75ea9903..c42d6271d78ccf 100644 --- a/app/javascript/mastodon/reducers/relationships.ts +++ b/app/javascript/mastodon/reducers/relationships.ts @@ -31,6 +31,7 @@ import { unblockDomainSuccess, } from '../actions/domain_blocks_typed'; import { notificationsUpdate } from '../actions/notifications_typed'; +import { isHideItem } from '../initial_state'; const initialState = ImmutableMap(); type State = typeof initialState; @@ -44,8 +45,17 @@ const normalizeRelationships = ( state: State, relationships: ApiRelationshipJSON[], ) => { + const isHideRelationships = isHideItem('relationships'); + relationships.forEach((relationship) => { - state = normalizeRelationship(state, relationship); + if (isHideRelationships) { + state = normalizeRelationship(state, { + ...relationship, + followed_by: false, + }); + } else { + state = normalizeRelationship(state, relationship); + } }); return state; diff --git a/app/javascript/mastodon/reducers/slices/collections.ts b/app/javascript/mastodon/reducers/slices/collections.ts index 47bbd5e6ba88de..c07a904ceea035 100644 --- a/app/javascript/mastodon/reducers/slices/collections.ts +++ b/app/javascript/mastodon/reducers/slices/collections.ts @@ -4,7 +4,8 @@ import { createSlice } from '@reduxjs/toolkit'; import { importFetchedAccounts } from '@/mastodon/actions/importer'; import { apiCreateCollection, - apiGetAccountCollections, + apiGetCollectionsCreatedByAccount, + apiGetCollectionsFeaturingAccount, apiUpdateCollection, apiGetCollection, apiDeleteCollection, @@ -16,6 +17,7 @@ import type { ApiCollectionJSON, ApiCreateCollectionPayload, ApiUpdateCollectionPayload, + CollectionAccountItem, } from '@/mastodon/api_types/collections'; import { me } from '@/mastodon/initial_state'; import { @@ -27,20 +29,35 @@ import { inputToHashtag } from '@/mastodon/utils/hashtags'; type QueryStatus = 'idle' | 'loading' | 'error'; +// Lists of collection ids and their loading status mapped by account id +type CollectionsByAccountId = Record< + string, + { + collectionIds: string[]; + status: QueryStatus; + } +>; + interface CollectionState { - // Collections mapped by collection id + // Full collections mapped by collection id collections: Record; - // Lists of collection ids mapped by account id - accountCollections: Record< - string, - { - collectionIds: string[]; - status: QueryStatus; - } - >; + // Collections created by an account, mapped by account id + createdBy: CollectionsByAccountId; + // Collections that feature an account, mapped by account id + featuring: CollectionsByAccountId; editor: EditorState; } +/** + * This is a subset of the `CollectionAccountItem` type + * for use in the editor. Here, `account_id` is always defined + * and `state` is more limited. + */ +export interface EditorCollectionItem { + account_id: string; + state: 'pending' | 'accepted'; +} + interface EditorState { id: string | null; name: string; @@ -49,7 +66,7 @@ interface EditorState { language: string | null; discoverable: boolean; sensitive: boolean; - accountIds: string[]; + items: EditorCollectionItem[]; } interface UpdateEditorFieldPayload { @@ -59,7 +76,8 @@ interface UpdateEditorFieldPayload { const initialState: CollectionState = { collections: {}, - accountCollections: {}, + createdBy: {}, + featuring: {}, editor: { id: null, name: '', @@ -68,7 +86,7 @@ const initialState: CollectionState = { language: null, discoverable: true, sensitive: false, - accountIds: [], + items: [], }, }; @@ -87,7 +105,7 @@ const collectionSlice = createSlice({ language: collection?.language ?? '', discoverable: collection?.discoverable ?? true, sensitive: collection?.sensitive ?? false, - accountIds: getCollectionItemIds(collection?.items ?? []), + items: getEditorCollectionItems(collection?.items ?? []), }; }, reset(state) { @@ -103,44 +121,101 @@ const collectionSlice = createSlice({ }, extraReducers(builder) { /** - * Fetching account collections + * Fetching collections created by account */ - builder.addCase(fetchAccountCollections.pending, (state, action) => { - const { accountId } = action.meta.arg; - state.accountCollections[accountId] ??= { - status: 'loading', - collectionIds: [], - }; - state.accountCollections[accountId].status = 'loading'; - }); - - builder.addCase(fetchAccountCollections.rejected, (state, action) => { - const { accountId } = action.meta.arg; - state.accountCollections[accountId] = { - status: 'error', - collectionIds: [], - }; - }); + builder.addCase( + fetchCollectionsCreatedByAccount.pending, + (state, action) => { + const { accountId } = action.meta.arg; + state.createdBy[accountId] ??= { + status: 'loading', + collectionIds: [], + }; + state.createdBy[accountId].status = 'loading'; + }, + ); - builder.addCase(fetchAccountCollections.fulfilled, (state, action) => { - const { collections } = action.payload; + builder.addCase( + fetchCollectionsCreatedByAccount.rejected, + (state, action) => { + const { accountId } = action.meta.arg; + state.createdBy[accountId] = { + status: 'error', + collectionIds: [], + }; + }, + ); - const collectionsMap: Record = - state.collections; - const collectionIds: string[] = []; + builder.addCase( + fetchCollectionsCreatedByAccount.fulfilled, + (state, action) => { + const { collections } = action.payload; + + const collectionsMap: Record = + state.collections; + const collectionIds: string[] = []; + + collections.forEach((collection) => { + const { id } = collection; + collectionsMap[id] = collection; + collectionIds.push(id); + }); + + state.collections = collectionsMap; + state.createdBy[action.meta.arg.accountId] = { + collectionIds, + status: 'idle', + }; + }, + ); + /** + * Fetching collections featuring an account + */ + builder.addCase( + fetchCollectionsFeaturingAccount.pending, + (state, action) => { + const { accountId } = action.meta.arg; + state.featuring[accountId] ??= { + status: 'loading', + collectionIds: [], + }; + state.featuring[accountId].status = 'loading'; + }, + ); - collections.forEach((collection) => { - const { id } = collection; - collectionsMap[id] = collection; - collectionIds.push(id); - }); + builder.addCase( + fetchCollectionsFeaturingAccount.rejected, + (state, action) => { + const { accountId } = action.meta.arg; + state.featuring[accountId] = { + status: 'error', + collectionIds: [], + }; + }, + ); - state.collections = collectionsMap; - state.accountCollections[action.meta.arg.accountId] = { - collectionIds, - status: 'idle', - }; - }); + builder.addCase( + fetchCollectionsFeaturingAccount.fulfilled, + (state, action) => { + const { collections } = action.payload; + + const collectionsMap: Record = + state.collections; + const collectionIds: string[] = []; + + collections.forEach((collection) => { + const { id } = collection; + collectionsMap[id] = collection; + collectionIds.push(id); + }); + + state.collections = collectionsMap; + state.featuring[action.meta.arg.accountId] = { + collectionIds, + status: 'idle', + }; + }, + ); /** * Fetching a single collection @@ -170,7 +245,7 @@ const collectionSlice = createSlice({ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete state.collections[collectionId]; if (me) { - let accountCollectionIds = state.accountCollections[me]?.collectionIds; + let accountCollectionIds = state.createdBy[me]?.collectionIds; if (accountCollectionIds) { accountCollectionIds = accountCollectionIds.filter( (id) => id !== collectionId, @@ -189,12 +264,12 @@ const collectionSlice = createSlice({ state.collections[collection.id] = collection; state.editor = initialState.editor; - if (state.accountCollections[collection.account_id]) { - state.accountCollections[collection.account_id]?.collectionIds.unshift( + if (state.createdBy[collection.account_id]) { + state.createdBy[collection.account_id]?.collectionIds.unshift( collection.id, ); } else { - state.accountCollections[collection.account_id] = { + state.createdBy[collection.account_id] = { collectionIds: [collection.id], status: 'idle', }; @@ -242,9 +317,16 @@ const collectionSlice = createSlice({ }, }); -export const fetchAccountCollections = createDataLoadingThunk( - `${collectionSlice.name}/fetchAccountCollections`, - ({ accountId }: { accountId: string }) => apiGetAccountCollections(accountId), +export const fetchCollectionsCreatedByAccount = createDataLoadingThunk( + `${collectionSlice.name}/fetchCollectionsCreatedByAccount`, + ({ accountId }: { accountId: string }) => + apiGetCollectionsCreatedByAccount(accountId), +); + +export const fetchCollectionsFeaturingAccount = createDataLoadingThunk( + `${collectionSlice.name}/fetchCollectionsFeaturingAccount`, + ({ accountId }: { accountId: string }) => + apiGetCollectionsFeaturingAccount(accountId), ); export const fetchCollection = createDataLoadingThunk( @@ -311,8 +393,8 @@ interface AccountCollectionQuery { export const selectAccountCollections = createAppSelector( [ - (_, accountId: string | null) => accountId, - (state) => state.collections.accountCollections, + (_, accountId?: string | null) => accountId, + (state, _, query: 'createdBy' | 'featuring') => state.collections[query], (state) => state.collections.collections, ], (accountId, collectionsByAccountId, collectionsMap) => { @@ -338,7 +420,12 @@ export const selectAccountCollections = createAppSelector( }, ); -const onlyExistingIds = (id?: string): id is string => !!id; +const isEditorItem = ( + item: Partial, +): item is EditorCollectionItem => + !!item.account_id && (item.state === 'accepted' || item.state === 'pending'); -export const getCollectionItemIds = (items?: ApiCollectionJSON['items']) => - items?.map((item) => item.account_id).filter(onlyExistingIds) ?? []; +export const getEditorCollectionItems = (items?: CollectionAccountItem[]) => + items + ?.map(({ account_id, state }) => ({ account_id, state })) + .filter(isEditorItem) ?? []; diff --git a/app/javascript/mastodon/selectors/user_lists.ts b/app/javascript/mastodon/selectors/user_lists.ts index 9d681aa2553e41..ed5a3271bacbcd 100644 --- a/app/javascript/mastodon/selectors/user_lists.ts +++ b/app/javascript/mastodon/selectors/user_lists.ts @@ -29,7 +29,7 @@ export const selectUserListWithoutMe = createAppSelector( .filter((id) => id !== currentAccountId) .toArray(), isLoading: !!list.get('isLoading', true), - hasMore: !!list.get('hasMore', false), + hasMore: !!list.get('next'), }; }, ); diff --git a/app/javascript/mastodon/utils/compare_urls.ts b/app/javascript/mastodon/utils/compare_urls.ts new file mode 100644 index 00000000000000..de4f6220e84a5c --- /dev/null +++ b/app/javascript/mastodon/utils/compare_urls.ts @@ -0,0 +1,14 @@ +export function compareUrls(href1: string, href2: string) { + try { + const url1 = new URL(href1); + const url2 = new URL(href2); + + return ( + url1.origin === url2.origin && + url1.pathname === url2.pathname && + url1.search === url2.search + ); + } catch { + return false; + } +} diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index 5f736fa80c5d90..cdcb88d68b9e78 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -12,13 +12,13 @@ export function isProduction() { else return import.meta.env.PROD; } -export type ServerFeatures = 'fasp' | 'collections' | 'profile_redesign'; +export type ServerFeatures = 'fasp' | 'collections'; export function isServerFeatureEnabled(feature: ServerFeatures) { return initialState?.features.includes(feature) ?? false; } -type ClientFeatures = 'collections'; +type ClientFeatures = never; export function isClientFeatureEnabled(feature: ClientFeatures) { try { diff --git a/app/javascript/mastodon/utils/has_react_children.ts b/app/javascript/mastodon/utils/has_react_children.ts new file mode 100644 index 00000000000000..f02762bacec1b6 --- /dev/null +++ b/app/javascript/mastodon/utils/has_react_children.ts @@ -0,0 +1,12 @@ +import { Children } from 'react'; +import type { ReactNode } from 'react'; + +export function hasReactChildren(children: ReactNode): boolean { + if (!children) { + return false; + } + + const childrenCount = Children.toArray(children).filter(Boolean).length; + + return childrenCount > 0; +} diff --git a/app/javascript/styles/entrypoints/mailer.scss b/app/javascript/styles/entrypoints/mailer.scss index fcbbd66f4c7747..725f4e4de41759 100644 --- a/app/javascript/styles/entrypoints/mailer.scss +++ b/app/javascript/styles/entrypoints/mailer.scss @@ -721,6 +721,52 @@ table + p { line-height: 24px; } +// Banner item +.email-banner-table { + border-radius: 12px; + background-color: #1b001f; + background-image: url('../../images/mailer-new/common/header-bg-start.png'); + background-position: left top; + background-repeat: repeat; +} + +.email-banner-td { + padding: 24px 24px 14px; +} + +.email-banner-text-td { + p { + margin: 0 0 12px; + color: #fff; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + } + + .email-desktop-flex { + align-items: center; + } + + .email-btn-table { + background-color: #fff; + } + + .email-btn-td { + mso-padding-alt: 10px; + } + + .email-btn-a { + color: #181820; + padding-left: 10px; + padding-right: 10px; + } + + div + div { + margin-inline-start: auto; + margin-bottom: 12px; + } +} + // Checklist item .email-checklist-wrapper-td { padding: 4px 0; diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index a8c3604dc5bb0c..c92c8d8cee0ed4 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -7,7 +7,7 @@ background: var(--color-bg-secondary); color: var(--color-text-primary); border-radius: 4px; - border: 1px solid var(--color-border-on-bg-secondary); + border: 1px solid var(--color-border-primary); font-size: 17px; line-height: normal; margin: 0; diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 7be64a4b0c2dc1..74b38d90f4eb20 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -13,7 +13,7 @@ &:active, &:focus { .card__bar { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } } @@ -221,43 +221,15 @@ .information-badge { &.superapp { color: var(--color-text-success); - background-color: var(--color-bg-success-softer); - border-color: var(--color-border-on-bg-success-softer); - } -} - -.account-role { - display: inline-flex; - padding: 4px; - padding-inline-end: 8px; - border: 1px solid var(--color-text-brand); - color: var(--color-text-brand); - font-weight: 500; - font-size: 12px; - letter-spacing: 0.5px; - line-height: 16px; - gap: 4px; - border-radius: 6px; - align-items: center; - - svg { - width: auto; - height: 15px; - opacity: 0.85; - fill: currentColor; - } - - &__domain { - font-weight: 400; - opacity: 0.75; - letter-spacing: 0; + background-color: var(--color-bg-success-softest); + border-color: var(--color-border-success-soft); } } .simple_form .not_recommended { color: var(--color-text-error); - background-color: var(--color-bg-error-softer); - border-color: var(--color-border-on-bg-error-softer); + background-color: var(--color-bg-error-softest); + border-color: var(--color-border-error-soft); } .simple_form .kmyblue { @@ -317,8 +289,8 @@ } .verified { - border: 1px solid var(--color-border-on-bg-success-softer); - background: var(--color-bg-success-softer); + border: 1px solid var(--color-border-success-soft); + background: var(--color-bg-success-softest); a { color: var(--color-text-success); diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index f3a50ad5062010..49e0fe5466f2c2 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -68,7 +68,7 @@ $content-width: 840px; border-radius: 4px; &:focus { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } .material-close { @@ -438,10 +438,57 @@ $content-width: 840px; } ul .simple-navigation-active-leaf a { - border-bottom-color: var(--color-text-brand); + border-bottom-color: var(--color-border-brand); } } } + + .callout { + display: flex; + align-items: start; + padding: 12px; + gap: 8px; + background-color: var(--color-bg-brand-softest); + color: var(--color-text-primary); + border-radius: 12px; + font-size: 15px; + margin-bottom: 30px; + + .icon { + padding: 4px; + border-radius: 9999px; + width: 1rem; + height: 1rem; + margin-top: -2px; + background-color: var(--color-bg-brand-soft); + } + + .content { + display: flex; + flex-direction: column; + gap: 8px; + flex-grow: 1; + padding: 0; + + @media screen and (width >= 630px) { + flex-direction: row; + } + } + + .body { + flex-grow: 1; + } + + .title { + font-weight: 600; + margin-bottom: 8px; + } + + a { + color: inherit; + font-weight: 600; + } + } } hr.spacer { @@ -499,7 +546,7 @@ body, kbd { font-family: Courier, monospace; - background-color: var(--color-bg-brand-softer); + background-color: var(--color-bg-brand-softest); padding: 4px; padding-bottom: 2px; border-radius: 5px; @@ -566,7 +613,7 @@ kbd { &.selected { color: var(--color-text-brand); - border-bottom: 2px solid var(--color-text-brand); + border-bottom: 2px solid var(--color-border-brand); } } } @@ -829,14 +876,14 @@ a.name-tag, .speech-bubble { margin-bottom: 20px; - border-inline-start: 4px solid var(--color-text-brand); + border-inline-start: 4px solid var(--color-border-brand); &.positive { border-color: var(--color-text-success); } &.negative { - border-color: var(--color-text-error); + border-color: var(--color-border-error); } &.warning { @@ -1059,27 +1106,15 @@ a.name-tag, text-decoration: none; margin-bottom: 10px; - &:hover { + &:where(a):where(:hover, :focus, :active) { color: var(--color-text-brand); } - - .account-role { - vertical-align: middle; - } } .icon { vertical-align: middle; } - a.announcements-list__item__title { - &:hover, - &:focus, - &:active { - color: var(--color-text-primary); - } - } - &__action-bar { display: flex; justify-content: space-between; @@ -1305,7 +1340,7 @@ a.sparkline { &:hover, &:focus, &:active { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } @@ -1929,7 +1964,7 @@ a.sparkline { width: calc(1.375rem + 1px); height: calc(1.375rem + 1px); background: var(--color-bg-primary); - border: 1px solid var(--color-text-brand); + border: 1px solid var(--color-border-brand); color: var(--color-text-brand); border-radius: 8px; } @@ -2013,8 +2048,8 @@ a.sparkline { display: block; box-sizing: border-box; color: var(--color-text-primary); - background: var(--color-bg-brand-softer); - border: 1px solid var(--color-border-on-bg-brand-softer); + background: var(--color-bg-brand-softest); + border: 1px solid var(--color-border-brand-soft); border-radius: 8px; padding: 8px 13px; position: relative; diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index c648acdbdfeb36..4d4e9ddded6e12 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -2,13 +2,13 @@ html { color: var(--color-text-primary); - background: var(--color-bg-ambient); + background: var(--color-bg-primary); &.custom-scrollbars { scrollbar-color: var(--color-text-secondary) var(--color-bg-secondary); } - --outline-focus-default: 2px solid var(--color-text-brand); + --outline-focus-default: 2px solid var(--color-border-brand); --avatar-border-radius: 8px; --max-media-height-small: 460px; --max-media-height-large: 566px; @@ -84,7 +84,7 @@ html.has-modal { body { font-family: $font-sans-serif, sans-serif; - background: var(--color-bg-ambient); + background: var(--color-bg-primary); font-size: 13px; line-height: 18px; font-weight: 400; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 253f053c15986f..71d004e2c8c134 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -114,7 +114,7 @@ } &:focus-visible { - outline: 2px solid var(--color-bg-brand-base); + outline: var(--outline-focus-default); outline-offset: 2px; } @@ -169,12 +169,12 @@ color: var(--color-text-brand); background: transparent; padding: 6px 17px; - border: 1px solid var(--color-text-brand); + border: 1px solid var(--color-border-brand); &:active, &:focus, &:hover { - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); color: var(--color-text-brand); background-color: transparent; text-decoration: none; @@ -184,7 +184,7 @@ &:active, &:focus, &:hover { - border-color: var(--color-text-error); + border-color: var(--color-border-error); color: var(--color-text-error); } } @@ -284,8 +284,8 @@ --default-icon-color: var(--color-text-secondary); --default-bg-color: transparent; --hover-icon-color: var(--color-text-primary); - --hover-bg-color: var(--color-bg-brand-softer); - --focus-outline-color: var(--color-text-brand); + --hover-bg-color: var(--color-bg-brand-softest); + --focus-outline-color: var(--color-border-brand); display: inline-flex; color: var(--default-icon-color); @@ -364,8 +364,8 @@ &.copied { color: var(--color-text-success); transition: none; - background-color: var(--color-bg-success-softer); - border-color: var(--color-border-on-bg-brand-softer); + background-color: var(--color-bg-success-softest); + border-color: var(--color-border-success-soft); } } @@ -537,21 +537,21 @@ body > [data-popper-placement] { flex-direction: column; flex: 0 1 auto; border-radius: 4px; - border: 1px solid var(--color-border-on-bg-secondary); + border: 1px solid var(--color-border-primary); transition: border-color 300ms linear; position: relative; background: var(--color-bg-secondary); &.active { transition: none; - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); } } &__warning { color: var(--color-text-primary); - background: var(--color-bg-warning-softer); - border: 1px solid var(--color-border-on-bg-warning-softer); + background: var(--color-bg-warning-softest); + border: 1px solid var(--color-border-warning-soft); padding: 8px 10px; border-radius: 4px; font-size: 13px; @@ -623,7 +623,7 @@ body > [data-popper-placement] { .spoiler-input__input { padding: 12px 12px - 5px; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); color: var(--color-text-brand); } @@ -906,7 +906,7 @@ body > [data-popper-placement] { line-height: 20px; letter-spacing: 0.1px; color: var(--color-text-brand); - background-color: var(--color-bg-secondary-solid); + background-color: var(--color-bg-secondary); white-space: nowrap; text-overflow: ellipsis; overflow: hidden; @@ -938,7 +938,7 @@ body > [data-popper-placement] { gap: 4px; color: var(--color-text-brand); background: transparent; - border: 1px solid var(--color-text-brand); + border: 1px solid var(--color-border-brand); border-radius: 6px; padding: 4px 8px; font-size: 13px; @@ -1488,9 +1488,9 @@ body > [data-popper-placement] { .focusable { &:focus-visible { - outline: 2px solid var(--color-text-brand); + outline: 2px solid var(--color-border-brand); outline-offset: -2px; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } @@ -1523,8 +1523,9 @@ body > [data-popper-placement] { .media-gallery, .video-player, .audio-player, - .attachment-list { - margin-top: 16px; + .attachment-list, + .collection-preview { + margin-top: 14px; } &--in-thread { @@ -1542,6 +1543,7 @@ body > [data-popper-placement] { & > .picture-in-picture-placeholder, & > .more-from-author, & > .status-card, + & > .collection-preview, & > .hashtag-bar, & > .content-warning, & > .filter-warning, @@ -1616,7 +1618,7 @@ body > [data-popper-placement] { content: ''; position: absolute; inset: 0; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); opacity: 0; animation: fade 0.7s reverse both 0.3s; pointer-events: none; @@ -1768,7 +1770,7 @@ body > [data-popper-placement] { .notification-ungrouped--direct, .notification-group--direct, .notification-group--annual-report { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); &:focus { background: var(--color-bg-brand-soft); @@ -1860,7 +1862,8 @@ body > [data-popper-placement] { .media-gallery, .video-player, - .audio-player { + .audio-player, + .collection-preview { margin-top: 16px; } @@ -1956,7 +1959,7 @@ body > [data-popper-placement] { .detailed-status__wrapper-direct { .detailed-status, .detailed-status__action-bar { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } .status__prepend { @@ -2011,7 +2014,7 @@ body > [data-popper-placement] { line-height: 20px; letter-spacing: 0.25px; color: var(--color-text-secondary); - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); border-radius: 8px; cursor: default; } @@ -2090,7 +2093,15 @@ body > [data-popper-placement] { } .account { - padding: 16px; + --account-outer-spacing: 16px; + --account-name-color: var(--color-text-primary); + --account-name-size: 14px; + --account-handle-color: var(--color-text-secondary); + --account-handle-size: 14px; + --account-bio-color: var(--color-text-secondary); + --account-bio-size: 14px; + + padding: var(--account-outer-spacing); // Using :where keeps specificity low, allowing for existing // .account overrides to still apply @@ -2103,10 +2114,10 @@ body > [data-popper-placement] { display: flex; align-items: center; gap: 10px; - color: var(--color-text-secondary); + color: var(--account-handle-color); overflow: hidden; text-decoration: none; - font-size: 14px; + font-size: var(--account-handle-size); .display-name { margin-bottom: 4px; @@ -2114,7 +2125,8 @@ body > [data-popper-placement] { .display-name strong { display: inline; - color: var(--color-text-primary); + font-size: var(--account-name-size); + color: var(--account-name-color); } } @@ -2139,7 +2151,7 @@ body > [data-popper-placement] { &__domain-pill { display: inline-flex; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); border-radius: 4px; border: 0; color: var(--color-text-brand); @@ -2200,7 +2212,7 @@ body > [data-popper-placement] { &__handle { border: 2px dashed var(--color-border-on-brand-softer); - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); padding: 12px 8px; color: var(--color-text-brand); border-radius: 4px; @@ -2262,7 +2274,7 @@ body > [data-popper-placement] { } &__note { - font-size: 14px; + font-size: var(--account-bio-size); font-weight: 400; overflow: hidden; text-overflow: ellipsis; @@ -2271,7 +2283,7 @@ body > [data-popper-placement] { -webkit-line-clamp: 1; -webkit-box-orient: vertical; margin-top: 10px; - color: var(--color-text-secondary); + color: var(--account-bio-color); &--missing { color: var(--color-text-tertiary); @@ -2997,11 +3009,15 @@ a.account__display-name { &:focus, &:hover, &:active { - &:not(:disabled, [aria-disabled='true']) { - background: var(--color-bg-secondary); + &:where(:not(:disabled, [aria-disabled='true'])) { + background: var(--color-bg-brand-softest); outline: 0; } } + + &:focus-visible { + outline: var(--outline-focus-default); + } } button:disabled, @@ -3178,7 +3194,7 @@ a.account__display-name { } &:focus-visible { - border-top-color: var(--color-text-brand); + border-top-color: var(--color-border-brand); border-radius: 0; } } @@ -3193,7 +3209,7 @@ a.account__display-name { border-top: 0; @media screen and (min-width: $no-gap-breakpoint) { - border-top: 10px solid var(--color-bg-ambient); + border-top: 10px solid var(--color-bg-primary); } } @@ -3697,7 +3713,7 @@ a.account__display-name { &.focused { transition: none; outline: 0; - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); } &.copied { @@ -4097,25 +4113,14 @@ a.account__display-name { height: 20px; padding: 0; border-radius: 10px; - background-color: rgb(from var(--color-bg-brand-softer) r g b / 50%); - border: 1px solid rgb(from var(--color-text-brand) r g b / 50%); + background-color: var(--color-bg-tertiary); + border: 1px solid var(--color-border-primary); box-sizing: border-box; - .react-toggle:hover:not(.react-toggle--disabled) & { - background-color: rgb( - from var(--color-bg-brand-softer) r g b / - calc(50% + var(--overlay-strength-brand)) - ); - } - .react-toggle--checked & { background-color: var(--color-bg-brand-base); border-color: var(--color-bg-brand-base); } - - .react-toggle--checked:not(.react-toggle--disabled):hover & { - background-color: var(--color-bg-brand-base-hover); - } } .react-toggle-track-check, @@ -4131,6 +4136,7 @@ a.account__display-name { height: 16px; border-radius: 50%; background-color: var(--color-text-on-brand-base); + box-shadow: 0 2px 4px 0 color-mix(var(--color-black), transparent 75%); box-sizing: border-box; transition: all 0.25s ease; transition-property: border-color, left; @@ -4192,8 +4198,8 @@ a.account__display-name { &:focus-visible { outline: none; - border-color: var(--color-text-brand); - background: var(--color-bg-brand-softer); + border-color: var(--color-border-brand); + background: var(--color-bg-brand-softest); } &--logo { @@ -4219,22 +4225,6 @@ a.account__display-name { margin: -6px 10px; } -.column-link__command { - position: absolute; - right: 0; - z-index: 1; -} - -.column-subheading { - background: var(--color-bg-secondary); - color: var(--color-text-secondary); - padding: 8px 20px; - font-size: 12px; - font-weight: 500; - text-transform: uppercase; - cursor: default; -} - .getting-started__wrapper { flex: 0 0 auto; } @@ -4646,7 +4636,7 @@ a.status-card { } &:focus-visible { - outline: 2px solid var(--color-text-brand); + outline: var(--outline-focus-default); outline-offset: -2px; } } @@ -4734,7 +4724,7 @@ a.status-card { z-index: 1; &.active { - box-shadow: 0 1px 0 var(--color-bg-brand-softer); + box-shadow: 0 1px 0 var(--color-bg-brand-softest); &::before { display: block; @@ -4848,7 +4838,7 @@ a.status-card { &.active { .column-header__icon { color: var(--color-text-brand); - text-shadow: 0 0 10px var(--color-bg-brand-softer); + text-shadow: 0 0 10px var(--color-bg-brand-softest); } } @@ -5351,7 +5341,7 @@ a.status-card { &:hover, &:active, &:focus { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); color: color-mix( in oklab, var(--color-text-primary), @@ -6076,7 +6066,7 @@ a.status-card { .visibility-modal { &__quote-warning { color: var(--color-text-primary); - background: var(--color-bg-warning-softer); + background: var(--color-bg-warning-softest); padding: 16px; border-radius: 4px; @@ -6111,7 +6101,7 @@ a.status-card { display: flex; align-items: center; color: var(--color-text-primary); - background: var(--color-bg-secondary-solid); + background: var(--color-bg-secondary); border: 1px solid var(--color-border-primary); padding: 8px 12px; width: 100%; @@ -6172,7 +6162,8 @@ a.status-card { .icon-button { padding: 0; - color: var(--color-text-secondary); + + --default-icon-color: inherit; } .icon { @@ -6225,7 +6216,10 @@ a.status-card { background: var(--color-bg-brand-base); .icon-button { - color: inherit; + --default-icon-color: inherit; + --default-bg-color: transparent; + --hover-icon-color: inherit; + --hover-bg-color: var(--color-bg-brand-base-hover); } } @@ -6324,7 +6318,7 @@ a.status-card { } &:focus-visible { - box-shadow: 0 0 0 2px var(--color-text-brand); + box-shadow: 0 0 0 2px var(--color-border-brand); } &[aria-hidden='true'] { @@ -6578,9 +6572,7 @@ a.status-card { --default-icon-color: var(--color-text-on-media); --default-bg-color: transparent; --hover-icon-color: var(--color-text-on-media); - --hover-bg-color: rgb( - from var(--color-text-on-media) r g b / var(--overlay-strength-brand) - ); + --hover-bg-color: rgb(from var(--color-text-on-media) r g b / 10%); .icon { filter: var(--overlay-icon-shadow); @@ -6596,8 +6588,7 @@ a.status-card { --default-icon-color: var(--color-text-favourite-highlight); --hover-icon-color: var(--color-text-favourite-highlight); --hover-bg-color: rgb( - from var(--color-text-favourite-highlight) r g b / - var(--overlay-strength-brand) + from var(--color-text-favourite-highlight) r g b / 10% ); } @@ -6697,7 +6688,7 @@ a.status-card { &__top { border-radius: 16px 16px 0 0; - border-bottom: 0; + border-bottom-width: 0; gap: 16px; } @@ -7242,7 +7233,7 @@ a.status-card { } .button.button-secondary { - border-color: var(--color-text-error); + border-color: var(--color-border-error); color: var(--color-text-error); flex: 0 0 auto; @@ -7310,7 +7301,7 @@ a.status-card { &:hover, &:active, &:focus { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } } @@ -7777,7 +7768,7 @@ a.status-card { inset: 2px; z-index: 1; border-radius: inherit; - border: 2px solid var(--color-text-on-inverted); + border: 2px solid var(--color-text-inverted); outline: 2px solid var(--color-bg-inverted); pointer-events: none; } @@ -8496,7 +8487,7 @@ a.status-card { &.checked, &.indeterminate { - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); } .icon { @@ -8882,16 +8873,6 @@ noscript { } } - &__badges { - display: flex; - flex-wrap: wrap; - gap: 8px; - - .account-role { - line-height: unset; - } - } - &__tabs { display: flex; align-items: flex-start; @@ -9172,24 +9153,10 @@ noscript { } &:focus { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } } - - &__familiar-followers { - display: flex; - align-items: center; - gap: 10px; - margin-block: 16px; - color: var(--color-text-secondary); - - a:any-link { - font-weight: 500; - text-decoration: none; - color: var(--color-text-primary); - } - } } .account__contents { @@ -9199,6 +9166,7 @@ noscript { .account__details { display: flex; flex-wrap: wrap; + align-items: center; column-gap: 1em; } @@ -9434,7 +9402,7 @@ noscript { } &__root { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); font-size: 13px; display: flex; align-items: flex-end; @@ -9518,13 +9486,13 @@ noscript { &__item { flex-shrink: 0; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); color: color-mix( in oklab, var(--color-text-primary), var(--color-text-secondary) ); - border: 1px solid var(--color-border-on-bg-brand-softer); + border: 1px solid var(--color-border-brand-soft); border-radius: 3px; box-sizing: border-box; margin: 2px; @@ -9573,8 +9541,8 @@ noscript { &.active { color: var(--color-text-brand); - background-color: var(--color-bg-brand-softer); - border-color: var(--color-text-brand); + background-color: var(--color-bg-brand-softest); + border-color: var(--color-border-brand); transition: all 100ms ease-in; transition-property: background-color, color; } @@ -9637,7 +9605,7 @@ noscript { inset-inline-start: 0; width: 100%; height: 100%; - border-inline-start: 4px solid var(--color-text-brand); + border-inline-start: 4px solid var(--color-border-brand); pointer-events: none; } } @@ -10160,7 +10128,7 @@ noscript { } &.invalid &__input { - border-color: var(--color-text-error); + border-color: var(--color-border-error); } &.expanded .search__popout { @@ -10431,8 +10399,8 @@ noscript { margin: 10px; margin-bottom: 5px; border-radius: 8px; - border: 1px solid var(--color-border-on-bg-brand-softer); - background: var(--color-bg-brand-softer); + border: 1px solid var(--color-border-brand-soft); + background: var(--color-bg-brand-softest); overflow: hidden; flex-shrink: 0; @@ -10498,8 +10466,8 @@ noscript { } .warning-banner { - border: 1px solid var(--color-border-on-bg-error-softer); - background: var(--color-bg-error-softer); + border: 1px solid var(--color-border-error-soft); + background: var(--color-bg-error-softest); &__message { h1 { @@ -10829,7 +10797,7 @@ noscript { width: auto; padding: 15px; margin: 0; - color: var(--color-text-on-inverted); + color: var(--color-text-inverted); background: var(--color-bg-inverted); backdrop-filter: blur(8px); border-radius: 8px; @@ -10881,9 +10849,13 @@ noscript { padding: 0 4px; &:hover, - &:focus, &:active { - background: var(--color-bg-brand-softer); + background: rgb(from var(--color-text-inverted) r g b / 10%); + } + + &:focus-visible { + outline: 2px solid var(--color-text-brand-on-inverted); + outline-offset: 2px; } } @@ -10985,13 +10957,16 @@ noscript { color: inherit; text-decoration: none; padding: 4px 12px; - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); border-radius: 4px; font-weight: 500; &:hover, &:focus, - &:active { + &:active, + .focusable:focus-visible &, + .detailed-status__wrapper-direct .detailed-status &, + .status__wrapper-direct & { background: var(--color-bg-brand-soft); } } @@ -11011,10 +10986,10 @@ noscript { padding: 16px 0; padding-bottom: 0; border-bottom: 1px solid var(--color-border-primary); - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); &.focusable:focus-visible { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } &__header { @@ -11154,23 +11129,7 @@ noscript { } &__source { - display: inline-flex; - align-items: center; - color: var(--color-text-tertiary); - gap: 4px; - overflow: hidden; - white-space: nowrap; cursor: help; - - > span { - overflow: hidden; - text-overflow: ellipsis; - } - - .icon { - width: 16px; - height: 16px; - } } } @@ -11196,11 +11155,6 @@ noscript { } } - .verified-badge { - font-size: 14px; - max-width: 100%; - } - .button { display: block; width: 100%; @@ -11376,12 +11330,6 @@ noscript { color: var(--color-text-secondary); } - & > span { - display: flex; - align-items: center; - gap: 8px; - } - a { display: inline-flex; align-items: center; @@ -11695,7 +11643,7 @@ noscript { inset-inline-start: 0; width: 100%; height: 100%; - border-inline-start: 4px solid var(--color-text-brand); + border-inline-start: 4px solid var(--color-border-brand); pointer-events: none; } } @@ -11892,8 +11840,8 @@ noscript { display: block; box-sizing: border-box; color: var(--color-text-primary); - background: var(--color-bg-brand-softer); - border: 1px solid var(--color-border-on-bg-brand-softer); + background: var(--color-bg-brand-softest); + border: 1px solid var(--color-border-brand-soft); border-radius: 8px; padding: 8px (5px + 8px); position: relative; diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss index db3f0e8a8425e9..014021394b83ef 100644 --- a/app/javascript/styles/mastodon/dashboard.scss +++ b/app/javascript/styles/mastodon/dashboard.scss @@ -30,7 +30,7 @@ &:hover, &:focus, &:active { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } } @@ -100,12 +100,12 @@ } &.positive { - background: var(--color-bg-success-softer); + background: var(--color-bg-success-softest); color: var(--color-text-success); } &.negative { - background: var(--color-bg-error-softer); + background: var(--color-bg-error-softest); color: var(--color-text-error); } diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss index 7e11f0e91bb9a3..52eb6d8eca0f6f 100644 --- a/app/javascript/styles/mastodon/emoji_picker.scss +++ b/app/javascript/styles/mastodon/emoji_picker.scss @@ -173,7 +173,7 @@ inset-inline-start: 0; width: 100%; height: 100%; - background-color: var(--color-bg-brand-softer); + background-color: var(--color-bg-brand-softest); border-radius: 100%; } } diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 5066e8922d1fac..9ad4f9653dad30 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -32,7 +32,7 @@ code { display: block; background: linear-gradient( to bottom, - var(--color-bg-secondary-solid), + var(--color-bg-secondary), transparent ); position: absolute; @@ -585,7 +585,7 @@ code { input[type='datetime-local'] { &:focus:user-invalid:not(:placeholder-shown), &:required:user-invalid:not(:placeholder-shown) { - border-color: var(--color-text-error); + border-color: var(--color-border-error); } } @@ -775,7 +775,7 @@ code { input[type='datetime-local'], textarea, select { - border-color: var(--color-text-error); + border-color: var(--color-border-error); } } @@ -813,27 +813,27 @@ code { .flash-message { color: var(--color-text-brand); background: transparent; - border: 1px solid var(--color-text-brand); + border: 1px solid var(--color-border-brand); border-radius: 4px; padding: 15px 10px; margin-bottom: 30px; text-align: center; &.notice { - border: 1px solid var(--color-border-on-bg-success-softer); - background: var(--color-bg-success-softer); + border: 1px solid var(--color-border-success-soft); + background: var(--color-bg-success-softest); color: var(--color-text-success); } &.warning { - border: 1px solid var(--color-border-on-bg-warning-softer); - background: var(--color-bg-warning-softer); + border: 1px solid var(--color-border-warning-soft); + background: var(--color-bg-warning-softest); color: var(--color-text-warning); } &.alert { - border: 1px solid var(--color-border-on-bg-error-softer); - background: var(--color-bg-error-softer); + border: 1px solid var(--color-border-error-soft); + background: var(--color-bg-error-softest); color: var(--color-text-error); } @@ -899,7 +899,7 @@ code { } &:focus { - background: var(--color-bg-brand-softer); + background: var(--color-bg-brand-softest); } } @@ -1389,7 +1389,7 @@ code { cursor: pointer; &:hover { - background-color: var(--color-bg-brand-softer); + background-color: var(--color-bg-brand-softest); } img { @@ -1420,7 +1420,7 @@ code { } &.invalid img { - outline: 1px solid var(--color-text-error); + outline: 1px solid var(--color-border-error); outline-offset: -1px; } @@ -1430,7 +1430,7 @@ code { width: 100%; height: 100%; position: absolute; - background: var(--color-bg-error-softer); + background: var(--color-bg-error-softest); z-index: 2; border-radius: 8px; } diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss index 6af2a182b63449..203f68f895e937 100644 --- a/app/javascript/styles/mastodon/modal.scss +++ b/app/javascript/styles/mastodon/modal.scss @@ -1,7 +1,7 @@ @use 'variables' as *; .modal-layout { - background: var(--color-bg-brand-softer); + background: var(--color-bg-primary); display: flex; flex-direction: column; height: 100vh; @@ -37,12 +37,14 @@ } .with-zig-zag-decoration { + isolation: isolate; + &::after { content: ''; position: absolute; inset: auto 0 0; height: 32px; - background-color: var(--color-bg-brand-softer); + background-color: var(--color-bg-brand-softest); /* Decorative zig-zag pattern at the bottom of the page */ mask-image: url('data:image/svg+xml;utf8,'); diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index 19fb8dd505f72b..ce7f51f8cdbcef 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -86,7 +86,7 @@ padding: 8px 12px; &:focus { - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); } @media screen and (width <= 600px) { diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index 8369def4dcbc9c..d18399ef78ab04 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -93,6 +93,26 @@ } } + &.mini-table { + border-top: 1px solid var(--color-border-primary); + width: 50%; + + & > tbody > tr > th, + & > tbody > tr > td { + padding: 12px 0; + } + + & > tbody > tr > th { + color: var(--color-text-secondary); + font-weight: 400; + } + + & > tbody > tr > td { + color: var(--color-text-primary); + font-weight: 600; + } + } + &.batch-table { & > thead > tr > th { background: var(--color-bg-primary); diff --git a/app/javascript/styles/mastodon/theme/_base.scss b/app/javascript/styles/mastodon/theme/_base.scss index 85fd0dab453c29..9b39f1b02e1809 100644 --- a/app/javascript/styles/mastodon/theme/_base.scss +++ b/app/javascript/styles/mastodon/theme/_base.scss @@ -1,40 +1,69 @@ @mixin palette { + --color-white: #fff; --color-black: #000; - --color-grey-950: #181820; - --color-grey-800: #3a3a50; - --color-grey-700: #44445f; - --color-grey-600: #535374; - --color-grey-500: #67678e; - --color-grey-400: #88a; - --color-grey-300: #b2b1c8; - --color-grey-200: #d7d6e1; - --color-grey-100: #eeedf3; + + // Grey --color-grey-50: #f6f6f9; - --color-white: #fff; - --color-indigo-700: #5638cc; - --color-indigo-600: #6147e6; - --color-indigo-400: #8280f9; - --color-indigo-300: #a5abfd; - --color-indigo-200: #c8cdfe; - --color-indigo-100: #e0e3ff; + --color-grey-100: #eeedf3; + --color-grey-200: #d7d6e1; + --color-grey-300: #b2b1c8; + --color-grey-400: #88a; + --color-grey-500: #67678e; + --color-grey-600: #535374; + --color-grey-700: #44445f; + --color-grey-800: #3a3a50; + --color-grey-900: #21212c; + --color-grey-950: #181820; + + // Indigo --color-indigo-50: #f0f1ff; + --color-indigo-100: #e0e3ff; + --color-indigo-200: #c8cdfe; + --color-indigo-300: #a5abfd; + --color-indigo-400: #8280f9; + --color-indigo-500: #7263f2; + --color-indigo-600: #6147e6; + --color-indigo-700: #5638cc; + --color-indigo-800: #48359c; + --color-indigo-900: #3d317c; + --color-indigo-950: #261e48; + + // Red --color-red-50: #fef2f2; --color-red-100: #ffe2e2; + --color-red-200: #ffc9c9; --color-red-300: #ffa2a2; + --color-red-400: #ff6467; + --color-red-500: #fb2c36; + --color-red-600: #e7000b; + --color-red-700: #c10007; --color-red-800: #9f0712; --color-red-900: #82181a; --color-red-950: #460809; + + // Yellow --color-yellow-50: #fffbeb; --color-yellow-100: #fef3c6; + --color-yellow-200: #fee685; + --color-yellow-300: #ffd230; --color-yellow-400: #ffb900; + --color-yellow-500: #fe9a00; --color-yellow-600: #e17100; --color-yellow-700: #bb4d00; + --color-yellow-800: #973c00; --color-yellow-900: #7b3306; --color-yellow-950: #461901; + + // Green --color-green-50: #f0fdf4; --color-green-100: #dcfce7; + --color-green-200: #b9f8cf; + --color-green-300: #7bf1a8; --color-green-400: #05df72; + --color-green-500: #00c950; --color-green-600: #00a63e; + --color-green-700: #008236; + --color-green-800: #016630; --color-green-900: #0d542b; --color-green-950: #032e15; } diff --git a/app/javascript/styles/mastodon/theme/_dark.scss b/app/javascript/styles/mastodon/theme/_dark.scss index fd0c315c3e19bb..410833f25d2eb4 100644 --- a/app/javascript/styles/mastodon/theme/_dark.scss +++ b/app/javascript/styles/mastodon/theme/_dark.scss @@ -5,150 +5,89 @@ --color-text-primary: var(--color-grey-100); --color-text-secondary: var(--color-grey-300); - --color-text-tertiary: var(--color-grey-400); - --color-text-on-inverted: var(--color-grey-950); + --color-text-tertiary: var(--color-grey-400); // legacy + --color-text-inverted: var(--color-grey-950); --color-text-brand: var(--color-indigo-300); --color-text-brand-soft: color-mix( in oklab, var(--color-text-primary), var(--color-text-brand) - ); + ); // legacy + --color-text-on-brand-base: var(--color-white); - --color-text-brand-on-inverted: var(--color-indigo-600); + --color-text-brand-on-inverted: var(--color-indigo-600); // legacy --color-text-error: var(--color-red-300); --color-text-on-error-base: var(--color-white); --color-text-warning: var(--color-yellow-400); --color-text-on-warning-base: var(--color-white); --color-text-success: var(--color-green-400); --color-text-on-success-base: var(--color-white); - --color-text-disabled: var(--color-grey-600); - --color-text-on-disabled: var(--color-grey-400); - --color-text-bookmark-highlight: var(--color-text-error); - --color-text-favourite-highlight: var(--color-text-warning); - --color-text-on-media: var(--color-white); + --color-text-disabled: var(--color-grey-600); // legacy + --color-text-on-disabled: var(--color-grey-400); // legacy + --color-text-bookmark-highlight: var(--color-text-error); // legacy + --color-text-favourite-highlight: var(--color-text-warning); // legacy + --color-text-on-media: var(--color-white); // legacy --color-text-status-links: color-mix( in oklab, var(--color-text-primary), var(--color-text-secondary) - ); + ); // legacy /* BACKGROUND TOKENS */ // Neutrals --color-bg-primary: var(--color-grey-950); --overlay-strength-secondary: 4%; - --color-bg-secondary-base: var(--color-white); - --color-bg-secondary: #{utils.css-alpha( - var(--color-bg-secondary-base), - var(--overlay-strength-secondary) - )}; - --color-bg-secondary-solid: color-mix( - in srgb, - var(--color-bg-primary), - var(--color-bg-secondary-base) var(--overlay-strength-secondary) - ); - --color-bg-tertiary: color-mix( - in oklab, - var(--color-bg-primary), - var(--color-bg-secondary-base) calc(2 * var(--overlay-strength-secondary)) - ); + --color-bg-secondary: var(--color-grey-900); + --color-bg-tertiary: var(--color-grey-800); // legacy // Utility - --color-bg-ambient: var(--color-bg-primary); --color-bg-inverted: var(--color-grey-50); - --color-bg-media-base: var(--color-black); - --color-bg-media-strength: 65%; - --color-bg-media: #{utils.css-alpha( - var(--color-bg-media-base), - var(--color-bg-media-strength) - )}; - --color-bg-overlay: var(--color-black); - --color-bg-disabled: var(--color-grey-700); + --color-bg-overlay-base: #{utils.css-alpha(var(--color-grey-950), 60%)}; + --color-bg-overlay-highlight: #{utils.css-alpha(var(--color-white), 5%)}; + --color-bg-overlay: var(--color-black); // legacy + --color-bg-media-base: var(--color-black); // legacy + --color-bg-media: #{utils.css-alpha(var(--color-bg-media-base), 65%)}; // legacy + --color-bg-disabled: var(--color-grey-700); // legacy // Brand - --overlay-strength-brand: 22%; --color-bg-brand-base: var(--color-indigo-700); - --color-bg-brand-base-hover: color-mix( - in oklab, - var(--color-bg-brand-base), - var(--color-bg-primary) var(--overlay-strength-brand) - ); - --color-bg-brand-soft: #{utils.css-alpha( - #6f4df5, - calc(var(--overlay-strength-brand) * 2) - )}; - --color-bg-brand-softer: #{utils.css-alpha( - var(--color-bg-brand-base), - var(--overlay-strength-brand) - )}; - --color-bg-brand-softer-solid: color-mix( - in srgb, - var(--color-bg-primary), - var(--color-bg-brand-base) var(--overlay-strength-brand) - ); + --color-bg-brand-base-hover: var(--color-indigo-800); // legacy + --color-bg-brand-soft: var(--color-indigo-900); + --color-bg-brand-softest: var(--color-indigo-950); // Error - --overlay-strength-error: 10%; - --color-bg-error-base: var(--color-red-800); - --color-bg-error-base-hover: color-mix( - in oklab, - var(--color-bg-error-base), - var(--color-bg-primary) var(--overlay-strength-error) - ); + --color-bg-error-base: var(--color-red-700); + --color-bg-error-base-hover: var(--color-red-800); // legacy --color-bg-error-soft: var(--color-red-900); - --color-bg-error-softer: var(--color-red-950); + --color-bg-error-softest: var(--color-red-950); // Warning - --overlay-strength-warning: 10%; - --color-bg-warning-base: var(--color-yellow-700); - --color-bg-warning-base-hover: color-mix( - in oklab, - var(--color-bg-warning-base), - var(--color-bg-primary) var(--overlay-strength-warning) - ); + --color-bg-warning-base: var(--color-yellow-700); // legacy --color-bg-warning-soft: var(--color-yellow-900); - --color-bg-warning-softer: var(--color-yellow-950); + --color-bg-warning-softest: var(--color-yellow-950); // Success - --overlay-strength-success: 15%; - --color-bg-success-base: var(--color-green-600); - --color-bg-success-base-hover: color-mix( - in oklab, - var(--color-bg-success-base), - var(--color-bg-primary) var(--overlay-strength-success) - ); + --color-bg-success-base: var(--color-green-600); // legacy --color-bg-success-soft: var(--color-green-900); - --color-bg-success-softer: var(--color-green-950); + --color-bg-success-softest: var(--color-green-950); /* BORDER TOKENS */ - --border-strength-primary: 18%; - --color-border-primary: #{utils.css-alpha( - var(--color-indigo-200), - var(--border-strength-primary) - )}; - --color-border-media: rgb(252 248 255 / 15%); - --color-border-verified: rgb(220, 3, 240); - --color-border-on-bg-secondary: #{utils.css-alpha( - var(--color-indigo-200), - calc(var(--border-strength-primary) / 1.5) - )}; - --color-border-on-bg-brand-softer: var(--color-border-primary); - --color-border-on-bg-error-softer: #{utils.css-alpha( - var(--color-text-error), - 50% - )}; - --color-border-on-bg-warning-softer: #{utils.css-alpha( + --color-border-primary: var(--color-grey-800); + --color-border-brand: var(--color-text-brand); + --color-border-brand-soft: var(--color-indigo-800); + --color-border-error: var(--color-red-300); + --color-border-media: rgb(252 248 255 / 15%); // legacy + --color-border-error-soft: #{utils.css-alpha(var(--color-border-error), 50%)}; // legacy + --color-border-warning-soft: #{utils.css-alpha( var(--color-text-warning), 50% - )}; - --color-border-on-bg-success-softer: #{utils.css-alpha( - var(--color-text-success), - 50% - )}; - --color-border-on-bg-inverted: var(--color-border-primary); + )}; // legacy + + --color-border-success-soft: var(--color-green-800); - /* SHADOW TOKENS */ + /* SHADOW TOKENS (LEGACY) */ --shadow-strength-primary: 80%; --color-shadow-primary: #{utils.css-alpha( @@ -160,16 +99,16 @@ 0 8px 10px -6px var(--color-shadow-primary); --overlay-icon-shadow: drop-shadow(0 0 8px var(--color-shadow-primary)); - /* GRAPHS/CHARTS TOKENS */ + /* GRAPHS/CHARTS TOKENS (LEGACY) */ --color-graph-primary-stroke: var(--color-text-brand); - --color-graph-primary-fill: var(--color-bg-brand-softer); + --color-graph-primary-fill: var(--color-bg-brand-softest); --color-graph-warning-stroke: var(--color-text-warning); - --color-graph-warning-fill: var(--color-bg-warning-softer); + --color-graph-warning-fill: var(--color-bg-warning-softest); --color-graph-disabled-stroke: var(--color-text-disabled); --color-graph-disabled-fill: var(--color-bg-disabled); - /* LEGACY TOKENS */ + /* RICH TEXT TOKENS (LEGACY) */ --rich-text-container-color: rgb(87 24 60 / 100%); --rich-text-text-color: rgb(255 175 212 / 100%); @@ -203,12 +142,14 @@ --color-text-primary: var(--color-grey-50); --color-text-status-links: var(--color-text-brand); - /* BORDER TOKENS */ - + /* BACKGROUND TOKENS */ + --color-bg-error-base: var(--color-red-800); --border-strength-primary: 30%; /* EMOJI REACTIONS */ - --emoji-reaction-color: #42485a; --emoji-reaction-selected-color: #617ed5; + + /* BORDER TOKENS */ + --color-border-primary: var(--color-grey-600); } diff --git a/app/javascript/styles/mastodon/theme/_light.scss b/app/javascript/styles/mastodon/theme/_light.scss index d439827b2b44b2..4ef1df240db3c4 100644 --- a/app/javascript/styles/mastodon/theme/_light.scss +++ b/app/javascript/styles/mastodon/theme/_light.scss @@ -5,145 +5,85 @@ --color-text-primary: var(--color-grey-950); --color-text-secondary: var(--color-grey-600); - --color-text-tertiary: var(--color-grey-500); - --color-text-on-inverted: var(--color-white); + --color-text-tertiary: var(--color-grey-500); // legacy + --color-text-inverted: var(--color-white); --color-text-brand: var(--color-indigo-700); --color-text-brand-soft: color-mix( in oklab, var(--color-text-primary), var(--color-text-brand) - ); + ); // legacy + --color-text-on-brand-base: var(--color-white); - --color-text-brand-on-inverted: var(--color-indigo-400); + --color-text-brand-on-inverted: var(--color-indigo-400); // legacy --color-text-error: var(--color-red-800); --color-text-on-error-base: var(--color-white); - --color-text-warning: var(--color-yellow-600); + --color-text-warning: var(--color-yellow-700); --color-text-on-warning-base: var(--color-white); - --color-text-success: var(--color-green-600); + --color-text-success: var(--color-green-700); --color-text-on-success-base: var(--color-white); - --color-text-disabled: var(--color-grey-300); - --color-text-on-disabled: var(--color-grey-200); - --color-text-bookmark-highlight: var(--color-text-error); - --color-text-favourite-highlight: var(--color-text-warning); - --color-text-on-media: var(--color-white); - --color-text-status-links: var(--color-text-brand); + --color-text-disabled: var(--color-grey-300); // legacy + --color-text-on-disabled: var(--color-grey-200); // legacy + --color-text-bookmark-highlight: var(--color-text-error); // legacy + --color-text-favourite-highlight: var(--color-text-warning); // legacy + --color-text-on-media: var(--color-white); // legacy + --color-text-status-links: var(--color-text-brand); // legacy /* BACKGROUND TOKENS */ // Neutrals --color-bg-primary: var(--color-white); --overlay-strength-secondary: 4%; - --color-bg-secondary-base: #000550; - --color-bg-secondary: #{color-mix( - in oklab, - var(--color-bg-primary), - var(--color-bg-secondary-base) var(--overlay-strength-secondary) - )}; - --color-bg-secondary-solid: #{color-mix( - in srgb, - var(--color-bg-primary), - var(--color-bg-secondary-base) var(--overlay-strength-secondary) - )}; - --color-bg-tertiary: #{color-mix( - in oklab, - var(--color-bg-primary), - var(--color-bg-secondary-base) calc(2 * var(--overlay-strength-secondary)) - )}; + --color-bg-secondary: var(--color-grey-50); + --color-bg-tertiary: var(--color-grey-100); // legacy // Utility - --color-bg-ambient: var(--color-bg-primary); --color-bg-inverted: var(--color-grey-950); - --color-bg-media-base: var(--color-black); - --color-bg-media-strength: 65%; - --color-bg-media: #{utils.css-alpha( - var(--color-bg-media-base), - var(--color-bg-media-strength) - )}; - --color-bg-overlay: var(--color-bg-primary); - --color-bg-disabled: var(--color-grey-400); + --color-bg-overlay-base: #{utils.css-alpha(var(--color-grey-950), 60%)}; + --color-bg-overlay-highlight: #{utils.css-alpha(var(--color-grey-950), 5%)}; + --color-bg-overlay: var(--color-bg-primary); // legacy + --color-bg-media-base: var(--color-black); // legacy + --color-bg-media: #{utils.css-alpha(var(--color-bg-media-base), 65%)}; // legacy + --color-bg-disabled: var(--color-grey-400); // legacy // Brand - --overlay-strength-brand: 6%; --color-bg-brand-base: var(--color-indigo-700); - --color-bg-brand-base-hover: color-mix( - in oklab, - var(--color-bg-brand-base), - black var(--overlay-strength-brand) - ); - --color-bg-brand-soft: #{utils.css-alpha( - #0012d8, - calc(var(--overlay-strength-brand) * 2) - )}; - --color-bg-brand-softer: #{utils.css-alpha( - #0012d8, - var(--overlay-strength-brand) - )}; - --color-bg-brand-softer-solid: color-mix( - in srgb, - var(--color-bg-primary), - var(--color-bg-brand-base) var(--overlay-strength-brand) - ); + --color-bg-brand-base-hover: var(--color-indigo-800); // legacy + --color-bg-brand-soft: var(--color-indigo-100); + --color-bg-brand-softest: var(--color-indigo-50); // Error - --overlay-strength-error: 5%; - --color-bg-error-base: var(--color-red-800); - --color-bg-error-base-hover: color-mix( - in oklab, - var(--color-bg-error-base), - black var(--overlay-strength-error) - ); + --color-bg-error-base: var(--color-red-700); + --color-bg-error-base-hover: var(--color-red-800); // legacy --color-bg-error-soft: var(--color-red-100); - --color-bg-error-softer: var(--color-red-50); + --color-bg-error-softest: var(--color-red-50); // Warning - --overlay-strength-warning: 10%; - --color-bg-warning-base: var(--color-yellow-700); - --color-bg-warning-base-hover: color-mix( - in oklab, - var(--color-bg-warning-base), - black var(--overlay-strength-warning) - ); + --color-bg-warning-base: var(--color-yellow-700); // legacy --color-bg-warning-soft: var(--color-yellow-100); - --color-bg-warning-softer: var(--color-yellow-50); + --color-bg-warning-softest: var(--color-yellow-50); // Success - --overlay-strength-success: 15%; - --color-bg-success-base: var(--color-green-600); - --color-bg-success-base-hover: color-mix( - in oklab, - var(--color-bg-success-base), - black var(--overlay-strength-success) - ); + --color-bg-success-base: var(--color-green-600); // legacy --color-bg-success-soft: var(--color-green-100); - --color-bg-success-softer: var(--color-green-50); + --color-bg-success-softest: var(--color-green-50); /* BORDER TOKENS */ - --border-strength-primary: 15%; - --color-border-primary: color-mix( - in oklab, - var(--color-bg-primary), - var(--color-grey-950) var(--border-strength-primary) - ); - --color-border-media: rgb(252 248 255 / 15%); - --color-border-verified: rgb(220, 3, 240); - --color-border-on-bg-secondary: var(--color-grey-200); - --color-border-on-bg-brand-softer: var(--color-indigo-200); - --color-border-on-bg-error-softer: #{utils.css-alpha( - var(--color-text-error), - 50% - )}; - --color-border-on-bg-warning-softer: #{utils.css-alpha( + --color-border-primary: var(--color-grey-200); + --color-border-brand: var(--color-text-brand); + --color-border-brand-soft: var(--color-indigo-200); + --color-border-error: var(--color-red-700); + --color-border-media: rgb(252 248 255 / 15%); // legacy + --color-border-error-soft: #{utils.css-alpha(var(--color-text-error), 50%)}; // legacy + --color-border-warning-soft: #{utils.css-alpha( var(--color-text-warning), 50% - )}; - --color-border-on-bg-success-softer: #{utils.css-alpha( - var(--color-text-success), - 50% - )}; - --color-border-on-bg-inverted: var(--color-border-primary); + )}; // legacy + + --color-border-success-soft: var(--color-green-200); - /* SHADOW TOKENS */ + /* SHADOW TOKENS (LEGACY) */ --shadow-strength-primary: 30%; --color-shadow-primary: #{utils.css-alpha( @@ -155,16 +95,16 @@ 0 8px 10px -6px var(--color-shadow-primary); --overlay-icon-shadow: drop-shadow(0 0 8px var(--color-shadow-primary)); - /* GRAPHS/CHARTS TOKENS */ + /* GRAPHS/CHARTS TOKENS (LEGACY) */ --color-graph-primary-stroke: var(--color-text-brand); - --color-graph-primary-fill: var(--color-bg-brand-softer); + --color-graph-primary-fill: var(--color-bg-brand-softest); --color-graph-warning-stroke: var(--color-text-warning); - --color-graph-warning-fill: var(--color-bg-warning-softer); + --color-graph-warning-fill: var(--color-bg-warning-softest); --color-graph-disabled-stroke: var(--color-text-disabled); --color-graph-disabled-fill: var(--color-bg-disabled); - /* LEGACY TOKENS */ + /* RICH TEXT TOKENS (LEGACY) */ --rich-text-container-color: rgb(255 216 231 / 100%); --rich-text-text-color: rgb(114 47 83 / 100%); @@ -194,14 +134,16 @@ } @mixin contrast-overrides { - @include tokens; -} + /* TEXT TOKENS */ + + --color-text-primary: var(--color-black); + --color-text-secondary: var(--color-grey-800); + --color-text-tertiary: var(--color-grey-700); + --color-text-brand: var(--color-indigo-600); -body { - // Variable for easily inverting directional UI elements, - --text-x-direction: 1; + /* BACKGROUND TOKENS */ + --color-bg-error-base: var(--color-red-800); - &.rtl { - --text-x-direction: -1; - } + /* BORDER TOKENS */ + --color-border-primary: var(--color-grey-300); } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 69c79cd1e6f2a0..d237a184c97169 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -69,7 +69,7 @@ } &.active .avatar-stack .account__avatar { - border-color: var(--color-text-brand); + border-color: var(--color-border-brand); } .trends__item__current { diff --git a/app/javascript/testing/factories.ts b/app/javascript/testing/factories.ts index f5901fc70614f4..ab96bf95e99e2e 100644 --- a/app/javascript/testing/factories.ts +++ b/app/javascript/testing/factories.ts @@ -25,6 +25,7 @@ export const accountFactory: FactoryFunction = ({ acct: 'testuser', avatar: '/avatars/original/missing.png', avatar_static: '/avatars/original/missing.png', + avatar_description: '', username: 'testuser', display_name: 'Test User', bot: false, @@ -42,6 +43,7 @@ export const accountFactory: FactoryFunction = ({ group: false, header: '/header.png', header_static: '/header_static.png', + header_description: '', indexable: true, last_status_at: '2023-01-01', locked: false, diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 2d12b890b6dcb7..f874a409565bae 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -75,6 +75,10 @@ def account_from_uri(uri) ActivityPub::TagManager.instance.uri_to_resource(uri, Account) end + def collection_from_uri(uri) + ActivityPub::TagManager.instance.uri_to_resource(uri, Collection) + end + def object_uri @object_uri ||= uri_from_bearcap(value_or_id(@object)) end diff --git a/app/lib/activitypub/activity/accept.rb b/app/lib/activitypub/activity/accept.rb index d54f05849c22ce..e8220666369d84 100644 --- a/app/lib/activitypub/activity/accept.rb +++ b/app/lib/activitypub/activity/accept.rb @@ -6,7 +6,7 @@ def perform return accept_follow_for_friend if friend_follow? return accept_follow!(follow_request_from_object) unless follow_request_from_object.nil? return accept_quote!(quote_request_from_object) unless quote_request_from_object.nil? - return accept_feature_request! if Mastodon::Feature.collections_federation_enabled? && feature_request_from_object.present? + return accept_feature_request! if Mastodon::Feature.collections_enabled? && feature_request_from_object.present? case @object['type'] when 'Follow' diff --git a/app/lib/activitypub/activity/add.rb b/app/lib/activitypub/activity/add.rb index cfaf29a3be9477..0d22910a9a51b2 100644 --- a/app/lib/activitypub/activity/add.rb +++ b/app/lib/activitypub/activity/add.rb @@ -13,12 +13,12 @@ def perform add_featured end when @account.collections_url - return unless Mastodon::Feature.collections_federation_enabled? + return unless Mastodon::Feature.collections_enabled? add_collection else @collection = @account.collections.find_by(uri: value_or_id(@json['target'])) - add_collection_item if @collection && Mastodon::Feature.collections_federation_enabled? + add_collection_item if @collection && Mastodon::Feature.collections_enabled? end end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 8b604d6e39eaac..9d3a0bbda2e60b 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -3,6 +3,9 @@ class ActivityPub::Activity::Create < ActivityPub::Activity include NgRuleHelper + DISTRIBUTE_DELAY = 1.minute + PROCESSING_DELAY = (30.seconds)..(10.minutes) + def perform @account.schedule_refresh_if_stale! @@ -87,7 +90,7 @@ def process_status def distribute # Spread out crawling randomly to avoid DDoSing the link - LinkCrawlWorker.perform_in(rand(1..59).seconds, @status.id) + LinkCrawlWorker.perform_in(rand(DISTRIBUTE_DELAY), @status.id) # Distribute into home and list feeds and notify mentioned accounts ::DistributionWorker.perform_async(@status.id, { 'silenced_account_ids' => @silenced_account_ids }) if @options[:override_timestamps] || @status.within_realtime_window? @@ -400,7 +403,7 @@ def process_attachments media_attachment.download_thumbnail! media_attachment.save rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) + RedownloadMediaWorker.perform_in(rand(PROCESSING_DELAY), media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" RedownloadMediaWorker.perform_async(media_attachment.id) @@ -472,7 +475,7 @@ def resolve_thread(status) def resolve_unresolved_mentions(status) @unresolved_mentions.uniq.each do |uri| - MentionResolveWorker.perform_in(rand(30...600).seconds, status.id, uri, { 'request_id' => @options[:request_id] }) + MentionResolveWorker.perform_in(rand(PROCESSING_DELAY), status.id, uri, { 'request_id' => @options[:request_id] }) end end @@ -499,7 +502,7 @@ def fetch_and_verify_quote embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @json['context']) ActivityPub::VerifyQuoteService.new.call(@quote, @quote_approval_uri, fetchable_quoted_uri: @quote_uri, prefetched_quoted_object: embedded_quote, request_id: @options[:request_id], depth: @options[:depth]) rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, @quote.id, @quote_uri, { 'request_id' => @options[:request_id], 'approval_uri' => @quote_approval_uri }) + ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(PROCESSING_DELAY), @quote.id, @quote_uri, { 'request_id' => @options[:request_id], 'approval_uri' => @quote_approval_uri }) end def conversation_from_uri(uri) diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 4c8eb319692e79..391f868b95a309 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -4,7 +4,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity def perform return delete_person if @account.uri == object_uri return delete_friend if object_uri == ActivityPub::TagManager::COLLECTIONS[:public] - return delete_feature_authorization! unless !Mastodon::Feature.collections_federation_enabled? || feature_authorization_from_object.nil? + return delete_feature_authorization! unless !Mastodon::Feature.collections_enabled? || feature_authorization_from_object.nil? delete_object end diff --git a/app/lib/activitypub/activity/feature_request.rb b/app/lib/activitypub/activity/feature_request.rb index 180eeb492cd565..16a3860a0eeffa 100644 --- a/app/lib/activitypub/activity/feature_request.rb +++ b/app/lib/activitypub/activity/feature_request.rb @@ -4,10 +4,10 @@ class ActivityPub::Activity::FeatureRequest < ActivityPub::Activity include Payloadable def perform - return unless Mastodon::Feature.collections_federation_enabled? + return unless Mastodon::Feature.collections_enabled? return if non_matching_uri_hosts?(@account.uri, @json['id']) - @collection = @account.collections.find_by(uri: value_or_id(@json['instrument'])) + @collection = find_or_fetch_collection @featured_account = ActivityPub::TagManager.instance.uris_to_local_accounts([value_or_id(@json['object'])]).first return if @collection.nil? || @featured_account.nil? @@ -23,22 +23,40 @@ def perform def accept_request! collection_item = @collection.collection_items.create!( - account: @featured_account, - state: :accepted + collection_item_attributes(:accepted) ) + notify_local_user!(collection_item) queue_delivery!(collection_item, ActivityPub::AcceptFeatureRequestSerializer) end def reject_request! collection_item = @collection.collection_items.build( - account: @featured_account, - state: :rejected + collection_item_attributes(:rejected) ) queue_delivery!(collection_item, ActivityPub::RejectFeatureRequestSerializer) end + def find_or_fetch_collection + uri = value_or_id(@json['instrument']) + collection = @account.collections.find_by(uri:) + return collection if collection.present? + + collection = ActivityPub::FetchRemoteFeaturedCollectionService.new.call(uri) + return collection if collection.present? && collection.account == @account + + nil + end + + def collection_item_attributes(state = :accepted) + { account: @featured_account, activity_uri: @json['id'], state: } + end + + def notify_local_user!(collection_item) + LocalNotificationWorker.perform_async(collection_item.account_id, collection_item.id, collection_item.class.name, 'added_to_collection') + end + def queue_delivery!(collection_item, serializer) json = JSON.generate(serialize_payload(collection_item, serializer)) ActivityPub::DeliveryWorker.perform_async(json, @featured_account.id, @account.inbox_url) diff --git a/app/lib/activitypub/activity/flag.rb b/app/lib/activitypub/activity/flag.rb index b7a412485c07e7..bc25e5c29fffd0 100644 --- a/app/lib/activitypub/activity/flag.rb +++ b/app/lib/activitypub/activity/flag.rb @@ -8,9 +8,11 @@ def perform target_accounts = object_uris.filter_map { |uri| account_from_uri(uri) } target_statuses_by_account = object_uris.filter_map { |uri| status_from_uri(uri) }.group_by(&:account_id) + target_collections_by_account = object_uris.filter_map { |uri| collection_from_uri(uri) }.group_by(&:account_id) target_accounts.each do |target_account| target_statuses = target_statuses_by_account[target_account.id] + target_collections = target_collections_by_account.fetch(target_account.id, []) replied_to_accounts = target_statuses.nil? ? [] : Account.local.where(id: target_statuses.filter_map(&:in_reply_to_account_id)) next if target_account.suspended? || (!target_account.local? && replied_to_accounts.none?) @@ -19,6 +21,7 @@ def perform @account, target_account, status_ids: target_statuses.nil? ? [] : target_statuses.map(&:id), + collection_ids: target_collections.map(&:id), comment: report_comment, uri: report_uri ) diff --git a/app/lib/activitypub/activity/reject.rb b/app/lib/activitypub/activity/reject.rb index b6d720f03cc5b7..db5ee8f2d689e8 100644 --- a/app/lib/activitypub/activity/reject.rb +++ b/app/lib/activitypub/activity/reject.rb @@ -52,7 +52,7 @@ def reject_feature_request! collection_item = feature_request_from_object return unless collection_item.account == @account && collection_item.local? - collection_item.destroy! + collection_item.reject! end def relay diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb index ae8d01f48b129b..801cfb3179bab7 100644 --- a/app/lib/activitypub/activity/update.rb +++ b/app/lib/activitypub/activity/update.rb @@ -13,7 +13,7 @@ def perform update_account elsif supported_object_type? || converted_object_type? update_status - elsif equals_or_includes_any?(@object['type'], ['FeaturedCollection']) && Mastodon::Feature.collections_federation_enabled? + elsif equals_or_includes_any?(@object['type'], ['FeaturedCollection']) && Mastodon::Feature.collections_enabled? update_collection end end diff --git a/app/lib/activitypub/linked_data_signature.rb b/app/lib/activitypub/linked_data_signature.rb index c42313b05ee975..f6c4eeb90ede87 100644 --- a/app/lib/activitypub/linked_data_signature.rb +++ b/app/lib/activitypub/linked_data_signature.rb @@ -19,16 +19,15 @@ def verify_actor! return unless type == 'RsaSignature2017' - creator = ActivityPub::TagManager.instance.uri_to_actor(creator_uri) - creator = ActivityPub::FetchRemoteKeyService.new.call(creator_uri) if creator&.public_key.blank? - - return if creator.nil? + keypair = Keypair.from_keyid(creator_uri) + keypair = ActivityPub::FetchRemoteKeyService.new.call(creator_uri) if keypair&.public_key.blank? + return if keypair.nil? || !keypair.usable? options_hash = hash(@json['signature'].without('type', 'id', 'signatureValue').merge('@context' => CONTEXT)) document_hash = hash(@json.without('signature')) to_be_verified = options_hash + document_hash - creator if creator.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), Base64.decode64(signature), to_be_verified) + keypair.actor if keypair.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), Base64.decode64(signature), to_be_verified) rescue OpenSSL::PKey::RSAError false end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index 408d75b92e56cb..59534f68352f51 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -31,6 +31,8 @@ def url_for(target) short_account_status_url(target.account, target) when :flag target.uri + when :featured_collection + collection_url(target) end end diff --git a/app/lib/request.rb b/app/lib/request.rb index 66d7ece70f7980..d405fb5009a3b0 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -292,11 +292,9 @@ def open(host, *args) begin addresses = [IPAddr.new(host)] rescue IPAddr::InvalidAddressError - Resolv::DNS.open do |dns| - dns.timeouts = 5 - addresses = dns.getaddresses(host) - addresses = addresses.grep(Resolv::IPv6).take(2) + addresses.grep_v(Resolv::IPv6).take(2) - end + resolvers = [Resolv::Hosts.new, Resolv::DNS.new.tap { |dns| dns.timeouts = 5 }] + addresses = Resolv.new(resolvers).getaddresses(host) + addresses = addresses.grep(Resolv::IPv6::Regex).take(2) + addresses.grep_v(Resolv::IPv6::Regex).take(2) end socks = [] @@ -305,7 +303,7 @@ def open(host, *args) addresses.each do |address| check_private_address(address, host) - sock = ::Socket.new(address.is_a?(Resolv::IPv6) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0) + sock = ::Socket.new(address.match?(Resolv::IPv6::Regex) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0) sockaddr = ::Socket.pack_sockaddr_in(port, address.to_s) sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1) diff --git a/app/lib/signed_request.rb b/app/lib/signed_request.rb index 1cea2955f5273b..6fd0772de37724 100644 --- a/app/lib/signed_request.rb +++ b/app/lib/signed_request.rb @@ -23,14 +23,14 @@ def algorithm_supported? %w(rsa-sha256 hs2019).include?(signature_algorithm) end - def verified?(actor) + def verified?(keypair) signature = Base64.decode64(signature_params['signature']) compare_signed_string = build_signed_string(include_query_string: true) - return true unless verify_signature(actor, signature, compare_signed_string).nil? + return true unless verify_signature(keypair, signature, compare_signed_string).nil? compare_signed_string = build_signed_string(include_query_string: false) - return true unless verify_signature(actor, signature, compare_signed_string).nil? + return true unless verify_signature(keypair, signature, compare_signed_string).nil? false end @@ -99,8 +99,8 @@ def signed_headers signature_params.fetch('headers', signature_algorithm == 'hs2019' ? '(created)' : 'date').downcase.split end - def verify_signature(actor, signature, compare_signed_string) - true if actor.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), signature, compare_signed_string) + def verify_signature(keypair, signature, compare_signed_string) + true if keypair.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), signature, compare_signed_string) rescue OpenSSL::PKey::RSAError nil end @@ -170,8 +170,8 @@ def algorithm_supported? true end - def verified?(actor) - key = Linzer.new_rsa_v1_5_sha256_public_key(actor.public_key) + def verified?(keypair) + key = Linzer.new_rsa_v1_5_sha256_public_key(keypair.public_key) Linzer.verify(key, @message, @signature) rescue Linzer::VerifyError @@ -243,7 +243,7 @@ def initialize(request) end end - def verified?(actor) + def verified?(keypair) missing_signature_parameters = @signature.missing_signature_parameters raise Mastodon::SignatureVerificationError, "Incompatible request signature. #{missing_signature_parameters.to_sentence} are required" if missing_signature_parameters raise Mastodon::SignatureVerificationError, 'Unsupported signature algorithm (only rsa-sha256 and hs2019 are supported)' unless @signature.algorithm_supported? @@ -251,7 +251,7 @@ def verified?(actor) @signature.verify_signature_strength! @signature.verify_body_digest! - @signature.verified?(actor) + @signature.verified?(keypair) end private diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb index db278c8f6a0f87..cdd7457d47ff9b 100644 --- a/app/lib/text_formatter.rb +++ b/app/lib/text_formatter.rb @@ -81,6 +81,15 @@ def shortened_link(url, rel_me: false) rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError h(url) end + + def link_to_mention(account, with_domain: false) + url = ActivityPub::TagManager.instance.url_for(account) + display_username = with_domain ? account.pretty_acct : account.username + + <<~HTML.squish + @#{h(display_username)} + HTML + end end private @@ -141,12 +150,7 @@ def link_to_mention(entity) return "@#{h(entity[:screen_name])}" if account.nil? - url = ActivityPub::TagManager.instance.url_for(account) - display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username - - <<~HTML.squish - @#{h(display_username)} - HTML + TextFormatter.link_to_mention(account, with_domain: same_username_hits&.positive? || with_domains?) end def entity_cache diff --git a/app/lib/webfinger_resource.rb b/app/lib/webfinger_resource.rb index 95de496a6d5f9f..2d4c6ab2be9368 100644 --- a/app/lib/webfinger_resource.rb +++ b/app/lib/webfinger_resource.rb @@ -9,14 +9,14 @@ def initialize(resource) @resource = resource end - def username + def account case resource when %r{\A(https?://)?#{instance_actor_regexp}/?\Z} - Rails.configuration.x.local_domain + Account.representative when /\Ahttps?/i - username_from_url + account_from_url when /@/ - username_from_acct + account_from_acct else raise InvalidRequest end @@ -31,11 +31,11 @@ def instance_actor_regexp Regexp.union(hosts) end - def username_from_url + def account_from_url if account_show_page? - path_params[:username] + path_params.key?(:username) ? Account.find_local!(path_params[:username]) : Account.local.find(path_params[:id]) elsif instance_actor_page? - Rails.configuration.x.local_domain + Account.representative else raise ActiveRecord::RecordNotFound end @@ -53,10 +53,13 @@ def path_params Rails.application.routes.recognize_path(resource) end - def username_from_acct + def account_from_acct raise ActiveRecord::RecordNotFound unless domain_matches_local? - local_username + username = local_username + return Account.representative if username == Rails.configuration.x.local_domain || username == Rails.configuration.x.web_domain + + Account.find_local!(username) end def split_acct @@ -76,6 +79,6 @@ def local_domain end def domain_matches_local? - TagManager.instance.local_domain?(local_domain) || TagManager.instance.web_domain?(local_domain) + TagManager.instance.local_domain?(local_domain) || TagManager.instance.web_domain?(local_domain) || Rails.configuration.x.alternate_domains.include?(local_domain) end end diff --git a/app/mailers/email_subscription_mailer.rb b/app/mailers/email_subscription_mailer.rb new file mode 100644 index 00000000000000..318aec10d89716 --- /dev/null +++ b/app/mailers/email_subscription_mailer.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +class EmailSubscriptionMailer < ApplicationMailer + include BulkMailSettingsConcern + include Redisable + + layout 'mailer' + + helper :accounts + helper :routing + helper :statuses + + before_action :set_subscription + before_action :set_unsubscribe_url + before_action :set_instance + before_action :set_skip_preferences_link + + after_action :use_bulk_mail_delivery_settings, except: [:confirmation] + after_action :set_list_headers + + default to: -> { @subscription.email } + + def confirmation + I18n.with_locale(locale) do + mail subject: default_i18n_subject + end + end + + def notification(statuses) + @statuses = statuses + + I18n.with_locale(locale) do + mail subject: I18n.t(@statuses.size == 1 ? 'singular' : 'plural', scope: 'email_subscription_mailer.notification.subject', name: @subscription.account.display_name, excerpt: @statuses.first.text.truncate(17)) + end + end + + private + + def set_list_headers + headers( + 'List-ID' => "<#{@subscription.account.username}.#{Rails.configuration.x.local_domain}>", + 'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click', + 'List-Unsubscribe' => "<#{@unsubscribe_url}>" + ) + end + + def set_subscription + @subscription = params[:subscription] + end + + def set_unsubscribe_url + @unsubscribe_url = unsubscribe_url(token: @subscription.to_sgid(for: 'unsubscribe').to_s) + end + + def set_instance + @instance = Rails.configuration.x.local_domain + end + + def set_skip_preferences_link + @skip_preferences_link = true + end + + def locale + @subscription.locale.presence || I18n.default_locale + end +end diff --git a/app/models/account.rb b/app/models/account.rb index b51fbdca92e5d3..b97689c72d6df3 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -200,8 +200,10 @@ class Account < ApplicationRecord :role, :locale, :shows_application?, + :email_subscriptions_enabled?, :prefers_noindex?, :time_zone, + :can?, to: :user, prefix: true, allow_nil: true @@ -514,8 +516,7 @@ def compute_searchability_activitypub end def featureable_by?(other_account) - return discoverable? if local? - return false unless Mastodon::Feature.collections_federation_enabled? + return discoverable? && (!locked? || followed_by?(other_account) || other_account.id == id) if local? feature_policy_for_account(other_account).in?(%i(automatic manual)) end diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb index fd1e14ac408ac6..75a3f7132db08e 100644 --- a/app/models/account_filter.rb +++ b/app/models/account_filter.rb @@ -14,6 +14,8 @@ class AccountFilter order ).freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -24,7 +26,7 @@ def results scope = Account.includes(:account_stat, user: [:ips, :invite_request]).without_instance_actor relevant_params.each do |key, value| - next if key.to_s == 'page' + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key, value)) if value.present? end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index c2c6355a1869a8..ffa74cd21f3820 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -60,6 +60,10 @@ def cooldown_at created_at + COOLDOWN_PERIOD end + def remaining_cooldown_days + ((cooldown_at - Time.current) / 1.day).ceil + end + private def set_target_account diff --git a/app/models/account_relationship_severance_event.rb b/app/models/account_relationship_severance_event.rb index 115c63c06273b9..89e6d8b9817572 100644 --- a/app/models/account_relationship_severance_event.rb +++ b/app/models/account_relationship_severance_event.rb @@ -32,6 +32,10 @@ class AccountRelationshipSeveranceEvent < ApplicationRecord before_create :set_relationships_count! + def identifier + "#{target_name}-#{created_at.to_date.iso8601}" + end + private def set_relationships_count! diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb index b9d8512fb69474..075d60f0883b14 100644 --- a/app/models/admin/action_log_filter.rb +++ b/app/models/admin/action_log_filter.rb @@ -86,6 +86,8 @@ class Admin::ActionLogFilter destroy_username_block: { target_type: 'UsernameBlock', action: 'destroy' }.freeze, }.freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -96,7 +98,7 @@ def results scope = latest_action_logs.includes(:target, :account) params.each do |key, value| - next if key.to_s == 'page' + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key.to_s, value.to_s.strip)) if value.present? end diff --git a/app/models/admin/tag_filter.rb b/app/models/admin/tag_filter.rb index 5e75757b2374a7..baddfc541aa2e2 100644 --- a/app/models/admin/tag_filter.rb +++ b/app/models/admin/tag_filter.rb @@ -7,6 +7,8 @@ class Admin::TagFilter order ).freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -17,7 +19,7 @@ def results scope = Tag.all params.each do |key, value| - next if key == :page + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key, value)) if value.present? end @@ -32,7 +34,7 @@ def scope_for(key, value) when :status status_scope(value) when :name - Tag.search_for(value.to_s.strip, params[:limit], params[:offset], exclude_unlistable: false) + Tag.search_for(value, params[:limit], params[:offset], exclude_unlistable: false) when :order order_scope(value) else diff --git a/app/models/announcement_filter.rb b/app/models/announcement_filter.rb index 85c3b1d2cea9ae..43eb0e96d9747d 100644 --- a/app/models/announcement_filter.rb +++ b/app/models/announcement_filter.rb @@ -6,6 +6,8 @@ class AnnouncementFilter unpublished ).freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -16,7 +18,7 @@ def results scope = Announcement.unscoped params.each do |key, value| - next if key.to_s == 'page' + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key, value.to_s.strip)) if value.present? end diff --git a/app/models/block.rb b/app/models/block.rb index 662cc1ac20e779..a5e8ad7ffa9951 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -25,7 +25,7 @@ def local? false # Force uri_for to use uri attribute end - before_validation :set_uri, only: :create + before_validation :set_uri, on: :create after_commit :invalidate_blocking_cache after_commit :invalidate_follow_recommendations_cache diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb index e76f29bfc2ab15..79f47d11ddc49b 100644 --- a/app/models/bulk_import.rb +++ b/app/models/bulk_import.rb @@ -48,6 +48,14 @@ class BulkImport < ApplicationRecord scope :archival_completed, -> { where(created_at: ..ARCHIVE_PERIOD.ago) } scope :confirmation_missed, -> { state_unconfirmed.where(created_at: ..CONFIRM_PERIOD.ago) } + def failure_count + processed_items - imported_items + end + + def processing_complete? + processed_items == total_items + end + def self.progress!(bulk_import_id, imported: false) # Use `increment_counter` so that the incrementation is done atomically in the database BulkImport.increment_counter(:processed_items, bulk_import_id) @@ -55,6 +63,6 @@ def self.progress!(bulk_import_id, imported: false) # Since the incrementation has been done atomically, concurrent access to `bulk_import` is now benign bulk_import = BulkImport.find(bulk_import_id) - bulk_import.update!(state: :finished, finished_at: Time.now.utc) if bulk_import.processed_items == bulk_import.total_items + bulk_import.update!(state: :finished, finished_at: Time.now.utc) if bulk_import.processing_complete? end end diff --git a/app/models/collection.rb b/app/models/collection.rb index 3be633bbf1f7ac..c5082269e0228e 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -15,6 +15,7 @@ # original_number_of_items :integer # sensitive :boolean not null # uri :string +# url :string # created_at :datetime not null # updated_at :datetime not null # account_id :bigint(8) not null @@ -36,11 +37,9 @@ class Collection < ApplicationRecord validates :name, length: { maximum: 40 }, if: :local? validates :name, length: { maximum: NAME_LENGTH_HARD_LIMIT }, if: :remote? validates :description, - presence: true, length: { maximum: 100 }, if: :local? validates :description_html, - presence: true, length: { maximum: DESCRIPTION_LENGTH_HARD_LIMIT }, if: :remote? validates :local, inclusion: [true, false] @@ -54,6 +53,7 @@ class Collection < ApplicationRecord validates :language, language: { if: :local?, allow_nil: true } validate :tag_is_usable validate :items_do_not_exceed_limit + validate :user_does_not_exceed_limit, on: :create scope :with_items, -> { includes(:collection_items).merge(CollectionItem.with_accounts) } scope :with_tag, -> { includes(:tag) } @@ -66,6 +66,7 @@ def remote? def items_for(account = nil) result = collection_items.with_accounts + result = account == self.account ? result.pending_or_accepted : result.accepted result = result.not_blocked_by(account) unless account.nil? result end @@ -98,7 +99,18 @@ def tag_is_usable errors.add(:tag_name, :unusable) unless tag.usable? end + def pending_or_accepted_items + collection_items.select { |i| i.accepted? || i.pending? } + end + def items_do_not_exceed_limit - errors.add(:collection_items, :too_many, count: MAX_ITEMS) if collection_items.size > MAX_ITEMS + errors.add(:collection_items, :too_many, count: MAX_ITEMS) if pending_or_accepted_items.size > MAX_ITEMS + end + + def user_does_not_exceed_limit + return unless local? + + limit = account.user.role.collection_limit + errors.add(:base, :too_many, count: limit) if account.collections.count >= limit end end diff --git a/app/models/collection_item.rb b/app/models/collection_item.rb index f7067fb2fcf35c..bbb0343ebe6901 100644 --- a/app/models/collection_item.rb +++ b/app/models/collection_item.rb @@ -25,8 +25,12 @@ class CollectionItem < ApplicationRecord { pending: 0, accepted: 1, rejected: 2, revoked: 3 }, validate: true + alias reject! rejected! + alias revoke! revoked! + delegate :local?, :remote?, to: :collection + validates :account_id, uniqueness: { scope: :collection_id } validates :position, numericality: { only_integer: true, greater_than: 0 } validates :activity_uri, presence: true, if: :local_item_with_remote_account? validates :approval_uri, presence: true, unless: -> { local? || account&.local? || !accepted? } @@ -35,16 +39,17 @@ class CollectionItem < ApplicationRecord validates :uri, presence: true, if: :remote_item_with_remote_account? before_validation :set_position, on: :create - before_validation :set_activity_uri, only: :create, if: :local_item_with_remote_account? + before_validation :set_activity_uri, on: :create, if: :local_item_with_remote_account? scope :ordered, -> { order(position: :asc) } scope :with_accounts, -> { includes(account: [:account_stat, :user]) } scope :not_blocked_by, ->(account) { where.not(accounts: { id: account.blocking }) } scope :local, -> { joins(:collection).merge(Collection.local) } scope :accepted_partial, ->(account) { joins(:account).merge(Account.local).accepted.where(uri: nil, account_id: account.id) } + scope :pending_or_accepted, -> { where(state: [:pending, :accepted]) } - def revoke! - update!(state: :revoked) + def with_local_account? + account&.local? end def local_item_with_remote_account? diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb index 013e76dfcc5601..67376402d19188 100644 --- a/app/models/concerns/account/associations.rb +++ b/app/models/concerns/account/associations.rb @@ -23,6 +23,7 @@ module Account::Associations has_many :collections has_many :collection_items has_many :curated_collection_items, through: :collections, class_name: 'CollectionItem', source: :collection_items + has_many :featured_in_collections, through: :collection_items, class_name: 'Collection', source: :collection has_many :conversations, class_name: 'AccountConversation' has_many :custom_filters has_many :emoji_reactions @@ -45,6 +46,8 @@ module Account::Associations has_many :scheduled_expiration_statuses has_many :status_pins has_many :statuses + has_many :keypairs + has_many :email_subscriptions has_one :deletion_request, class_name: 'AccountDeletionRequest' has_one :follow_recommendation_suppression diff --git a/app/models/concerns/account/attribution_domains.rb b/app/models/concerns/account/attribution_domains.rb index 22bf27cc5ddab3..ba5c092e6cfcae 100644 --- a/app/models/concerns/account/attribution_domains.rb +++ b/app/models/concerns/account/attribution_domains.rb @@ -12,8 +12,7 @@ module Account::AttributionDomains end def can_be_attributed_from?(domain) - segments = domain.split('.') - variants = segments.map.with_index { |_, i| segments[i..].join('.') }.to_set + variants = self.class.domain_variants(domain).to_set self[:attribution_domains].to_set.intersect?(variants) end end diff --git a/app/models/concerns/account/avatar.rb b/app/models/concerns/account/avatar.rb index d4d789ced17a22..05d1f7b7963ed7 100644 --- a/app/models/concerns/account/avatar.rb +++ b/app/models/concerns/account/avatar.rb @@ -3,6 +3,7 @@ module Account::Avatar extend ActiveSupport::Concern + MAX_DESCRIPTION_LENGTH = 150 AVATAR_IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/heic', 'image/avif', 'image/heif'].freeze AVATAR_IMAGE_CONVERTIBLE_MIME_TYPES = ['image/heic', 'image/avif', 'image/heif'].freeze AVATAR_LIMIT = 8.megabytes @@ -29,7 +30,7 @@ def avatar_styles(file) validates_attachment_size :avatar, less_than: AVATAR_LIMIT remotable_attachment :avatar, AVATAR_LIMIT, suppress_errors: false - validates :avatar_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_avatar_description? } + validates :avatar_description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_avatar_description? } end def avatar_original_url diff --git a/app/models/concerns/account/header.rb b/app/models/concerns/account/header.rb index 75d3c04542ca34..a3715c211ba5ce 100644 --- a/app/models/concerns/account/header.rb +++ b/app/models/concerns/account/header.rb @@ -3,6 +3,7 @@ module Account::Header extend ActiveSupport::Concern + MAX_DESCRIPTION_LENGTH = 150 HEADER_IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze HEADER_LIMIT = 8.megabytes HEADER_DIMENSIONS = [1500, 500].freeze @@ -26,7 +27,7 @@ def header_styles(file) validates_attachment_size :header, less_than: HEADER_LIMIT remotable_attachment :header, HEADER_LIMIT, suppress_errors: false - validates :header_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_header_description? } + validates :header_description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_header_description? } end def header_original_url diff --git a/app/models/concerns/account/interaction_policy_concern.rb b/app/models/concerns/account/interaction_policy_concern.rb index 8fe9eda1baf252..229cd2ac2fb08f 100644 --- a/app/models/concerns/account/interaction_policy_concern.rb +++ b/app/models/concerns/account/interaction_policy_concern.rb @@ -18,7 +18,8 @@ def feature_policy_as_keys(kind) # Returns `:automatic`, `:manual`, `:unknown`, ':missing` or `:denied` def feature_policy_for_account(other_account) return :denied if other_account.nil? || (local? && !discoverable?) - return :automatic if local? + return locked? && !followed_by?(other_account) && self != other_account ? :denied : :automatic if local? + # Post author is always allowed to feature themselves return :automatic if self == other_account return :missing if feature_approval_policy.zero? @@ -64,6 +65,6 @@ def feature_policy_for_account(other_account) def local_feature_policy(kind) return [] if kind == :manual || !discoverable? - [:public] + [locked? ? :followers : :public] end end diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb index 6571a40c54f4a2..2746280f0c85c7 100644 --- a/app/models/concerns/domain_normalizable.rb +++ b/app/models/concerns/domain_normalizable.rb @@ -17,6 +17,11 @@ def domain_char_length SQL ) end + + def domain_variants(domain) + segments = domain.to_s.split('.') + Array.new(segments.size) { |i| segments[i..].join('.') } + end end private diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb index 44ecdedb34100c..ccb674d33cbf9a 100644 --- a/app/models/concerns/user/has_settings.rb +++ b/app/models/concerns/user/has_settings.rb @@ -15,6 +15,10 @@ def prefers_noindex? settings['noindex'] end + def email_subscriptions_enabled? + settings['email_subscriptions'] + end + def preferred_posting_language valid_locale_cascade(settings['default_language'], locale, I18n.locale) end diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb index 070637fea0786a..59ab01087590aa 100644 --- a/app/models/custom_emoji_filter.rb +++ b/app/models/custom_emoji_filter.rb @@ -8,6 +8,8 @@ class CustomEmojiFilter shortcode ).freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -18,7 +20,7 @@ def results scope = CustomEmoji.alphabetic params.each do |key, value| - next if key.to_s == 'page' + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key, value)) if value.present? end diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 8a0a72eb82200b..28eb8088349f16 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -138,9 +138,7 @@ def rule_for(domain) return if domain.blank? uri = Addressable::URI.new.tap { |u| u.host = domain.strip.delete('/') } - segments = uri.normalized_host.split('.') - variants = segments.map.with_index { |_, i| segments[i..].join('.') } - + variants = domain_variants(uri.normalized_host) where(domain: variants).by_domain_length.first rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError nil diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb index c4ab8b9ed27643..c1b961517fab89 100644 --- a/app/models/email_domain_block.rb +++ b/app/models/email_domain_block.rb @@ -67,9 +67,7 @@ def domains_with_variants @uris.flat_map do |uri| next if uri.nil? - segments = uri.normalized_host.split('.') - - segments.map.with_index { |_, i| segments[i..].join('.') } + self.class.module_parent.domain_variants(uri.normalized_host) end.uniq end diff --git a/app/models/email_subscription.rb b/app/models/email_subscription.rb new file mode 100644 index 00000000000000..b108ef19c55dbb --- /dev/null +++ b/app/models/email_subscription.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: email_subscriptions +# +# id :bigint(8) not null, primary key +# confirmation_token :string +# confirmed_at :datetime +# email :string not null +# locale :string not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint(8) not null +# + +class EmailSubscription < ApplicationRecord + belongs_to :account + + normalizes :email, with: ->(str) { str.squish.downcase } + + validates :email, presence: true, email_address: true, length: { maximum: 320 }, uniqueness: { scope: :account_id } + validates :email, email_mx: true, if: -> { email_changed? && !Rails.env.local? } + + scope :confirmed, -> { where.not(confirmed_at: nil) } + scope :unconfirmed, -> { where(confirmed_at: nil) } + + before_create :set_confirmation_token + + after_create_commit :send_confirmation_email + + def confirmed? + confirmed_at.present? + end + + def confirm! + touch(:confirmed_at) + end + + private + + def set_confirmation_token + self.confirmation_token = Devise.friendly_token unless confirmed? + end + + def send_confirmation_email + EmailSubscriptionMailer.with(subscription: self).confirmation.deliver_later + end +end diff --git a/app/models/follow.rb b/app/models/follow.rb index c8930c2f868b56..e8da0077c97be7 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -42,7 +42,7 @@ def revoke_request! destroy! end - before_validation :set_uri, only: :create + before_validation :set_uri, on: :create after_create :increment_cache_counters after_destroy :remove_endorsements after_destroy :decrement_cache_counters diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index 906de95db29020..5d8b5f9c08d5cd 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -51,7 +51,7 @@ def local? false # Force uri_for to use uri attribute end - before_validation :set_uri, only: :create + before_validation :set_uri, on: :create after_commit :invalidate_follow_recommendations_cache private diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index da9013fbd19b77..7ea1d22c538d3d 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -29,6 +29,7 @@ class Form::AdminSettings custom_css profile_directory thumbnail + thumbnail_description mascot trends trendable_by_default @@ -163,6 +164,7 @@ class Form::AdminSettings validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) } validates :min_age, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@min_age) } validates :site_short_description, length: { maximum: DESCRIPTION_LIMIT }, if: -> { defined?(@site_short_description) } + validates :thumbnail_description, length: { maximum: DESCRIPTION_LIMIT }, if: -> { defined?(@thumbnail_description) } validates :status_page_url, url: true, allow_blank: true validate :validate_site_uploads validates :landing_page, inclusion: { in: LANDING_PAGE }, if: -> { defined?(@landing_page) } diff --git a/app/models/invite.rb b/app/models/invite.rb index ca692d937e9064..8f3463a322037a 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -21,7 +21,9 @@ class Invite < ApplicationRecord COMMENT_SIZE_LIMIT = 420 ELIGIBLE_CODE_CHARACTERS = [*('a'..'z'), *('A'..'Z'), *('0'..'9')].freeze + EXPIRATION_DURATIONS = [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].freeze HOMOGLYPHS = %w(0 1 I l O).freeze + MAX_USES_COUNTS = [1, 5, 10, 25, 50, 100].freeze VALID_CODE_CHARACTERS = (ELIGIBLE_CODE_CHARACTERS - HOMOGLYPHS).freeze belongs_to :user, inverse_of: :invites diff --git a/app/models/ip_block.rb b/app/models/ip_block.rb index 5bbfc1fd246699..6d766c8d0a136f 100644 --- a/app/models/ip_block.rb +++ b/app/models/ip_block.rb @@ -20,6 +20,8 @@ class IpBlock < ApplicationRecord include InetContainer include Paginable + EXPIRATION_DURATIONS = [1.day, 2.weeks, 1.month, 6.months, 1.year, 3.years].freeze + enum :severity, { sign_up_requires_approval: 5000, sign_up_block: 5500, diff --git a/app/models/keypair.rb b/app/models/keypair.rb new file mode 100644 index 00000000000000..80c313f4df7dd2 --- /dev/null +++ b/app/models/keypair.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: keypairs +# +# id :bigint(8) not null, primary key +# expires_at :datetime +# private_key :string +# public_key :string not null +# revoked :boolean default(FALSE), not null +# type :integer not null +# uri :string not null +# created_at :datetime not null +# updated_at :datetime not null +# account_id :bigint(8) not null +# + +class Keypair < ApplicationRecord + include Expireable + + self.inheritance_column = nil + + encrypts :private_key + + belongs_to :account + + enum :type, { rsa: 0 } + + attr_accessor :require_private_key + + validates :uri, presence: true, uniqueness: true + validates :public_key, presence: true + validates :private_key, presence: true, if: -> { account.local? } + + # NOTE: this should be true in production, but tests heavily rely on remote accounts having a keypair + validates :private_key, absence: true, if: -> { account.remote? && !require_private_key } + + scope :unexpired, -> { where(expires_at: nil).or(where.not(expires_at: ..Time.now.utc)) } + scope :usable, -> { unexpired.where(revoked: false) } + + alias actor account + + def keypair + @keypair ||= begin + case type + when 'rsa' + OpenSSL::PKey::RSA.new(private_key || public_key) + end + end + end + + def usable? + !revoked? && !expired? + end + + def self.from_keyid(uri) + keypair = find_by(uri: uri) + return keypair unless keypair.nil? + + # No keypair found, try the old way we used to store RSA keypairs + account = ActivityPub::TagManager.instance.uri_to_actor(uri) + return if account&.public_key.blank? + + from_legacy_account(account, uri: uri) + end + + def self.from_legacy_account(account, uri: nil) + Keypair.new( + account:, + uri: uri.presence || ActivityPub::TagManager.instance.key_uri_for(account), + public_key: account.public_key, + private_key: account.private_key, + type: :rsa + ) + end +end diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index ac09d181954100..6a3ece6a2d211f 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -39,6 +39,8 @@ class MediaAttachment < ApplicationRecord enum :type, { image: 0, gifv: 1, video: 2, unknown: 3, audio: 4 } enum :processing, { queued: 0, in_progress: 1, complete: 2, failed: 3 }, prefix: true + SHORTCODE_LENGTH = 19 + MAX_DESCRIPTION_LENGTH = 1_500 MAX_DESCRIPTION_HARD_LENGTH_LIMIT = 10_000 @@ -305,6 +307,10 @@ def url after_post_process :set_meta class << self + def identified(identifier) + identifier.size == SHORTCODE_LENGTH ? find_by!(shortcode: identifier) : find(identifier) + end + def supported_mime_types IMAGE_MIME_TYPES + VIDEO_MIME_TYPES + AUDIO_MIME_TYPES end diff --git a/app/models/notification.rb b/app/models/notification.rb index e2ee3aa2d874ef..6641b72f77c2c9 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -37,31 +37,37 @@ class Notification < ApplicationRecord 'Quote' => :quote, }.freeze - # Please update app/javascript/api_types/notification.ts if you change this + # Please update app/javascript/mastodon/api_types/notifications.ts if you change this PROPERTIES = { mention: { filterable: true, + baseline: true, }.freeze, status: { filterable: false, + baseline: true, }.freeze, list_status: { filterable: false, }.freeze, reblog: { filterable: true, + baseline: true, }.freeze, status_reference: { filterable: true, }.freeze, follow: { filterable: true, + baseline: true, }.freeze, follow_request: { filterable: true, + baseline: true, }.freeze, favourite: { filterable: true, + baseline: true, }.freeze, emoji_reaction: { filterable: true, @@ -71,30 +77,47 @@ class Notification < ApplicationRecord }.freeze, poll: { filterable: false, + baseline: true, }.freeze, update: { filterable: false, + baseline: true, }.freeze, severed_relationships: { filterable: false, + baseline: false, }.freeze, moderation_warning: { filterable: false, + baseline: false, }.freeze, annual_report: { filterable: false, + baseline: true, }.freeze, 'admin.sign_up': { filterable: false, + baseline: false, }.freeze, 'admin.report': { filterable: false, + baseline: false, }.freeze, quote: { filterable: true, + baseline: true, }.freeze, quoted_update: { filterable: false, + baseline: true, + }.freeze, + added_to_collection: { + filterable: true, + baseline: false, + }.freeze, + collection_update: { + filterable: false, + baseline: false, }.freeze, }.freeze @@ -135,6 +158,8 @@ class Notification < ApplicationRecord belongs_to :account_relationship_severance_event, inverse_of: false belongs_to :generated_annual_report, inverse_of: false belongs_to :quote, inverse_of: :notification + belongs_to :collection_item, inverse_of: false # TODO: have an inverse? + belongs_to :collection, inverse_of: false # TODO: have an inverse? end validates :type, inclusion: { in: TYPES } @@ -168,6 +193,15 @@ def target_status end end + def target_collection + case type + when :added_to_collection + collection_item&.collection + when :collection_update + collection + end + end + class << self def browserable(types: [], exclude_types: [], from_account_id: nil, include_filtered: false) requested_types = if types.empty? @@ -243,8 +277,10 @@ def set_from_account case activity_type when 'Status' self.from_account_id = type == :quoted_update ? activity&.quote&.quoted_account_id : activity&.account_id - when 'Follow', 'Favourite', 'EmojiReaction', 'EmojiReact', 'FollowRequest', 'Poll', 'Report', 'Quote' + when 'Follow', 'Favourite', 'EmojiReaction', 'EmojiReact', 'FollowRequest', 'Poll', 'Report', 'Quote', 'Collection' self.from_account_id = activity&.account_id + when 'CollectionItem' + self.from_account_id = activity&.collection&.account_id when 'Mention', 'StatusReference', 'ListStatus' self.from_account_id = activity&.status&.account_id when 'Account' diff --git a/app/models/notification_group.rb b/app/models/notification_group.rb index 5f96979928bb57..e7232b5ce84d94 100644 --- a/app/models/notification_group.rb +++ b/app/models/notification_group.rb @@ -63,6 +63,7 @@ def self.from_notifications(notifications, pagination_range: nil, grouped_types: delegate :type, :target_status, + :target_collection, :report, :account_relationship_severance_event, :account_warning, diff --git a/app/models/preview_card_provider.rb b/app/models/preview_card_provider.rb index 9d77d45e22cbbf..5c052de1e64079 100644 --- a/app/models/preview_card_provider.rb +++ b/app/models/preview_card_provider.rb @@ -36,7 +36,6 @@ class PreviewCardProvider < ApplicationRecord scope :not_trendable, -> { where(trendable: false) } def self.matching_domain(domain) - segments = domain.split('.') - where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).by_domain_length.first + where(domain: domain_variants(domain)).by_domain_length.first end end diff --git a/app/models/quote.rb b/app/models/quote.rb index 9625965817a2eb..57fe8a66ae646a 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -35,7 +35,7 @@ class Quote < ApplicationRecord belongs_to :quoted_account, class_name: 'Account', optional: true before_validation :set_accounts - before_validation :set_activity_uri, only: :create, if: -> { account.local? && quoted_account&.remote? } + before_validation :set_activity_uri, on: :create, if: -> { account.local? && quoted_account&.remote? } validates :activity_uri, presence: true, if: -> { account.local? && quoted_account&.remote? } validates :approval_uri, absence: true, if: -> { quoted_account&.local? } validate :validate_visibility diff --git a/app/models/report.rb b/app/models/report.rb index 282a1f757014bb..117005c8622d63 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -68,7 +68,7 @@ class Report < ApplicationRecord violation: 2_000, } - before_validation :set_uri, only: :create + before_validation :set_uri, on: :create after_create_commit :trigger_create_webhooks after_update_commit :trigger_update_webhooks diff --git a/app/models/search.rb b/app/models/search.rb index 676c2a7f8e881f..66c9173e028056 100644 --- a/app/models/search.rb +++ b/app/models/search.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class Search < ActiveModelSerializers::Model - attributes :accounts, :statuses, :hashtags + attributes :accounts, :statuses, :hashtags, :collections end diff --git a/app/models/tag.rb b/app/models/tag.rb index 047bc20b1936a4..4fb1cf4e9af49d 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -129,7 +129,7 @@ def find_or_create_by_names(name_or_names) end def search_for(term, limit = 5, offset = 0, options = {}) - stripped_term = term.strip + stripped_term = term.to_s.strip options.reverse_merge!({ exclude_unlistable: true, exclude_unreviewed: false }) query = Tag.matches_name(stripped_term) diff --git a/app/models/trends/preview_card_provider_filter.rb b/app/models/trends/preview_card_provider_filter.rb index 33f4e97912a89d..69205908bffa9f 100644 --- a/app/models/trends/preview_card_provider_filter.rb +++ b/app/models/trends/preview_card_provider_filter.rb @@ -5,6 +5,8 @@ class Trends::PreviewCardProviderFilter status ).freeze + IGNORED_PARAMS = %w(page).freeze + attr_reader :params def initialize(params) @@ -15,7 +17,7 @@ def results scope = PreviewCardProvider.unscoped params.each do |key, value| - next if key.to_s == 'page' + next if IGNORED_PARAMS.include?(key.to_s) scope.merge!(scope_for(key, value.to_s.strip)) if value.present? end diff --git a/app/models/user.rb b/app/models/user.rb index 718087e32937ff..1e373bdae338e0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -97,10 +97,10 @@ class User < ApplicationRecord has_one :custom_css, inverse_of: :user, dependent: :destroy - validates :email, presence: true, email_address: true + validates :email, presence: true, email_address: true, length: { maximum: 320 } + validates :email, email_mx: { attempt_ip: :sign_up_ip }, if: :validate_email_dns? validates_with UserEmailValidator, if: -> { ENV['EMAIL_DOMAIN_LISTS_APPLY_AFTER_CONFIRMATION'] == 'true' || !confirmed? } - validates_with EmailMxValidator, if: :validate_email_dns? validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create # Honeypot/anti-spam fields diff --git a/app/models/user_role.rb b/app/models/user_role.rb index 3998b1fe9d0540..de0ad8f18843c8 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -4,15 +4,16 @@ # # Table name: user_roles # -# id :bigint(8) not null, primary key -# color :string default(""), not null -# highlighted :boolean default(FALSE), not null -# name :string default(""), not null -# permissions :bigint(8) default(0), not null -# position :integer default(0), not null -# require_2fa :boolean default(FALSE), not null -# created_at :datetime not null -# updated_at :datetime not null +# id :bigint(8) not null, primary key +# collection_limit :integer default(10), not null +# color :string default(""), not null +# highlighted :boolean default(FALSE), not null +# name :string default(""), not null +# permissions :bigint(8) default(0), not null +# position :integer default(0), not null +# require_2fa :boolean default(FALSE), not null +# created_at :datetime not null +# updated_at :datetime not null # class UserRole < ApplicationRecord @@ -39,6 +40,7 @@ class UserRole < ApplicationRecord delete_user_data: (1 << 19), view_feeds: (1 << 20), invite_bypass_approval: (1 << 21), + manage_email_subscriptions: (1 << 22), manage_sensitive_words: (1 << 29), manage_ng_words: (1 << 30), }.freeze @@ -63,6 +65,10 @@ module Flags invite_bypass_approval ).freeze, + email: %i( + manage_email_subscriptions + ).freeze, + moderation: %i( view_dashboard view_audit_log @@ -104,6 +110,7 @@ module Flags validates :name, presence: true, unless: :everyone? validates :color, format: { with: CSS_COLORS }, if: :color? validates :position, numericality: { in: (-POSITION_LIMIT..POSITION_LIMIT) } + validates :collection_limit, numericality: { only_integer: true, greater_than_or_equal_to: 0 } validate :validate_permissions_elevation validate :validate_position_elevation diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 36ca1aa2bf9893..9dfa530ee81d42 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -42,6 +42,7 @@ class KeyError < Error; end setting :dtl_force_searchability, default: :unchange, in: %w(unchange public public_unlisted) setting :lock_follow_from_bot, default: false setting :reject_send_limited_to_suspects, default: false + setting :email_subscriptions, default: false setting_inverse_alias :indexable, :noindex setting_inverse_alias :show_statuses_count, :hide_statuses_count @@ -72,7 +73,7 @@ class KeyError < Error; end setting :missing_alt_text_modal, default: true setting :reduce_motion, default: false setting :expand_content_warnings, default: false - setting :display_media, default: 'default', in: %w(default show_all hide_all) + setting :display_media, default: 'default', in: %w(hide_all default show_all) setting :auto_play, default: true setting :emoji_style, default: 'auto', in: %w(auto native twemoji) setting :simple_timeline_menu, default: false diff --git a/app/policies/account_policy.rb b/app/policies/account_policy.rb index 91661a9b33c89a..add93d21df7da8 100644 --- a/app/policies/account_policy.rb +++ b/app/policies/account_policy.rb @@ -80,4 +80,8 @@ def feature? def index_collections? current_account.nil? || !record.blocking_or_domain_blocking?(current_account) end + + def index_featured_in_collections? + current_account.id == record.id + end end diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 0ff63f044c71ca..a3a3ad2ae994af 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -26,9 +26,8 @@ def show_activity? following_author_domain? end - # This is about requesting a quote post, not validating it def quote? - show? && record.quote_policy_for_account(current_account) != :denied + show? && !blocking_author? && record.quote_policy_for_account(current_account) != :denied end def reblog? diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 5daa852995e68b..2daa14ecc2c72f 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -4,7 +4,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer include RoutingHelper include FormattingHelper - context :security + context :security, :webfinger context_extensions :manually_approves_followers, :featured, :also_known_as, :moved_to, :property_value, :discoverable, :suspended, :searchable_by, @@ -12,7 +12,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer context_extensions :interaction_policies if Mastodon::Feature.collections_enabled? - attributes :id, :type, :following, :followers, + attributes :id, :webfinger, :type, :following, :followers, :inbox, :outbox, :featured, :featured_tags, :preferred_username, :name, :summary, :url, :manually_approves_followers, @@ -55,6 +55,10 @@ def id ActivityPub::TagManager.instance.uri_for(object) end + def webfinger + object.local_username_and_domain + end + def type if object.instance_actor? 'Application' @@ -195,7 +199,15 @@ def other_setting end def interaction_policy - uri = object.discoverable? ? ActivityPub::TagManager::COLLECTIONS[:public] : ActivityPub::TagManager.instance.uri_for(object) + uri = begin + if !object.discoverable? + ActivityPub::TagManager.instance.uri_for(object) + elsif object.locked? + ActivityPub::TagManager.instance.followers_uri_for(object) + else + ActivityPub::TagManager::COLLECTIONS[:public] + end + end { canFeature: { diff --git a/app/serializers/activitypub/featured_collection_serializer.rb b/app/serializers/activitypub/featured_collection_serializer.rb index d6242b9d5b9209..b83e0bf9ea7123 100644 --- a/app/serializers/activitypub/featured_collection_serializer.rb +++ b/app/serializers/activitypub/featured_collection_serializer.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true class ActivityPub::FeaturedCollectionSerializer < ActivityPub::Serializer - attributes :id, :type, :total_items, :name, :attributed_to, + attributes :id, :type, :total_items, :name, :attributed_to, :url, :sensitive, :discoverable, :published, :updated attribute :summary, unless: :language_present? attribute :summary_map, if: :language_present? - has_one :tag, key: :topic, serializer: ActivityPub::NoteSerializer::TagSerializer + has_one :topic, serializer: ActivityPub::NoteSerializer::TagSerializer has_many :collection_items, key: :ordered_items, serializer: ActivityPub::FeaturedItemSerializer @@ -31,8 +31,12 @@ def attributed_to ActivityPub::TagManager.instance.uri_for(object.account) end + def url + ActivityPub::TagManager.instance.url_for(object) + end + def total_items - object.collection_items.size + object.accepted_collection_items.size end def published @@ -46,4 +50,12 @@ def updated def language_present? object.language.present? end + + def collection_items + object.accepted_collection_items + end + + def topic + object.tag + end end diff --git a/app/serializers/activitypub/featured_item_serializer.rb b/app/serializers/activitypub/featured_item_serializer.rb index 56c0b4390fac0a..529bfd797f62e2 100644 --- a/app/serializers/activitypub/featured_item_serializer.rb +++ b/app/serializers/activitypub/featured_item_serializer.rb @@ -4,7 +4,7 @@ class ActivityPub::FeaturedItemSerializer < ActivityPub::Serializer include RoutingHelper attributes :id, :type, :featured_object, :featured_object_type, - :feature_authorization + :feature_authorization, :published def id ActivityPub::TagManager.instance.uri_for(object) @@ -29,4 +29,8 @@ def feature_authorization object.approval_uri end end + + def published + object.created_at.iso8601 + end end diff --git a/app/serializers/activitypub/flag_serializer.rb b/app/serializers/activitypub/flag_serializer.rb index 2f2a707d362997..fe6f26d23d8cee 100644 --- a/app/serializers/activitypub/flag_serializer.rb +++ b/app/serializers/activitypub/flag_serializer.rb @@ -17,10 +17,24 @@ def actor end def virtual_object - [ActivityPub::TagManager.instance.uri_for(object.target_account)] + object.statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) } + target_account_uris + status_uris + collection_uris end def content object.comment end + + private + + def target_account_uris + [ActivityPub::TagManager.instance.uri_for(object.target_account)] + end + + def status_uris + object.statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) } + end + + def collection_uris + object.collections.map { |c| ActivityPub::TagManager.instance.uri_for(c) } + end end diff --git a/app/serializers/concerns/notification_fallback_concern.rb b/app/serializers/concerns/notification_fallback_concern.rb new file mode 100644 index 00000000000000..a3fbf4f5691a57 --- /dev/null +++ b/app/serializers/concerns/notification_fallback_concern.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module NotificationFallbackConcern + extend ActiveSupport::Concern + + def fallback + { + title: fallback_title, + summary: fallback_summary, + description: nil, + } + end + + def needs_fallback? + return false if instance_options[:supported_notification_types].nil? + return false if Notification::PROPERTIES.dig(object.type, :baseline) || instance_options[:supported_notification_types].include?(object.type.to_s) + + # In rare cases, a notification might be missing its activity, in which case we can't do much + case object.type + when :severed_relationships + object.account_relationship_severance_event.present? + when :'admin.report' + object.report.present? + when :added_to_collection, :collection_update + object.target_collection.present? + else + true + end + end + + def fallback_title + account = object.is_a?(NotificationGroup) ? object.sample_accounts.first : object.from_account + + case object.type + when :severed_relationships + I18n.t( + 'notification_fallbacks.severed_relationships.title', + name: object.account_relationship_severance_event.target_name + ) + when :moderation_warning + I18n.t('notification_fallbacks.moderation_warning.title') + when :'admin.sign_up' + count = object.is_a?(NotificationGroup) ? object.sample_accounts.count : 1 + if count > 1 + I18n.t( + 'notification_fallbacks.admin_sign_up.title_and_others_html', + name: TextFormatter.link_to_mention(account), + count: count - 1 + ) + else + I18n.t( + 'notification_fallbacks.admin_sign_up.title_html', + name: TextFormatter.link_to_mention(account) + ) + end + when :'admin.report' + I18n.t( + 'notification_fallbacks.admin_report.title_html', + name: account.remote? ? account.domain : TextFormatter.link_to_mention(account), + target: TextFormatter.link_to_mention(object.report.target_account) + ) + when :added_to_collection + I18n.t( + 'notification_fallbacks.added_to_collection.title_html', + name: TextFormatter.link_to_mention(account) + ) + when :collection_update + I18n.t( + 'notification_fallbacks.collection_update.title_html', + name: account + ) + end + end + + def fallback_summary + case object.type + when :severed_relationships + I18n.t( + 'notification_fallbacks.severed_relationships.summary_html', + from: Rails.configuration.x.local_domain, + target: object.account_relationship_severance_event.target_name, + link: link_to(I18n.t('notification_fallbacks.generic.sign_in'), severed_relationships_url) + ) + when :moderation_warning + I18n.t( + 'notification_fallbacks.moderation_warning.summary_html', + link: link_to(I18n.t('notification_fallbacks.generic.sign_in'), disputes_strike_url(object.account_warning.id)) + ) + when :'admin.sign_up', :'admin.report', :added_to_collection, :collection_update + I18n.t( + 'notification_fallbacks.generic.summary_html', + link: link_to(I18n.t('notification_fallbacks.generic.sign_in'), root_url) + ) + end + end +end diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb index b58bec246d9c6b..ccf57a5f907753 100644 --- a/app/serializers/rest/account_serializer.rb +++ b/app/serializers/rest/account_serializer.rb @@ -21,6 +21,7 @@ class REST::AccountSerializer < ActiveModel::Serializer attribute :memorial, if: :memorial? attribute :feature_approval, if: -> { Mastodon::Feature.collections_enabled? } + attribute :email_subscriptions, if: -> { Mastodon::Feature.email_subscriptions_enabled? } class AccountDecorator < SimpleDelegator def self.model_name @@ -191,4 +192,8 @@ def feature_approval current_user: object.feature_policy_for_account(current_user&.account), } end + + def email_subscriptions + object.user_can?(:manage_email_subscriptions) && object.user_email_subscriptions_enabled? + end end diff --git a/app/serializers/rest/collection_item_serializer.rb b/app/serializers/rest/collection_item_serializer.rb index 8628960403d40d..4d75910a7aedda 100644 --- a/app/serializers/rest/collection_item_serializer.rb +++ b/app/serializers/rest/collection_item_serializer.rb @@ -1,11 +1,9 @@ # frozen_string_literal: true class REST::CollectionItemSerializer < ActiveModel::Serializer - delegate :accepted?, to: :object + attributes :id, :state, :created_at - attributes :id, :state - - attribute :account_id, if: :accepted? + attribute :account_id, if: :accepted_or_pending? def id object.id.to_s @@ -14,4 +12,8 @@ def id def account_id object.account_id.to_s end + + def accepted_or_pending? + object.pending? || object.accepted? + end end diff --git a/app/serializers/rest/collection_serializer.rb b/app/serializers/rest/collection_serializer.rb index c3f2b55a84a5c9..c1c2c70d326b5d 100644 --- a/app/serializers/rest/collection_serializer.rb +++ b/app/serializers/rest/collection_serializer.rb @@ -2,7 +2,7 @@ class REST::CollectionSerializer < ActiveModel::Serializer attributes :id, :uri, :name, :description, :language, :account_id, - :local, :sensitive, :discoverable, :item_count, + :local, :sensitive, :discoverable, :url, :item_count, :created_at, :updated_at belongs_to :tag, serializer: REST::ShallowTagSerializer @@ -13,14 +13,27 @@ def id object.id.to_s end + def uri + ActivityPub::TagManager.instance.uri_for(object) + end + + def url + ActivityPub::TagManager.instance.url_for(object) + end + def description return object.description if object.local? + return if object.description_html.nil? Sanitize.fragment(object.description_html, Sanitize::Config::MASTODON_STRICT) end def items - object.items_for(current_user&.account) + @items ||= object.items_for(current_user&.account) + end + + def item_count + items.size end def account_id diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 4fd564a5ca5986..dd1d47bc28275a 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -28,6 +28,7 @@ def thumbnail '@1x': full_asset_url(object.thumbnail.file.url(:'@1x')), '@2x': full_asset_url(object.thumbnail.file.url(:'@2x')), }, + description: Setting.thumbnail_description, } else { @@ -73,6 +74,8 @@ def configuration accounts: { max_display_name_length: Account::DISPLAY_NAME_LENGTH_LIMIT, max_note_length: Account::NOTE_LENGTH_LIMIT, + max_avatar_description_length: Account::Avatar::MAX_DESCRIPTION_LENGTH, + max_header_description_length: Account::Header::MAX_DESCRIPTION_LENGTH, max_featured_tags: FeaturedTag::LIMIT, max_pinned_statuses: StatusPinValidator::PIN_LIMIT, max_profile_fields: Account::DEFAULT_FIELDS_SIZE, diff --git a/app/serializers/rest/notification_group_serializer.rb b/app/serializers/rest/notification_group_serializer.rb index c4d73ab2aa1ea1..f226ad1cc7fc49 100644 --- a/app/serializers/rest/notification_group_serializer.rb +++ b/app/serializers/rest/notification_group_serializer.rb @@ -1,13 +1,19 @@ # frozen_string_literal: true class REST::NotificationGroupSerializer < ActiveModel::Serializer - # Please update app/javascript/api_types/notification.ts when making changes to the attributes + include RoutingHelper + include ActionView::Helpers::UrlHelper + include NotificationFallbackConcern + + # Please update app/javascript/mastodon/api_types/notifications.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? + attribute :fallback, if: :needs_fallback? + attribute :sample_account_ids attribute :status_id, if: :status_type? belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer @@ -15,6 +21,7 @@ class REST::NotificationGroupSerializer < ActiveModel::Serializer belongs_to :account_warning, key: :moderation_warning, if: :moderation_warning_event?, serializer: REST::AccountWarningSerializer has_one :list, if: :list_status_type?, serializer: REST::ListSerializer belongs_to :generated_annual_report, key: :annual_report, if: :annual_report_event?, serializer: REST::AnnualReportEventSerializer + belongs_to :target_collection, key: :collection, if: :collection_type?, serializer: REST::CollectionSerializer def sample_account_ids object.sample_accounts.pluck(:id).map(&:to_s) @@ -28,6 +35,10 @@ def status_type? [:favourite, :emoji_reaction, :reblog, :status, :mention, :status_reference, :poll, :update, :quote, :quoted_update, :list_status].include?(object.type) end + def collection_type? + [:added_to_collection, :collection_update].include?(object.type) + end + def report_type? object.type == :'admin.report' end diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb index 15af89ac3be140..822b49e553d3cd 100644 --- a/app/serializers/rest/notification_serializer.rb +++ b/app/serializers/rest/notification_serializer.rb @@ -1,11 +1,17 @@ # frozen_string_literal: true class REST::NotificationSerializer < ActiveModel::Serializer - # Please update app/javascript/api_types/notification.ts when making changes to the attributes + include RoutingHelper + include ActionView::Helpers::UrlHelper + include NotificationFallbackConcern + + # Please update app/javascript/mastodon/api_types/notifications.ts when making changes to the attributes attributes :id, :type, :created_at, :group_key attribute :filtered, if: :filtered? + attribute :fallback, if: :needs_fallback? + belongs_to :from_account, key: :account, serializer: REST::AccountSerializer belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer @@ -13,6 +19,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer belongs_to :list, if: :list_status_type?, serializer: REST::ListSerializer 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 + belongs_to :target_collection, key: :collection, if: :collection_type?, serializer: REST::CollectionSerializer def id object.id.to_s @@ -26,6 +33,10 @@ def status_type? [:favourite, :emoji_reaction, :reaction, :reblog, :status_reference, :status, :list_status, :mention, :poll, :update, :quoted_update, :quote].include?(object.type) end + def collection_type? + [:added_to_collection, :collection_update].include?(object.type) + end + def report_type? object.type == :'admin.report' end diff --git a/app/serializers/rest/profile_serializer.rb b/app/serializers/rest/profile_serializer.rb index b96daf87d46324..79b620f0ac462e 100644 --- a/app/serializers/rest/profile_serializer.rb +++ b/app/serializers/rest/profile_serializer.rb @@ -2,9 +2,11 @@ class REST::ProfileSerializer < ActiveModel::Serializer include RoutingHelper + include FormattingHelper # Please update app/javascript/api_types/profile.ts when making changes to the attributes attributes :id, :display_name, :note, :fields, + :formatted_note, :formatted_fields, :avatar, :avatar_static, :avatar_description, :header, :header_static, :header_description, :locked, :bot, :hide_collections, :discoverable, :indexable, @@ -17,10 +19,18 @@ def id object.id.to_s end + def formatted_note + account_bio_format(object) + end + def fields object.fields.map(&:to_h) end + def formatted_fields + object.fields.map { |field| { name: field.name, value: account_field_value_format(field), verified_at: field.verified_at } } + end + def avatar object.avatar_file_name.present? ? full_asset_url(object.avatar_original_url) : nil end diff --git a/app/serializers/rest/role_serializer.rb b/app/serializers/rest/role_serializer.rb index 5b81c6e0487c6c..a3d8af64b218b0 100644 --- a/app/serializers/rest/role_serializer.rb +++ b/app/serializers/rest/role_serializer.rb @@ -3,6 +3,8 @@ class REST::RoleSerializer < ActiveModel::Serializer attributes :id, :name, :permissions, :color, :highlighted + attribute :collection_limit, if: -> { Mastodon::Feature.collections_enabled? } + def id object.id.to_s end diff --git a/app/serializers/rest/search_serializer.rb b/app/serializers/rest/search_serializer.rb index ee9b421eb223da..8141a4c69ce4b2 100644 --- a/app/serializers/rest/search_serializer.rb +++ b/app/serializers/rest/search_serializer.rb @@ -4,4 +4,5 @@ class REST::SearchSerializer < ActiveModel::Serializer has_many :accounts, serializer: REST::AccountSerializer has_many :statuses, serializer: REST::StatusSerializer has_many :hashtags, serializer: REST::TagSerializer + has_many :collections, serializer: REST::CollectionSerializer end diff --git a/app/serializers/seo/social_media_posting_serializer.rb b/app/serializers/seo/social_media_posting_serializer.rb index 72030e4173da3e..7ed6dec160daf9 100644 --- a/app/serializers/seo/social_media_posting_serializer.rb +++ b/app/serializers/seo/social_media_posting_serializer.rb @@ -97,7 +97,7 @@ def video upload_date: attachment.created_at.iso8601, content_url: full_asset_url(attachment.file.url(:original, false)), thumbnail_url: attachment.thumbnail.present? ? full_asset_url(attachment.thumbnail.url(:original)) : full_asset_url(attachment.file.url(:small)), - embed_url: medium_player_url(attachment), + embed_url: player_medium_url(attachment), description: attachment.description, } end @@ -112,7 +112,7 @@ def audio upload_date: attachment.created_at.iso8601, content_url: full_asset_url(attachment.file.url(:original, false)), thumbnail_url: attachment.thumbnail.present? ? full_asset_url(attachment.thumbnail.url(:original)) : full_asset_url(attachment.file.url(:small)), - embed_url: medium_player_url(attachment), + embed_url: player_medium_url(attachment), description: attachment.description, } end diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb index 1fb3f45ce5811f..f5f00ef120e2f8 100644 --- a/app/services/activitypub/fetch_remote_actor_service.rb +++ b/app/services/activitypub/fetch_remote_actor_service.rb @@ -27,11 +27,21 @@ def call(uri, prefetched_body: nil, break_on_redirect: false, only_key: false, s raise Error, "Unsupported JSON-LD context for document #{uri}" unless supported_context? raise Error, "Unexpected object type for actor #{uri} (expected any of: #{SUPPORTED_TYPES})" unless expected_type? raise Error, "Actor #{uri} has moved to #{@json['movedTo']}" if break_on_redirect && @json['movedTo'].present? - raise Error, "Actor #{uri} has no 'preferredUsername', which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? + raise Error, "Actor #{uri} has neither 'preferredUsername' nor `webfinger`, which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? && @json['webfinger'].blank? - @uri = @json['id'] - @username = @json['preferredUsername'] - @domain = Addressable::URI.parse(@uri).normalized_host + @uri = @json['id'] + + # FEP-2c59 defines a `webfinger` attribute that makes things more explicit and spares an extra request in some cases. + # It supersedes `preferredUsername`. + @username, @domain = split_acct(@json['webfinger']) if @json['webfinger'].present? && @json['webfinger'].is_a?(String) + + if @username.blank? || @domain.blank? + raise "Actor #{uri} has no `preferredUsername`, and either a bogus or missing `webfinger`, which is a requirement for Mastodon compatibility" if @json['preferredUsername'].blank? + + Rails.logger.debug { "Actor #{uri} has an invalid `webfinger` value, falling back to `preferredUsername`" } if @json['webfinger'].present? + @username = @json['preferredUsername'] + @domain = Addressable::URI.parse(@uri).normalized_host + end check_webfinger! unless only_key diff --git a/app/services/activitypub/fetch_remote_featured_collection_service.rb b/app/services/activitypub/fetch_remote_featured_collection_service.rb index babad143e1751a..968dc6811eceb0 100644 --- a/app/services/activitypub/fetch_remote_featured_collection_service.rb +++ b/app/services/activitypub/fetch_remote_featured_collection_service.rb @@ -3,8 +3,12 @@ class ActivityPub::FetchRemoteFeaturedCollectionService < BaseService include JsonLdHelper - def call(uri, request_id: nil, on_behalf_of: nil) - json = fetch_resource(uri, true, on_behalf_of) + def call(uri, request_id: nil, prefetched_body: nil, on_behalf_of: nil) + json = if prefetched_body.nil? + fetch_resource(uri, true, on_behalf_of) + else + body_to_json(prefetched_body, compare_id: uri) + end return unless supported_context?(json) return unless json['type'] == 'FeaturedCollection' diff --git a/app/services/activitypub/fetch_remote_key_service.rb b/app/services/activitypub/fetch_remote_key_service.rb index b6d9cfa7334bd0..9b61ac6086b930 100644 --- a/app/services/activitypub/fetch_remote_key_service.rb +++ b/app/services/activitypub/fetch_remote_key_service.rb @@ -6,15 +6,19 @@ class ActivityPub::FetchRemoteKeyService < BaseService class Error < StandardError; end # Returns actor that owns the key + # This is to be used when we know a key URI but don't know the associated account URI, + # otherwise use `ActivityPub::FetchRemoteActorService`. def call(uri, suppress_errors: true) raise Error, 'No key URI given' if uri.blank? + @suppress_errors = suppress_errors + @uri = uri @json = fetch_resource(uri, false) raise Error, "Unable to fetch key JSON at #{uri}" if @json.nil? raise Error, "Unsupported JSON-LD context for document #{uri}" unless supported_context?(@json) || (supported_security_context?(@json) && @json['owner'].present? && !actor_type?) raise Error, "Unexpected object type for key #{uri}" unless expected_type? - return find_actor(@json['id'], @json, suppress_errors) if actor_type? + return keypair_from_actor_json(@json['id'], @json) if actor_type? @owner = fetch_resource(owner_uri, true) @@ -23,7 +27,7 @@ def call(uri, suppress_errors: true) raise Error, "Unexpected object type for actor #{owner_uri} (expected any of: #{SUPPORTED_TYPES})" unless expected_owner_type? raise Error, "publicKey id for #{owner_uri} does not correspond to #{@json['id']}" unless confirmed_owner? - find_actor(owner_uri, @owner, suppress_errors) + keypair_from_actor_json(owner_uri, @owner) rescue Error => e Rails.logger.debug { "Fetching key #{uri} failed: #{e.message}" } raise unless suppress_errors @@ -31,10 +35,25 @@ def call(uri, suppress_errors: true) private - def find_actor(uri, prefetched_body, suppress_errors) - actor = ActivityPub::TagManager.instance.uri_to_actor(uri) - actor ||= ActivityPub::FetchRemoteActorService.new.call(uri, prefetched_body: prefetched_body, suppress_errors: suppress_errors) - actor + def keypair_from_actor_json(actor_uri, actor_json) + actor = find_actor(actor_uri, actor_json) + return if actor.nil? + + keypair = actor.keypairs.find_by(uri: @uri) + return keypair if keypair.present? + + Keypair.from_legacy_account(actor, uri: @uri) if actor.public_key.present? + end + + def find_actor(uri, prefetched_body) + # `FetchRemoteKeyService` is called when we don't know of a key. + # This is most likely because we don't know of an account yet, but it could also be because we have stale data. + # Return the actor if it is known and has been updated recently, otherwise, process it in full. + + actor = ActivityPub::TagManager.instance.uri_to_actor(uri) + return actor if actor.present? && !actor.possibly_stale? + + ActivityPub::FetchRemoteActorService.new.call(uri, prefetched_body: prefetched_body, suppress_errors: @suppress_errors) end def expected_type? diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 35a380c9cfb4fa..6256373d6cfd28 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -6,12 +6,16 @@ class ActivityPub::ProcessAccountService < BaseService include Redisable include Lockable + MAX_PUBLIC_KEYS = 10 MAX_PROFILE_FIELDS = 50 SUBDOMAINS_RATELIMIT = 10 DISCOVERIES_PER_REQUEST = 400 SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/ SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/ + PROCESSING_DELAY = (30.seconds)..(10.minutes) + VERIFY_DELAY = 10.minutes + VALID_URI_SCHEMES = %w(http https).freeze # Should be called with confirmed valid JSON @@ -32,10 +36,17 @@ def call(username, domain, json, options = {}) @options[:request_id] ||= "#{Time.now.utc.to_i}-#{username}@#{domain}" with_redis_lock("process_account:#{@uri}") do - @account = Account.remote.find_by(uri: @uri) if @options[:only_key] - @account ||= Account.find_remote(@username, @domain) - @old_public_key = @account&.public_key - @old_protocol = @account&.protocol + if @options[:only_key] + # `only_key` is used to update an existing account known by its `uri`. + # Lookup by handle and new account creation do not make sense in this case. + @account = Account.remote.find_by(uri: @uri) + return if @account.nil? + else + @account = Account.find_remote(@username, @domain) + end + + @old_public_keys = @account.present? ? (@account.keypairs.pluck(:public_key) + [@account.public_key.presence].compact) : [] + @old_protocol = @account&.protocol @old_searchability = @account&.searchability @suspension_changed = false @@ -58,14 +69,15 @@ def call(username, domain, json, options = {}) end after_protocol_change! if protocol_changed? - after_key_change! if key_changed? && !@options[:signed_with_known_key] - clear_tombstones! if key_changed? + after_key_change! if all_public_keys_changed? && !@options[:signed_with_known_key] + # TODO: maybe tie tombstones to specific keys? i.e. we don't need to keep tombstones if all keys changed + clear_tombstones! if all_public_keys_changed? after_suspension_change! if suspension_changed? unless @options[:only_key] || (@account.suspended? && !@account.remote_pending) check_featured_collection! if @json['featured'].present? check_featured_tags_collection! if @json['featuredTags'].present? - check_featured_collections_collection! if @json['featuredCollections'].present? && Mastodon::Feature.collections_federation_enabled? + check_featured_collections_collection! if @json['featuredCollections'].present? && Mastodon::Feature.collections_enabled? check_links! if @account.fields.any?(&:requires_verification?) end @@ -175,7 +187,11 @@ def valid_account? end def set_fetchable_key! - @account.public_key = public_key || '' + @account.keypairs.upsert_all(public_keys, unique_by: :uri) + @account.keypairs.where.not(uri: public_keys.pluck(:uri)).delete_all + + # Unset legacy public key attribute + @account.public_key = '' end def set_fetchable_attributes! @@ -185,7 +201,7 @@ def set_fetchable_attributes! @account.avatar = nil if @account.avatar_remote_url.blank? @account.avatar_description = avatar_description || '' rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - RedownloadAvatarWorker.perform_in(rand(30..600).seconds, @account.id) + RedownloadAvatarWorker.perform_in(rand(PROCESSING_DELAY), @account.id) end begin header_url, header_description = image_url_and_description('image') @@ -193,7 +209,7 @@ def set_fetchable_attributes! @account.header = nil if @account.header_remote_url.blank? @account.header_description = header_description || '' rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - RedownloadHeaderWorker.perform_in(rand(30..600).seconds, @account.id) + RedownloadHeaderWorker.perform_in(rand(PROCESSING_DELAY), @account.id) end @account.statuses_count = outbox_total_items if outbox_total_items.present? @account.following_count = following_total_items if following_total_items.present? @@ -247,7 +263,7 @@ def check_featured_collections_collection! end def check_links! - VerifyAccountLinksWorker.perform_in(rand(10.minutes.to_i), @account.id) + VerifyAccountLinksWorker.perform_in(rand(VERIFY_DELAY), @account.id) end def process_duplicate_accounts! @@ -295,14 +311,35 @@ def image_url_and_description(key) [url, description] end - def public_key - value = first_of_value(@json['publicKey']) + def public_keys + # TODO: handle FEP-521a - return if value.nil? - return value['publicKeyPem'] if value.is_a?(Hash) + @public_keys ||= as_array(@json['publicKey']).take(MAX_PUBLIC_KEYS).filter_map do |value| + next if value.nil? + + if value.is_a?(Hash) + next unless value['owner'] == @account.uri + + key = value['publicKeyPem'] + value = value['id'] - key = fetch_resource_without_id_validation(value) - key['publicKeyPem'] if key + # Key is contained within the actor document, no need to fetch anything else + next { type: :rsa, public_key: key, uri: value } if value.split('#').first == @account.uri + end + + key_id = value + + # Key is fetched without ID validation because of a GoToSocial bug + value = fetch_resource_without_id_validation(key_id) + + # Special handling for GoToSocial which returns the whole actor for the key ID + value = first_of_value(value['publicKey']) if value.is_a?(Hash) && value.key?('publicKey') + + next unless value['owner'] == @account.uri + + key = value['publicKeyPem'] + { type: :rsa, public_key: key, uri: key_id } + end end def url @@ -482,8 +519,8 @@ def domain_block @domain_block = DomainBlock.rule_for(@domain) end - def key_changed? - !@old_public_key.nil? && @old_public_key != @account.public_key + def all_public_keys_changed? + !@old_public_keys.empty? && @account.keypairs.none? { |keypair| keypair.usable? && @old_public_keys.include?(keypair.public_key) } end def suspension_changed? diff --git a/app/services/activitypub/process_featured_collection_service.rb b/app/services/activitypub/process_featured_collection_service.rb index 2ef555e6bc2d84..18e0da32d701ac 100644 --- a/app/services/activitypub/process_featured_collection_service.rb +++ b/app/services/activitypub/process_featured_collection_service.rb @@ -17,26 +17,26 @@ def call(account, json, request_id: nil) Collection.transaction do @collection = @account.collections.find_or_initialize_by(uri: @json['id']) - @collection.update!( - local: false, - name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], - description_html: truncated_summary, - language:, - sensitive: @json['sensitive'], - discoverable: @json['discoverable'], - original_number_of_items: @json['totalItems'] || 0, - tag_name: @json.dig('topic', 'name') - ) - - process_items! + @collection.update!(collection_attributes) + + @items = (@json['orderedItems'] || [])[0, ITEMS_LIMIT] + item_uris = @items.filter_map { |i| value_or_id(i) } + @collection.collection_items.where.not(uri: item_uris).delete_all end + process_items! + notify_about_update! + @collection end end private + def notify_about_update! + NotifyOfCollectionUpdateService.new.call(@collection) + end + def truncated_summary text = @json['summaryMap']&.values&.first || @json['summary'] || '' text[0, Collection::DESCRIPTION_LENGTH_HARD_LIMIT] @@ -46,14 +46,30 @@ def language @json['summaryMap']&.keys&.first end + def url + url = url_to_href(@json['url'], 'text/html') + return @json['id'] if url.blank? || unsupported_uri_scheme?(url) + + url + end + + def collection_attributes + { + local: false, + name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], + description_html: truncated_summary, + language:, + sensitive: @json['sensitive'], + discoverable: @json['discoverable'], + original_number_of_items: @json['totalItems'] || 0, + tag_name: @json.dig('topic', 'name'), + url:, + } + end + def process_items! - uris = [] - items = @json['orderedItems'] || [] - items.take(ITEMS_LIMIT).each_with_index do |item_json, index| - uris << value_or_id(item_json) - ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index, @request_id) + @items.each_with_index do |item_json, index| + ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index + 1, @request_id) end - uris.compact! - @collection.collection_items.where.not(uri: uris).delete_all end end diff --git a/app/services/activitypub/process_featured_item_service.rb b/app/services/activitypub/process_featured_item_service.rb index 961de802c95482..a4323b41c6a220 100644 --- a/app/services/activitypub/process_featured_item_service.rb +++ b/app/services/activitypub/process_featured_item_service.rb @@ -5,6 +5,8 @@ class ActivityPub::ProcessFeaturedItemService include Lockable include Redisable + PROCESSING_DELAY = (30.seconds)..(10.minutes) + def call(collection, uri_or_object, position: nil, request_id: nil) @collection = collection @request_id = request_id @@ -41,12 +43,14 @@ def pre_approved_item end def new_item - @collection.collection_items.new + @collection.collection_items.new( + created_at: @item_json['published'] + ) end def verify_authorization! ActivityPub::VerifyFeaturedItemService.new.call(@collection_item, @approval_uri, request_id: @request_id) rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - ActivityPub::VerifyFeaturedItemWorker.perform_in(rand(30..600).seconds, @collection_item.id, @approval_uri, @request_id) + ActivityPub::VerifyFeaturedItemWorker.perform_in(rand(PROCESSING_DELAY), @collection_item.id, @approval_uri, @request_id) end end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index cb039c8bfe2f0f..8cf5c7e739b611 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -8,6 +8,9 @@ class ActivityPub::ProcessStatusUpdateService < BaseService class AbortError < ::StandardError; end + CRAWL_DELAY = 1.minute + PROCESSING_DELAY = (30.seconds)..(10.minutes) + def call(status, activity_json, object_json, request_id: nil) raise ArgumentError, 'Status has unsaved changes' if status.changed? @@ -139,7 +142,7 @@ def download_media_files! media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed? media_attachment.save rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) + RedownloadMediaWorker.perform_in(rand(PROCESSING_DELAY), media_attachment.id) rescue Seahorse::Client::NetworkingError => e Rails.logger.warn "Error storing media attachment: #{e}" end @@ -348,7 +351,7 @@ def update_mentions! # Queue unresolved mentions for later unresolved_mentions.uniq.each do |uri| - MentionResolveWorker.perform_in(rand(30...600).seconds, @status.id, uri, { 'request_id' => @request_id }) + MentionResolveWorker.perform_in(rand(PROCESSING_DELAY), @status.id, uri, { 'request_id' => @request_id }) end end @@ -459,7 +462,7 @@ def fetch_and_verify_quote!(quote, approval_uri, quote_uri) embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @activity_json['context']) ActivityPub::VerifyQuoteService.new.call(quote, approval_uri, fetchable_quoted_uri: quote_uri, prefetched_quoted_object: embedded_quote, request_id: @request_id) rescue Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS - ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(30..600).seconds, quote.id, quote_uri, { 'request_id' => @request_id, 'approval_uri' => approval_uri }) + ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(PROCESSING_DELAY), quote.id, quote_uri, { 'request_id' => @request_id, 'approval_uri' => approval_uri }) end def update_counts! @@ -529,7 +532,7 @@ def already_updated_more_recently? def reset_preview_card! @status.reset_preview_card! - LinkCrawlWorker.perform_in(rand(1..59).seconds, @status.id) + LinkCrawlWorker.perform_in(rand(CRAWL_DELAY), @status.id) end def broadcast_updates! diff --git a/app/services/add_account_to_collection_service.rb b/app/services/add_account_to_collection_service.rb index e53c67b57fe434..3c2ecacf4f421d 100644 --- a/app/services/add_account_to_collection_service.rb +++ b/app/services/add_account_to_collection_service.rb @@ -11,10 +11,9 @@ def call(collection, account) @collection_item = create_collection_item - if Mastodon::Feature.collections_federation_enabled? - distribute_add_activity if @account.local? - distribute_feature_request_activity if @account.remote? - end + notify_local_user if @account.local? + distribute_add_activity if @account.local? + distribute_feature_request_activity if @account.remote? @collection_item end @@ -22,10 +21,12 @@ def call(collection, account) private def create_collection_item - @collection.collection_items.create!( - account: @account, - state: :accepted - ) + state = @account.local? ? :accepted : :pending + @collection.collection_items.create!(account: @account, state:) + end + + def notify_local_user + LocalNotificationWorker.perform_async(@account.id, @collection_item.id, @collection_item.class.name, 'added_to_collection') end def distribute_add_activity diff --git a/app/services/block_service.rb b/app/services/block_service.rb index cbd0e8e75b50df..2efeceed0cbdfb 100644 --- a/app/services/block_service.rb +++ b/app/services/block_service.rb @@ -6,9 +6,11 @@ class BlockService < BaseService def call(account, target_account) return if account.id == target_account.id - UnfollowService.new.call(account, target_account) if account.following?(target_account) - UnfollowService.new.call(target_account, account) if target_account.following?(account) - RejectFollowService.new.call(target_account, account) if target_account.requested?(account) + @account = account + @target_account = target_account + + handle_following_relationships + handle_collections NotificationPermission.where(account: account, from_account: target_account).destroy_all @@ -21,6 +23,24 @@ def call(account, target_account) private + def handle_following_relationships + UnfollowService.new.call(@account, @target_account) if @account.following?(@target_account) + UnfollowService.new.call(@target_account, @account) if @target_account.following?(@account) + RejectFollowService.new.call(@target_account, @account) if @target_account.requested?(@account) + end + + def handle_collections + # Remove account from target_account's collections + @target_account.curated_collection_items.where(account: @account).find_each do |collection_item| + RevokeCollectionItemService.new.call(collection_item) + end + + # Remove target_account from account's collections + @account.curated_collection_items.where(account: @target_account).find_each do |collection_item| + DeleteCollectionItemService.new.call(collection_item) + end + end + def create_notification(block) ActivityPub::DeliveryWorker.perform_async(build_json(block), block.account_id, block.target_account.inbox_url) end diff --git a/app/services/bulk_import_service.rb b/app/services/bulk_import_service.rb index a361c7a3dac70c..8e0864a07f42bc 100644 --- a/app/services/bulk_import_service.rb +++ b/app/services/bulk_import_service.rb @@ -20,7 +20,7 @@ def call(import) import_lists! end - @import.update!(state: :finished, finished_at: Time.now.utc) if @import.processed_items == @import.total_items + @import.update!(state: :finished, finished_at: Time.now.utc) if @import.processing_complete? rescue @import.update!(state: :finished, finished_at: Time.now.utc) diff --git a/app/services/create_collection_service.rb b/app/services/create_collection_service.rb index b0d291d7c3190f..1c46b405306762 100644 --- a/app/services/create_collection_service.rb +++ b/app/services/create_collection_service.rb @@ -9,10 +9,9 @@ def call(params, account) @collection.save! - if Mastodon::Feature.collections_federation_enabled? - distribute_add_activity - distribute_feature_request_activities - end + notify_local_users + distribute_add_activity + distribute_feature_request_activities @collection end @@ -36,7 +35,14 @@ def build_items @accounts_to_add.each do |account_to_add| raise Mastodon::NotPermittedError, I18n.t('accounts.errors.cannot_be_added_to_collections') unless AccountPolicy.new(@account, account_to_add).feature? - @collection.collection_items.build(account: account_to_add, state: :accepted) + state = account_to_add.local? ? :accepted : :pending + @collection.collection_items.build(account: account_to_add, state:) + end + end + + def notify_local_users + @collection.collection_items.select(&:with_local_account?).each do |collection_item| + LocalNotificationWorker.perform_async(collection_item.account_id, collection_item.id, collection_item.class.name, 'added_to_collection') end end diff --git a/app/services/delete_collection_item_service.rb b/app/services/delete_collection_item_service.rb index 47df001d60baf3..3f91ea0c3b1e96 100644 --- a/app/services/delete_collection_item_service.rb +++ b/app/services/delete_collection_item_service.rb @@ -5,9 +5,12 @@ def call(collection_item, revoke: false) @collection_item = collection_item @collection = collection_item.collection - revoke ? @collection_item.revoke! : @collection_item.destroy! - - distribute_remove_activity if Mastodon::Feature.collections_federation_enabled? + if collection_item.local? + revoke ? @collection_item.revoke! : @collection_item.destroy! + distribute_remove_activity + else + collection_item.destroy! + end end private diff --git a/app/services/delete_collection_service.rb b/app/services/delete_collection_service.rb index 78b9261fd1d86e..c2cc6ebd6c32d5 100644 --- a/app/services/delete_collection_service.rb +++ b/app/services/delete_collection_service.rb @@ -5,7 +5,7 @@ def call(collection) @collection = collection @collection.destroy! - distribute_remove_activity if Mastodon::Feature.collections_federation_enabled? + distribute_remove_activity end private diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index 514c838d6483c1..eb3d000a1d2bb8 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -63,7 +63,7 @@ def process_response(response, terminal: false) end def expected_type?(json) - equals_or_includes_any?(json['type'], ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES) + equals_or_includes_any?(json['type'], ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES + %w(FeaturedCollection)) end def process_html(response) diff --git a/app/services/notify_of_collection_update_service.rb b/app/services/notify_of_collection_update_service.rb new file mode 100644 index 00000000000000..a8f540e4d3d1d6 --- /dev/null +++ b/app/services/notify_of_collection_update_service.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class NotifyOfCollectionUpdateService + def call(collection) + return unless significantly_changed?(collection) + + collection.collection_items.includes(:account).references(:account).merge(Account.local).accepted.find_each do |collection_item| + LocalNotificationWorker.perform_async(collection_item.account_id, collection.id, collection.class.name, 'collection_update') + end + end + + private + + def significantly_changed?(collection) + # If the collection is brand new, we don't need to look at its members + return false if collection.previously_new_record? + + # Only notify of change to description or name + %i(description description_html name sensitive tag_id).any? { |attr| collection.attribute_previously_changed?(attr) } + end +end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 1f375021f34d9e..863755b41fab40 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -17,6 +17,8 @@ class NotifyService < BaseService moderation_warning severed_relationships annual_report + added_to_collection + collection_update ).freeze class BaseCondition @@ -24,15 +26,6 @@ class BaseCondition NEW_FOLLOWER_THRESHOLD = 3.days.freeze - NON_FILTERABLE_TYPES = %i( - admin.sign_up - admin.report - poll - update - account_warning - annual_report - ).freeze - def initialize(notification, **options) @recipient = notification.account @sender = notification.from_account diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 853e2515a1cbf5..1ad3c15f1aadd6 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -7,6 +7,12 @@ class PostStatusService < BaseService include DtlHelper include NgRuleHelper + # How much to delay sending an e-mail about a new post, to allow grouping multiple posts + EMAIL_DISTRIBUTION_DELAY = 5.minutes.freeze + + # If the job is not executed within this timeframe, it will lose its arguments + EMAIL_DISTRIBUTION_TTL = 1.hour.to_i + class UnexpectedMentionsError < StandardError attr_reader :accounts @@ -255,6 +261,7 @@ def postprocess_status! ProcessReferencesService.call_service(@status, @reference_ids, [], quote: quote_url) LinkCrawlWorker.perform_async(@status.id) DistributionWorker.perform_async(@status.id) + process_email_subscriptions! ActivityPub::DistributionWorker.perform_async(@status.id) unless @status.personal_limited? PollExpirationNotifyWorker.perform_at(@status.poll.expires_at, @status.poll.id) if @status.poll ActivityPub::QuoteRequestWorker.perform_async(@status.quote.id) if @status.quote&.quoted_status.present? && !@status.quote&.quoted_status&.local? @@ -331,6 +338,20 @@ def reference_urls @reference_urls ||= ProcessReferencesService.extract_uris(@text) || [] end + def process_email_subscriptions! + return unless Mastodon::Feature.email_subscriptions_enabled? && + @status.public_visibility? && (!@status.reply? || @status.in_reply_to_account_id == @status.account_id) && + @status.account.user_can?(:manage_email_subscriptions) && + @status.account.user_email_subscriptions_enabled? + + # To allow e-mail grouping, pass the arguments via a redis set and schedule + # a unique worker a few minutes in the future, in case the user makes subsequent + # posts within that time window + redis.sadd("email_subscriptions:#{@status.account_id}:next_batch", @status.id) + redis.expire("email_subscriptions:#{@status.account_id}:next_batch", EMAIL_DISTRIBUTION_TTL) + EmailDistributionWorker.perform_in(EMAIL_DISTRIBUTION_DELAY, @status.account_id) + end + def validate_media! if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable) @media = [] diff --git a/app/services/report_service.rb b/app/services/report_service.rb index 6a28e6005cc73a..1b2abebbd49859 100644 --- a/app/services/report_service.rb +++ b/app/services/report_service.rb @@ -96,7 +96,7 @@ def reported_status_ids def domain_mentions(domain) Mention .joins(:account) - .where(Account.arel_table[:domain].lower.eq domain) + .merge(Account.with_domain(domain)) .select(1).arel.exists end diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb index 899f586b819aa0..9a136439b085a3 100644 --- a/app/services/resolve_url_service.rb +++ b/app/services/resolve_url_service.rb @@ -28,6 +28,10 @@ def process_url status = FetchRemoteStatusService.new.call(resource_url, prefetched_body: body) authorize_with @on_behalf_of, status, :show? unless status.nil? status + elsif type == 'FeaturedCollection' && Mastodon::Feature.collections_enabled? + collection = ActivityPub::FetchRemoteFeaturedCollectionService.new.call(resource_url, prefetched_body: body) + authorize_with @on_behalf_of, collection, :show? unless collection.nil? + collection end end @@ -111,9 +115,21 @@ def process_local_url Account.find_remote(username, domain) end + when 'collections' + return unless recognized_params[:action] == 'show' + + check_collection(Collection.find_by(id: recognized_params[:id])) end end + def check_collection(collection) + return if collection.nil? + + authorize_with @on_behalf_of, collection, :show? + rescue Mastodon::NotPermittedError + nil + end + def check_local_status(status) return if status.nil? diff --git a/app/services/revoke_collection_item_service.rb b/app/services/revoke_collection_item_service.rb index c0dc70e952cf92..0b3c2c709e1c09 100644 --- a/app/services/revoke_collection_item_service.rb +++ b/app/services/revoke_collection_item_service.rb @@ -6,16 +6,18 @@ class RevokeCollectionItemService < BaseService def call(collection_item) @collection_item = collection_item @account = collection_item.account + @collection = @collection_item.collection @collection_item.revoke! - distribute_stamp_deletion! if Mastodon::Feature.collections_federation_enabled? && @collection_item.remote? + distribute_stamp_deletion! if @collection_item.remote? end private def distribute_stamp_deletion! - ActivityPub::AccountRawDistributionWorker.perform_async(signed_activity_json, @collection_item.collection.account_id) + ActivityPub::DeliveryWorker.perform_async(signed_activity_json, @account.id, @collection.account.inbox_url) + ActivityPub::AccountRawDistributionWorker.perform_async(signed_activity_json, @collection.account_id) end def signed_activity_json diff --git a/app/services/search_service.rb b/app/services/search_service.rb index 1cdd1f53339c3e..22d0cc8e725754 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -66,7 +66,7 @@ def perform_hashtags_search! end def default_results - { accounts: [], hashtags: [], statuses: [] } + { accounts: [], hashtags: [], statuses: [], collections: [] } end def url_query? diff --git a/app/services/update_collection_service.rb b/app/services/update_collection_service.rb index 9dffac9e2bb82f..5ffb4bad815c7e 100644 --- a/app/services/update_collection_service.rb +++ b/app/services/update_collection_service.rb @@ -7,7 +7,8 @@ def call(collection, params) @collection = collection @collection.update!(params) - distribute_update_activity if Mastodon::Feature.collections_federation_enabled? + notify_about_update + distribute_update_activity end private @@ -18,6 +19,10 @@ def distribute_update_activity ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id) end + def notify_about_update + NotifyOfCollectionUpdateService.new.call(@collection) + end + def activity_json ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::UpdateFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json end diff --git a/app/validators/email_address_validator.rb b/app/validators/email_address_validator.rb index ed0bb116524aec..7cc303a6369ead 100644 --- a/app/validators/email_address_validator.rb +++ b/app/validators/email_address_validator.rb @@ -11,8 +11,14 @@ def validate_each(record, attribute, value) value = value.strip address = Mail::Address.new(value) - record.errors.add(attribute, :invalid) if address.address != value + record.errors.add(attribute, :invalid) if address.address != value || contains_disallowed_characters?(value) rescue Mail::Field::FieldError record.errors.add(attribute, :invalid) end + + private + + def contains_disallowed_characters?(value) + value.include?('%') || value.include?(',') || value.include?('"') + end end diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb index f78b98d7dd71b2..d24b101a6e37d0 100644 --- a/app/validators/email_mx_validator.rb +++ b/app/validators/email_mx_validator.rb @@ -2,21 +2,21 @@ require 'resolv' -class EmailMxValidator < ActiveModel::Validator - def validate(user) - return if user.email.blank? +class EmailMxValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + return if value.blank? - domain = get_domain(user.email) + domain = get_domain(value) if domain.blank? || domain.include?('..') - user.errors.add(:email, :invalid) + record.errors.add(attribute, :invalid) elsif !on_allowlist?(domain) resolved_ips, resolved_domains = resolve_mx(domain) if resolved_ips.empty? - user.errors.add(:email, :unreachable) - elsif email_domain_blocked?(resolved_domains, user.sign_up_ip) - user.errors.add(:email, :blocked) + record.errors.add(attribute, :unreachable) + elsif email_domain_blocked?([domain, *resolved_domains], options[:attempt_ip].is_a?(Symbol) ? record.public_send(options[:attempt_ip]) : nil) + record.errors.add(attribute, :blocked) end end end diff --git a/app/views/admin/collections/show.html.haml b/app/views/admin/collections/show.html.haml index 8f29b26309dc32..bf3665b69a5a65 100644 --- a/app/views/admin/collections/show.html.haml +++ b/app/views/admin/collections/show.html.haml @@ -2,7 +2,7 @@ = t('admin.collections.collection_title', name: @account.pretty_acct) - content_for :heading_actions do - = link_to t('admin.collections.open'), account_collection_path(@account, @collection), class: 'button', target: '_blank', rel: 'noopener' + = link_to t('admin.collections.open'), collection_path(@collection), class: 'button', target: '_blank', rel: 'noopener' %h3= t('admin.collections.contents') diff --git a/app/views/admin/ip_blocks/new.html.haml b/app/views/admin/ip_blocks/new.html.haml index acf632e476abba..3ef5351d3e929d 100644 --- a/app/views/admin/ip_blocks/new.html.haml +++ b/app/views/admin/ip_blocks/new.html.haml @@ -12,7 +12,7 @@ .fields-group = f.input :expires_in, - collection: [1.day, 2.weeks, 1.month, 6.months, 1.year, 3.years].map(&:to_i), + collection: IpBlock::EXPIRATION_DURATIONS.map(&:to_i), label_method: ->(i) { I18n.t("admin.ip_blocks.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt'), wrapper: :with_block_label diff --git a/app/views/admin/roles/_form.html.haml b/app/views/admin/roles/_form.html.haml index e447739247920e..0d24e82d3caf48 100644 --- a/app/views/admin/roles/_form.html.haml +++ b/app/views/admin/roles/_form.html.haml @@ -32,6 +32,14 @@ %hr.spacer/ +- if Mastodon::Feature.collections_enabled? + + .fields-group + = form.input :collection_limit, + wrapper: :with_label + + %hr.spacer/ + - unless current_user.role == form.object .field-group diff --git a/app/views/admin/settings/branding/show.html.haml b/app/views/admin/settings/branding/show.html.haml index 10bb28c20687f1..65aae77d5f0db5 100644 --- a/app/views/admin/settings/branding/show.html.haml +++ b/app/views/admin/settings/branding/show.html.haml @@ -33,6 +33,11 @@ = f.input :thumbnail, as: :file, wrapper: :with_block_label + - if @admin_settings.thumbnail.persisted? + = f.input :thumbnail_description, + as: :text, + input_html: { rows: 2, maxlength: Form::AdminSettings::DESCRIPTION_LIMIT }, + wrapper: :with_block_label .fields-row__column.fields-row__column-6.fields-group - if @admin_settings.thumbnail.persisted? = image_tag @admin_settings.thumbnail.file.url(:'@1x'), class: 'fields-group__thumbnail' diff --git a/app/views/admin/shared/_collection.html.haml b/app/views/admin/shared/_collection.html.haml index e300a986ba6f25..02f22b338be633 100644 --- a/app/views/admin/shared/_collection.html.haml +++ b/app/views/admin/shared/_collection.html.haml @@ -18,5 +18,5 @@  · = t('admin.collections.number_of_accounts', count: collection.accepted_collection_items.size)  · - = link_to account_collection_path(collection.account, collection), class: 'detailed-status__link', target: 'blank', rel: 'noopener' do + = link_to collection_path(collection), class: 'detailed-status__link', target: 'blank', rel: 'noopener' do = t('admin.collections.view_publicly') diff --git a/app/views/admin/software_updates/_software_update.html.haml b/app/views/admin/software_updates/_software_update.html.haml new file mode 100644 index 00000000000000..9eb270e49746af --- /dev/null +++ b/app/views/admin/software_updates/_software_update.html.haml @@ -0,0 +1,10 @@ +%tr{ id: dom_id(software_update) } + %td= software_update.version + %td= t("admin.software_updates.types.#{software_update.type}") + %td{ class: class_names(critical: software_update.urgent?) } + - if software_update.urgent? + = t('admin.software_updates.critical_update') + %td.release-notes + = table_link_to 'link', + t('admin.software_updates.release_notes'), + software_update.release_notes diff --git a/app/views/admin/software_updates/index.html.haml b/app/views/admin/software_updates/index.html.haml index d2ba115590afd3..25de175a7be7b5 100644 --- a/app/views/admin/software_updates/index.html.haml +++ b/app/views/admin/software_updates/index.html.haml @@ -18,12 +18,4 @@ %th %th %tbody - - @software_updates.each do |update| - %tr - %td= update.version - %td= t("admin.software_updates.types.#{update.type}") - - if update.urgent? - %td.critical= t('admin.software_updates.critical_update') - - else - %td - %td= table_link_to 'link', t('admin.software_updates.release_notes'), update.release_notes + = render collection: @software_updates, partial: 'admin/software_updates/software_update' diff --git a/app/views/admin/statuses/show.html.haml b/app/views/admin/statuses/show.html.haml index 545b2a7d0ce19c..27af69fb5a0219 100644 --- a/app/views/admin/statuses/show.html.haml +++ b/app/views/admin/statuses/show.html.haml @@ -52,19 +52,6 @@ %th= t('admin.statuses.favourites') %td= friendly_number_to_human @status.favourites_count -.action-buttons - %div - - if @account.local? && can?(:warn, @account) - = link_to t('admin.statuses.remove_history'), remove_history_admin_account_status_path(@account.id), data: { confirm: t('admin.statuses.are_you_sure') }, method: :post, class: 'button' - - if @account.local? && @status.with_media? && can?(:warn, @account) - = link_to t('admin.statuses.remove_media'), remove_media_admin_account_status_path(@account.id), data: { confirm: t('admin.statuses.are_you_sure') }, method: :post, class: 'button' - - if @account.local? && !@status.sensitive && @status.with_media? && can?(:warn, @account) - = link_to t('admin.statuses.force_nsfw'), force_sensitive_admin_account_status_path(@account.id), data: { confirm: t('admin.statuses.are_you_sure') }, method: :post, class: 'button' - - if @account.local? && @status.spoiler_text.blank? && can?(:warn, @account) - = link_to t('admin.statuses.force_cw'), force_cw_admin_account_status_path(@account.id), data: { confirm: t('admin.statuses.are_you_sure') }, method: :post, class: 'button' - - if @account.local? && can?(:warn, @account) - = link_to t('admin.statuses.remove'), remove_status_admin_account_status_path(@account.id), data: { confirm: t('admin.statuses.are_you_sure') }, method: :post, class: 'button' - %hr.spacer/ %h3= t('admin.statuses.contents') diff --git a/app/views/auth/shared/_links.html.haml b/app/views/auth/shared/_links.html.haml index e204fb9ce6f01a..565ea84a9d5464 100644 --- a/app/views/auth/shared/_links.html.haml +++ b/app/views/auth/shared/_links.html.haml @@ -6,7 +6,7 @@ %li= link_to_login t('auth.login') - if controller_name != 'registrations' - %li= link_to t('auth.register'), available_sign_up_path + %li= link_to t('auth.register'), available_sign_up_url - if controller_name != 'passwords' && controller_name != 'registrations' %li= link_to t('auth.forgot_password'), new_user_password_path diff --git a/app/views/email_subscription_mailer/confirmation.html.haml b/app/views/email_subscription_mailer/confirmation.html.haml new file mode 100644 index 00000000000000..7d14d9ff59caa0 --- /dev/null +++ b/app/views/email_subscription_mailer/confirmation.html.haml @@ -0,0 +1,20 @@ += content_for :heading do + = render 'application/mailer/heading', + image_url: full_asset_url(@subscription.account.avatar.url), + title: t('.title', name: display_name(@subscription.account)) + +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t '.instructions_to_confirm', name: display_name(@subscription.account), acct: "#{@subscription.account.username}@#{@instance}" + + = render 'application/mailer/button', text: t('.action'), url: email_subscriptions_confirmation_url(confirmation_token: @subscription.confirmation_token) + + %p= t '.instructions_to_ignore' + +- content_for :footer do + %p.email-footer-p= t('email_subscription_mailer.notification.footer.reason_for_email_html', name: display_name(@subscription.account), unsubscribe_path: @unsubscribe_url) + %p.email-footer-p= t('email_subscription_mailer.notification.footer.privacy_html', domain: @instance, privacy_policy_path: privacy_policy_path) diff --git a/app/views/email_subscription_mailer/confirmation.text.erb b/app/views/email_subscription_mailer/confirmation.text.erb new file mode 100644 index 00000000000000..4d80bebc0de302 --- /dev/null +++ b/app/views/email_subscription_mailer/confirmation.text.erb @@ -0,0 +1,9 @@ +<%= t '.title', name: display_name(@subscription.account) %> + +=== + +<%= t '.instructions_to_confirm', name: display_name(@subscription.account), acct: "#{@subscription.account.username}@#{@instance}" %> + +=> <%= root_url(confirmation_token: @subscription.confirmation_token) %> + +<%= t '.instructions_to_ignore' %> diff --git a/app/views/email_subscription_mailer/notification.html.haml b/app/views/email_subscription_mailer/notification.html.haml new file mode 100644 index 00000000000000..12848c59b37b5a --- /dev/null +++ b/app/views/email_subscription_mailer/notification.html.haml @@ -0,0 +1,36 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + - @statuses.each do |status| + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'notification_mailer/status', status: status, time_zone: nil + +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-checklist-wrapper-td + %table.email-w-full.email-banner-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-banner-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-banner-text-td + .email-desktop-flex + /[if mso] +
    + %div + %p= t('.interact_with_this_post', count: @statuses.size) + /[if mso] + + %div + = render 'application/mailer/button', text: t('.create_account'), url: available_sign_up_url, has_arrow: false + /[if mso] +
    + +- content_for :footer do + %p.email-footer-p= t('.footer.reason_for_email_html', name: display_name(@subscription.account), unsubscribe_path: @unsubscribe_url) + %p.email-footer-p= t('.footer.privacy_html', domain: @instance, privacy_policy_path: privacy_policy_path) diff --git a/app/views/email_subscription_mailer/notification.text.erb b/app/views/email_subscription_mailer/notification.text.erb new file mode 100644 index 00000000000000..9e657b93f92066 --- /dev/null +++ b/app/views/email_subscription_mailer/notification.text.erb @@ -0,0 +1,7 @@ +<%= t @statuses.size == 1 ? 'singular' : 'plural', scope: 'email_subscription_mailer.notification.title', name: display_name(@subscription.account), excerpt: truncate(@statuses.first.text, length: 17) %> + +=== + +<%- @statuses.each do |status| %> +<%= render 'notification_mailer/status', status: status %> +<%- end %> diff --git a/app/views/email_subscriptions/confirmations/show.html.haml b/app/views/email_subscriptions/confirmations/show.html.haml new file mode 100644 index 00000000000000..a13504bb4860df --- /dev/null +++ b/app/views/email_subscriptions/confirmations/show.html.haml @@ -0,0 +1,11 @@ +- content_for :page_title do + = t('.title') + +.simple_form + %h1.title + = t('.title') + %p.lead + = t('.success_html', name: content_tag(:strong, display_name(@email_subscription.account)), sender: content_tag(:strong, EmailSubscriptionMailer.default[:from])) + %p.lead + = t('.changed_your_mind') + = link_to t('.unsubscribe'), unsubscribe_url(token: @email_subscription.to_sgid(for: 'unsubscribe')) diff --git a/app/views/invites/_form.html.haml b/app/views/invites/_form.html.haml index dbbb785e835e2a..514b9cf0164a8f 100644 --- a/app/views/invites/_form.html.haml +++ b/app/views/invites/_form.html.haml @@ -2,12 +2,21 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group - = form.input :max_uses, wrapper: :with_label, collection: invites_max_uses_options, label_method: ->(num) { I18n.t('invites.max_uses', count: num) }, prompt: I18n.t('invites.max_uses_prompt') + = form.input :max_uses, + collection: Invite::MAX_USES_COUNTS, + label_method: ->(count) { I18n.t('invites.max_uses', count:) }, + prompt: I18n.t('invites.max_uses_prompt'), + wrapper: :with_label .fields-row__column.fields-row__column-6.fields-group - = form.input :expires_in, wrapper: :with_label, collection: invites_expires_options.map(&:to_i), label_method: ->(i) { I18n.t("invites.expires_in.#{i}") }, prompt: I18n.t('invites.expires_in_prompt') + = form.input :expires_in, + collection: Invite::EXPIRATION_DURATIONS.map(&:to_i), + label_method: ->(duration) { I18n.t("invites.expires_in.#{duration}") }, + prompt: I18n.t('invites.expires_in_prompt'), + wrapper: :with_label .fields-group - = form.input :autofollow, wrapper: :with_label + = form.input :autofollow, + wrapper: :with_label .actions = form.button :button, t('invites.generate'), type: :submit diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 842312b853e596..5862f797126ab5 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -12,6 +12,7 @@ %style{ 'data-premailer': 'ignore' } \.email a { color: inherit; text-decoration: none; } \.email-btn-hover:hover { background-color: #563acc !important; } + \.email-banner-text-td .email-btn-hover:hover { background-color: #fff !important; } /[if mso] @@ -73,15 +74,18 @@ %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-footer-td - %p.email-footer-p - = link_to root_url, class: 'email-footer-logo-a' do - = image_tag frontend_asset_url('images/mailer-new/common/logo-footer.png'), alt: 'Mastodon', width: 44, height: 44 - %p.email-footer-p - = t 'about.hosted_on', domain: site_hostname - %p.email-footer-p - = link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url - - if defined?(@unsubscribe_url) - · - = link_to t('application_mailer.unsubscribe'), @unsubscribe_url + - if content_for?(:footer) + = yield :footer + - else + %p.email-footer-p + = link_to root_url, class: 'email-footer-logo-a' do + = image_tag frontend_asset_url('images/mailer-new/common/logo-footer.png'), alt: 'Mastodon', width: 44, height: 44 + %p.email-footer-p + = t 'about.hosted_on', domain: site_hostname + %p.email-footer-p + = link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url + - if defined?(@unsubscribe_url) + · + = link_to t('application_mailer.unsubscribe'), @unsubscribe_url /[if mso] diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb index 87b0b2929c52d3..1a78f331109162 100644 --- a/app/views/layouts/mailer.text.erb +++ b/app/views/layouts/mailer.text.erb @@ -1,5 +1,9 @@ <%= yield %> --- -<%= t 'about.hosted_on', domain: site_hostname %> -<%= t('application_mailer.settings', link: settings_preferences_url) %> +<%- unless defined?(@skip_preferences_link) %> +<%= t('application_mailer.notification_preferences') %>: <%= settings_preferences_url %> +<%- end %> +<%- if defined?(@unsubscribe_url) %> +<%= t('application_mailer.unsubscribe') %>: <%= @unsubscribe_url %> +<%- end %> diff --git a/app/views/mail_subscriptions/create.html.haml b/app/views/mail_subscriptions/create.html.haml deleted file mode 100644 index 16ee486b001ca1..00000000000000 --- a/app/views/mail_subscriptions/create.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -- content_for :page_title do - = t('mail_subscriptions.unsubscribe.title') - -.simple_form - %h1.title= t('mail_subscriptions.unsubscribe.complete') - %p.lead - = t('mail_subscriptions.unsubscribe.success_html', domain: content_tag(:strong, site_hostname), type: content_tag(:strong, I18n.t(@type, scope: 'mail_subscriptions.unsubscribe.emails')), email: content_tag(:strong, @user.email)) - %p.lead - = t('mail_subscriptions.unsubscribe.resubscribe_html', settings_path: settings_preferences_notifications_path) diff --git a/app/views/mail_subscriptions/show.html.haml b/app/views/mail_subscriptions/show.html.haml deleted file mode 100644 index 78de48645717ef..00000000000000 --- a/app/views/mail_subscriptions/show.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -- content_for :page_title do - = t('mail_subscriptions.unsubscribe.title') - -.simple_form - %h1.title= t('mail_subscriptions.unsubscribe.title') - %p.lead - = t 'mail_subscriptions.unsubscribe.confirmation_html', - domain: content_tag(:strong, site_hostname), - type: content_tag(:strong, I18n.t(@type, scope: 'mail_subscriptions.unsubscribe.emails')), - email: content_tag(:strong, @user.email), - settings_path: settings_preferences_notifications_path - - = form_with url: unsubscribe_path do |form| - = form.hidden_field :token, - value: params[:token] - = form.hidden_field :type, - value: params[:type] - = form.button t('mail_subscriptions.unsubscribe.action'), - type: :submit, - class: 'btn' diff --git a/app/views/media/player.html.haml b/app/views/media/player.html.haml index 39c4ccc18f875c..b2d2121d15acbd 100644 --- a/app/views/media/player.html.haml +++ b/app/views/media/player.html.haml @@ -14,7 +14,7 @@ detailed: true, editable: true, frameRate: meta.dig('original', 'frame_rate'), - height: 380, + height: MediaPlayerHelper::PLAYER_HEIGHT, inline: true, media: [ActiveModelSerializers::SerializableResource.new(@media_attachment, serializer: REST::MediaAttachmentSerializer)].as_json, preview: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.file.url(:small), @@ -25,7 +25,7 @@ - elsif @media_attachment.gifv? = react_component :media_gallery, autoplay: true, - height: 380, + height: MediaPlayerHelper::PLAYER_HEIGHT, media: [ActiveModelSerializers::SerializableResource.new(@media_attachment, serializer: REST::MediaAttachmentSerializer).as_json], standalone: true do %video{ autoplay: 'autoplay', muted: 'muted', loop: 'loop' } @@ -38,9 +38,9 @@ duration: meta.dig(:original, :duration), foregroundColor: meta.dig('colors', 'foreground'), fullscreen: true, - height: 380, + height: MediaPlayerHelper::PLAYER_HEIGHT, poster: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.account.avatar_static_url, src: @media_attachment.file.url(:original), - width: 670 do + width: MediaPlayerHelper::PLAYER_WIDTH do %audio{ controls: 'controls' } %source{ src: @media_attachment.file.url(:original) } diff --git a/app/views/settings/featured_tags/_featured_tag.html.haml b/app/views/settings/featured_tags/_featured_tag.html.haml new file mode 100644 index 00000000000000..f790b5e39b9a70 --- /dev/null +++ b/app/views/settings/featured_tags/_featured_tag.html.haml @@ -0,0 +1,17 @@ +.directory__tag + %div + %h2 + = material_symbol 'tag' + = featured_tag.display_name + %small + - if featured_tag.last_status_at? + %time.formatted{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at + - else + = t('accounts.nothing_here') + = table_link_to 'delete', + t('filters.index.delete'), + settings_featured_tag_path(featured_tag), + data: { confirm: t('admin.accounts.are_you_sure') }, + method: :delete + + .trends__item__current= friendly_number_to_human featured_tag.statuses_count diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml index b7f6e56b3d94b2..b6dcd664cf3eff 100644 --- a/app/views/settings/featured_tags/index.html.haml +++ b/app/views/settings/featured_tags/index.html.haml @@ -5,31 +5,4 @@ %h1= t('settings.profile') = render partial: 'settings/shared/profile_navigation' -= simple_form_for @featured_tag, url: settings_featured_tags_path do |f| - = render 'shared/error_messages', object: @featured_tag - - %p.lead= t('featured_tags.hint_html') - - .fields-group - = f.input :name, - hint: featured_tags_hint(@recently_used_tags), - wrapper: :with_block_label - - .actions - = f.button :button, t('featured_tags.add_new'), type: :submit - -%hr.spacer/ - -- @featured_tags.each do |featured_tag| - .directory__tag - %div - %h2 - = material_symbol 'tag' - = featured_tag.display_name - %small - - if featured_tag.last_status_at.nil? - = t('accounts.nothing_here') - - else - %time.formatted{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at - = table_link_to 'delete', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } - .trends__item__current= friendly_number_to_human featured_tag.statuses_count += render partial: 'settings/shared/profile_new_notice' diff --git a/app/views/settings/imports/index.html.haml b/app/views/settings/imports/index.html.haml index 55421991e13173..e5195b74cc8c20 100644 --- a/app/views/settings/imports/index.html.haml +++ b/app/views/settings/imports/index.html.haml @@ -60,9 +60,6 @@ = l(import.created_at) %td - - num_failed = import.processed_items - import.imported_items - - if num_failed.positive? - - if import.state_finished? - = link_to num_failed, failures_settings_import_path(import, format: 'csv') - - else - = num_failed + - if import.failure_count.positive? + = link_to_if import.state_finished?, import.failure_count, failures_settings_import_path(import, format: :csv) do + = import.failure_count diff --git a/app/views/settings/migrations/show.html.haml b/app/views/settings/migrations/show.html.haml index 296075a28edb52..8c3bae704f77f8 100644 --- a/app/views/settings/migrations/show.html.haml +++ b/app/views/settings/migrations/show.html.haml @@ -24,7 +24,7 @@ = simple_form_for @migration, url: settings_migration_path do |f| - if on_cooldown? %p.hint - %span.warning-hint= t('migrations.on_cooldown', count: ((@cooldown.cooldown_at - Time.now.utc) / 1.day.seconds).ceil) + %span.warning-hint= t('migrations.on_cooldown', count: @cooldown.remaining_cooldown_days) - else %p.hint= t('migrations.warning.before') diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 1c099ae95e99b5..8557691bcaa83b 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -36,7 +36,7 @@ .input.horizontal-options = ff.input :'web.color_scheme', as: :radio_buttons, - collection: %w(auto light dark), + collection: user_settings_collection('web.color_scheme'), include_blank: false, label: I18n.t('simple_form.labels.defaults.setting_color_scheme'), label_method: ->(contrast) { I18n.t("color_scheme.#{contrast}", default: contrast) }, @@ -45,7 +45,7 @@ .input.horizontal-options = ff.input :'web.contrast', as: :radio_buttons, - collection: %w(auto high), + collection: user_settings_collection('web.contrast'), include_blank: false, label: I18n.t('simple_form.labels.defaults.setting_contrast'), label_method: ->(contrast) { I18n.t("contrast.#{contrast}", default: contrast) }, @@ -55,7 +55,7 @@ .fields-group = f.simple_fields_for :settings, current_user.settings do |ff| = ff.input :'web.emoji_style', - collection: %w(auto twemoji native), + collection: user_settings_collection('web.emoji_style'), include_blank: false, hint: I18n.t('simple_form.hints.defaults.setting_emoji_style'), label: I18n.t('simple_form.labels.defaults.setting_emoji_style'), @@ -154,7 +154,7 @@ = ff.input :'web.display_media', as: :radio_buttons, collection_wrapper_tag: 'ul', - collection: %w(default show_all hide_all), + collection: user_settings_collection('web.display_media'), hint: false, item_wrapper_tag: 'li', label_method: ->(item) { t("simple_form.hints.defaults.setting_display_media_#{item}") }, diff --git a/app/views/settings/preferences/notifications/show.html.haml b/app/views/settings/preferences/notifications/show.html.haml index 4a70ec8bc004f1..24e1913939cf84 100644 --- a/app/views/settings/preferences/notifications/show.html.haml +++ b/app/views/settings/preferences/notifications/show.html.haml @@ -36,7 +36,7 @@ - if SoftwareUpdate.check_enabled? && current_user.can?(:view_devops) .fields-group = ff.input :'notification_emails.software_updates', - collection: %w(none critical patch all), + collection: user_settings_collection('notification_emails.software_updates'), hint: false, include_blank: false, label_method: ->(setting) { I18n.t("simple_form.labels.notification_emails.software_updates.#{setting}") }, diff --git a/app/views/settings/preferences/posting_defaults/show.html.haml b/app/views/settings/preferences/posting_defaults/show.html.haml index 752e110af871fa..bcdc9db40f8b8a 100644 --- a/app/views/settings/preferences/posting_defaults/show.html.haml +++ b/app/views/settings/preferences/posting_defaults/show.html.haml @@ -50,7 +50,7 @@ .fields-group = ff.input :default_quote_policy, - collection: %w(public followers nobody), + collection: user_settings_collection('default_quote_policy'), include_blank: false, label_method: ->(policy) { I18n.t("statuses.quote_policies.#{policy}") }, label: I18n.t('simple_form.labels.defaults.setting_default_quote_policy'), diff --git a/app/views/settings/privacy/show.html.haml b/app/views/settings/privacy/show.html.haml index 170359d472353d..72cc44fdd2cd3e 100644 --- a/app/views/settings/privacy/show.html.haml +++ b/app/views/settings/privacy/show.html.haml @@ -52,9 +52,6 @@ %p.lead= t('privacy.privacy_hint_html') - .fields-group - = f.input :show_collections, as: :boolean, wrapper: :with_label - = f.simple_fields_for :settings, current_user.settings do |ff| .fields-group = ff.input :show_statuses_count, as: :boolean, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_show_statuses_count'), hint: false @@ -64,5 +61,25 @@ .fields-group = ff.input :show_application, wrapper: :with_label + - if Mastodon::Feature.email_subscriptions_enabled? && current_user.can?(:manage_email_subscriptions) + %h2= t('privacy.email_subscriptions') + + %p.lead= t('privacy.email_subscriptions_hint_html') + + - if @email_subscriptions_count.positive? || @account.user_email_subscriptions_enabled? + .table-wrapper + %table.table.mini-table + %tbody + %tr + %th= t('email_subscriptions.status') + %td= @account.user_email_subscriptions_enabled? ? t('email_subscriptions.active') : t('email_subscriptions.inactive') + %tr + %th= t('email_subscriptions.subscribers') + %td= number_with_delimiter @email_subscriptions_count + + = f.simple_fields_for :settings, current_user.settings do |ff| + .fields-group + = ff.input :email_subscriptions, wrapper: :with_label + .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index ba53ca91ce0570..6e0cacf4bf2cba 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -5,84 +5,4 @@ %h1= t('settings.profile') = render partial: 'settings/shared/profile_navigation' -= simple_form_for @account, url: settings_profile_path, html: { id: :edit_profile } do |f| - = render 'shared/error_messages', object: @account - - %p.lead= t('edit_profile.hint_html') - - %h2= t('edit_profile.basic_information') - .fields-row - .fields-row__column.fields-row__column-6 - .fields-group - = f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: Account::DISPLAY_NAME_LENGTH_LIMIT, data: { default: @account.username } } - - .fields-group - = f.input :note, wrapper: :with_block_label, input_html: { maxlength: Account::NOTE_LENGTH_LIMIT, rows: 8 } - - = f.simple_fields_for :settings, current_user.settings do |ff| - .fields-group - = ff.input :bio_markdown, input_html: { name: 'account[bio_markdown]' }, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_bio_markdown') - - .fields-row__column.fields-group.fields-row__column-6 - .input.with_block_label - %label= t('simple_form.labels.defaults.fields') - %span.hint= t('simple_form.hints.account.fields') - - .row - %p.fields-label= t('simple_form.labels.account.fields.name') - %p.fields-label= t('simple_form.labels.account.fields.value') - - = f.simple_fields_for :fields do |fields_f| - .row - = fields_f.input :name, - placeholder: fields_f.index.zero? ? t("simple_form.labels.account.fields.examples.name_#{fields_f.index + 1}") : t('simple_form.labels.account.fields.name'), - input_html: { maxlength: Account::Field::MAX_CHARACTERS_LOCAL } - = fields_f.input :value, - placeholder: fields_f.index.zero? ? t("simple_form.labels.account.fields.examples.value_#{fields_f.index + 1}") : t('simple_form.labels.account.fields.value'), - input_html: { maxlength: Account::Field::MAX_CHARACTERS_LOCAL } - - .fields-row - .fields-row__column.fields-row__column-6 - .fields-group - = f.input :avatar, - hint: t('simple_form.hints.defaults.avatar', dimensions: Account::Avatar::AVATAR_GEOMETRY, size: number_to_human_size(Account::Avatar::AVATAR_LIMIT)), - input_html: { accept: Account::Avatar::AVATAR_IMAGE_MIME_TYPES }, - wrapper: :with_block_label - - .fields-row__column.fields-row__column-6 - .fields-group - = image_tag @account.avatar.url, class: 'fields-group__thumbnail', id: 'account_avatar-preview' - - if @account.avatar.present? - = link_to settings_profile_picture_path('avatar'), data: { method: :delete }, class: 'link-button link-button--destructive' do - = material_symbol 'delete' - = t('generic.delete') - - .fields-row - .fields-row__column.fields-row__column-6 - .fields-group - = f.input :header, - hint: t('simple_form.hints.defaults.header', dimensions: Account::Header::HEADER_GEOMETRY, size: number_to_human_size(Account::Header::HEADER_LIMIT)), - input_html: { accept: Account::Header::HEADER_IMAGE_MIME_TYPES }, - wrapper: :with_block_label - - .fields-row__column.fields-row__column-6 - .fields-group - = image_tag @account.header.url, class: 'fields-group__thumbnail', id: 'account_header-preview' - - if @account.header.present? - = link_to settings_profile_picture_path('header'), data: { method: :delete }, class: 'link-button link-button--destructive' do - = material_symbol 'delete' - = t('generic.delete') - - %h2= t('edit_profile.other') - - .fields-group - = f.input :my_actor_type, - as: :radio_buttons, - collection: %w(person bot), - collection_wrapper_tag: 'ul', - item_wrapper_tag: 'li', - label_method: ->(item) { safe_join([t("simple_form.labels.defaults.#{item}"), content_tag(:span, I18n.t("simple_form.hints.defaults.#{item}"), class: 'hint')]) }, - wrapper: :with_floating_label - - .actions - = f.button :button, t('generic.save_changes'), type: :submit += render partial: 'settings/shared/profile_new_notice' diff --git a/app/views/settings/shared/_profile_new_notice.html.haml b/app/views/settings/shared/_profile_new_notice.html.haml new file mode 100644 index 00000000000000..b4a5515a24d5c1 --- /dev/null +++ b/app/views/settings/shared/_profile_new_notice.html.haml @@ -0,0 +1,7 @@ +%aside.callout + = material_symbol 'info' + .content + .body + %p.title= t('edit_profile.redesign_title') + %p= t('edit_profile.redesign_body') + = link_to t('edit_profile.redesign_button'), '/profile/edit' diff --git a/app/views/settings/verifications/show.html.haml b/app/views/settings/verifications/show.html.haml index 6e6af16a9016b6..0292deb60454e9 100644 --- a/app/views/settings/verifications/show.html.haml +++ b/app/views/settings/verifications/show.html.haml @@ -5,6 +5,8 @@ %h1= t('settings.profile') = render partial: 'settings/shared/profile_navigation' += render partial: 'settings/shared/profile_new_notice' + .simple_form.form-section %h2.heading-medium= t('verification.website_verification') diff --git a/app/views/statuses/_og_image.html.haml b/app/views/statuses/_og_image.html.haml index 1f7f57f1562603..fd5939bd74814c 100644 --- a/app/views/statuses/_og_image.html.haml +++ b/app/views/statuses/_og_image.html.haml @@ -19,7 +19,7 @@ = opengraph 'og:video', full_asset_url(media.file.url(:original)) = opengraph 'og:video:secure_url', full_asset_url(media.file.url(:original)) = opengraph 'og:video:type', media.file_content_type - = opengraph 'twitter:player', medium_player_url(media) + = opengraph 'twitter:player', player_medium_url(media) = opengraph 'twitter:player:stream', full_asset_url(media.file.url(:original)) = opengraph 'twitter:player:stream:content_type', media.file_content_type - unless media.file.meta.nil? @@ -35,11 +35,11 @@ = opengraph 'og:audio', full_asset_url(media.file.url(:original)) = opengraph 'og:audio:secure_url', full_asset_url(media.file.url(:original)) = opengraph 'og:audio:type', media.file_content_type - = opengraph 'twitter:player', medium_player_url(media) + = opengraph 'twitter:player', player_medium_url(media) = opengraph 'twitter:player:stream', full_asset_url(media.file.url(:original)) = opengraph 'twitter:player:stream:content_type', media.file_content_type - = opengraph 'twitter:player:width', '670' - = opengraph 'twitter:player:height', '380' + = opengraph 'twitter:player:width', MediaPlayerHelper::PLAYER_WIDTH + = opengraph 'twitter:player:height', MediaPlayerHelper::PLAYER_HEIGHT - if player_card = opengraph 'twitter:card', 'player' - else diff --git a/app/views/unsubscriptions/create.html.haml b/app/views/unsubscriptions/create.html.haml new file mode 100644 index 00000000000000..157cf2622626e7 --- /dev/null +++ b/app/views/unsubscriptions/create.html.haml @@ -0,0 +1,12 @@ +- content_for :page_title do + = t('.title') + +.simple_form + %h1.title= t('.title') + %p.lead + - if @scope == :email_subscription + = t('.email_subscription.confirmation_html', name: display_name(@recipient.account)) + - elsif @scope == :user + = t('.user.confirmation_html', type: I18n.t(@type, scope: 'unsubscriptions.notification_emails'), domain: site_hostname) + + = link_to t('.action'), root_path, class: 'btn' diff --git a/app/views/unsubscriptions/show.html.haml b/app/views/unsubscriptions/show.html.haml new file mode 100644 index 00000000000000..6f5f0076121d6e --- /dev/null +++ b/app/views/unsubscriptions/show.html.haml @@ -0,0 +1,26 @@ +- content_for :page_title do + - if @scope == :user + = t('.user.title', type: I18n.t(@type, scope: 'unsubscriptions.notification_emails')) + - elsif @scope == :email_subscription + = t('.email_subscription.title', name: display_name(@recipient.account)) + +.simple_form + %h1.title + - if @scope == :user + = t('.user.title', type: I18n.t(@type, scope: 'unsubscriptions.notification_emails')) + - elsif @scope == :email_subscription + = t('.email_subscription.title', name: display_name(@recipient.account)) + %p.lead + - if @scope == :user + = t('.user.confirmation_html') + - elsif @scope == :email_subscription + = t('.email_subscription.confirmation_html') + + = form_with url: unsubscribe_path do |form| + = form.hidden_field :token, + value: params[:token] + = form.hidden_field :type, + value: params[:type] + = form.button t('.action'), + type: :submit, + class: 'btn' diff --git a/app/workers/activitypub/fetch_all_replies_worker.rb b/app/workers/activitypub/fetch_all_replies_worker.rb index 2e91a3e95b8ae3..73f2caabf813d1 100644 --- a/app/workers/activitypub/fetch_all_replies_worker.rb +++ b/app/workers/activitypub/fetch_all_replies_worker.rb @@ -49,7 +49,7 @@ def perform(root_status_id, options = {}) # Workers shouldn't be returning anything, but this is used in tests fetched_uris ensure - @batch.remove_job(jid) + @batch.remove_job(jid) if jid end private diff --git a/app/workers/email_distribution_worker.rb b/app/workers/email_distribution_worker.rb new file mode 100644 index 00000000000000..41edcb932cf6e2 --- /dev/null +++ b/app/workers/email_distribution_worker.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +class EmailDistributionWorker + include Sidekiq::Worker + include Redisable + + sidekiq_options lock: :until_executed, lock_ttl: 1.day.to_i + + def perform(account_id) + return unless Mastodon::Feature.email_subscriptions_enabled? + + @account = Account.find(account_id) + + return unless @account.user_can?(:manage_email_subscriptions) && @account.user_email_subscriptions_enabled? + + with_redis do |redis| + @status_ids = redis.smembers("email_subscriptions:#{account_id}:next_batch") + redis.srem("email_subscriptions:#{account_id}:next_batch", @status_ids) + end + + return if @account.email_subscriptions.confirmed.empty? || @status_ids.empty? + + statuses = Status.without_replies + .without_reblogs + .public_visibility + .where(id: @status_ids) + .to_a + + return if statuses.empty? + + @account.email_subscriptions.confirmed.find_each do |email_subscription| + EmailSubscriptionMailer.with(subscription: email_subscription).notification(statuses).deliver_later + end + rescue ActiveRecord::RecordNotFound + nil + end +end diff --git a/app/workers/fasp/base_worker.rb b/app/workers/fasp/base_worker.rb index 4916e83f470d5a..de38f6ade2a369 100644 --- a/app/workers/fasp/base_worker.rb +++ b/app/workers/fasp/base_worker.rb @@ -10,10 +10,12 @@ class Fasp::BaseWorker def with_provider(provider) return unless provider.confirmed? && provider.available? - yield - rescue *Mastodon::HTTP_CONNECTION_ERRORS - raise if provider.available? - ensure - provider.update_availability! + begin + yield + rescue *Mastodon::HTTP_CONNECTION_ERRORS + raise if provider.available? + ensure + provider.update_availability! + end end end diff --git a/app/workers/local_notification_worker.rb b/app/workers/local_notification_worker.rb index 7e9bd0c92b745d..0a9990742481ec 100644 --- a/app/workers/local_notification_worker.rb +++ b/app/workers/local_notification_worker.rb @@ -10,10 +10,8 @@ def perform(receiver_account_id, activity_id, activity_class_name, type = nil, o # For most notification types, only one notification should exist, and the older one is # preferred. For updates, such as when a status is edited, the new notification # should replace the previous ones. - if type == 'update' - Notification.where(account: receiver, activity: activity, type: 'update').in_batches.delete_all - elsif type == 'quoted_update' - Notification.where(account: receiver, activity: activity, type: 'quoted_update').in_batches.delete_all + if %w(update quoted_update collection_update).include?(type) + Notification.where(account: receiver, activity: activity, type: type).in_batches.delete_all elsif Notification.where(account: receiver, activity: activity, type: type).any? return end diff --git a/app/workers/scheduler/collection_item_cleanup_scheduler.rb b/app/workers/scheduler/collection_item_cleanup_scheduler.rb new file mode 100644 index 00000000000000..f70b3ee8f06722 --- /dev/null +++ b/app/workers/scheduler/collection_item_cleanup_scheduler.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class Scheduler::CollectionItemCleanupScheduler + include Sidekiq::Worker + + RETENTION_PERIOD = 24.hours + + sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i + + def perform + CollectionItem + .where(state: [:rejected, :revoked]) + .where(updated_at: ...(RETENTION_PERIOD.ago)) + .destroy_all + end +end diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb index 03544e2e98e53f..20d895551a9e05 100644 --- a/app/workers/scheduler/user_cleanup_scheduler.rb +++ b/app/workers/scheduler/user_cleanup_scheduler.rb @@ -11,6 +11,7 @@ class Scheduler::UserCleanupScheduler def perform clean_unconfirmed_accounts! clean_discarded_statuses! + clean_unconfirmed_email_subscriptions! end private @@ -32,4 +33,10 @@ def clean_discarded_statuses! end end end + + def clean_unconfirmed_email_subscriptions! + EmailSubscription.unconfirmed.where(created_at: ..UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).find_in_batches do |batch| + EmailSubscription.where(id: batch.map(&:id)).delete_all + end + end end diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index b30917707b52e7..6b1447c2532f98 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -67,6 +67,7 @@ ignore_unused: - 'move_handler.carry_{mutes,blocks}_over_text' - 'admin_mailer.*.subject' - 'user_mailer.*.subject' + - 'email_subscription_mailer.*' - 'notification_mailer.*' - 'imports.overwrite_preambles.{following,blocking,muting,domain_blocking,bookmarks,lists}_html.*' - 'imports.preambles.{following,blocking,muting,domain_blocking,bookmarks,lists}_html.*' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 149c1b1af4abbc..2047b091572356 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -98,8 +98,6 @@ def session_cookie manager.default_strategies(scope: :user).unshift :two_factor_ldap_authenticatable if Devise.ldap_authentication manager.default_strategies(scope: :user).unshift :two_factor_pam_authenticatable if Devise.pam_authentication manager.default_strategies(scope: :user).unshift :session_activation_rememberable - manager.default_strategies(scope: :user).unshift :two_factor_authenticatable - manager.default_strategies(scope: :user).unshift :two_factor_backupable end # The secret key used by Devise. Devise uses this key to generate diff --git a/config/initializers/json_ld_webfinger.rb b/config/initializers/json_ld_webfinger.rb new file mode 100644 index 00000000000000..da2437260c06a7 --- /dev/null +++ b/config/initializers/json_ld_webfinger.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +require 'json/ld' + +class JSON::LD::Context + add_preloaded("http://purl.archive.org/socialweb/webfinger") do + new(processingMode: "json-ld-1.0", term_definitions: { + "webfinger" => TermDefinition.new("webfinger", id: "https://purl.archive.org/socialweb/webfinger#webfinger", type_mapping: "http://www.w3.org/2001/XMLSchema#string"), + "wf" => TermDefinition.new("wf", id: "https://purl.archive.org/socialweb/webfinger#", simple: true, prefix: true), + "xsd" => TermDefinition.new("xsd", id: "http://www.w3.org/2001/XMLSchema#", simple: true, prefix: true) + }) + end + alias_preloaded("https://purl.archive.org/socialweb/webfinger", "http://purl.archive.org/socialweb/webfinger") +end diff --git a/config/initializers/redis.rb b/config/initializers/redis.rb deleted file mode 100644 index 8865d85780bd76..00000000000000 --- a/config/initializers/redis.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -Redis.sadd_returns_boolean = false diff --git a/config/locales/activerecord.io.yml b/config/locales/activerecord.io.yml index 67b59e24fcdc00..59ff09a243dd2b 100644 --- a/config/locales/activerecord.io.yml +++ b/config/locales/activerecord.io.yml @@ -32,6 +32,12 @@ io: attributes: url: invalid: ne esas valida URL + collection: + attributes: + collection_items: + too_many: esas tro multa, ne multa ol %{count} esas permisita + tag: + unusable: ne povas uzesar doorkeeper/application: attributes: website: @@ -49,8 +55,14 @@ io: attributes: reblog: taken: de postajo ja existas + terms_of_service: + attributes: + effective_date: + too_soon: esas tro antea, mustas esar post %{date} user: attributes: + date_of_birth: + below_limit: esas sub la evlimito email: blocked: uzas nepermisata retpostodomeno unreachable: semblas ne existar diff --git a/config/locales/activerecord.ja.yml b/config/locales/activerecord.ja.yml index 156e537ddbcf0a..6f3387a72c4de8 100644 --- a/config/locales/activerecord.ja.yml +++ b/config/locales/activerecord.ja.yml @@ -32,6 +32,12 @@ ja: attributes: url: invalid: は無効なURLです + collection: + attributes: + collection_items: + too_many: は多すぎます。 %{count} 以下にしてください + tag: + unusable: は使用できません doorkeeper/application: attributes: website: diff --git a/config/locales/an.yml b/config/locales/an.yml index febd52f7ecc467..87044b83696d14 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1038,9 +1038,6 @@ an: lists: Listas mutes: Tiens en silencio storage: Almagazenamiento - featured_tags: - add_new: Anyadir nuevo - hint_html: "Qué son las etiquetas destacadas? S'amuestran de forma prominent en o tuyo perfil publico y permiten a los usuarios navegar per las tuyas publicacions publicas especificament baixo ixas etiquetas. Son una gran ferramienta pa fer un seguimiento de treballos creativos u prochectos a largo plazo." filters: contexts: account: Perfils diff --git a/config/locales/ar.yml b/config/locales/ar.yml index f689f790073e84..70aabf1d5b697c 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -201,6 +201,7 @@ ar: create_relay: إنشاء خادم ترحيل create_unavailable_domain: إنشاء نطاق غير متوفر create_user_role: انشاء دور + create_username_block: إنشاء قاعدة اسم المستخدم demote_user: إنزال رتبة المستخدم destroy_announcement: احذف الإعلان destroy_canonical_email_block: إلغاء حظر لبريد إلكتروني @@ -343,6 +344,10 @@ ar: unpublish: إلغاء النشر unpublished_msg: تم إلغاء نشر الإعلان بنجاح! updated_msg: تم تحديث الإعلان بنجاح! + collections: + accounts: الحسابات + contents: المحتوى + open: فتح critical_update_pending: تحديث حَرِج قيد الانتظار custom_emojis: assign_category: اسند فئة @@ -752,6 +757,7 @@ ar: resolved_msg: تمت معالجة الشكوى بنجاح! skip_to_actions: تخطي إلى الإجراءات status: الحالة + statuses: المنشورات (%{count}) statuses_description_html: سيشار إلى المحتوى المخالف في الاتصال بالحساب المبلغ عنه summary: action_preambles: @@ -790,6 +796,7 @@ ar: categories: administration: الإدارة devops: DevOps + email: البريد الإلكتروني invites: الدعوات moderation: الإشراف special: مميز @@ -820,6 +827,7 @@ ar: manage_blocks_description: السماح للمستخدمين بحظر مقدمي خدمات البريد الإلكتروني وعناوين IP manage_custom_emojis: إدارة الرموز التعبيريّة المخصصة manage_custom_emojis_description: السماح للمستخدمين بإدارة الرموز التعبيريّة المخصصة على الخادم + manage_email_subscriptions: إدارة اشتراكات البريد الإلكتروني manage_federation: إدارة الفديرالية manage_federation_description: يسمح للمستخدمين بحظر أو السماح للاتحاد مع النطاقات الأخرى، والتحكم في إمكانية التسليم manage_invites: إدارة الدعوات @@ -897,9 +905,13 @@ ar: all: للجميع disabled: لا أحد users: للمستخدمين المتصلين محليا + feed_access: + modes: + public: الجميع landing_page: values: about: عن + local_feed: الخيط المحلي trends: المتداوَلة registrations: moderation_recommandation: الرجاء التأكد من أن لديك فريق إشراف كافي وفعال قبل فتح التسجيلات للجميع! @@ -1267,7 +1279,6 @@ ar: application_mailer: notification_preferences: تغيير تفضيلات البريد الإلكتروني salutation: "%{name}،" - settings: 'تغيير تفضيلات البريد الإلكتروني: %{link}' unsubscribe: إلغاء الاشتراك view: 'اعرض:' view_profile: اعرض الصفحة التعريفية @@ -1317,6 +1328,7 @@ ar: progress: confirm: تأكيد عنوان البريد الإلكتروني details: تفاصيلك + list: تقدم التسجيل review: رأيُنا rules: قبول القواعد providers: @@ -1332,6 +1344,7 @@ ar: invited_by: 'يمكنك الانضمام إلى %{domain} بفضل الدعوة التي تلقيتها من:' preamble: يتم تعيين هذه القوانين وفرضها من قبل مشرفي %{domain}. preamble_invited: قبل المتابعة، يرجى قراءة القواعد الأساسية التي وضعها مشرفو %{domain}. + read_more: اقرأ المزيد title: بعض القواعد الأساسية. title_invited: لقد تمت دعوتك. security: الأمان @@ -1380,6 +1393,7 @@ ar: light: فاتح contrast: auto: تلقائي + high: عالٍ crypto: errors: invalid_key: ليس بمفتاح Ed25519 أو Curve25519 صالح @@ -1449,9 +1463,25 @@ ar: your_appeal_pending: لقد قمت بتقديم طعن your_appeal_rejected: تم رفض طعنك edit_profile: - basic_information: معلومات أساسية - hint_html: "قم بتخصيص ما سيراه الناس في ملفك الشخصي العام وبجوار منشوراتك. من المرجح أن يتابعك أشخاص آخرون ويتفاعلون معك إن كان لديك صفحة شخصية مملوء وصورة." other: أخرى + email_subscription_mailer: + confirmation: + action: تأكيد عنوان البريد الإلكتروني + subject: تأكيد عنوان بريدك الإلكتروني + notification: + create_account: إنشاء حساب ماستدون + subject: + plural: منشورات جديدة من %{name} + singular: 'منشور جديد: "%{excerpt}"' + email_subscriptions: + active: نشط + confirmations: + show: + changed_your_mind: هل غيرت رأيك؟ + unsubscribe: إلغاء الاشتراك + inactive: غير نشط + status: الحالة + subscribers: المشتركون emoji_styles: auto: تلقائي native: محلي @@ -1490,10 +1520,8 @@ ar: mutes: قُمتَ بكتم storage: ذاكرة التخزين featured_tags: - add_new: أضف واحدًا جديدا errors: limit: لقد قمت بالفعل بعرض الحد الأقصى من عدد الوسوم - hint_html: "ما هي الوسوم الرائجة؟ يتم عرضها بشكل بارز على ملفك الشخصي العام وتسمح للناس بتصفح منشوراتك العامة على وجه التحديد تحت تلك الوسوم. وهي أداة رائعة لتتبع الأعمال الإبداعية أو المشاريع الطويلة الأجل." filters: contexts: account: الملفات التعريفية @@ -1746,7 +1774,9 @@ ar: uses: عدد الاستخدامات title: دعوة أشخاص link_preview: + author_html: مِن %{name} potentially_sensitive_content: + action: اضغط للعرض hide_button: إخفاء lists: errors: @@ -1762,21 +1792,6 @@ ar: failed_sign_in_html: فشل محاولة تسجيل الدخول مع %{method} من %{ip} (%{browser}) successful_sign_in_html: تم تسجيل الدخول بنجاح مع %{method} من %{ip} (%{browser}) title: تاريخ المصادقة - mail_subscriptions: - unsubscribe: - action: نعم، ألغِ الاشتراك - complete: غير مشترك - confirmation_html: هل أنت متأكد أنك تريد إلغاء الاشتراك عن تلقي %{type} لماستدون على %{domain} إلى بريدك الإلكتروني %{email}؟ يمكنك دائمًا إعادة الاشتراك من إعدادات إشعارات البريد الإلكتروني. - emails: - notification_emails: - favourite: إرسال إشعارات التفضيلات بالبريد الإلكتروني - follow: إرسال إشعارات المتابعة بالبريد الإلكتروني - follow_request: إرسال إشعارات الطلبات بالبريد الإلكتروني - mention: إشعارات رسائل البريد عندما يَذكُرك أحدهم - reblog: رسائل البريد الخاصة بالمنشورات المعاد نشرها - resubscribe_html: إذا قمت بإلغاء الاشتراك عن طريق الخطأ، يمكنك إعادة الاشتراك من إعدادات إشعارات البريد الإلكتروني. - success_html: لن تتلقّ بعد الآن %{type} لماستدون مِن %{domain} على بريدك الإلكتروني %{email}. - title: إلغاء الاشتراك media_attachments: validations: images_and_video: ليس بالإمكان إرفاق فيديو في منشور يحتوي مسبقا على صور @@ -1905,6 +1920,7 @@ ar: posting_defaults: التفضيلات الافتراضية للنشر public_timelines: الخيوط الزمنية العامة privacy: + email_subscriptions: إرسال المنشورات عبر البريد الإلكتروني hint_html: "قم بتخصيص الطريقة التي تريد بها أن يُكتَشَف ملفك الشخصي ومنشوراتك. يمكن لمجموعة متنوعة من الميزات في Mastodon أن تساعدك في الوصول إلى جمهور أوسع عند تفعيلها. خذ بعض الوقت لمراجعة هذه الإعدادات للتأكد من أنها تناسب حالة الاستخدام الخاصة بك." privacy: الخصوصية privacy_hint_html: تحكم في مقدار ما ترغب في الكشف عنه لصالح الآخرين. يكتشف الأشخاص الملفات الشخصية المثيرة والتطبيقات الرائعة من خلال تصفح متابعات الأشخاص الآخرين ورؤية التطبيقات التي ينشرونها، ولكن قد تفضل الاحتفاظ بها مخفية. @@ -2088,10 +2104,14 @@ ar: limit: لقد بلغت الحد الأقصى للمنشورات المثبتة ownership: لا يمكن تثبيت منشور نشره شخص آخر reblog: لا يمكن تثبيت إعادة نشر + quote_error: + not_available: المنشور غير متوفر + revoked: تمت إزالة المنشور من قبل صاحبه quote_policies: followers: للمتابِعين فقط nobody: لي فقط public: أيا كان + quote_post_author: اقتبس منشور من قبل %{acct} title: '%{name}: "%{quote}"' visibilities: direct: إشارة خاصة @@ -2146,6 +2166,8 @@ ar: past_preamble_html: لقد غيرنا شروط خدمتنا منذ زيارتكم الأخيرة. نشجعكم على مراجعة الشروط المحدثة. review_link: مراجعة شروط الخدمة title: شروط خدمة النطاق %{domain} ستتغير + themes: + default: ماستدون time: formats: default: "%b %d, %Y, %H:%M" @@ -2171,6 +2193,9 @@ ar: recovery_codes_regenerated: تم إعادة توليد رموز الاسترجاع الاحتياطية بنجاح recovery_instructions_html: إن فقدت الوصول إلى هاتفك، يمكنك استخدام أحد رموز الاسترداد أدناه لاستعادة الوصول إلى حسابك. حافظ على رموز الاسترداد بأمان. يمكنك ، على سبيل المثال ، طباعتها وتخزينها مع مستندات أخرى هامة. webauthn: مفاتيح الأمان + unsubscriptions: + create: + action: الذهاب إلى الصفحة الرئيسية للخادم user_mailer: announcement_published: description: 'يقوم مديرو %{domain} بإصدار إعلان:' diff --git a/config/locales/ast.yml b/config/locales/ast.yml index c8ca7a7657680b..0e3696f8477c56 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -524,7 +524,6 @@ ast: your_appeal_pending: Unviesti una apellación your_appeal_rejected: Refugóse la to apellación edit_profile: - basic_information: Información básica other: Otres preferencies errors: '400': La solicitú qu'unviesti nun yera válida o yera incorreuta. @@ -554,8 +553,6 @@ ast: domain_blocks: Dominios bloquiaos lists: Llistes storage: Almacenamientu multimedia - featured_tags: - add_new: Amestar filters: contexts: account: Perfiles diff --git a/config/locales/az.yml b/config/locales/az.yml index fb1282ab94c84d..facf81ea5892ab 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -63,6 +63,7 @@ az: create: Moderasiya notu əlavə et description_html: Notlara baxın, gələcəkdə özünüz və digər moderatorlar üçün notlar buraxın title: Moderasiya notları + totals_time_period_hint_html: Aşağıdakı cəmlərə bütün vaxtlardakı verilər daxildir. reports: actions: suspend_description_html: Hesab və onun bütün məzmunları əlçatmaz olacaq və nəticədə silinəcək və onunla əlaqə qurmaq mümkün olmayacaq. 30 gün ərzində geri qaytarıla bilər. Bu hesaba aid bütün hesabatları bağlayır. @@ -128,6 +129,7 @@ az: destroyed: Tətbiq uğurla silindi regenerate_token: Erişim tokenini təkrar yarat token_regenerated: Erişim tokeni uğurla yaradıldı + warning: Bu verilərə çox diqqətlə yanaşın. Bunları heç kəslə paylaşmayın! your_token: Erişim tokeniniz auth: captcha_confirmation: @@ -170,9 +172,12 @@ az: confirm_password: Kimliyinizi doğrulamaq üçün hazırkı parolunuzu daxil edin proceed: Hesabı sil success_msg: Hesabınız uğurla silindi - edit_profile: - basic_information: Təməl məlumatlar - hint_html: "İnsanların hər kəsə açıq profilinizdə və göndərişlərinizin yanında nə göstərmək istədiyinizi özəlləşdirin. Doldurulmuş bir profilə və bir profil şəklinə sahib olduğunuz zaman digər şəxslərin sizi izləmə və sizinlə əlaqə qurma ehtimalı yüksəkdir." + warning: + data_removal: Göndərişləriniz və digər veriləriniz həmişəlik silinəcək + email_subscription_mailer: + notification: + footer: + privacy_html: E-poçtlar, Mastodon tərəfindən dəstəklənən %{domain} serverindən göndərilir. Bu serverin fərdi verilərinizi necə emal etdiyini anlamaq üçün Məxfilik Siyasətinə baxın. exports: archive_takeout: hint_html: "Göndərişlərinizin və yüklədiyiniz medianın bir arxivini tələb edə bilərsiniz. Xaricə köçürülmüş verilər, istənilən uyumlu yazılım tərəfindən oxuna bilən ActivityPub formatında olacaq. Hər 7 gündə bir dəfə arxiv tələb edə bilərsiniz." @@ -199,6 +204,7 @@ az: errors: incompatible_type: Seçilmiş daxilə köçürmə növü ilə uyumlu deyil preface: Başqa serverdən xaricə köçürdüyünüz veriləri (məsələn, izlədiyiniz və ya əngəllədiyiniz insanların siyahısını) daxilə köçürə bilərsiniz. + success: Veriləriniz uğurla yüklənib və zamanla emal olunacaq type_groups: constructive: İzlənilənlər və Əlfəcinlər invites: @@ -211,17 +217,13 @@ az: otp: iki faktorlu kimlik doğrulama tətbiqi password: parol description_html: Əgər tanımadığınız bir fəaliyyəti görsəniz, parolunuzu dəyişdirməyi və iki faktorlu kimlik doğrulamanı fəallaşdırmağı düşünə bilərsiniz - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: təkrar paylaşma bildirişi e-poçtları migrations: incoming_migrations: Fərqli bir hesabdan daşı incoming_migrations_html: Başqa bir hesabdan bu hesaba daşımaq üçün əvvəlcə bir hesab alias-ı yaratmalısınız. proceed_with_move: İzləyiciləri daşı warning: disabled_account: Hazırkı hesabınız daha sonra istifadəyə yararsız olacaq. Ancaq, verilərin xaricə köçürülməsinə, həmçinin təkrar aktivləşdirmə prosesinə erişə biləcəksiniz. + other_data: Başqa (göndərişləriniz və izlədiyiniz hesabların siyahısı daxil olmaqla) heç bir veri avtomatik olaraq danışmayacaq moderation: title: Moderasiya notification_mailer: @@ -254,6 +256,8 @@ az: remove_selected_followers: Seçilmiş izləyiciləri çıxart remove_selected_follows: Seçilmiş istifadəçiləri izləmədən çıxart status: Hesab statusu + self_destruct: + lead_html: Təəssüf ki, %{domain} həmişəlik bağlanır. Əgər orda bir hesabınız varsa, onu istifadə etməyə davam edə bilməyəcəksiniz, ancaq hələ də verilərinizin bir nüsxəsini istəyə bilərsiniz. sessions: browsers: edge: Microsoft Edge diff --git a/config/locales/be.yml b/config/locales/be.yml index 9d06a26030b384..2e5fe1c8d92561 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -792,6 +792,7 @@ be: categories: administration: Адміністрацыя devops: DevOps + email: Эл. пошта invites: Запрашэнні moderation: Мадэрацыя special: Спецыяльны @@ -822,6 +823,8 @@ be: manage_blocks_description: Дазваляе блакіраваць пэўных пастаўшчыкоў паслуг электроннай пошты і IP адрасы manage_custom_emojis: Кіраванне адвольнымі эмодзі manage_custom_emojis_description: Дазваляе кіраваць адвольнымі эмодзі на серверы + manage_email_subscriptions: Наладзіць падпіскі па электроннай пошце + manage_email_subscriptions_description: Дазвольце карыстальнікам падпісвацца на карыстальнікаў з гэтым дазволам праз электронную пошту manage_federation: Кіраваць федэрацыяй manage_federation_description: Дазваляе карыстальнікам блакіраваць або дазваляць аб'яднанне з іншымі даменамі і кантраляваць магчымасць дастаўкі manage_invites: Кіраванне запрашэннямі @@ -1273,7 +1276,6 @@ be: application_mailer: notification_preferences: Змяніць налады эл. пошты salutation: "%{name}," - settings: 'Змяніць налады эл. пошты: %{link}' unsubscribe: Адпісацца view: 'Паглядзець:' view_profile: Паглядзець профіль @@ -1458,9 +1460,44 @@ be: your_appeal_pending: Вы адправілі апеляцыю your_appeal_rejected: Ваша абскарджанне было адхілена edit_profile: - basic_information: Асноўная інфармацыя - hint_html: "Наладзьце тое, што людзі будуць бачыць у вашым профілі і побач з вашымі паведамленнямі. Іншыя людзі з большай верагоднасцю будуць сачыць і ўзаемадзейнічаць з вамі, калі ў вас ёсць запоўнены профіль і фота профілю." other: Іншае + redesign_body: Рэдагаванне профілю цяпер даступнае наўпрост са старонкі профілю. + redesign_button: Перайсці туды + redesign_title: Адбыліся змены ў рэдагаванні профілю + email_subscription_mailer: + confirmation: + action: Пацвердзіць адрас электроннай пошты + instructions_to_confirm: Пацвердзіце, што хочаце атрымліваць электронныя лісты ад %{name} (@%{acct}), калі ён (яна) робіць новыя допісы. + instructions_to_ignore: Калі Вы няўпэўненыя ў тым, чаму Вы атрымалі гэты ліст, можаце выдаліць яго. Вы не будзеце падпісаныя, калі не клікніце па спасылцы вышэй. + subject: Пацвердзіце свой адрас электроннай пошты + title: Атрымліваць абнаўленні па электроннай пошце ад %{name}? + notification: + create_account: Стварыць уліковы запіс Mastodon + footer: + privacy_html: Электронныя лісты адпраўляюцца з %{domain}, сервера Mastodon. Каб зразумець, як гэты сервер апрацоўвае Вашыя асабістыя даныя, звярніцеся да Палітыкі прыватнасці. + reason_for_email_html: Вы атрымалі гэты ліст, таму што пагадзіліся на абнаўленні праз электронную пошту ад %{name}. Не хочаце атрымліваць гэтыя лісты? Адпішыцеся + interact_with_this_post: + few: Узаемадзейнічайце з гэтымі допісамі і знайдзіце іншыя, падобныя да іх. + many: Узаемадзейнічайце з гэтымі допісамі і знайдзіце іншыя, падобныя да іх. + one: Узаемадзейнічайце з гэтым допісам і знайдзіце іншыя, падобныя да яго. + other: Узаемадзейнічайце з гэтымі допісамі і знайдзіце іншыя, падобныя да іх. + subject: + plural: Новыя допісы ад %{name} + singular: 'Новы допіс: "%{excerpt}"' + title: + plural: Новыя допісы ад %{name} + singular: 'Новы допіс: "%{excerpt}"' + email_subscriptions: + active: Актыўная + confirmations: + show: + changed_your_mind: Перадумалі? + success_html: Вы цяпер пачняце атрымліваць электронныя лісты, калі %{name} будзе рабіць новыя допісы. Дадайце %{sender} у свае кантакты, каб гэтыя допісы не траплялі ў папку са спамам. + title: Вы падпісаліся праз эл. пошту + unsubscribe: Адпісацца + inactive: Неактыўная + status: Стан + subscribers: Падпісчыкі па эл.пошце emoji_styles: auto: Аўтаматычны native: Мясцовы @@ -1499,10 +1536,8 @@ be: mutes: Уліковыя запісы, якія вы ігнаруеце storage: Медыясховішча featured_tags: - add_new: Дадаць новы errors: limit: Вы ўжо дадалі максімальную колькасць хэштэгаў - hint_html: "Што такое выбраныя хэштэгі? Яны паказваюцца на бачным месцы вашага профілю і дазваляюць людзям праглядаць вашыя публічныя пасты з гэтымі хэштэгамі. З іхняй дапамогай вельмі зручна сачыць за творчымі ці даўгатэрміновымі праектамі." filters: contexts: account: Профілі @@ -1735,21 +1770,6 @@ be: failed_sign_in_html: Няўдалая спроба ўваходу праз %{method} з %{ip} (%{browser}) successful_sign_in_html: Паспяховы ўваход праз %{method} з %{ip} (%{browser}) title: Гісторыя ўваходаў - mail_subscriptions: - unsubscribe: - action: Так, адпісацца - complete: Адпісаны - confirmation_html: Вы ўпэўнены, што жадаеце адмовіцца ад атрымання %{type} з Mastodon на дамене %{domain} на сваю электронную пошту %{email}? Вы заўсёды можаце паўторна падпісацца ў наладах апавяшчэнняў па электроннай пошце. - emails: - notification_emails: - favourite: апавяшчэнні на пошту пра упадабанае - follow: апавяшчэнні на пошту пра падпіскі - follow_request: апавяшчэнні на пошту пра запыты на падпіску - mention: апавяшчэнні на пошту пра згадванні - reblog: апавяшчэнні на пошту пра пашырэнні - resubscribe_html: Калі вы адмовіліся ад падпіскі памылкова, вы можаце зноў падпісацца ў наладах апавяшчэнняў па электроннай пошце. - success_html: Вы больш не будзеце атрымліваць %{type} на сваю электронную пошту %{email} ад Mastodon на дамене %{domain}. - title: Адпісацца media_attachments: validations: images_and_video: Немагчыма далучыць відэа да допісу, які ўжо змяшчае выявы @@ -1887,6 +1907,8 @@ be: posting_defaults: Публікаваць па змаўчанні public_timelines: Публічныя стужкі privacy: + email_subscriptions: Дасылаць допісы праз электронную пошту + email_subscriptions_hint_html: Дадайце форму падпіскі праз электронную пошту, якую будуць бачыць карыстальнікі, што не ўвайшлі. Калі наведвальнік увядзе свой адрас электроннай пошты і дасць згоду, Mastodon будзе дасылаць яму электронныя лісты аб абнаўленнях у Вашых публічных допісах. hint_html: "Наладзьце тое, якім чынам ваш профіль і вашы паведамленні могуць быць знойдзеныя. Розныя функцыі ў Mastodon могуць дапамагчы вам ахапіць шырэйшую аўдыторыю. Удзяліце час гэтым наладам, каб пераканацца, што яны падыходзяць вам." privacy: Прыватнасць privacy_hint_html: Кантралюйце, колькі інфармацыі вы хочаце раскрыць для карысці іншых. Людзі адкрываюць для сябе цікавыя профілі і класныя праграмы, праглядаючы допісы іншых людзей і даведваючыся, з якіх праграм яны пішуць, але, магчыма, вы аддаеце перавагу трымаць гэта ў таямніцы. @@ -2158,6 +2180,28 @@ be: resume_app_authorization: Працягнуць аўтарызацыю role_requirement: "%{domain} патрабуе, каб Вы ўключылі двухфактарную аўтэнтыфікацыю для таго, каб Вы маглі карыстацца Mastodon." webauthn: Ключы бяспекі + unsubscriptions: + create: + action: Перайсці на хатнюю старонку сервера + email_subscription: + confirmation_html: Вы больш не атрымаеце электронныя лісты ад %{name}. + title: Вы адпісаліся + user: + confirmation_html: Вы больш не атрымаеце %{type} з Mastodon на %{domain}. + notification_emails: + favourite: апавяшчэнні на пошту пра ўпадабанні + follow: апавяшчэнні на пошту пра падпіскі + follow_request: апавяшчэнні на пошту пра запыты на падпіску + mention: апавяшчэнні на пошту пра згадванні + reblog: апавяшчэнні на пошту пра пашырэнні + show: + action: Адпісацца + email_subscription: + confirmation_html: Вы перастанеце атрымліваць электронныя лісты, калі гэты ўліковы запіс будзе рабіць новыя допісы. + title: Адпісацца ад %{name}? + user: + confirmation_html: Вы перастанеце атрымліваць %{type} з Mastodon на %{domain}. + title: Адпісацца ад %{type}? user_mailer: announcement_published: description: 'Аб''ява ад адміністратараў %{domain}:' @@ -2190,7 +2234,7 @@ be: details: 'Вось падрабязнасці ўваходу:' explanation: Мы заўважылі ўваход у ваш уліковы запіс з новага IP-адрасу. further_actions_html: Калі гэта былі не вы, раім вам неадкладна %{action}, а таксама ўключыць двухфактарную аўтэнтыфікацыю, каб захаваць бяспеку вашага ўліковага запісу. - subject: У вас уліковы запіс зайшлі з новага IP-адрасу + subject: У Ваш уліковы запіс зайшлі з новага IP-адрасу title: Новы ўваход terms_of_service_changed: agreement: Працягваючы карыстацца %{domain}, Вы пагаджаецеся з гэтымі ўмовамі. Калі Вы не згодныя з абноўленымі ўмовамі, то можаце ў любы момант адмовіцца ад пагаднення з %{domain}, выдаліўшы свой профіль. diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 514cb2f6e95a7f..67c7d6944ac8e7 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1186,7 +1186,6 @@ bg: application_mailer: notification_preferences: Промяна на предпочитанията за е-поща salutation: "%{name}," - settings: 'Промяна на предпочитанията за имейл: %{link}' unsubscribe: Стоп на абонамента view: 'Преглед:' view_profile: Преглед на профила @@ -1362,8 +1361,6 @@ bg: your_appeal_pending: Подадохте обжалване your_appeal_rejected: Вашето обжалване е отхвърлено edit_profile: - basic_information: Основна информация - hint_html: "Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви. Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила." other: Друго emoji_styles: auto: Автоматично @@ -1403,10 +1400,8 @@ bg: mutes: Заглушавания storage: Съхранение на мултимедия featured_tags: - add_new: Добавяне на нов errors: limit: Вече достигнахте максималния брой хаштагове - hint_html: "Изтъкнете най-важните си хаштагове на профила? Чудесен инструмент за организиране на вашите творби и дългосрочни проекти, изтъкнатите хаштагове са отчетливо видими на вашия профил и позволяват лесен достъп до вашите собствени публикации." filters: contexts: account: Профили @@ -1599,21 +1594,6 @@ bg: failed_sign_in_html: Неуспешен опит за влизане с %{method} от %{ip} (%{browser}) successful_sign_in_html: Успешно влизане с %{method} от %{ip} (%{browser}) title: Историята на удостоверяване - mail_subscriptions: - unsubscribe: - action: Да, да се спре абонамента - complete: Спрян абонамент - confirmation_html: Наистина ли искате да спрете абонамента от получаването на %{type} за Mastodon в %{domain} към имейла си при %{email}? Може винаги пак да се абонирате от своите настройки за известяване по е-поща. - emails: - notification_emails: - favourite: е-писма за известия с любими - follow: е-писма с известия за последване - follow_request: е-писма със заявки за следване - mention: е-писма с известия за споменаване - reblog: е-писма с известия за подсилване - resubscribe_html: Ако погрешка сте спрели абонамента, то може пак да се абонирате от своите настройки за известия по е-поща. - success_html: Повече няма да получавате %{type} за Mastodon на %{domain} към имейла си при %{email}. - title: Спиране на абонамента media_attachments: validations: images_and_video: Не мога да прикача видеоклип към публикация, която вече съдържа изображения diff --git a/config/locales/br.yml b/config/locales/br.yml index c1b2906548a154..6fb6825ebc0fee 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -584,7 +584,6 @@ br: none: Diwall suspend: Astaliñ ar gont edit_profile: - basic_information: Titouroù diavaez other: All emoji_styles: auto: Emgefreek @@ -598,8 +597,6 @@ br: bookmarks: Sinedoù csv: CSV lists: Listennoù - featured_tags: - add_new: Ouzhpennañ unan nevez filters: contexts: account: Profiloù @@ -683,9 +680,6 @@ br: authentication_methods: password: ger-tremen webauthn: alc’hwezioù surentez - mail_subscriptions: - unsubscribe: - action: Ya, digoumanantiñ media_attachments: validations: images_and_video: N'haller stagañ ur video ouzh un embannadur a zo fotoioù gantañ dija diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 32c8e723c27a61..8ee8381ef7a429 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -793,6 +793,7 @@ ca: view_dashboard_description: Permet als usuaris accedir al tauler i a diverses mètriques view_devops: Operadors de desenvolupament view_devops_description: Permet als usuaris accedir als taulers de control de Sidekiq i pgHero + requires_2fa: Requereix autenticació en dues passes title: Rols rules: add_new: Afegir norma @@ -1193,7 +1194,6 @@ ca: application_mailer: notification_preferences: Canviar les preferències de correu-e salutation: "%{name}," - settings: 'Canviar les preferències de correu-e: %{link}' unsubscribe: Cancel·la la subscripció view: 'Visualització:' view_profile: Mostra el perfil @@ -1376,8 +1376,6 @@ ca: your_appeal_pending: Has enviat una apel·lació your_appeal_rejected: La teva apel·lació ha estat rebutjada edit_profile: - basic_information: Informació bàsica - hint_html: "Personalitza el que la gent veu en el teu perfil públic i a prop dels teus tuts.. És més probable que altres persones et segueixin i interaccionin amb tu quan tens emplenat el teu perfil i amb la teva imatge." other: Altres emoji_styles: auto: Automàtic @@ -1417,10 +1415,8 @@ ca: mutes: Persones silenciades storage: Emmagatzematge featured_tags: - add_new: Afegeix-ne una de nova errors: limit: Ja has mostrat la quantitat màxima d'etiquetes - hint_html: "Què son les etiquetes destacades? Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per els teus tuts gràcies a aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini." filters: contexts: account: Perfils @@ -1613,21 +1609,6 @@ ca: failed_sign_in_html: Intent d'inici de sessió errat amb %{method} des de %{ip} (%{browser}) successful_sign_in_html: Inici de sessió exitós amb %{method} des de %{ip} (%{browser}) title: Historial d'autenticació - mail_subscriptions: - unsubscribe: - action: Sí, canceŀla la subscripció - complete: Subscripció cancel·lada - confirmation_html: Segur que vols donar-te de baixa de rebre %{type} de Mastodon a %{domain} a %{email}? Sempre pots subscriure't de nou des de la configuració de les notificacions per correu electrònic. - emails: - notification_emails: - favourite: notificacions dels favorits per correu electrònic - follow: notificacions dels seguiments per correu electrònic - follow_request: correus electrònics de peticions de seguiment - mention: correus electrònics de notificacions de mencions - reblog: correus electrònics de notificacions d'impulsos - resubscribe_html: Si ets dones de baixa per error pots donar-te d'alta des de la configuració de les notificacions per correu electrònic. - success_html: Ja no rebràs %{type} de Mastodon a %{domain} a %{email}. - title: Cancel·la la subscripció media_attachments: validations: images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 2679c7840e9455..9a0a69be45023b 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -670,9 +670,6 @@ ckb: lists: لیستەکان mutes: هەژمارە بێدەنگ کراوە storage: هەمارگەی میدیا - featured_tags: - add_new: زیادکردنی نوێ - hint_html: " هاشتاگی تایبەت چییە؟ بە شێوەیەکی دیار نیشان دەدرێت لەسەر پرۆفایلی گشتی و ڕێگە بە خەڵک دەدات بۆ گەڕان لە نووسراوە گشتیەکانت بە تایبەتی لەژێر ئەو هاشتاگە. ئامرازێکی زۆر باشن بۆ پاراستنی کاری داهێنەرانە یان پڕۆژەی درێژخایەنی ئێوە." filters: contexts: account: پرۆفایلەکان diff --git a/config/locales/co.yml b/config/locales/co.yml index 553aa92fb17ee8..0703ae6d07329a 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -629,9 +629,6 @@ co: lists: Liste mutes: Piattate storage: I vostri media - featured_tags: - add_new: Aghjunghje - hint_html: "Quale sò i hashtag in mostra? Sò messi in vista nant'à u vostru prufile pubblicu è permettenu à a ghjente di vede i vostri statuti ch'annu stu hashtag. Sò una bona manere di mustrà e vostre opere creative o i prughjetti à longu termine." filters: contexts: account: Prufili diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 0d324d145382c2..728d9f87fd8454 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1267,7 +1267,6 @@ cs: application_mailer: notification_preferences: Změnit předvolby e-mailu salutation: "%{name}," - settings: 'Změnit předvolby e-mailu: %{link}' unsubscribe: Přestat odebírat view: 'Zobrazit:' view_profile: Zobrazit profil @@ -1450,8 +1449,6 @@ cs: your_appeal_pending: Podali jste odvolání your_appeal_rejected: Vaše odvolání bylo zamítnuto edit_profile: - basic_information: Základní informace - hint_html: "Nastavte si, co lidé uvidí na vašem veřejném profilu a vedle vašich příspěvků. Ostatní lidé vás budou spíše sledovat a komunikovat s vámi, když budete mít vyplněný profil a profilový obrázek." other: Další emoji_styles: auto: Auto @@ -1491,10 +1488,8 @@ cs: mutes: Skrýváte storage: Úložiště médií featured_tags: - add_new: Přidat nový errors: limit: Již jste zvýraznili maximální počet hashtagů - hint_html: "Co jsou zvýrazněné hashtagy? Zobrazují se prominentně na vašem veřejném profilu a dovolují lidem prohlížet si vaše veřejné příspěvky konkrétně pod těmi hashtagy. Je to skvělý nástroj pro sledování kreativních děl nebo dlouhodobých projektů." filters: contexts: account: Profily @@ -1727,21 +1722,6 @@ cs: failed_sign_in_html: Neúspěšný pokus o přihlášení %{method} z %{ip} (%{browser}) successful_sign_in_html: Úspěšné přihlášení %{method} z %{ip} (%{browser}) title: Historie přihlášení - mail_subscriptions: - unsubscribe: - action: Ano, odeberte odběr - complete: Odběr byl odhlášen - confirmation_html: Jste si jisti, že chcete odhlásit odběr %{type} pro Mastodon na %{domain} na váš e-mail %{email}? Vždy se můžete znovu přihlásit ve svém nastavení e-mailových oznámení. - emails: - notification_emails: - favourite: e-mailové oznámení při oblíbení - follow: e-mailové oznámení při sledování - follow_request: e-mail při žádost o sledování - mention: e-mailové oznámení při zmínění - reblog: e-mailové oznámení při boostu - resubscribe_html: Pokud jste se odhlásili omylem, můžete se znovu přihlásit ve svých nastavení e-mailových oznámení. - success_html: Již nebudete dostávat %{type} pro Mastodon na %{domain} na vaši e-mailovou adresu %{email}. - title: Odhlásit odběr media_attachments: validations: images_and_video: K příspěvku, který již obsahuje obrázky, nelze připojit video diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 560bc3e6f3ead8..df3d3fb75c78f1 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -822,6 +822,7 @@ cy: categories: administration: Gweinyddiaeth devops: DevOps + email: E-bost invites: Gwahoddiadau moderation: Cymedroli special: Arbennig @@ -842,6 +843,8 @@ cy: administrator_description: Bydd defnyddwyr sydd â'r caniatâd hwn yn osgoi pob caniatâd delete_user_data: Dileu Data Defnyddiwr delete_user_data_description: Yn caniatáu i ddefnyddwyr ddileu data defnyddwyr eraill yn ddi-oed + invite_bypass_approval: Gwahodd Defnyddwyr heb adolygiad + invite_bypass_approval_description: Yn caniatáu i bob sydd wedi'u gwahodd i'r gweinydd gan y defnyddwyr hyn i hepgor cymeradwyaeth cymedroli invite_users: Gwahodd Defnyddwyr invite_users_description: Yn caniatáu i ddefnyddwyr wahodd pobl newydd i'r gweinydd manage_announcements: Rheoli Cyhoeddiadau @@ -852,6 +855,8 @@ cy: manage_blocks_description: Yn caniatáu i ddefnyddwyr rwystro darparwyr e-bost a chyfeiriadau IP manage_custom_emojis: Rheoli Emojis Cyfaddas manage_custom_emojis_description: Yn caniatáu i ddefnyddwyr reoli emojis cyfaddas ar y gweinydd + manage_email_subscriptions: Rheoli Tanysgrifiadau E-bost + manage_email_subscriptions_description: Caniatáu i ddefnyddwyr danysgrifio i ddefnyddwyr sydd â'r caniatâd hwn drwy e-bost manage_federation: Rheoli Ffederasiwn manage_federation_description: Yn caniatáu i ddefnyddwyr rwystro neu ganiatáu ffedereiddio â pharthau eraill, a rheoli'r gallu i gyflawni manage_invites: Rheoli Gwahoddiadau @@ -1313,7 +1318,6 @@ cy: application_mailer: notification_preferences: Newid dewisiadau e-bost salutation: "%{name}," - settings: 'Newid dewisiadau e-bost: %{link}' unsubscribe: Dad-danysgrifio view: 'Gweld:' view_profile: Gweld proffil @@ -1498,9 +1502,46 @@ cy: your_appeal_pending: Rydych wedi cyflwyno apêl your_appeal_rejected: Mae eich apêl wedi'i gwrthod edit_profile: - basic_information: Gwybodaeth Sylfaenol - hint_html: "Addaswch yr hyn y mae pobl yn ei weld ar eich proffil cyhoeddus ac wrth ymyl eich postiadau. Mae pobl eraill yn fwy tebygol o'ch dilyn yn ôl a rhyngweithio â chi pan fydd gennych broffil wedi'i lenwi a llun proffil." other: Arall + redesign_body: Mae modd golygu proffiliau’n uniongyrchol o’r dudalen proffil nawr. + redesign_button: Ewch yno + redesign_title: Mae profiad golygu proffil newydd + email_subscription_mailer: + confirmation: + action: Cadarnhau cyfeiriad e-bost + instructions_to_confirm: Cadarnhewch eich bod am dderbyn e-byst gan %{name} (@%{acct}) pan fyddan nhw'n cyhoeddi postiadau newydd. + instructions_to_ignore: Os nad ydych chi'n siŵr pam y gwnaethoch chi dderbyn yr e-bost hwn, gallwch ei ddileu. Fyddwch chi heb danysgrifio os nad ydych wedi clicio ar y ddolen uchod. + subject: Cadarnhewch eich cyfeiriad e-bost + title: Derbyn diweddariadau e-bost gan %{name}? + notification: + create_account: Creu cyfrif Mastodon + footer: + privacy_html: Mae negeseuon e-bost yn cael eu hanfon o %{domain}, gweinydd sy'n cael ei bweru gan Mastodon. I ddeall sut mae'r gweinydd hwn yn prosesu eich data personol, cyfeiriwch at y Polisi Preifatrwydd . + reason_for_email_html: Rydych chi'n derbyn yr e-bost hwn oherwydd eich bod wedi dewis derbyn diweddariadau e-bost gan %{name}. Ddim eisiau derbyn yr e-byst hyn? Dad-danysgrifiwch + interact_with_this_post: + few: Rhyngweithio â'r postiadau hyn a darganfod rhagor. + many: Rhyngweithio â'r postiadau hyn a darganfod rhagor. + one: Rhyngweithio â'r postiad hwn a darganfod fwy yn debyg iddo. + other: Rhyngweithio â'r postiadau hyn a darganfod rhagor. + two: Rhyngweithio â'r postiadau hyn a darganfod rhagor. + zero: Rhyngweithio â'r postiadau hyn a darganfod rhagor. + subject: + plural: Postiadau newydd gan %{name} + singular: 'Postiad newydd: "%{excerpt}"' + title: + plural: Postiadau newydd gan %{name} + singular: 'Postiad newydd: "%{excerpt}"' + email_subscriptions: + active: Gweithredol + confirmations: + show: + changed_your_mind: Wedi newid eich meddwl? + success_html: Byddwch nawr yn dechrau derbyn negeseuon e-bost pan fydd %{name} yn cyhoeddi postiadau newydd. Ychwanegwch %{sender} at eich cysylltiadau fel nad yw'r postiadau hyn yn mynd i'ch ffolder Sbam. + title: Rydych chi wedi cofrestru + unsubscribe: Dad-danysgrifio + inactive: Anweithredol + status: Statws + subscribers: Tanysgrifwyr emoji_styles: auto: Awto native: Cynhenid @@ -1539,10 +1580,8 @@ cy: mutes: Rydych chi'n anwybyddu storage: Storfa cyfryngau featured_tags: - add_new: Ychwanegu errors: limit: Rydych chi eisoes wedi cynnwys y nifer mwyaf o hashnodau - hint_html: "Beth yw hashnodau dan sylw? Maen nhw'n cael eu dangos yn amlwg ar eich proffil cyhoeddus ac yn caniatáu i bobl bori'ch postiadau cyhoeddus yn benodol o dan yr hashnodau hynny. Maen nhw'n arf gwych ar gyfer cadw golwg ar weithiau creadigol neu brojectau tymor hir." filters: contexts: account: Proffilau @@ -1815,21 +1854,6 @@ cy: failed_sign_in_html: Ymgais mewngofnodi wedi methu gyda %{method} gan %{ip} (%{browser}) successful_sign_in_html: Mewngofnodi llwyddiannus gyda %{method} o %{ip} (%{browser}) title: Hanes dilysu - mail_subscriptions: - unsubscribe: - action: Iawn, dad-danysgrifio - complete: Dad-danysgrifiwyd - confirmation_html: Ydych chi'n siŵr eich bod am ddad-danysgrifio rhag derbyn %{type} Mastodon ar %{domain} i'ch e-bost yn %{email}? Gallwch ail-danysgrifio o'ch gosodiadau hysbysu e-bost rhywbryd eto. - emails: - notification_emails: - favourite: e-bost hysbysu hoffi - follow: e-byst hysbysu dilyn - follow_request: e-byst ceisiadau dilyn - mention: e-byst hysbysu crybwylliadau - reblog: e-byst hysbysiadau hybu - resubscribe_html: Os ydych wedi dad-danysgrifio trwy gamgymeriad, gallwch ail-danysgrifio drwy'ch gosodiadau hysbysu e-bost. - success_html: Ni fyddwch bellach yn derbyn %{type} ar gyfer Mastodon ar %{domain} i'ch e-bost am %{email}. - title: Dad-danysgrifio media_attachments: validations: images_and_video: Methu atodi fideo i bostiad sydd eisoes yn cynnwys delweddau @@ -1967,6 +1991,8 @@ cy: posting_defaults: Rhagosodiadau postio public_timelines: Ffrydiau cyhoeddus privacy: + email_subscriptions: Anfon postiadau drwy e-bost + email_subscriptions_hint_html: Ychwanegwch ffurflen gofrestru e-bost at eich proffil sy'n ymddangos i ddefnyddwyr sydd wedi allgofnodi. Pan fydd ymwelwyr yn nodi eu cyfeiriad e-bost ac yn cofrestru, bydd Mastodon yn anfon diweddariadau e-bost ar gyfer eich postiadau cyhoeddus. hint_html: "Cyfaddaswch sut rydych chi am i'ch proffil a'ch postiadau gael eu canfod. Gall amrywiaeth o nodweddion yn Mastodon eich helpu i gyrraedd cynulleidfa ehangach pan fyddwch wedi'ch eu galluogi. Cymerwch eiliad i adolygu'r gosodiadau hyn i sicrhau eu bod yn cyd-fynd â'ch pwrpas defnydd." privacy: Preifatrwydd privacy_hint_html: Rheolwch faint rydych chi am ei ddatgelu er budd eraill. Mae pobl yn darganfod proffiliau diddorol ac apiau difyr trwy bori trwy ddilynwyr pobl eraill a gweld o ba apiau maen nhw'n postio, ond efallai y byddai'n well gennych ei gadw'n gudd. @@ -2034,7 +2060,7 @@ cy: firefox: Firefox generic: Porwr anhysbys huawei_browser: Porwr Huawei - ie: Nid yw'r rhaglen hon yn gydnaws ag Internet Explorer + ie: Internet Explorer micro_messenger: MicroMessenger nokia: Porwr Nokia S40 Ovi opera: Opera @@ -2246,6 +2272,28 @@ cy: resume_app_authorization: Ailddechrau awdurdodi rhaglen role_requirement: Mae %{domain} yn gofyn i chi osod Dilysu Dau Ffactor cyn y gallwch ddefnyddio Mastodon. webauthn: Allweddi diogelwch + unsubscriptions: + create: + action: Ewch i gartref y gweinydd + email_subscription: + confirmation_html: Fyddwch chi ddim yn derbyn negeseuon e-bost gan %{name} bellach. + title: Rydych chi wedi dad-danysgrifio + user: + confirmation_html: Fyddwch chi ddim yn derbyn %{type} gan Mastodon ar %{domain} bellach. + notification_emails: + favourite: e-bost hysbysu hoffi + follow: e-byst hysbysu dilyn + follow_request: e-byst ceisiadau dilyn + mention: e-byst hysbysu crybwyll + reblog: e-byst hysbysiadau hybu + show: + action: Dad-danysgrifio + email_subscription: + confirmation_html: Byddwch chi ddim yn derbyn e-byst pan fydd y cyfrif hwn yn cyhoeddi postiadau newydd. + title: Dad-danysgrifio o %{name}? + user: + confirmation_html: Byddwch chi ddim yn derbyn %{type} gan Mastodon ar %{domain}. + title: Dad-danysgrifio o %{type}? user_mailer: announcement_published: description: 'Mae gweinyddwyr %{domain} yn gwneud cyhoeddiad:' diff --git a/config/locales/da.yml b/config/locales/da.yml index c83750d58c2442..9cc6120ef86c4e 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -762,6 +762,7 @@ da: categories: administration: Administration devops: DevOps + email: E-mail invites: Invitationer moderation: Moderering special: Speciel @@ -790,6 +791,8 @@ da: manage_blocks_description: Tillader brugere at blokere e-mailudbydere og IP-adresser manage_custom_emojis: Administrere tilpassede emojier manage_custom_emojis_description: Tillader brugere at administrere tilpassede emojier på serveren + manage_email_subscriptions: Administrer e-mail-abonnementer + manage_email_subscriptions_description: Giv brugere mulighed for at abonnere på andre brugere med denne tilladelse via e-mail manage_federation: Administrere federation manage_federation_description: Tillader brugere at blokere eller tillade federation med andre domæner og styre leverbarhed manage_invites: Administrere invitationer @@ -1231,7 +1234,6 @@ da: application_mailer: notification_preferences: Skift e-mailpræferencer salutation: "%{name}" - settings: 'Skift e-mailpræferencer: %{link}' unsubscribe: Afmeld notifikationer view: 'Vis:' view_profile: Vis profil @@ -1325,7 +1327,7 @@ da: view_strikes: Se tidligere anmeldelser af din konto too_fast: Formularen indsendt for hurtigt, forsøg igen. use_security_key: Brug sikkerhedsnøgle - user_agreement_html: Jeg accepterer Tjenestevilkår og Fortrolighedspolitik + user_agreement_html: Jeg accepterer Tjenestevilkår og Privatlivspolitik user_privacy_agreement_html: Jeg accepterer fortrolighedspolitikken author_attribution: example_title: Eksempeltekst @@ -1382,7 +1384,7 @@ da: email_contact_html: Hvis den stadig ikke modtages, send en e-mail til %{email} for hjælp email_reconfirmation_html: Modtages bekræftelsesmailen ikke, kan man anmode om en ny irreversible: Du vil ikke kunne gendanne eller genaktivere din konto - more_details_html: For yderligere oplysningerer, tjek privatlivspolitikken. + more_details_html: For yderligere oplysninger, tjek privatlivspolitikken. username_available: Dit brugernavn vil blive tilgængeligt igen username_unavailable: Dit brugernavn vil forblive utilgængeligt disputes: @@ -1416,9 +1418,42 @@ da: your_appeal_pending: Du har indgivet en appel your_appeal_rejected: Din appel er afvist edit_profile: - basic_information: Oplysninger - hint_html: "Tilpas, hvad folk ser på din offentlige profil og ved siden af dine indlæg. Andre personer er mere tilbøjelige til at følge dig tilbage og interagere med dig, når du har en udfyldt profil og et profilbillede." other: Andre + redesign_body: Profilredigering kan nu tilgås direkte fra profilsiden. + redesign_button: Gå dertil + redesign_title: Der er en ny måde at redigere sin profil på + email_subscription_mailer: + confirmation: + action: Bekræft e-mailadresse + instructions_to_confirm: Bekræft, at du gerne vil modtage e-mails fra %{name} (@%{acct}), når vedkommende offentliggør nye indlæg. + instructions_to_ignore: Hvis du ikke ved, hvorfor du har modtaget denne e-mail, kan du slette den. Du bliver ikke tilmeldt, hvis du ikke klikker på linket ovenfor. + subject: Bekræft din e-mailadresse + title: Modtag e-mail opdateringer fra %{name}? + notification: + create_account: Opret en Mastodon-konto + footer: + privacy_html: E-mails sendes fra %{domain}, en server drevet af Mastodon. For at få mere at vide om, hvordan denne server behandler dine personoplysninger, kan du læse privatlivspolitikken. + reason_for_email_html: Du modtager denne e-mail, fordi du har valgt at modtage e-mailopdateringer fra %{name}. Ønsker du ikke at modtage disse e-mails? Afmeld + interact_with_this_post: + one: Interagér med dette indlæg, og find flere lignende indlæg. + other: Interagér med disse indlæg, og find flere. + subject: + plural: Nye indlæg fra %{name} + singular: 'Nyt indlæg: "%{excerpt}"' + title: + plural: Nye indlæg fra %{name} + singular: 'Nyt indlæg: "%{excerpt}"' + email_subscriptions: + active: Aktive + confirmations: + show: + changed_your_mind: Har du skiftet mening? + success_html: Du vil nu begynde at modtage e-mails, når %{name} offentliggør nye indlæg. Tilføj %{sender} til dine kontakter, så disse indlæg ikke ender i din spam-mappe. + title: Du er tilmeldt + unsubscribe: Afmeld + inactive: Inaktive + status: Status + subscribers: Abonnenter emoji_styles: auto: Auto native: Indbygget @@ -1457,10 +1492,8 @@ da: mutes: Du skjuler storage: Medielagerplads featured_tags: - add_new: Tilføj nyt errors: limit: Det maksimale antal hashtags er allerede fremhævet - hint_html: "Hvad er fremhævede hashtags? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." filters: contexts: account: Profiler @@ -1653,21 +1686,6 @@ da: failed_sign_in_html: Mislykket indlogning med %{method} fra %{ip} (%{browser}) successful_sign_in_html: Gennemført indlogning med %{method} fra %{ip} (%{browser}) title: Godkendelseshistorik - mail_subscriptions: - unsubscribe: - action: Ja, afmeld - complete: Afmeldt - confirmation_html: Er du sikker på, at du vil afmelde modtagelse af %{type} for Mastodon på %{domain} til din e-mail på %{email}? Du kan altid tilmelde dig igen fra dine indstillinger for e-mail-notifikationer. - emails: - notification_emails: - favourite: e-mailnotifikationer om favoritmarkeringer - follow: e-mailnotifikationer om nye følgere - follow_request: e-mailnotifikationer om følgeanmodninger - mention: e-mailnotifikationer om omtaler - reblog: e-mailnotifikationer om fremhævelser - resubscribe_html: Har du afmeldt dig ved en fejl, kan du gentilmelde dig via indstillingerne for e-mail-notifikationer. - success_html: Du vil ikke længere modtage %{type} for Mastodon på %{domain} til din e-mail %{email}. - title: Opsig abonnement media_attachments: validations: images_and_video: En video kan ikke vedhæftes et indlæg med billedindhold @@ -1713,6 +1731,27 @@ da: copy_account_note_text: 'Denne bruger er flyttet fra %{acct}, hvor dine tidligere noter om dem var:' navigation: toggle_menu: Åbn/luk menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} tilføjede dig til en samling" + admin_report: + title_html: "%{name} anmeldte %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} og en anden tilmeldte sig" + other: "%{name} og %{count} andre tilmeldte sig" + title_html: "%{name} tilmeldte sig" + collection_update: + title_html: "%{name} opdaterede en samling, du er med i" + generic: + sign_in: Log ind på Mastodon web-appen + summary_html: Du bruger på en app, der ikke understøtter den seneste version af Mastodon. %{link} for fuld funktionalitet. + moderation_warning: + summary_html: Du bruger en app, der ikke understøtter den seneste version af Mastodon. %{link}. + title: Du har modtaget en moderationsadvarsel. + severed_relationships: + summary_html: En administrator fra %{from} har suspenderet %{target}, hvilket betyder, at du ikke længere kan modtage opdateringer fra dem eller interagere med dem. %{link} for at hente en liste over de tabte forhold. + title: Mistede forbindelser med %{name} notification_mailer: admin: report: @@ -1805,6 +1844,8 @@ da: posting_defaults: Standarder for indlæg public_timelines: Offentlige tidslinjer privacy: + email_subscriptions: Send indlæg via e-mail + email_subscriptions_hint_html: Tilføj en tilmeldingsformular til din profil, som vises for brugere, der ikke er logget ind. Når besøgende indtaster deres e-mailadresse og tilmelder sig, sender Mastodon e-mailopdateringer om dine offentlige indlæg. hint_html: "Tilpas hvordan din profil og dine indlæg kan findes. En række funktioner i Mastodon kan hjælpe dig med at nå ud til et bredere publikum, hvis du aktiverer dem. Tjek indstillingerne herunder for at sikre, at de passer til dit brugsscenarie." privacy: Privatliv privacy_hint_html: Styr, hvor meget du vil afsløre til gavn for andre. Folk opdager interessante profiler og apps ved at gennemse andres følgere og se, hvilke apps de sender fra, men du foretrækker måske at holde det skjult. @@ -2068,6 +2109,28 @@ da: resume_app_authorization: Genoptag godkendelse af applikation role_requirement: "%{domain} kræver, at du konfigurerer tofaktorgodkendelse, før du kan bruge Mastodon." webauthn: Sikkerhedsnøgler + unsubscriptions: + create: + action: Gå til serverens hjemmeside + email_subscription: + confirmation_html: Du vil ikke længere modtage e-mails fra %{name}. + title: Du er afmeldt + user: + confirmation_html: Du vil ikke længere modtage %{type} fra Mastodon på %{domain}. + notification_emails: + favourite: e-mail-notifikationer om favoritmarkeringer + follow: e-mail-notifikationer om nye følgere + follow_request: e-mail-notifikationer om følgeanmodninger + mention: e-mail-notifikationer om omtaler + reblog: e-mail-notifikationer om fremhævelser + show: + action: Afmeld + email_subscription: + confirmation_html: Du vil ikke længere modtage e-mails, når denne konto offentliggør nye indlæg. + title: Afmeld fra %{name}? + user: + confirmation_html: Du vil ikke længere modtage %{type} fra Mastodon på %{domain}. + title: Afmeld fra %{type}? user_mailer: announcement_published: description: 'Administratorerne på %{domain} udsender en annoncering:' diff --git a/config/locales/de.yml b/config/locales/de.yml index 4981257442e109..6604c28fd5ae3a 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -17,7 +17,7 @@ de: other: Folge ich instance_actor_flash: Dieses Konto ist ein virtueller Akteur, der den Server selbst repräsentiert, und kein persönliches Profil. Es wird für Föderationszwecke verwendet und sollte daher nicht gesperrt werden. last_active: zuletzt aktiv - link_verified_on: Das Profil mit dieser E-Mail-Adresse wurde bereits am %{date} bestätigt + link_verified_on: Dieser Link wurde am %{date} Uhr verifiziert nothing_here: Keine Treffer mit dieser Auswahl pin_errors: following: Du musst dieser Person folgen, um sie empfehlen zu können @@ -762,6 +762,7 @@ de: categories: administration: Administration devops: DevOps + email: E-Mail invites: Einladungen moderation: Moderation special: Besonderheit @@ -790,6 +791,8 @@ de: manage_blocks_description: E-Mail-Provider und IP-Adressen sperren manage_custom_emojis: Emojis manage_custom_emojis_description: Spezielle Emojis dieses Servers verwalten + manage_email_subscriptions: E-Mail-Abonnements + manage_email_subscriptions_description: Profile können per E-Mail-Benachrichtigung abonniert werden manage_federation: Föderation manage_federation_description: Domains anderer Mastodon-Server sperren/zulassen – und Zustellbarkeit kontrollieren manage_invites: Einladungen @@ -1231,7 +1234,6 @@ de: application_mailer: notification_preferences: E-Mail-Einstellungen ändern salutation: "%{name}," - settings: 'E-Mail-Einstellungen ändern: %{link}' unsubscribe: Abbestellen view: 'Siehe:' view_profile: Profil anzeigen @@ -1416,9 +1418,42 @@ de: your_appeal_pending: Du hast Einspruch erhoben your_appeal_rejected: Dein Einspruch wurde abgelehnt edit_profile: - basic_information: Allgemeine Informationen - hint_html: "Bestimme, was andere auf deinem öffentlichen Profil und neben deinen Beiträgen sehen können. Wenn du ein Profilbild festlegst und dein Profil vervollständigst, werden andere eher mit dir interagieren und dir folgen." other: Andere + redesign_body: Dein Profil kannst du jetzt direkt auf deiner Profilseite bearbeiten. + redesign_button: Loslegen + redesign_title: Es gibt eine brandneue Möglichkeit, das Profil zu bearbeiten + email_subscription_mailer: + confirmation: + action: E-Mail-Adresse bestätigen + instructions_to_confirm: Bitte bestätige, dass du per E-Mail benachrichtigt werden möchtest, sobald %{name} @(%{acct}) einen neuen Beitrag veröffentlicht. + instructions_to_ignore: Wenn du nicht weißt oder du dir nicht sicher bist, weshalb du diese E-Mail erhalten hast, kannst du sie einfach löschen. Du wird für das Abo nicht angemeldet, wenn du nicht auf den obigen Link klickst. + subject: Bestätige deine E-Mail-Adresse + title: E-Mail-Benachrichtigungen von %{name} erhalten? + notification: + create_account: Mastodon-Konto erstellen + footer: + privacy_html: E-Mails werden über %{domain}, einem Mastodon-Server, verschickt. Wie dieser Server deine personenbezogenen Daten verarbeitet, steht in der Datenschutzerklärung . + reason_for_email_html: Du hast diese E-Mail erhalten, weil du dich für Neuigkeiten von %{name} angemeldet hast. Kein Interesse mehr? Abmelden + interact_with_this_post: + one: Reagiere jetzt auf diesen Beitrag – und entdecke weitere Beiträge wie diesen. + other: Reagiere jetzt auf diese Beiträge – und entdecke weitere. + subject: + plural: Neue Beiträge von %{name} + singular: 'Neuer Beitrag: „%{excerpt}“' + title: + plural: Neue Beiträge von %{name} + singular: 'Neuer Beitrag: „%{excerpt}“' + email_subscriptions: + active: Aktiviert + confirmations: + show: + changed_your_mind: Meinung geändert? + success_html: Du wirst nun per E-Mail benachrichtigt, sobald %{name} einen neuen Beitrag veröffentlichen wird. Füge sicherheitshalber noch %{sender} deinem Adressbuch hinzu, damit diese E-Mails nicht fälschlich im Spam-Ordner deines E-Mail-Postfachs landen. + title: Du hast dich angemeldet + unsubscribe: Abbestellen + inactive: Deaktiviert + status: Status + subscribers: Abonnent*innen emoji_styles: auto: Automatisch native: Nativ @@ -1457,10 +1492,8 @@ de: mutes: Stummgeschaltete Profile storage: Medienspeicher featured_tags: - add_new: Neuen hinzufügen errors: limit: Du hast bereits die maximale Anzahl an Hashtags erreicht - hint_html: "Präsentiere deine wichtigsten Hashtags auf deinem Profil. Vorgestellte Hashtags verschaffen einen Überblick über deine kreativen Werke und langfristigen Projekte. Sie werden gut sichtbar auf deinem Profil angezeigt und ermöglichen einen schnellen Zugriff auf deine eigenen Beiträge." filters: contexts: account: Profile @@ -1653,21 +1686,6 @@ de: failed_sign_in_html: Fehlgeschlagener Anmeldeversuch mit %{method} von %{ip} (%{browser}) successful_sign_in_html: Erfolgreiches Anmelden mit %{method} von %{ip} (%{browser}) title: Anmeldeverlauf - mail_subscriptions: - unsubscribe: - action: Ja, abbestellen - complete: Abbestellt - confirmation_html: Möchtest du %{type} für Mastodon auf %{domain} an deine E-Mail-Adresse %{email} wirklich abbestellen? Du kannst dies später in den Einstellungen Benachrichtigungen per E-Mail rückgängig machen. - emails: - notification_emails: - favourite: E-Mail-Benachrichtigungen bei Favoriten - follow: E-Mail-Benachrichtigungen bei Followern - follow_request: E-Mail-Benachrichtigungen bei Follower-Anfragen - mention: E-Mail-Benachrichtigungen bei Erwähnungen - reblog: E-Mail-Benachrichtigungen bei geteilten Beiträgen - resubscribe_html: Falls du etwas irrtümlich abbestellt hast, kannst du das in den Einstellungen Benachrichtigungen per E-Mail rückgängig machen. - success_html: Du wirst nicht länger %{type} für Mastodon auf %{domain} an deine E-Mail-Adresse %{email} erhalten. - title: Abbestellen media_attachments: validations: images_and_video: Es kann kein Video an einen Beitrag angehängt werden, der bereits Bilder enthält @@ -1713,6 +1731,27 @@ de: copy_account_note_text: 'Dieses Konto ist von %{acct} umgezogen. Hier deine damals verfassten Notizen zum Profil:' navigation: toggle_menu: Menü ein-/ausblenden + notification_fallbacks: + added_to_collection: + title_html: "%{name} fügte dich zu einer Sammlung hinzu" + admin_report: + title_html: "%{name} meldete %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} und noch jemand anderes registrierten sich" + other: "%{name} und %{count} weitere registrierten sich" + title_html: "%{name} registrierte sich" + collection_update: + title_html: "%{name} aktualisierte eine Sammlung, in der du vorgestellt wirst" + generic: + sign_in: Auf der Mastodon-Website anmelden + summary_html: Deine App unterstützt nicht die neueste Mastodon-Version. Rufe %{link} auf, um alle Funktionen nutzen zu können. + moderation_warning: + summary_html: Deine App unterstützt nicht die neueste Mastodon-Version. %{link}. + title: Die Moderator*innen haben dich verwarnt. + severed_relationships: + summary_html: Administrator*innen von %{from} haben den Zugriff auf den externen Server %{target} gesperrt. Das bedeutet, dass du keine Inhalte mehr von dort erhältst. Du kannst auch nicht mehr mit den Profilen dieses Servers interagieren. Rufe %{link} auf, um alle Profile, denen du folgtest und die dir folgten, einzusehen. + title: Verbindung zu %{name} verloren notification_mailer: admin: report: @@ -1771,6 +1810,7 @@ de: quadrillion: Brd. thousand: Tsd. trillion: Bio. + unit: '' otp_authentication: code_hint: Gib den Code ein, den deine 2FA- bzw. TOTP-App generiert hat, um den Vorgang zu bestätigen description_html: Wenn du die Zwei-Faktor-Authentisierung (2FA) mit einer Authentifizierungs-App deines Smartphones aktivierst, benötigst du neben dem regulären Passwort zusätzlich auch den zeitbasierten Code der 2FA-App, um dich anmelden zu können. @@ -1805,6 +1845,8 @@ de: posting_defaults: Standardeinstellungen für Beiträge public_timelines: Öffentliche Timelines privacy: + email_subscriptions: Sende Beiträge per E-Mail + email_subscriptions_hint_html: Füge deinem Profil ein E-Mail-Formular für nicht angemeldete Personen hinzu. Dadurch können sie von Mastodon E-Mails über deine neuen öffentlichen Beiträge erhalten. hint_html: "Bestimme selbst, wie dein Profil und deine Beiträge gefunden werden sollen. Zahlreiche Mastodon-Funktionen können dir für eine größere Reichweite behilflich sein. Nimm dir einen Moment Zeit, um diese Einstellungen zu überprüfen." privacy: Datenschutz privacy_hint_html: Bestimme, wie viele Informationen du für andere preisgeben möchtest. Viele Menschen entdecken interessante Profile und coole Apps, indem sie die Follower anderer Profile durchstöbern und die Apps sehen, über die Beiträge veröffentlicht wurden – möglicherweise möchtest du diese Informationen ausblenden. @@ -1925,7 +1967,7 @@ de: preferences: Einstellungen profile: Öffentliches Profil relationships: Follower und Folge ich - severed_relationships: Getrennte Beziehungen + severed_relationships: Getrennte Verbindungen statuses_cleanup: Automatisiertes Löschen strikes: Maßnahmen two_factor_authentication: Zwei-Faktor-Authentisierung @@ -1938,7 +1980,7 @@ de: user_domain_block: Du hast %{target_name} blockiert lost_followers: Verlorene Follower lost_follows: Konten entfolgt - preamble: Möglicherweise verlierst du Follower und entfolgst Konten, wenn du eine Domain blockierst oder Moderator*innen externe Server sperren. Sollte das der Fall sein, wirst du eine Liste mit den getrennten Beziehungen herunterladen können. Dadurch kannst du die Änderungen einsehen oder die Liste auf einen anderen Server importieren. + preamble: Möglicherweise verlierst du Follower und entfolgst Konten, wenn du eine Domain blockierst oder Moderator*innen externe Server sperren. Sollte das der Fall sein, wirst du eine Liste mit den getrennten Verbindungen einsehen und herunterladen können. Dadurch kannst du die Änderungen einsehen oder die Liste auf einen anderen Server importieren. purged: Informationen über diesen Server wurden von deinen Server-Administrator*innen entfernt. type: Ereignis statuses: @@ -2068,6 +2110,28 @@ de: resume_app_authorization: Autorisierung der App fortsetzen role_requirement: "%{domain} verlangt das Einrichten einer Zwei-Faktor-Authentisierung, bevor du Mastodon verwenden kannst." webauthn: Sicherheitsschlüssel + unsubscriptions: + create: + action: Zur Homepage des Servers gehen + email_subscription: + confirmation_html: Du erhältst keine E-Mails mehr von %{name}. + title: Du wurdest abgemeldet + user: + confirmation_html: Du erhältst von Mastodon zukünftig keine %{type} auf %{domain}. + notification_emails: + favourite: E-Mail-Benachrichtigungen über neue Favoriten + follow: E-Mail-Benachrichtigungen über neue Follower + follow_request: E-Mail-Benachrichtigungen über neue Follower-Anfragen + mention: E-Mail-Benachrichtigungen über neue Erwähnungen + reblog: E-Mail-Benachrichtigungen über geteilte Beiträge + show: + action: Abbestellen + email_subscription: + confirmation_html: Du wirst bei neuen Beiträgen keine E-Mails mehr erhalten. + title: "%{name} abbestellen?" + user: + confirmation_html: Du wirst von Mastodon zukünftig keine %{type} auf %{domain} erhalten. + title: "%{type} abbestellen?" user_mailer: announcement_published: description: 'Ankündigung der Administrator*innen von %{domain}:' @@ -2194,7 +2258,7 @@ de: extra_instructions_html: Hinweis: Der Link auf deiner Website kann unsichtbar sein. Der wichtige Teil ist rel="me". Du kannst auch den Tag link im head (statt a im body) verwenden, jedoch muss die Internetseite ohne JavaScript abrufbar sein. here_is_how: So funktioniert’s hint_html: "Alle können ihre Identität auf Mastodon verifizieren. Basierend auf offenen Standards – jetzt und für immer kostenlos. Alles, was du brauchst, ist eine eigene Website. Wenn du von deinem Profil auf diese Website verlinkst, überprüfen wir, ob die Website zu deinem Profil zurückverlinkt, und zeigen einen visuellen Hinweis an." - instructions_html: Kopiere den unten stehenden Code und füge ihn in den HTML-Code deiner Website ein. Trage anschließend die Adresse deiner Website in ein Zusatzfeld auf deinem Profil ein und speichere die Änderungen. Die Zusatzfelder befinden sich im Reiter „Profil bearbeiten“. + instructions_html: Kopiere den unten stehenden Code und füge ihn in den HTML-Code deiner Website ein. Trage anschließend die Adresse deiner Website in ein Zusatzfeld auf deinem Profil ein und speichere die Änderungen. Die Zusatzfelder können unter „Profil bearbeiten“ verwaltet werden. verification: Verifizierung verified_links: Deine verifizierten Links website_verification: Verifizierung einer Website diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml index 3708d70ce6d4ab..f37e475360979c 100644 --- a/config/locales/devise.el.yml +++ b/config/locales/devise.el.yml @@ -24,17 +24,17 @@ el: action_with_app: Επιβεβαίωση και επιστροφή στο %{app} explanation: Δημιούργησες έναν λογαριασμό στο %{host} με αυτή τη διεύθυνση email. Με ένα κλικ θα τον ενεργοποιήσεις. Αν δεν το έκανες εσύ, παρακαλούμε αγνόησε αυτό το email. explanation_when_pending: Έχεις υποβάλλει αίτηση πρόσκλησης στο %{host} με αυτή την διεύθυνση email. Μόλις επιβεβαιώσεις το email σου, θα ελέγξουμε την αίτηση σου. Μέχρι τότε δε θα μπορείς να συνδεθείς. Αν απορριφθεί η αίτησή σου, τα στοιχεία σου θα αφαιρεθούν, άρα δε θα χρειαστεί να κάνεις κάτι επιπλέον. Αν δεν υπέβαλες εσύ την αίτηση, αγνόησε αυτό το email. - extra_html: Παρακαλούμε να διαβάσεις του κανόνες αυτού του κόμβου και τους όρους χρήσης της υπηρεσίας μας. + extra_html: Παρακαλούμε διάβασε επίσης τους κανόνες του διακομιστή και τους όρους χρήσης της υπηρεσίας μας. subject: 'Mastodon: Οδηγίες επιβεβαίωσης για %{instance}' title: Επιβεβαίωσε διεύθυνση email email_changed: explanation: 'Αλλάζεις τη διεύθυνση email για τον λογαριασμό σου στην:' - extra: Αν δεν άλλαξες εσύ το email σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω. + extra: Αν δεν άλλαξες εσύ το email σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του διακομιστή αν έχεις κλειδωθεί απ' έξω. subject: 'Mastodon: Το email άλλαξε' title: Νέα διεύθυνση email password_change: explanation: Το συνθηματικό του λογαριασμού σου άλλαξε. - extra: Αν δεν άλλαξες εσύ το συνθηματικό σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του κόμβου σου αν έχεις κλειδωθεί απ' έξω. + extra: Αν δεν άλλαξες εσύ το συνθηματικό σου, ίσως κάποιος να έχει αποκτήσει πρόσβαση στο λογαριασμό σου. Παρακαλούμε άλλαξε το συνθηματικό σου άμεσα ή επικοινώνησε με τον διαχειριστή του διακομιστή αν έχεις κλειδωθεί απ' έξω. subject: 'Mastodon: Αλλαγή συνθηματικού' title: Ο κωδικός άλλαξε reconfirmation_instructions: @@ -89,21 +89,21 @@ el: success: Επιτυχημένη πιστοποίηση μέσω %{kind} λογαριασμού. passwords: no_token: Δεν μπορείς να επισκεφτείς αυτή τη σελίδα αν δεν έρχεσαι από email επαναφοράς συνθηματικού. Αν όντως έρχεσαι από email επαναφοράς συνθηματικού, σιγουρέψου πως χρησιμοποίησες το πλήρες URL που σου στάλθηκε. - send_instructions: Αν η email διεύθυνσή σου υπάρχει ήδη στη βάση μας, θα λάβεις σύντομα έναν σύνδεσμο ανάκτησης συνθηματικού. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + send_instructions: Αν η διεύθυνση email σου υπάρχει ήδη στη βάση μας, θα λάβεις σύντομα έναν σύνδεσμο ανάκτησης συνθηματικού. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το έχεις λάβει. send_paranoid_instructions: Αν η email διεύθυνσή σου υπάρχει ήδη στη βάση μας, θα λάβεις σύντομα έναν σύνδεσμο ανάκτησης συνθηματικού. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. updated: Το συνθηματικό σου άλλαξε. Πλέον έχεις συνδεθεί. updated_not_active: Το συνθηματικό σου άλλαξε. registrations: destroyed: Αντίο! Ο λογαριασμός σου ακυρώθηκε με επιτυχία. Ελπίζουμε να σε ξαναδούμε σύντομα. - update_needs_confirmation: Ενημέρωσες το λογαριασμό σου με επιτυχία αλλά χρειαζόμαστε να επιβεβαιώσουμε τη νέα διεύθυνση email σου. Παρακαλούμε έλεγξε τα email σου και ακολούθησε το σύνδεσμο για να την επιβεβαιώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + update_needs_confirmation: Ενημέρωσες το λογαριασμό σου με επιτυχία αλλά χρειαζόμαστε να επιβεβαιώσουμε τη νέα διεύθυνση email σου. Παρακαλούμε έλεγξε τα email σου και ακολούθησε το σύνδεσμο για να την επιβεβαιώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το έχεις λάβει. updated: Ο λογαριασμός σου επιβεβαιώθηκε με επιτυχία. sessions: already_signed_out: Αποσυνδέθηκες με επιτυχία. signed_in: Συνδέθηκες με επιτυχία. signed_out: Αποσυνδέθηκες με επιτυχία. unlocks: - send_instructions: Σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να ξεκλειδώσεις το λογαριασμό σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. - send_paranoid_instructions: Αν ο λογαριασμός σου υπάρχει, σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να τον ξεκλειδώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις. + send_instructions: Σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να ξεκλειδώσεις το λογαριασμό σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το έχεις λάβει. + send_paranoid_instructions: Αν ο λογαριασμός σου υπάρχει, σε μερικά λεπτά θα λάβεις ένα email με οδηγίες για το πως να τον ξεκλειδώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το έχεις λάβει. unlocked: Ο λογαριασμός σου ξεκλειδώθηκε με επιτυχία. Παρακαλούμε συνδέσου για να συνεχίσεις. errors: messages: diff --git a/config/locales/devise.fr-CA.yml b/config/locales/devise.fr-CA.yml index 1acb5d1770f27b..20d58a365abc8c 100644 --- a/config/locales/devise.fr-CA.yml +++ b/config/locales/devise.fr-CA.yml @@ -7,7 +7,7 @@ fr-CA: send_paranoid_instructions: Si votre adresse courriel existe dans notre base de données, vous allez recevoir un courriel contenant les instructions de confirmation de votre adresse. Veuillez vérifier votre dossier de pourriels si vous n'avez pas reçu ce message. failure: already_authenticated: Vous êtes déjà connecté·e. - closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. + closed_registrations: Votre inscription a été bloquée en raison d'une politique réseau. Si vous pensez qu'il s'agit d'une erreur, contacter %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. @@ -49,12 +49,12 @@ fr-CA: subject: 'Mastodon: Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe two_factor_disabled: - explanation: La connexion est maintenant possible en n'utilisant uniquement l'adresse e-mail et le mot de passe. + explanation: La connexion est maintenant possible en utilisant uniquement l'adresse de courriel et le mot de passe. subject: 'Mastodon: authentification à deux facteurs désactivée' subtitle: L'authentification à deux facteurs pour votre compte a été désactivée. title: A2F désactivée two_factor_enabled: - explanation: Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. + explanation: Un jeton généré par l'application TOTP appairée sera nécessaire pour vous connecter. subject: 'Mastodon: authentification à deux facteurs activée' subtitle: L'authentification à deux facteurs est maintenant activée pour votre compte. title: A2F activée diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index ef2fd873c47da5..882605b45ced43 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -3,11 +3,11 @@ fr: devise: confirmations: confirmed: Votre adresse de courriel a été validée. - send_instructions: Vous allez recevoir par courriel les instructions nécessaires à la confirmation de votre compte dans quelques minutes. Veuillez, dans le cas où vous ne recevriez pas ce message, vérifier votre dossier d’indésirables. - send_paranoid_instructions: Si votre adresse électronique existe dans notre base de données, vous allez bientôt recevoir un courriel contenant les instructions de confirmation de votre compte. Veuillez, dans le cas où vous ne recevriez pas ce message, vérifier votre dossier d’indésirables. + send_instructions: Vous allez recevoir par courriel les instructions nécessaires à la confirmation de votre compte dans quelques minutes. Dans le cas où vous ne recevriez pas ce message, veuillez vérifier vos courriels indésirables. + send_paranoid_instructions: Si votre adresse de courriel existe dans notre base de données, vous allez bientôt recevoir un message contenant les instructions de confirmation de votre compte. Veuillez, dans le cas où vous ne recevriez pas ce message, vérifier vos courriels indésirables. failure: already_authenticated: Vous êtes déjà connecté⋅e. - closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. + closed_registrations: Votre inscription a été bloquée en raison d'une politique réseau. Si vous pensez qu'il s'agit d'une erreur, contacter %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. @@ -46,15 +46,15 @@ fr: action: Modifier le mot de passe explanation: Vous avez demandé un nouveau mot de passe pour votre compte. extra: Si vous ne l’avez pas demandé, veuillez ignorer ce courriel. Votre mot de passe ne changera pas tant que vous n’aurez pas cliqué sur le lien ci-dessus et que vous n’en aurez pas créé un nouveau. - subject: 'Mastodon : Instructions pour changer votre mot de passe' + subject: 'Mastodon : instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe two_factor_disabled: - explanation: La connexion est maintenant possible en n'utilisant uniquement l'adresse e-mail et le mot de passe. + explanation: La connexion est maintenant possible en utilisant uniquement l'adresse de courriel et le mot de passe. subject: 'Mastodon : authentification à deux facteurs désactivée' subtitle: L'authentification à deux facteurs pour votre compte a été désactivée. - title: 2FA désactivée + title: Authentification à deux facteurs désactivée two_factor_enabled: - explanation: Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. + explanation: Un jeton généré par l'application TOTP appairée sera nécessaire pour vous connecter. subject: 'Mastodon : authentification à deux facteurs activée' subtitle: L'authentification à deux facteurs est maintenant activée pour votre compte. title: A2F activée diff --git a/config/locales/devise.io.yml b/config/locales/devise.io.yml index 8a86cf18b080fc..df49f96049c5c3 100644 --- a/config/locales/devise.io.yml +++ b/config/locales/devise.io.yml @@ -7,6 +7,7 @@ io: send_paranoid_instructions: Se tua retpost-adreso existas en nia datumbazo, tu balde revecos retpost-mesajo, qua kontenas la instrucioni por konfirmar tua konto. failure: already_authenticated: Tu ya esas enirinta. + closed_registrations: Vua registroprobo esas blokusita pro reteypoliteso. Se vu kredas ke co esas eroro, kontaktez %{email}. inactive: Tua konto ankore ne konfirmesas. invalid: Nejusta %{authentication_keys}. last_attempt: Tu ankore povas probar unfoye ante ke tua konto esos extingita. diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index 5836e4e7768118..8779a68b37d391 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -7,6 +7,7 @@ ja: send_paranoid_instructions: もしあなたのメールアドレスが登録されていれば、まもなくメールアドレスの確認の方法が記載されたメールが送信されます。 failure: already_authenticated: 既にログイン済みです。 + closed_registrations: アカウントの登録はネットワークポリシーによりブロックされました。これが誤りだと思われる場合は %{email} まで連絡してください。 inactive: あなたのアカウントはまだ有効化されていません。 invalid: "%{authentication_keys}かパスワードが誤っています。" last_attempt: あと1回失敗するとアカウントがロックされます。 diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml index 8db3487fb17adf..d6dfe290c0ae3b 100644 --- a/config/locales/devise.pt-PT.yml +++ b/config/locales/devise.pt-PT.yml @@ -29,12 +29,12 @@ pt-PT: title: Verificar o endereço de e-mail email_changed: explanation: 'O e-mail associado à tua conta será alterado para:' - extra: Se não alteraste o seu e-mail, é possível que alguém tenha conseguido aceder à tua conta. Por favor altera a tua palavra-passe imediatamente ou entra em contacto com um administrador do servidor se tiveres ficado sem acesso à tua conta. + extra: Se não alterou o seu e-mail, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entra em contacto com um administrador da instância se tiver ficado sem acesso à sua conta. subject: 'Mastodon: e-mail alterado' title: Novo endereço de e-mail password_change: explanation: A palavra-passe da tua conta foi alterada. - extra: Se não alteraste a tua palavra-passe, é possível que alguém tenha conseguido aceder à tua conta. Por favor altera a tua palavra-passe imediatamente ou entra em contacto com um administrador do servidor se tiveres ficado sem acesso à tua conta. + extra: Se não alterou a sua palavra-passe, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entre em contacto com um administrador da instância se tiver ficado sem acesso à sua conta. subject: 'Mastodon: palavra-passe alterada' title: Palavra-passe alterada reconfirmation_instructions: diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml index fb1cf2a614ba60..786b896402d2ac 100644 --- a/config/locales/doorkeeper.et.yml +++ b/config/locales/doorkeeper.et.yml @@ -83,6 +83,10 @@ et: access_denied: Ressursi omanik või autoriseerimisserver lükkas taotluse tagasi. credential_flow_not_configured: Resource Owner Password Credentials vool ebaõnnestus, kuna Doorkeeper.configure.resource_owner_from_credentials ei ole seadistatud. invalid_client: Kliendi autentimine ebaõnnestus. Põhjus kas tundmatu klient, puudulik autentimine või toetamata autentimismeetod. + invalid_code_challenge_method: + one: "„code_challenge_method“ meetod peab olema selline: %{challenge_methods}." + other: "„code_challenge_method“ meetod peab olema üks neist: %{challenge_methods}." + zero: Kuna sobilikke „code_challenge_method“ meetodi väärtusi ei leidu, siis autentimisserver ei toeta PKCE-d. invalid_grant: Antud autoriseerimisluba on vale, aegunud, tagasi võetud, ei kattu kasutatud ümbersuunamise URLid või oli antud teisele kliendile. invalid_redirect_uri: Antud ümbersuunamise URL ei ole õige. invalid_request: diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml index 7329f613910ddb..f33ac9e0ade889 100644 --- a/config/locales/doorkeeper.fr.yml +++ b/config/locales/doorkeeper.fr.yml @@ -154,19 +154,19 @@ fr: scopes: admin:read: lire toutes les données du serveur admin:read:accounts: lire les informations sensibles de tous les comptes - admin:read:canonical_email_blocks: lire les informations sensibles de tous les bloqueurs de courriels canoniques + admin:read:canonical_email_blocks: lire les informations sensibles de tous les blocages de courriels canoniques admin:read:domain_allows: lire les informations sensibles de tous les domaines autorisés - admin:read:domain_blocks: lire les informations sensibles de tous les bloqueurs de domaines + admin:read:domain_blocks: lire les informations sensibles de tous les blocages de domaines admin:read:email_domain_blocks: lire les informations sensibles de tous les bloqueurs de domaines de courriel - admin:read:ip_blocks: lire les informations sensibles de tous les blocqueurs d'IP + admin:read:ip_blocks: lire les informations sensibles de tous les blocages d'IP admin:read:reports: lire les informations sensibles de tous les signalements et des comptes signalés admin:write: modifier toutes les données sur le serveur admin:write:accounts: effectuer des actions de modération sur les comptes - admin:write:canonical_email_blocks: effectuer des actions de modération sur les bloqueurs de courriels canoniques + admin:write:canonical_email_blocks: effectuer des actions de modération sur les blocages de courriels canoniques admin:write:domain_allows: effectuer des actions de modération sur les autorisations de domaines - admin:write:domain_blocks: effectuer des actions de modération sur des bloqueurs de domaines - admin:write:email_domain_blocks: effectuer des actions de modération sur des bloqueurs de domaines de courriel - admin:write:ip_blocks: effectuer des actions de modération sur des bloqueurs d'IP + admin:write:domain_blocks: effectuer des actions de modération sur des blocages de domaines + admin:write:email_domain_blocks: effectuer des actions de modération sur des blocages de domaines de courriel + admin:write:ip_blocks: effectuer des actions de modération sur des blocages d'IP admin:write:reports: effectuer des actions de modération sur les signalements crypto: utiliser le chiffrement de bout-en-bout follow: modifier les relations du compte diff --git a/config/locales/doorkeeper.gd.yml b/config/locales/doorkeeper.gd.yml index 6487669c283ded..2696672e65ad55 100644 --- a/config/locales/doorkeeper.gd.yml +++ b/config/locales/doorkeeper.gd.yml @@ -83,6 +83,10 @@ 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: + one: Feumaidh an code_challenge_method a bhith ’na %{challenge_methods}. + other: Feumaidh an code_challenge_method a bhith aon de %{challenge_methods}. + zero: Cha chuir frithealaiche an ùghdarrachaidh taic ri PKCE air sgàth ’s nach eil luach code_challenge_method ann ris an gabhar. 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: diff --git a/config/locales/doorkeeper.io.yml b/config/locales/doorkeeper.io.yml index 2f8adf8ce3958f..1eebd1ac1a5852 100644 --- a/config/locales/doorkeeper.io.yml +++ b/config/locales/doorkeeper.io.yml @@ -83,6 +83,10 @@ io: access_denied: Moyenproprietanto o yurizservilo refuzis la demando. credential_flow_not_configured: Moyenproprietantpasvortidentesesofluo faliis pro ke Doorkeeper.configure.resource_owner_from_credentials ne ajustesis. invalid_client: Klientpermiso falias pro nesavita kliento, neinkluzita klientpermiso o nesuportita permismetodo. + invalid_code_challenge_method: + one: La code_challenge_method mustas esar %{challenge_methods}. + other: La code_challenge_method mustas esar un de %{challenge_methods}. + zero: La yurizservilo ne subtenas PKCE pro ke ne havas aceptita valori di code_challenge_method. invalid_grant: Provizita yurizo esis nevalida, expiris, deaprobesis, ne parigas uzita ridirektoligilo dum yurizdemando o facesis a altra kliento. invalid_redirect_uri: La inkluzita ridirektoligilo esas nevalida. invalid_request: diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml index a788b5bf422fdc..08f4112c7e8f62 100644 --- a/config/locales/doorkeeper.ja.yml +++ b/config/locales/doorkeeper.ja.yml @@ -83,6 +83,10 @@ ja: access_denied: リソースの所有者または認証サーバーが要求を拒否しました。 credential_flow_not_configured: リソース所有者のパスワード Doorkeeper.configure.resource_owner_from_credentials が設定されていないためクレデンシャルフローに失敗しました。 invalid_client: 不明なクライアントであるか、クライアント情報が含まれていない、またはサポートされていない認証方法のため、クライアントの認証に失敗しました。 + invalid_code_challenge_method: + one: code_challenge_methodは %{challenge_methods} でなければなりません。 + other: code_challenge_methodは %{challenge_methods} のいずれかでなければなりません。 + zero: 認証サーバーが受け入れる code_challenge_method 値がないため、PKCE をサポートしません。 invalid_grant: 指定された認証許可は無効であるか、期限切れ、取り消されている、リダイレクトURIの不一致、または別のクライアントに発行されています。 invalid_redirect_uri: 無効なリダイレクトURIが含まれています。 invalid_request: diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml index ce5afd55cd320e..f83ad52804a529 100644 --- a/config/locales/doorkeeper.pt-PT.yml +++ b/config/locales/doorkeeper.pt-PT.yml @@ -136,7 +136,7 @@ pt-PT: follow: A seguir, a ocultar e a bloquear follows: Seguidores lists: Listas - media: Anexos multimédia + media: Anexos de media mutes: Ocultados notifications: Notificações profile: O teu perfil Mastodon @@ -194,7 +194,7 @@ pt-PT: write:filters: criar filtros write:follows: seguir pessoas write:lists: criar listas - write:media: enviar ficheiros multimédia + write:media: carregar ficheiros media write:mutes: ocultar pessoas e conversas write:notifications: limpar as tuas notificações write:reports: denunciar outras pessoas diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml index 3098f36e8c2bb5..5f980c85911703 100644 --- a/config/locales/doorkeeper.vi.yml +++ b/config/locales/doorkeeper.vi.yml @@ -71,7 +71,7 @@ vi: confirmations: revoke: Bạn có chắc không? index: - authorized_at: Cho phép vào %{date} + authorized_at: Cho phép %{date} description_html: Đây là những ứng dụng có thể truy cập tài khoản của bạn bằng API. Nếu có ứng dụng bạn không nhận ra ở đây hoặc ứng dụng hoạt động sai, bạn có thể thu hồi quyền truy cập của ứng dụng đó. last_used_at: Dùng lần cuối %{date} never_used: Chưa dùng @@ -136,7 +136,7 @@ vi: follow: Theo dõi, Phớt lờ và Chặn follows: Đang theo dõi lists: Danh sách - media: Tập tin đính kèm + media: Tệp đính kèm mutes: Đã phớt lờ notifications: Thông báo profile: Hồ sơ Mastodon của bạn @@ -194,7 +194,7 @@ vi: write:filters: tạo bộ lọc write:follows: theo dõi ai đó write:lists: tạo danh sách - write:media: tải lên tập tin + write:media: tải lên tệp write:mutes: phớt lờ tài khoản và thảo luận write:notifications: xóa thông báo write:reports: báo cáo diff --git a/config/locales/el.yml b/config/locales/el.yml index de95a5b7258c5d..7ddeb4601ed0fb 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -762,6 +762,7 @@ el: categories: administration: Διαχείριση devops: DevOps + email: Email invites: Προσκλήσεις moderation: Συντονισμός special: Ειδικός @@ -790,6 +791,8 @@ el: manage_blocks_description: Επιτρέπει στους χρήστες να αποκλείουν παρόχους email και διευθύνσεις IP manage_custom_emojis: Διαχείριση Προσαρμοσμένων Emojis manage_custom_emojis_description: Επιτρέπει στους χρήστες να διαχειρίζονται προσαρμοσμένα emojis στον διακομιστή + manage_email_subscriptions: Διαχείριση Συνδρομών Email + manage_email_subscriptions_description: Να επιτρέπεται στους χρήστες να εγγράφονται σε χρήστες με αυτήν την άδεια μέσω ηλεκτρονικού ταχυδρομείου manage_federation: Διαχείριση Ομοσπονδίας manage_federation_description: Επιτρέπει στους χρήστες να αποκλείουν ή να επιτρέπουν τις συναλλαγές με άλλους τομείς και να ελέγχουν την παράδοση manage_invites: Διαχείριση Προσκλήσεων @@ -1174,7 +1177,7 @@ el: webhook: Webhook admin_mailer: auto_close_registrations: - body: Λόγω έλλειψης πρόσφατης δραστηριότητας συντονιστών, οι εγγραφές στο %{instance} έχουν αλλάξει αυτόματα στην απαίτηση χειροκίνητου ελέγχου, για να αποτρέψει το %{instance} από το να χρησιμοποιηθεί ως πλατφόρμα για πιθανούς κακούς παράγοντες. Μπορείς να το αλλάξεις ξανά για να ανοίξετε εγγραφές ανά πάσα στιγμή. + body: Λόγω έλλειψης πρόσφατης δραστηριότητας συντονιστών, οι εγγραφές στο %{instance} έχουν αλλάξει αυτόματα στην απαίτηση χειροκίνητου ελέγχου, για να αποτρέψει το %{instance} από το να χρησιμοποιηθεί ως πλατφόρμα για πιθανούς κακούς παράγοντες. Μπορείς να το αλλάξεις ξανά σε ανοιχτές εγγραφές ανά πάσα στιγμή. subject: Οι εγγραφές για το %{instance} έχουν αλλάξει αυτόματα σε απαίτηση έγκρισης new_appeal: actions: @@ -1215,7 +1218,7 @@ el: created_msg: Δημιουργήθηκε νέο ψευδώνυμο. Τώρα μπορείς να ξεκινήσεις τη μεταφορά από τον παλιό λογαριασμό. deleted_msg: Αφαιρέθηκε το ψευδώνυμο. Η μεταφορά από εκείνον τον λογαριασμό σε αυτόν εδώ δε θα είναι πλέον δυνατή. empty: Δεν έχεις ψευδώνυμα. - hint_html: Αν θέλεις να μετακινηθείς από έναν άλλο λογαριασμό σε αυτόν εδώ, εδώ μπορείς να δημιουργήσεις ένα ψευδώνυμο, πράγμα που απαιτείται πριν προχωρήσεις για να μεταφέρεις τους ακολούθους σου από τον παλιό λογαριασμό σε αυτόν εδώ. Η ενέργεια αυτή είναι ακίνδυνη και αναστρέψιμη.Η μετακόμιση του λογαριασμού ξεκινάει από τον παλιό λογαριασμό. + hint_html: Αν θέλεις να μετακινηθείς από έναν άλλο λογαριασμό σε αυτόν εδώ, εδώ μπορείς να δημιουργήσεις ένα ψευδώνυμο, το οποίο απαιτείται πριν προχωρήσεις για να μεταφέρεις τους ακολούθους σου από τον παλιό λογαριασμό σε αυτόν εδώ. Η ενέργεια αυτή είναι ακίνδυνη και αναστρέψιμη. Η μετακίνηση του λογαριασμού ξεκινάει από τον παλιό λογαριασμό. remove: Αποσύνδεση ψευδώνυμου appearance: advanced_settings: Προχωρημένες ρυθμίσεις @@ -1231,7 +1234,6 @@ el: application_mailer: notification_preferences: Αλλαγή προτιμήσεων email salutation: "%{name}," - settings: 'Αλλαγή προτιμήσεων email: %{link}' unsubscribe: Κατάργηση εγγραφής view: 'Προβολή:' view_profile: Προβολή προφίλ @@ -1261,7 +1263,7 @@ el: welcome_title: Καλώς ήρθες, %{name}! wrong_email_hint: Εάν αυτή η διεύθυνση email δεν είναι σωστή, μπορείς να την αλλάξεις στις ρυθμίσεις λογαριασμού. delete_account: Διαγραφή λογαριασμού - delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς να συνεχίσεις εδώ. Θα σου ζητηθεί επιβεβαίωση. + delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς να προχωρήσεις εδώ. Θα σου ζητηθεί επιβεβαίωση. description: prefix_invited_by_user: Ο/Η @%{name} σε προσκαλεί να γίνεις μέλος αυτού του διακομιστή του Mastodon! prefix_sign_up: Κάνε εγγραφή στο Mastodon σήμερα! @@ -1276,17 +1278,17 @@ el: login: Σύνδεση logout: Αποσύνδεση migrate_account: Μεταφορά σε διαφορετικό λογαριασμό - migrate_account_html: Αν θέλεις να ανακατευθύνεις αυτό τον λογαριασμό σε έναν διαφορετικό, μπορείς να το διαμορφώσεις εδώ. + migrate_account_html: Αν θέλεις να ανακατευθύνεις αυτόν το λογαριασμό σε έναν διαφορετικό, μπορείς να το διαμορφώσεις εδώ. or_log_in_with: Ή συνδέσου με progress: confirm: Επιβεβαίωση email details: Τα στοιχεία σας list: Πρόοδος εγγραφής - review: Η αξιολόγησή μας + review: Ο έλεγχος μας rules: Αποδοχή κανόνων providers: - cas: Υπηρεσία Κεντρικής Πιστοποίησης (CAS) - saml: Πρωτόκολλο SAML + cas: CAS + saml: SAML register: Εγγραφή registration_closed: Το %{instance} δεν δέχεται νέα μέλη resend_confirmation: Επανάληψη αποστολής συνδέσμου επιβεβαίωσης @@ -1295,7 +1297,7 @@ el: accept: Αποδοχή back: Πίσω invited_by: 'Μπορείτε να συμμετάσχεις στο %{domain} χάρη στην πρόσκληση που έλαβες από:' - preamble: Αυτά ορίζονται και επιβάλλονται από τους συντονιστές του%{domain}. + preamble: Αυτά ορίζονται και επιβάλλονται από τους συντονιστές του %{domain}. preamble_invited: Πριν συνεχίσεις, παρακαλώ δώσε προσοχή στους βασικούς κανόνες που έχουν οριστεί από τους συντονιστές του %{domain}. read_more: Διαβάστε περισσότερα title: Ορισμένοι βασικοί κανόνες. @@ -1314,7 +1316,7 @@ el: sign_up: manual_review: Οι εγγραφές στο %{domain} περνούν από χειροκίνητο έλεγχο από τους συντονιστές μας. Για να μας βοηθήσεις να επεξεργαστούμε την εγγραφή σου, γράψε λίγα λόγια για τον εαυτό σου και γιατί θέλεις έναν λογαριασμό στο %{domain}. preamble: Με έναν λογαριασμό σ' αυτόν τον διακομιστή Mastodon, θα μπορείς να ακολουθήσεις οποιοδήποτε άλλο άτομο στο δίκτυο, ανεξάρτητα από το πού φιλοξενείται ο λογαριασμός του. - title: Ας ξεκινήσουμε τις ρυθμίσεις στο %{domain}. + title: Ας σε ετοιμάσουμε στο %{domain}. status: account_status: Κατάσταση λογαριασμού confirming: Αναμονή για ολοκλήρωση επιβεβαίωσης του email. @@ -1325,7 +1327,7 @@ el: view_strikes: Προβολή προηγούμενων ποινών εναντίον του λογαριασμού σας too_fast: Η φόρμα υποβλήθηκε πολύ γρήγορα, προσπαθήστε ξανά. use_security_key: Χρήση κλειδιού ασφαλείας - user_agreement_html: Έχω διαβάσει με τους όρους παροχής υπηρεσιών και την πολιτική απορρήτου + user_agreement_html: Έχω διαβάσει και συμφωνώ με τους όρους παροχής υπηρεσιών και την πολιτική απορρήτου user_privacy_agreement_html: Έχω διαβάσει και συμφωνώ με την πολιτική απορρήτου author_attribution: example_title: Δείγμα κειμένου @@ -1341,9 +1343,9 @@ el: invalid_password: Μη έγκυρο συνθηματικό prompt: Επιβεβαίωση συνθηματικού για συνέχεια color_scheme: - auto: Αυτόματη - dark: Σκοτεινή - light: Φωτεινή + auto: Αυτόματος + dark: Σκοτεινός + light: Φωτεινός contrast: auto: Αυτόματη high: Υψηλή @@ -1370,18 +1372,18 @@ el: x_seconds: "%{count}δ" deletes: challenge_not_passed: Οι πληροφορίες που εισήγαγες δεν ήταν σωστές - confirm_password: Γράψε το τρέχον συνθηματικό σου για να πιστοποιήσεις την ταυτότητά σου + confirm_password: Γράψε το τρέχον συνθηματικό σου για να επαληθεύσεις την ταυτότητά σου confirm_username: Γράψε το όνομα χρήστη σου για επιβεβαίωση proceed: Διαγραφή λογαριασμού success_msg: Ο λογαριασμός σου διαγράφηκε με επιτυχία warning: - before: 'Πριν συνεχίσεις, παρακαλούμε να διαβάσεις τις παρακάτω σημειώσεις προσεκτικά:' + before: 'Πριν συνεχίσεις, παρακαλούμε διάβασε αυτές τις σημειώσεις προσεκτικά:' caches: Περιεχόμενο που έχει αποθηκευτεί προσωρινά σε άλλους διακομιστές ίσως παραμείνει data_removal: Οι αναρτήσεις σου και άλλα δεδομένα θα διαγραφούν οριστικά email_change_html: Μπορείς να αλλάξεις τη διεύθυνση email σου χωρίς να διαγράψεις το λογαριασμό σου - email_contact_html: Αν και πάλι δεν εμφανιστεί, μπορείς να στείλεις email στο %{email} για βοήθεια - email_reconfirmation_html: Αν δεν έχεις λάβει το email επιβεβαίωσης, μπορείς να το ζητήσεις ξανά - irreversible: Δεν θα μπορείς να ανακτήσεις ή ενεργοποιήσεις ξανά το λογαριασμό σου + email_contact_html: Αν και πάλι δεν φτάσει, μπορείς να στείλεις email στο %{email} για βοήθεια + email_reconfirmation_html: Αν δεν λαμβάνεις το email επιβεβαίωσης, μπορείς να το ζητήσεις ξανά + irreversible: Δεν θα μπορείς να επαναφέρεις ή ενεργοποιήσεις ξανά το λογαριασμό σου more_details_html: Για περισσότερες πληροφορίες, δες την πολιτική απορρήτου. username_available: Το όνομα χρήστη σου θα γίνει ξανά διαθέσιμο username_unavailable: Το όνομα χρήστη σου θα παραμείνει μη διαθέσιμο @@ -1416,9 +1418,42 @@ el: your_appeal_pending: Υπέβαλλες έφεση your_appeal_rejected: Η έφεση σου απορρίφθηκε edit_profile: - basic_information: Βασικές πληροφορίες - hint_html: "Προσάρμοσε τί βλέπουν άτομα στο δημόσιο προφίλ σου και δίπλα στις αναρτήσεις σου. Είναι πιο πιθανό άλλα άτομα να σε ακολουθήσουν πίσω και να αλληλεπιδράσουν μαζί σου αν έχεις ολοκληρωμένο προφίλ και εικόνα προφίλ." other: Άλλο + redesign_body: Η επεξεργασία προφίλ μπορεί τώρα να προσεγγιστεί απευθείας από τη σελίδα του προφίλ. + redesign_button: Πηγαίνετε εκεί + redesign_title: Υπάρχει μια νέα εμπειρία επεξεργασίας προφίλ + email_subscription_mailer: + confirmation: + action: Επιβεβαιώστε τη διεύθυνση email + instructions_to_confirm: Επιβεβαιώστε ότι θα θέλατε να λαμβάνετε email από %{name} (@%{acct}) όταν δημοσιεύει νέες αναρτήσεις. + instructions_to_ignore: Αν δεν είστε σίγουροι γιατί λάβατε αυτό το email, μπορείτε να το διαγράψετε. Δεν θα εγγραφείτε αν δεν κάνετε κλικ στον παραπάνω σύνδεσμο. + subject: Επιβεβαιώστε τη διεύθυνση email σας + title: Να λαμβάνετε ενημερώσεις μέσω email από %{name}; + notification: + create_account: Δημιουργήστε έναν λογαριασμό Mastodon + footer: + privacy_html: Τα email στέλνονται από το %{domain}, έναν διακομιστή που βασίζεται στο Mastodon. Για να καταλάβετε πώς ο διακομιστής αυτός επεξεργάζεται τα προσωπικά σας δεδομένα, ανατρέξτε στην Πολιτική Απορρήτου. + reason_for_email_html: Λαμβάνετε αυτό το email επειδή έχετε κάνει εγγραφή για ενημερώσεις από %{name}. Δεν θέλετε να λαμβάνετε τέτοια email; Κατάργηση συνδρομής + interact_with_this_post: + one: Αλληλεπιδράστε με αυτήν την ανάρτηση και ανακαλύψτε περισσότερες σαν αυτήν. + other: Αλληλεπιδράστε με αυτές τις αναρτήσεις και ανακαλύψτε περισσότερες. + subject: + plural: Νέες αναρτήσεις από %{name} + singular: 'Νέα ανάρτηση: "%{excerpt}"' + title: + plural: Νέες αναρτήσεις από %{name} + singular: 'Νέα ανάρτηση: "%{excerpt}"' + email_subscriptions: + active: Ενεργή + confirmations: + show: + changed_your_mind: Αλλάξατε γνώμη; + success_html: Τώρα θα αρχίσετε να λαμβάνετε email όταν ο χρήστης %{name} δημοσιεύει νέες αναρτήσεις. Προσθέστε το %{sender} στις επαφές σας, έτσι ώστε αυτές οι αναρτήσεις να μην καταλήγουν στο φάκελο Ανεπιθύμητα. + title: Έχετε εγγραφεί + unsubscribe: Κατάργηση συνδρομής + inactive: Ανενεργή + status: Κατάσταση + subscribers: Συνδρομητές emoji_styles: auto: Αυτόματο native: Εγγενές @@ -1445,7 +1480,7 @@ el: archive_takeout: date: Ημερομηνία download: Κατέβασε το αρχείο σου - hint_html: Μπορείς να αιτηθείς ένα αρχείο των αναρτήσεων και των ανεβασμένων πολυμέσων σου. Τα δεδομένα θα είναι σε μορφή ActivityPub, προσπελάσιμα από οποιοδήποτε συμβατό πρόγραμμα. Μπορείς να αιτηθείς ένα αρχείο κάθε 7 μέρες. + hint_html: Μπορείς να αιτηθείς ένα αρχείο των αναρτήσεων και ανεβασμένων πολυμέσων σου. Τα δεδομένα θα είναι σε μορφή ActivityPub, προσπελάσιμα από οποιοδήποτε συμβατό πρόγραμμα. Μπορείς να αιτηθείς ένα αρχείο κάθε 7 μέρες. in_progress: Συγκεντρώνουμε το αρχείο σου... request: Αιτήσου το αρχείο σου size: Μέγεθος @@ -1457,10 +1492,8 @@ el: mutes: Έχεις σε σίγαση storage: Χώρος πολυμέσων featured_tags: - add_new: Προσθήκη νέας errors: limit: Έχεις ήδη αναδείξει το μέγιστο αριθμό ετικετών - hint_html: "Ανέδειξε στο προφίλ σου τις πιο σημαντικές ετικέτες σου. Οι αναδεδειγμένες ετικέτες προβάλονται εμφανώς στο προφίλ σου επιτρέποντας γρήγορη πρόσβαση στις αναρτήσεις σου. Είναι ένας ωραίος τρόπος να παρακολουθείς την πορεία των δημιουργικών εργασιών σου ή ενός μακροπρόθεσμου έργου σου." filters: contexts: account: Προφίλ @@ -1631,7 +1664,7 @@ el: table: expires_at: Λήγει uses: Χρήσεις - title: Προσκάλεσε κόσμο + title: Προσκάλεσε άτομα link_preview: author_html: Από %{name} potentially_sensitive_content: @@ -1653,21 +1686,6 @@ el: failed_sign_in_html: Αποτυχημένη προσπάθεια σύνδεσης με %{method} από %{ip} (%{browser}) successful_sign_in_html: Επιτυχής σύνδεση με %{method} από %{ip} (%{browser}) title: Ιστορικό ελέγχου ταυτότητας - mail_subscriptions: - unsubscribe: - action: Ναι, κατάργηση συνδρομής - complete: Η συνδρομή καταργήθηκε - confirmation_html: Σίγουρα θες να καταργήσεις την εγγραφή σου για %{type} για το Mastodon στο %{domain} στο email σου %{email}; Μπορείς πάντα να εγγραφείς ξανά από τις ρυθμίσεις ειδοποιήσεων email. - emails: - notification_emails: - favourite: ειδοποιήσεις email για αγαπημένα - follow: ειδοποιήσεις email για ακολουθήσεις - follow_request: email για αιτήματα ακολούθησης - mention: ειδοποιήσεις email για επισημάνσεις - reblog: ειδοποιήσεις email για ενίσχυση - resubscribe_html: Αν έχεις καταργήσει την εγγραφή σου κατά λάθος, μπορείς να εγγραφείς εκ νέου από τις ρυθμίσεις ειδοποίησης email. - success_html: Δεν θα λαμβάνεις πλέον %{type} για το Mastodon στο %{domain} στο email σου στο %{email}. - title: Κατάργηση συνδρομής media_attachments: validations: images_and_video: Δεν γίνεται να προσθέσεις βίντεο σε ανάρτηση που ήδη περιέχει εικόνες @@ -1684,26 +1702,26 @@ el: missing_also_known_as: δεν είναι ψευδώνυμο αυτού του λογαριασμού move_to_self: δεν μπορεί να είναι ο τρέχων λογαριασμός not_found: δεν βρέθηκε - on_cooldown: Είσαι σε περίοδο ηρεμίας + on_cooldown: Είσαι σε περίοδο αναμονής followers_count: Ακόλουθοι τη στιγμή της μεταφοράς incoming_migrations: Μεταφορά από διαφορετικό λογαριασμό - incoming_migrations_html: Για να μετακομίσεις από έναν άλλο λογαριασμό σε αυτόν εδώ, πρώτα πρέπει να δημιουργήσεις ένα ψευδώνυμο λογαριασμού. - moved_msg: Ο λογαριασμός σου πλέον ανακατευθύνεται στον %{acct} και οι ακόλουθοί σου μεταφέρονται εκεί. + incoming_migrations_html: Για να μεταφερθείς από έναν άλλο λογαριασμό σε αυτόν εδώ, πρώτα πρέπει να δημιουργήσεις ένα ψευδώνυμο λογαριασμού. + moved_msg: Ο λογαριασμός σου τώρα ανακατευθύνεται στο %{acct} και οι ακόλουθοί σου μεταφέρονται εκεί. not_redirecting: Ο λογαριασμός σου δεν ανακατευθύνεται σε κανέναν άλλο προς το παρόν. - on_cooldown: Έχεις μετακομίσει το λογαριασμό σου πρόσφατα. Η δυνατότητα αυτή θα γίνει πάλι διαθέσιμη σε %{count} μέρες. + on_cooldown: Έχεις μετακινήσει τον λογαριασμό σου πρόσφατα. Η δυνατότητα αυτή θα γίνει πάλι διαθέσιμη σε %{count} μέρες. past_migrations: Προηγούμενες μετακινήσεις - proceed_with_move: Μετακίνηση ακολούθων - redirected_msg: Ο λογαριασμός σου ανακατευθύνεται στον %{acct}. - redirecting_to: Ο λογαριασμός σου ανακατευθύνεται στον %{acct}. + proceed_with_move: Μεταφορά ακολούθων + redirected_msg: Ο λογαριασμός σου τώρα ανακατευθύνεται στο %{acct}. + redirecting_to: Ο λογαριασμός σου ανακατευθύνεται στο %{acct}. set_redirect: Όρισε ανακατεύθυνση warning: backreference_required: Θα πρέπει πρώτα να ρυθμιστεί μια παραπομπή από τον νέο λογαριασμό προς αυτόν before: 'Πριν συνεχίσεις, παρακαλούμε διάβασε αυτές τις σημειώσεις προσεκτικά:' cooldown: Μετά τη μετακίνηση υπάρχει μια περίοδος αναμονής κατά τη διάρκεια της οποίας δεν θα είσαι σε θέση να μετακινηθείς ξανά - disabled_account: Ο τρέχων λογαριασμός σου δε θα είναι πλήρως ενεργός μετά. Πάντως θα έχεις πρόσβαση στην εξαγωγή δεδομένων καθώς και στην επανενεργοποίηση. + disabled_account: Ο τρέχων λογαριασμός σου δε θα είναι πλήρως χρησιμοποιήσιμος μετά. Πάντως, θα έχεις πρόσβαση στην εξαγωγή δεδομένων καθώς και στην επανενεργοποίηση. followers: Αυτή η ενέργεια θα μεταφέρει όλους τους ακόλουθούς σου από τον τρέχοντα λογαριασμό στον νέο λογαριασμό only_redirect_html: Εναλλακτικά, μπορείς απλά να προσθέσεις μια ανακατατεύθυνση στο προφίλ σου. - other_data: Δεν θα μετακινηθούν αυτόματα άλλα δεδομένα (συμπεριλαμβανομένου των αναρτήσεων σας και της λίστας των λογαριασμών που ακολουθείτε) + other_data: Δεν θα μετακινηθούν αυτόματα άλλα δεδομένα (συμπεριλαμβανομένου των αναρτήσεων σου και της λίστας των λογαριασμών που ακολουθείς) redirect: Το προφίλ του τρέχοντος λογαριασμού σου θα ενημερωθεί με μια σημείωση ανακατεύθυνσης και θα εξαιρεθεί από τα αποτελέσματα αναζητήσεων moderation: title: Συντονισμός @@ -1713,6 +1731,25 @@ el: copy_account_note_text: 'Ο χρήστης μετακόμισε από τον %{acct}, ορίστε οι προηγούμενες σημειώσεις σου για εκείνον:' navigation: toggle_menu: Εμφάνιση/Απόκρυψη μενού + notification_fallbacks: + added_to_collection: + title_html: "%{name} σας πρόσθεσε σε μια συλλογή" + admin_report: + title_html: Ο/Η %{name} ανέφερε τον/την %{target} + admin_sign_up: + title_and_others_html: + one: Ο/Η %{name} και ένας ακόμα έχουν εγγραφεί + other: Ο/Η %{name} και %{count} ακόμα έχουν εγγραφεί + title_html: Ο/Η %{name} έχει εγγραφεί + collection_update: + title_html: "%{name} ενημέρωσε μια συλλογή στην οποία περιλαμβάνεσαι" + generic: + sign_in: Συνδεθείτε στην εφαρμογή ιστού Mastodon + moderation_warning: + title: Έχετε λάβει μία προειδοποίηση συντονισμού. + severed_relationships: + summary_html: Ένας διαχειριστής από το %{from} έχει αναστείλει το %{target}, το οποίο σημαίνει ότι δεν μπορείς πλέον να λαμβάνεις ενημερώσεις από αυτούς ή να αλληλεπιδράς μαζί τους. %{link} για να λάβετε μια λίστα με τις χαμένες σχέσεις. + title: Χαμένες συνδέσεις με το %{name} notification_mailer: admin: report: @@ -1746,7 +1783,7 @@ el: subject: Ο/Η %{name} έκανε παράθεση της ανάρτησής σου title: Νέα παράθεση quoted_update: - subject: Ο/Η %{name} επεξεργάστηκε μία ανάρτηση που παρέθεσες + subject: "%{name} επεξεργάστηκε μία ανάρτηση που παρέθεσες" reblog: body: 'Η ανάρτησή σου ενισχύθηκε από %{name}:' subject: Ο/Η %{name} ενίσχυσε την ανάρτηση σου @@ -1805,6 +1842,8 @@ el: posting_defaults: Προεπιλογές ανάρτησης public_timelines: Δημόσιες ροές privacy: + email_subscriptions: Αποστολή αναρτήσεων μέσω email + email_subscriptions_hint_html: Προσθέστε μια φόρμα εγγραφής μέσω email στο προφίλ σας που εμφανίζεται για αποσυνδεδεμένους χρήστες. Όταν οι επισκέπτες εισαγάγουν τη διεύθυνση email τους και επιλέξουν εγγραφή, το Mastodon θα στέλνει ενημερώσεις email για τις δημόσιες αναρτήσεις σας. hint_html: "Προσάρμοσε πώς θες το προφίλ και οι αναρτήσεις σου να ανακαλύπτονται.. Μια ποικιλία δυνατοτήτων στο Mastodon μπορούν να σε βοηθήσουν να απευθυνθείς σε μεγαλύτερο κοινό όταν ενεργοποιηθούν. Αφιέρωσε μερικά λεπτά για να εξετάσεις τις ρυθμίσεις και να σιγουρευτείς ότι σου ταιριάζουν." privacy: Απόρρητο privacy_hint_html: "'Έλεγξε πόσο θες να αποκαλύπτεις προς όφελος των άλλων. Οι άνθρωποι ανακαλύπτουν ενδιαφέροντα προφίλ και εφαρμογές με την περιήγηση των ακολούθων άλλων ατόμων και βλέποντας από ποιες εφαρμογές δημοσιεύουν, αλλά μπορεί να προτιμάς να το κρατάς κρυφό." @@ -1920,7 +1959,7 @@ el: featured_tags: Αναδεδειγμένες ετικέτες import: Εισαγωγή import_and_export: Εισαγωγή και εξαγωγή - migrate: Μετακόμιση λογαριασμού + migrate: Μετακίνηση λογαριασμού notifications: Ειδοποιήσεις μέσω email preferences: Προτιμήσεις profile: Προφίλ @@ -1935,10 +1974,10 @@ el: event_type: account_suspension: Αναστολή λογαριασμού (%{target_name}) domain_block: Αναστολή διακομιστή (%{target_name}) - user_domain_block: Απέκλεισες τον χρήστη %{target_name} + user_domain_block: Απέκλεισες το %{target_name} lost_followers: Χαμένοι ακόλουθοι lost_follows: Χαμένες ακολουθήσεις - preamble: Μπορεί να χάσεις ακολουθήσεις και ακόλουθους όταν αποκλείεις έναν τομέα ή όταν οι συντονιστές σου αποφασίζουν να αναστείλουν έναν απομακρυσμένο διακομιστή. Όταν συμβεί αυτό, θα είσαι σε θέση να κατεβάσεις λίστες των αποκομμένων σχέσεων, για να επιθεωρούνται και ενδεχομένως να εισάγονται σε άλλο διακομιστή. + preamble: Μπορεί να χάσεις ακολουθήσεις και ακόλουθους όταν αποκλείεις έναν τομέα ή όταν οι συντονιστές σου αποφασίζουν να αναστείλουν έναν απομακρυσμένο διακομιστή. Όταν συμβεί αυτό, θα είσαι σε θέση να κατεβάσεις λίστες των αποκομμένων σχέσεων, για να επιθεωρηθούν και ενδεχομένως να εισαχθούν σε άλλον διακομιστή. purged: Πληροφορίες σχετικά με αυτόν τον διακομιστή έχουν εκκαθαριστεί από τους διαχειριστές του διακομιστή σου. type: Συμβάν statuses: @@ -2007,10 +2046,10 @@ el: keep_pinned_hint: Δεν διαγράφει καμία από τις καρφιτσωμένες αναρτήσεις σου keep_polls: Διατήρηση δημοσκοπήσεων keep_polls_hint: Δεν διαγράφει καμία από τις δημοσκοπήσεις σου - keep_self_bookmark: Διατήρηση αναρτήσεων που έχετε βάλει σελιδοδείκτη - keep_self_bookmark_hint: Δεν διαγράφει τις αναρτήσεις σου αν τις έχεις προσθέσει στους σελιδοδείκτες - keep_self_fav: Κράτα τις αναρτήσεις που έχεις στα αγαπημένα - keep_self_fav_hint: Δεν διαγράφει τις αναρτήσεις σου αν τις έχεις στα αγαπημένα + keep_self_bookmark: Διατήρηση αναρτήσεων που έχεις βάλει σελιδοδείκτη + keep_self_bookmark_hint: Δεν διαγράφει τις δικές σου αναρτήσεις αν τις έχεις προσθέσει στους σελιδοδείκτες + keep_self_fav: Διατήρηση αναρτήσεων που έχεις αγαπήσει + keep_self_fav_hint: Δεν διαγράφει τις δικές σου αναρτήσεις αν τις έχεις στα αγαπημένα min_age: '1209600': 2 εβδομάδες '15778476': 6 μήνες @@ -2021,10 +2060,10 @@ el: '63113904': 2 χρόνια '7889238': 3 μήνες min_age_label: Όριο ηλικίας - min_favs: Κράτα τις αναρτήσεις που έχουν γίνει αγαπημένες τουλάχιστον - min_favs_hint: Δεν διαγράφει καμία από τις αναρτήσεις σου που έχει λάβει τουλάχιστον αυτόν τον αριθμό αγαπημένων. Άσε κενό για να διαγράψεις αναρτήσεις ανεξάρτητα από τον αριθμό των αγαπημένων + min_favs: Διατήρηση αναρτήσεων που έχουν αγαπηθεί τουλάχιστον + min_favs_hint: Δεν διαγράφει καμία από τις αναρτήσεις σου που έχει λάβει τουλάχιστον αυτόν τον αριθμό αγαπημένων. Άφησε το κενό για να διαγράψει αναρτήσεις ανεξάρτητα από τον αριθμό των αγαπημένων min_reblogs: Διατήρηση αναρτήσεων που έχουν ενισχυθεί τουλάχιστον - min_reblogs_hint: Δεν διαγράφει καμία από τις αναρτήσεις σας που έχει λάβει τουλάχιστον αυτόν τον αριθμό ενισχύσεων. Αφήστε κενό για να διαγράψετε αναρτήσεις ανεξάρτητα από τον αριθμό των ενισχύσεων + min_reblogs_hint: Δεν διαγράφει καμία από τις αναρτήσεις σου που έχει λάβει τουλάχιστον αυτόν τον αριθμό ενισχύσεων. Άφησε το κενό για να διαγράψει αναρτήσεις ανεξάρτητα από τον αριθμό των ενισχύσεων stream_entries: sensitive_content: Ευαίσθητο περιεχόμενο strikes: @@ -2068,6 +2107,28 @@ el: resume_app_authorization: Συνέχιση εξουσιοδότησης εφαρμογής role_requirement: Το %{domain} απαιτεί να ρυθμίσετε τον έλεγχο ταυτότητας δύο παραγόντων πριν χρησιμοποιήσετε το Mastodon. webauthn: Κλειδιά ασφαλείας + unsubscriptions: + create: + action: Μετάβαση στην αρχική σελίδα του διακομιστή + email_subscription: + confirmation_html: Δεν θα λαμβάνετε πλέον email από %{name}. + title: Έχετε καταργήσει τη συνδρομή + user: + confirmation_html: Δεν θα λαμβάνετε πλέον %{type} από το Mastodon στο %{domain}. + notification_emails: + favourite: ειδοποιήσεις email για αγαπημένα + follow: ειδοποιήσεις email για ακολουθήσεις + follow_request: email για αιτήματα ακολούθησης + mention: ειδοποιήσεις email για επισημάνσεις + reblog: ειδοποιήσεις email για ενισχύσεις + show: + action: Κατάργηση συνδρομής + email_subscription: + confirmation_html: Θα σταματήσετε να λαμβάνετε email όταν αυτός ο λογαριασμός δημοσιεύει νέες αναρτήσεις. + title: Κατάργηση συνδρομής από %{name}; + user: + confirmation_html: Θα σταματήσετε να λαμβάνετε %{type} από το Mastodon στο %{domain}. + title: Κατάργηση συνδρομής από %{type}; user_mailer: announcement_published: description: 'Οι διαχειριστές του %{domain} κάνουν μια ανακοίνωση:' @@ -2151,7 +2212,7 @@ el: checklist_title: Λίστα Καλωσορίσματος edit_profile_action: Εξατομίκευση edit_profile_step: Ενίσχυσε τις αλληλεπιδράσεις σου έχοντας ένα ολοκληρωμένο προφίλ. - edit_profile_title: Εξατομίκευση του προφίλ σου + edit_profile_title: Εξατομίκευσε το προφίλ σου explanation: Μερικές συμβουλές για να ξεκινήσεις feature_action: Μάθε περισσότερα feature_audience: Το Mastodon σου παρέχει μια μοναδική δυνατότητα διαχείρισης του κοινού σου χωρίς μεσάζοντες. Το Mastodon όταν αναπτύσσεται στη δική σου υποδομή σου επιτρέπει να ακολουθείς και να ακολουθείσαι από οποιονδήποτε άλλο συνδεδεμένο διακομιστή Mastodon και κανείς δεν τον ελέγχει, εκτός από σένα. @@ -2192,7 +2253,7 @@ el: signed_in_as: 'Έχεις συνδεθεί ως:' verification: extra_instructions_html: Συμβουλή: Ο σύνδεσμος στην ιστοσελίδα σου μπορεί να είναι αόρατος. Το σημαντικό μέρος είναι το rel="me" που αποτρέπει την μίμηση σε ιστοσελίδες με περιεχόμενο παραγόμενο από χρήστες. Μπορείς ακόμα να χρησιμοποιήσεις μια ετικέτα link στην κεφαλίδα της σελίδας αντί για a, αλλά η HTML πρέπει να είναι προσβάσιμη χωρίς την εκτέλεση JavaScript. - here_is_how: Δείτε πώς + here_is_how: Ορίστε πώς hint_html: Η επαλήθευση της ταυτότητας στο Mastodon είναι για όλους. Βασισμένο σε ανοιχτά πρότυπα ιστού, τώρα και για πάντα δωρεάν. Το μόνο που χρειάζεσαι είναι μια προσωπική ιστοσελίδα που ο κόσμος να σε αναγνωρίζει από αυτή. Όταν βάζεις σύνδεσμο προς αυτήν την ιστοσελίδα από το προφίλ σου, θα ελέγξουμε ότι η ιστοσελίδα συνδέει πίσω στο προφίλ σου και θα δείξουμε μια οπτική ένδειξη σε αυτό. instructions_html: Αντέγραψε και επικόλλησε τον παρακάτω κώδικα στην HTML της ιστοσελίδας σου. Στη συνέχεια, πρόσθεσε τη διεύθυνση της ιστοσελίδας σου σε ένα από τα επιπλέον πεδία στο προφίλ σου από την καρτέλα "Επεξεργασία προφίλ" και αποθήκευσε τις αλλαγές. verification: Επαλήθευση diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 815378fbdd6602..f9638d926446d4 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -762,6 +762,7 @@ en-GB: categories: administration: Administration devops: DevOps + email: Email invites: Invites moderation: Moderation special: Special @@ -778,6 +779,8 @@ en-GB: administrator_description: Users with this permission will bypass every permission delete_user_data: Delete User Data delete_user_data_description: Allows users to delete other users' data without delay + invite_bypass_approval: Invite Users without review + invite_bypass_approval_description: Allows people invited to the server by these users to bypass moderation approval invite_users: Invite Users invite_users_description: Allows users to invite new people to the server manage_announcements: Manage Announcements @@ -788,6 +791,8 @@ en-GB: manage_blocks_description: Allows users to block email providers and IP addresses manage_custom_emojis: Manage Custom Emojis manage_custom_emojis_description: Allows users to manage custom emojis on the server + manage_email_subscriptions: Manage Email Subscriptions + manage_email_subscriptions_description: Allow users to subscribe to users with this permission by email manage_federation: Manage Federation manage_federation_description: Allows users to block or allow federation with other domains, and control deliverability manage_invites: Manage Invites @@ -1229,7 +1234,6 @@ en-GB: application_mailer: notification_preferences: Change email preferences salutation: "%{name}," - settings: 'Change email preferences: %{link}' unsubscribe: Unsubscribe view: 'View:' view_profile: View profile @@ -1279,6 +1283,7 @@ en-GB: progress: confirm: Confirm email details: Your details + list: Sign up progress review: Our review rules: Accept rules providers: @@ -1294,6 +1299,7 @@ en-GB: invited_by: 'You can join %{domain} thanks to the invitation you have received from:' preamble: These are set and enforced by the %{domain} moderators. preamble_invited: Before you proceed, please consider the ground rules set by the moderators of %{domain}. + read_more: Read more title: Some ground rules. title_invited: You've been invited. security: Security @@ -1412,9 +1418,42 @@ en-GB: your_appeal_pending: You have submitted an appeal your_appeal_rejected: Your appeal has been rejected edit_profile: - basic_information: Basic information - hint_html: "Customise what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." other: Other + redesign_body: Profile editing can now be accessed directly from the profile page. + redesign_button: Go there + redesign_title: There’s a new profile editing experience + email_subscription_mailer: + confirmation: + action: Confirm email address + instructions_to_confirm: Confirm you'd like to receive emails from %{name} (@%{acct}) when they publish new posts. + instructions_to_ignore: If you're not sure why you received this email, you can delete it. You will not be subscribed if you don't click on the link above. + subject: Confirm your email address + title: Get email updates from %{name}? + notification: + create_account: Create a Mastodon account + footer: + privacy_html: Emails are sent from %{domain}, a server powered by Mastodon. To understand how this server processes your personal data, refer to the Privacy Policy. + reason_for_email_html: You're receiving this email because you opted into email updates from %{name}. Don't want to receive these emails? Unsubscribe + interact_with_this_post: + one: Interact with this post and discover more like it. + other: Interact with these posts and discover more. + subject: + plural: New posts from %{name} + singular: 'New post: "%{excerpt}"' + title: + plural: New posts from %{name} + singular: 'New post: "%{excerpt}"' + email_subscriptions: + active: Active + confirmations: + show: + changed_your_mind: Changed your mind? + success_html: You'll now start receiving emails when %{name} publishes new posts. Add %{sender} to your contacts so these posts don't end up in your Spam folder. + title: You're signed up + unsubscribe: Unsubscribe + inactive: Inactive + status: Status + subscribers: Subscribers emoji_styles: auto: Auto native: Native @@ -1453,10 +1492,8 @@ en-GB: mutes: You mute storage: Media storage featured_tags: - add_new: Add new errors: limit: You have already featured the maximum number of hashtags - hint_html: "Feature your most important hashtags on your profile. A great tool for keeping track of your creative works and long-term projects, featured hashtags are displayed prominently on your profile and allow quick access to your own posts." filters: contexts: account: Profiles @@ -1649,21 +1686,6 @@ en-GB: failed_sign_in_html: Failed login attempt with %{method} from %{ip} (%{browser}) successful_sign_in_html: Successful login with %{method} from %{ip} (%{browser}) title: Authentication history - mail_subscriptions: - unsubscribe: - action: Yes, unsubscribe - complete: Unsubscribed - confirmation_html: Are you sure you want to unsubscribe from receiving %{type} for Mastodon on %{domain} to your email at %{email}? You can always re-subscribe from your email notification settings. - emails: - notification_emails: - favourite: favourite notification emails - follow: follow notification emails - follow_request: follow request emails - mention: mention notification emails - reblog: boost notification emails - resubscribe_html: If you've unsubscribed by mistake, you can re-subscribe from your email notification settings. - success_html: You'll no longer receive %{type} for Mastodon on %{domain} to your email at %{email}. - title: Unsubscribe media_attachments: validations: images_and_video: Cannot attach a video to a post that already contains images @@ -1801,6 +1823,8 @@ en-GB: posting_defaults: Posting defaults public_timelines: Public timelines privacy: + email_subscriptions: Send posts via email + email_subscriptions_hint_html: Add an email sign-up form to your profile that appears for logged-out users. When visitors enter their email address and opt in, Mastodon will send email updates for your public posts. hint_html: "Customise how you want your profile and your posts to be found. A variety of features in Mastodon can help you reach a wider audience when enabled. Take a moment to review these settings to make sure they fit your use case." privacy: Privacy privacy_hint_html: Control how much you want to disclose for the benefit of others. People discover interesting profiles and cool apps by browsing other people's follows and seeing from which apps they post, but you may prefer to keep it hidden. @@ -2064,6 +2088,28 @@ en-GB: resume_app_authorization: Resume application authorisation role_requirement: "%{domain} requires you to set up Two-Factor Authentication before you can use Mastodon." webauthn: Security keys + unsubscriptions: + create: + action: Go to server homepage + email_subscription: + confirmation_html: You'll no longer receive emails from %{name}. + title: You are unsubscribed + user: + confirmation_html: You'll no longer receive %{type} from Mastodon on %{domain}. + notification_emails: + favourite: favourite notification emails + follow: follow notification emails + follow_request: follow request emails + mention: mention notification emails + reblog: boost notification emails + show: + action: Unsubscribe + email_subscription: + confirmation_html: You'll stop receiving emails when this account publishes new posts. + title: Unsubscribe from %{name}? + user: + confirmation_html: You'll stop receiving %{type} from Mastodon on %{domain}. + title: Unsubscribe from %{type}? user_mailer: announcement_published: description: 'The administrators of %{domain} are making an announcement:' diff --git a/config/locales/en.yml b/config/locales/en.yml index 69ca2a9717dd20..f0c5c70087dfeb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -991,6 +991,7 @@ en: categories: administration: Administration devops: DevOps + email: Email invites: Invites moderation: Moderation special: Special @@ -1019,6 +1020,8 @@ en: manage_blocks_description: Allows users to block email providers and IP addresses manage_custom_emojis: Manage Custom Emojis manage_custom_emojis_description: Allows users to manage custom emojis on the server + manage_email_subscriptions: Manage Email Subscriptions + manage_email_subscriptions_description: Allow users to subscribe to users with this permission by email manage_federation: Manage Federation manage_federation_description: Allows users to block or allow federation with other domains, and control deliverability manage_invites: Manage Invites @@ -1177,7 +1180,6 @@ en: statuses: account: Author application: Application - are_you_sure: Are you sure? back_to_account: Back to account page back_to_report: Back to report page batch: @@ -1187,8 +1189,6 @@ en: contents: Contents deleted: Deleted favourites: Favorites - force_cw: Force CW - force_nsfw: Force NSFW history: Version history in_reply_to: Replying to language: Language @@ -1201,9 +1201,6 @@ en: original_status: Original post quotes: Quotes reblogs: Reblogs - remove: Remove - remove_history: Remove edit history - remove_media: Remove medias replied_to_html: Replied to %{acct_link} status_changed: Post changed status_title: Post by @%{name} @@ -1524,7 +1521,6 @@ en: application_mailer: notification_preferences: Change email preferences salutation: "%{name}," - settings: 'Change email preferences: %{link}' unsubscribe: Unsubscribe view: 'View:' view_profile: View profile @@ -1718,9 +1714,42 @@ en: your_appeal_pending: You have submitted an appeal your_appeal_rejected: Your appeal has been rejected edit_profile: - basic_information: Basic information - hint_html: "Customize what people see on your public profile and next to your posts. Other people are more likely to follow you back and interact with you when you have a filled out profile and a profile picture." other: Other + redesign_body: Profile editing can now be accessed directly from the profile page. + redesign_button: Go there + redesign_title: There’s a new profile editing experience + email_subscription_mailer: + confirmation: + action: Confirm email address + instructions_to_confirm: Confirm you'd like to receive emails from %{name} (@%{acct}) when they publish new posts. + instructions_to_ignore: If you're not sure why you received this email, you can delete it. You will not be subscribed if you don't click on the link above. + subject: Confirm your email address + title: Get email updates from %{name}? + notification: + create_account: Create a Mastodon account + footer: + privacy_html: Emails are sent from %{domain}, a server powered by Mastodon. To understand how this server processes your personal data, refer to the Privacy Policy. + reason_for_email_html: You're receiving this email because you opted into email updates from %{name}. Don't want to receive these emails? Unsubscribe + interact_with_this_post: + one: Interact with this post and discover more like it. + other: Interact with these posts and discover more. + subject: + plural: New posts from %{name} + singular: 'New post: "%{excerpt}"' + title: + plural: New posts from %{name} + singular: 'New post: "%{excerpt}"' + email_subscriptions: + active: Active + confirmations: + show: + changed_your_mind: Changed your mind? + success_html: You'll now start receiving emails when %{name} publishes new posts. Add %{sender} to your contacts so these posts don't end up in your Spam folder. + title: You're signed up + unsubscribe: Unsubscribe + inactive: Inactive + status: Status + subscribers: Subscribers emoji_styles: auto: Auto native: Native @@ -1759,10 +1788,8 @@ en: mutes: You mute storage: Media storage featured_tags: - add_new: Add new errors: limit: You have already featured the maximum number of hashtags - hint_html: "Feature your most important hashtags on your profile. A great tool for keeping track of your creative works and long-term projects, featured hashtags are displayed prominently on your profile and allow quick access to your own posts." filters: contexts: account: Profiles @@ -1961,21 +1988,6 @@ en: failed_sign_in_html: Failed sign-in attempt with %{method} from %{ip} (%{browser}) successful_sign_in_html: Successful sign-in with %{method} from %{ip} (%{browser}) title: Authentication history - mail_subscriptions: - unsubscribe: - action: Yes, unsubscribe - complete: Unsubscribed - confirmation_html: Are you sure you want to unsubscribe from receiving %{type} for Mastodon on %{domain} to your email at %{email}? You can always re-subscribe from your email notification settings. - emails: - notification_emails: - favourite: favorite notification emails - follow: follow notification emails - follow_request: follow request emails - mention: mention notification emails - reblog: boost notification emails - resubscribe_html: If you've unsubscribed by mistake, you can re-subscribe from your email notification settings. - success_html: You'll no longer receive %{type} for Mastodon on %{domain} to your email at %{email}. - title: Unsubscribe media_attachments: validations: images_and_video: Cannot attach a video to a post that already contains images @@ -2021,6 +2033,27 @@ en: copy_account_note_text: 'This user moved from %{acct}, here were your previous notes about them:' navigation: toggle_menu: Toggle menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} added you to a collection" + admin_report: + title_html: "%{name} reported %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} and one other signed up" + other: "%{name} and %{count} others signed up" + title_html: "%{name} signed up" + collection_update: + title_html: "%{name} updated a collection you are in" + generic: + sign_in: Sign in to the Mastodon web app + summary_html: You're on an app that does not support the most recent version of Mastodon. %{link} for full functionality. + moderation_warning: + summary_html: You're on an app that does not support the most recent version of Mastodon. %{link}. + title: You have received a moderation warning. + severed_relationships: + summary_html: An admin from %{from} has suspended %{target}, which means you can no longer receive updates from them or interact with them. %{link} to retrieve a list of the lost relationships. + title: Lost connections with %{name} notification_mailer: admin: report: @@ -2127,6 +2160,8 @@ en: searchability: Searchability of your post visibility: Visibility privacy: + email_subscriptions: Send posts via email + email_subscriptions_hint_html: Add an email sign-up form to your profile that appears for logged-out users. When visitors enter their email address and opt in, Mastodon will send email updates for your public posts. hint_html: "Customize how you want your profile and your posts to be found. A variety of features in Mastodon can help you reach a wider audience when enabled. Take a moment to review these settings to make sure they fit your use case." privacy: Privacy privacy_hint_html: Control how much you want to disclose for the benefit of others. People discover interesting profiles and cool apps by browsing other people's follows and seeing which apps they post from, but you may prefer to keep it hidden. @@ -2440,6 +2475,28 @@ en: resume_app_authorization: Resume application authorization role_requirement: "%{domain} requires you to set up Two-Factor Authentication before you can use Mastodon." webauthn: Security keys + unsubscriptions: + create: + action: Go to server homepage + email_subscription: + confirmation_html: You'll no longer receive emails from %{name}. + title: You are unsubscribed + user: + confirmation_html: You'll no longer receive %{type} from Mastodon on %{domain}. + notification_emails: + favourite: favorite notification emails + follow: follow notification emails + follow_request: follow request emails + mention: mention notification emails + reblog: boost notification emails + show: + action: Unsubscribe + email_subscription: + confirmation_html: You'll stop receiving emails when this account publishes new posts. + title: Unsubscribe from %{name}? + user: + confirmation_html: You'll stop receiving %{type} from Mastodon on %{domain}. + title: Unsubscribe from %{type}? user_mailer: announcement_published: description: 'The administrators of %{domain} are making an announcement:' diff --git a/config/locales/eo.yml b/config/locales/eo.yml index de46b0a7be197c..7fb13611d2b501 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1182,7 +1182,6 @@ eo: application_mailer: notification_preferences: Ŝanĝi retpoŝtajn preferojn salutation: "%{name}," - settings: 'Ŝanĝi retpoŝtajn preferojn: %{link}' unsubscribe: Malabonu view: 'Vidi:' view_profile: Vidi profilon @@ -1358,8 +1357,6 @@ eo: your_appeal_pending: Vi sendis apelacion your_appeal_rejected: Via apelacio malakceptitas edit_profile: - basic_information: Baza informo - hint_html: "Personigi, kion homoj vidi en via publika profilo kaj apud viaj afiŝoj. Aliaj homoj estas pli probable resekvi vin kaj interagi kun vi se vi havus finigitan profilon kaj profilan foton." other: Alia emoji_styles: auto: Aŭtomata @@ -1401,10 +1398,8 @@ eo: mutes: Vi silentigas storage: Aŭdovidaĵa konservado featured_tags: - add_new: Aldoni novan errors: limit: Vi jam elstarigis la maksimuman kvanton da kradvortoj - hint_html: "Elstarigu viajn plej gravajn kradvortojn en via profilo. Bona ilo por sekvi viaj kreaĵoj aŭ longdaŭraj projektoj, elstarigitaj kradvortoj bone videblas en via publika profilo kaj ebligas rapidan aliron al viaj propraj afiŝoj." filters: contexts: account: Profiloj @@ -1590,21 +1585,6 @@ eo: failed_sign_in_html: Malsukcese ensalutprovo per %{method} de %{ip} (%{browser}) successful_sign_in_html: Sukcese ensaluto per %{method} de %{ip} (%{browser}) title: Aŭtentiga historio - mail_subscriptions: - unsubscribe: - action: Jes, malabonu - complete: Malabonita - confirmation_html: Ĉu vi certas, ke vi volas malaboni je ricevi %{type} por Mastodon ĉe %{domain} al via retpoŝto ĉe %{email}? Vi ĉiam povas reaboni de viaj retpoŝtaj sciigaj agordoj. - emails: - notification_emails: - favourite: sciigoj retpoŝtaj de ŝatataj - follow: sciigoj retpoŝtaj de sekvoj - follow_request: retpoŝtajn petoj de sekvado - mention: sciigoj retpoŝtaj de mencioj - reblog: sciigoj retpoŝtaj de diskonigoj - resubscribe_html: Se vi malabonis erare, vi povas reaboni de viaj retpoŝtaj sciigaj agordoj. - success_html: Vi ne plu ricevos %{type} por Mastodon ĉe %{domain} al via retpoŝto ĉe %{email}. - title: Malaboni media_attachments: validations: images_and_video: Aldoni videon al mesaĝo, kiu jam havas bildojn ne eblas diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index e4c8e85622c4e0..19b6ffcee4357e 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -762,6 +762,7 @@ es-AR: categories: administration: Administración devops: Operadores de desarrollo + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es-AR: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar emojis personalizados manage_custom_emojis_description: Permite a los usuarios administrar emojis personalizados en el servidor + manage_email_subscriptions: Administrar suscripciones de correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios y controlar las entregas manage_invites: Administrar invitaciones @@ -1231,7 +1234,6 @@ es-AR: application_mailer: notification_preferences: Cambiar configuración de correo electrónico salutation: "%{name}:" - settings: 'Cambiar configuración de correo electrónico: %{link}' unsubscribe: Desuscribirse view: 'Visitá:' view_profile: Ver perfil @@ -1416,9 +1418,42 @@ es-AR: your_appeal_pending: Enviaste una apelación your_appeal_rejected: Se rechazó tu apelación edit_profile: - basic_information: Información básica - hint_html: "Personalizá lo que la gente ve en tu perfil público y junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen con vos cuando tengas un perfil completo y una foto de perfil." other: Otros + redesign_body: Ahora podés acceder a la edición del perfil desde la propia página de perfil. + redesign_button: Ir allí + redesign_title: Hay una nueva experiencia de edición de perfil + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirmá que querés recibir correos electrónicos de %{name} (@%{acct}) cuando publique algo nuevo. + instructions_to_ignore: Si no estás seguro de por qué recibiste este correo electrónico, podés eliminarlo. Si no hacés clic en el enlace de arriba, no te vas a suscribir. + subject: Confirmá tu dirección de correo electrónico + title: "¿Obtener actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos son enviados desde %{domain}, un servidor de Mastodon. Para conocer cómo este servidor procesa tus datos personales, consultá la Política de Privacidad. + reason_for_email_html: Estás recibiendo este correo porque optaste recibir actualizaciones por correo electrónico de %{name}. ¿No querés recibir estos correos? Desuscribite + interact_with_this_post: + one: Interactuá con esta publicación y descubrí otras similares. + other: Interactuá con estas publicaciones y descubrí otras similares. + subject: + plural: Nuevos mensajes de %{name} + singular: 'Nueva publicación: «%{excerpt}»' + title: + plural: Nuevos mensajes de %{name} + singular: 'Nueva publicación: «%{excerpt}»' + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Cambiaste de opinión?" + success_html: Ahora vas a empezar a recibir correos electrónicos cuando %{name} publique algo nuevo. Agregá a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam o correo no deseado. + title: Te suscribiste + unsubscribe: Desuscribirse + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1457,10 +1492,8 @@ es-AR: mutes: Cuentas que silenciaste storage: Almacenamiento de medios featured_tags: - add_new: Agregar nueva errors: limit: Ya estableciste el número máximo de etiquetas - hint_html: "Destacá tus etiquetas más importantes en tu perfil. Una gran herramienta para realizar un seguimiento de tus obras creativas y de tus proyectos a largo plazo. Las etiquetas destacadas se muestran de tal forma en tu perfil y permiten un acceso rápido a tus propios mensajes." filters: contexts: account: Perfiles @@ -1653,21 +1686,6 @@ es-AR: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} desde %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - action: Sí, desuscribir - complete: Desuscripto - confirmation_html: ¿Estás seguro que querés dejar de recibir %{type} de Mastodon en %{domain} a tu correo electrónico %{email}? Siempre podrás volver a suscribirte desde la configuración de notificaciones por correo electrónico.. - emails: - notification_emails: - favourite: notificaciones de favoritos por correo electrónico - follow: notificaciones de seguidores por correo electrónico - follow_request: notificaciones de solicitudes de seguimiento por correo electrónico - mention: notificaciones de menciones por correo electrónico - reblog: notificaciones de adhesiones por correo electrónico - resubscribe_html: Si te desuscribiste por error, podés resuscribirte desde la configuración de notificaciones por correo electrónico. - success_html: Ya no recibirás %{type} de mastodon en %{domain} a tu correo electrónico %{email}. - title: Desuscribirse media_attachments: validations: images_and_video: No se puede adjuntar un video a un mensaje que ya contenga imágenes @@ -1713,6 +1731,27 @@ es-AR: copy_account_note_text: 'Este usuario se mudó desde %{acct}, acá están tus notas previas sobre él/ella:' navigation: toggle_menu: Cambiar menú + notification_fallbacks: + added_to_collection: + title_html: "%{name} te agregó a una colección" + admin_report: + title_html: "%{name} denunció a %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} y alguien más se registraron" + other: "%{name} y otras %{count} cuentas más se registraron" + title_html: Se registró %{name} + collection_update: + title_html: "%{name} editó una colección en la que estás" + generic: + sign_in: Iniciar sesión en la aplicación web de Mastodon + summary_html: Estás en una aplicación que no soporta la versión más reciente de Mastodon. %{link} para una funcionalidad completa. + moderation_warning: + summary_html: Estás en una aplicación que no soporta la versión más reciente de Mastodon. %{link}. + title: Recibiste una advertencia de moderación. + severed_relationships: + summary_html: Un administrador de %{from} suspendió %{target}, lo que significa que ya no podés recibir actualizaciones de ellos o interactuar con ellos. %{link} para recuperar una lista de las relaciones perdidas. + title: Conexiones perdidas con %{name} notification_mailer: admin: report: @@ -1805,6 +1844,8 @@ es-AR: posting_defaults: Configuración predeterminada de mensajes public_timelines: Líneas temporales públicas privacy: + email_subscriptions: Enviar mensajes por correo electrónico + email_subscriptions_hint_html: Agregá un formulario de registro por correo electrónico a tu perfil, que aparece para los usuarios que no iniciaron sesión. Cuando los visitantes ingresen su dirección de correo electrónico y opten por ello, Mastodon enviará actualizaciones por correo electrónico para tus mensajes públicos. hint_html: "Personalizá cómo querés que sean encontrados tu perfil y tus mensajes. Una variedad de funciones en Mastodon pueden ayudarte a alcanzar una mayor audiencia al estar activada. Tomate un momento para revisar esta configuración para asegurarte de que se ajusta a tu caso." privacy: Privacidad privacy_hint_html: Controlá cuánto querés revelar a los demás. La gente descubre perfiles interesantes y aplicaciones copadas explorando los seguimientos de otras personas y viendo qué aplicaciones usan, pero puede que prefieras mantener esto oculto. @@ -2068,6 +2109,28 @@ es-AR: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que configurés la autenticación de dos factores antes de poder usar Mastodon." webauthn: Llaves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Te desuscribiste + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos de notificación de favoritos + follow: correos de notificación de nuevos seguidores + follow_request: correos de notificación de solicitudes de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de adhesiones + show: + action: Desuscribirse + email_subscription: + confirmation_html: Vas a dejar de recibir correos cuando esta cuenta publique algo nuevo. + title: "¿Desuscribirse de %{name}?" + user: + confirmation_html: Vas a dejar de recibir %{type} de Mastodon en %{domain}. + title: "¿Desuscribirse de %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 44677285a7f383..5fe02d34f4745d 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1,8 +1,8 @@ --- es-MX: about: - about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!' - contact_missing: No especificado + about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, con un diseño ético y descentralizada! ¡Sé dueño de tus datos con Mastodon!' + contact_missing: No establecido contact_unavailable: No disponible hosted_on: Mastodon alojado en %{domain} title: Acerca de @@ -16,8 +16,8 @@ es-MX: one: Siguiendo other: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al servidor en sí mismo y no a ningún usuario individual. Se utiliza para propósitos de la federación y no se debe suspender. - last_active: última conexión - link_verified_on: La propiedad de este vínculo fue verificada el %{date} + last_active: última actividad + link_verified_on: Se ha comprobado la propiedad de este enlace el %{date} nothing_here: "¡No hay nada aquí!" pin_errors: following: Debes estar siguiendo a la persona a la que quieres aprobar @@ -762,6 +762,7 @@ es-MX: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es-MX: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar Emojis Personalizados manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor + manage_email_subscriptions: Gestionar suscripciones por correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a otros usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad manage_invites: Administrar Invitaciones @@ -1231,7 +1234,6 @@ es-MX: application_mailer: notification_preferences: Cambiar preferencias de correo electrónico salutation: "%{name}:" - settings: 'Cambiar preferencias de correo: %{link}' unsubscribe: Cancelar suscripción view: 'Vista:' view_profile: Ver perfil @@ -1416,9 +1418,42 @@ es-MX: your_appeal_pending: Has enviado una apelación your_appeal_rejected: Tu apelación ha sido rechazada edit_profile: - basic_information: Información básica - hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completes tu perfil y agregues una foto." other: Otro + redesign_body: Ahora puede acceder a la edición del perfil desde la propia página del perfil. + redesign_button: Llévame allí + redesign_title: Hay una nueva experiencia de edición de perfil + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirma que deseas recibir correos electrónicos de %{name} (@%{acct}) cuando haga una nueva publicación. + instructions_to_ignore: Si no estás seguro de por qué has recibido este correo electrónico, puedes borrarlo. No te suscribirás si no haces clic en el enlace de arriba. + subject: Confirma tu dirección de correo electrónico + title: "¿Deseas recibir actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos se envían desde %{domain} un servidor que utiliza Mastodon. Para saber cómo este servidor procesa tus datos personales, consulta la Política de privacidad. + reason_for_email_html: Recibes este correo electrónico porque te has suscrito a las actualizaciones por correo electrónico de %{name}. ¿No quieres recibir estos correos electrónicos? Cancelar suscripción + interact_with_this_post: + one: Interactúa con esta publicación y descubre otras similares. + other: Interactúa con estas publicaciones y descubre más. + subject: + plural: Nuevas publicaciones de %{name} + singular: 'Nueva publicación: "%{excerpt}"' + title: + plural: Nuevas publicaciones de %{name} + singular: 'Nueva publicación: "%{excerpt}"' + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Has cambiado de opinión?" + success_html: A partir de ahora, recibirás correos electrónicos cada vez que %{name} haga nuevas publicaciones. Añade a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam. + title: Ya estás registrado + unsubscribe: Cancelar suscripción + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1457,10 +1492,8 @@ es-MX: mutes: Tienes en silencio storage: Almacenamiento featured_tags: - add_new: Añadir nueva errors: limit: Ya has alcanzado la cantidad máxima de etiquetas - hint_html: "Destaca tus etiquetas más importantes en tu perfil. Una herramienta fantástica para llevar un registro de tus trabajos creativos y proyectos a largo plazo; las etiquetas destacadas aparecen en un lugar visible de tu perfil y te permiten acceder rápidamente a tus propias publicaciones." filters: contexts: account: Perfiles @@ -1653,21 +1686,6 @@ es-MX: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} de %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - action: Sí, darse de baja - complete: Has cancelado tu suscripción - confirmation_html: ¿Estás seguro de que quieres dejar de recibir %{type} de Mastodon en %{domain} a tu correo %{email}? Siempre podrás volver a suscribirte de nuevo desde los ajustes de notificación por correo. - emails: - notification_emails: - favourite: correos de notificación de favoritos - follow: correos electrónicos de notificación de seguimiento - follow_request: correos electrónicos de solicitud de seguimiento - mention: correos de notificación de menciones - reblog: correos de notificación de impulsos - resubscribe_html: Si te has dado de baja por error, puedes volver a darte de alta desde tus ajustes de notificaciones por correo. - success_html: Ya no recibirás %{type} de Mastodon en %{domain} a tu correo %{email}. - title: Cancelar suscripción media_attachments: validations: images_and_video: No se puede adjuntar un video a una publicación que ya contenga imágenes @@ -1805,6 +1823,8 @@ es-MX: posting_defaults: Configuración por defecto de publicaciones public_timelines: Líneas de tiempo públicas privacy: + email_subscriptions: Enviar publicaciones por correo electrónico + email_subscriptions_hint_html: Añade un formulario de suscripción por correo electrónico a tu perfil que se muestre a los usuarios que no hayan iniciado sesión. Cuando los visitantes introduzcan su dirección de correo electrónico y se suscriban, Mastodon les enviará actualizaciones por correo electrónico de tus publicaciones públicas. hint_html: "Personaliza cómo te gustaría que tu perfil y tus publicaciones sean encontradas. En Mastodon tienes a tu disposición distintas características que pueden ayudarte a llegar a una audiencia más amplia cuando se encuentran activadas. Toma un momento para revisar estos ajustes para asegurarte si cumplen tus necesidades." privacy: Privacidad privacy_hint_html: Controla cuánto quieres compartir para el beneficio de otros. Las personas descubren perfiles interesantes y aplicaciones geniales al navegar por los seguidores de otras personas y viendo desde cuáles aplicaciones publican, pero también puedes preferir mantenerlo oculto. @@ -2068,6 +2088,28 @@ es-MX: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que configures la autenticación de dos pasos antes de poder utilizar Mastodon." webauthn: Claves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Ya no estás suscrito + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos electrónicos de notificación de favoritos + follow: correos electrónicos de notificación de seguimiento + follow_request: correos electrónicos de solicitud de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de impulsos + show: + action: Cancelar suscripción + email_subscription: + confirmation_html: Dejarás de recibir correos electrónicos cuando esta cuenta haga nuevas publicaciones. + title: "¿Deseas cancelar suscripción a %{name}?" + user: + confirmation_html: Dejarás de recibir %{type} de Mastodon en %{domain}. + title: "¿Deseas cancelar suscripción a %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/es.yml b/config/locales/es.yml index c7de4346734838..eef344717232f8 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -762,6 +762,7 @@ es: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Invitaciones moderation: Moderación special: Especial @@ -790,6 +791,8 @@ es: manage_blocks_description: Permite a los usuarios bloquear proveedores de correo electrónico y direcciones IP manage_custom_emojis: Administrar Emojis Personalizados manage_custom_emojis_description: Permite a los usuarios gestionar emojis personalizados en el servidor + manage_email_subscriptions: Administrar suscripciones de correo electrónico + manage_email_subscriptions_description: Permitir a los usuarios suscribirse a usuarios con este permiso por correo electrónico manage_federation: Administrar Federación manage_federation_description: Permite a los usuarios bloquear o permitir la federación con otros dominios, y controlar la entregabilidad manage_invites: Administrar Invitaciones @@ -1231,7 +1234,6 @@ es: application_mailer: notification_preferences: Cambiar preferencias de correo electrónico salutation: "%{name}:" - settings: 'Cambiar preferencias de correo: %{link}' unsubscribe: Cancelar suscripción view: 'Vista:' view_profile: Ver perfil @@ -1416,9 +1418,42 @@ es: your_appeal_pending: Has enviado una apelación your_appeal_rejected: Tu apelación ha sido rechazada edit_profile: - basic_information: Información básica - hint_html: "Personaliza lo que la gente ve en tu perfil público junto a tus publicaciones. Es más probable que otras personas te sigan e interactúen contigo cuando completas tu perfil y foto." other: Otros + redesign_body: Ahora puedes acceder a la edición del perfil desde la propia página de perfil. + redesign_button: Llévame allí + redesign_title: Hay una nueva experiencia de edición de perfil + email_subscription_mailer: + confirmation: + action: Confirmar dirección de correo electrónico + instructions_to_confirm: Confirma que quieres recibir correos electrónicos de %{name} (@%{acct}) cuando publique algo nuevo. + instructions_to_ignore: Si no estás seguro de por qué recibiste este correo electrónico, puedes eliminarlo. No te suscribirás si no haces clic en el enlace de arriba. + subject: Confirma tu dirección de correo electrónico + title: "¿Obtener actualizaciones por correo electrónico de %{name}?" + notification: + create_account: Crear una cuenta de Mastodon + footer: + privacy_html: Los correos electrónicos son enviados desde %{domain}, un servidor de Mastodon. Para conocer cómo este servidor procesa tus datos personales, consulta la Política de Privacidad. + reason_for_email_html: Estás recibiendo este correo porque has optado por recibir actualizaciones por correo electrónico de %{name}. ¿No quieres recibir estos correos? Cancela la suscripción + interact_with_this_post: + one: Interactúa con esta publicación y descubre otras similares. + other: Interactúa con estas publicaciones y descubre otras similares. + subject: + plural: Nuevas publicaciones de %{name} + singular: 'Nueva publicación: "%{excerpt}"' + title: + plural: Nuevas publicaciones de %{name} + singular: 'Nueva publicación: "%{excerpt}"' + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: "¿Cambiaste de opinión?" + success_html: Ahora empezarás a recibir correos electrónicos cuando %{name} publique algo nuevo. Añade %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de Spam. + title: Estás suscrito + unsubscribe: Cancelar suscripición + inactive: Inactiva + status: Estado + subscribers: Suscriptores emoji_styles: auto: Automático native: Nativo @@ -1457,10 +1492,8 @@ es: mutes: Tienes en silencio storage: Almacenamiento featured_tags: - add_new: Añadir nuevo errors: limit: Ya has alcanzado la cantidad máxima de etiquetas - hint_html: "¿Qué son las etiquetas destacadas? Se muestran de forma prominente en tu perfil público y permiten a los usuarios navegar por tus publicaciones públicas específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de trabajos creativos o proyectos a largo plazo." filters: contexts: account: Perfiles @@ -1653,21 +1686,6 @@ es: failed_sign_in_html: Intento de inicio de sesión fallido con %{method} de %{ip} (%{browser}) successful_sign_in_html: Inicio de sesión exitoso con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - action: Sí, cancelar suscripción - complete: Has cancelado tu suscripción - confirmation_html: ¿Estás seguro de que quieres dejar de recibir %{type} de Mastodon en %{domain} a tu correo %{email}? Siempre podrás volver a suscribirte de nuevo desde los ajustes de notificación por correo. - emails: - notification_emails: - favourite: correos de notificación de favoritos - follow: correos de notificación de nuevos seguidores - follow_request: correos de notificación de solicitud de seguidor - mention: correos de notificación de menciones - reblog: correos de notificación de impulsos - resubscribe_html: Si te has dado de baja por error, puedes volver a darte de alta desde tus ajustes de notificaciones por correo. - success_html: Ya no recibirás %{type} de Mastodon en %{domain} a tu correo %{email}. - title: Cancelar suscripición media_attachments: validations: images_and_video: No se puede adjuntar un video a una publicación que ya contenga imágenes @@ -1805,6 +1823,8 @@ es: posting_defaults: Configuración por defecto de publicaciones public_timelines: Líneas de tiempo públicas privacy: + email_subscriptions: Enviar mensajes por correo electrónico + email_subscriptions_hint_html: Añade un formulario de registro por correo electrónico a tu perfil, que aparece para los usuarios que no han iniciado sesión. Cuando los visitantes ingresen su dirección de correo electrónico y opten por ello, Mastodon enviará actualizaciones por correo electrónico para tus publicaciones públicas. hint_html: "Personaliza el descubrimiento de tu perfil y tus publicaciones. En Mastodon tienes distintas características que te ayudarán a alcanzar una mayor audiencia si las activas. Tómate un momento para revisar estas configuraciones y asegurarte de que cumplen tus necesidades." privacy: Privacidad privacy_hint_html: Controla cuánto deseas revelar a los demás. Las personas descubren perfiles y aplicaciones interesantes navegando por los seguidores de otras personas y viendo desde qué aplicaciones publican, pero puede que prefieras mantenerlo oculto. @@ -2068,6 +2088,28 @@ es: resume_app_authorization: Reanudar autorización de aplicación role_requirement: "%{domain} requiere que establezcas la autenticación en dos pasos para poder usar Mastodon." webauthn: Claves de seguridad + unsubscriptions: + create: + action: Ir a la página de inicio del servidor + email_subscription: + confirmation_html: Ya no recibirás correos electrónicos de %{name}. + title: Ya no estás suscrito + user: + confirmation_html: Ya no recibirás %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos de notificación de favoritos + follow: correos de notificación de nuevos seguidores + follow_request: correos de notificación de solicitudes de seguimiento + mention: correos de notificación de menciones + reblog: correos de notificación de impulsos + show: + action: Cancelar suscripción + email_subscription: + confirmation_html: Dejarás de recibir correos cuando esta cuenta publique algo nuevo. + title: "¿Darse de baja de %{name}?" + user: + confirmation_html: Dejarás de recibir %{type} de Mastodon en %{domain}. + title: "¿Darse de baja de %{type}?" user_mailer: announcement_published: description: 'Los administradores de %{domain} están haciendo un anuncio:' diff --git a/config/locales/et.yml b/config/locales/et.yml index ddd0572cfc15e2..45fbe7629d2e49 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -8,7 +8,7 @@ et: title: Veebirakenduse teave accounts: errors: - cannot_be_added_to_collections: Seda kontot ei saa kogusse lisada. + cannot_be_added_to_collections: Seda kontot ei saa kogumikku lisada. followers: one: Jälgija other: Jälgijaid @@ -56,6 +56,7 @@ et: label: Muuda rolli no_role: Roll puudub title: "%{username} rolli muutmine" + collections: Kogumikud confirm: Kinnita confirmed: Kinnitatud confirming: Kinnitamisel @@ -266,6 +267,7 @@ et: demote_user_html: "%{name} alandas kasutajat %{target}" destroy_announcement_html: "%{name} kustutas teadaande %{target}" destroy_canonical_email_block_html: "%{name} eemaldas blokeeringu e-postilt räsiga %{target}" + destroy_collection_html: "%{name} eemaldas kasutaja %{target} kogumiku" destroy_custom_emoji_html: "%{name} kustutas emotikoni %{target}" destroy_domain_allow_html: "%{name} keelas föderatsiooni domeeniga %{target}" destroy_domain_block_html: "%{name} lubas domeeni %{target}" @@ -305,6 +307,7 @@ et: unsilence_account_html: "%{name} eemaldas %{target} konto piirangu" unsuspend_account_html: "%{name} taastas %{target} konto" update_announcement_html: "%{name} uuendas teadaannet %{target}" + update_collection_html: "%{name} uuendas %{target} kogumikku" 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" @@ -340,6 +343,15 @@ et: unpublish: Tühista avaldamine unpublished_msg: Teadaande eemaldamine avalikkusest õnnestus! updated_msg: Teadaande uuendamine õnnestus! + collections: + accounts: Kontod + collection_title: Kasutaja %{name} kogumikud + contents: Sisu + number_of_accounts: + one: 1 konto + other: "%{count} kontot" + open: Ava + view_publicly: Nähtav avalikult critical_update_pending: Kriitiline turvauuendus ootel custom_emojis: assign_category: Määra kategooria @@ -679,6 +691,7 @@ et: cancel: Tühista category: Kategooria category_description_html: Põhjus, miks sellest kontost ja/või sisust teatati, kaasatakse raporteeritud kontoga suhtlemisel + collections: Kogumikud (%{count}) comment: none: Pole comment_description_html: 'Täiendava infona kirjutas %{name}:' @@ -708,11 +721,13 @@ et: report: 'Teavitus #%{id}' reported_account: Teavitatud kontost reported_by: Teavitaja + reported_content: Raporteeritud sisu reported_with_application: Raporteeritud rakendusega resolved: Lahendatud resolved_msg: Teavituse lahendamine õnnestus! skip_to_actions: Otsuste juurde status: Olek + statuses: Postitused (%{count}) statuses_description_html: Sobimatu sisu kaasatakse suhtlusse raporteeritud kontoga summary: action_preambles: @@ -747,6 +762,7 @@ et: categories: administration: Haldamine devops: DevOps + email: E-post invites: Kutsed moderation: Modereerimine special: Eriline @@ -763,6 +779,8 @@ et: administrator_description: Selle loaga kasutajad võivad mööda pääseda kõigist lubadest delete_user_data: Kustuta kasutaja andmed delete_user_data_description: Lubab kasutajatel kustutada teiste kasutajate andmeid viiteta + invite_bypass_approval: Kutsu kasutajaid taotlusi läbi vaatamata + invite_bypass_approval_description: Võimaldab nende kasutajate poolt serverisse kutsutud inimestel moderaatori heakskiidust mööda minna invite_users: Kutsu kasutajaid invite_users_description: Lubab kasutajatel serverisse uusi inimesi kutsuda manage_announcements: Halda teadaandeid @@ -773,6 +791,8 @@ et: manage_blocks_description: Lubab kasutajatel blokeerida e-posti teenusepakkujaid ja IP-aadresse manage_custom_emojis: Halda isetehtud emotikone manage_custom_emojis_description: Lubab kasutajatel hallata serveris isetehtud emotikone + manage_email_subscriptions: Halda e-posti tellimusi + manage_email_subscriptions_description: Luba selle õigusega kasutajatel tellida kasutajaid e-posti teel manage_federation: Halda födereerumist manage_federation_description: Lubab kasutajail keelata või lubada föderatsioone teiste domeenidega ja hallata ühenduvust manage_invites: Halda kutseid @@ -1093,7 +1113,7 @@ et: tag_servers_dimension: Populaarseimad serverid tag_servers_measure: erinevat serverit tag_uses_measure: kasutajaid kokku - description_html: Need teemaviited ilmuvad praegu paljudes postitutes, mida su server näeb. See võib aidata su kasutajatel leida seda millest kõige rohkem parajasti räägitakse. Ühtegi teemaviidet ei näidata enne nende heaks kiitmist avalikult. + description_html: Need teemaviited ilmuvad praegu paljudes postitustes, mida su server näeb. Need võivad aidata su kasutajatel leida seda, millest hetkel kõige rohkem räägitakse. Ühtegi teemaviidet ei näidata enne heaks kiitmist avalikult. listable: Võib olla soovitatud no_tag_selected: Silte ei muudetud, kuna ühtegi polnud valitud not_listable: Ei soovitata @@ -1214,7 +1234,6 @@ et: application_mailer: notification_preferences: Muuda e-posti eelistusi salutation: "%{name}!" - settings: 'Muuda e-posti eelistusi: %{link}' unsubscribe: Loobu tellimisest view: 'Vaade:' view_profile: Vaata profiili @@ -1264,6 +1283,7 @@ et: progress: confirm: E-posti kinnitamine details: Sinu üksikasjad + list: Tellimise edenemine review: Meie ülevaatamine rules: Nõustu reeglitega providers: @@ -1279,6 +1299,7 @@ et: invited_by: 'Saad ühineda paigaga %{domain} tänu saadud kutsele, mille said kohast:' preamble: Neist kinnipidamist jälgivad %{domain} moderaatorid. preamble_invited: Enne jätkamist kaalu põhireegleid, mille on kehtestanud %{domain} moderaatorid. + read_more: Loe lisaks title: Mõned põhireeglid. title_invited: Oled kutsutud. security: Turvalisus @@ -1397,9 +1418,42 @@ et: your_appeal_pending: Vaidlustus on esitatud your_appeal_rejected: Vaidlustus on tagasi lükatud edit_profile: - basic_information: Põhiinfo - hint_html: "Kohanda, mida inimesed näevad su avalikul profiilil ja postituste kõrval. Inimesed alustavad tõenäolisemalt sinu jälgimist ja interakteeruvad sinuga, kui sul on täidetud profiil ja profiilipilt." other: Muu + redesign_body: Profiili muutmisele pääseb nüüd ligi otse profiili lehelt. + redesign_button: Mine sinna + redesign_title: Profiili muutmine on nüüd teistmoodi + email_subscription_mailer: + confirmation: + action: Kinnita e-postiaadress + instructions_to_confirm: Kinnita, et soovid saada %{name} (@%{acct}) e-kirju, kui ta avaldab uusi postitusi. + instructions_to_ignore: Kui sa ei tea, miks sa selle kirja said, võid selle kustutada. Kui sa eespool olevale lingile ei klõpsa, ei telli sa teavitusi. + subject: Kinnita oma e-postiaadress + title: Kas soovid saada %{name} ilt e-kirjaga uuendusi? + notification: + create_account: Loo Mastodoni konto + footer: + privacy_html: E-kirjad saadetakse aadressilt %{domain}, mis on Mastodoni poolt hallatav server. Et saada teada, kuidas see server isikuandmeid töötleb, loe privaatsuspoliitikat. + reason_for_email_html: Saad neid kirju, kuna oled registreerunud %{name} e-kirja teel uuendusi saama. Kas soovid nende kirjade saamise lõpetada? Tühista tellimus + interact_with_this_post: + one: Tegutse selle postitusega ja avasta sarnaseid postitusi. + other: Tegutse selliste postitustega ja avasta sarnaseid postitusi. + subject: + plural: Uus postitus kasutajalt %{name} + singular: 'Uus postitus: "%{excerpt}"' + title: + plural: Uus postitus kasutajalt %{name} + singular: 'Uus postitus: "%{excerpt}"' + email_subscriptions: + active: Aktiivne + confirmations: + show: + changed_your_mind: Kas muutsid meelt? + success_html: Nüüdsest hakkad saama e-kirju, kui %{name} avaldab uusi postitusi. Lisa %{sender} oma kontaktide hulka, et need postitused ei satuks rämpsposti kausta. + title: Oled registreeritud + unsubscribe: Lõpeta tellimus + inactive: Mitteaktiivne + status: Olek + subscribers: Tellijad emoji_styles: auto: Automaatne native: Rakenduseomane @@ -1438,10 +1492,8 @@ et: mutes: Oled summutanud storage: Meedia hoidla featured_tags: - add_new: Lisa uus errors: limit: Oled jõudnud teemaviidete lubatud maksimumarvuni - hint_html: "Mis on esiletõstetud teemaviited? Neid teemaviiteid näidatakse su avalikul profiilil esiletõstetult ning need aitavad teistel leida postitusi, millel on selline teemaviide. See on hea viis, kuidas hoida järge loovtöödel või pikaajalistel projektidel." filters: contexts: account: Profiilid @@ -1634,21 +1686,6 @@ et: failed_sign_in_html: Nurjunud sisenemine meetodiga %{method} aadressilt %{ip} (%{browser}) successful_sign_in_html: Edukas sisenemine meetodiga %{method} aadressilt %{ip} (%{browser}) title: Autentimise ajalugu - mail_subscriptions: - unsubscribe: - action: Jah, lõpeta tellimine - complete: Tellimine lõpetatud - confirmation_html: Kas oled kindel, et soovid loobuda %{type} tellimisest oma e-postiaadressile %{email} Mastodonist kohas %{domain}? Saad alati uuesti tellida oma e-posti teavituste seadetest. - emails: - notification_emails: - favourite: lemmikuks märkimise teavituskirjade - follow: jälgimiste teavituskirjade - follow_request: jälgimistaotluste teavituskirjade - mention: mainimiste teavituskirjade - reblog: jagamiste teavituskirjade - resubscribe_html: Kui loobusid tellimisest ekslikult, saad uuesti tellida oma e-posti teavituste seadetest. - success_html: Sa ei saa enam %{type} teateid oma e-postile %{email} Mastodonist kohas %{domain}. - title: Loobu tellimisest media_attachments: validations: images_and_video: Ei saa lisada video postitusele, milles on juba pildid @@ -1694,6 +1731,18 @@ et: copy_account_note_text: 'Kasutaja kolis kontolt %{acct}, kus olid eelnevad märkmed tema kohta:' navigation: toggle_menu: Menüü lülimine + notification_fallbacks: + added_to_collection: + title_html: "%{name} lisas sind kogumikku" + admin_report: + title_html: "%{name} rapor %{target} kohta" + admin_sign_up: + title_and_others_html: + one: "%{name} ja veel üks registreerus" + other: "%{name} ja veel %{count} registreerus" + title_html: "%{name} registreerus" + collection_update: + title_html: "%{name} uuendas kogumikku, kuhu kuulud" notification_mailer: admin: report: @@ -1786,6 +1835,8 @@ et: posting_defaults: Postitamise vaikesätted public_timelines: Avalikud ajajooned privacy: + email_subscriptions: Saada postitused e-postiga + email_subscriptions_hint_html: Lisa oma profiili e-posti registreerimisvorm, mida kuvatakse sisselogimata kasutajatele. Kui külastajad sisestavad oma e-posti aadressi ja annavad nõusoleku, saadab Mastodon neile sinu avalike postitustega e-kirju. hint_html: "Kohanda, kuidas peaks su postitused ja profiil leitav olema. Mastodonis olevad paljud oskused võimaldavad jõuda sul rohkemate inimesteni, kui need lubada. Võta üks hetk, et vaadata need üle, et veenduda, kas sinu puhul need sobivad." privacy: Privaatsus privacy_hint_html: Määra, kui palju soovid teiste heaks infot avaldada. Inimesed leiavad huvitavaid profiile ning lahedaid äppe sirvides teiste inimeste jälgimisi ja vaadates, milliste äppidega nad postitavad, kuid sa võid soovida hoida seda varjatuna. @@ -2051,6 +2102,28 @@ et: resume_app_authorization: Jätka rakenduse autentimist role_requirement: "%{domain} teenus eeldab, et Mastodoni kasutamiseks lülitad sisse kaheastmelise autentimise." webauthn: Turvavõtmed + unsubscriptions: + create: + action: Mine serveri kodulehele + email_subscription: + confirmation_html: Sa ei saa enam kasutajalt %{name} e-kirju. + title: Su tellimus on lõpetatud + user: + confirmation_html: 'Sa ei saa enam %{type}-teateid Mastodonilt aadress: %{domain}.' + notification_emails: + favourite: lemmikuks märkimise teavituse e-kirja + follow: jälgimise teavituse e-kirja + follow_request: jälgimise taotluse e-kirja + mention: mainimisest teavituse e-kirja + reblog: jagamiste teavituskirja + show: + action: Lõpeta tellimus + email_subscription: + confirmation_html: Sa ei saa enam e-kirju, kui sellelt kontolt avaldatakse uusi postitusi. + title: Kas lõpetada %{name} tellimine? + user: + confirmation_html: Sa ei saa enam %{type} laadi teateid Mastodonilt aadressil %{domain}. + title: Kas lõpetada %{type} tellimine? user_mailer: announcement_published: description: "%{domain} saidi peakasutajate teadaanne:" @@ -2177,7 +2250,7 @@ et: extra_instructions_html: Soovitus: Sinu kodulehel olev link võib olla nähtamatu. Oluline osa on rel="me", mis väldib kasutaja loodud sisuga lehtedel libaisikustamist. Sa saad isegi kasutada lehe HEADER osas silti link sildi a asemel, kuid HTML peab olema kättesaadav ilma JavaScripti käivitamata. here_is_how: Siin on, kuidas hint_html: "Oma isiku tuvastamine on Mastodonis kõigi jaoks. Toetub avatud veebistandarditele, nüüd ja igavesti tasuta. Kõik, mida vajad, on isiklik veebileht, mille järgi inimesed sind tunnevad. Kui lingid oma profiililt sellele veebilehele, kontrollime me, et see veebileht lingib tagasi sinu profiilile ning näitame profiilil visuaalset tähist." - instructions_html: Kopeeri ja kleebi allpool olev kood oma lehe HTML lähtekoodi. Seejärel lisa oma kodulehe aadress profiili "Muuda profiili" vahekaardi ühte lisavälja ning salvesta muudatused. + instructions_html: Kopeeri ja aseta allpool olev kood oma lehe HTML lähtekoodi. Seejärel lisa oma kodulehe aadress profiili „Muuda profiili“ vahekaardi ühte lisavälja ning salvesta muudatused. verification: Kinnitamine verified_links: Sinu kontrollitud lingid website_verification: Veebilehe kontrollimine diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 0102508797ac6e..4d8398b08ab5a6 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1171,7 +1171,6 @@ eu: application_mailer: notification_preferences: Posta elektronikoaren lehentasunak aldatu salutation: "%{name}," - settings: 'Posta elektronikoaren lehentasunak aldatu: %{link}' unsubscribe: Kendu harpidetza view: 'Ikusi:' view_profile: Ikusi profila @@ -1337,8 +1336,6 @@ eu: your_appeal_pending: Apelazio bat bidali duzu your_appeal_rejected: Zure apelazioa baztertu da edit_profile: - basic_information: Oinarrizko informazioa - hint_html: "Pertsonalizatu jendeak zer ikusi dezakeen zure profil publikoan eta zure bidalketen baitan. Segur aski, jende gehiagok jarraituko dizu eta interakzio gehiago izango dituzu profila osatuta baduzu, profil irudia eta guzti." other: Bestelakoak emoji_styles: auto: Automatikoa @@ -1378,10 +1375,8 @@ eu: mutes: Zuk mututukoak storage: Multimedia biltegiratzea featured_tags: - add_new: Gehitu berria errors: limit: Gehienezko traola kopurua erakutsi duzu jada - hint_html: "Zer dira nabarmendutako traolak? Zure profileko toki nabarmendu batean agertzen dira eta jendeari traola haue dituzten bidalketa publikoak arakatzea ahalbidetzen diote. Sormen-lanak edo epe luzerako proiektuak jarraitzeko primerakoak dira." filters: contexts: account: Profilak @@ -1536,23 +1531,6 @@ eu: failed_sign_in_html: Huts egindako saioa hasteko saiakera %{method} erabiliz %{ip} IPtik (%{browser}) successful_sign_in_html: Saioa hasiera arrakastatsua %{method} erabiliz %{ip} IPtik (%{browser}) title: Autentifikazioen historia - mail_subscriptions: - unsubscribe: - action: Bai, kendu harpidetza - complete: Harpidetza kenduta - confirmation_html: |- - Ziur Mastodonen %{domain} zerbitzariko %{type} %{email} helbide elektronikoan jasotzeari utzi nahi diozula? - Beti harpidetu zaitezke berriro eposta jakinarazpenen hobespenetan. - emails: - notification_emails: - favourite: zure argitalpena gogoko egin dutenaren jakinarazpen e-mailak - follow: jarraitu jakinarazpen-mezu elektronikoak - follow_request: jarraipen-eskaeren jakinarazpen e-mailak - mention: aipamenen jakinarazpen e-mailak - reblog: bultzaden jakinarazpen e-mailak - resubscribe_html: Nahi gabe utzi badiozu jakinarazpenak jasotzeari, berriro harpidetu zaitezke e-mail jakinarazpenen hobespenetan. - success_html: Ez duzu Mastodonen %{domain} zerbitzariko %{type} jasoko %{email} helbide elektronikoan. - title: Kendu harpidetza media_attachments: validations: images_and_video: Ezin da irudiak dituen bidalketa batean bideo bat erantsi diff --git a/config/locales/fa.yml b/config/locales/fa.yml index b166d1f3049a2e..f68e549ea8aa98 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1210,7 +1210,6 @@ fa: application_mailer: notification_preferences: تغییر ترجیحات رایانامه salutation: "%{name}،" - settings: 'تغییر ترجیحات رایانامه: %{link}' unsubscribe: لغو اشتراک view: 'نمایش:' view_profile: دیدن نمایه @@ -1393,8 +1392,6 @@ fa: your_appeal_pending: شما یک درخواست تجدیدنظر فرستادید your_appeal_rejected: درخواست تجدیدنظرتان رد شد edit_profile: - basic_information: اطلاعات پایه - hint_html: "شخصی‌سازی آن چه مردم روی نمایهٔ عمومیتان و کنار فرسته‌هایتان می‌بینند. هنگامی که نمایه‌ای کامل و یک تصویر نمایه داشته باشید،‌ احتمال پی‌گیری متقابل و تعامل با شما بیش‌تر است." other: سایر emoji_styles: auto: خودکار @@ -1434,10 +1431,8 @@ fa: mutes: حساب‌های بی‌صداشده storage: تصویرهای ذخیره‌شده featured_tags: - add_new: افزودن تازه errors: limit: شما بیشترین تعداد مجاز برچسب‌ها را دارید - hint_html: "برچسب‌های برگزیده چیستند؟ این برچسب‌ها به طور واضحی روی نمایهٔ عمومیتان نمایش یافته می‌گذارد افراد فرسته‌های عمومیتان زیرشان را مرور کنند. ابزاری عالی برای دنبال کردن آثار خلاقانه یا پروژه‌های بلندمدت است." filters: contexts: account: نمایه‌ها @@ -1630,21 +1625,6 @@ fa: failed_sign_in_html: تلاش‌های شکست‌خوردهٔ ورود با %{method} از %{ip} (%{browser}) successful_sign_in_html: ورودهای موفق با %{method} از %{ip} (%{browser}) title: تاریخچهٔ تأیید هویت - mail_subscriptions: - unsubscribe: - action: بله. لغو اشتراک - complete: لغو اشتراک شد - confirmation_html: مطمئنید که می‌خواهید اشتراک %{type} را از ماستودون روی %{domain} برای رایانامهٔ %{email} لغو کنید؟ همواره می‌توانید از تنظیمات آگاهی رایانامه‌ای دوباره مشترک شوید. - emails: - notification_emails: - favourite: رایانامه‌های آگاهی برگزیدن - follow: رایانامه‌های آگاهی پی‌گیری - follow_request: رایانامه‌های درخواست پی‌گیری - mention: رایانامه‌های آگاهی اشاره - reblog: رایانامه‌های آگاهی تقویت - resubscribe_html: اگر اشتراک را اشتباهی لغو کردید می‌توانید از تنظیمات آگاهی رایانامه‌ای دوباره مشترک شوید. - success_html: دیگر %{type} را از ماستودون روی %{domain} برای رایانامهٔ %{email} نخواهید گرفت. - title: لغو اشتراک media_attachments: validations: images_and_video: نمی‌توان برای نوشته‌ای که تصویر دارد ویدیو بارگذاری کرد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 850e68c2181fb3..50e65f71d2129c 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -16,7 +16,7 @@ fi: one: seurattava other: seurattavaa 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 + last_active: viimeksi aktiivisena link_verified_on: Tämän linkin omistus on tarkastettu %{date} nothing_here: Täällä ei ole mitään! pin_errors: @@ -169,7 +169,7 @@ fi: undo_silenced: Kumoa rajoitus undo_suspension: Kumoa jäädytys unsilenced_msg: Tilin %{username} rajoitus kumottiin onnistuneesti - unsubscribe: Lopeta tilaus + unsubscribe: Peruuta tilaus unsuspended_msg: Tilin %{username} jäädytys kumottiin onnistuneesti username: Käyttäjänimi view_domain: Näytä verkkotunnuksen yhteenveto @@ -762,6 +762,7 @@ fi: categories: administration: Ylläpito devops: DevOps + email: Sähköposti invites: Kutsut moderation: Moderointi special: Erityistä @@ -778,7 +779,8 @@ fi: 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: Sallii käyttäjien poistaa muiden käyttäjien tiedot viipymättä - invite_bypass_approval: Kutsu käyttäjiä arvioimatta + invite_bypass_approval: Kutsua käyttäjiä arvioimatta + invite_bypass_approval_description: Sallii näiden käyttäjien tälle palvelimelle kutsumien henkilöiden ohittaa moderoinnin hyväksyntä invite_users: Kutsua käyttäjiä invite_users_description: Sallii käyttäjien kutsua uusia käyttäjiä palvelimelle manage_announcements: Hallita tiedotteita @@ -789,6 +791,8 @@ fi: 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 palvelimen mukautettuja emojeita + manage_email_subscriptions: Hallita sähköpostitilauksia + manage_email_subscriptions_description: Sallii käyttäjien tilata sähköpostitse käyttäjiä, joilla on tämä käyttöoikeus 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 @@ -1230,8 +1234,7 @@ fi: application_mailer: notification_preferences: Muuta sähköpostiasetuksia salutation: "%{name}" - settings: 'Muuta sähköpostiasetuksia: %{link}' - unsubscribe: Lopeta tilaus + unsubscribe: Peruuta tilaus view: 'Näytä:' view_profile: Näytä profiili view_status: Näytä julkaisu @@ -1415,9 +1418,42 @@ fi: your_appeal_pending: Olet lähettänyt valituksen your_appeal_rejected: Valituksesi on hylätty edit_profile: - basic_information: Perustiedot - 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 + redesign_body: Profiilia pääsee muokkaamaan nyt suoraan profiilisivulta. + redesign_button: Siirry sinne + redesign_title: Profiilin muokkauskokemus on uudistunut + email_subscription_mailer: + confirmation: + action: Vahvista sähköpostiosoite + instructions_to_confirm: Vahvista, että haluat saada sähköpostia käyttäjältä %{name} (@%{acct}), kun hän julkaisee uutta. + instructions_to_ignore: Jos et ole varma, miksi sait tämän sähköpostiviestin, voit poistaa sen. Tilaus ei ala, ellet avaa edellä olevaa linkkiä. + subject: Vahvista sähköpostiosoitteesi + title: Otetaanko vastaan sähköpostipäivityksiä käyttäjältä %{name}? + notification: + create_account: Luo Mastodon-tili + footer: + privacy_html: Sähköposti lähetetään verkkotunnuksesta %{domain}, Mastodonin tarjoamalta palvelimelta. Jos haluat ymmärtää, miten tämä palvelin käsittelee henkilötietojasi, katso tietosuojakäytäntö. + reason_for_email_html: Saat tämän sähköpostiviestin, koska olet tilannut sähköpostipäivitykset käyttäjältä %{name}. Etkö halua näitä sähköpostiviestejä? Peruuta tilaus + interact_with_this_post: + one: Ole vuorovaikutuksessa tämän julkaisun kanssa ja löydä lisää sen kaltaista. + other: Olet vuorovaikutuksessa näiden julkaisujen kanssa ja löydä lisää. + subject: + plural: Uusia julkaisuja käyttäjältä %{name} + singular: 'Uusi julkaisu: ”%{excerpt}”' + title: + plural: Uusia julkaisuja käyttäjältä %{name} + singular: 'Uusi julkaisu: ”%{excerpt}”' + email_subscriptions: + active: Ota käyttöön + confirmations: + show: + changed_your_mind: Muutitko mieltäsi? + success_html: Alat nyt saada sähköpostia, kun %{name} julkaisee uutta. Lisää %{sender} yhteystietoihisi, jotta nämä julkaisut eivät joudu roskapostikansioon. + title: Olet aloittanut tilauksen + unsubscribe: Peruuta tilaus + inactive: Poissa käytöstä + status: Tila + subscribers: Tilaajia emoji_styles: auto: Automaattinen native: Natiivi @@ -1456,10 +1492,8 @@ fi: mutes: Mykistykset storage: Mediatiedostot featured_tags: - add_new: Lisää uusi errors: limit: Esittelet jo aihetunnisteiden enimmäismäärää - hint_html: "Esittele tärkeimpiä aihetunnisteitasi profiilissasi. Erinomainen työkalu, jolla pidät kirjaa luovista teoksistasi ja pitkäaikaisista projekteistasi. Esittelemäsi aihetunnisteet ovat näyttävällä paikalla profiilissasi ja mahdollistavat nopean pääsyn julkaisuihisi." filters: contexts: account: Profiilit @@ -1652,21 +1686,6 @@ fi: 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: - action: Kyllä, peru tilaus - complete: Tilaus lopetettiin - confirmation_html: Haluatko varmasti lopettaa Mastodonin sähköposti-ilmoitusten vastaanottamisen aiheesta %{type} palvelimelta %{domain} osoitteeseesi %{email}? Voit tilata ilmoitusviestejä milloin tahansa uudelleen sähköposti-ilmoitusten asetuksista. - emails: - notification_emails: - favourite: sähköposti-ilmoituksia suosikkeihin lisäämisistä - follow: sähköposti-ilmoituksia seuraamisista - 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. - success_html: Sinulle ei enää lähetetä Mastodonin %{type} palvelimelta %{domain} osoitteeseen %{email}. - title: Lopeta tilaus media_attachments: validations: images_and_video: Videota ei voi liittää tilapäivitykseen, jossa on jo kuvia @@ -1712,6 +1731,24 @@ fi: 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_fallbacks: + added_to_collection: + title_html: "%{name} lisäsi sinut kokoelmaan" + admin_report: + title_html: "%{name} raportoi käyttäjän %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} ja 1 muu rekisteröityivät" + other: "%{name} ja %{count} muuta rekisteröityivät" + title_html: "%{name} rekisteröityi" + collection_update: + title_html: "%{name} päivitti kokoelman, jossa olet" + generic: + sign_in: Rekisteröidy Mastodonin selainsovelluksessa + summary_html: Olet sovelluksessa, joka ei tue uusinta Mastodonin versiota. %{link} täyden toiminnallisuuden mahdollistamiseksi. + moderation_warning: + summary_html: Olet sovelluksessa, joka ei tue uusinta Mastodonin versiota. %{link}. + title: Olet saanut moderointivaroituksen. notification_mailer: admin: report: @@ -1804,6 +1841,8 @@ fi: posting_defaults: Julkaisun oletukset public_timelines: Julkiset aikajanat privacy: + email_subscriptions: Lähetä julkaisut sähköpostitse + email_subscriptions_hint_html: Lisää profiiliisi sähköpostintilauslomake, joka näkyy kirjautumattomille käyttäjille. Kun vierailijat syöttävät sähköpostiosoitteensa ja hyväksyvät tilauksen, Mastodon lähettää sähköpostipäivityksiä julkisista julkaisuistasi. hint_html: "Määritä, kuinka haluat profiilisi ja julkaisujesi löytyvän. Mastodonissa on monia ominaisuuksia, joiden käyttöönotto voi auttaa sinua tavoittamaan laajemman yleisön. Käytä hetki tarkistaaksesi, sopivatko nämä asetukset käyttöösi." 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. @@ -1832,7 +1871,7 @@ fi: followers: Seuraajat following: Seurattavat invited: Kutsutut - last_active: Viimeksi aktiivinen + last_active: Viimeksi aktiivisena most_recent: Tuorein moved: Muuttaneet mutual: Seuraatte toisianne @@ -2067,6 +2106,28 @@ fi: resume_app_authorization: Jatka sovelluksen valtuutusta role_requirement: "%{domain} vaatii ottamaan kaksivaiheisen todennuksen käyttöön ennen kuin voit käyttää Mastodonia." webauthn: Suojausavaimet + unsubscriptions: + create: + action: Siirry palvelimen etusivulle + email_subscription: + confirmation_html: Et saa enää sähköpostia käyttäjältä %{name}. + title: Olet peruuttanut tilauksen + user: + confirmation_html: Et saa enää %{type} Mastodon-palvelimelta %{domain}. + notification_emails: + favourite: sähköposti-ilmoituksia suosikkeihin lisäämisistä + follow: sähköposti-ilmoituksia seuraamisista + follow_request: sähköpostia seurantapyynnöistä + mention: sähköposti-ilmoituksia maininnoista + reblog: sähköposti-ilmoituksia tehostuksista + show: + action: Peruuta tilaus + email_subscription: + confirmation_html: Lakkaat saamasta sähköpostia, kun tämä tili julkaisee uutta. + title: Peruutetaanko käyttäjän %{name} tilaus? + user: + confirmation_html: Lakkaat saamasta %{type} Mastodon-palvelimelta %{domain}. + title: Peruutetaanko tilaus aiheesta %{type}? user_mailer: announcement_published: description: 'Palvelimen %{domain} ylläpito tiedottaa:' @@ -2157,7 +2218,7 @@ fi: 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 - feature_creativity: Mastodon tukee ääni-, video- ja kuvajulkaisuja, saavutettavuuskuvauksia, äänestyksiä, sisältövaroituksia, animoituja avattaria, mukautettuja emojeita, pienoiskuvien rajauksen hallintaa ja paljon muuta, mikä auttaa ilmaisemaan itseäsi verkossa. Julkaisetpa sitten taidetta, musiikkia tai podcastia, Mastodon on sinua varten. + feature_creativity: Mastodon tukee ääni-, video- ja kuvajulkaisuja, saavutettavuuskuvauksia, äänestyksiä, sisältövaroituksia, animoituja avattaria, mukautettuja emojeita, pikkukuvien rajauksen hallintaa ja paljon muuta, mikä auttaa ilmaisemaan itseäsi verkossa. Julkaisetpa sitten taidetta, musiikkia tai podcastia, Mastodon on sinua varten. feature_creativity_title: Luovuutta vertaansa vailla 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 diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 36b2dc5c684334..9493ffbc070f85 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1229,7 +1229,6 @@ fo: application_mailer: notification_preferences: Broyt teldupostastillingar salutation: "%{name}" - settings: 'Broyt teldupostastillingar: %{link}' unsubscribe: Strika hald view: 'Vís:' view_profile: Vís vanga @@ -1412,8 +1411,6 @@ fo: your_appeal_pending: Tú hevur kært your_appeal_rejected: Kæra tín er vrakað edit_profile: - basic_information: Grundleggjandi upplýsingar - hint_html: "Tillaga tað, sum fólk síggja á tínum almenna vanga og við síðna av tínum postum. Sannlíkindini fyri, at onnur fylgja tær og virka saman við tær eru størri, tá tú hevur fylt út vangan og eina vangamynd." other: Onnur emoji_styles: auto: Sjálvvirkandi @@ -1453,10 +1450,8 @@ fo: mutes: Tú doyvir storage: Miðlagoymsla featured_tags: - add_new: Legg afturat errors: limit: Tú hevur longu varpað loyvda talið av frámerkjum - hint_html: "Hvat eru varpaði frámerki? Tey verða víst sjónliga á almenna vanga tínum og loyva fólki at kaga gjøgnum tínar almennu postar, sum hava tey frámerkini. Tey eru serliga vælegnaði at fylgja við skapandi arbeiði ella langtíðarverkætlanum." filters: contexts: account: Vangar @@ -1649,21 +1644,6 @@ fo: failed_sign_in_html: Miseydnað innritanarroynd við %{method} frá %{ip} (%{browser}) successful_sign_in_html: Eydnað innritan við %{method} frá %{ip} (%{browser}) title: Samgildissøga - mail_subscriptions: - unsubscribe: - action: Ja, strika hald - complete: Hald strikað - confirmation_html: Ert tú vís/ur í, at tú vil gevast at móttaka %{type} fyri Mastodon á %{domain} til tína teldupostadressu á %{email}? Tú kanst altíð gera haldið virkið aftur frá tínum teldupostfráboðanarstillingum. - emails: - notification_emails: - favourite: yndisfráboðanarteldupostar - follow: fylg fráboðanarteldupostar - follow_request: fylg umbønir um teldupost - mention: nevn fráboðanarteldupostar - reblog: framhevja fráboðanarpostar - resubscribe_html: Um tú hevur strikað haldið av misgávum, so kanst tú tekna haldið av nýggjum í tínum teldupostfráboðarstillingum. - success_html: Tú fer ikki longur at móttaka %{type} fyri Mastodon á %{domain} til tín teldupost á %{email}. - title: Strika hald media_attachments: validations: images_and_video: Kann ikki viðfesta sjónfílu til ein post, sum longu inniheldur myndir diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 14e7e5a3d87940..2ce37faa47a7d3 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -66,7 +66,7 @@ fr-CA: demote: Rétrograder destroyed_msg: Les données de %{username} sont maintenant en file d’attente pour être supprimées imminemment disable: Geler - disable_sign_in_token_auth: Désactiver le jeton d'authentification par e-mail + disable_sign_in_token_auth: Désactiver le jeton d'authentification par courriel disable_two_factor_authentication: Désactiver l’authentification à deux facteurs disabled: Gelé display_name: Nom affiché @@ -75,7 +75,7 @@ fr-CA: email: Courriel email_status: État du courriel enable: Dégeler - enable_sign_in_token_auth: Activer le jeton d'authentification par e-mail + enable_sign_in_token_auth: Activer le jeton d'authentification par courriel enabled: Activé enabled_msg: Le compte de %{username} a été dégelé avec succès followers: Abonné·e·s @@ -195,29 +195,29 @@ fr-CA: create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible create_user_role: Créer le rôle - create_username_block: Créer une règle de nom d'utilisateur + create_username_block: Créer une règle de nom d'utilisateur·rice demote_user: Rétrograder l’utilisateur·ice destroy_announcement: Supprimer l’annonce - destroy_canonical_email_block: Supprimer le blocage de courriel + destroy_canonical_email_block: Supprimer un blocage de courriel destroy_custom_emoji: Supprimer des émojis personnalisés destroy_domain_allow: Supprimer le domaine autorisé destroy_domain_block: Supprimer le blocage de domaine - destroy_email_domain_block: Supprimer le blocage de domaine de courriel + destroy_email_domain_block: Supprimer un blocage de domaine de courriel destroy_instance: Purge du domaine destroy_ip_block: Supprimer la règle IP - destroy_relay: Supprimer le relais + destroy_relay: Supprimer un relais destroy_status: Supprimer le message destroy_unavailable_domain: Supprimer le domaine indisponible destroy_user_role: Détruire le rôle - destroy_username_block: Supprimer la règle de nom d'utilisateur + destroy_username_block: Supprimer la règle de nom d'utilisateur·rice disable_2fa_user: Désactiver l’A2F disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais - disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par e-mail pour l'utilisateur + disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par courriel pour l'utilisateur·rice disable_user: Désactiver le compte enable_custom_emoji: Activer les émojis personnalisées enable_relay: Activer le relais - enable_sign_in_token_auth_user: Activer le jeton d'authentification par e-mail pour l'utilisateur + enable_sign_in_token_auth_user: Activer le jeton d'authentification par courriel pour l'utilisateur·rice enable_user: Activer l’utilisateur memorialize_account: Ériger en mémorial promote_user: Promouvoir l’utilisateur @@ -244,34 +244,34 @@ fr-CA: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle - update_username_block: Mettre à jour la règle de nom d'utilisateur + update_username_block: Mettre à jour la règle de nom d'utilisateur·rice actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" assigned_to_self_report_html: "%{name} s’est assigné·e le signalement de %{target}" - change_email_user_html: "%{name} a changé l'adresse e-mail de l'utilisateur \n%{target}" + change_email_user_html: "%{name} a changé l'adresse de courriel de l'utilisateur·rice %{target}" change_role_user_html: "%{name} a changé le rôle de %{target}" - confirm_user_html: "%{name} a confirmé l'adresse e-mail de l'utilisateur %{target}" + confirm_user_html: "%{name} a confirmé l'adresse de courriel de l'utilisateur·rice %{target}" create_account_warning_html: "%{name} a envoyé un avertissement à %{target}" create_announcement_html: "%{name} a créé une nouvelle annonce %{target}" - create_canonical_email_block_html: "%{name} a bloqué l'adresse email avec le hachage %{target}" + create_canonical_email_block_html: "%{name} a bloqué l'adresse de courriel ayant l'empreinte %{target}" create_custom_emoji_html: "%{name} a téléversé un nouvel émoji %{target}" create_domain_allow_html: "%{name} a autorisé la fédération avec le domaine %{target}" create_domain_block_html: "%{name} a bloqué le domaine %{target}" - create_email_domain_block_html: "%{name} a bloqué le domaine d'e-mail %{target}" + create_email_domain_block_html: "%{name} a bloqué le domaine de courriel %{target}" create_ip_block_html: "%{name} a créé une règle pour l'IP %{target}" create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" - create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur·rice contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" - destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" + destroy_canonical_email_block_html: "%{name} a débloqué l'adresse courriel ayant l'empreinte %{target}" destroy_collection_html: "%{name} a supprimé la collection de %{target}" destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}" destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}" destroy_domain_block_html: "%{name} a débloqué le domaine %{target}" - destroy_email_domain_block_html: "%{name} a débloqué le domaine d'e-mail %{target}" + destroy_email_domain_block_html: "%{name} a débloqué le domaine de courriel %{target}" destroy_instance_html: "%{name} a purgé le domaine %{target}" destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}" destroy_relay_html: "%{name} a supprimé le relais %{target}" @@ -295,7 +295,7 @@ fr-CA: reject_user_html: "%{name} a rejeté l’inscription de %{target}" remove_avatar_user_html: "%{name} a supprimé l'avatar de %{target}" reopen_report_html: "%{name} a rouvert le signalement %{target}" - resend_user_html: "%{name} a renvoyé l'e-mail de confirmation pour %{target}" + resend_user_html: "%{name} a renvoyé le courriel de confirmation pour %{target}" reset_password_user_html: "%{name} a réinitialisé le mot de passe de l'utilisateur·rice %{target}" resolve_report_html: "%{name} a résolu le signalement %{target}" sensitive_account_html: "%{name} a marqué le média de %{target} comme sensible" @@ -332,8 +332,8 @@ fr-CA: create: Créer une annonce title: Nouvelle annonce preview: - disclaimer: Étant donné que les utilisateurs ne peuvent pas s'en retirer, les notifications par courriel devraient être limitées à des annonces importantes telles que des violations de données personnelles ou des notifications de fermeture de serveur. - explanation_html: 'L''e-mail sera envoyé à %{display_count} utilisateurs. Le texte suivant sera inclus :' + disclaimer: Étant donné que les utilisateur·rice·s ne peuvent pas les désactiver, les notifications par courriel devraient être limitées à des annonces importantes telles que des violations de données personnelles ou des notifications de fermeture de serveur. + explanation_html: 'Le courriel sera envoyé à %{display_count} utilisateurs. Le texte suivant sera inclus :' title: Aperçu de la notification d'annonce publish: Publier published_msg: Annonce publiée avec succès ! @@ -472,7 +472,7 @@ fr-CA: attempts_over_week: one: "%{count} tentative au cours de la dernière semaine" other: "%{count} tentatives au cours de la dernière semaine" - created_msg: Domaine d'e-mail bloqué avec succès + created_msg: Domaine de courriel bloqué avec succès delete: Supprimer dns: types: @@ -484,10 +484,7 @@ fr-CA: title: Blocage d'un nouveau domaine de messagerie électronique no_email_domain_block_selected: Aucun blocage de domaine de messagerie n'a été modifié comme aucun n'a été sélectionné not_permitted: Non autorisé - resolved_dns_records_hint_html: |- - Le nom de domaine se réfère aux domaines MX suivants, qui sont à leur tour responsables de la réception des courriels. - - Le blocage d'un domaine MX empêchera l'inscription depuis toute adresse électronique ayant recours au même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. + resolved_dns_records_hint_html: Le nom de domaine est lié aux domaines MX suivants, qui sont responsables de la réception des courriels. Le blocage d'un domaine MX empêchera l'inscription de toute adresse de courriel utilisant le même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. resolved_through_html: Résolu par %{domain} title: Domaines de messagerie électronique bloqués export_domain_allows: @@ -680,7 +677,7 @@ fr-CA: resolve_description_html: Aucune mesure ne sera prise contre le compte signalé, aucune sanction ne sera enregistrée et le sigalement sera clôturé. silence_description_html: Le compte ne sera visible que par ceux qui le suivent déjà ou qui le recherchent manuellement, ce qui limite fortement sa portée. Cette action peut toujours être annulée. Cloture tous les signalements concernant ce compte. suspend_description_html: Le compte et tous ses contenus seront inaccessibles et finalement supprimés, et il sera impossible d'interagir avec lui. Réversible dans les 30 jours. Cloture tous les signalements concernant ce compte. - actions_description_html: Décidez de l'action à entreprendre pour résoudre ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification par courrier électronique lui sera envoyée, excepté lorsque la catégorie Spam est sélectionnée. + actions_description_html: Décider de l'action à entreprendre pour traiter ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification sera envoyée par courriel, sauf si la catégorie Spam est sélectionnée. actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. actions_no_posts: Ce signalement n'a pas de messages qui lui sont associés et qui devraient être supprimés add_to_report: Ajouter davantage au rapport @@ -765,6 +762,7 @@ fr-CA: categories: administration: Administration devops: DevOps + email: Courriel invites: Invitations moderation: Modération special: Spécial @@ -793,6 +791,8 @@ fr-CA: manage_blocks_description: Permet aux utilisateur⋅rice⋅s de bloquer des fournisseurs de courriel et des adresses IP manage_custom_emojis: Gérer les émojis personnalisés manage_custom_emojis_description: Permet aux utilisateur⋅rice⋅s de gérer les émoticônes personnalisées sur le serveur + manage_email_subscriptions: Gérer les abonnements par courriel + manage_email_subscriptions_description: Autoriser l'abonnement par courriel aux comptes ayant cette permission manage_federation: Gérer de la féderation manage_federation_description: Permet aux utilisateur⋅rice⋅s de bloquer ou d'autoriser la fédération avec d'autres domaines, et de contrôler la capacité de livraison manage_invites: Gérer les invitations @@ -843,7 +843,7 @@ fr-CA: rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer. title: À propos allow_referrer_origin: - desc: Quand les utilisateurs cliquent sur un lien externe, leur navigateur peut envoyer l'adresse du serveur Mastodon en tant qu'adresse d'origine. À désactiver si cela permet d'identifier les utilisateurs, par exemple s'il s'agit d'un serveur Mastodon personnel. + desc: Quand vos utilisateur·rice·s cliquent sur un lien externe, leur navigateur peut envoyer l'adresse de votre serveur Mastodon en tant qu'adresse d'origine. À désactiver si cela permet d'identifier les utilisateur·rice·s, par exemple s'il s'agit d'un serveur Mastodon personnel. title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic appearance: preamble: Personnaliser l'interface web de Mastodon. @@ -906,7 +906,7 @@ fr-CA: destroyed_msg: Téléversement sur le site supprimé avec succès ! software_updates: critical_update: Critique — veuillez mettre à jour au plus vite - description: Il est recommandé de maintenir votre installation de Mastodon à jour afin de bénéficier des derniers correctifs et fonctionnalités. Par ailleurs, il est parfois critique de mettre à jour Mastodon en temps voulu de manière à éviter les incidents relatifs à la sécurité. Pour ces raisons, Mastodon examine la disponibilté des mises à jour toutes les 30 minutes, et vous en avisera en fonction de vos préférences de notification par messagerie électronique. + description: Il est recommandé de maintenir votre installation de Mastodon à jour afin de bénéficier des derniers correctifs et fonctionnalités. Par ailleurs, il est parfois critique de mettre à jour Mastodon rapidement de manière à éviter les incidents relatifs à la sécurité. Pour ces raisons, Mastodon examine la disponibilté des mises à jour toutes les 30 minutes, et vous en avisera en fonction de vos préférences de notification par courriel. documentation_link: En savoir plus release_notes: Notes de mises à jour title: Mises à jour disponibles @@ -1041,18 +1041,18 @@ fr-CA: history: Historique live: En cours d'utilisation no_history: Il n'y a pas encore de modifications enregistrées des conditions d'utilisation. - no_terms_of_service_html: Vous n'avez actuellement aucune condition d'utilisation configurée. Les conditions d'utilisation ont pour but de clarifier les droits et obligations de chacun lors de l'utilisation du service et de vous protéger contre d'éventuelles responsabilités en cas de litige avec vos utilisateurs. - notified_on_html: Utilisateurs notifiés le `%{date}` - notify_users: Notifier les utilisateurs + no_terms_of_service_html: Vous n'avez actuellement aucune condition d'utilisation configurée. Les conditions d'utilisation ont pour but de clarifier les droits et obligations de chacun lors de l'utilisation du service et de vous protéger contre d'éventuelles responsabilités en cas de litige avec vos utilisateur·rice·s. + notified_on_html: Utilisateur·rice·s notifié·e·s le %{date} + notify_users: Notifier les utilisateur·rice·s preview: - explanation_html: 'L''e-mail sera envoyé aux utilisateurs %{display_count} qui se sont inscrits avant %{date}. Le texte suivant sera inclus dans l''e-mail :' + explanation_html: 'Le courriel sera envoyé aux %{display_count} utilisateur·rice·s qui se sont inscrits avant le %{date}. Le texte suivant sera inclus dans le message :' send_preview: Envoyer un aperçu à %{email} send_to_all: - one: Envoyer %{display_count} email - other: Envoyer %{display_count} emails - title: Notification concernant l'aperçu des conditions d'utilisation + one: Envoyer %{display_count} courriel + other: Envoyer %{display_count} courriels + title: Aperçu de la notification des conditions d'utilisation publish: Publier - published_on_html: Publié le %{date} + published_on_html: Publiés le %{date} save_draft: Enregistrer le brouillon title: Conditions d'utilisation title: Administration @@ -1234,7 +1234,6 @@ fr-CA: application_mailer: notification_preferences: Modification des préférences de la messagerie salutation: "%{name}," - settings: 'Modifier les préférences de la messagerie : %{link}' unsubscribe: Se désabonner view: 'Voir :' view_profile: Voir le profil @@ -1254,7 +1253,7 @@ fr-CA: hint_html: Juste une autre chose! Nous avons besoin de confirmer que vous êtes un humain (pour que nous puissions empêcher les spams!). Résolvez le CAPTCHA ci-dessous et cliquez sur "Continuer". title: Vérification de sécurité confirmations: - awaiting_review: Votre adresse de messagerie est confirmée ! L'équipe de %{domain} est en train d'examiner votre inscription. Vous recevrez un e-mail si votre compte est approuvé ! + awaiting_review: Votre adresse de courriel est confirmée ! L'équipe de %{domain} est en train d'examiner votre inscription. Vous recevrez un courriel si votre compte est approuvé ! awaiting_review_title: Votre inscription est en cours de validation clicking_this_link: cliquer sur ce lien login_link: vous connecter @@ -1262,7 +1261,7 @@ fr-CA: redirect_to_app_html: Vous auriez dû être redirigé vers l’application %{app_name}. Si cela ne s’est pas produit, essayez de %{clicking_this_link} ou de revenir manuellement à l’application. registration_complete: Votre inscription sur %{domain} est désormais terminée ! welcome_title: Bienvenue, %{name} ! - wrong_email_hint: Si cette adresse de messagerie est incorrecte, vous pouvez la modifier dans vos paramètres de compte. + wrong_email_hint: Si cette adresse de courriel est incorrecte, vous pouvez la modifier dans vos paramètres de compte. delete_account: Supprimer le compte delete_account_html: Si vous désirez supprimer votre compte, vous pouvez cliquer ici. Il vous sera demandé de confirmer cette action. description: @@ -1282,7 +1281,7 @@ fr-CA: migrate_account_html: Si vous voulez rediriger ce compte vers un autre, vous pouvez le configurer ici. or_log_in_with: Ou authentifiez-vous avec progress: - confirm: Confirmation de l'adresse mail + confirm: Confirmer l'adresse de courriel details: Vos infos list: Progression de l'inscription review: Notre avis @@ -1306,10 +1305,10 @@ fr-CA: security: Sécurité set_new_password: Définir le nouveau mot de passe setup: - email_below_hint_html: Consultez votre dossier de courrier indésirable ou demandez-en un autre. Vous pouvez corriger votre adresse e-mail si elle est incorrecte. - email_settings_hint_html: Cliquez sur le lien que nous avons envoyé à %{email} pour commencer à utiliser Mastodon. Nous vous attendrons ici. + email_below_hint_html: Consultez votre dossier de courriels indésirables ou demandez-en un autre. Vous pouvez corriger votre adresse de courriel si elle est incorrecte. + email_settings_hint_html: Cliquer sur le lien envoyé à %{email} pour commencer à utiliser Mastodon. Nous vous attendons ici. link_not_received: Vous n'avez pas reçu de lien? - new_confirmation_instructions_sent: Vous allez recevoir un nouvel e-mail avec le lien de confirmation dans quelques minutes ! + new_confirmation_instructions_sent: Vous allez recevoir un nouveau courriel avec le lien de confirmation dans quelques minutes ! title: Vérifiez votre boîte de réception sign_in: preamble_html: Connectez-vous avec vos identifiants sur %{domain}. Si votre compte est hébergé sur un autre serveur, vous ne pourrez pas vous connecter ici. @@ -1322,7 +1321,7 @@ fr-CA: account_status: État du compte confirming: En attente de la confirmation par courrier électronique. functional: Votre compte est entièrement opérationnel. - pending: Votre demande est en attente d’examen par notre équipe. Cela peut prendre un certain temps. Vous recevrez un e-mail si votre demande est approuvée. + pending: Votre demande est en attente d’examen par notre équipe. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}. self_destruct: Comme %{domain} est en train de fermer, vous n’aurez qu’un accès limité à votre compte. view_strikes: Voir les sanctions précédemment appliquées à votre compte @@ -1334,7 +1333,7 @@ fr-CA: example_title: Exemple de texte hint_html: Vous écrivez des nouvelles ou des articles de blog en dehors de Mastodon ? Contrôlez la façon dont vous êtes crédité lorsqu'ils sont partagés sur Mastodon. instructions: 'Assurez-vous que ce code se trouve dans le code HTML de votre article :' - more_from_html: Plus via %{name} + more_from_html: Voir plus de %{name} s_blog: Blog de %{name} then_instructions: Ensuite, ajoutez le nom de domaine de la publication dans le champ ci-dessous. title: Attribution de l'auteur·e @@ -1381,9 +1380,9 @@ fr-CA: before: 'Veuillez lire attentivement ces notes avant de continuer :' caches: Le contenu mis en cache par d'autres serveurs peut persister data_removal: Vos messages et autres données seront définitivement supprimés - email_change_html: Vous pouvez modifier votre adresse e-mail sans supprimer votre compte - email_contact_html: S'il ne vous est toujours pas parvenu, vous pouvez envoyer un message à %{email} pour obtenir de l'aide - email_reconfirmation_html: Dans le cas où vous n'auriez pas reçu l'email de confirmation, vous pouvez en réclamer un nouveau + email_change_html: Vous pouvez modifier votre adresse de courriel sans supprimer votre compte + email_contact_html: S'il ne vous est toujours pas parvenu, vous pouvez envoyer un courriel à %{email} pour obtenir de l'aide + email_reconfirmation_html: Si vous ne recevez pas le courriel de confirmation, vous pouvez en réclamer un nouveau irreversible: Vous ne pourrez pas restaurer ou réactiver votre compte more_details_html: Pour plus de détails, voir la politique de confidentialité. username_available: Votre nom d’utilisateur·rice sera à nouveau disponible @@ -1419,9 +1418,42 @@ fr-CA: your_appeal_pending: Vous avez soumis un appel your_appeal_rejected: Votre appel a été rejeté edit_profile: - basic_information: Informations de base - hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + redesign_body: La modification du profil est maintenant accessible directement depuis la page de profil. + redesign_button: Accéder + redesign_title: Nouvelle expérience de modification du profil + email_subscription_mailer: + confirmation: + action: Confirmer l'adresse de courriel + instructions_to_confirm: Veuillez confirmer que vous souhaitez recevoir des courriels de %{name} (@%{acct}) lors de la publication de nouveaux messages. + instructions_to_ignore: Si vous ne savez pas pourquoi vous recevez ce courriel, vous pouvez le supprimer. Vous ne serez pas abonné·e si vous ne cliquez pas sur le lien ci-dessus. + subject: Confirmer votre adresse de courriel + title: Recevoir les notifications par courriel de %{name} ? + notification: + create_account: Créer un compte Mastodon + footer: + privacy_html: Les courriels sont envoyés par %{domain}, un serveur propulsé par Mastodon. Pour comprendre comment ce serveur utilise vos données personnelles, se référer à la politique de confidentialité. + reason_for_email_html: Vous recevez ce courriel car vous avez choisi de recevoir les notifications de %{name}. Vous ne souhaitez pas recevoir ces courriels ? Désabonnez-vous + interact_with_this_post: + one: Interagissez avec ce message pour en découvrir d'autres. + other: Interagissez avec ces messages pour en découvrir plus. + subject: + plural: Nouveaux messages de %{name} + singular: 'Nouveau message : « %{excerpt} »' + title: + plural: Nouveaux messages de %{name} + singular: 'Nouveau message : « %{excerpt} »' + email_subscriptions: + active: Actif + confirmations: + show: + changed_your_mind: Vous avez changé d'avis ? + success_html: Vous allez maintenant commencer à recevoir des courriels quand %{name} publie de nouveaux messages. Ajoutez %{sender} à vos contacts pour que ces messages ne soient pas considérés comme des courriels indésirables. + title: Vous êtes abonné·e + unsubscribe: Se désabonner + inactive: Inactif + status: État + subscribers: Abonné·e·s emoji_styles: auto: Auto native: Natif @@ -1460,10 +1492,8 @@ fr-CA: mutes: Vous masquez storage: Médias stockés featured_tags: - add_new: Ajouter un nouveau hashtag errors: limit: Vous avez déjà mis en avant le nombre maximum de hashtags - hint_html: "Que sont les hashtags mis en avant ? Ils sont affichés en évidence sur votre profil public et permettent aux gens de parcourir vos messages publics qui utilisent ces hashtags. Ils sont un excellent outil pour garder la trace d’activités créatrices ou de projets de long terme." filters: contexts: account: Profils @@ -1656,21 +1686,6 @@ fr-CA: failed_sign_in_html: Tentative de connexion échouée avec %{method} de %{ip} (%{browser}) successful_sign_in_html: Connexion réussie avec %{method} de %{ip} (%{browser}) title: Historique d'authentification - mail_subscriptions: - unsubscribe: - action: Oui, me désabonner - complete: Désabonné·e - confirmation_html: Êtes-vous sûr de vouloir vous désabonner de la réception de %{type} pour Mastodon sur %{domain} à votre adresse e-mail %{email} ? Vous pouvez toujours vous réabonner à partir de vos paramètres de notification par messagerie. - emails: - notification_emails: - favourite: e-mails de notifications de favoris - follow: e-mails de notifications d’abonnements - follow_request: e-mails de demandes d’abonnements - mention: e-mails de notifications de mentions - reblog: e-mails de notifications de partages - resubscribe_html: Si vous vous êtes désinscrit par erreur, vous pouvez vous réinscrire à partir de vos paramètres de notification par e-mail. - success_html: Vous ne recevrez plus de %{type} pour Mastodon sur %{domain} à votre adresse e-mail à %{email}. - title: Se désabonner media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images @@ -1716,6 +1731,25 @@ fr-CA: copy_account_note_text: 'Cet·te utilisateur·rice est parti·e de %{acct}, voici vos notes précédentes à son sujet :' navigation: toggle_menu: Basculer l'affichage du menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} vous a ajouté·e à une collection" + admin_report: + title_html: "%{name} a signalé %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} et un·e autre se sont inscrit·e·s" + other: "%{name} et %{count} autres se sont inscrit·e·s" + title_html: "%{name} s'est inscrit·e" + collection_update: + title_html: "%{name} a mis à jour une collection dans laquelle vous figurez" + generic: + sign_in: Connectez-vous à l'application Web Mastodon + moderation_warning: + title: Vous avez reçu un avertissement de la modération. + severed_relationships: + summary_html: L'équipe d'administration de %{from} a suspendu %{target}, ce qui signifie que vous ne pouvez plus recevoir de notifications de leur part ou interagir avec. %{link} pour récupérer la liste des relations perdues. + title: Connexions perdues avec %{name} notification_mailer: admin: report: @@ -1762,7 +1796,7 @@ fr-CA: subject: "%{name} a modifié un message" notifications: administration_emails: Notifications d'administration par courriel - email_events: Événements pour les notifications par e-mail + email_events: Événements pour les notifications par courriel email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :' number: human: @@ -1808,6 +1842,8 @@ fr-CA: posting_defaults: Paramètres de publication par défaut public_timelines: Fils publics privacy: + email_subscriptions: Envoyer des messages par courriel + email_subscriptions_hint_html: Ajoute un formulaire d'abonnement par courriel à votre profil pour les personnes non connectées. Après avoir validé leur adresse courriel, Mastodon leur enverra des notifications pour vos messages publics. hint_html: "Personnalisez la façon dont votre profil et vos messages peuvent être découverts. Mastodon peut vous aider à atteindre un public plus large lorsque certains paramètres sont activés. Prenez le temps de les examiner pour vous assurer qu’ils sont configurés comme vous le souhaitez." privacy: Confidentialité privacy_hint_html: Contrôler ce que vous souhaitez divulguer. Les utilisateur·rice·s découvrent des profils intéressants en parcourant ceux suivis par d’autres personnes et des applications sympas en voyant celles utilisées pour publier des messages, mais vous préférez peut-être ne pas dévoiler ces informations. @@ -2071,6 +2107,28 @@ fr-CA: resume_app_authorization: Reprendre l'autorisation de l'application role_requirement: "%{domain} nécessite de configurer une authentification à deux facteurs avant de pouvoir utiliser Mastodon." webauthn: Clés de sécurité + unsubscriptions: + create: + action: Aller à la page d'accueil du serveur + email_subscription: + confirmation_html: Vous ne recevrez plus de courriels de %{name}. + title: Vous êtes désabonné·e + user: + confirmation_html: Vous ne recevrez plus de %{type} de Mastodon depuis %{domain}. + notification_emails: + favourite: courriels de notification de mise en favori + follow: courriels de notification d'abonnement + follow_request: courriels de demande d'abonnement + mention: courriels de notification de mention + reblog: courriels de notification de partage + show: + action: Se désabonner + email_subscription: + confirmation_html: Vous ne recevrez plus de courriels quand ce compte publiera de nouveaux messages. + title: Se désabonner de %{name} ? + user: + confirmation_html: Vous ne recevrez plus de %{type} de Mastodon depuis %{domain}. + title: Se désabonner des %{type} ? user_mailer: announcement_published: description: 'Les administrateurs de %{domain} font une annonce :' @@ -2108,8 +2166,8 @@ fr-CA: terms_of_service_changed: agreement: En continuant d'utiliser %{domain}, vous acceptez ces conditions. Si vous n'êtes pas d'accord avec les conditions mises à jour, vous pouvez résilier votre accord avec %{domain} à tout moment en supprimant votre compte. changelog: 'En un coup d''œil, voici ce que cette mise à jour signifie pour vous :' - description: 'Vous recevez cet e-mail parce que nous apportons des modifications à nos conditions de service à %{domain}. Ces modifications entreront en vigueur le %{date}. Nous vous encourageons à consulter l''intégralité des conditions mises à jour ici :' - description_html: Vous recevez cet e-mail parce que nous apportons des modifications à nos conditions de service à %{domain}. Ces mises à jour entreront en vigueur le %{date}. Nous vous encourageons à consulter l'intégralité des conditions mises à jour ici. + description: 'Vous recevez ce courriel parce que nous apportons des modifications à nos conditions de service de %{domain}. Ces modifications entreront en vigueur le %{date}. Nous vous encourageons à consulter l''intégralité des conditions mises à jour ici :' + description_html: Vous recevez ce courriel parce que nous apportons des modifications à nos conditions de service de %{domain}. Ces mises à jour entreront en vigueur le %{date}. Nous vous encourageons à consulter l'intégralité des conditions mises à jour ici. sign_off: L'équipe %{domain} subject: Mises à jour de nos conditions d'utilisation subtitle: Les conditions d'utilisation de `%{domain}` changent @@ -2191,7 +2249,7 @@ fr-CA: invalid_otp_token: Le code d’authentification à deux facteurs est invalide otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email} rate_limited: Trop de tentatives d'authentification, réessayez plus tard. - seamless_external_login: Vous êtes connectés sur un service externe, de fait les paramètres de mot de passe et d'e-mail ne sont pas disponibles. + seamless_external_login: Vous êtes connectés via un service externe, donc les paramètres de mot de passe et de courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' verification: extra_instructions_html: Astuce: Le lien sur votre site Web peut être invisible. La partie importante est rel="me" qui évite d’autres liens provenant de contenu générés par des utilisateurs tiers d'être pris en compte. Vous pouvez même utiliser une balise link dans l’en-tête de la page au lieu de a, mais le HTML doit être accessible sans avoir besoin d’exécuter du JavaScript. @@ -2200,7 +2258,7 @@ fr-CA: instructions_html: Copiez et collez le code ci-dessous dans le code HTML de votre site web. Ajoutez ensuite l’adresse de votre site dans l’un des champs supplémentaires de votre profil à partir de l‘onglet "Modifier le profil" et enregistrez les modifications. verification: Vérification verified_links: Vos liens vérifiés - website_verification: Vérification du site web + website_verification: Vérification du site Web webauthn_credentials: add: Ajouter une nouvelle clé de sécurité create: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 3407c4515b9a6f..47bf7904b2fd8f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -65,22 +65,22 @@ fr: deleted: Supprimé demote: Rétrograder destroyed_msg: Les données de %{username} sont maintenant en file d’attente pour être supprimées imminemment - disable: Geler - disable_sign_in_token_auth: Désactiver le jeton d'authentification par e-mail + disable: Désactiver + disable_sign_in_token_auth: Désactiver le jeton d'authentification par courriel disable_two_factor_authentication: Désactiver l’authentification à deux facteurs - disabled: Gelé - display_name: Nom affiché + disabled: Désactivé + display_name: Nom public domain: Domaine edit: Modifier email: Adresse de courriel - email_status: État du courriel - enable: Dégeler - enable_sign_in_token_auth: Activer le jeton d'authentification par e-mail + email_status: État de l'adresse de courriel + enable: Activer + enable_sign_in_token_auth: Activer le jeton d'authentification par courriel enabled: Activé - enabled_msg: Le compte de %{username} a été dégelé avec succès + enabled_msg: Le compte de %{username} a été activé avec succès followers: Abonné·e·s follows: Abonnements - header: Entête + header: Image de couverture inbox_url: URL d’entrée invite_request_text: Raisons de l’adhésion invited_by: Invité par @@ -119,7 +119,7 @@ fr: other: Ce compte a reçu %{count} sanctions. promote: Promouvoir protocol: Protocole - public: Publique + public: Public push_subscription_expires: Expiration de l’abonnement PuSH redownload: Rafraîchir le profil redownloaded_msg: Le profil de %{username} a été actualisé avec succès depuis l’origine @@ -128,7 +128,7 @@ fr: remote_suspension_irreversible: Les données de ce compte ont été supprimées définitivement. remote_suspension_reversible_hint_html: Ce compte a été suspendu par son serveur d'accueil, et les données rattachées seront supprimées le %{date}. Jusqu'à cette date, il peut être restauré sans aucune perte par le serveur distant. Si vous souhaitez supprimer immédiatement toutes les données de ce compte, vous pouvez le faire ci-dessous. remove_avatar: Supprimer l’avatar - remove_header: Supprimer l’entête + remove_header: Supprimer l'image de couverture removed_avatar_msg: L’avatar de %{username} a été supprimé avec succès removed_header_msg: L’image d’en-tête de %{username} a été supprimée avec succès resend_confirmation: @@ -171,7 +171,7 @@ fr: unsilenced_msg: La limitation du compte de %{username} a été annulée avec succès unsubscribe: Se désabonner unsuspended_msg: Le compte de %{username} a été réactivé avec succès - username: Nom d’utilisateur·ice + username: Nom d’utilisateur·rice view_domain: Voir le résumé du domaine warn: Avertissement web: Web @@ -194,30 +194,30 @@ fr: create_ip_block: Créer une règle IP create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible - create_user_role: Créer le rôle - create_username_block: Créer une règle de nom d'utilisateur - demote_user: Rétrograder l’utilisateur·ice - destroy_announcement: Supprimer l’annonce - destroy_canonical_email_block: Supprimer le blocage de courriel - destroy_custom_emoji: Supprimer des émojis personnalisés - destroy_domain_allow: Supprimer le domaine autorisé - destroy_domain_block: Supprimer le blocage de domaine - destroy_email_domain_block: Supprimer le blocage de domaine de courriel - destroy_instance: Purge du domaine - destroy_ip_block: Supprimer la règle IP - destroy_relay: Supprimer le relais - destroy_status: Supprimer le message - destroy_unavailable_domain: Supprimer le domaine indisponible - destroy_user_role: Détruire le rôle - destroy_username_block: Supprimer la règle de nom d'utilisateur - disable_2fa_user: Désactiver l’A2F + create_user_role: Créer un rôle + create_username_block: Créer une règle de nom d'utilisateur·rice + demote_user: Rétrograder un·e utilisateur·ice + destroy_announcement: Supprimer une annonce + destroy_canonical_email_block: Supprimer un blocage de courriel + destroy_custom_emoji: Supprimer un émoji personnalisé + destroy_domain_allow: Supprimer un domaine autorisé + destroy_domain_block: Supprimer un blocage de domaine + destroy_email_domain_block: Supprimer un blocage de domaine de courriel + destroy_instance: Purger un domaine + destroy_ip_block: Supprimer une règle IP + destroy_relay: Supprimer un relais + destroy_status: Supprimer un message + destroy_unavailable_domain: Supprimer un domaine indisponible + destroy_user_role: Supprimer le rôle + destroy_username_block: Supprimer la règle de nom d'utilisateur·rice + disable_2fa_user: Désactiver l’authentification à deux facteurs disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais - disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par e-mail pour l'utilisateur + disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par courriel pour l'utilisateur·rice disable_user: Désactiver le compte enable_custom_emoji: Activer les émojis personnalisées enable_relay: Activer le relais - enable_sign_in_token_auth_user: Activer le jeton d'authentification par e-mail pour l'utilisateur + enable_sign_in_token_auth_user: Activer le jeton d'authentification par courriel pour l'utilisateur·rice enable_user: Activer le compte memorialize_account: Ériger en mémorial promote_user: Promouvoir le compte @@ -226,11 +226,11 @@ fr: reject_user: Rejeter le compte remove_avatar_user: Supprimer l’avatar reopen_report: Rouvrir le signalement - resend_user: Renvoyer l'e-mail de confirmation + resend_user: Renvoyer le courriel de confirmation reset_password_user: Réinitialiser le mot de passe - resolve_report: Résoudre le signalement - sensitive_account: Marquer les médias de votre compte comme sensibles - silence_account: Limiter le compte + resolve_report: Traiter le signalement + sensitive_account: Marquer le compte comme sensible + silence_account: Masquer le compte suspend_account: Suspendre le compte unassigned_report: Ne plus assigner le signalement unblock_email_account: Débloquer l’adresse de courriel @@ -244,36 +244,36 @@ fr: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle - update_username_block: Mettre à jour la règle de nom d'utilisateur + update_username_block: Mettre à jour la règle de nom d'utilisateur·rice actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" assigned_to_self_report_html: "%{name} s’est assigné·e le signalement de %{target}" - change_email_user_html: "%{name} a changé l'adresse e-mail de l'utilisateur \n%{target}" + change_email_user_html: "%{name} a changé l'adresse de courriel de l'utilisateur·rice %{target}" change_role_user_html: "%{name} a changé le rôle de %{target}" - confirm_user_html: "%{name} a confirmé l'adresse e-mail de l'utilisateur %{target}" + confirm_user_html: "%{name} a confirmé l'adresse de courriel de l'utilisateur·rice %{target}" create_account_warning_html: "%{name} a envoyé un avertissement à %{target}" - create_announcement_html: "%{name} a créé une nouvelle annonce %{target}" - create_canonical_email_block_html: "%{name} a bloqué l'adresse email avec le hachage %{target}" - create_custom_emoji_html: "%{name} a téléversé un nouvel émoji %{target}" + create_announcement_html: "%{name} a créé la nouvelle annonce %{target}" + create_canonical_email_block_html: "%{name} a bloqué l'adresse de courriel ayant l'empreinte %{target}" + create_custom_emoji_html: "%{name} a téléversé le nouvel émoji %{target}" create_domain_allow_html: "%{name} a autorisé la fédération avec le domaine %{target}" create_domain_block_html: "%{name} a bloqué le domaine %{target}" - create_email_domain_block_html: "%{name} a bloqué le domaine d'e-mail %{target}" - create_ip_block_html: "%{name} a créé une règle pour l'IP %{target}" + create_email_domain_block_html: "%{name} a bloqué le domaine de courriel %{target}" + create_ip_block_html: "%{name} a créé la règle pour IP %{target}" create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" - create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur·rice contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" - destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" + destroy_canonical_email_block_html: "%{name} a débloqué l'adresse courriel ayant l'empreinte %{target}" destroy_collection_html: "%{name} a supprimé la collection de %{target}" destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}" - destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}" + destroy_domain_allow_html: "%{name} a supprimé la fédération avec le domaine %{target}" destroy_domain_block_html: "%{name} a débloqué le domaine %{target}" - destroy_email_domain_block_html: "%{name} a débloqué le domaine d'e-mail %{target}" + destroy_email_domain_block_html: "%{name} a débloqué le domaine de courriel %{target}" destroy_instance_html: "%{name} a purgé le domaine %{target}" - destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}" + destroy_ip_block_html: "%{name} a supprimé la règle pour IP %{target}" destroy_relay_html: "%{name} a supprimé le relais %{target}" destroy_status_html: "%{name} a supprimé le message de %{target}" destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" @@ -295,11 +295,11 @@ fr: reject_user_html: "%{name} a rejeté l’inscription de %{target}" remove_avatar_user_html: "%{name} a supprimé l'avatar de %{target}" reopen_report_html: "%{name} a rouvert le signalement %{target}" - resend_user_html: "%{name} a renvoyé l'e-mail de confirmation pour %{target}" + resend_user_html: "%{name} a renvoyé le courriel de confirmation pour %{target}" reset_password_user_html: "%{name} a réinitialisé le mot de passe de l'utilisateur·rice %{target}" - resolve_report_html: "%{name} a résolu le signalement %{target}" + resolve_report_html: "%{name} a traité le signalement %{target}" sensitive_account_html: "%{name} a marqué le média de %{target} comme sensible" - silence_account_html: "%{name} a limité le compte de %{target}" + silence_account_html: "%{name} a masqué le compte de %{target}" suspend_account_html: "%{name} a suspendu le compte de %{target}" unassigned_report_html: "%{name} a désassigné le signalement %{target}" unblock_email_account_html: "%{name} a débloqué l’adresse de courriel de %{target}" @@ -332,8 +332,8 @@ fr: create: Créer une annonce title: Nouvelle annonce preview: - disclaimer: Étant donné que les utilisateurs ne peuvent pas s'en retirer, les notifications par courriel devraient être limitées à des annonces importantes telles que des violations de données personnelles ou des notifications de fermeture de serveur. - explanation_html: 'L''e-mail sera envoyé à %{display_count} utilisateurs. Le texte suivant sera inclus :' + disclaimer: Étant donné que les utilisateur·rice·s ne peuvent pas les désactiver, les notifications par courriel devraient être limitées à des annonces importantes telles que des violations de données personnelles ou des notifications de fermeture de serveur. + explanation_html: 'Le courriel sera envoyé à %{display_count} utilisateurs. Le texte suivant sera inclus :' title: Aperçu de la notification d'annonce publish: Publier published_msg: Annonce publiée avec succès ! @@ -405,7 +405,7 @@ fr: pending_users_html: one: "%{count} utilisateur·rice en attente" other: "%{count} utilisateur·rice·s en attente" - resolved_reports: rapports résolus + resolved_reports: rapports traités software: Logiciel sources: Sources d'inscription space: Espace utilisé @@ -467,27 +467,24 @@ fr: undo: Annuler le blocage de domaine view: Afficher les blocages de domaines email_domain_blocks: - add_new: Ajouter un nouveau + add_new: Ajouter allow_registrations_with_approval: Autoriser les inscriptions avec approbation attempts_over_week: - one: "%{count} tentative au cours de la dernière semaine" - other: "%{count} tentatives au cours de la dernière semaine" - created_msg: Domaine d'e-mail bloqué avec succès + one: "%{count} tentative d'inscription au cours de la dernière semaine" + other: "%{count} tentatives d'inscription au cours de la dernière semaine" + created_msg: Domaine de courriel bloqué avec succès delete: Supprimer dns: types: mx: Enregistrement MX domain: Domaine new: - create: Créer le blocage + create: Ajouter un domaine resolve: Résoudre le domaine title: Blocage d'un nouveau domaine de messagerie électronique no_email_domain_block_selected: Aucun blocage de domaine de messagerie n'a été modifié comme aucun n'a été sélectionné not_permitted: Non autorisé - resolved_dns_records_hint_html: |- - Le nom de domaine se réfère aux domaines MX suivants, qui sont à leur tour responsables de la réception des courriels. - - Le blocage d'un domaine MX empêchera l'inscription depuis toute adresse électronique ayant recours au même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. + resolved_dns_records_hint_html: Le nom de domaine est lié aux domaines MX suivants, qui sont responsables de la réception des courriels. Le blocage d'un domaine MX empêchera l'inscription de toute adresse de courriel utilisant le même domaine MX, et ce même si le nom de domaine visible est différent. Veillez à ne pas bloquer les principaux fournisseurs de services de messagerie. resolved_through_html: Résolu par %{domain} title: Domaines de messagerie électronique bloqués export_domain_allows: @@ -680,8 +677,8 @@ fr: resolve_description_html: Aucune mesure ne sera prise contre le compte signalé, aucune sanction ne sera enregistrée et le sigalement sera clôturé. silence_description_html: Le compte ne sera visible que par ceux qui le suivent déjà ou qui le recherchent manuellement, ce qui limite fortement sa portée. Cette action peut toujours être annulée. Cloture tous les signalements concernant ce compte. suspend_description_html: Le compte et tous ses contenus seront inaccessibles et finalement supprimés, et il sera impossible d'interagir avec lui. Réversible dans les 30 jours. Cloture tous les signalements concernant ce compte. - actions_description_html: Décidez de l'action à entreprendre pour résoudre ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification par courrier électronique lui sera envoyée, excepté lorsque la catégorie Spam est sélectionnée. - actions_description_remote_html: Décidez des mesures à prendre pour résoudre ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. + actions_description_html: Décider de l'action à entreprendre pour traiter ce signalement. Si vous prenez une mesure punitive à l'encontre du compte signalé, une notification sera envoyée par courriel, sauf si la catégorie Spam est sélectionnée. + actions_description_remote_html: Décider des mesures à prendre pour traiter ce signalement. Cela n'affectera que la manière dont votre serveur communique avec ce compte distant et traite son contenu. actions_no_posts: Ce signalement n'a pas de messages qui lui sont associés et qui devraient être supprimés add_to_report: Ajouter davantage au rapport already_suspended_badges: @@ -705,13 +702,13 @@ fr: forwarded: Transféré forwarded_replies_explanation: Ce rapport provient d'un utilisateur sur une autre instance et concerne du contenu non-local. Il vous a été transmis car le contenu signalé est en réponse à l'un de vos utilisateurs. forwarded_to: Transféré à %{domain} - mark_as_resolved: Marquer comme résolu + mark_as_resolved: Marquer comme traité mark_as_sensitive: Marquer comme sensible - mark_as_unresolved: Marquer comme non-résolu + mark_as_unresolved: Marquer comme non-traité no_one_assigned: Personne notes: create: Ajouter une note - create_and_resolve: Résoudre avec une note + create_and_resolve: Traiter avec une note create_and_unresolve: Ré-ouvrir avec une note delete: Supprimer placeholder: Décrivez quelles actions ont été prises, ou toute autre mise à jour… @@ -726,8 +723,8 @@ fr: reported_by: Signalé par reported_content: Contenu signalé reported_with_application: Signalé avec l'application - resolved: Résolus - resolved_msg: Signalement résolu avec succès ! + resolved: Traité + resolved_msg: Signalement traité avec succès ! skip_to_actions: Passer aux actions status: Statut statuses: Messages (%{count}) @@ -743,8 +740,8 @@ fr: mark_as_sensitive_html: marquer le média des messages incriminés comme sensible silence_html: limiter drastiquement la portée du compte de @%{acct} en rendant son profil, ainsi que ses contenus, visibles uniquement des personnes déjà abonnées ou qui le recherchent manuellement suspend_html: suspendre le compte de @%{acct}, ce qui empêche toute interaction avec son profil et tout accès à ses contenus - close_report: 'marquer le signalement #%{id} comme résolu' - close_reports_html: marquer tous les signalements de @%{acct} comme résolus + close_report: Marquer le signalement n°%{id} comme traité + close_reports_html: Marquer tous les signalements de @%{acct} comme traités delete_data_html: effacer le profil de @%{acct} et ses contenus dans 30 jours, à moins que la suspension du compte ne soit annulée entre temps preview_preamble_html: "@%{acct} recevra un avertissement contenant les éléments suivants :" record_strike_html: enregistrer une sanction contre @%{acct} pour vous aider à prendre des mesures supplémentaires en cas d'infractions futures de ce compte @@ -754,7 +751,7 @@ fr: title: Signalements unassign: Dés-assigner unknown_action_msg: 'Action inconnue : %{action}' - unresolved: Non résolus + unresolved: Non traité updated_at: Mis à jour view_profile: Voir le profil roles: @@ -765,6 +762,7 @@ fr: categories: administration: Administration devops: DevOps + email: Courriel invites: Invitations moderation: Modération special: Spécial @@ -793,6 +791,8 @@ fr: manage_blocks_description: Permet aux utilisateur⋅rice⋅s de bloquer des fournisseurs de courriel et des adresses IP manage_custom_emojis: Gérer les émojis personnalisés manage_custom_emojis_description: Permet aux utilisateur⋅rice⋅s de gérer les émoticônes personnalisées sur le serveur + manage_email_subscriptions: Gérer les abonnements par courriel + manage_email_subscriptions_description: Autoriser l'abonnement par courriel aux comptes ayant cette permission manage_federation: Gérer de la féderation manage_federation_description: Permet aux utilisateur⋅rice⋅s de bloquer ou d'autoriser la fédération avec d'autres domaines, et de contrôler la capacité de livraison manage_invites: Gérer les invitations @@ -843,7 +843,7 @@ fr: rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer. title: À propos allow_referrer_origin: - desc: Quand les utilisateurs cliquent sur un lien externe, leur navigateur peut envoyer l'adresse du serveur Mastodon en tant qu'adresse d'origine. À désactiver si cela permet d'identifier les utilisateurs, par exemple s'il s'agit d'un serveur Mastodon personnel. + desc: Quand vos utilisateur·rice·s cliquent sur un lien externe, leur navigateur peut envoyer l'adresse de votre serveur Mastodon en tant qu'adresse d'origine. À désactiver si cela permet d'identifier les utilisateur·rice·s, par exemple s'il s'agit d'un serveur Mastodon personnel. title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic appearance: preamble: Personnaliser l'interface web de Mastodon. @@ -906,7 +906,7 @@ fr: destroyed_msg: Téléversement sur le site supprimé avec succès ! software_updates: critical_update: Critique — veuillez mettre à jour au plus vite - description: Il est recommandé de maintenir votre installation de Mastodon à jour afin de bénéficier des derniers correctifs et fonctionnalités. Par ailleurs, il est parfois critique de mettre à jour Mastodon en temps voulu de manière à éviter les incidents relatifs à la sécurité. Pour ces raisons, Mastodon examine la disponibilté des mises à jour toutes les 30 minutes, et vous en avisera en fonction de vos préférences de notification par messagerie électronique. + description: Il est recommandé de maintenir votre installation de Mastodon à jour afin de bénéficier des derniers correctifs et fonctionnalités. Par ailleurs, il est parfois critique de mettre à jour Mastodon rapidement de manière à éviter les incidents relatifs à la sécurité. Pour ces raisons, Mastodon examine la disponibilté des mises à jour toutes les 30 minutes, et vous en avisera en fonction de vos préférences de notification par courriel. documentation_link: En savoir plus release_notes: Notes de mises à jour title: Mises à jour disponibles @@ -1041,18 +1041,18 @@ fr: history: Historique live: En cours d'utilisation no_history: Il n'y a pas encore de modifications enregistrées des conditions d'utilisation. - no_terms_of_service_html: Vous n'avez actuellement aucune condition d'utilisation configurée. Les conditions d'utilisation ont pour but de clarifier les droits et obligations de chacun lors de l'utilisation du service et de vous protéger contre d'éventuelles responsabilités en cas de litige avec vos utilisateurs. - notified_on_html: Utilisateurs notifiés le `%{date}` - notify_users: Notifier les utilisateurs + no_terms_of_service_html: Vous n'avez actuellement aucune condition d'utilisation configurée. Les conditions d'utilisation ont pour but de clarifier les droits et obligations de chacun lors de l'utilisation du service et de vous protéger contre d'éventuelles responsabilités en cas de litige avec vos utilisateur·rice·s. + notified_on_html: Utilisateur·rice·s notifié·e·s le %{date} + notify_users: Notifier les utilisateur·rice·s preview: - explanation_html: 'L''e-mail sera envoyé aux utilisateurs %{display_count} qui se sont inscrits avant %{date}. Le texte suivant sera inclus dans l''e-mail :' + explanation_html: 'Le courriel sera envoyé aux %{display_count} utilisateur·rice·s qui se sont inscrits avant le %{date}. Le texte suivant sera inclus dans le message :' send_preview: Envoyer un aperçu à %{email} send_to_all: - one: Envoyer %{display_count} email - other: Envoyer %{display_count} emails - title: Notification concernant l'aperçu des conditions d'utilisation + one: Envoyer %{display_count} courriel + other: Envoyer %{display_count} courriels + title: Aperçu de la notification des conditions d'utilisation publish: Publier - published_on_html: Publié le %{date} + published_on_html: Publiés le %{date} save_draft: Enregistrer le brouillon title: Conditions d'utilisation title: Administration @@ -1182,11 +1182,11 @@ fr: new_appeal: actions: delete_statuses: effacer les messages - disable: geler le compte + disable: désactiver le compte mark_statuses_as_sensitive: marquer les messages comme sensibles none: un avertissement sensitive: marquer le compte comme sensible - silence: limiter le compte + silence: masquer le compte suspend: suspendre le compte body: "%{target} fait appel de la décision de modération émise par %{action_taken_by} le %{date} et qui était : %{type}. Cette personne a écrit :" next_steps: Vous pouvez approuver l'appel pour annuler la décision de modération, ou l'ignorer. @@ -1234,7 +1234,6 @@ fr: application_mailer: notification_preferences: Modification des préférences de la messagerie salutation: "%{name}," - settings: 'Modifier les préférences de la messagerie : %{link}' unsubscribe: Se désabonner view: 'Voir :' view_profile: Voir le profil @@ -1251,10 +1250,10 @@ fr: apply_for_account: Demander un compte captcha_confirmation: help_html: Si vous avez des problèmes pour résoudre le CAPTCHA, vous pouvez nous contacter via %{email} et nous pourrons vous aider. - hint_html: Encore une chose ! Nous avons besoin de confirmer que vous êtes un humain (c'est pour que nous puissions empêcher les spams !). Résolvez le CAPTCHA ci-dessous et cliquez sur "Continuer". + hint_html: Encore une chose ! Nous avons besoin de confirmer que vous êtes un être humain (c'est pour que nous puissions empêcher les messages indésirables !). Résolvez le CAPTCHA ci-dessous et cliquez sur « Continuer ». title: Vérification de sécurité confirmations: - awaiting_review: Votre adresse de messagerie est confirmée ! L'équipe de %{domain} est en train d'examiner votre inscription. Vous recevrez un e-mail si votre compte est approuvé ! + awaiting_review: Votre adresse de courriel est confirmée ! L'équipe de %{domain} est en train d'examiner votre inscription. Vous recevrez un courriel si votre compte est approuvé ! awaiting_review_title: Votre inscription est en cours de validation clicking_this_link: cliquer sur ce lien login_link: vous connecter @@ -1262,7 +1261,7 @@ fr: redirect_to_app_html: Vous auriez dû être redirigé vers l’application %{app_name}. Si cela ne s’est pas produit, essayez de %{clicking_this_link} ou de revenir manuellement à l’application. registration_complete: Votre inscription sur %{domain} est désormais terminée ! welcome_title: Bienvenue, %{name} ! - wrong_email_hint: Si cette adresse de messagerie est incorrecte, vous pouvez la modifier dans vos paramètres de compte. + wrong_email_hint: Si cette adresse de courriel est incorrecte, vous pouvez la modifier dans vos paramètres de compte. delete_account: Supprimer le compte delete_account_html: Si vous désirez supprimer votre compte, vous pouvez cliquer ici. Il vous sera demandé de confirmer cette action. description: @@ -1278,14 +1277,14 @@ fr: log_in_with: Se connecter via login: Se connecter logout: Se déconnecter - migrate_account: Déménager vers un compte différent + migrate_account: Déménager vers un autre compte migrate_account_html: Si vous voulez rediriger ce compte vers un autre, vous pouvez le configurer ici. - or_log_in_with: Ou authentifiez-vous avec + or_log_in_with: Ou connectez-vous avec progress: - confirm: Confirmation de l'adresse mail + confirm: Confirmer l'adresse de courriel details: Vos infos list: Progression de l'inscription - review: Notre avis + review: Vérification rules: Accepter les règles providers: cas: CAS @@ -1306,10 +1305,10 @@ fr: security: Sécurité set_new_password: Définir le nouveau mot de passe setup: - email_below_hint_html: Consultez votre dossier de courrier indésirable ou demandez-en un autre. Vous pouvez corriger votre adresse e-mail si elle est incorrecte. - email_settings_hint_html: Cliquez sur le lien que nous avons envoyé à %{email} pour commencer à utiliser Mastodon. Nous vous attendrons ici. + email_below_hint_html: Consultez votre dossier de courriels indésirables ou demandez-en un autre. Vous pouvez corriger votre adresse de courriel si elle est incorrecte. + email_settings_hint_html: Cliquer sur le lien envoyé à %{email} pour commencer à utiliser Mastodon. Nous vous attendons ici. link_not_received: Vous n'avez pas reçu de lien ? - new_confirmation_instructions_sent: Vous allez recevoir un nouvel e-mail avec le lien de confirmation dans quelques minutes ! + new_confirmation_instructions_sent: Vous allez recevoir un nouveau courriel avec le lien de confirmation dans quelques minutes ! title: Vérifiez votre boîte de réception sign_in: preamble_html: Connectez-vous avec vos identifiants sur %{domain}. Si votre compte est hébergé sur un autre serveur, vous ne pourrez pas vous connecter ici. @@ -1322,7 +1321,7 @@ fr: account_status: État du compte confirming: En attente de la confirmation par courrier électronique. functional: Votre compte est entièrement opérationnel. - pending: Votre demande est en attente d’examen par notre équipe. Cela peut prendre un certain temps. Vous recevrez un e-mail si votre demande est approuvée. + pending: Votre demande est en attente d’examen par notre équipe. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}. self_destruct: Comme %{domain} est en train de fermer, vous n’aurez qu’un accès limité à votre compte. view_strikes: Voir les sanctions précédemment appliquées à votre compte @@ -1334,7 +1333,7 @@ fr: example_title: Exemple de texte hint_html: Vous écrivez des nouvelles ou des articles de blog en dehors de Mastodon ? Contrôlez la façon dont vous êtes crédité lorsqu'ils sont partagés sur Mastodon. instructions: 'Assurez-vous que ce code se trouve dans le code HTML de votre article :' - more_from_html: Plus via %{name} + more_from_html: Voir plus de %{name} s_blog: Blog de %{name} then_instructions: Ensuite, ajoutez le nom de domaine de la publication dans le champ ci-dessous. title: Attribution de l'auteur·e @@ -1381,9 +1380,9 @@ fr: before: 'Veuillez lire attentivement ces notes avant de continuer :' caches: Le contenu mis en cache par d'autres serveurs peut persister data_removal: Vos messages et autres données seront définitivement supprimés - email_change_html: Vous pouvez modifier votre adresse e-mail sans supprimer votre compte - email_contact_html: S'il ne vous est toujours pas parvenu, vous pouvez envoyer un message à %{email} pour obtenir de l'aide - email_reconfirmation_html: Dans le cas où vous n'auriez pas reçu l'email de confirmation, vous pouvez en réclamer un nouveau + email_change_html: Vous pouvez modifier votre adresse de courriel sans supprimer votre compte + email_contact_html: S'il ne vous est toujours pas parvenu, vous pouvez envoyer un courriel à %{email} pour obtenir de l'aide + email_reconfirmation_html: Si vous ne recevez pas le courriel de confirmation, vous pouvez en réclamer un nouveau irreversible: Vous ne pourrez pas restaurer ou réactiver votre compte more_details_html: Pour plus de détails, voir la politique de confidentialité. username_available: Votre nom d’utilisateur·rice sera à nouveau disponible @@ -1419,9 +1418,42 @@ fr: your_appeal_pending: Vous avez soumis un appel your_appeal_rejected: Votre appel a été rejeté edit_profile: - basic_information: Informations de base - hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + redesign_body: La modification du profil est maintenant accessible directement depuis la page de profil. + redesign_button: Accéder + redesign_title: Nouvelle expérience de modification du profil + email_subscription_mailer: + confirmation: + action: Confirmer l'adresse de courriel + instructions_to_confirm: Veuillez confirmer que vous souhaitez recevoir des courriels de %{name} (@%{acct}) lors de la publication de nouveaux messages. + instructions_to_ignore: Si vous ne savez pas pourquoi vous recevez ce courriel, vous pouvez le supprimer. Vous ne serez pas abonné·e si vous ne cliquez pas sur le lien ci-dessus. + subject: Confirmer votre adresse de courriel + title: Recevoir les notifications par courriel de %{name} ? + notification: + create_account: Créer un compte Mastodon + footer: + privacy_html: Les courriels sont envoyés par %{domain}, un serveur propulsé par Mastodon. Pour comprendre comment ce serveur utilise vos données personnelles, se référer à la politique de confidentialité. + reason_for_email_html: Vous recevez ce courriel car vous avez choisi de recevoir les notifications de %{name}. Vous ne souhaitez pas recevoir ces courriels ? Désabonnez-vous + interact_with_this_post: + one: Interagissez avec ce message pour en découvrir d'autres. + other: Interagissez avec ces messages pour en découvrir plus. + subject: + plural: Nouveaux messages de %{name} + singular: 'Nouveau message : « %{excerpt} »' + title: + plural: Nouveaux messages de %{name} + singular: 'Nouveau message : « %{excerpt} »' + email_subscriptions: + active: Actif + confirmations: + show: + changed_your_mind: Vous avez changé d'avis ? + success_html: Vous allez maintenant commencer à recevoir des courriels quand %{name} publie de nouveaux messages. Ajoutez %{sender} à vos contacts pour que ces messages ne soient pas considérés comme des courriels indésirables. + title: Vous êtes abonné·e + unsubscribe: Se désabonner + inactive: Inactif + status: État + subscribers: Abonné·e·s emoji_styles: auto: Auto native: Natif @@ -1442,7 +1474,7 @@ fr: '503': La page n'a pas pu être servie en raison d'une défaillance temporaire du serveur. noscript_html: Pour utiliser Mastodon, veuillez activer JavaScript. Sinon, essayez l’une des applications natives pour Mastodon pour votre plate-forme. existing_username_validator: - not_found: impossible de trouver un·e utilisateur·ice local·e de ce nom + not_found: impossible de trouver un·e utilisateur·rice local·e de ce nom not_found_multiple: n’a pas trouvé %{usernames} exports: archive_takeout: @@ -1460,10 +1492,8 @@ fr: mutes: Vous masquez storage: Médias stockés featured_tags: - add_new: Ajouter un nouveau hashtag errors: limit: Vous avez déjà mis en avant le nombre maximum de hashtags - hint_html: "Mettez en évidence vos hashtags les plus importants sur votre profil. Un outil idéal pour suivre vos travaux créatifs et vos projets à long terme, les hashtags mis en avant sont affichés bien en évidence sur votre profil et permettent un accès rapide à vos propres messages." filters: contexts: account: Profils @@ -1656,21 +1686,6 @@ fr: failed_sign_in_html: Tentative de connexion échouée avec %{method} de %{ip} (%{browser}) successful_sign_in_html: Connexion réussie avec %{method} de %{ip} (%{browser}) title: Historique d'authentification - mail_subscriptions: - unsubscribe: - action: Oui, se désinscrire - complete: Désinscrit - confirmation_html: Êtes-vous sûr de vouloir vous désabonner de la réception de %{type} pour Mastodon sur %{domain} à votre adresse e-mail %{email} ? Vous pouvez toujours vous réabonner à partir de vos paramètres de notification par messagerie. - emails: - notification_emails: - favourite: e-mails de notifications de favoris - follow: e-mails de notifications d’abonnements - follow_request: e-mails de demandes d’abonnements - mention: e-mails de notifications de mentions - reblog: e-mails de notifications de partages - resubscribe_html: Si vous vous êtes désinscrit par erreur, vous pouvez vous réinscrire à partir de vos paramètres de notification par e-mail. - success_html: Vous ne recevrez plus de %{type} pour Mastodon sur %{domain} à votre adresse e-mail à %{email}. - title: Se désinscrire media_attachments: validations: images_and_video: Impossible de joindre une vidéo à un message contenant déjà des images @@ -1716,6 +1731,25 @@ fr: copy_account_note_text: 'Cet·te utilisateur·rice est parti·e de %{acct}, voici vos notes précédentes à son sujet :' navigation: toggle_menu: Basculer l'affichage du menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} vous a ajouté·e à une collection" + admin_report: + title_html: "%{name} a signalé %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} et un·e autre se sont inscrit·e·s" + other: "%{name} et %{count} autres se sont inscrit·e·s" + title_html: "%{name} s'est inscrit·e" + collection_update: + title_html: "%{name} a mis à jour une collection dans laquelle vous figurez" + generic: + sign_in: Connectez-vous à l'application Web Mastodon + moderation_warning: + title: Vous avez reçu un avertissement de la modération. + severed_relationships: + summary_html: L'équipe d'administration de %{from} a suspendu %{target}, ce qui signifie que vous ne pouvez plus recevoir de notifications de leur part ou interagir avec. %{link} pour récupérer la liste des relations perdues. + title: Connexions perdues avec %{name} notification_mailer: admin: report: @@ -1762,7 +1796,7 @@ fr: subject: "%{name} a modifié un message" notifications: administration_emails: Notifications d'administration par courriel - email_events: Événements pour les notifications par e-mail + email_events: Événements pour les notifications par courriel email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :' number: human: @@ -1808,6 +1842,8 @@ fr: posting_defaults: Paramètres de publication par défaut public_timelines: Fils publics privacy: + email_subscriptions: Envoyer des messages par courriel + email_subscriptions_hint_html: Ajoute un formulaire d'abonnement par courriel à votre profil pour les personnes non connectées. Après avoir validé leur adresse courriel, Mastodon leur enverra des notifications pour vos messages publics. hint_html: "Personnalisez la façon dont votre profil et vos messages peuvent être découverts. Mastodon peut vous aider à atteindre un public plus large lorsque certains paramètres sont activés. Prenez le temps de les examiner pour vous assurer qu’ils sont configurés comme vous le souhaitez." privacy: Confidentialité privacy_hint_html: Contrôler ce que vous souhaitez divulguer. Les utilisateur·rice·s découvrent des profils intéressants en parcourant ceux suivis par d’autres personnes et des applications sympas en voyant celles utilisées pour publier des messages, mais vous préférez peut-être ne pas dévoiler ces informations. @@ -2071,6 +2107,28 @@ fr: resume_app_authorization: Reprendre l'autorisation de l'application role_requirement: "%{domain} nécessite de configurer une authentification à deux facteurs avant de pouvoir utiliser Mastodon." webauthn: Clés de sécurité + unsubscriptions: + create: + action: Aller à la page d'accueil du serveur + email_subscription: + confirmation_html: Vous ne recevrez plus de courriels de %{name}. + title: Vous êtes désabonné·e + user: + confirmation_html: Vous ne recevrez plus de %{type} de Mastodon depuis %{domain}. + notification_emails: + favourite: courriels de notification de mise en favori + follow: courriels de notification d'abonnement + follow_request: courriels de demande d'abonnement + mention: courriels de notification de mention + reblog: courriels de notification de partage + show: + action: Se désabonner + email_subscription: + confirmation_html: Vous ne recevrez plus de courriels quand ce compte publiera de nouveaux messages. + title: Se désabonner de %{name} ? + user: + confirmation_html: Vous ne recevrez plus de %{type} de Mastodon depuis %{domain}. + title: Se désabonner des %{type} ? user_mailer: announcement_published: description: 'Les administrateurs de %{domain} font une annonce :' @@ -2108,8 +2166,8 @@ fr: terms_of_service_changed: agreement: En continuant d'utiliser %{domain}, vous acceptez ces conditions. Si vous n'êtes pas d'accord avec les conditions mises à jour, vous pouvez résilier votre accord avec %{domain} à tout moment en supprimant votre compte. changelog: 'En un coup d''œil, voici ce que cette mise à jour signifie pour vous :' - description: 'Vous recevez cet e-mail parce que nous apportons des modifications à nos conditions de service à %{domain}. Ces modifications entreront en vigueur le %{date}. Nous vous encourageons à consulter l''intégralité des conditions mises à jour ici :' - description_html: Vous recevez cet e-mail parce que nous apportons des modifications à nos conditions de service à %{domain}. Ces mises à jour entreront en vigueur le %{date}. Nous vous encourageons à consulter l'intégralité des conditions mises à jour ici. + description: 'Vous recevez ce courriel parce que nous apportons des modifications à nos conditions de service de %{domain}. Ces modifications entreront en vigueur le %{date}. Nous vous encourageons à consulter l''intégralité des conditions mises à jour ici :' + description_html: Vous recevez ce courriel parce que nous apportons des modifications à nos conditions de service de %{domain}. Ces mises à jour entreront en vigueur le %{date}. Nous vous encourageons à consulter l'intégralité des conditions mises à jour ici. sign_off: L'équipe %{domain} subject: Mises à jour de nos conditions d'utilisation subtitle: Les conditions d'utilisation de `%{domain}` changent @@ -2191,16 +2249,16 @@ fr: invalid_otp_token: Le code d’authentification à deux facteurs est invalide otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email} rate_limited: Trop de tentatives d'authentification, réessayez plus tard. - seamless_external_login: Vous êtes connectés sur un service externe, de fait les paramètres de mot de passe et d'e-mail ne sont pas disponibles. + seamless_external_login: Vous êtes connectés via un service externe, donc les paramètres de mot de passe et de courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' verification: extra_instructions_html: Astuce : Le lien sur votre site Web peut être invisible. La partie importante est rel="me" qui évite que soient pris en compte d’autres liens provenant de contenu générés par des utilisateurs tiers. Vous pouvez même utiliser une balise link dans l’en-tête de la page au lieu de a, mais le HTML doit être accessible sans avoir besoin d’exécuter du JavaScript. - here_is_how: Voici comment - hint_html: "La vérification de son profil sur Mastodon est accessible à tous. Elle s’appuie sur des standards ouverts du web, gratuits aujourd’hui et pour toujours. Tout ce dont vous avez besoin, c’est d’un site web personnel qui vous est associé dans l’esprit des gens. Lorsque vous ajoutez un lien depuis votre profil, nous vérifierons que le site web renvoie à son tour à votre profil Mastodon et montrerons un indicateur visuel à côté du lien si c’est le cas." - instructions_html: Copiez et collez le code ci-dessous dans le code HTML de votre site web. Ajoutez ensuite l’adresse de votre site dans l’un des champs supplémentaires de votre profil à partir de l‘onglet « Modifier le profil » et enregistrez les modifications. + here_is_how: Comment faire ? + hint_html: "La vérification de son profil sur Mastodon est accessible à tous. Elle s’appuie sur des standards ouverts du Web, gratuits aujourd’hui et pour toujours. Tout ce dont vous avez besoin, c’est d’un site Web personnel qui vous est associé. Lorsque vous ajoutez un lien depuis votre profil, nous vérifierons que le site Web renvoie à son tour à votre profil Mastodon et montrerons un indicateur visuel à côté du lien si c’est le cas." + instructions_html: Copiez et collez le code ci-dessous dans le code HTML de votre site Web. Ajoutez ensuite l’adresse de votre site dans l’un des champs supplémentaires de votre profil à partir de l‘onglet « Modifier le profil » et enregistrez les modifications. verification: Vérification verified_links: Vos liens vérifiés - website_verification: Vérification du site web + website_verification: Vérification du site Web webauthn_credentials: add: Ajouter une nouvelle clé de sécurité create: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 4959b1adaa4891..6a1a1e719a3744 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1189,7 +1189,6 @@ fy: application_mailer: notification_preferences: E-mailynstellingen wizigje salutation: "%{name}," - settings: 'E-mailfoarkarren wizigje: %{link}' unsubscribe: Ofmelde view: 'Besjoch:' view_profile: Profyl besjen @@ -1365,8 +1364,6 @@ fy: your_appeal_pending: Jo hawwe in beswier yntsjinne your_appeal_rejected: Jo beswier is ôfwêzen edit_profile: - basic_information: Algemiene ynformaasje - hint_html: "Pas oan wat minsken op jo iepenbiere profyl en njonken jo berjochten sjogge. Oare minsken sille jo earder folgje en mei jo kommunisearje wannear’t jo profyl ynfolle is en jo in profylfoto hawwe." other: Oars emoji_styles: auto: Automatysk @@ -1406,10 +1403,8 @@ fy: mutes: Jo negearje storage: Mediaûnthâld featured_tags: - add_new: Nije tafoegje errors: limit: Jo hawwe al it maksimaal tal hashtags útljochte - hint_html: "Wat binne útljochte hashtags? Dizze wurde prominint op jo iepenbiere profyl toand en stelt minsken yn steat om jo iepenbiere berjochten per hashtag te besjen. It is in goed helpmiddel om kreative wurksumheden of langetermynprojekten by te hâlden." filters: contexts: account: Profilen @@ -1595,21 +1590,6 @@ fy: failed_sign_in_html: Mislearre oanmeldbesykjen mei %{method} fan %{ip} (%{browser}) successful_sign_in_html: Mei sukses oanmeld mei %{method} fan %{ip} (%{browser}) title: Oanmeldskiednis - mail_subscriptions: - unsubscribe: - action: Ja, ôfmelde - complete: Ofmelden - confirmation_html: Binne jo wis dat jo jo ôfmelde wolle foar it ûntfangen fan %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}? Jo kinne jo altyd opnij abonnearje yn jo ynstellingen foar e-mailmeldingen. - emails: - notification_emails: - favourite: e-mailmeldingen foar favoriten - follow: e-mailmeldingen foar nije folgers - follow_request: e-mailmeldingen foar folchfersiken - mention: e-mailmeldingen foar fermeldingen - reblog: e-mailmeldingen foar boosts - resubscribe_html: As jo jo mei fersin ôfmeld hawwe, kinne jo jo opnij abonnearje yn jo ynstellingen foar e-mailmeldingen. - success_html: Jo ûntfange net langer %{type} fan Mastodon op %{domain} op jo e-mailadres %{email}. - title: Ofmelde media_attachments: validations: images_and_video: In fideo kin net oan in berjocht mei ôfbyldingen keppele wurde diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 1295a4efc52b1b..35738a449e7448 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -807,6 +807,7 @@ ga: categories: administration: Riar devops: DevOps + email: Ríomhphost invites: Cuirí moderation: Measarthacht special: Speisialta @@ -838,6 +839,8 @@ ga: 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_email_subscriptions: Bainistigh Síntiúis Ríomhphoist + manage_email_subscriptions_description: Ceadaigh d’úsáideoirí liostáil le húsáideoirí leis an gcead seo trí ríomhphost 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í @@ -1296,7 +1299,6 @@ ga: 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 @@ -1481,9 +1483,45 @@ ga: your_appeal_pending: Chuir tú achomharc isteach your_appeal_rejected: Diúltaíodh do d'achomharc 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 + redesign_body: Is féidir rochtain a fháil ar eagarthóireacht próifíle go díreach ón leathanach próifíle anois. + redesign_button: Téigh ann + redesign_title: Tá taithí nua eagarthóireachta próifíle ann + email_subscription_mailer: + confirmation: + action: Deimhnigh an seoladh ríomhphoist + instructions_to_confirm: Deimhnigh gur mhaith leat ríomhphoist a fháil ó %{name} (@%{acct}) nuair a fhoilsíonn siad poist nua. + instructions_to_ignore: Mura bhfuil tú cinnte cén fáth ar fuair tú an ríomhphost seo, is féidir leat é a scriosadh. Ní bheidh tú síntiúsáilte mura gcliceálann tú ar an nasc thuas. + subject: Deimhnigh do sheoladh ríomhphoist + title: Nuashonruithe ríomhphoist a fháil ó %{name}? + notification: + create_account: Cruthaigh cuntas Mastodon + footer: + privacy_html: Seoltar ríomhphoist ó %{domain}, freastalaí atá faoi thiomáint ag Mastodon. Chun tuiscint a fháil ar an gcaoi a bpróiseálann an freastalaí seo do shonraí pearsanta, féach ar an Polasaí Príobháideachais. + reason_for_email_html: Tá an ríomhphost seo á fháil agat mar gur roghnaigh tú nuashonruithe ríomhphoist a fháil ó %{name}. Nach mian leat na ríomhphoist seo a fháil? Díliostáil + interact_with_this_post: + few: Idirghníomhaigh leis na poist seo agus faigh amach tuilleadh. + many: Idirghníomhaigh leis na poist seo agus faigh amach tuilleadh. + one: Idirghníomhaigh leis an bpost seo agus faigh amach níos mó cosúil leis. + other: Idirghníomhaigh leis na poist seo agus faigh amach tuilleadh. + two: Idirghníomhaigh leis na poist seo agus faigh amach tuilleadh. + subject: + plural: Poist nua ó %{name} + singular: 'Post nua: "%{excerpt}"' + title: + plural: Poist nua ó %{name} + singular: 'Post nua: "%{excerpt}"' + email_subscriptions: + active: Gníomhach + confirmations: + show: + changed_your_mind: Ar athraigh tú d’intinn? + success_html: Tosóidh tú ag fáil ríomhphoist anois nuair a fhoilseoidh %{name} poist nua. Cuir %{sender} le do theagmhálaithe ionas nach gcríochnóidh na poist seo i do fhillteán Turscair. + title: Tá tú cláraithe + unsubscribe: Díliostáil + inactive: Neamhghníomhach + status: Stádas + subscribers: Síntiúsóirí emoji_styles: auto: Uath native: Dúchasach @@ -1522,10 +1560,8 @@ ga: 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í @@ -1778,21 +1814,6 @@ ga: 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íomhphoist fógra is fearr leat - follow: leanúint ríomhphoist fógra - follow_request: lean ríomhphoist iarratais - mention: trácht ar ríomhphoist fógra - reblog: ríomhphoist 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 @@ -1838,6 +1859,28 @@ ga: 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_fallbacks: + added_to_collection: + title_html: Chuir %{name} le bailiúchán thú + admin_report: + title_html: Thuairiscigh %{name} %{target} + admin_sign_up: + title_and_others_html: + few: Chláraigh %{name} agus %{count} eile + many: Chláraigh %{name} agus %{count} eile + one: Chláraigh %{name} agus duine amháin eile + other: Chláraigh %{name} agus %{count} eile + two: Chláraigh %{name} agus %{count} eile + title_html: Chláraigh %{name} + collection_update: + title_html: Nuashonraigh %{name} bailiúchán ina bhfuil tú + generic: + sign_in: Sínigh isteach ar an app gréasáin Mastodon + moderation_warning: + title: Tá rabhadh modhnóireachta faighte agat. + severed_relationships: + summary_html: Chuir riarthóir ó %{from} %{target} ar fionraí, rud a chiallaíonn nach féidir leat nuashonruithe a fháil uathu nó idirghníomhú leo a thuilleadh. %{link} chun liosta de na gaolta caillte a fháil. + title: Caillte ceangail le %{name} notification_mailer: admin: report: @@ -1930,6 +1973,8 @@ ga: posting_defaults: Réamhshocruithe á bpostáil public_timelines: Amlínte poiblí privacy: + email_subscriptions: Seol poist trí ríomhphost + email_subscriptions_hint_html: Cuir foirm chlárúcháin ríomhphoist le do phróifíl a thaispeánfar d’úsáideoirí atá logáilte amach. Nuair a chuireann cuairteoirí a seoladh ríomhphoist isteach agus a roghnaíonn siad isteach, seolfaidh Mastodon nuashonruithe ríomhphoist chugat le haghaidh do phoist phoiblí. 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. @@ -2205,6 +2250,28 @@ ga: resume_app_authorization: Údarú iarratais atosú role_requirement: Éilíonn %{domain} ort Fíordheimhniú Dhá Fhachtóir a shocrú sula bhféadfaidh tú Mastodon a úsáid. webauthn: Eochracha slándála + unsubscriptions: + create: + action: Téigh go dtí leathanach baile an fhreastalaí + email_subscription: + confirmation_html: Ní bhfaighidh tú ríomhphoist ó %{name} a thuilleadh. + title: Tá tú díliostáilte + user: + confirmation_html: Ní bhfaighidh tú %{type} ó Mastodon ar %{domain} a thuilleadh. + notification_emails: + favourite: ríomhphoist fógra is fearr leat + follow: lean ríomhphoist fógra + follow_request: ríomhphoist iarratais leantach + mention: ríomhphoist fógraí tráchta + reblog: ríomhphoist fógraí a threisiú + show: + action: Díliostáil + email_subscription: + confirmation_html: Ní bheidh ríomhphoist á bhfáil agat a thuilleadh nuair a fhoilseoidh an cuntas seo poist nua. + title: Díliostáil ó %{name}? + user: + confirmation_html: Scoirfidh tú de %{type} a fháil ó Mastodon ar %{domain}. + title: Díliostáil ó %{type}? user_mailer: announcement_published: description: 'Tá riarthóirí %{domain} ag déanamh fógra:' diff --git a/config/locales/gd.yml b/config/locales/gd.yml index c619e7818bc0e4..fce328c2b66a2e 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -14,6 +14,11 @@ gd: one: Neach-leantainn other: Luchd-leantainn two: Luchd-leantainn + following: + few: "’Gan leantainn" + one: "’Ga leantainn" + other: "’Gan leantainn" + two: "’Gan leantainn" instance_actor_flash: "’S e actar biortail a tha sa chunntas seo a riochdaicheas am frithealaiche fhèin seach cleachdaiche sònraichte. Tha e ’ga chleachdadh a chùm co-nasgaidh agus cha bu chòir dhut a chur à rèim." last_active: an gnìomh mu dheireadh link_verified_on: Chaidh dearbhadh cò leis a tha an ceangal seo %{date} @@ -57,6 +62,7 @@ gd: label: Atharraich an dreuchd no_role: Gun dreuchd title: Atharraich an dreuchd aig %{username} + collections: Cruinneachaidhean confirm: Dearbh confirmed: Chaidh a dhearbhachadh confirming: "’Ga dhearbhadh" @@ -269,6 +275,7 @@ gd: demote_user_html: Dh’ìslich %{name} an cleachdaiche %{target} destroy_announcement_html: Sguab %{name} às am brath-fios %{target} destroy_canonical_email_block_html: Dhì-bhac %{name} am post-d air a bheil an hais %{target} + destroy_collection_html: Thug %{name} cruinneachadh aig %{target} air falbh destroy_custom_emoji_html: Sguab %{name} às an Emoji %{target} destroy_domain_allow_html: Dì-cheadaich %{name} co-nasgadh leis an àrainn %{target} destroy_domain_block_html: Dì-bhac %{name} an àrainn %{target} @@ -308,6 +315,7 @@ gd: unsilence_account_html: Dì-chuingich %{name} an cunntas aig %{target} unsuspend_account_html: Chuir %{name} an cunntas aig %{target} ann an rèim a-rithist update_announcement_html: Dh’ùraich %{name} am brath-fios %{target} + update_collection_html: Dh’ùraich %{name} cruinneachadh le %{target} 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} @@ -343,6 +351,17 @@ gd: unpublish: Neo-fhoillsich unpublished_msg: Chaidh am brath-fios a dhì-fhoillseachadh! updated_msg: Chaidh am brath-fios ùrachadh! + collections: + accounts: Cunntasan + collection_title: Cruinneachadh le %{name} + contents: Susbaint + number_of_accounts: + few: "%{count} cunntasan" + one: "%{count} chunntas" + other: "%{count} cunntas" + two: "%{count} chunntas" + open: Fosgail + view_publicly: Seall gu poblach critical_update_pending: Ùrachadh èiginneach ri dhèiligeadh custom_emojis: assign_category: Iomruin roinn-seòrsa dha @@ -700,6 +719,7 @@ gd: cancel: Sguir dheth category: Roinn-seòrsa category_description_html: Thèid iomradh a thoirt air adhbhar a’ ghearain mun chunntas/susbaint seo sa chonaltradh leis a’ chunntas mun a chaidh an gearan a thogail + collections: Cruinneachaidhean (%{count}) comment: none: Chan eil gin comment_description_html: 'Airson barrachd fiosrachaidh a sholar, sgrìobh %{name}:' @@ -729,11 +749,13 @@ gd: report: 'Gearan air #%{id}' reported_account: Cunntas mun a chaidh a ghearan reported_by: Chaidh gearan a dhèanamh le + reported_content: Susbaint a’ ghearain 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 status: Staid + statuses: Postaichean (%{count}) statuses_description_html: Thèid iomradh a thoirt air an t-susbaint oilbheumach sa chonaltradh leis a’ chunntas mun a chaidh an gearan a thogail summary: action_preambles: @@ -770,12 +792,13 @@ gd: categories: administration: Rianachd devops: DevOps + email: Post-d invites: Cuiridhean moderation: Maorsainneachd special: Sònraichte delete: Sguab às description_html: Le dreuchdan chleachdaichean, ’s urrainn dhut gnàthachadh dè na gleusan is raointean de Mhastodon as urrainn dha na cleachdaichean agad inntrigeadh. - edit: Deasaich an dreuchd aig “%{name}“ + edit: Deasaich an dreuchd “%{name}“ everyone: Na ceadan bunaiteach everyone_full_description_html: Seo an dreuchd bhunaiteach a bheir buaidh air gach cleachdaiche, fiù an fheadhainn nach deach dreuchd iomruineadh dhaibh. Gheibh a h-uile dreuch ceadan uaipe mar dhìleab. permissions_count: @@ -788,6 +811,8 @@ gd: administrator_description: Chan eil cuingeachadh sam bith air na cleachdaichean aig bheil an cead seo delete_user_data: Sguabadh às dàta cleachdaiche delete_user_data_description: Leigidh seo le cleachdaichean dàta chleachdaichean eile a sguabadh às gun dàil + invite_bypass_approval: Thoir cuireadh do chleachdaichean gun lèirmheas + invite_bypass_approval_description: Leigidh seo leis an fheadhainn a fhuair cuireadh dhan fhrithealaiche leis na cleachdaichean seo dearbhadh na maorsainneachd a leigeil seachad invite_users: Thoir cuireadh do chleachdaichean invite_users_description: Leigidh seo le cleachdaichean cuireadh dhan fhrithealaiche a chur gu daoine eile manage_announcements: Stiùireadh nam brathan-fios @@ -798,6 +823,8 @@ gd: manage_blocks_description: Leigidh seo le cleachdaichean solaraichean puist-d is seòlaidhean IP a bhacadh manage_custom_emojis: Stiùireadh nan Emojis gnàthaichte manage_custom_emojis_description: Leigidh seo le cleachdaichean Emojis gnàthaichte a stiùireadh air an fhrithealaiche + manage_email_subscriptions: Stiùireadh fo-sgrìobhaidhean puist-d + manage_email_subscriptions_description: Leigidh seo le cleachdaichean fo-sgrìobhadh air a’ phost-d a dhèanamh air na cleachdaichean aig a bheil an cead seo manage_federation: Stiùireadh a’ cho-nasgaidh manage_federation_description: Leigidh seo le cleachdaichean an co-nasgadh le àrainnean eile a bhacadh no a cheadachadh agus stiùireadh dè ghabhas lìbhrigeadh manage_invites: Stiùireadh nan cuiridhean @@ -826,6 +853,7 @@ gd: view_devops_description: Leigidh seo le cleachdaichean na deas-bhùird aig Sidekiq is pgHero inntrigeadh view_feeds: Seall loidhnichean-ama beòtha ’s nan cuspairean view_feeds_description: Leigidh seo le cleachdaichean loidhnichean-ama beòtha ’s nan cuspairean inntrigeadh ge b’ e dè roghainnean an fhrithealaiche + requires_2fa: Feumaidh seo dearbhadh dà-cheumnach title: Dreuchdan rules: add_new: Cuir riaghailt ris @@ -1248,7 +1276,6 @@ gd: application_mailer: notification_preferences: Atharraich roghainnean a’ phuist-d salutation: "%{name}," - settings: 'Atharraich roghainnean a’ phuist-d: %{link}' unsubscribe: Cuir crìoch air an fho-sgrìobhadh view: 'Faic:' view_profile: Seall a’ phròifil @@ -1298,6 +1325,7 @@ gd: progress: confirm: Dearbh am post-d details: Am fiosrachadh agad + list: Adhartas a’ chlàraidh review: An lèirmheas againn rules: Gabh ris na riaghailtean providers: @@ -1313,6 +1341,7 @@ gd: invited_by: "’S urrainn dhut ballrachd fhaighinn air %{domain} leis a’ chuireadh a fhuair thu o:" preamble: Tha iad ’gan stèidheachadh is a chur an gnìomh leis na maoir aig %{domain}. preamble_invited: Mus lean thu air adhart, thoir an aire air na riaghailtean a shuidhich na maoir aig %{domain}. + read_more: Leugh an còrr title: Riaghailtean bunasach. title_invited: Fhuair thu cuireadh. security: Tèarainteachd @@ -1431,9 +1460,44 @@ gd: your_appeal_pending: Chuir thu ath-thagradh a-null your_appeal_rejected: Chaidh an t-ath-thagradh agad a dhiùltadh edit_profile: - basic_information: Fiosrachadh bunasach - hint_html: "Gnàthaich na chithear air a’ phròifil phoblach agad is ri taobh nam postaichean agad. Bidh càch nas buailtiche do leantainn agus conaltradh leat nuair a bhios tu air a’ phròifil agad a lìonadh agus dealbh rithe." other: Eile + redesign_body: "’S urrainn dhut a’ phròifil agad a dheasachadh air duilleag na pròifile fhèin." + redesign_button: Tadhail air + redesign_title: Tha dòigh ùr air deasachadh na pròifil againn + email_subscription_mailer: + confirmation: + action: Dearbh an seòladh puist-d + instructions_to_confirm: Dearbh gum bu mhiann leat puist-d fhaighinn o %{name} (@%{acct}) nuair a dh’fhoillsicheas iad postaichean ùra. + instructions_to_ignore: Mur eil thu cinnteach carson a fhuair thu am post-d seo, ’s urrainn dhut a sguabadh às. Cha dèid d’ fho-sgrìobhadh mura bhriog thu air a’ cheangal gu h-àrd. + subject: Dearbh an seòladh puist-d agad + title: A bheil thu airson naidheachdan %{name} fhaighinn air a’ phost-d? + notification: + create_account: Cruthaich cunntas Mastodon + footer: + privacy_html: Thèid puist-d a chur o %{domain}, seo frithealaiche le cumhachd Mhastodon. Airson tuigsinn mar a nì am frithealaiche seo pròiseasadh air an dàta phearsanta agad, faic am poileasaidh prìobhaideachd. + reason_for_email_html: Fhuair thu am post-d seo on a chuir thu romhad naidheachdan %{name} fhaighinn air a’ phost-d. Nach eil thu airson na puist-d seo fhaighinn? Cuir crìoch air an fho-sgrìobhadh + interact_with_this_post: + few: Dèan conaltradh leis na puist seo is lorg barrachd coltach riutha. + one: Dèan conaltradh leis a’ phost seo is lorg barrachd coltach ris. + other: Dèan conaltradh leis na puist seo is lorg barrachd coltach riutha. + two: Dèan conaltradh leis na puist seo is lorg barrachd coltach riutha. + subject: + plural: Postaichean ùra o %{name} + singular: 'Post ùr: “%{excerpt}”' + title: + plural: Postaichean ùra o %{name} + singular: 'Post ùr: “%{excerpt}”' + email_subscriptions: + active: Gnìomhach + confirmations: + show: + changed_your_mind: Na chuir thu romhad a chaochladh? + success_html: Gheibh thu puist-d a-nis nuair a dh’fhoillsicheas %{name} postaichean ùra. Cuir %{sender} ris an luchd-aithne agad ach nach dèid na postaichean seo a chur do phasgan an spama agad. + title: Tha thu air clàradh + unsubscribe: Cuir crìoch air an fho-sgrìobhadh + inactive: Neo-ghnìomhach + status: Staid + subscribers: Fo-sgrìobhaichean emoji_styles: auto: Fèin-obrachail native: Tùsail @@ -1472,10 +1536,8 @@ gd: mutes: Tha thu a’ mùchadh storage: Stòras mheadhanan featured_tags: - add_new: Cuir fear ùr ris errors: limit: Bhrosnaich thu an uiread as motha de thagaichean hais mu thràth - hint_html: "Brosnaich na tagaichean hais as cudromaiche agad air a’ phròifil agad. ’S e deagh-acainn a th’ annta airson sùil a chumail air an obair chruthachail no na pròiseactan fada agad on a thèid na tagaichean hais brosnaichte a shealltainn gu follaiseach air a’ phròifil agad agus ’s urrainnear na postaichean agad inntrigeadh gu luath leotha." filters: contexts: account: Pròifilean @@ -1708,21 +1770,6 @@ gd: failed_sign_in_html: Oidhirp clàraidh a-steach nach deach leis le %{method} o %{ip} (%{browser}) successful_sign_in_html: Oidhirp clàraidh a-steach a shoirbhich leis le %{method} o %{ip} (%{browser}) title: Eachdraidh an dearbhaidh - mail_subscriptions: - unsubscribe: - action: Tha, cuir crìoch air an fho-sgrìobhadh - complete: Chaidh crìoch a chur air an fho-sgrìobhadh - confirmation_html: A bheil thu cinnteach nach eil thu airson %{type} fhaighinn tuilleadh o Mhastodon air %{domain} dhan post-d agad aig %{email}? ’S urrainn dhut fo-sgrìobhadh a-rithist uair sam bith o roghainnean a’ puist-d agad. - emails: - notification_emails: - favourite: puist-d le brathan mu annsachdan - follow: puist-d le brathan mu leantainn - follow_request: puist-d le brathan mu iarrtasan leantainn - mention: puist-d le brathan mu iomraidhean - reblog: puist-d le brathan mu bhrosnachaidhean - resubscribe_html: Ma chuir thu crìoch air an fho-sgrìobhadh le mearachd, ’s urrainn dhut fo-sgrìobhadh a-rithist o roghainnean a’ puist-d agad. - success_html: Chan fhaigh thu %{type} o Mhastodon air %{domain} dhan phost-d agad aig %{email} tuilleadh. - title: Cuir crìoch air an fho-sgrìobhadh media_attachments: validations: images_and_video: Chan urrainn dhut video a cheangal ri post sa bheil dealbh mu thràth @@ -1860,6 +1907,8 @@ gd: posting_defaults: Bun-roghainnean a’ phostaidh public_timelines: Loidhnichean-ama poblach privacy: + email_subscriptions: Cuir postaichean air a’ phost-d + email_subscriptions_hint_html: Cuir foirm clàradh puist-d ris a’ phròifil agad a nochdas do chleachdaichean nach do rinn clàradh a-steach. Nuair a chuireas aoighean an seòladh puist-d aca a-steach is ma ghabhas iad ris, cuiridh Mastodon naidheachdan mu na postaichean poblach agad thuca air a’ phost-d. hint_html: "Gnàthaich an dòigh air an dèid a’ phròifil ’s na postaichean agad a lorg. Tha grunn ghleusan aig Mastodon a chuidicheas ach an ruig thu èisteachd nas fharsainge nuair a bhios iad an comas. Thoir sùil air na roghainnean seo a dhèanamh cinnteach gum freagair iad ri d’ fheumalachdan." privacy: Prìobhaideachd privacy_hint_html: Stiùirich na tha thu airson foillseachadh do chàch. Gheibh daoine lorg air pròifilean inntinneach is deagh aplacaidean a’ brabhsadh cò tha daoine eile a’ leantainn ’s a’ faicinn nan aplacaidean a chleachdas iad airson postadh ach dh’fhaoidte gum b’ fheàrr leat seo a chumail falaichte. @@ -2102,6 +2151,8 @@ gd: past_preamble_html: Dh’atharraich sinn teirmichean na seirbheise againn on turas mu dheireadh a thadhail thu oirnn. Mholamaid gun dèan thu lèirmheas air na teirmichean ùra. review_link: Dèan lèirmheas air teirmichean na seirbheise title: Tha teirmichean na seirbheise aig %{domain} gu bhith atharrachadh + themes: + default: Mastodon time: formats: default: "%d %b %Y, %H:%M" @@ -2126,7 +2177,31 @@ gd: recovery_codes: Còdan aiseig ’nan lethbhreac-glèidhidh recovery_codes_regenerated: Chaidh na còdan aiseig ath-ghintinn recovery_instructions_html: Ma chailleas tu an t-inntrigeadh dhan fhòn agad, ’s urrainn dhut fear dhe na còdan aisig gu h-ìosal a chleachdadh airson faighinn a-steach dhan chunntas agad a-rithist. Cùm na còdan aisig sàbhailte. Mar eisimpleir, ’s urrainn dhut an clò-bhualadh ’s a chumail far a bheil thu a’ cumail na sgrìobhainnean cudromach eile agad. + resume_app_authorization: Lean air ùghdarrachadh na h-aplacaid + role_requirement: Tha %{domain} ag iarraidh gun suidhich thu dearbhadh dà-cheumnach mus cleachd thu Mastodon. webauthn: Iuchraichean tèarainteachd + unsubscriptions: + create: + action: Tadhail air duilleag-dhachaigh an fhrithealaiche + email_subscription: + confirmation_html: Chan fhaigh thu post-d o %{name} tuilleadh. + title: Chaidh crìoch a chur air an fho-sgrìobhadh agad + user: + confirmation_html: Chan fhaigh thu %{type} o Mhastodon air %{domain} tuilleadh. + notification_emails: + favourite: puist-d le brathan mu annsachdan + follow: puist-d le brathan mu leantainn + follow_request: puist-d le brathan mu iarrtasan leantainn + mention: puist-d le brathan mu iomraidhean + reblog: puist-d le brathan mu bhrosnachaidhean + show: + action: Cuir crìoch air an fho-sgrìobhadh + email_subscription: + confirmation_html: Chan fhaigh thu post-d tuilleadh nuair a dh’fhoillsicheas an cunntas seo postaichean ùra. + title: A bheil thu airson crìoch a chur air an fho-sgrìobhadh agad air %{name}? + user: + confirmation_html: Chan fhaigh thu %{type} o Mhastodon air %{domain} tuilleadh. + title: A bheil thu airson crìoch a chur air an fho-sgrìobhadh agad air %{type}? user_mailer: announcement_published: description: 'Tha na rianairean aig %{domain} a’ dèanamh brath-fios:' diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 469f7badd70c8a..e27b4b27cbd5d2 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -562,7 +562,7 @@ gl: confirm_purge: Tes a certeza de querer eliminar permanentemente os datos deste dominio? content_policies: comment: Nota interna - description_html: Podes definir políticas acerca do contido que serán aplicadas a tódalas contas deste dominio e tódolos seus subdominios. + description_html: Podes definir políticas sobre o contido que serán aplicadas a todas as contas de este dominio e todos os seus subdominios. limited_federation_mode_description_html: Podes escoller se permites ou non a federación con este dominio. policies: reject_media: Rexeitar multimedia @@ -762,6 +762,7 @@ gl: categories: administration: Administración devops: DevOps + email: Correo electrónico invites: Convites moderation: Moderación special: Especial @@ -790,6 +791,8 @@ gl: manage_blocks_description: Permite que as usuarias bloqueen provedoras de correo e enderezos IP manage_custom_emojis: Xestionar Emojis personalizados manage_custom_emojis_description: Permite xestionar os emojis personalizados do servidor + manage_email_subscriptions: Xestionar subscripcións por correo + manage_email_subscriptions_description: Permitir que as usuarias se subscriban por correo a outras usuarias con este permiso manage_federation: Xestionar a federación manage_federation_description: Permite bloquear ou permitir a federación con outros dominios, e controlar as entregas manage_invites: Xestionar Convites @@ -1231,7 +1234,6 @@ gl: application_mailer: notification_preferences: Cambiar preferencias de correo salutation: "%{name}," - settings: 'Cambiar preferencias de correo: %{link}' unsubscribe: Anular subscrición view: 'Vista:' view_profile: Ver perfil @@ -1416,9 +1418,42 @@ gl: your_appeal_pending: Enviaches unha apelación your_appeal_rejected: A apelación foi rexeitada edit_profile: - basic_information: Información básica - hint_html: "Personaliza o que van ver no teu perfil público e ao lado das túas publicacións. As outras persoas estarán máis animadas a seguirte e interactuar contigo se engades algún dato sobre ti así como unha imaxe de perfil." other: Outros + redesign_body: Agora podes acceder á edición do perfil directamente desde a páxina do perfil. + redesign_button: Ir á edición + redesign_title: Hai novidades no xeito en que podes editar o perfil + email_subscription_mailer: + confirmation: + action: Confirmar enderezo de correo + instructions_to_confirm: Confirma que queres recibir correos de %{name} (@%{acct}) cando publique novas publicacións. + instructions_to_ignore: Se non sabes por que recibiches este correo, podes eliminalo. Non te vas subscribir se non premes na ligazón de arriba. + subject: Confirma o teu enderezo de correo + title: Queres obter actualizacións de %{name} por correo? + notification: + create_account: Crear unha conta Mastodon + footer: + privacy_html: Os correos envíanse desde %{domain}, un servidor de Mastodon. Para comprender como este servidor procesa os teus datos persoais le a Directiva de Privacidade. + reason_for_email_html: Recibes este correo porque te subscribiches para recibir actualizacións por correo de %{name}. Non queres recibir estes correos? Retira a subscrición + interact_with_this_post: + one: Interactúa con esta publicación e descubre máis coma ela. + other: Interactúa con estas publicacións e descubre máis coma elas. + subject: + plural: Novas publicacións de %{name} + singular: 'Nova publicación: "%{excerpt}"' + title: + plural: Novas publicacións de %{name} + singular: 'Nova publicación: "%{excerpt}"' + email_subscriptions: + active: Activa + confirmations: + show: + changed_your_mind: Cambiaches de idea? + success_html: Vas comezar a recibir correos cando %{name} publique novas publicacións. Engade %{sender} á túa libreta de enderezos para que os correos non vaian directamente ao cartafol de Spam. + title: Subscribícheste + unsubscribe: Anular subscrición + inactive: Inactiva + status: Estado + subscribers: Subscritoras emoji_styles: auto: Auto native: Nativo @@ -1457,10 +1492,8 @@ gl: mutes: Silenciadas storage: Almacenamento de multimedia featured_tags: - add_new: Engadir novo errors: limit: Xa sinalaches o número máximo de cancelos permitido - hint_html: "¿Qué son os cancelos destacados? Móstranse destacados no teu perfil público e permítenlle a outras persoas ver os teus toots públicos nos que os utilizaches. Son unha ferramenta moi útil para facer seguimento de traballos creativos e proxectos a longo prazo." filters: contexts: account: Perfís @@ -1653,21 +1686,6 @@ gl: failed_sign_in_html: Intento de acceso errado con %{method} desde %{ip} (%{browser}) successful_sign_in_html: Acceso correcto con %{method} desde %{ip} (%{browser}) title: Historial de autenticación - mail_subscriptions: - unsubscribe: - action: Si, retirar subscrición - complete: Subscrición anulada - confirmation_html: Tes a certeza de querer retirar a subscrición a Mastodon en %{domain} para recibir %{type} no teu correo electrónico en %{email}? Poderás volver a subscribirte desde os axustes de notificacións por correo. - emails: - notification_emails: - favourite: notificacións de favorecidas - follow: notificacións de seguimentos - follow_request: notificacións de solicitudes de seguimento - mention: notificacións de mencións - reblog: notificacións de promocións - resubscribe_html: Se por un erro eliminaches a subscrición, podes volver a subscribirte desde os axustes de notificacións por correo electrónico. - success_html: Non vas recibir %{type} de Mastodon en %{domain} no enderezo %{email}. - title: Anular subscrición media_attachments: validations: images_and_video: Non podes anexar un vídeo a unha publicación que xa contén imaxes @@ -1713,6 +1731,27 @@ gl: copy_account_note_text: 'Esta usuaria chegou desde %{acct}, aquí están as túas notas previas acerca dela:' navigation: toggle_menu: Activa o menú + notification_fallbacks: + added_to_collection: + title_html: "%{name} engadíute a unha colección" + admin_report: + title_html: "%{name} denunciou a %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} e outra persoa crearon a conta" + other: "%{name} e outras %{count} persoas crearon a conta" + title_html: "%{name} creou a conta" + collection_update: + title_html: "%{name} actualizou unha colección da que es parte" + generic: + sign_in: Accede na aplicación web de Mastodon + summary_html: Estás a usar unha app que non é compatible coa versión máis recente de Mastodon %{link} para obter todas as funcións. + moderation_warning: + summary_html: Estás a usar unha app que non é compatible coa versión máis recente de Mastodon. %{link}. + title: Recibiches unha advertencia da moderación. + severed_relationships: + summary_html: A administración de %{from} suspendeu a %{target}, o que significa que non vas recibir actualizacións dese servidor nin poder interactuar coas súas usuarias. %{link} para obter unha lista das relacións perdidas. + title: Relacións perdidas con %{name} notification_mailer: admin: report: @@ -1805,6 +1844,8 @@ gl: posting_defaults: Valores por defecto public_timelines: Cronoloxías públicas privacy: + email_subscriptions: Enviar publicacións por coreo + email_subscriptions_hint_html: Engade un formulario de subscrición por correo para mostrar ás usuarias sen sesión iniciada. Ao escribir o seu enderezo de correo e así indicalo, Mastodon vaille enviar actualizacións por correo das túas publicacións públicas. hint_html: "Personaliza o xeito no que queres que se atope o teu perfil e publicacións. Mastodon ten variedade de ferramentas para axudarche a acadar unha audiencia maior. Dedica un minuto a revisalas e confirma que se axustan ao teu caso persoal." privacy: Privacidade privacy_hint_html: Controla canto queres mostrar ás demais persoas. As usuarias descubren perfís interesantes e apps estupendas mirando a quen seguen outras persoas e vendo as apps desde as que publican, pero ti poderías querer non mostralas. @@ -2068,6 +2109,28 @@ gl: resume_app_authorization: Retomar autorización da aplicación role_requirement: "%{domain} require que configures un Segundo Factor de Autenticación para poder usar Mastodon" webauthn: Chaves de seguridade + unsubscriptions: + create: + action: Ir á páxina de inicio do servidor + email_subscription: + confirmation_html: Xa non vas seguir recibindo correos desde %{name}. + title: Retiraches a subscrición + user: + confirmation_html: Non vas recibir %{type} de Mastodon en %{domain}. + notification_emails: + favourite: correos de notificación de favorecementos + follow: correos de notificación de seguimentos + follow_request: correos de solicitudes de seguimento + mention: correos de notificación de mencións + reblog: correos de notificación de promocións + show: + action: Anular subscrición + email_subscription: + confirmation_html: Vas deixar de recibir correos cando esta conta publique novas publicacións. + title: Dar de baixa a subscrición a %{name}? + user: + confirmation_html: Vas deixar de recibir %{type} de Mastodon en %{domain}. + title: Dar de baixa a subscrición a %{type}? user_mailer: announcement_published: description: A administración de %{domain} publicou un anuncio diff --git a/config/locales/he.yml b/config/locales/he.yml index d18d44689da282..b340e2d446419a 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -792,6 +792,7 @@ he: categories: administration: ניהול מערכת devops: DevOps + email: דוא״ל invites: הזמנות moderation: ניהול דיון special: מיוחדים @@ -822,6 +823,8 @@ he: manage_blocks_description: מאפשר למשתמשים לחסום ספקי דוא"ל וכתובות IP manage_custom_emojis: ניהול סמלונים בהתאמה אישית manage_custom_emojis_description: מאפשר למשתמשים לנהל סמלונים בהתאמה אישית של השרת + manage_email_subscriptions: ניהול הרשמות דוא"ל + manage_email_subscriptions_description: לאפשר למשתמשיםות להרשים למשתמשיםות ע"י הרשאה בדוא"ל manage_federation: ניהול פדרציה manage_federation_description: מאפשר למשתמשים לחסום או לאפשר התממשקות עם שמות מתחם אחרים manage_invites: ניהול הזמנות @@ -1273,7 +1276,6 @@ he: application_mailer: notification_preferences: שינוי העדפות דוא"ל salutation: "%{name}," - settings: 'שינוי הגדרות דוא"ל: %{link}' unsubscribe: בטל מנוי view: 'תצוגה:' view_profile: צפיה בפרופיל @@ -1458,9 +1460,44 @@ he: your_appeal_pending: הגשת ערעור your_appeal_rejected: ערעורך נדחה edit_profile: - basic_information: מידע בסיסי - hint_html: "התאמה אישית של מה שיראו אחרים בפרופיל הציבורי שלך וליד הודעותיך. אחרים עשויים יותר להחזיר עוקב וליצור אתך שיחה אם הפרופיל והתמונה יהיו מלאים." other: אחר + redesign_body: ניתן להגיע לעריכת הפרופיל ישירות מעמוד הפרופיל. + redesign_button: לך לשם + redesign_title: מעתה מוצעת חוויית עריכת פרופיל חדשה + email_subscription_mailer: + confirmation: + action: אישור כתובת דוא"ל + instructions_to_confirm: נא אשרו שתרצו לקבל דוא"ל מ%{name} (@%{acct}) כאשר הם מפרסמים הודעות חדשות. + instructions_to_ignore: אם אינך בטוח.ה מדוע קיבלת את הודעת הדוא"ל הזו, היו חופשיים למוחקה. לא תרשמו אם לא תלחצו על הקישור לעיל. + subject: אמתו את כתובת האימייל שלכם + title: לקבל הודעות דוא"ל מ%{name}? + notification: + create_account: יצירת חשבון מסטודון + footer: + privacy_html: דוא"ל ישלח מ- %{domain}, שרת הפועל על מסטודון. כדי להבין כיצד שרת זה מנהל את המידע האישי שלך, יש לפנות של מדיניות הפרטיוות. + reason_for_email_html: קיבלתם הודעת דוא"ל זו כי ביקשתם לקבל עידכונים מאת %{name}. אין ברצונכן לקבל הודעות אלו? ביטול הרשמה + interact_with_this_post: + many: תקשרו עם ההודעות הללו כדי לגלות עוד כמוהן. + one: תקשרו עם ההודעה הזו כדי לגלות עוד כמוה. + other: תקשרו עם ההודעות הללו כדי לגלות עוד כמוהן. + two: תקשרו עם ההודעות הללו כדי לגלות עוד כמוהן. + subject: + plural: הודעות חדשות מאת %{name} + singular: 'הודעה חדשה: "%{excerpt}"' + title: + plural: הודעות חדשות מאת %{name} + singular: 'הודעה חדשה: "%{excerpt}"' + email_subscriptions: + active: פעילים + confirmations: + show: + changed_your_mind: שיניתם את דעתכם? + success_html: מעתה תקבלנה דוא"ל כאשר %{name} יפרסמו הודעות חדשות. הוספנה את %{sender} לאנשי הקשר כדי שההודעות האלו לא יגיעו אל פח הספאם שלכן. + title: נרשמת + unsubscribe: ביטול ההרשמה + inactive: לא פעילים + status: מצב + subscribers: מנויים emoji_styles: auto: אוטומטי native: מקומי @@ -1499,10 +1536,8 @@ he: mutes: רשימת השתקות storage: אחסון מדיה featured_tags: - add_new: הוספת חדש errors: limit: הצגת כבר את המספר המירבי של תגיות נבחרות - hint_html: "מהן תגיות נבחרות? הן מוצגות במובלט בפרופיל הפומבי שלך ומאפשר לאנשים לעיין בהודעות הפומביות שלך המסומנות בתגיות אלה. הן כלי אדיר למעקב אחר עבודות יצירה ופרוייקטים לטווח ארוך." filters: contexts: account: פרופילים @@ -1735,21 +1770,6 @@ he: failed_sign_in_html: נסיון כניסה כושל בשיטת %{method} מכתובת %{ip} (%{browser}) successful_sign_in_html: נסיון כניסה מוצלח בשיטה %{method} מכתובת %{ip} (%{browser}) title: הסטוריית אימותים - mail_subscriptions: - unsubscribe: - action: כן, לבטל הרשמה - complete: הפסקת הרשמה - confirmation_html: יש לאשר את ביטול ההרשמה להודעות %{type} ממסטודון בשרת %{domain} לכתובת הדואל %{email}. תמיד אפשר להרשם מחדש בכיוונוני הודעות דואל. - emails: - notification_emails: - favourite: הודעות דואל לגבי חיבובים - follow: הודעות דואל לגבי עוקבים חדשים - follow_request: הודעות דואל לגבי בקשות מעקב - mention: הודעות דואל לגבי איזכורים - reblog: הודעות דואל לגבי הידהודים - resubscribe_html: אם ביטול ההרשמה היה בטעות, ניתן להרשם מחדש מתוך מסך הגדרות ההרשמה שלך. - success_html: לא יגיעו אליך יותר הודעות %{type} משרת מסטודון %{domain} לכתובת הדואל %{email}. - title: הפסקת הרשמה media_attachments: validations: images_and_video: לא ניתן להוסיף וידאו להודעה שכבר מכילה תמונות @@ -1795,6 +1815,29 @@ he: copy_account_note_text: 'חשבון זה הועבר מ-%{acct}, הנה הערותיך הקודמות לגביהם:' navigation: toggle_menu: הצגת\הסתרת תפריט + notification_fallbacks: + added_to_collection: + title_html: "%{name} הוסיפו אותך לאוסף" + admin_report: + title_html: "%{name} דיווח.ה על %{target}" + admin_sign_up: + title_and_others_html: + many: "%{name} ועוד %{count} נרשמו" + one: "%{name} ועוד אחד נרשמו" + other: "%{name} ועוד %{count} נרשמו" + two: "%{name} ועוד שניים נרשמו" + title_html: "%{name} נרשמו" + collection_update: + title_html: "%{name} עדכנו אוסף הכולל אותך" + generic: + sign_in: התחברו ליישומון הווב של מסטודון + summary_html: אתם משתמשים ביישומון שאינו תומך בגרסא העדכנית של מסטודון. %{link} כדי לקבל את מלוא השמישות. + moderation_warning: + summary_html: אתם משתמשים ביישומון שאינו תומך בגרסא העדכנית של מסטודון. %{link}. + title: קיבלת אזהרת מנהל. + severed_relationships: + summary_html: מנהל מאתר %{from} הקפיא את %{target}, כלומר לא תוכלו לקבל יותר עדכונים מהם או להתכתב איתם. %{link} כדי לקבל רשימת מערכות יחסים שאבדו. + title: הקשר אבד עם %{name} notification_mailer: admin: report: @@ -1887,6 +1930,8 @@ he: posting_defaults: ברירות מחדל בפרסום public_timelines: פידים פומביים privacy: + email_subscriptions: שליחת הודעות בדוא"ל + email_subscriptions_hint_html: הוסיפו רישום בדוא"ל לפרופיל שלכן שיופיע גם למשתמשים שאינם מחוברים. כאשר מבקרים יכניסו את כתובת הדוא"ל ויאשרו, מסטודון ישלח להם עדכוני דוא"ל על ההודעות הציבוריות שלכן. hint_html: "ניתן להתאים את הצורה שבה תירצו שיראו את פרופיל המשתמש וההודעות שלכם. מגוון אפשרויות במסטודון יכולות לעזור לכם להיחשף לקהל רחב יותר כאשר תפעילו אותן. הקדישו רגע לבדוק את ההגדרות הללו כדי לוודא שהן מתאימות לכם." privacy: פרטיות privacy_hint_html: הגדירו כמה תרצו לחשוף עצמכם לאחרים. משתמשים מגלים משתמשים מעניינים ואפליקציות מגניבות על ידי דפדוף ב-"מעקבים" של משתמשים אחרים ורואים מאילו אפליקציות הם מפרסמים, אבל אולי תעדיפו להסתיר את המידע הזה מפני אחרים. @@ -2158,6 +2203,28 @@ he: resume_app_authorization: חזרה לאישור יישומון role_requirement: "%{domain} דורש ממך להקים הזדהות בשני גורמים לפני שתוכלו להשתמש במסטודון." webauthn: מפתחות אבטחה + unsubscriptions: + create: + action: מעבר לעמוד הבית של השרת + email_subscription: + confirmation_html: לא תקבלו יותר הודעות דןא"ל מאת %{name}. + title: ביטלת את ההרשמה + user: + confirmation_html: לא תקבלו יותר %{type} ממסטודון על %{domain}. + notification_emails: + favourite: הודעות דואל לגבי חיבובים + follow: הודעות דואל לגבי עוקבים חדשים + follow_request: הודעות דואל לגבי בקשות מעקב + mention: הודעות דואל לגבי איזכורים + reblog: הודעות דואל לגבי הידהודים + show: + action: ביטול ההרשמה + email_subscription: + confirmation_html: לא תקבלו יותר דואל כשחשבון זה יפרסם הודעות חדשות. + title: לבטל הרשמה אל %{name}? + user: + confirmation_html: לא תקבלו יותר %{type} ממסטודון על %{domain}. + title: לבטל הרשמה אל %{type}? user_mailer: announcement_published: description: 'צוות ההנהלה של %{domain} מפרסם הודעה:' @@ -2286,7 +2353,7 @@ he: extra_instructions_html: טיפ: הלינק באתר שלך יכול להיות מוסתר. החלק החשוב הוא rel="me" שמונע התחזות על אתרים עם תוכן משתמשים. ניתן גם ליצור תגית link בכותרת העמוד במקום קישור a אבל קוד ה־HTML חייב להופיע שם ללא הרצה של ג'אווהסקריפט. here_is_how: זה נעשה כך hint_html: "אשרור זהותך במסטודון הוא לטובת כולם. על בסיס תקני ווב פתוחים, חינם מעתה ולעד. כל שדרוש הוא אתר אישי שבו אנשים מזהים אותך דרכו. כשתקשרו מהאתר הזה לפרופיל שלך פה, אנו נבדוק באתר קישורים לפרופיל ונציין זאת בסימן בולט כזהות בדוקה." - instructions_html: יש להדביק את הקוד שלמטה אל האתר שלך. ואז להוסיף את כתובת האתר לאחד השדות הנוספים בפרופיל מתוך טאב "עריכת פרופיל" ולשמור את השינויים. + instructions_html: יש להדביק את הקוד שלמטה אל האתר שלך. ואז להוסיף את כתובת האתר לאחד השדות הנוספים בפרופיל מתוך כרטיסיית "עריכת פרופיל" ולשמור את השינויים. verification: אימות verified_links: קישוריך המאומתים website_verification: אימות אתר רשת diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 09e904525dbb34..ef0048347542f1 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -100,8 +100,6 @@ hr: less_than_x_seconds: Upravo sada over_x_years: "%{count}god" x_months: "%{count}mj" - edit_profile: - basic_information: Osnovne informacije exports: archive_takeout: date: Datum @@ -111,8 +109,6 @@ hr: blocks: Blokirali ste lists: Liste storage: Pohrana medijskih sadržaja - featured_tags: - add_new: Dodaj novi filters: contexts: notifications: Obavijesti diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 8bce2ee5297803..fdf584155ef1f1 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -447,7 +447,7 @@ hu: create: Tiltás létrehozása hint: A domain tiltása nem gátolja meg az új fiókok hozzáadását az abatbázishoz, de visszamenőlegesen és automatikusan aktivál bizonyos moderációs szabályokat ezen fiókok esetében. severity: - desc_html: A Korlátozás elrejti a domain fiókjaitól származó bejegyzéseket azok elől, akik nem követik őket. A Felfüggesztés eltávolítja a domain fiókjaitól származó összes tartalmat, médiafájlt és profiladatot. Használd a Nincs lehetőséget, ha csak a médiafájlokat akarod elutasítani. + desc_html: A Korlátozás elrejti a domain fiókjaitól származó bejegyzéseket azok elől, akik nem követik őket. A Felfüggesztés eltávolítja a domain fiókjaitól származó összes tartalmat, médiafájlt és profiladatot. Használd a Nincs lehetőséget, ha csak a médiafájlokat akarod elutasítani. noop: Egyik sem silence: Korlátozás suspend: Felfüggesztés @@ -675,7 +675,7 @@ hu: mark_as_sensitive_description_html: A bejelentett bejegyzések médaitartalmait érzékenynek jelöljük, és rögzítünk egy vétséget, hogy segítsük az eszkalációt a fiók későbbi kihágásai esetén. other_description_html: További lehetőségek megjelenítése a fiók viselkedésének szabályozásához, és a jelentett fiók kommunikációjának testreszabásához. resolve_description_html: Nem csinálunk semmit a bejelentett fiókkal, nem jegyzünk fel vétséget, és bezárjuk a bejelentést. - silence_description_html: A profil csak azok számára lesz látható, akik már követik, vagy kézzel rákeresnek, jelentősen korlátozva annak elérését. Ez a művelet bármikor visszafordítható. A fiókkal szemben indított minden bejelentést lezárunk. + silence_description_html: A profil csak azok számára lesz látható, akik már követik, vagy kézileg rákeresnek, ezzel jelentősen korlátozva az elérését. Ez a művelet bármikor visszafordítható. A fiókkal szemben indított minden bejelentést lezár. suspend_description_html: A fiók és minden tartalma elérhetetlenné válik és végül törlésre kerül. A fiókkal kapcsolatbalépni lehetetlen lesz. Ez a művelet 30 napig visszafordítható. A fiók ellen indított minden bejelentést lezárunk. actions_description_html: Döntsd el, mit csináljunk, hogy megoldjuk ezt a bejelentést. Ha valamilyen büntető intézkedést hozol a bejelentett fiók ellen, küldünk neki egy figyelmeztetést e-mailben, kivéve ha a Spam kategóriát választod. actions_description_remote_html: Döntsd el, mit tegyünk a bejelentés lezárásának érdekében. Ez csak azt befolyásolja, hogy a saját kiszolgálód hogyan kommunikál ezzel a távoli fiókkal és hogyan kezeli annak tartalmait. @@ -738,7 +738,7 @@ hu: actions: delete_html: Sértő bejegyzések eltávolítása mark_as_sensitive_html: Sértő bejegyzések médiatartalmainak érzékenyként történő megjelölése - silence_html: "@%{acct} fiók elérésének jelentős korlátozása azzal, hogy ennek profilja és tartalmai csak olyanoknak legyen látható, akik követik vagy manuálisan rákeresnek" + silence_html: A(z) @%{acct} fiók elérésének jelentős korlátozása azáltal, hogy a profilja és a tartalmai csak azoknak lesz látható, akik követik vagy kézileg rákeresnek suspend_html: "@%{acct} felfüggesztése a profil és tartalmainak elérhetetlenné tételével, a fiókkal való interakció ellehetetlenítésével" close_report: 'Bejelentés #%{id} megjelölése megoldottként' close_reports_html: "Minden @%{acct} ellen tett bejelentés megjelölése megoldottként" @@ -762,6 +762,7 @@ hu: categories: administration: Adminisztráció devops: DevOps + email: E-mail-cím invites: Meghívások moderation: Moderáció special: Speciális @@ -778,6 +779,8 @@ hu: administrator_description: A felhasználók ezzel a szereppel minden jogosultsággal rendelkeznek delete_user_data: Felhasználói adatok törlése delete_user_data_description: Lehetővé teszi a felhasználónak, hogy azonnal törölhesse más felhasználó adatait + invite_bypass_approval: Felhasználók meghívása ellenőrzés nélkül + invite_bypass_approval_description: Lehetővé teszi, hogy úgy hívjanak meg embereket a kiszolgálóra, hogy ezek a felhasználók kikerüljék a moderátori jóváhagyást invite_users: Felhasználók meghívása invite_users_description: Lehetővé teszi a felhasználónak, hogy új embereket hívjon meg a kiszolgálóra manage_announcements: Hirdetmények kezelése @@ -788,6 +791,8 @@ hu: manage_blocks_description: Lehetővé teszi, hogy a felhasználók e-mail-szolgáltatókat és IP-címeket tiltsanak le manage_custom_emojis: Egyedi emodzsik kezelése manage_custom_emojis_description: Lehetővé teszi a felhasználó számára, hogy a kiszolgáló egyéni emodzsiait kezelje + manage_email_subscriptions: E-mail-feliratkozások kezelése + manage_email_subscriptions_description: Engedélyezés, hogy a felhasználók e-maillel feliratkozzanak az ilyen jogosultságú felhasználókra manage_federation: Föderáció kezelése manage_federation_description: Lehetővé teszi a felhasználó számára, hogy más domainnekkel való föderációt engedélyezzen vagy letiltson, illetve szabályozza a kézbesítést manage_invites: Meghívások kezelése @@ -1229,7 +1234,6 @@ hu: application_mailer: notification_preferences: E-mail-beállítások módosítása salutation: "%{name}!" - settings: 'E-mail-beállítások módosítása: %{link}' unsubscribe: Leiratkozás view: 'Megtekintés:' view_profile: Profil megtekintése @@ -1414,9 +1418,42 @@ hu: your_appeal_pending: Beküldtél egy fellebbezést your_appeal_rejected: A fellebbezésedet visszautasították edit_profile: - basic_information: Általános információk - hint_html: "Tedd egyedivé, mi látnak mások a profilodon és a bejegyzéseid mellett. Mások nagyobb eséllyel követnek vissza és lépnek veled kapcsolatba, ha van kitöltött profilod és profilképed." other: Egyéb + redesign_body: A profil szerkesztése most már közvetlenül elérhető a profiloldalon. + redesign_button: Ugrás oda + redesign_title: Az új profilszerkesztési élmény + email_subscription_mailer: + confirmation: + action: E-mail-cím megerősítése + instructions_to_confirm: Erősítsd meg, hogy e-mailt szeretnél kapni %{name} (@%{acct}) új bejegyzéseiről. + instructions_to_ignore: Ha nem tudod, hogy miért kaptad ezt az e-mailt, akkor törölheted. Ha nem kattint a fenti hivatkozásra, akkor nem lesz automatikusan feliratkoztatva. + subject: E-mail-cím megerősítése + title: Fogadod %{name} e-mailes híreit? + notification: + create_account: Mastodon-fiók létrehozása + footer: + privacy_html: 'Az e-mailek innen lesznek küldve: %{domain}, egy Mastodon-kiszolgálóról. Hogy megértsd, hogy ez a kiszolgáló hogyan dolgozza fel a személyes adataidat, nézd meg az Adatvédelmi szabályzatot.' + reason_for_email_html: Azért kapod ezt az e-mailt, mert kérted, hogy e-mailben megkapd %{name} bejegyzéseit. Nem akarod megkapni ezeket a leveleket? Leiratkozás + interact_with_this_post: + one: Interakció ezzel a bejegyzéssel, és hasonlóak felfedezése. + other: Interakció ezekkel a bejegyzéssel, és hasonlóak felfedezése. + subject: + plural: 'Új bejegyzések tőle: %{name}' + singular: 'Új bejegyzés: „%{excerpt}”' + title: + plural: 'Új bejegyzések tőle: %{name}' + singular: 'Új bejegyzés: „%{excerpt}”' + email_subscriptions: + active: Aktív + confirmations: + show: + changed_your_mind: Meggondoltad magad? + success_html: Mostantól levelet fogsz kapni, ha %{name} új bejegyzést tesz közzé. Add hozzá a feladót (%{sender}) a névjegyeidhez, hogy ne kerüljön a Levélszemét mappádba. + title: Feliratkoztál + unsubscribe: Leiratkozás + inactive: Inaktív + status: Állapot + subscribers: Feliratkozók emoji_styles: auto: Automatikus native: Natív @@ -1455,10 +1492,8 @@ hu: mutes: Némítás storage: Médiatároló featured_tags: - add_new: Új hozzáadása errors: limit: Elérted a maximálisan kitűzhető hashtagek számát - hint_html: "Mik a kiemelt hashtagek? Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó bejegyzéseidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére." filters: contexts: account: Profil @@ -1651,21 +1686,6 @@ hu: failed_sign_in_html: Bejelentkezés meghiúsult ezzel %{method} innen %{ip} (%{browser}) successful_sign_in_html: Sikeres bejelentkezés ezzel %{method} innen %{ip} (%{browser}) title: Hitelesítési történet - mail_subscriptions: - unsubscribe: - action: Igen, leiratkozás - complete: Leiratkozva - confirmation_html: 'Biztos, hogy leiratkozol arról, hogy %{type} típusú üzeneteket kapj a(z) %{domain} Mastodon-kiszolgálótól erre a címedre: %{email}? Bármikor újra feliratkozhatsz az e-mail-értesítési beállításokban.' - emails: - notification_emails: - favourite: kedvencnek jelölés értesítő e-mailjei - follow: követés értesítő e-mailjei - follow_request: követési kérések e-mailjei - mention: megemlítés értesítő e-mailjei - reblog: megtolás értesítő e-mailjei - resubscribe_html: Ha tévedésből iratkoztál le, újra feliratkozhatsz az e-mail-értesítési beállításoknál. - success_html: 'Mostantól nem kapsz %{type} típusú üzeneket a(z) %{domain} Mastodon-kiszolgálón erre a címedre: %{email}.' - title: Leiratkozás media_attachments: validations: images_and_video: Nem csatolhatsz videót olyan bejegyzéshez, amelyhez már csatoltál képet @@ -1711,6 +1731,27 @@ hu: copy_account_note_text: 'Ez a fiók elköltözött innen: %{acct}, itt vannak az előző megjegyzéseid róla:' navigation: toggle_menu: Menü be/ki + notification_fallbacks: + added_to_collection: + title_html: "%{name} hozzáadott egy gyűjteményhez" + admin_report: + title_html: "%{name} jelentette: %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} és még egy felhasználó feliratkozott" + other: "%{name} és még %{count} felhasználó feliratkozott" + title_html: "%{name} feliratkozott" + collection_update: + title_html: "%{name} frissített egy gyűjteményt, amelyben szerepelsz" + generic: + sign_in: Jelentkezz be a Mastodon webalkalmazásba + summary_html: Olyan alkalmazást használsz, amely nem támogatja a Mastodon legfrissebb verzióját. %{link} a teljes funkcionalitáshoz. + moderation_warning: + summary_html: Olyan alkalmazást használsz, amely nem támogatja a Mastodon legfrissebb verzióját. %{link}. + title: Moderációs figyelmeztetést kaptál. + severed_relationships: + summary_html: 'A(z) %{from} egy rendszergazdája felfüggesztette ezt: %{target}, ez azt jelenti, hogy többé nem kapsz értesítést onnan, és nem tudsz interakcióba lépni velük. %{link} az elveszett kapcsolatok felsorolásáért.' + title: 'Elvesztek a kapcsolatok vele: %{name}' notification_mailer: admin: report: @@ -1803,6 +1844,8 @@ hu: posting_defaults: Bejegyzések alapértelmezései public_timelines: Nyilvános idővonalak privacy: + email_subscriptions: Bejegyzések küldése e-mailben + email_subscriptions_hint_html: E-mailes regisztrációs űrlap hozzáadása a profilodhoz, amely a kijelentkezett felhasználóknak jelenik meg. Ha a látogátok beírják az e-mail-címüket és kérik, akkor a Mastodon e-maileket fog írni a nyilvános bejegyzéseidről. hint_html: "Testreszabható a profil és a bejegyzések megjelenése. A Mastodon számos funkciója segíthet szélesebb közönség elérésében, ha engedélyezve van. Szánj egy percet a beállítások áttekintésére, hogy megbizonyosodj arról, hogy ezek megfelelnek a te felhasználási esetednek." privacy: Adatvédelem privacy_hint_html: Szabályozd, hogy mások számára miket szeretnél nyilvánosságra hozni. Az emberek érdekes profilokat és nagyszerű alkalmazásokat fedezhetnek fel, amikor böngésznek mások követései között és látják, hogy mely alkalmazásokból tesznek közzé bejegyzéseket, de az is lehet, hogy inkább elrejtenéd ezeket az infókat. @@ -2066,6 +2109,28 @@ hu: resume_app_authorization: Alkalmazás jogosultság-ellenőrzésének folytatása role_requirement: A(z) %{domain} megköveteli a kétlépcsős hitelesítés beállítása a Mastodon használata előtt. webauthn: Biztonsági kulcsok + unsubscriptions: + create: + action: Ugrás a kiszolgáló kezdőlapjára + email_subscription: + confirmation_html: 'Már nem fogsz leveleket kapni róla: %{name}.' + title: Leiratkoztál + user: + confirmation_html: 'Már nem fogsz %{type}et kapni a Mastodontól innnen: %{domain}.' + notification_emails: + favourite: kedvencnek jelölésről szóló értesítő levelek + follow: követésről szóló értesítő levelek + follow_request: követési kérésekről szóló értesítő levelek + mention: megemlítésről szóló értesítő levelek + reblog: megtolásról szóló értesítő levelek + show: + action: Leiratkozás + email_subscription: + confirmation_html: Nem fogsz többé leveleket kapni, ha ez a fiók új bejegyzéseket tesz közzé. + title: 'Leiratkozol róla: %{name}?' + user: + confirmation_html: 'Már nem fogsz %{type}et kapni a Mastodontól innnen: %{domain}.' + title: Leiratkozol a %{type}ről? user_mailer: announcement_published: description: 'A(z) %{domain} adminisztrátorai a következő bejelentést teszik:' diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 5e4b9a87089add..1f869c66728cd7 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -534,8 +534,6 @@ hy: lists: Ցանկեր mutes: Լռեցրել ես storage: Մեդիա պահոց - featured_tags: - add_new: Աւելացնել նորը filters: contexts: account: Պրոֆիլներ diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 3fea1ed91cf258..c5afddfab0ca4d 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -1207,7 +1207,6 @@ ia: application_mailer: notification_preferences: Cambiar preferentias de e-mail salutation: "%{name}," - settings: 'Cambiar preferentias de e-mail: %{link}' unsubscribe: Cancellar subscription view: 'Visita:' view_profile: Vider profilo @@ -1383,8 +1382,6 @@ ia: your_appeal_pending: Tu ha submittite un appello your_appeal_rejected: Tu appello ha essite rejectate edit_profile: - basic_information: Information basic - hint_html: "Personalisa lo que le personas vide sur tu profilo public e presso tu messages. Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo complete e un photo." other: Alteres emoji_styles: auto: Automatic @@ -1424,10 +1421,8 @@ ia: mutes: Tu ha silentiate storage: Immagazinage multimedial featured_tags: - add_new: Adder nove errors: limit: Tu ha jam mittite in evidentia le maxime numero de hashtags - hint_html: "Monstra tu plus importante hashtags sur tu profilo. Un excellente instrumento pro tener tracia de tu labores creative e projectos de longe termino, le hashtags que tu mitte in evidentia appare prominentemente sur tu profilo e permitte le accesso rapide a tu proprie messages." filters: contexts: account: Profilos @@ -1620,21 +1615,6 @@ ia: failed_sign_in_html: Tentativa de authentication fallite con %{method} ab %{ip} (%{browser}) successful_sign_in_html: Apertura de session succedite con %{method} desde %{ip} (%{browser}) title: Historia de authentication - mail_subscriptions: - unsubscribe: - action: Si, cancellar subscription - complete: Desubscribite - confirmation_html: Es tu secur de voler cancellar le subscription al %{type} de Mastodon sur %{domain} pro tu adresse de e-mail %{email}? Tu pote sempre resubscriber te a partir del parametros de notification in e-mail. - emails: - notification_emails: - favourite: notificationes de favorites in e-mail - follow: notificationes de sequimento in e-mail - follow_request: requestas de sequimento in e-mail - mention: notificationes de mentiones in e-mail - reblog: notificationes de impulsos in e-mail - resubscribe_html: Si tu ha cancellate le subscription in error, tu pote resubscriber te a partir del parametros de notification in e-mail. - success_html: Tu non recipera plus %{type} pro Mastodon sur %{domain} a tu adresse de e-mail %{email}. - title: Desubcriber media_attachments: validations: images_and_video: Impossibile annexar un video a un message que jam contine imagines diff --git a/config/locales/id.yml b/config/locales/id.yml index d3027934b73a7b..57dcfb360c11f2 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1022,9 +1022,6 @@ id: lists: Daftar mutes: Anda bisukan storage: Penyimpanan media - featured_tags: - add_new: Tambah baru - hint_html: "Apa itu tagar yang diunggulkan? Mereka ditampilkan secara mencolok di profil publik Anda dan mengizinkan orang-orang untuk menjelajahi kiriman publik khususnya yang ada di bawah tagar tersebut. Mereka adalah alat yang bagus untuk melacak pekerjaan kreatif atau proyek jangka panjang." filters: contexts: account: Profil @@ -1218,7 +1215,7 @@ id: billion: M million: Jt quadrillion: Kdt - thousand: Rb + thousand: rb trillion: T otp_authentication: code_hint: Masukkan kode yang dibuat oleh aplikasi autentikator sebagai konfirmasi diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 157650444489de..2ffc1f72942408 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1141,8 +1141,6 @@ ie: your_appeal_pending: Tu ha fat un apelle your_appeal_rejected: Tui apelle ha esset rejectet edit_profile: - basic_information: Basic information - hint_html: "Customisa ti quel gente vide sur tui public profil e apu tui postas. Altri persones es plu probabil sequer te e interacter con te si tu have un detalliat profil e un profil-image." other: Altri errors: '400': Li demande quel tu inviat esset ínvalid o misformat. @@ -1178,10 +1176,8 @@ ie: mutes: Tu silentia storage: Inmagasination de medie featured_tags: - add_new: Adjunter un nov errors: limit: Tu ja ha pinglat li maxim númere de hashtags - hint_html: "Pinglar tui max important hashtags sur tui profil. Un bonissim maniere de mantener un registre de tui ovres e projectes, pinglat hashtags es monstrat prominentmen sur tui profil e permisse rapid accesse a tui propri postas." filters: contexts: account: Profiles @@ -1328,11 +1324,6 @@ ie: failed_sign_in_html: Fallit prova de apertion de session per %{method} de %{ip} (%{browser}) successful_sign_in_html: Successosi apertion de session per %{method} de %{ip} (%{browser}) title: Historie de autentication - mail_subscriptions: - unsubscribe: - action: Yes, desabonnar - complete: Desabonnat - title: Desabonnar media_attachments: validations: images_and_video: On ne posse atachar un video a un posta quel ja contene images diff --git a/config/locales/io.yml b/config/locales/io.yml index 58ae0f015d24e0..3edfc5c011caf7 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1104,7 +1104,6 @@ io: application_mailer: notification_preferences: Chanjar retpostopreferaji salutation: "%{name}," - settings: 'Chanjar retpostopreferaji: %{link}' unsubscribe: Desabonez view: 'Vidar:' view_profile: Videz profilo @@ -1276,8 +1275,6 @@ io: your_appeal_pending: Vu sendis apelo your_appeal_rejected: Vua apelo refuzesis edit_profile: - basic_information: Fundamentala informo - hint_html: "Personesigez quon personi vidas sur vua publika profilo e apud vua afishi.." other: Altra errors: '400': Demando quon vu sendis esas nevalida o malstrukturala. @@ -1312,10 +1309,8 @@ io: mutes: Vu silencigesas storage: Audvidajkonservo featured_tags: - add_new: Adjuntar novo errors: limit: Vu ja pinglizis la maxima nombro de hastagi - hint_html: "Quo esas estelita hashtagi? Ol montresas eminente che vua publika profilo e povigas personi vidar vua publika posti partikulare kun ta hashtagi. Oli esas bona utensilo por jeretar kreiva agaji e longa projetaji." filters: contexts: account: Profili @@ -1461,11 +1456,6 @@ io: failed_sign_in_html: Falita enirprob per %{method} de %{ip} (%{browser}) successful_sign_in_html: Sucesoza eniro per %{method} de %{ip} (%{browser}) title: Yurizeshistorio - mail_subscriptions: - unsubscribe: - action: Yes, desabonez - complete: Desabonita - title: Desabonez media_attachments: validations: images_and_video: Ne povas addonar video ad afisho qua ja enhavas imaji diff --git a/config/locales/is.yml b/config/locales/is.yml index 1ea18a39d4ba16..8d82adf06154a5 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -679,7 +679,7 @@ is: suspend_description_html: Notandaaðgangurinn og allt efni á honum mun verða óaðgengilegt og á endanum eytt út og samskipti við aðganginn verða ekki möguleg. Hægt að afturkalla innan 30 daga. Lokar öllum kærum gagnvart þessum aðgangi. actions_description_html: Ákveddu til hvaða aðgerða eigi að taka til að leysa þessa kæru. Ef þú ákveður að refsa kærða notandaaðgangnum, verður viðkomandi send tilkynning í tölvupósti, nema ef flokkurinn Ruslpóstur sé valinn. actions_description_remote_html: Ákveddu til hvaða aðgerða eigi að taka til að leysa þessa kæru. Þetta mun aðeins hafa áhrif á hvernig netþjónninn þinn meðhöndlar þennan fjartengda aðgang og efnið á honum. - actions_no_posts: Þessi kæra er ekki með neinar tengdar færslur til að eyða + actions_no_posts: Þessi tilkynning er ekki með neinar tengdar færslur til að eyða add_to_report: Bæta fleiru í kæru already_suspended_badges: local: Þegar frystur á þessum netþjóni @@ -762,6 +762,7 @@ is: categories: administration: Stjórnun devops: DevOps + email: Tölvupóstur invites: Boðsgestir moderation: Umsjón special: Sérstakt @@ -790,6 +791,8 @@ is: manage_blocks_description: Leyfir notendum að loka á tölvupóstþjónustur og IP-vistföng manage_custom_emojis: Sýsla með sérsniðin lyndistákn manage_custom_emojis_description: Leyfir notendum að sýsla með sérsniðin lyndistákn á netþjóninum + manage_email_subscriptions: Sýsla með tölvupóstáskriftir + manage_email_subscriptions_description: Leyfa notendum að gerast áskrifendur að tölvupósti frá notendum með þessa heimild manage_federation: Sýsla með netþjónasambönd manage_federation_description: Leyfir notendum að loka á eða leyfa samþættingu við önnur lén (federation) og stýra afhendingu skilaboða manage_invites: Sýsla með boðsgesti @@ -881,7 +884,7 @@ is: public: Allir landing_page: values: - about: Um hugbúnaðinn + about: Um local_feed: Staðbundið streymi trends: Vinsælt registrations: @@ -1233,7 +1236,6 @@ is: application_mailer: notification_preferences: Breyta kjörstillingum tölvupósts salutation: "%{name}," - settings: 'Breyta kjörstillingum tölvupósts: %{link}' unsubscribe: Taka úr áskrift view: 'Skoða:' view_profile: Skoða notandasnið @@ -1420,9 +1422,42 @@ is: your_appeal_pending: Þú hefur sent inn áfrýjun your_appeal_rejected: Áfrýjun þinni hefur verið hafnað edit_profile: - basic_information: Grunnupplýsingar - hint_html: "Sérsníddu hvað fólk sér á opinbera notandasniðinu þínu og næst færslunum þínum. Annað fólk er líklegra til að fylgjast með þér og eiga í samskiptum við þig ef þú fyllir út notandasniðið og setur auðkennismynd." other: Annað + redesign_body: Núna er hægt að breyta notandasíðunni sinni beint á þeirri síðu. + redesign_button: Fara þangað + redesign_title: Núna er ný aðferð við að breyta notandasíðunni sinni + email_subscription_mailer: + confirmation: + action: Staðfestu tölvupóstfangið + instructions_to_confirm: Staðfestu að þú viljir fá tölvupósta frá %{name} (@%{acct}) þegar viðkomandi birtir nýjar færslur. + instructions_to_ignore: Ef þú ert ekki viss af hverju þú fékkst þennan tölvupóst, þá geturðu eytt honum. Þú verður ekki áskrifandi nema ef þú smellir á tengilinn hér fyrir ofan. + subject: Staðfestu tölvupóstfangið þitt + title: Fá tilkynningar í tölvupósti frá %{name}? + notification: + create_account: Búa til nýjan Mastodon-aðgang + footer: + privacy_html: Tölvupóstar eru sendir frá %{domain}, netþjóni sem keyrir Mastodon. Til að sjá hvernig þessi netþjónn vinnur með persónuleg gögn þín, Þá ættirðu að skoða Meðferð persónuupplýsinga. + reason_for_email_html: Þú færð þennan tölvupóst vegna þess að þú skráðir þig til að fá pósta með færslum frá %{name}. Viltu ekki fá þessar póstsendingar? Hættu í áskrift + interact_with_this_post: + one: Eigðu í samskiptum við þessa færslu og finndu fleiri í sama dúr. + other: Eigðu í samskiptum við þessar færslur og finndu fleiri í sama dúr. + subject: + plural: Nýjar færslur frá %{name} + singular: 'Ný færsla: "%{excerpt}"' + title: + plural: Nýjar færslur frá %{name} + singular: 'Ný færsla: "%{excerpt}"' + email_subscriptions: + active: Virkur + confirmations: + show: + changed_your_mind: Skiptirðu um skoðun? + success_html: Þú munt núna fara að fá tölvupósta þegar %{name} birtir nýjar færslur. Bættu %{sender} í tengiliðina þína svo þessir póstar lendi ekki í ruslpóstmöppunni þinni. + title: Þú hefur skráð þig + unsubscribe: Hætta í áskrift + inactive: Óvirkur + status: Staða + subscribers: Áskrifendur emoji_styles: auto: Sjálfvirkt native: Innbyggt @@ -1436,7 +1471,7 @@ is: '422': content: Öryggisprófun mistókst. Ertu að loka á vefkökur/fótspor? title: Öryggisprófun mistókst - '429': Í hægagangi + '429': Of margar beiðnir '500': content: Því miður, en eitthvað fór úrskeiðis á okkar enda. title: Þessi síða er ekki rétt @@ -1461,10 +1496,8 @@ is: mutes: Þú þaggar storage: Geymsla myndefnis featured_tags: - add_new: Bæta við nýju errors: limit: Þú hefur þegar gefið hámarksfjölda myllumerkja aukið vægi - hint_html: "Hvað eru myllumerki með aukið vægi? Þau eru birt áberandi á opinbera notandasniðinu þínu og gera fólki kleift að fletta í gegnum opinberu færslurnar þínar sérstaklega undir þessum myllumerkjum. Þau eru frábær aðferð við að halda utan um skapandi vinnu eða langtíma verkefni." filters: contexts: account: Notandasnið @@ -1657,21 +1690,6 @@ is: failed_sign_in_html: Misheppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) successful_sign_in_html: Vel heppnuð tilraun til innskráningar með %{method} frá %{ip} (%{browser}) title: Auðkenningarferill - mail_subscriptions: - unsubscribe: - action: Já, hætta í áskrift - complete: Hætta í áskrift - confirmation_html: Ertu viss um að þú viljir hætta áskrift sendinga á %{type} fyrir Mastodon á %{domain} til póstfangsins þíns %{email}? Þú getur alltaf aftur gerst áskrifandi í stillingunum fyrir tilkynningar í tölvupósti. - emails: - notification_emails: - favourite: tilkynningum í tölvupósti um eftirlæti - follow: tilkynningum í tölvupósti um fylgjendur - follow_request: tilkynningum í tölvupósti um beiðnir um að fylgjast með - mention: tilkynningum í tölvupósti um tilvísanir - reblog: tilkynningum í tölvupósti um endurbirtingar - resubscribe_html: Ef þú hættir áskrift fyrir mistök, geturðu alltaf aftur gerst áskrifandi í stillingunum fyrir tilkynningar í tölvupósti. - success_html: Þú munt ekki lengur fá sendingar með %{type} fyrir Mastodon á %{domain} á póstfangið þitt %{email}. - title: Taka úr áskrift media_attachments: validations: images_and_video: Ekki er hægt að hengja myndskeið við færslu sem þegar inniheldur myndir @@ -1717,6 +1735,27 @@ is: copy_account_note_text: 'Þessi notandi fluttist frá %{acct}, hér eru fyrri minnispunktar þínir um hann:' navigation: toggle_menu: Víxla valmynd af/á + notification_fallbacks: + added_to_collection: + title_html: "%{name} bætti þér í safn" + admin_report: + title_html: "%{name} kærði %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} og einn í viðbót skráðu sig" + other: "%{name} og %{count} í viðbót skráðu sig" + title_html: "%{name} nýskráði sig" + collection_update: + title_html: "%{name} uppfærði safn sem þú ert í" + generic: + sign_in: Skráðu þig inn á Mastodon-vefforritið + summary_html: Þú ert að nota forrit sem styður ekki nýjustu útgáfuna af Mastodon. %{link} til að fá alla eiginleikana. + moderation_warning: + summary_html: Þú ert að nota forrit sem styður ekki nýjustu útgáfuna af Mastodon. %{link}. + title: Þú hefur fengið aðvörun frá umsjónarmanni. + severed_relationships: + summary_html: Stjórnandi á %{from} hefur sett %{target} í frysti, sem þýðir að þú getur ekki lengur fengið upplýsingar frá eða átt í samskiptum við viðkomandi. %{link} til að ná í lista yfir þau tengsl sem hafa rofnað. + title: Missti tengingar við %{name} notification_mailer: admin: report: @@ -1809,6 +1848,8 @@ is: posting_defaults: Sjálfgefin gildi við gerð færslna public_timelines: Opinberar tímalínur privacy: + email_subscriptions: Senda færslur með tölvupósti + email_subscriptions_hint_html: Bættu áskriftarformi fyrir tölvupóst á notandasíðuna þína sem birtist fyrir notendur sem ekki eru skráðir inn. Þegar gestir setja inn tölvupóstfangið sitt og skrá sig í áskrift, mun Mastodon senda út tilkynningar um opinberar færslur þínar. hint_html: "Sérsníddu hvernig þú vilt að finna megi notandasnið þitt og færslur. Ýmsir eiginleikar í Mastodon geta hjálpað þér að ná til breiðari áheyrendahóps, séu þeir virkjaðir. Taktu þér tíma til að yfirfara þessar stillingar svo að þær henti þér." privacy: Gagnaleynd privacy_hint_html: Stýrðu því hve miklar upplýsingar þú birtir sem gætu gagnast öðrum. Fólk uppgötvar áhugaverða notendur og sniðug forrit með því að skoða hvað annað fólk fylgist með og hvaða forrit það notar til að birta færslur, en hinsvegar er þér frjálst að halda þessu leyndu. @@ -2072,6 +2113,28 @@ is: resume_app_authorization: Halda áfram með auðkenningu forrits role_requirement: "%{domain} krefst þess að þú setjir upp tveggja-þátta auðkenningu áður en þú getur notað Mastodon." webauthn: Öryggislyklar + unsubscriptions: + create: + action: Fara á heimasíðu netþjónsins + email_subscription: + confirmation_html: Þú munt ekki lengur fá tölvupósta frá %{name}. + title: Þú hefur sagt upp áskrift + user: + confirmation_html: Þú munt ekki lengur fá %{type} frá Mastodon á %{domain}. + notification_emails: + favourite: tölvupóst um eftirlæti + follow: tölvupóst um fylgjendur + follow_request: tölvupóst um fylgjendabeiðnir + mention: tölvupóst um tilvísanir í þig + reblog: tölvupóst um endurbirtingar + show: + action: Hætta í áskrift + email_subscription: + confirmation_html: Þú munt ekki lengur fá tölvupóst þegar þessi aðili birtir nýjar færslur. + title: Afpanta áskrift að %{name}? + user: + confirmation_html: Þú munt ekki lengur fá %{type} frá Mastodon á %{domain}. + title: Afpanta áskrift að %{type}? user_mailer: announcement_published: description: 'Stjórnendur %{domain} eru að senda frá sér yfirlýsingu:' diff --git a/config/locales/it.yml b/config/locales/it.yml index e01bed8b978a2f..92ed0fb6d00ebc 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -762,6 +762,7 @@ it: categories: administration: Amministrazione devops: DevOps + email: Email invites: Inviti moderation: Moderazione special: Speciale @@ -790,6 +791,8 @@ it: manage_blocks_description: Consente agli utenti di bloccare i provider di posta elettronica e gli indirizzi IP manage_custom_emojis: Gestisci emoji personalizzate manage_custom_emojis_description: Consente agli utenti di gestire emoji personalizzate sul server + manage_email_subscriptions: Gestisci le iscrizioni via email + manage_email_subscriptions_description: Consenti agli utenti di iscriversi tramite email agli utenti, con questa autorizzazione manage_federation: Gestisci Federazione manage_federation_description: Consente agli utenti di bloccare o consentire la federazione con altri domini e controllare la consegnabilità manage_invites: Gestisci Inviti @@ -1231,7 +1234,6 @@ it: application_mailer: notification_preferences: Modifica le preferenze e-mail salutation: "%{name}," - settings: 'Modifica le preferenze e-mail: %{link}' unsubscribe: Disiscriviti view: 'Guarda:' view_profile: Mostra profilo @@ -1416,9 +1418,42 @@ it: your_appeal_pending: Hai presentato un appello your_appeal_rejected: Il tuo appello è stato respinto edit_profile: - basic_information: Informazioni di base - hint_html: "Personalizza ciò che le persone vedono sul tuo profilo pubblico e accanto ai tuoi post. È più probabile che altre persone ti seguano e interagiscano con te quando hai un profilo compilato e un'immagine del profilo." other: Altro + redesign_body: Ora è possibile modificare il profilo direttamente dalla pagina del profilo stesso. + redesign_button: Vai lì + redesign_title: È disponibile una nuova esperienza di modifica del profilo + email_subscription_mailer: + confirmation: + action: Conferma l'indirizzo email + instructions_to_confirm: Conferma di voler ricevere email da %{name} (@%{acct}) quando pubblicano nuovi post. + instructions_to_ignore: Se non sai perché hai ricevuto questa email, puoi cancellarla. L'iscrizione non sarà confermata se non clicchi sul link qui sopra. + subject: Conferma il tuo indirizzo email + title: Ricevere aggiornamenti via email da %{name}? + notification: + create_account: Crea un account Mastodon + footer: + privacy_html: Le email vengono inviate da %{domain}, un server gestito da Mastodon. Per comprendere come questo server elabora i tuoi dati personali, consulta l'Informativa sulla privacy. + reason_for_email_html: Ricevi questa email perché hai scelto di ottenere aggiornamenti via email da %{name}. Non vuoi più ricevere queste email? Disiscriviti + interact_with_this_post: + one: Interagisci con questo post e scopri altri contenuti simili. + other: Interagisci con questi post e scopri di più. + subject: + plural: Nuovi post da %{name} + singular: 'Un nuovo post: "%{excerpt}"' + title: + plural: Nuovi post da %{name} + singular: 'Un nuovo post: "%{excerpt}"' + email_subscriptions: + active: Attiva + confirmations: + show: + changed_your_mind: Hai cambiato idea? + success_html: Ora inizierai a ricevere email quando %{name} pubblicherà nuovi post. Aggiungi %{sender} ai tuoi contatti in modo che questi post non finiscano nella cartella Spam. + title: Ti sei registrato/a + unsubscribe: Disiscriviti + inactive: Inattiva + status: Stato + subscribers: Iscritti emoji_styles: auto: Automatico native: Nativo @@ -1457,10 +1492,8 @@ it: mutes: Stai silenziando storage: Archiviazione media featured_tags: - add_new: Aggiungi nuovo errors: limit: Hai già messo in evidenza il numero massimo di hashtag - hint_html: "Cosa sono gli hashtag in evidenza? Sono visualizzati in evidenza sul tuo profilo pubblico e permettono alle persone di visualizzare i tuoi post pubblici marcati con questi hashtag. Sono un grande strumento per tenere traccia di opere creative o progetti a lungo termine." filters: contexts: account: Profili @@ -1653,21 +1686,6 @@ it: failed_sign_in_html: Tentativo di accesso fallito con %{method} da %{ip} (%{browser}) successful_sign_in_html: Accesso riuscito con %{method} da %{ip} (%{browser}) title: Cronologia delle autenticazioni - mail_subscriptions: - unsubscribe: - action: Sì, annulla l'iscrizione - complete: Iscrizione annullata - confirmation_html: Si è sicuri di voler annullare l'iscrizione per non ricevere %{type} per Mastodon su %{domain} sulla tua e-mail %{email}? Puoi sempre reiscriverti dalle tue impostazioni di notifica e-mail. - emails: - notification_emails: - favourite: e-mail di notifica preferite - follow: segui le e-mail di notifica - follow_request: segui le e-mail di richiesta - mention: menziona le e-mail di notifica - reblog: e-mail di notifica per le condivisioni - resubscribe_html: Se hai annullato l'iscrizione per errore, puoi reiscriverti tramite le impostazioni di notifica e-mail. - success_html: Non riceverai più %{type} per Mastodon su %{domain} al tuo indirizzo e-mail %{email}. - title: Disiscriviti media_attachments: validations: images_and_video: Impossibile allegare video a un post che contiene già immagini @@ -1713,6 +1731,27 @@ it: copy_account_note_text: 'Questo utente si è spostato da %{acct}, ecco le tue note precedenti su di loro:' navigation: toggle_menu: Cambia menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} ti ha aggiunto/a a una collezione" + admin_report: + title_html: "%{name} ha segnalato %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} e un altro si sono iscritti" + other: "%{name} e altri %{count} si sono iscritti" + title_html: "%{name} si è iscritto/a" + collection_update: + title_html: "%{name} ha aggiornato una collezione in cui sei presente" + generic: + sign_in: Accedi alla web app Mastodon + summary_html: Stai utilizzando un'app che non supporta la versione più recente di Mastodon. %{link} per la piena funzionalità. + moderation_warning: + summary_html: Stai utilizzando un'app che non supporta la versione più recente di Mastodon. %{link}. + title: Hai ricevuto un avviso di moderazione. + severed_relationships: + summary_html: Un amministratore/trice da %{from} ha sospeso %{target}, il che significa che non puoi più ricevere aggiornamenti o interagire con esso. Fai clic su %{link} per recuperare un elenco delle relazioni perse. + title: Connessioni perse con %{name} notification_mailer: admin: report: @@ -1805,6 +1844,8 @@ it: posting_defaults: Predefinite di pubblicazione public_timelines: Timeline pubbliche privacy: + email_subscriptions: Invia i post via email + email_subscriptions_hint_html: Aggiungi al tuo profilo un modulo di iscrizione via email visibile agli utenti non autenticati. Quando i visitatori inseriscono il loro indirizzo email e acconsentono all'iscrizione, Mastodon invierà loro aggiornamenti via email relativi ai tuoi post pubblici. hint_html: "Personalizza il modo in cui vuoi che il tuo profilo e i tuoi post vengano trovati. Una varietà di funzionalità in Mastodon possono aiutarti a raggiungere un pubblico più ampio se abilitato. Prenditi un momento per rivedere queste impostazioni per assicurarti che si adattino al tuo caso d'uso." privacy: Privacy privacy_hint_html: Controlla quanto tu voglia mostrare a beneficio degli altri. Le persone scoprono profili interessanti e app fantastiche sfogliando il seguito di altre persone e vedendo da quali app pubblichino, ma potresti preferire tenerlo nascosto. @@ -2068,6 +2109,28 @@ it: resume_app_authorization: Riprendere l'autorizzazione dell'applicazione role_requirement: "%{domain} ti richiede di impostare l'autenticazione a due fattori prima di poter usare Mastodon." webauthn: Chiavi di sicurezza + unsubscriptions: + create: + action: Vai alla homepage del server + email_subscription: + confirmation_html: Non riceverai più email da %{name}. + title: Hai annullato l'iscrizione + user: + confirmation_html: Non riceverai più %{type} da Mastodon su %{domain}. + notification_emails: + favourite: email di notifica per i post apprezzati + follow: email di notifica per i nuovi follower + follow_request: email di notifica per le richieste di seguirti + mention: email di notifica per le menzioni + reblog: email di notifica per le condivisioni + show: + action: Disiscriviti + email_subscription: + confirmation_html: Smetterai di ricevere email quando questo account pubblicherà nuovi post. + title: Disiscriverti da %{name}? + user: + confirmation_html: Non riceverai più %{type} da Mastodon su %{domain}. + title: Disiscriverti da %{type}? user_mailer: announcement_published: description: 'Gli amministratori di %{domain} stanno facendo un annuncio:' diff --git a/config/locales/ja.yml b/config/locales/ja.yml index d1ac69484c11dc..ffb99b34ca6b47 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -7,6 +7,8 @@ ja: hosted_on: Mastodon hosted on %{domain} title: このサーバーについて accounts: + errors: + cannot_be_added_to_collections: このアカウントはコレクションに追加できません。 followers: other: フォロワー instance_actor_flash: このアカウントは、個々のユーザーではなく、サーバー自体を表すために使用される仮想のユーザーです。 連合のために使用されるため、停止しないで下さい。 @@ -51,6 +53,7 @@ ja: label: ロールを変更 no_role: ロールがありません title: "%{username}さんのロールを変更" + collections: コレクション confirm: 確認 confirmed: 確認済み confirming: 確認中 @@ -267,6 +270,7 @@ ja: demote_user_html: "%{name}さんが%{target}さんを降格しました" destroy_announcement_html: "%{name}さんがお知らせ %{target}を削除しました" destroy_canonical_email_block_html: "%{name} さんがメールアドレスのハッシュ値 %{target} のブロックを外しました" + destroy_collection_html: "%{name} さんが %{target} によるコレクションを削除しました" destroy_custom_emoji_html: "%{name}さんがカスタム絵文字『%{target}』を削除しました" destroy_domain_allow_html: "%{name}さんが%{target}の連合許可を外しました" destroy_domain_block_html: "%{name}さんがドメイン %{target}のブロックを外しました" @@ -311,6 +315,7 @@ ja: unsilence_account_html: "%{name}さんが%{target}さんのサイレンスを解除しました" unsuspend_account_html: "%{name}さんが%{target}さんの停止を解除しました" update_announcement_html: "%{name}さんがお知らせ %{target}を更新しました" + update_collection_html: "%{name} さんが %{target} によるコレクションを更新しました" update_custom_emoji_html: "%{name}さんがカスタム絵文字 %{target}を更新しました" update_domain_block_html: "%{name}さんが%{target}のドメインブロックを更新しました" update_ip_block_html: "%{name} さんがIP %{target} のルールを更新しました" @@ -345,6 +350,9 @@ ja: unpublish: 非公開にする unpublished_msg: お知らせを非掲載にしました updated_msg: お知らせを更新しました + collections: + accounts: アカウント + collection_title: "%{name} によるコレクション" critical_update_pending: 重要な更新が保留中です custom_emojis: aliases: エイリアス名 @@ -881,6 +889,7 @@ ja: cancel: キャンセル category: カテゴリー category_description_html: 選択した理由は通報されたアカウントへの連絡時に引用されます + collections: コレクション (%{count}) comment: none: なし comment_description_html: "%{name}からの詳細情報:" @@ -1062,6 +1071,7 @@ ja: emoji_reactions: 絵文字リアクション follow_recommendations: おすすめフォロー friend_servers: フレンドサーバー + preamble: 必ずしも知っている人がMastodonに居ない新規ユーザーに定着してもらうには、興味深いコンテンツを表示することが役に立ちます。あなたのサーバーの種々のディスカバリー機能の動作を設定してください。 privacy: プライバシー profile_directory: ディレクトリ public_timelines: 公開タイムライン @@ -1073,6 +1083,11 @@ ja: all: 誰にでも許可 disabled: 誰にも許可しない users: ログイン済みローカルユーザーのみ許可 + feed_access: + modes: + authenticated: ログイン済みユーザーのみ + disabled: 特定ロールのユーザーのみ + public: 制限なし landing_page: values: trends: トレンド @@ -1122,7 +1137,6 @@ ja: statuses: account: 作成者 application: アプリ - are_you_sure: 本当に実行しますか? back_to_account: アカウントページに戻る back_to_report: 通報ページに戻る batch: @@ -1132,8 +1146,6 @@ ja: contents: 投稿内容 deleted: 削除済み favourites: お気に入り - force_cw: 強制CW - force_nsfw: 強制NSFW history: 更新履歴 in_reply_to: 返信先 language: 言語 @@ -1146,9 +1158,6 @@ ja: original_status: オリジナルの投稿 quotes: 引用 reblogs: ブースト - remove: 削除 - remove_history: 編集履歴を削除 - remove_media: メディアを削除 replied_to_html: "%{acct_link}さんへの返信" status_changed: 投稿を変更しました status_title: "@%{name} の投稿" @@ -1460,7 +1469,6 @@ ja: application_mailer: notification_preferences: メール設定の変更 salutation: "%{name}さん" - settings: 'メール設定の変更: %{link}' unsubscribe: 購読解除 view: 'リンク:' view_profile: プロフィールを表示 @@ -1572,6 +1580,13 @@ ja: hint_html: 以後1時間はパスワードの再入力を求めません invalid_password: パスワードが間違っています prompt: 続行するにはパスワードを入力してください + color_scheme: + auto: 自動 + dark: ダーク + light: ライト + contrast: + auto: 自動 + high: 高 crypto: errors: invalid_key: 有効なEd25519またはCurve25519キーではありません @@ -1642,11 +1657,9 @@ ja: your_appeal_pending: 申し立てを送信しました your_appeal_rejected: 申し立ては拒否されました edit_profile: - basic_information: 基本情報 - hint_html: "アカウントのトップページや投稿の隣に表示される公開情報です。プロフィールとアイコンを設定することで、ほかのユーザーは親しみやすく、またフォローしやすくなります。" other: その他 emoji_styles: - auto: オート + auto: 自動 native: ネイティブ twemoji: Twemoji errors: @@ -1683,10 +1696,8 @@ ja: mutes: ミュート storage: メディア featured_tags: - add_new: 追加 errors: limit: すでに注目のハッシュタグの上限数に達しています - hint_html: "注目のハッシュタグとは? プロフィールページに目立つ形で表示され、そのハッシュタグのついたあなたの公開投稿だけを抽出して閲覧できるようにします。クリエイティブな仕事や長期的なプロジェクトを追うのに優れた機能です。" filters: contexts: account: プロフィール @@ -1859,21 +1870,6 @@ ja: failed_sign_in_html: "%{ip} (%{browser}) から%{method}を利用したサインインに失敗しました。" successful_sign_in_html: "%{ip} (%{browser}) から%{method}を利用したサインインに成功しました" title: 認証履歴 - mail_subscriptions: - unsubscribe: - action: 購読を解除する - complete: 購読を解除しました - confirmation_html: Mastodon (%{domain}) による %{email} 宛の「%{type}」の配信を停止します。再度必要になった場合はメール通知の設定からいつでも再開できます。 - emails: - notification_emails: - favourite: お気に入りの通知メール - follow: フォローの通知メール - follow_request: フォローリクエストの通知メール - mention: 返信の通知メール - reblog: ブーストの通知メール - resubscribe_html: 誤って解除した場合はメール通知の設定から再購読できます。 - success_html: Mastodon (%{domain}) から %{email} への「%{type}」の配信が停止されました。 - title: 購読の解除 media_attachments: validations: images_and_video: 既に画像が追加されているため、動画を追加することはできません @@ -2218,23 +2214,24 @@ ja: private: フォロワーのみ private_long: フォロワーにのみ表示されます public: 公開 - public_long: 誰でも見ることができ、かつ公開タイムラインに表示されます + public_long: すべての人 (Mastodon以外も含む) public_unlisted: ローカル公開 public_unlisted_long: 誰でも見ることができますが、他のサーバーの連合タイムラインには表示されません reply: 返信 - unlisted: 非収載 - unlisted_long: 誰でも見ることができますが、公開タイムラインには表示されません + unlisted: ひかえめな公開 + unlisted_long: Mastodonの検索結果、トレンド、公開タイムラインに表示しない unset: 設定なし unset_long: デフォルトの挙動に従います statuses_cleanup: enabled: 古い投稿を自動的に削除する enabled_hint: 設定した期間を過ぎた投稿は、以下の例外に該当しない限り、自動的に削除されます exceptions: 例外 - explanation: 投稿の削除はサーバーに負荷がかかるため、サーバーが混み合っていないときに時間をかけて行われます。 + explanation: 自動削除は低い優先度で行われます。保持する期間を越えてから実際に削除されるまで遅延があるかもしれません。 ignore_emojis: 設定しない ignore_favs: 設定しない ignore_reblogs: 設定しない interaction_exceptions: インタラクションに基づく例外 + interaction_exceptions_explanation: お気に入りやブーストの数が一度でも基準値に逹っした投稿は、その後数が減っても削除されません。 keep_direct: ダイレクトメッセージを保持 keep_direct_hint: ダイレクトメッセージを削除せずに残します keep_media: メディア付きの投稿を保持 diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 35bffc281019d1..897e17c222a3fa 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -38,6 +38,7 @@ kab: label: Snifel tamlilt no_role: War tamlilt title: Snifel tamlilt n %{username} + collections: Tilkensa confirm: Sentem confirmed: Yettwasentem confirming: Asentem @@ -141,6 +142,7 @@ kab: destroy_domain_allow: Kkes taɣult yettusirgen destroy_domain_block: Kkes asewḥel n taɣult destroy_ip_block: Kkes alugen n IP + destroy_relay: Kkes amedwel destroy_status: Kkes tasufeɣt destroy_unavailable_domain: Kkes taɣult ur nelli ara destroy_user_role: Senger tamlilt @@ -148,6 +150,7 @@ kab: disable_custom_emoji: Sens imujit udmawan disable_user: Sens aseqdac enable_custom_emoji: Rmed imujit udmawan + enable_relay: Rmed amedwel enable_user: Rmed aseqdac promote_user: Aseqdac anmeggag remove_avatar_user: Kkes avaṭar @@ -209,6 +212,11 @@ kab: scheduled_for: Yettusɣiwsen i %{time} scheduled_msg: Tamselɣut tettusɣiwes i usufeɣ! title: Ilɣa + collections: + accounts: Imiḍanen + collection_title: Talkensit sɣur %{name} + contents: Agbur + open: Ldi custom_emojis: assign_category: Efk taggayt by_domain: Taɣult @@ -262,6 +270,7 @@ kab: create: Rnu-d iḥder severity: noop: Ula yiwen + silence: Talast suspend: Ḥbes di leεḍil title: Iḥder amaynut n taɣult private_comment: Awennit uslig @@ -297,6 +306,7 @@ kab: confirm: Sentem save: Sekles sign_in: Qqen + status: Addad title: FASP follow_recommendations: language: I tutlayt @@ -308,6 +318,8 @@ kab: back_to_warning: Ɣur-wat by_domain: Taɣult content_policies: + policies: + silence: Talast policy: Tasertit dashboard: instance_languages_dimension: Tutlayin ifazen @@ -326,6 +338,7 @@ kab: title: Aseɣyed private_comment: Awennit uslig public_comment: Awennit azayez + purge: Sfeḍ title: Tamatut total_blocked_by_us: Ttwasḥebsen sɣur-neɣ total_followed_by_them: Ṭtafaṛen-t @@ -377,6 +390,7 @@ kab: are_you_sure: Tetḥaq-eḍ? cancel: Sefsex category: Taggayt + collections: Tilkensa (%{count}) comment: none: Ula yiwen confirm: Sentem @@ -395,6 +409,7 @@ kab: reported_account: Amiḍan yettumlen resolved: Fran status: Addad + statuses: Iznan (%{count}) title: Ineqqisen unknown_action_msg: 'Tigawt tarussint: %{action}' unresolved: Ur yefra ara @@ -407,24 +422,31 @@ kab: other: "%{count} n iseqdacen" categories: administration: Tadbelt + email: Imayl invites: Iɛeṛṛuḍen moderation: Aseɣyed + special: Imeẓli delete: Kkes everyone: Tisirag timezwura privileges: administrator: Anedbal + delete_user_data: Kkes isefka n useqddac manage_federation: Sefrek Tafidiralit + manage_invites: Sefrek ineɛruḍen manage_roles: Sefrek ilugan manage_rules: Sefrek ilugan manage_settings: Asefrek n iɣewwaṛen manage_users: Sefrek iqeddacen view_dashboard: Timẓriwt n tfelwit + title: Timlilin rules: add_new: Rnu alugen add_translation: Ad yernu tasuqilt delete: Kkes edit: Ẓreg alugen empty: Mazal ur ttwasbadun ara yilugan n uqeddac. + move_down: Sekḥer d akessar + move_up: Sekḥer d asawen title: Ilugan n uqeddac translation: Tasuqilt translations: Tisuqilin @@ -432,16 +454,21 @@ kab: about: title: Ɣef appearance: + preamble: Sagen agrudem web n Mastodon. title: Udem discovery: privacy: Tabaḍnit profile_directory: Akaram n imaɣnuten title: Asnirem trends: Ayen mucaɛen + wrapstodon: Wrapstodon domain_blocks: all: I medden akk disabled: Ɣef ula yiwen users: Ɣef yimseqdacen idiganen i yeqqnen + feed_access: + modes: + public: Yal yiwen landing_page: values: about: Ɣef @@ -474,6 +501,7 @@ kab: metadata: Iɣefisefka open: Ldi tasuffeɣt quotes: Tinebdurin + reblogs: Izuzar status_title: Tasuffeɣt sɣur @%{name} title: Tisuffaɣ n umiḍan - @%{name} trending: Inezzaɣ @@ -493,9 +521,12 @@ kab: software_version_patch_check: action: Wali ileqqman yellan tags: + moderation: + title: Addad name: Isem newest: Amaynut oldest: Aqbur + reset: Wennez search: Anadi title: Ihacṭagen terms_of_service: @@ -503,6 +534,7 @@ kab: create: Sqedcet ayla-nwen current: Amiran draft: Arewway + generate: Seqdec tamudemt generates: action: Sirew title: Tawila n tewtilin n useqdec @@ -525,6 +557,8 @@ kab: tags: dashboard: tag_languages_dimension: Tutlayin ifazen + listable: Yezmer ad yettwasumer + not_listable: Ur-d yettwasumer ara title: Ihacṭagen inezzaɣ trending_rank: 'Anezzuɣ #%{rank}' trending: Inezzaɣ @@ -567,7 +601,6 @@ kab: application_mailer: notification_preferences: Snifel imenyafen n imayl salutation: "%{name}," - settings: 'Snifel imenyafen n imayl: %{link}' view: 'Ẓaṛ:' view_profile: Ssken-d amaɣnu view_status: Ssken-d tasuffiɣt @@ -594,6 +627,7 @@ kab: didnt_get_confirmation: Ur d-teṭṭifeḍ ara aseɣwen n usentem ? dont_have_your_security_key: Ulac ɣur-k·m tasarut-ik·im n tɣellist? forgot_password: Tettud awal-ik uffir? + link_to_webauth: Seqdec ibenk-ik·im n tsarut taɣellsant log_in_with: Qqen s login: Qqen logout: Ffeɣ @@ -617,6 +651,7 @@ kab: invited_by: 'Tzemreḍ ad tkecmeḍ ɣer %{domain} s tanemmirt i tinnubga i d-teṭṭfeḍ sɣur :' preamble: Tiyi ttwasemmant-d yerna ttwaḍemnent sɣur imḍebbren n %{domain}. preamble_invited: Uqbel ad tkemmleḍ, ttxil-k·m ẓer ilugan i d-sbedden yimkariyen n %{domain}. + read_more: Ɣeṛ ugar title: Kra n yilugan igejdanen. title_invited: Tettwaɛerḍeḍ. security: Taɣellist @@ -643,6 +678,12 @@ kab: confirm: Kemmel invalid_password: Yir awal uffir prompt: Sentem awal uffir send ad tkemleḍ + color_scheme: + auto: Awurman + dark: Ubrik + light: Aceɛlal + contrast: + auto: Awurman crypto: errors: invalid_key: maci d tasarut tameɣtut n Ed25519 neɣ Curve25519 @@ -678,14 +719,33 @@ kab: delete_statuses: Tukksa n tsuffeɣt none: Ɣur-wat edit_profile: - basic_information: Talɣut tamatut - hint_html: "Mudd udem i wayen ttwalin medden deg umaɣnu-inek azayez ɣer yidis n yiznan-ik. Imdanen niḍen zemren ad k-ḍefren yernu ad gen assaɣ yid-k mi ara tesɛuḍ amaɣnu yeccuṛen ed tugna n umaɣnu." other: Ayen nniḍen + email_subscription_mailer: + confirmation: + action: Sentem tansa imayl + subject: Sentem tansa-k·m imayl + notification: + create_account: Snulfu-d amiḍan Mastodon + subject: + plural: Tisuffaɣ timaynutin sɣur %{name} + singular: 'Izen amaynut: "%{excerpt}"' + title: + plural: Tisuffaɣ timaynutin sɣur %{name} + singular: 'Izen amaynut: "%{excerpt}"' + email_subscriptions: + active: D urmid + confirmations: + show: + changed_your_mind: Tbeddleḍ ṛṛay-ik·im? + inactive: D arurmid + status: Addad emoji_styles: auto: Awurman + native: Amlal twemoji: Twemoji errors: '404': Asebter i tettnadiḍ ulac-it da. + '429': Aṭas n tuttriwin '500': title: Asebter-ayi d arameɣtu existing_username_validator: @@ -700,8 +760,6 @@ kab: csv: CSV lists: Tibdarin mutes: Wid tesgugmeḍ - featured_tags: - add_new: Rnu amaynut filters: contexts: account: Imeɣna @@ -807,6 +865,7 @@ kab: action: Err body: 'Yuder-ik·ikem-id %{name} deg:' subject: Yuder-ik·ikem-id %{name} + title: Abadar amaynut quote: title: Tabdert tamaynut reblog: @@ -821,6 +880,7 @@ kab: units: billion: AṬ million: A + quadrillion: K thousand: GM trillion: Am otp_authentication: @@ -831,6 +891,9 @@ kab: next: Ɣer zdat older: Aqbuṛ prev: Win iɛeddan + truncate: "…" + polls: + vote: Dɣer preferences: other: Wiyaḍ posting_defaults: Iɣewwaṛen n usuffeɣ imezwura @@ -1035,3 +1098,6 @@ kab: create: success: Tasarut-ik·im n tɣellist tettwarna akken iwata. delete: Kkes + nickname: Meffer isem + wrapstodon: + title: Wrapstodon %{year} i %{name} diff --git a/config/locales/kk.yml b/config/locales/kk.yml index d478ab031e7d66..529c2afdd9b7b1 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -411,9 +411,6 @@ kk: lists: Тізімдер mutes: Үнсіздер storage: Медиа жинақ - featured_tags: - add_new: Жаңасын қосу - hint_html: " Ерекшеліктері бар хэштегтер дегеніміз не? Олар жалпыға қол жетімді профильде көрсетіледі және адамдарға сіздің жалпы хабарламаларыңызды сол хэштегтердің астына қарауға мүмкіндік береді. Олар шығармашылық жұмыстарды немесе ұзақ мерзімді жобаларды бақылаудың тамаша құралы." filters: contexts: home: Ішкі желі diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a5e90f9894b3f8..616b6e7a64a656 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1194,7 +1194,6 @@ ko: application_mailer: notification_preferences: 이메일 설정 변경 salutation: "%{name} 님," - settings: '이메일 설정 변경: %{link}' unsubscribe: 구독 해제 view: '보기:' view_profile: 프로필 보기 @@ -1377,8 +1376,6 @@ ko: your_appeal_pending: 소명을 제출했습니다 your_appeal_rejected: 소명이 기각되었습니다 edit_profile: - basic_information: 기본 정보 - hint_html: "사람들이 공개 프로필을 보고서 게시물을 볼 때를 위한 프로필을 꾸밉니다. 프로필과 프로필 사진을 채우면 다른 사람들이 나를 팔로우하고 나와 교류할 기회가 더 많아집니다." other: 기타 emoji_styles: auto: 자동 @@ -1418,10 +1415,8 @@ ko: mutes: 뮤트 storage: 미디어 featured_tags: - add_new: 추가 errors: limit: 추천 해시태그 최대 개수를 초과합니다 - hint_html: "내 가장 중요한 해시태그들을 프로필에서 추천하세요. 내 창작물이나 오래 걸리는 프로젝트를 따라가기 위한 도구이며 추천 해시태그는 내 프로필에 잘 보이게 표시되고 내 게시물에 대한 빠른 접근을 가능하게 합니다." filters: contexts: account: 프로필 @@ -1594,21 +1589,6 @@ ko: failed_sign_in_html: 실패한 로그인 시도 %{method} %{ip} (%{browser}) successful_sign_in_html: 성공한 로그인 시도 %{method} %{ip} (%{browser}) title: 인증 이력 - mail_subscriptions: - unsubscribe: - action: 네, 구독 취소합니다 - complete: 구독 취소됨 - confirmation_html: 정말로 %{domain}에서 %{email}로 보내는 마스토돈의 %{type}에 대한 구독을 취소하시겠습니까? 언제든지 이메일 알림 설정에서 다시 구독할 수 있습니다. - emails: - notification_emails: - favourite: 좋아요 알림 이메일 - follow: 팔로우 알림 이메일 - follow_request: 팔로우 요청 이메일 - mention: 멘션 알림 이메일 - reblog: 부스트 알림 이메일 - resubscribe_html: 만약 실수로 구독 취소를 했다면 이메일 알림 설정에서 다시 구독할 수 있습니다. - success_html: 이제 더이상 %{domain}의 마스토돈에서 %{email}로 %{type} 알림을 보내지 않습니다. - title: 구독 취소 media_attachments: validations: images_and_video: 이미 사진이 첨부된 게시물엔 동영상을 첨부할 수 없습니다. diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 516f3a42707618..2ac982f1d3e0d2 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1036,9 +1036,6 @@ ku: lists: Rêzok mutes: Te bêdeng kir storage: Bîrdanaka medyayê - featured_tags: - add_new: Yeka nû tevlî bike - hint_html: " Hashtagên destnîşankirî çi ne? Ew bi eşkere li ser profîla te ya gelemperî têne xuyakirin û dihêlin ku mirov bi taybetî di binê wan hashtagan de li şandiyên te yên gelemperî bigere. Ew ji bo şopandina karên afirîner an projeyên demdirêj amûrek girîng in." filters: contexts: account: Profîl diff --git a/config/locales/lad.yml b/config/locales/lad.yml index aeffb477be5c11..70a2872f52770a 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1135,7 +1135,6 @@ lad: application_mailer: notification_preferences: Troka preferensyas de posta salutation: "%{name}," - settings: 'Troka preferensyas de posta: %{link}' unsubscribe: Dezabona view: 'Mira:' view_profile: Ve profil @@ -1305,8 +1304,6 @@ lad: your_appeal_pending: Tienes enviado una apelasyon your_appeal_rejected: Tu apelasyon fue refuzada edit_profile: - basic_information: Enformasyon bazika - hint_html: "Personaliza lo ke la djente ve en tu profil publiko i kon tus publikasyones. Es mas probavle ke otras personas te sigan i enteraktuen kontigo kuando kompletas tu profil i foto." other: Otros emoji_styles: auto: Otomatiko @@ -1346,10 +1343,8 @@ lad: mutes: Silensias storage: Magazinaje de multimedia featured_tags: - add_new: Adjusta muevo errors: limit: Tienes alkansado el karar maksimo de etiketas - hint_html: "Avalia tus etiketas mas importantes en tu profil. Se amostran de forma prominente en tu profil publiko i permeten a los utilizadores navigar por tus publikasyones publikas espesifikamente basho akeyas etiketas." filters: contexts: account: Profiles @@ -1503,21 +1498,6 @@ lad: failed_sign_in_html: Prova de inisiasyon de sesion no reushida kon %{method} de %{ip} (%{browser}) successful_sign_in_html: Prova de sesion reushida kon %{method} dizde %{ip} (%{browser}) title: Estoria de autentifikasyon - mail_subscriptions: - unsubscribe: - action: Si, dezabona - complete: Dezabonado - confirmation_html: Estas siguro de ke ya no keres risivir %{type} de Mastodon en %{domain} a tu posta elektronika %{email}? Syempre podras reabonarte dizde las opsyones de avizos por posta.. - emails: - notification_emails: - favourite: avizos de favoritos por posta - follow: avizos de segidores por posta - follow_request: avizos de solisitasyones de segimyento por posta - mention: avizos de enmentaduras por posta - reblog: avizos de repartajasyones por posta - resubscribe_html: Si tyenes deabonado por yerro, puedes reabonar en tus opsyones de avizos por posta elektronika. - success_html: Ya no risiviras %{type} de Mastodon en %{domain} a tu posta en %{email}. - title: Dezabona media_attachments: validations: images_and_video: No se puede adjuntar un video a un estado ke ya kontenga imajes diff --git a/config/locales/lt.yml b/config/locales/lt.yml index b807451ece13e9..0f08842c908722 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -960,8 +960,6 @@ lt: your_appeal_pending: Pateikei apeliaciją your_appeal_rejected: Tavo apeliacija buvo atmesta edit_profile: - basic_information: Pagrindinė informacija - hint_html: "Tinkink tai, ką žmonės mato tavo viešame profilyje ir šalia įrašų. Kiti žmonės labiau linkę sekti atgal ir bendrauti su tavimi, jei tavo profilis yra užpildytas ir turi profilio nuotrauką." other: Kita emoji_styles: auto: Automatinis @@ -994,9 +992,6 @@ lt: lists: Sąrašai mutes: Nutildei storage: Medijos saugykla - featured_tags: - add_new: Pridėti naują - hint_html: "Savo profilyje parodyk svarbiausias grotažymes. Tai puikus įrankis kūrybiniams darbams ir ilgalaikiams projektams sekti, todėl svarbiausios grotažymės rodomos matomoje vietoje profilyje ir leidžia greitai pasiekti tavo paties įrašus." filters: contexts: account: Profiliai @@ -1073,12 +1068,6 @@ lt: 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 - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: dalintis pranešimų el. pašto laiškais - success_html: Daugiau negausi %{type} „Mastodon“ domene %{domain} į savo el. paštą %{email}. media_attachments: validations: images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 1a31034a59d0e2..e21ec5355d01e3 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1174,7 +1174,6 @@ lv: application_mailer: notification_preferences: Mainīt e-pasta uztādījumus salutation: "%{name}," - settings: 'Mainīt e-pasta uztādījumus: %{link}' unsubscribe: Atcelt abonēšanu view: 'Skatīt:' view_profile: Skatīt profilu @@ -1350,8 +1349,6 @@ lv: your_appeal_pending: Tu iesniedzi pārsūdzību your_appeal_rejected: Tava pārsūdzība tika noraidīta edit_profile: - basic_information: Pamata informācija - hint_html: "Pielāgo, ko cilvēki redz Tavā publiskajā profilā un blakus Taviem ierakstiem. Ir lielāka iespējamība, ka citi clivēki sekos Tev un mijiedarbosies ar Tevi, ja Tev ir aizpildīts profils un profila attēls." other: Cits errors: '400': Tevis iesniegtais pieprasījums bija nederīgs vai nepareizi izveidots. @@ -1387,10 +1384,8 @@ lv: mutes: Apklusinātie konti storage: Multividesu krātuve featured_tags: - add_new: Pievienot jaunu errors: limit: Tu jau esi piedāvājis maksimālo tēmturu skaitu - hint_html: "Izcel savus vissvarīgākos tēmturus savā profilā! Lielisks rīks, lai izsekotu saviem radošajiem darbiem un ilgtermiņa projektiem, izceltie tēmturi tiek attēloti pamanāmi attēloti Tavā profilā un ļauj ātru piekļuvi saviem ierakstiem." filters: contexts: account: Profili @@ -1596,21 +1591,6 @@ lv: failed_sign_in_html: Neizdevies pieteikšanās mēģinājums ar %{method} no %{ip} (%{browser}) successful_sign_in_html: Sekmīga pieteikšanās ar %{method} no %{ip} (%{browser}) title: Autentifikācijas vēsture - mail_subscriptions: - unsubscribe: - action: Jā, atcelt abonēšanu - complete: Anulēts - confirmation_html: Vai tiešām atteikties no %{type} saņemšanas savā e-pasta adresē %{email} par %{domain} esošo Mastodon? Vienmēr var abonēt no jauna savos e-pasta paziņojumu iestatījumos. - emails: - notification_emails: - favourite: izlases paziņojumu e-pasta ziņojumi - follow: sekošanas paziņojumu e-pasta ziņojumi - follow_request: sekošanas pieprasījumu e-pasta ziņojumi - mention: pieminēšanas paziņojumu e-pasta ziņojumi - reblog: pastiprinājumu paziņojumu e-pasta ziņojumi - resubscribe_html: Ja abonements tika atcelts kļūdas dēļ, abonēt no jauna var savos e-pasta paziņojumu iestatījumos. - success_html: Tu vairs savā e-pasta adresē %{email} nesaņemsi %{type} par %{domain} esošo Mastodon. - title: Atcelt abonēšanu media_attachments: validations: images_and_video: Nevar pievienot videoklipu tādai ziņai, kura jau satur attēlus diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 6edddd432306f7..4abdc1fad9e591 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1108,8 +1108,6 @@ ms: your_appeal_pending: Anda telah menghantar rayuan your_appeal_rejected: Rayuan anda telah ditolak edit_profile: - basic_information: Maklumat Asas - hint_html: "Sesuaikan perkara yang orang lihat pada profil awam anda dan di sebelah siaran anda. Orang lain lebih berkemungkinan mengikuti anda kembali dan berinteraksi dengan anda apabila anda mempunyai profil dan gambar profil yang telah diisi." other: Lain-lain errors: '400': Permintaan yang anda serahkan tidak sah atau salah bentuk. @@ -1145,10 +1143,8 @@ ms: mutes: Redaman anda storage: Storan Media featured_tags: - add_new: Tambah baharu errors: limit: Anda telah memaparkan bilangan maksimum hashtag - hint_html: "Tampilkan hashtag paling penting anda pada profil anda. Alat yang hebat untuk menjejaki karya kreatif dan projek jangka panjang anda, hashtag yang ditampilkan dipaparkan dengan jelas pada profil anda dan membenarkan akses pantas kepada pos anda sendiri." filters: contexts: account: Profil @@ -1278,14 +1274,6 @@ ms: failed_sign_in_html: Percubaan log masuk gagal dengan %{method} daripada %{ip} (%{browser}) successful_sign_in_html: Log masuk yang berjaya dengan %{method} daripada %{ip} (%{browser}) title: Sejarah pengesahan - mail_subscriptions: - unsubscribe: - action: Ya, nyahlanggan - complete: Menyahlanggan - emails: - notification_emails: - favourite: emel pemberitahuan sukaan - title: Hentikan langganan media_attachments: validations: images_and_video: Tidak boleh melampirkan video pada pos yang sudah mengandungi imej diff --git a/config/locales/my.yml b/config/locales/my.yml index f8f69586a9251d..38555660b73e99 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1096,8 +1096,6 @@ my: your_appeal_pending: အယူခံဝင်ရန် တင်သွင်းထားသည် your_appeal_rejected: အယူခံဝင်မှုကို ပယ်ချလိုက်သည် edit_profile: - basic_information: အခြေခံသတင်းအချက်အလက် - hint_html: "သင်၏ အများမြင်ပရိုဖိုင်နှင့် သင့်ပို့စ်များဘေးရှိ တွေ့မြင်ရသည့်အရာကို စိတ်ကြိုက်ပြင်ဆင်ပါ။ သင့်တွင် ပရိုဖိုင်နှင့် ပရိုဖိုင်ပုံတစ်ခု ဖြည့်သွင်းထားပါက အခြားသူများအနေဖြင့် သင်နှင့် အပြန်အလှန် တုံ့ပြန်နိုင်ခြေပိုများပါသည်။" other: အခြား errors: '400': သင်တင်ပြသော တောင်းဆိုချက်မှာ မမှန်ကန်ပါ သို့မဟုတ် ပုံစံမမှန်ပါ။ @@ -1133,10 +1131,8 @@ my: mutes: အသံပိတ် storage: မီဒီယာသိုလှောင်မှု featured_tags: - add_new: အသစ် ထည့်ပါ errors: limit: ဟက်ရှ်တဂ်အရေအတွက် အများဆုံးကို ဖော်ပြပြီးဖြစ်သည် - hint_html: " hashtags ဆိုသည်မှာ အဘယ်နည်း။ ၎င်းတို့ကို သင်၏ အများမြင်ပရိုဖိုင်တွင် ပြသထားပြီး ထို hashtags များအောက်တွင် လူများအား သင်၏ အများမြင်ပို့စ်များကို ကြည့်ရှုရန်ခွင့်ပြုထားသည်။ ၎င်းတို့သည် ဖန်တီးမှုလက်ရာများ သို့မဟုတ် ရေရှည်စီမံကိန်းများ ခြေရာခံရန်အတွက် အသုံးဝင်ပါသည်။" filters: contexts: account: ပရိုဖိုင်များ @@ -1275,11 +1271,6 @@ my: failed_sign_in_html: "%{ip} (%{browser}) မှ %{method} ဖြင့် အကောင့်ဝင်ရောက်ခြင်း မအောင်မြင်ပါ" successful_sign_in_html: "%{ip} (%{browser}) မှ %{method} ဖြင့် အကောင့်ဝင်၍ရပါပြီ" title: အထောက်အထားမှတ်တမ်း - mail_subscriptions: - unsubscribe: - action: ဟုတ်ကဲ့၊ စာရင်းမှ ဖြုတ်လိုက်ပါပြီ - complete: စာရင်းမှထွက်ရန် - title: စာရင်းမှထွက်ရန် media_attachments: validations: images_and_video: ရုပ်ပုံပါရှိပြီးသားပို့စ်တွင် ဗီဒီယို ပူးတွဲ၍မရပါ diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index dc471a9c2c3467..b1c60ad78a3334 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -747,6 +747,7 @@ nan-TW: categories: administration: 管理員 devops: DevOps + email: 電子phue箱 invites: 邀請 moderation: 管理 special: 特別 @@ -774,6 +775,8 @@ nan-TW: manage_blocks_description: 允准用者封鎖電子phue ê 提供者kap IP地址 manage_custom_emojis: 管理自訂ê Emoji manage_custom_emojis_description: 允准用者管理佇tsit ê服侍器ê自訂Emoji + manage_email_subscriptions: 管理訂電子phue + manage_email_subscriptions_description: 允准用者用電子phue訂有chit ê權限ê用者 manage_federation: 管理聯邦 manage_federation_description: 允准用者封鎖á是允准kap其他域名相連,mā控制寄送ê能力 manage_invites: 管理邀請 @@ -1210,7 +1213,6 @@ nan-TW: application_mailer: notification_preferences: 改電子phue ê偏好 salutation: "%{name}、" - settings: 改電子phue ê偏好:%{link} unsubscribe: 取消訂 view: 檢視: view_profile: 看個人資料 @@ -1261,7 +1263,7 @@ nan-TW: confirm: 確認電子phue details: Lí ê詳細 list: 註冊流程 - review: Lán ê審查 + review: Gún ê審查 rules: 接受規則 providers: cas: CAS @@ -1298,7 +1300,7 @@ nan-TW: account_status: 口座ê狀態 confirming: Teh等電子phue確認完成。 functional: Lí ê口座完全ē當用。 - pending: Lán ê人員teh處理lí ê申請。Tse可能愛一段時間。若是申請允准,lí ē收著e-mail。 + pending: Gún ê人員teh處理lí ê申請。Tse可能愛一段時間。若是申請允准,lí ē收著e-mail。 redirecting_to: Lí ê口座無活動,因為tann轉kàu %{acct}。 self_destruct: 因為 %{domain} teh-beh關掉,lí kan-ta ē當有限接近使用lí ê口座。 view_strikes: 看早前tuì lí ê口座ê警告 @@ -1395,9 +1397,41 @@ nan-TW: your_appeal_pending: Lí有送投訴 your_appeal_rejected: Lí ê投訴已經受拒絕 edit_profile: - basic_information: 基本ê資訊 - hint_html: "自訂lâng佇lí ê個人資料kap lí ê Po文邊仔所通看ê。Nā是lí有添好個人資料kap標á,別lâng較有可能kā lí跟tuè轉去,kap lí互動。" other: 其他 + redesign_body: 編輯個人檔案tsit-má ē當直接對個人資料頁接近使用。 + redesign_button: Kàu hia + redesign_title: 有新ê個人資料編輯ê體驗 + email_subscription_mailer: + confirmation: + action: 確認電子phue地址 + instructions_to_confirm: 請確認當 %{name}(@%{acct})發送新ê PO文ê時陣,lí想欲收in ê電子批。 + instructions_to_ignore: Lí若無確定是án-tsuánn lí收著tsit張phue,lí ē當kā thâi,Lí若無tshi̍h頂懸ê連結,就buē kā lí訂。 + subject: 確認lí ê電子phue地址 + title: Kám beh對 %{name}收著電子批ê更新? + notification: + create_account: 建立Mastodon ê口座 + footer: + privacy_html: 電子批是由Mastodon ê服侍器 %{domain} 送出。Beh了解tsit台服侍器án-tsuánn處理lí ê個人資料,請參考隱私權政策。 + reason_for_email_html: 因為lí選擇收著對 %{name} 來ê電子phue更新,所以lí teh收著tsit張電子批。Kám無beh收著tsiah ê電子phue?取消訂 + interact_with_this_post: + other: Kap tsit(tsiah)ê PO文互動,發現其他相siâng ê PO文。 + subject: + plural: 對 %{name} 來ê新ê PO文 + singular: 新ê PO文:「%{excerpt}」 + title: + plural: 對 %{name} 來ê新ê PO文 + singular: 新ê PO文:「%{excerpt}」 + email_subscriptions: + active: 有效ê + confirmations: + show: + changed_your_mind: Kám beh改變心意? + success_html: Lí對tsit-má開始,佇 %{name} 刊出新ê PO文ê時陣,ē收著電子批。加添 %{sender} kàu lí ê聯絡人,避免tsiah ê PO文hőng tàn kàu pùn-sò phue ê資料giap-á。 + title: Lí有註冊ah + unsubscribe: 取消訂 + inactive: 停止使用ah + status: 狀態 + subscribers: 訂ê lâng emoji_styles: auto: 自動 native: 原底ê @@ -1436,10 +1470,8 @@ nan-TW: mutes: Lí消音ê storage: 媒體儲存 featured_tags: - add_new: 加新ê errors: limit: Lí已經kā hashtag推薦kàu盡磅ah。 - hint_html: "佇個人資料推薦lí上重要ê hashtag。Tse是誠好ê家私,通the̍h來追蹤lí ê創意作品kap長期計畫。推薦ê hashtag ē佇lí ê個人資料顯目展示,koh允准緊緊接近使用lí家tī ê PO文。" filters: contexts: account: 個人資料 @@ -1612,21 +1644,6 @@ nan-TW: failed_sign_in_html: Uì %{ip} (%{browser}) 用 %{method} 試登入失敗 successful_sign_in_html: Uì %{ip} (%{browser}) 用 %{method} 登入成功 title: 認證歷史 - mail_subscriptions: - unsubscribe: - action: Hennh,mài訂 - complete: 無訂ah - confirmation_html: Lí kám確定beh取消訂 %{domain} ê Mastodon 內底 ê %{type} kàu lí ê電子批 %{email}?Lí ē當隨時對lí ê電子批通知設定重訂。 - emails: - notification_emails: - favourite: 收藏通知電子批 - follow: 跟tuè通知電子批 - follow_request: 跟tuè請求電子批 - mention: 提起通知電子批 - reblog: 轉送通知電子批 - resubscribe_html: Nā出tshê取消訂,lí通重訂tuì lí ê電子批通知設定。 - success_html: Lí bē koh收著佇 %{domain} ê Mastodon內底ê %{type} kàu lí ê電子批 %{email}。 - title: 取消訂 media_attachments: validations: images_and_video: Bē當佇有影像ê PO文內底加影片 @@ -1764,6 +1781,8 @@ nan-TW: posting_defaults: PO文預設值 public_timelines: 公共ê時間線 privacy: + email_subscriptions: 用電子phue寄PO文 + email_subscriptions_hint_html: 佇lí ê個人資料內底加訂電子批ê表,予無登入ê用者看。訪客若輸入in ê電子phue地址,揀beh來訂,Mastodon會用電子批送予伊lí ê公開PO文ê更新。 hint_html: "自訂lí beh án-nuá hōo lí ê個人資料kap PO文受lâng發現。Mastodon ê tsē-tsē功能nā是拍開,通幫tsān lí接觸kàu較闊ê觀眾。請開一寡時間重看tsiah ê設定,確認in合lí ê使用例。" privacy: 隱私權 privacy_hint_html: 控制lí想欲為別lâng ê利益,公開guā tsē內容。Lâng用瀏覽別lâng ê跟tuè koh看in用啥物應用程式PO文,來發現心適ê個人資料kap時行ê應用程式,但是lí凡勢beh保持khàm起來。 @@ -1989,11 +2008,46 @@ nan-TW: does_not_match_previous_name: kap進前ê名無kâng terms_of_service: title: 服務規定 + terms_of_service_interstitial: + future_preamble_html: Gún有更新一kuá服務規定,伊會佇%{date}施行。Gún鼓勵lí讀更新ê規定。 + past_preamble_html: 對lí頂改訪問以後,lán有更新服務規定。Gún鼓勵lí讀更新ê規定。 + review_link: 讀更新ê規定 + title: "%{domain} ê服務規定teh改變" themes: default: Mastodon + time: + formats: + default: "%Y 年 %b 月 %d 日 %H:%M" + month: "%b %Y" + time: "%H:%M" + with_time_zone: "%b %d, %Y, %H:%M %Z" + translation: + errors: + quota_exceeded: 服侍器ê翻譯服務使用ê khòo-tah 超過ah。 + too_many_requests: Tsit tsām-á翻譯服務ê請求傷tsē。 two_factor_authentication: + add: 加 disable: 停止用雙因素認證 + disabled_success: 雙因素驗證取消使用成功 + edit: 編輯 + enabled: 雙因素驗證啟用ah + enabled_success: 雙因素驗證啟用成功 + generate_recovery_codes: 生成恢復碼 + lost_recovery_codes: 恢復碼予lí會當佇拍毋見手機á ê時陣,koh通接近使用lí ê口座。若是lí有失去lí ê恢復碼,lí佇tsia會當koh產出,毋koh舊ê恢復碼會變無效。 + methods: 雙因素驗證 user_mailer: + terms_of_service_changed: + description: Lí收著tsit張電子phue,是因為gún佇 %{domain} teh修改服務規定。Tsiah ê更新會佇 %{date} 施行。Gún鼓勵lí佇tsia讀kui篇更新ê規定: + description_html: Lí收著tsit張電子phue,是因為gún佇 %{domain} teh修改服務規定。Tsiah ê更新會佇 %{date} 施行。Gún鼓勵lí佇tsia讀kui篇更新ê規定: + sign_off: "%{domain} 小組" + subject: Gún ê服務規定ê更新 + subtitle: "%{domain} ê服務規定teh改變" + title: 重要ê更新 + warning: + appeal: 送投訴 + appeal_description: Lí若相信tse是出tshê,lí會當kā %{instance} ê人員投。 + categories: + spam: Pùn-sò訊息 welcome: feature_creativity: Mastodon支持聲音、影kap圖片êPO文、容易使用性ê描述、投票、內容ê警告、動畫ê標頭、自訂ê繪文字kap裁縮小圖ê控制等等,幫tsān lí展現家己。無論beh發表藝術作品、音樂,á是podcast,Mastodon佇tsia為lí服務。 sign_in_action: 登入 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 69ff56febdc2bf..2baf36f4e599ca 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -169,7 +169,7 @@ nl: undo_silenced: Niet langer beperken undo_suspension: Niet langer opschorten unsilenced_msg: Het opheffen van de beperkingen van %{username} zijn geslaagd - unsubscribe: Opzeggen + unsubscribe: Afmelden unsuspended_msg: Het niet langer opschorten van %{username} is geslaagd username: Gebruikersnaam view_domain: Samenvatting voor domein bekijken @@ -762,6 +762,7 @@ nl: categories: administration: Beheer devops: DevOps + email: E-mail invites: Uitnodigingen moderation: Moderatie special: Speciaal @@ -790,6 +791,8 @@ nl: manage_blocks_description: Staat gebruikers toe om e-mailproviders en IP-adressen te blokkeren manage_custom_emojis: Lokale emoji's beheren manage_custom_emojis_description: Staat gebruikers toe om lokale emoji's op de server te beheren + manage_email_subscriptions: E-mailabonnementen beheren + manage_email_subscriptions_description: Sta gebruikers toe om zich per e-mail te abonneren op gebruikers met deze rechten manage_federation: Federatie beheren manage_federation_description: Staat gebruikers toe om federatie met andere domeinen te blokkeren of toe te staan en om de bezorging te bepalen manage_invites: Uitnodigingen beheren @@ -1231,7 +1234,6 @@ nl: application_mailer: notification_preferences: E-mailvoorkeuren wijzigen salutation: "%{name}," - settings: 'E-mailvoorkeuren wijzigen: %{link}' unsubscribe: Afmelden view: 'Bekijk:' view_profile: Profiel bekijken @@ -1307,7 +1309,7 @@ nl: email_settings_hint_html: Klik op de link die we naar %{email} hebben gestuurd om Mastodon te gebruiken. We wachten wel even. link_not_received: Geen link ontvangen? new_confirmation_instructions_sent: Je ontvangt binnen enkele minuten een nieuwe e-mail met de bevestigingslink! - title: Kijk in je mailbox + title: Kijk in je e-mail sign_in: preamble_html: Log in met de inloggegevens van %{domain}. Als jouw account zich op een andere server bevindt, kun je hier niet inloggen. title: Inloggen op %{domain} @@ -1416,9 +1418,42 @@ nl: your_appeal_pending: Je hebt een bezwaar ingediend your_appeal_rejected: Jouw bezwaar is afgewezen edit_profile: - basic_information: Algemene informatie - hint_html: "Wat mensen op jouw openbare profiel en naast je berichten zien aanpassen. Andere mensen gaan je waarschijnlijk eerder volgen en hebben vaker interactie met je, wanneer je profiel is ingevuld en je een profielfoto hebt." other: Overige + redesign_body: Het bewerken van je profiel is nu toegankelijk vanaf de profielpagina. + redesign_button: Ga erheen + redesign_title: Er is een nieuwe manier om je profiel te bewerken + email_subscription_mailer: + confirmation: + action: E-mailadres bevestigen + instructions_to_confirm: Bevestig dat je e-mails van %{name} (@%{acct}) wilt ontvangen wanneer deze gebruiker nieuwe berichten publiceert. + instructions_to_ignore: Wanneer je niet zeker weet waarom je deze e-mail hebt ontvangen, kun je deze verwijderen. Je bent niet geabonneerd wanneer je niet op de bovenstaande link klikt. + subject: Je e-mailadres bevestigen + title: E-mailupdates van %{name} ontvangen? + notification: + create_account: Een Mastodon-account registreren + footer: + privacy_html: E-mails worden verzonden van %{domain}, een door Mastodon mogelijk gemaakte server. Raadpleeg het Privacybeleid om te begrijpen hoe deze server jouw persoonsgegevens verwerkt. + reason_for_email_html: Je ontvangt deze e-mail omdat je hebt gekozen voor e-mailupdates van %{name}. Wil je deze e-mails niet ontvangen? Afmelden + interact_with_this_post: + one: Reageer op dit bericht en ontdek vergelijkbare inhoud. + other: Reageer op deze berichten en ontdek vergelijkbare inhoud. + subject: + plural: Nieuwe berichten van %{name} + singular: 'Nieuw bericht: "%{excerpt}"' + title: + plural: Nieuwe berichten van %{name} + singular: 'Nieuw bericht: "%{excerpt}"' + email_subscriptions: + active: Actief + confirmations: + show: + changed_your_mind: Van mening veranderd? + success_html: Je ontvangt nu e-mails wanneer %{name} nieuwe berichten publiceert. Voeg %{sender} toe aan je contactpersonen, zodat deze berichten niet in je spam terechtkomen. + title: Je bent ingeschreven + unsubscribe: Afmelden + inactive: Inactief + status: Status + subscribers: Abonnees emoji_styles: auto: Auto native: Systeemeigen @@ -1457,10 +1492,8 @@ nl: mutes: Genegeerde accounts storage: Mediabestanden featured_tags: - add_new: Nieuwe toevoegen errors: limit: Je hebt al het maximale aantal hashtags uitgelicht - hint_html: "Toon je belangrijkste hashtags op je profiel Deze worden prominent op je openbare profiel getoond en stelt mensen in staat om je openbare berichten per hashtag te bekijken. Het is een goed hulpmiddel om creatieve werkzaamheden of langetermijnprojecten bij te houden." filters: contexts: account: Profielen @@ -1653,21 +1686,6 @@ nl: failed_sign_in_html: Mislukte inlogpoging met %{method} van %{ip} (%{browser}) successful_sign_in_html: Succesvol ingelogd met %{method} van %{ip} (%{browser}) title: Inloggeschiedenis - mail_subscriptions: - unsubscribe: - action: Ja, afmelden - complete: Afgemeld - confirmation_html: Weet je zeker dat je je wilt afmelden voor het ontvangen van %{type} van Mastodon op %{domain} op je e-mailadres %{email}? Je kunt je altijd opnieuw abonneren in jouw instellingen voor e-mailmeldingen. - emails: - notification_emails: - favourite: e-mailmeldingen voor favorieten - follow: e-mailmeldingen voor nieuwe volgers - follow_request: e-mailmeldingen voor volgverzoeken - mention: e-mailmeldingen voor vermeldingen - reblog: e-mailmeldingen voor boosts - resubscribe_html: Als je je per ongeluk hebt afgemeld, kun je je opnieuw abonneren in jouw instellingen voor e-mailmeldingen. - success_html: Je ontvangt niet langer %{type} van Mastodon op %{domain} op je e-mailadres %{email}. - title: Afmelden media_attachments: validations: images_and_video: Een video kan niet aan een bericht met afbeeldingen worden gekoppeld @@ -1713,6 +1731,25 @@ nl: copy_account_note_text: 'Deze gebruiker is verhuisd vanaf %{acct}. Je hebt de volgende opmerkingen over dat account gemaakt:' navigation: toggle_menu: Menu tonen/verbergen + notification_fallbacks: + added_to_collection: + title_html: "%{name} heeft jou aan een verzameling toegevoegd" + admin_report: + title_html: "%{name} rapporteerde %{target}" + admin_sign_up: + title_and_others_html: + one: "%{name} en één ander hebben zich geregistreerd" + other: "%{name} en %{count} anderen hebben zich geregistreerd" + title_html: "%{name} heeft zich geregistreerd" + collection_update: + title_html: "%{name} werkte een verzameling bij waar jij in zit" + generic: + sign_in: In de Mastodon web-app inloggen + moderation_warning: + title: Je hebt een moderatie-waarschuwing ontvangen. + severed_relationships: + summary_html: Een beheerder van %{from} heeft %{target} geschorst, wat betekent dat je geen updates meer van deze gebruiker kunt ontvangen of met deze gebruiker kunt communiceren. Ga naar %{link} voor een overzicht van verloren verbindingen. + title: Verloren verbindingen met %{name} notification_mailer: admin: report: @@ -1805,6 +1842,8 @@ nl: posting_defaults: Jouw nieuwe berichten public_timelines: Openbare tijdlijnen privacy: + email_subscriptions: Berichten per e-mail verzenden + email_subscriptions_hint_html: Voeg een e-mailaanmeldformulier toe aan je profiel dat verschijnt voor uitgelogde gebruikers. Wanneer bezoekers hun e-mailadres opgeven en zich abonneren, zal Mastodon e-mailupdates voor jouw openbare berichten verzenden. hint_html: "Hoe wil je dat jouw profiel en berichten kunnen worden gevonden? Een verscheidenheid aan functies in Mastodon kunnen je helpen om een groter publiek te bereiken als ze zijn ingeschakeld. Neem rustig de tijd om deze instellingen te bekijken, om er zo zeker van te zijn dat ze aan jouw wensen voldoen." privacy: Privacy privacy_hint_html: Hoeveel informatie wil je aan andere gebruikers kwijt? Mensen ontdekken interessante accounts en coole apps door te bekijken welke accounts jij volgt en door te bekijken welke app jij gebruikt voor het plaatsen van berichten. Het kan achter zo zijn dat je dit liever verborgen houdt. @@ -2068,6 +2107,28 @@ nl: resume_app_authorization: Applicatie-machtiging hervatten role_requirement: "%{domain} vereist dat je Tweestapsverificatie instelt voordat je Mastodon kunt gebruiken." webauthn: Beveiligingssleutels + unsubscriptions: + create: + action: Ga naar de startpagina van de server + email_subscription: + confirmation_html: Je zult geen e-mails meer van %{name} ontvangen. + title: Je bent afgemeld + user: + confirmation_html: Je zult geen %{type} meer van Mastodon op %{domain} ontvangen. + notification_emails: + favourite: e-mailmeldingen favorieten + follow: e-mailmeldingen volgers + follow_request: e-mailmeldingen volgverzoeken + mention: e-mailmeldingen vermeldingen + reblog: e-mailmeldingen boosts + show: + action: Afmelden + email_subscription: + confirmation_html: Je zult geen e-mails meer ontvangen wanneer dit account nieuwe berichten publiceert. + title: Van %{name} afmelden? + user: + confirmation_html: Je zult geen %{type} meer van Mastodon op %{domain} ontvangen. + title: Van %{type} afmelden? user_mailer: announcement_published: description: 'De beheerders van %{domain} doen een mededeling:' diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f59ba333346ef0..ecf2d272905a68 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -762,6 +762,7 @@ nn: categories: administration: Administrasjon devops: DevOps + email: Epost invites: Innbydingar moderation: Moderering special: Særskild @@ -778,6 +779,8 @@ nn: administrator_description: Brukere med denne tillatelsen omgår enhver tillatelse delete_user_data: Slett brukerdata delete_user_data_description: Lar brukere slette andre brukeres data uten forsinkelse + invite_bypass_approval: Inviter brukarar utan sjekk + invite_bypass_approval_description: Gjev folk som blir inviterte til tenaren av desse brukarane høve til å hoppa over godkjenninga invite_users: Innby brukarar invite_users_description: Tillet at brukarar innbyr nye folk til tenaren manage_announcements: Handtera Kunngjeringar @@ -788,6 +791,8 @@ nn: manage_blocks_description: Let brukarar blokkere e-postleverandørar og IP-adresser manage_custom_emojis: Handtere tilpassa emojiar manage_custom_emojis_description: Let brukarar handtere tilpassa emojiar på tenaren + manage_email_subscriptions: Handter epostabonnement + manage_email_subscriptions_description: Folk kan abonnera på brukarar med dette løyvet via epost manage_federation: Handtere føderasjon manage_federation_description: Let brukarar blokkera eller tillata føderasjon med andre domener, samt styra kva som skal leverast manage_invites: Handsam innbydingar @@ -1229,7 +1234,6 @@ nn: application_mailer: notification_preferences: Endre e-post-innstillingane salutation: Hei %{name}, - settings: 'Endre e-post-innstillingar: %{link}' unsubscribe: Meld av view: 'Sjå:' view_profile: Sjå profil @@ -1414,9 +1418,42 @@ nn: your_appeal_pending: Du har levert en klage your_appeal_rejected: Din klage har blitt avvist edit_profile: - basic_information: Grunnleggande informasjon - hint_html: "Tilpass kva folk ser på den offentlege profilen din og ved sida av innlegga dine. Andre vil i større grad fylgja og samhandla med deg når du har eit profilbilete og har fyllt ut profilen din." other: Anna + redesign_body: No kan du gå til profilredigeringssida din direkte frå profilsida. + redesign_button: Gå dit + redesign_title: Ny profilredigering + email_subscription_mailer: + confirmation: + action: Stadfest epostadressa + instructions_to_confirm: Stadfest at du vil ha epostar frå %{name} (@%{acct}) når dei legg ut nye innlegg. + instructions_to_ignore: Viss du ikkje veit kvifor du fekk denne eposten, kan du sletta han. Du kjem ikkje til å abonnera på noko med mindre du klikkar på lenka over. + subject: Stadfest epostadressa di + title: Vil du ha epostoppdateringar frå %{name}? + notification: + create_account: Lag ein Mastodon-konto + footer: + privacy_html: Epostane kjem frå %{domain}, som er ein tenar driven av Mastodon. Les personvernsida for å sjå korleis tenaren bruker personopplysingane dine. + reason_for_email_html: Du får denne eposten fordi du ville ha epostoppdateringar frå %{name}. Vil du ikkje ha fleire slike? Stopp abonnementet + interact_with_this_post: + one: Gjer noko med dette innlegget og oppdag fleire som det. + other: Gjer noko med desse innlegga og oppdag fleire som dei. + subject: + plural: Nye innlegg frå %{name} + singular: 'Nytt innlegg: "%{excerpt}"' + title: + plural: Nye innlegg frå %{name} + singular: 'Nytt innlegg: "%{excerpt}"' + email_subscriptions: + active: Aktiv + confirmations: + show: + changed_your_mind: Ombestemt deg? + success_html: Frå no vil du få epostar når %{name} legg ut nye innlegg. Legg til %{sender} til kontaktane dine så desse epostane ikkje hamnar i søppelposten din. + title: Du er påmeld + unsubscribe: Stopp abonnementet + inactive: Ikkje aktiv + status: Status + subscribers: Abonnentar emoji_styles: auto: Auto native: Innebygd @@ -1455,10 +1492,8 @@ nn: mutes: Du dempar storage: Medielagring featured_tags: - add_new: Legg til ny errors: limit: Du har allereie valt ut så mange emneknaggar som det går an å gjera - hint_html: "Vel ut dei viktigaste emneknaggane på profilen din. Utvalde emneknaggar er eit flott verkty for å halda oversikt over kreativt arbeid og langtidsprosjekt. Dei er lette å sjå på profilen din, og gjev deg rask tilgang til dine eigne innlegg." filters: contexts: account: Profiler @@ -1651,21 +1686,6 @@ nn: failed_sign_in_html: Mislykket innloggingsforsøk med %{method} fra %{ip} (%{browser}) successful_sign_in_html: Vellykket innlogging med %{method} fra %{ip} (%{browser}) title: Autentiseringshistorikk - mail_subscriptions: - unsubscribe: - action: Ja, meld av - complete: Meldt av - confirmation_html: Er du sikker på at du ikkje lenger ynskjer å motta %{type} frå Mastodon på %{domain} til e-posten din %{email}? Du kan alltids gjera om på dette i innstillingar for e-postvarsling. - emails: - notification_emails: - favourite: e-postar om favorittmarkeringar - follow: e-postar om nye fylgjarar - follow_request: e-postar om fylgjeførespurnadar - mention: e-postar om omtaler - reblog: e-postar om framhevingar - resubscribe_html: Om du har avslutta abonnementet ved ein feil, kan du abonnera på nytt i innstillingar for e-postvarsling. - success_html: Du vil ikkje lenger få %{type} frå Mastodon på %{domain} til e-posten på %{email}. - title: Meld av media_attachments: validations: images_and_video: Kan ikkje leggja ved video til status som allereie inneheld bilete @@ -1803,6 +1823,8 @@ nn: posting_defaults: Innleggsstandarder public_timelines: Offentlege tidsliner privacy: + email_subscriptions: Send innlegg via e-post + email_subscriptions_hint_html: Lag eit skjema for epost-påmelding til profilen din for utlogga brukarar. Når folk skriv inn epostadressa og melder seg på, vil Mastodon senda epostoppdateringar for dei offentlege innlegga dine. hint_html: "Tilpass korleis du vil at andre skal finna profilen og innlegga dine. Mastodon har fleire funksjonar du kan ta i bruk for å få kontakt med eit større publikum. Sjå gjerne gjennom innstillingane slik at du er sikker på at dei passar til deg og din bruk." privacy: Personvern privacy_hint_html: Kontroller kor mykje du vil dela. Folk finn interessante profilar og fine appar ved å sjå gjennom kva andre fylgjer og kva appar dei legg ut innlegg med, men det kan henda du vil gøyma desse opplysingane. @@ -2066,6 +2088,28 @@ nn: resume_app_authorization: Hald fram å godkjenna applikasojnen role_requirement: "%{domain} krev at du set opp tofaktorinnlogging før du kan bruka Mastodon." webauthn: Sikkerhetsnøkler + unsubscriptions: + create: + action: Gå til heimesida til tenaren + email_subscription: + confirmation_html: Du får ikkje fleire epostar frå %{name}. + title: Du har meldt deg av + user: + confirmation_html: Du får ikkje lenger %{type} frå Mastodon på %{domain}. + notification_emails: + favourite: epostar om favorittmarkeringar + follow: epostar om nye fylgjarar + follow_request: epostar om fylgjeførespurnader + mention: epostar om omtaler + reblog: epostar om framhevingar + show: + action: Stopp abonnementet + email_subscription: + confirmation_html: Du får ikkje fleire epostar om når denne brukarkontoen legg ut nye innlegg. + title: Stopp å abonnera på %{name}? + user: + confirmation_html: Du sluttar å få %{type} frå Mastodon på %{domain}. + title: Stopp å abonnera på %{type}? user_mailer: announcement_published: description: 'Styrarane på %{domain} har ei kunngjering:' diff --git a/config/locales/no.yml b/config/locales/no.yml index f6dd1e9c8de88e..42853f0d89c5fe 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1165,8 +1165,6 @@ your_appeal_pending: Du har levert en anke your_appeal_rejected: Anken din har blitt avvist edit_profile: - basic_information: Grunnleggende informasjon - hint_html: "Tilpass hva folk ser på din offentlige profil og ved siden av dine innlegg. Det er mer sannsynlig at andre mennesker følger deg tilbake og samhandler med deg når du har fylt ut en profil og et profilbilde." other: Annet errors: '400': Forespørselen du sendte inn var ugyldig eller feil. @@ -1202,10 +1200,8 @@ mutes: Du demper storage: Medialagring featured_tags: - add_new: Legg til ny errors: limit: Du har allerede fremhevet det maksimale antall emneknagger - hint_html: "Hva er utvalgte emneknagger? De vises frem tydelig på din offentlige profil, og lar folk bla i dine offentlige innlegg som spesifikt har de emneknaggene. De er et bra verktøy for å holde styr på kreative verk eller langtidsprosjekter." filters: contexts: account: Profiler @@ -1352,11 +1348,6 @@ failed_sign_in_html: Mislykket innloggingsforsøk med %{method} fra %{ip} (%{browser}) successful_sign_in_html: Vellykket innlogging med %{method} fra %{ip} (%{browser}) title: Autentiseringshistorikk - mail_subscriptions: - unsubscribe: - action: Ja, avslutt abonnement - complete: Abonnement avsluttet - title: Avslutt abonnement media_attachments: validations: images_and_video: Kan ikke legge ved video på en status som allerede inneholder bilder diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 4efdbc6a921d94..ecb7c0680b6fe2 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -562,8 +562,6 @@ oc: lists: Listas mutes: Personas rescondudas storage: Mèdias gardats - featured_tags: - add_new: Ajustar una etiqueta nòva filters: contexts: account: Perfils diff --git a/config/locales/pl.yml b/config/locales/pl.yml index e0ae1f7106095d..56045f676d1887 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1230,7 +1230,6 @@ pl: application_mailer: notification_preferences: Zmień ustawienia e-maili salutation: "%{name}," - settings: 'Zmień ustawienia e-maili: %{link}' unsubscribe: Anuluj subskrypcję view: 'Zobacz:' view_profile: Wyświetl profil @@ -1413,8 +1412,6 @@ pl: your_appeal_pending: Zgłosiłeś odwołanie your_appeal_rejected: Twoje odwołanie zostało odrzucone edit_profile: - basic_information: Podstawowe informacje - hint_html: "Dostosuj to, co ludzie widzą na Twoim profilu publicznym i obok Twoich wpisów. Inne osoby są bardziej skłonne obserwować Cię i wchodzić z Tobą w interakcje, gdy masz wypełniony profil i zdjęcie profilowe." other: Inne emoji_styles: auto: Automatycznie @@ -1454,10 +1451,8 @@ pl: mutes: Wyciszeni storage: Urządzenie przechowujące dane featured_tags: - add_new: Dodaj nowy errors: limit: Przekroczono maksymalną liczbę hasztagów - hint_html: "Czym są wyróżnione hashtagi? Są one na stałe wyświetlane na Twoim profilu i pozwalają innym na przeglądanie Twoich wpisów używających tych hashtagów. Są doskonałym narzędziem do śledzenia kreatywnej twórczości czy długoterminowych projektów." filters: contexts: account: Profile @@ -1687,21 +1682,6 @@ pl: failed_sign_in_html: Próba logowania zakończona niepowodzeniem przy pomocy %{method} z %{ip} (%{browser}) successful_sign_in_html: Pomyślne logowanie przy pomocy %{method} z %{ip} (%{browser}) title: Historia uwierzytelniania - mail_subscriptions: - unsubscribe: - action: Tak, wypisuję się - complete: Anulowano subskrypcję - confirmation_html: Czy na pewno chcesz wypisać się z otrzymywania %{type} z Mastodona na %{domain} na adres %{email}? Zawsze możesz zapisać się ponownie ze strony ustawień powiadomień mejlowych. - emails: - notification_emails: - favourite: powiadomień mejlowych o polubieniach - follow: powiadomień mejlowych o obserwujących - follow_request: mejli o prośbach o możliwość obserwowania - mention: powiadomień mejlowych o wspomnieniach - reblog: powiadomień mejlowych o podbiciach - resubscribe_html: W przypadku przypadkowego wypisania możesz zapisać się ponownie z ustawień powiadomień mejlowych. - success_html: Już nie będziesz otrzymywać %{type} z Mastodona na %{domain} na adres %{email}. - title: Anuluj subskrypcję media_attachments: validations: images_and_video: Nie możesz załączyć pliku wideo do wpisu, który zawiera już zdjęcia diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index e8789d4236f20b..a003e1da0557e9 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -762,6 +762,7 @@ pt-BR: categories: administration: Administração devops: DevOps + email: E-mail invites: Convites moderation: Moderação special: Especial @@ -778,6 +779,8 @@ pt-BR: administrator_description: Usuários com essa permissão irão ignorar todas as permissões delete_user_data: Apagar Dados de Usuário delete_user_data_description: Permitir aos usuários apagar os dados de outros usuários instantaneamente + invite_bypass_approval: Convidar usuário sem revisão + invite_bypass_approval_description: Permitir pessoas convidadas para esse servidor por esses usuários para dispensar aprovação por moderação invite_users: Convidar Usuários invite_users_description: Permite que os usuários convidem novas pessoas para o servidor manage_announcements: Gerenciar Avisos @@ -788,6 +791,8 @@ pt-BR: manage_blocks_description: Permite aos usuários bloquear provedores de e-mail e endereços IP manage_custom_emojis: Gerenciar Emojis Personalizados manage_custom_emojis_description: Permite aos usuários gerenciar emojis personalizados no servidor + manage_email_subscriptions: Gerenciar assinaturas do e-mail + manage_email_subscriptions_description: Permitir que usuários se inscrevam com essa permissão por e-mail manage_federation: Gerenciar Federação manage_federation_description: Permite aos usuários bloquear ou permitir federação com outros domínios e controlar a entregabilidade manage_invites: Gerenciar convites @@ -1229,7 +1234,6 @@ pt-BR: application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," - settings: 'Alterar preferências de e-mail: %{link}' unsubscribe: Desinscrever view: 'Ver:' view_profile: Ver perfil @@ -1279,6 +1283,7 @@ pt-BR: progress: confirm: Confirmar e-mail details: Suas informações + list: Progresso do cadastro review: Nossa avaliação rules: Aceitar regras providers: @@ -1294,6 +1299,7 @@ pt-BR: invited_by: 'Você pode juntar-se a %{domain} graças ao convite que recebeu de:' preamble: Estes são definidos e aplicados pelos moderadores de %{domain}. preamble_invited: Antes de prosseguir, considere as regras de base definidas pelos moderadores de %{domain}. + read_more: Ler mais title: Algumas regras básicas. title_invited: Você recebeu convite. security: Segurança @@ -1412,9 +1418,42 @@ pt-BR: your_appeal_pending: Você enviou uma revisão your_appeal_rejected: Sua revisão foi rejeitada edit_profile: - basic_information: Informações básicas - hint_html: "Personalize o que as pessoas veem no seu perfil público e ao lado de suas publicações. É mais provável que outras pessoas o sigam de volta e interajam com você quando você tiver um perfil preenchido e uma foto de perfil." other: Outro + redesign_body: A edição de perfil pode ser acessada diretamente a partir da página de perfil. + redesign_button: Ir para lá + redesign_title: Há uma nova experiência de edição de perfil + email_subscription_mailer: + confirmation: + action: Confirmar endereço de e-mail + instructions_to_confirm: Confirme que você gostaria de receber e-mails do %{name} (@%{acct}) quando postarem novas publicações. + instructions_to_ignore: Se você não tem certeza por que recebeu esse e-mail, você pode excluir. Você não será inscrito se não clicar no link acima. + subject: Confirme seu endereço de e-mail + title: Obter atualizações de e-mail do %{name}? + notification: + create_account: Criar uma conta Mastodon + footer: + privacy_html: E-mails são enviados do %{domain}, Um servidor alimentado pelo Mastodon. Para entender como esse servidor processa seus dados pessoais, consulte a Política de privacidade. + reason_for_email_html: Você está recebendo esse e-mail porque você optou por receber atualizações do %{name}. Não quer receber esses e-mails? Cancelar + interact_with_this_post: + one: Interaja com essa publicação e descubra mais como essa. + other: Interaja com essas publicações e descubra mais. + subject: + plural: Novas publicações de %{name} + singular: 'Nova publicação: "%{excerpt}"' + title: + plural: Novas publicações de %{name} + singular: 'Nova publicação: "%{excerpt}"' + email_subscriptions: + active: Ativo + confirmations: + show: + changed_your_mind: Mudou de ideia? + success_html: Agora você começará a receber e-mails quando %{name} publicar novas postagens. Adicione %{sender} para seus contatos para que essas publicações não apareçam em sua caixa de Spam. + title: Você está registrado + unsubscribe: Cancelar inscrição + inactive: Inativo + status: Situação + subscribers: Inscritos emoji_styles: auto: Automático native: Nativo @@ -1453,10 +1492,8 @@ pt-BR: mutes: Você silenciou storage: Armazenamento de mídia featured_tags: - add_new: Adicionar hashtag errors: limit: Você já destacou o número máximo de hashtags - hint_html: "O que são hashtags em destaque? Elas são exibidas no seu perfil público e permitem que as pessoas acessem suas publicações públicos que contenham especificamente essas hashtags. São uma excelente ferramenta para acompanhar os trabalhos criativos ou os projetos de longo prazo." filters: contexts: account: Perfis @@ -1649,21 +1686,6 @@ pt-BR: failed_sign_in_html: Falha na tentativa de login com %{method} de %{ip} (%{browser}) successful_sign_in_html: Login bem-sucedido com %{method} de %{ip} (%{browser}) title: Histórico de autenticação - mail_subscriptions: - unsubscribe: - action: Sim, cancelar subscrição - complete: Desinscrito - confirmation_html: Tem certeza que deseja cancelar a assinatura de %{type} para Mastodon no %{domain} para o seu endereço de e-mail %{email}? Você sempre pode se inscrever novamente nas configurações de notificação de email. - emails: - notification_emails: - favourite: emails de notificação favoritos - follow: seguir emails de notificação - follow_request: emails de seguidores pendentes - mention: emails de notificação de menções - reblog: emails de notificação de impulsos - resubscribe_html: Se você cancelou sua inscrição por engano, você pode se inscrever novamente em suas configurações de notificações por e-mail. - success_html: Você não mais receberá %{type} no Mastodon em %{domain} ao seu endereço de e-mail %{email}. - title: Cancelar inscrição media_attachments: validations: images_and_video: Não foi possível anexar um vídeo a uma publicação que já contém imagens @@ -1802,6 +1824,8 @@ pt-BR: posting_defaults: Padrões de publicação public_timelines: Linhas públicas privacy: + email_subscriptions: Enviar publicações por e-mail + email_subscriptions_hint_html: Adicione um formulário de inscrição por e-mail ao seu perfil, que será exibido para usuários que não estiverem conectados. Quando os visitantes inserirem seu endereço de e-mail e se inscreverem, o Mastodon enviará atualizações por e-mail sobre suas publicações públicas. hint_html: "Personalize como você quer que seu perfil e suas publicações sejam encontrados. Uma variedade de funcionalidades no Mastodon pode ajudar a alcançar um público mais amplo quando habilitado. Reserve um momento para revisar estas configurações para garantir que atendem ao seu caso de uso." privacy: Privacidade privacy_hint_html: Controle o quanto você deseja revelar para o benefício de outros. As pessoas descobrem perfis interessantes e aplicativos legais navegando pelos seguidores de outras pessoas e vendo de quais aplicativos eles publicam, mas você pode preferir manter isso oculto. @@ -2065,6 +2089,28 @@ pt-BR: resume_app_authorization: Retomar autorização de aplicativo role_requirement: "%{domain} exige que você configure a autenticação de dois fatores antes de poder utilizar o Mastodon." webauthn: Chaves de segurança + unsubscriptions: + create: + action: Acesse a página inicial do servidor + email_subscription: + confirmation_html: Você não receberá mais e-mails do %{name}. + title: Você não está registrado + user: + confirmation_html: Você não receberá mais %{type} do Mastodon no %{domain}. + notification_emails: + favourite: e-mails de notificações de favoritos + follow: receber e-mails de notificação + follow_request: seguir e-mails solicitados + mention: e-mails de notificação + reblog: otimizar e-mails de notificação + show: + action: Cancelar inscrição + email_subscription: + confirmation_html: Você deixará de receber e-mails quando esta conta publicar novas postagens. + title: Cancelar inscrição de %{name}? + user: + confirmation_html: Você deixará de receber %{type} do Mastodon no %{domain}. + title: Cancelar inscrição de %{type}? user_mailer: announcement_published: description: 'Os administradores do %{domain} estão fazendo um anúncio:' diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index c388a0a48e2e92..cb190e250c75bf 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -298,12 +298,12 @@ pt-PT: resend_user_html: "%{name} reenviou o e-mail de confirmação para %{target}" reset_password_user_html: "%{name} restabeleceu a palavra-passe do utilizador %{target}" resolve_report_html: "%{name} resolveu a denúncia %{target}" - sensitive_account_html: "%{name} marcou a multimédia de %{target} como sensível" + sensitive_account_html: "%{name} marcou a media de %{target} como sensível" silence_account_html: "%{name} limitou a conta de %{target}" suspend_account_html: "%{name} suspendeu a conta de %{target}" unassigned_report_html: "%{name} deixou de atribuir a denúncia %{target}" unblock_email_account_html: "%{name} desbloqueou o endereço de e-mail de %{target}" - unsensitive_account_html: "%{name} desmarcou a multimédia de %{target} como sensível" + unsensitive_account_html: "%{name} desmarcou a media de %{target} como sensível" unsilence_account_html: "%{name} deixou de limitar a conta de %{target}" unsuspend_account_html: "%{name} desativou a suspensão de %{target}" update_announcement_html: "%{name} atualizou a mensagem de manutenção %{target}" @@ -390,7 +390,7 @@ pt-PT: dashboard: active_users: utilizadores ativos interactions: interações - media_storage: Armazenamento de multimédia + media_storage: Armazenamento de media new_users: novos utilizadores opened_reports: denúncias abertas pending_appeals_html: @@ -431,7 +431,7 @@ pt-PT: confirm: Suspender permanent_action: Desfazer a suspensão não restaurará nenhum dado ou relacionamento. preamble_html: Estás prestes a suspender %{domain} e os seus subdomínios. - remove_all_data: Isto irá remover todo o conteúdo, multimédias e dados de perfil para este domínio do teu servidor. + remove_all_data: Isto irá remover todo o conteúdo, media e dados de perfil para este domínio do seu servidor. stop_communication: O teu servidor irá parar de comunicar com estes servidores. title: Confirmar o bloqueio de domínio para %{domain} undo_relationships: Isto irá desfazer qualquer relação entre as contas desses servidores e as tuas. @@ -447,7 +447,7 @@ pt-PT: create: Criar bloqueio hint: O bloqueio do domínio não impedirá a criação de registos de contas na base de dados, mas aplicará retroativamente e automaticamente métodos de moderação específicos a essas contas. severity: - desc_html: "Limitar tornará as mensagens das contas neste domínio invisíveis a qualquer pessoa que não as esteja a seguir. Suspender removerá do teu servidor todo o conteúdo, multimédias e dados de perfil das contas deste domínio. Utiliza Nenhum se apenas quiseres rejeitar ficheiros multimédia." + desc_html: "Limitar tornará as mensagens das contas neste domínio invisíveis a qualquer pessoa que não as esteja a seguir. Suspender removerá do seu servidor todo o conteúdo, media, e dados de perfil das contas deste domínio. Utilize Nenhum se apenas quiser rejeitar ficheiros media." noop: Nenhum silence: Limitar suspend: Suspender @@ -460,8 +460,8 @@ pt-PT: private_comment_hint: Comentário sobre essa limitação de domínio para uso interno pelos moderadores. public_comment: Comentário público public_comment_hint: Comentário sobre esta limitação de domínio para o público geral, se estiver ativada a divulgação da lista de limitações de domínio. - reject_media: Rejeitar ficheiros multimédia - reject_media_hint: Remove ficheiros multimédia armazenados localmente e rejeita a descarga de novos ficheiros no futuro. Sem pertinência para suspensões + reject_media: Rejeitar ficheiros de media + reject_media_hint: Remove ficheiros media armazenados localmente e rejeita o carregamento de novos ficheiros no futuro. Sem pertinência para suspensões reject_reports: Rejeitar denúncias reject_reports_hint: Ignorar todas as denúncias provenientes deste domínio. Sem pertinência para suspensões undo: Anular o bloqueio por domínio @@ -565,7 +565,7 @@ pt-PT: description_html: Pode definir políticas de conteúdo que serão aplicadas a todas as contas deste domínio e a qualquer um dos seus subdomínios. limited_federation_mode_description_html: Pode escolher se deseja permitir a federação com este domínio. policies: - reject_media: Rejeitar multimédia + reject_media: Rejeitar media reject_reports: Rejeitar denúncias silence: Limitar suspend: Suspender @@ -578,7 +578,7 @@ pt-PT: instance_followers_measure: nossos seguidores lá instance_follows_measure: os seguidores deles aqui instance_languages_dimension: Idiomas mais populares - instance_media_attachments_measure: anexos multimédia armazenados + instance_media_attachments_measure: anexos de media armazenados instance_reports_measure: denúncias sobre eles instance_statuses_measure: publicações armazenadas delivery: @@ -616,7 +616,7 @@ pt-PT: total_followed_by_them: Seguido(s) por eles total_followed_by_us: Seguido(s) por nós total_reported: Denúncias sobre eles - total_storage: Anexos multimédia + total_storage: Anexos de media totals_time_period_hint_html: Os totais mostrados abaixo incluem dados referentes ao tempo total. unknown_instance: Atualmente não há registo deste domínio neste servidor. invites: @@ -672,7 +672,7 @@ pt-PT: action_taken_by: Ação tomada por actions: delete_description_html: As publicações denunciadas serão eliminadas e será registada uma reprimenda para ajudar-te a tomar medidas em futuras infrações pela mesma conta. - mark_as_sensitive_description_html: A multimédia nas publicações denunciadas será marcada como sensível e será registada uma reprimenda para ajudar-te a tomar medidas em futuras infrações pela mesma conta. + mark_as_sensitive_description_html: A media nas publicações denunciadas será marcada como sensível e uma punição será registada para ajudá-lo a escalar ações em futuras infrações pela mesma conta. other_description_html: Veja mais opções para controlar o comportamento da conta e personalizar a comunicação para a conta denunciada. resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, não será registada nenhuma reprimenda e a denúncia será fechada. silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando fortemente o seu alcance. Pode sempre ser revertido. Encerra todas as denúncias contra esta conta. @@ -737,7 +737,7 @@ pt-PT: suspend_html: 'Estás prestes a suspender a conta de @%{acct}. Isto irá:' actions: delete_html: Eliminar as publicações ofensivas - mark_as_sensitive_html: Marcar a multimédia das publicações ofensivas como sensível + mark_as_sensitive_html: Marcar a media das publicações ofensivas como sensível silence_html: Limita fortemente o alcance de @%{acct}, tornando o seu perfil e conteúdo apenas visíveis para pessoas que já o está a seguir ou a procurar manualmente o perfil suspend_html: Suspender @%{acct}, tornando o seu perfil e conteúdo inacessíveis e impossível de interagir close_report: 'Marcar denúncia #%{id} como resolvida' @@ -762,6 +762,7 @@ pt-PT: categories: administration: Administração devops: DevOps + email: E-mail invites: Convites moderation: Moderação special: Especiais @@ -778,6 +779,8 @@ pt-PT: administrator_description: Utilizadores com esta permissão irão contornar todas as permissões delete_user_data: Eliminar dados de utilizador delete_user_data_description: Permite que os utilizadores eliminem os dados de outros utilizadores sem tempo de espera + invite_bypass_approval: Convidar Utilizadores sem revisão + invite_bypass_approval_description: Permite que as pessoas convidadas para o servidor por esses utilizadores contornem a aprovação da moderação invite_users: Convidar utilizadores invite_users_description: Permite aos utilizadores convidar pessoas novas para o servidor manage_announcements: Gerir mensagens de manutenção @@ -788,6 +791,8 @@ pt-PT: manage_blocks_description: Permite aos utilizadores bloquearem fornecedores de e-mail e endereços IP manage_custom_emojis: Gerir emojis personalizados manage_custom_emojis_description: Permite aos utilizadores gerirem os emojis personalizados do servidor + manage_email_subscriptions: Gerir Subscrições de E-mail + manage_email_subscriptions_description: Permitir que os utilizadores subscrevam por e-mail às atualizações dos utilizadores com esta permissão manage_federation: Gerir federação manage_federation_description: Permite aos utilizadores bloquearem ou permitirem a federação com outros domínios e controlar a entregabilidade manage_invites: Gerir convites @@ -847,7 +852,7 @@ pt-PT: preamble: A marca do teu servidor diferencia-a de outros servidores na rede. Essa informação pode ser mostrada em vários ambientes, como a interface web do Mastodon, aplicações nativas, visualizações de hiperligações em outros sites e dentro de aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa. title: Marca captcha_enabled: - desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas). Por isso, considera medidas alternativas tais como registo mediante aprovação ou sob convite. + desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas). Por isso, considere medidas alternativas tais como registo mediante aprovação ou sob convite. title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a conta content_retention: danger_zone: Zona de perigo @@ -927,7 +932,7 @@ pt-PT: in_reply_to: Em resposta a language: Idioma media: - title: Multimédia + title: Media metadata: Metadados no_history: Esta publicação não foi editada no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado @@ -943,7 +948,7 @@ pt-PT: view_publicly: Visualizar publicamente view_quoted_post: Ver publicação citada visibility: Visibilidade - with_media: Com multimédia + with_media: Com media strikes: actions: delete_statuses: "%{name} eliminou as publicações de %{target}" @@ -1229,7 +1234,6 @@ pt-PT: application_mailer: notification_preferences: Alterar preferências de e-mail salutation: "%{name}," - settings: 'Alterar preferências de e-mail: %{link}' unsubscribe: Cancelar subscrição view: 'Ver:' view_profile: Ver perfil @@ -1279,6 +1283,7 @@ pt-PT: progress: confirm: Confirmar e-mail details: Os teus dados + list: Progresso da inscrição review: A nossa avaliação rules: Aceitar regras providers: @@ -1294,6 +1299,7 @@ pt-PT: invited_by: 'Pode inscrever-se em %{domain} graças ao convite que recebeu de:' preamble: Estas são definidas e aplicadas pelos moderadores de %{domain}. preamble_invited: Antes de prosseguir, por favor, considere as regras base definidas pelos moderadores de %{domain}. + read_more: Ler mais title: Algumas regras básicas. title_invited: Foi convidado. security: Alterar palavra-passe @@ -1412,9 +1418,42 @@ pt-PT: your_appeal_pending: Submeteste uma contestação your_appeal_rejected: A tua contestação foi rejeitada edit_profile: - basic_information: Informação básica - hint_html: "Personalizq o que as pessoas veem no teu perfil público e junto das tuas publicações. É mais provável que as outras pessoas te sigam de volta ou interajam contigo se tiveres um perfil preenchido e uma imagem de perfil." other: Outro + redesign_body: Agora é possível aceder à edição do perfil diretamente a partir da página de perfil. + redesign_button: Vamos lá + redesign_title: Existe uma nova experiência de edição de perfil + email_subscription_mailer: + confirmation: + action: Confirmar endereço de e-mail + instructions_to_confirm: Confirme que deseja receber e-mails de %{name} (@%{acct}) sempre que publicar uma nova atualização. + instructions_to_ignore: Se não sabe ao certo por que recebeu este e-mail, pode apagá-lo. Não ficará inscrito se não clicar na hiperligação acima. + subject: Confirme o seu endereço de e-mail + title: Quer receber atualizações por e-mail de %{name}? + notification: + create_account: Criar uma conta no Mastodon + footer: + privacy_html: Os e-mails são enviados a partir de %{domain}, um servidor que utiliza a plataforma Mastodon. Para saber como este servidor trata os seus dados pessoais, consulte a Política de Privacidade. + reason_for_email_html: Está a receber este e-mail porque se inscreveu para receber atualizações por e-mail de %{name}. Não quer receber estes e-mails? Cancelar Subscrição + interact_with_this_post: + one: Interaja com esta publicação e descubra outras semelhantes. + other: Interaja com estas publicações e descubra outras semelhantes. + subject: + plural: Novas publicações de %{name} + singular: 'Nova publicação: "%{excerpt}"' + title: + plural: Novas publicações de %{name} + singular: 'Nova publicação: "%{excerpt}"' + email_subscriptions: + active: Ativa + confirmations: + show: + changed_your_mind: Mudou de ideias? + success_html: A partir de agora, começará a receber e-mails sempre que %{name} publicar novas atualizações. Adicione %{sender} aos seus contactos para que essas mensagens não acabem na pasta de correio indesejado. + title: Está inscrito + unsubscribe: Cancelar subscrição + inactive: Inativa + status: Estado + subscribers: Subscritores emoji_styles: auto: Auto native: Nativo @@ -1441,7 +1480,7 @@ pt-PT: archive_takeout: date: Data download: Descarregar o teu arquivo - hint_html: Podes pedir um arquivo das tuas publicações e ficheiros multimédia enviados. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer programa compatível. Podes solicitar um arquivo a cada 7 dias. + hint_html: Pode pedir um arquivo das suas publicações e ficheiros de media carregados. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer programa compatível. Pode solicitar um arquivo a cada 7 dias. in_progress: A compilar o teu arquivo... request: Pedir o teu arquivo size: Tamanho @@ -1451,12 +1490,10 @@ pt-PT: domain_blocks: Bloqueios de domínio lists: Listas mutes: Que ocultaste - storage: Armazenamento de multimédia + storage: Armazenamento de media featured_tags: - add_new: Adicionar nova errors: limit: Já destacaste o número máximo de etiquetas permitido - hint_html: "Coloca as etiquetas mais importantes no teu perfil. Uma excelente ferramenta para acompanhar os teus trabalhos criativos e projetos a longo prazo, as etiquetas em destaque são apresentadas de forma proeminente no teu perfil e permitem um acesso rápido às tuas próprias publicações." filters: contexts: account: Perfis @@ -1649,26 +1686,11 @@ pt-PT: failed_sign_in_html: Tentativa falhada de início de sessão com %{method} de %{ip} (%{browser}) successful_sign_in_html: Sessão corretamente iniciada com %{method} de %{ip} (%{browser}) title: Histórico de autenticação - mail_subscriptions: - unsubscribe: - action: Sim, cancelar subscrição - complete: Subscrição cancelada - confirmation_html: Tens a certeza que desejas cancelar a subscrição para receber %{type} pelo Mastodon em %{domain} no teu e-mail em %{email}? Podes sempre subscrever novamente nas tuas definições de notificação por e-mail. - emails: - notification_emails: - favourite: e-mails de notificação de favoritos - follow: e-mails de notificação de seguidor - follow_request: e-mails de pedido de seguidor - mention: e-mails de notificação de menção - reblog: e-mails de notificação de partilhas - resubscribe_html: Se tiveres anulado a subscrição por engano, podes voltar a subscrevê-la nas definições de notificação por e-mail. - success_html: Não receberás novamente %{type} do Mastodon em %{domain} para o teu e-mail em %{email}. - title: Cancelar subscrição media_attachments: validations: images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens - not_found: Multimédia %{ids} não encontrada ou já anexada a outra publicação - not_ready: Não é possível anexar ficheiros que ainda não acabaram de ser processados. Tenta outra vez daqui a pouco! + not_found: Media %{ids} não encontrada ou já anexada a outra publicação + not_ready: Não é possível anexar ficheiros que ainda não acabaram de ser processados. Tente outra vez daqui a pouco! too_many: Não é possível anexar mais de 4 ficheiros migrations: acct: Mudou-se para @@ -1801,6 +1823,8 @@ pt-PT: posting_defaults: Padrões de publicação public_timelines: Cronologias públicas privacy: + email_subscriptions: Enviar publicações por e-mail + email_subscriptions_hint_html: Adicione um formulário de inscrição para atualizações por e-mail ao seu perfil, que será exibida aos utilizadores sem sessão iniciada. Após os visitantes introduzirem o seu endereço de e-mail e aceitarem receber notificações, o Mastodon enviará atualizações por e-mail das suas publicações públicas. hint_html: "Define como queres que o teu perfil e as tuas publicações são encontradas. Várias funcionalidades no Mastodon podem ajudar a alcançar um público mais amplo quando ativadas. Tira um momento para rever estas definições para garantir que se aplicam ao teu caso de utilização." privacy: Privacidade privacy_hint_html: Controla quanto pretendes partilhar para o benefício de outros. As pessoas descobrem perfis e aplicações interessantes navegando pelos seguidores de outras pessoas e vendo que aplicações eles usam para publicar, mas podes preferir não revelar essa informação. @@ -1997,8 +2021,8 @@ pt-PT: interaction_exceptions_explanation: As publicações que excederem temporariamente o limite de favoritos ou partilhas podem ser mantidas, mesmo que mais tarde baixem do limite. keep_direct: Manter mensagens diretas keep_direct_hint: Não elimina nenhuma das tuas mensagens diretas - keep_media: Manter publicações com anexos de multimédia - keep_media_hint: Não elimina nenhuma das tuas publicações com multimédia anexada + keep_media: Manter publicações com anexos de media + keep_media_hint: Não elimina nenhuma das tuas publicações com media anexada keep_pinned: Manter publicações afixadas keep_pinned_hint: Não elimina nenhuma das tuas publicações afixadas keep_polls: Manter sondagens @@ -2064,6 +2088,28 @@ pt-PT: resume_app_authorization: Retomar autorização de aplicação role_requirement: "%{domain} requer que configure a Autenticação de Dois Fatores antes de poder utilizar o Mastodon." webauthn: Chaves de segurança + unsubscriptions: + create: + action: Ir para a página inicial do servidor + email_subscription: + confirmation_html: Já não irá receber e-mails de %{name}. + title: Cancelou a subscrição + user: + confirmation_html: Já não irá receber %{type} do Mastodon no %{domain}. + notification_emails: + favourite: e-mails de notificação de favorito + follow: e-mails de notificação de seguidor + follow_request: e-mails de notificação de pedido de seguidor + mention: e-mails de notificação de menção + reblog: e-mails de notificação de partilha + show: + action: Cancelar subscrição + email_subscription: + confirmation_html: Deixará de receber e-mails quando esta conta publicar novas atualizações. + title: Cancelar subscrição de %{name}? + user: + confirmation_html: Deixará de receber %{type} do Mastodon no %{domain}. + title: Cancelar subscrição de %{type}? user_mailer: announcement_published: description: 'Os administradores do %{domain} estão a fazer um anúncio:' @@ -2088,14 +2134,14 @@ pt-PT: failed_2fa: details: 'Eis os pormenores da tentativa de início de sessão:' explanation: Alguém tentou iniciar sessão na tua conta, mas forneceu um segundo fator de autenticação inválido. - further_actions_html: Se não foste tu, recomendamos %{action} imediatamente, pois a conta pode ter sido comprometida. + further_actions_html: Se não foi você, recomendamos %{action} imediatamente, pois a conta pode ter sido comprometida. subject: Falha na autenticação do segundo fator title: Falha na autenticação do segundo fator suspicious_sign_in: change_password: alterar a palavra-passe details: 'Eis os pormenores do início de sessão:' explanation: Detetámos um início de sessão na tua conta a partir dum endereço IP novo. - further_actions_html: Se não foste tu, recomendamos %{action} imediatamente e ativar a autenticação de dois fatores para manter a conta segura. + further_actions_html: Se não foi você, recomendamos %{action} imediatamente e a ativação da autenticação de dois fatores para manter a sua conta segura. subject: A tua conta foi acedida a partir de um endereço IP novo title: Um início de sessão novo terms_of_service_changed: @@ -2116,8 +2162,8 @@ pt-PT: explanation: delete_statuses: Algumas das tuas mensagens foram consideradas como violando uma ou mais diretrizes da comunidade e foram subsequentemente removidas pelos moderadores do %{instance}. disable: Já não podes utilizar a tua conta, mas o teu perfil e outros dados permanecem intactos. Podes solicitar uma cópia de segurança dos teus dados, alterar as definições da conta ou eliminar a tua conta. - mark_statuses_as_sensitive: Algumas das tuas publicações foram marcadas como sensíveis pelos moderadores de %{instance}. Isto significa que as pessoas terão de tocar/clicar nas publicações para que possa ser apresentada uma pré-visualização. No futuro, quando publicares, lembra-te que podes marcar os elementos multimédia como problemáticos. - sensitive: A partir de agora, todos os ficheiros multimédia que enviares serão marcados como sensíveis e escondidos sob um aviso pedido para tocar/clicar para os ver. + mark_statuses_as_sensitive: Algumas das suas publicações foram marcadas como sensíveis pelos moderadores de %{instance}. Isto significa que as pessoas terão de clicar nas publicações para ser apresentada uma pré-visualização. No futuro, quando publicar, lembre-se que pode marcar os elementos media como sensíveis. + sensitive: A partir de agora, todos os ficheiros media que carregue serão marcados como sensíveis e escondidos atrás de um aviso de "clicar-para-ver". silence: Podes ainda utilizar a tua conta, mas apenas as pessoas que já te seguem poderão ver as tuas mensagens neste servidor, e poderás ser excluído de várias funcionalidades de divulgação. No entanto, outros poderão ainda seguir-te manualmente. suspend: Não podes mais utilizar a tua conta, e o teu perfil e outros dados já não se encontram acessíveis. Poderás ainda iniciar sessão para solicitar uma cópia dos teus dados até os mesmos serem totalmente removidos em cerca de 30 dias, porém reteremos alguns dados básicos para impedirmos que evites a suspensão. reason: 'Motivo:' diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 626870709d0992..b7b0d4c6096529 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -7,11 +7,18 @@ ru: hosted_on: Сервер Mastodon на сайте %{domain} title: О проекте accounts: + errors: + cannot_be_added_to_collections: Эта учётная запись не может быть добавлена в подборки. followers: few: подписчика many: подписчиков one: подписчик other: подписчиков + following: + few: подписки + many: подписок + one: подписка + other: подписок instance_actor_flash: Эта учетная запись - виртуальный пользователь, используемый для представления самого сервера, а не отдельного пользователя. Она используется для организационных целей и не может быть заморожена. last_active: последняя активность link_verified_on: Владение этой ссылкой было проверено %{date} @@ -55,6 +62,7 @@ ru: label: Изменить роль no_role: Без роли title: Изменить роль пользователя %{username} + collections: Подборки confirm: Подтвердить confirmed: Подтверждена confirming: Ожидает подтверждения @@ -267,6 +275,7 @@ ru: demote_user_html: "%{name} разжаловал(а) пользователя %{target}" destroy_announcement_html: "%{name} удалил(а) объявление %{target}" destroy_canonical_email_block_html: "%{name} снял(а) блокировку e-mail с хэшем %{target}" + destroy_collection_html: "%{name} удалил(а) подборку пользователя %{target}" destroy_custom_emoji_html: "%{name} удалил(а) эмодзи %{target}" destroy_domain_allow_html: "%{name} запретил(а) федерацию с доменом %{target}" destroy_domain_block_html: "%{name} снял(а) блокировку с домена %{target}" @@ -341,6 +350,10 @@ ru: unpublish: Скрыть unpublished_msg: Объявление скрыто updated_msg: Объявление отредактировано + collections: + accounts: Учётные записи + open: Открыть + view_publicly: Посмотреть публично critical_update_pending: Доступно критическое обновление custom_emojis: assign_category: Задать категорию @@ -861,6 +874,7 @@ ru: publish_statistics: Публикация статистики title: Обзор trends: Актуальное + wrapstodon: Wrapstodon domain_blocks: all: Кому угодно disabled: Никому @@ -1217,7 +1231,10 @@ ru: hint_html: Если вы собираетесь переехать с другой учётной записи на эту, то, прежде чем вы сможете перенести подписчиков со старой учётной записи, вы должны связать учётные записи здесь. Это действие само по себе безвредно и обратимо. Начать переезд можно только со старой учётной записи. remove: Отвязать учётную запись appearance: + advanced_settings: Продвинутые настройки animations_and_accessibility: Анимации и доступность + boosting_preferences: Продвижения + boosting_preferences_info_html: "Подсказка: Вне зависимости от настроек, щелчок на кнопке %{icon} Продвинуть с зажатой клавишей Shift немедленно продвинет пост." discovery: Актуальное localization: body: Mastodon переводится добровольцами. @@ -1227,7 +1244,6 @@ ru: application_mailer: notification_preferences: Настроить оповещения по электронной почте salutation: Привет, %{name}! - settings: 'Настроить оповещения по электронной почте можно здесь: %{link}' unsubscribe: Отписаться view: 'Открыть в браузере:' view_profile: Перейти к профилю @@ -1292,6 +1308,7 @@ ru: invited_by: Вы можете зарегистрироваться на сервере %{domain}, потому что вы получили приглашение от preamble: Модераторы сервера %{domain} установили эти правила и следят за их исполнением. preamble_invited: Прежде чем продолжить, ознакомьтесь с основными правилами, установленными модераторами сервера %{domain}. + read_more: Подробнее title: Несколько основных правил. title_invited: Вы получили приглашение. security: Безопасность @@ -1334,6 +1351,9 @@ ru: hint_html: "Подсказка: В течение часа вам не придётся снова вводить свой пароль." invalid_password: Неверный пароль prompt: Введите пароль, чтобы продолжить + color_scheme: + dark: Тёмный + light: Светлый crypto: errors: invalid_key: должен быть действительным Ed25519- или Curve25519-ключом @@ -1403,9 +1423,19 @@ ru: your_appeal_pending: Вы подали апелляцию your_appeal_rejected: Ваша апелляция отклонена edit_profile: - basic_information: Основные данные - hint_html: "Здесь вы можете изменить всё то, что будет отображаться в вашем публичном профиле и рядом с вашими постами. На вас будут чаще подписываться и с вами будут чаще взаимодействовать, если у вас будет заполнен профиль и добавлено фото профиля." other: Разное + redesign_body: Теперь редактирование профиля доступно прямо на странице профиля. + redesign_button: Перейти + redesign_title: Редактируйте профиль по-новому + email_subscription_mailer: + confirmation: + action: Подтвердить адрес электронной почты + email_subscriptions: + confirmations: + show: + unsubscribe: Отписаться + status: Состояние сервера + subscribers: Подписчики emoji_styles: auto: Автоматически native: Как в системе @@ -1444,10 +1474,8 @@ ru: mutes: Игнорируемые пользователи storage: Хранилище медиа featured_tags: - add_new: Добавить errors: limit: Вы достигли максимального количества хештегов, которые можно рекомендовать в профиле - hint_html: "Рекомендуйте самые важные для вас хештеги в своём профиле. Это отличный инструмент для того, чтобы держать подписчиков в курсе ваших долгосрочных проектов и творческих работ. Рекомендации хештегов заметны в вашем профиле и предоставляют быстрый доступ к вашим постам." filters: contexts: account: Профили @@ -1659,6 +1687,9 @@ ru: expires_at: Истекает uses: Регистрации title: Приглашения + link_preview: + potentially_sensitive_content: + hide_button: Скрыть lists: errors: limit: Вы достигли максимального количества списков @@ -1673,21 +1704,6 @@ ru: failed_sign_in_html: Неудачная попытка входа при помощи %{method} с IP-адреса %{ip} (%{browser}) successful_sign_in_html: Вход при помощи %{method} с IP-адреса %{ip} (%{browser}) title: История входов - mail_subscriptions: - unsubscribe: - action: Да, я хочу отписаться - complete: Подписка отменена - confirmation_html: Вы уверены в том, что хотите отписаться от всех %{type}, которые вы получаете на адрес %{email} для учётной записи на сервере Mastodon %{domain}? Вы всегда сможете подписаться снова в настройках уведомлений по электронной почте. - emails: - notification_emails: - favourite: уведомлений о добавлении ваших постов в избранное - follow: уведомлений о новых подписчиках - follow_request: уведомлений о новых запросах на подписку - mention: уведомлений о новых упоминаниях - reblog: уведомлений о продвижении ваших постов - resubscribe_html: Если вы отписались по ошибке и хотите подписаться снова, перейдите на страницу настройки уведомлений по электронной почте. - success_html: Вы отказались от %{type}, которые вы получали на адрес %{email} для вашей учётной записи на сервере Mastodon %{domain}. - title: Отписаться media_attachments: validations: images_and_video: Нельзя добавить видео к посту с изображениями @@ -1810,6 +1826,7 @@ ru: self_vote: Вы не можете голосовать в своих опросах too_few_options: должны содержать не меньше двух опций too_many_options: должны ограничиваться максимум %{max} опциями + vote: Проголосовать preferences: other: Разное posting_defaults: Предустановки для новых постов @@ -1987,9 +2004,18 @@ ru: limit: Вы достигли максимального количества постов, которые можно закрепить в профиле ownership: Нельзя закрепить чужой пост reblog: Нельзя закрепить продвижение + quote_policies: + followers: Только подписчики + nobody: Только я + public: Кто угодно title: "%{name}: «%{quote}»" visibilities: + direct: Личное упоминание + private: Только для подписчиков public: Публичный + public_long: Для кого угодно в интернете + unlisted: Тихий публичный + unlisted_long: Не показывать в результатах поиска Mastodon, трендах и публичных лентах statuses_cleanup: enabled: Автоматически удалять старые посты enabled_hint: По истечении определённого срока с момента публикации ваши посты, кроме соответствующих отмеченным ниже исключениям, будут автоматически удалены @@ -2036,6 +2062,8 @@ ru: past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением. review_link: Посмотреть пользовательское соглашение title: Изменяется пользовательское соглашение на сервере %{domain} + themes: + default: Mastodon time: formats: default: "%d %b %Y, %H:%M" @@ -2061,6 +2089,14 @@ ru: recovery_codes_regenerated: Новые резервные коды сгенерированы recovery_instructions_html: Если случится так, что у вас не будет доступа к смартфону, резервные коды позволят вам восстановить доступ к своей учётной записи. Храните резервные коды в надёжном месте. К примеру, вы можете распечатать их и убрать туда, где лежат другие важные документы. webauthn: Электронные ключи + unsubscriptions: + create: + title: Вы отписались + show: + action: Отписаться + email_subscription: + confirmation_html: Вы перестанете получать уведомления по электронной почте, когда на этой странице будут появляться новые публикации. + title: Отписаться от %{name}? user_mailer: announcement_published: description: 'Администраторы %{domain} опубликовали новое объявление:' @@ -2073,7 +2109,6 @@ ru: subtitle: Ваш аккаунт снова с хорошей репутацией. title: Обжалование одобрено appeal_rejected: - explanation: Апелляция на разблокировку против вашей учетной записи %{strike_date}, которую вы подали на %{appeal_date}, была одобрена. Ваша учетная запись восстановлена. subject: Ваше обжалование от %{date} отклонено subtitle: Ваша апелляция отклонена. title: Обжалование отклонено @@ -2151,17 +2186,21 @@ ru: feature_moderation: Mastodon возвращает принятие решений в ваши руки. Каждый сервер создает свои собственные правила и нормы, которые соблюдаются локально, а не сверху вниз, как в корпоративных социальных сетях, что позволяет наиболее гибко реагировать на потребности различных групп людей. Присоединяйтесь к серверу с правилами, с которыми вы согласны, или создайте свой собственный. feature_moderation_title: Модерирование, каким оно должно быть follow_title: Персонализируйте свою домашнюю ленту + follows_title: На кого подписаться hashtags_recent_count: few: "%{people} человека за последние 2 дня" many: "%{people} человек за последние 2 дня" one: "%{people} человек за последние 2 дня" other: "%{people} человек за последние 2 дня" hashtags_subtitle: Изучите, что было в тренде за последние 2 дня + hashtags_title: Популярные хэштеги hashtags_view_more: Посмотреть другие трендовые хэштеги post_action: Составить post_step: Поприветствуйте мир с помощью текста, фотографий, видео или опросов. post_title: Сделайте свой первый пост share_step: Пусть ваши друзья знают, как найти вас на Mastodon. + share_title: Поделитесь своим профилем Mastodon + sign_in_action: Войти subject: Добро пожаловать в Mastodon title: Добро пожаловать на борт, %{name}! users: @@ -2192,6 +2231,7 @@ ru: error: При удалении электронного ключа произошла ошибка. Попробуйте ещё раз. success: Ваш электронный ключ удалён. invalid_credential: Неверный электронный ключ + nickname: Название nickname_hint: Введите название для нового электронного ключа not_enabled: Вы еще не включили WebAuthn not_supported: В этом браузере отсутствует поддержка электронных ключей diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 6924ba67c4360b..cbad11bcfa4545 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -771,7 +771,6 @@ sc: delete_statuses: Cantzelladura de publicatziones none: Atentzione edit_profile: - basic_information: Informatzione bàsica other: Àteru errors: '400': Sa dimanda chi as imbiadu non fiat vàlida o non fiat curreta. @@ -806,9 +805,6 @@ sc: lists: Listas mutes: Ses ponende a sa muda storage: Immagasinamentu - featured_tags: - add_new: Agiunghe noa - hint_html: "Ite sunt is etichetas in evidèntzia? Sunt ammustradas in evidèntzia in su profilu pùblicu tuo e permitint a sa gente de navigare is messàgios pùblicos tuos in cussas etichetas ispetzìficas. Sunt unu traste perfetu pro tènnere unu registru de òperas creativas o progetos longos." filters: contexts: account: Profilos @@ -913,9 +909,6 @@ sc: authentication_methods: password: crae webauthn: craes de seguresa - mail_subscriptions: - unsubscribe: - title: Annulla sa sutiscritzione media_attachments: validations: images_and_video: Non si podet allegare unu vìdeu in una publicatzione chi cuntenet giai immàgines diff --git a/config/locales/sco.yml b/config/locales/sco.yml index b963a66e3129a7..b1042dbe5040a4 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1026,9 +1026,6 @@ sco: lists: Lists mutes: Ye wheesht storage: Media storage - featured_tags: - add_new: Add new - hint_html: "Whit's featurt hashtags? They get pit prominently on yer public profile an alloo fowk fir tae broose yer public posts specifically unner thae hashtags. They'r a braw tuil fir keepin track o creative warks or lang-term projects." filters: contexts: account: Profiles diff --git a/config/locales/si.yml b/config/locales/si.yml index 40061b262b68dd..c9bc11dadab5d8 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -885,7 +885,6 @@ si: your_appeal_pending: ඔබ අභියාචනයක් ඉදිරිපත් කර ඇත your_appeal_rejected: ඔබගේ අභියාචනය ප්‍රතික්ෂේප කර ඇත edit_profile: - basic_information: මූලික තොරතුරු other: වෙනත් errors: '400': ඔබ ඉදිරිපත් කළ ඉල්ලීම අවලංගු හෝ විකෘති විය. @@ -920,8 +919,6 @@ si: lists: ලැයිස්තු mutes: ඔබ නිහඬ කරන්න storage: මාධ්‍ය ආචයනය - featured_tags: - add_new: අලුතින් එකතු කරන්න filters: contexts: account: පැතිකඩයන් diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml index b720cc176001d4..435732754a2f85 100644 --- a/config/locales/simple_form.an.yml +++ b/config/locales/simple_form.an.yml @@ -46,9 +46,6 @@ an: setting_aggregate_reblogs: No amostrar nuevos retutz pa las publicacions que han estau recientment retutadas (nomás afecta a los retutz recibius recientment) setting_always_send_emails: Normalment las notificacions per correu electronico no se ninviarán quan sías usando Mastodon activament setting_default_sensitive: Lo conteniu multimedia sensible ye amagau per defecto y puede estar amostrau con un click - setting_display_media_default: Amagar conteniu multimedia marcau como sensible - setting_display_media_hide_all: Siempre amagar tot lo conteniu multimedia - setting_display_media_show_all: Amostrar siempre conteniu multimedia marcau como sensible setting_use_blurhash: Los gradientes se basan en as colors d'as imachens amagadas pero fendo borrosos los detalles setting_use_pending_items: Amagar nuevos estaus dezaga d'un clic en cuenta de desplazar automaticament lo feed whole_word: Quan la parola clau u frase ye nomás alfanumerica, nomás será aplicau si concuerda con tota la parola @@ -103,8 +100,6 @@ an: webauthn: Si ye una tecla USB, s'asegure de ficar-la y, si ye necesario, la prete. tag: name: Nomás se puede cambiar lo cajón d'as letras, per eixemplo, pa que sía mas leyible - user: - chosen_languages: Quan se marca, nomás s'amostrarán las publicacions en os idiomas triaus en as linias de tiempo publicas user_role: color: Color que s'utilizará pa lo rol a lo largo d'a interficie d'usuario, como RGB en formato hexadecimal highlighted: Esto fa que lo rol sía publicament visible diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 27d16dcff6413d..e28e4c38a15366 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -4,7 +4,6 @@ ar: hints: account: attribution_domains: واحد لكل سطر. للحماية من الإسنادات الخاطئة. - discoverable: يمكن عرض مشاركاتك العامة وملفك الشخصي أو التوصية به في مختلف مناطق ماستدون ويمكن اقتراح ملفك الشخصي على مستخدمين آخرين. display_name: اسمك الكامل أو اسمك المرح. fields: صفحتك الرئيسية، ضمائرك، عمرك، أي شيء تريده. indexable: قد تظهر منشوراتك الموجهة للعامة في نتائج البحث على ماستدون. فالأشخاص الذين تفاعلوا مع منشوراتك قد يكون بمقدورهم البحث عنها بغظ النظر عن ذلك. @@ -57,9 +56,6 @@ ar: setting_aggregate_reblogs: لا تقم بعرض المشارَكات الجديدة لمنشورات قد قُمتَ بمشاركتها سابقا (هذا الإجراء يعني المشاركات الجديدة فقط التي تلقيتَها) setting_always_send_emails: عادة لن تُرسَل إليك إشعارات البريد الإلكتروني عندما تكون نشطًا على ماستدون setting_default_sensitive: تُخفى الوسائط الحساسة تلقائيا ويمكن اظهارها عن طريق النقر عليها - setting_display_media_default: إخفاء الوسائط المُعيَّنة كحساسة - setting_display_media_hide_all: إخفاء كافة الوسائط دائمًا - setting_display_media_show_all: دائمًا عرض الوسائط المُعيَّنة كحساسة setting_system_scrollbars_ui: ينطبق فقط على متصفحات سطح المكتب البنية على محرك كروم وسفاري setting_use_blurhash: الألوان التدرّجية مبنية على ألوان المرئيات المخفية ولكنها تحجب كافة التفاصيل setting_use_pending_items: إخفاء تحديثات الخط وراء نقرة بدلًا مِن التمرير التلقائي للموجزات @@ -143,7 +139,6 @@ ar: jurisdiction: اذكر الدولة التي يسكن بها الشخص الذي يدفع الفواتير. إذا كانت شركة أو كيان آخر، فاذكر الدولة التي أسست فيها، والمدينة أو المنطقة أو الإقليم أو الولاية حسب الحاجة. min_age: لا يجوز أن يكون دون السن الأدنى الذي تقتضيه قوانين الدولة. user: - chosen_languages: إن تم اختيارها، فلن تظهر على الخيوط العامة إلّا الرسائل المنشورة في تلك اللغات role: الدور يتحكم في أذونات المستخدم. user_role: color: اللون الذي سيتم استخدامه للوظيفه في جميع وحدات واجهة المستخدم، كـ RGB بتنسيق hex @@ -158,7 +153,6 @@ ar: labels: account: attribution_domains: المواقع المسموح لها الإسناد إليك - discoverable: ميزة الملف الشخصي والمنشورات في خوارزميات الاكتشاف fields: name: التسمية value: المحتوى @@ -221,6 +215,8 @@ ar: setting_aggregate_reblogs: جمّع المنشورات المعاد نشرها في الخيوط الزمنية setting_always_send_emails: ارسل إشعارات البريد الإلكتروني دائماً setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة + setting_color_scheme: نظام الألوان + setting_contrast: تباين setting_default_language: لغة النشر setting_default_privacy: مدى ظهور المنشور setting_default_quote_policy: من يستطيع الاقتباس @@ -287,6 +283,7 @@ ar: thumbnail: الصورة المصغرة للخادم trendable_by_default: السماح للوسوم بالظهور على المتداوَلة دون مراجعة مسبقة trends: تمكين المتداوَلة + wrapstodon: تمكين Wrapstodon interactions: must_be_follower: حظر الإشعارات القادمة من حسابات لا تتبعك must_be_following: حظر الإشعارات القادمة من الحسابات التي لا تتابعها @@ -347,7 +344,9 @@ ar: jurisdiction: الاختصاص القانوني min_age: الحد الإدنى للعمر user: + date_of_birth_1i: السنة date_of_birth_2i: شهر + date_of_birth_3i: اليوم role: الدور time_zone: النطاق الزمني user_role: diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 830835993e1c92..396caf2bc6442b 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -25,9 +25,6 @@ ast: 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 escuéndrese por defeutu y pue amosase al calcar nelli - setting_display_media_default: Escondelu cuando se marque como sensible - setting_display_media_hide_all: Escondelu siempre - setting_display_media_show_all: Amosalu siempre setting_use_blurhash: Los dilíos básense nos colores del conteníu multimedia escondíu mas desenfonca los detalles featured_tag: name: 'Equí tán dalgunes de les etiquetes qu''usesti apocayá:' @@ -53,11 +50,8 @@ ast: no_access: Bloquia l'accesu a tolos recursos sign_up_block: Fai que nun se puedan rexistrar cuentes nueves sign_up_requires_approval: Fai que se tengan de revisar les cuentes rexistraes nueves - user: - 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 y los artículos nos algoritmos de descubrimientu fields: name: Etiqueta value: Conteníu diff --git a/config/locales/simple_form.az.yml b/config/locales/simple_form.az.yml index 66f424d3e6379c..44044e9dbb6a8d 100644 --- a/config/locales/simple_form.az.yml +++ b/config/locales/simple_form.az.yml @@ -10,12 +10,11 @@ az: setting_aggregate_reblogs: Təzəlikcə təkrar paylaşılmış göndərişlər üçün yeni təkrar paylaşımlar göstərilməsin (yalnız yeni alınan təkrar paylaşımlara təsir edir). setting_always_send_emails: Normalda, Mastodon-u aktiv olaraq istifadə etdiyiniz zaman e-poçt bildirişləri göndərilməyəcək setting_default_sensitive: Həssas media, ilkin olaraq gizlədilir və bir kliklə göstərilə bilər - setting_display_media_default: Həssas olaraq işarələnmiş medianı gizlət - setting_display_media_hide_all: Medianı həmişə gizlət - setting_display_media_show_all: Medianı həmişə göstər setting_system_scrollbars_ui: Yalnız Safari və Chrome əaslı masaüstü brauzerlərinə tətbiq olunur setting_use_blurhash: Meyillər, gizli vizualların rənglərinə əsaslanır, ancaq detalları gizlədir setting_use_pending_items: Lenti avtomatik diyirləmək əvəzinə, zaman xətti güncəlləmələrini tək bir kliklə gizlət + domain_allow: + domain: Bu domen, bu serverdən veri ala biləcək və ondan gələn verilər emal olunacaq və saxlanılanacaq featured_tag: name: 'Budur, təzəlikcə istifadə etdiyiniz mövzu etiketlərindən bəziləri:' form_admin_settings: @@ -27,8 +26,6 @@ az: no_access: Bütün resurslara erişimi əngəllə sessions: otp: 'Telefon tətbiqiniz tərəfindən yaradılmış iki faktorlu kodu daxil edin və ya geri qaytarma kodlarınızdan birini istifadə edin:' - user: - chosen_languages: İşarələnsə, yalnız seçilmiş dillərdəki göndərişlər ümumi zaman xətlərində nümayiş etdiriləcək user_role: permissions_as_keys: Bu rola sahib istifadəçilər bunlara erişə biləcək... labels: diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index e4ee1062ba44ed..a16e2a6f23fa75 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -4,7 +4,7 @@ be: hints: account: attribution_domains: Адзін на радок. Абараняе ад ілжывых значанняў аўтарства. - discoverable: Вашы публічныя паведамленні і профіль могуць быць паказаны або рэкамендаваны ў розных раздзелах Mastodon, і ваш профіль можа быць прапанаваны іншым карыстальнікам. + discoverable: Вы зможаце трапіць у калекцыі іншых карыстальнікаў. Таксама Вы і Вашыя допісы змогуць з’явіцца ў прапановах карыстальнікаў у іншых месцах для рэкамендацый у Mastodon. display_name: Ваша поўнае імя або ваш псеўданім. fields: Ваша хатняя старонка, займеннікі, узрост, усё, што заўгодна. indexable: Вашыя публічныя допісы могуць з'яўляцца ў рэзультатах пошуку Mastodon. Людзі, якія ўзаемадзейнічалі з вашымі допісамі, усё роўна маюць магчымасць іх знаходзіць. @@ -26,7 +26,7 @@ be: types: disable: Перадухіліць выкарыстанне акаунтаў, але не выдаляць і не хаваць іх змесціва. none: Выкарыстоўвай гэта для папярэджвання карыстальнікаў але без іншых наступстваў. - sensitive: Прымусова адмячаць усе медыя карыстальніка як дэлікатныя. + sensitive: Прымусова пазначаць усе медыя карыстальніка як адчувальныя. silence: Забараніць карыстальніку пасты з публічнай бачнасцю, схаваць ягоныя допісы і апавяшчэнні ад людзей, якія на яго не падпісаныя. Закрывае ўсе скаргі на гэты ўліковы запіс. suspend: Забараніць любыя ўзаемадзеянні ад ці з гэтым уліковым запісам і выдаліць ягонае змесціва. Можна адрабіць цягам 30 дзён. Закрывае ўсе скаргі на гэты ўліковы запіс. warning_preset_id: Неабавязкова. Вы можаце дадаць уласны тэкст напрыканцы шаблону @@ -61,9 +61,9 @@ be: setting_default_quote_policy_private: Допісы для падпісчыкаў, створаныя на Mastodon, нельга цытаваць іншым людзям. setting_default_quote_policy_unlisted: Калі людзі працытуюць Вас, іх допіс таксама будзе схаваны ад стужкі трэндаў. setting_default_sensitive: Далікатныя медыя прадвызначана схаваныя. Іх можна адкрыць адзіным клікам - setting_display_media_default: Хаваць медыя пазначаныя як далікатныя - setting_display_media_hide_all: Заўсёды хаваць медыя - setting_display_media_show_all: Заўсёды паказваць медыя + setting_display_media_default: Папярэджваць перад паказам медыя, пазначаных як адчувальныя + setting_display_media_hide_all: Папярэджваць перад паказам любых медыя + setting_display_media_show_all: Паказваць усе медыя без папярэджання, у тым ліку пазначаныя як адчувальныя setting_emoji_style: Як паказваць эмодзі. "Аўтаматычны" будзе намагацца выкарыстоўваць мясцовыя эмодзі, але для састарэлых браўзераў — Twemoji. setting_quick_boosting_html: Калі ўключана, націсканне на %{boost_icon} значок пашырэння адразу пашырыць допіс замест адкрыцця меню пашырэння/цытавання. Перасоўвае дзеянне цытавання ў меню %{options_icon} (выбару). setting_system_scrollbars_ui: Працуе толькі ў камп'ютарных браўзерах на аснове Safari і Chrome @@ -109,6 +109,7 @@ be: status_page_url: URL старонкі, дзе людзі могуць бачыць стан гэтага сервера падчас збою theme: Тэма, што бачаць новыя карыстальнікі ды наведвальнікі, якія выйшлі. thumbnail: Выява памерамі прыкладна 2:1, якая паказваецца побач з інфармацыяй пра ваш сервер. + thumbnail_description: Апісанне відарысу, каб дапамагчы людзям з парушэннямі зроку зразумець, што на ім. trendable_by_default: Прапусціць ручны агляд трэндавага змесціва. Асобныя элементы ўсё яшчэ можна будзе выдаліць з трэндаў пастфактум. trends: Трэнды паказваюць, якія допісы, хэштэгі і навіны набываюць папулярнасць на вашым серверы. wrapstodon: Прапанаваць мясцовым карыстальнікам інтэрактыўную зводку іх выкарыстання Mastodon на працягу года. Гэта функцыя даступная паміж 10-ым і 31-ым снежня кожнага года і прапаноўваецца карыстальнікам, якія зрабілі хаця б адзін публічны або ціхі публічны допіс, а таксама выкарысталі хаця б адзін хэштэг на працягу года. @@ -134,6 +135,7 @@ be: otp: 'Увядзіце код двухфактарнай аўтэнтыфікацыі з вашага тэлефона або адзін з кодаў аднаўлення:' webauthn: Калі гэта USB прылада, устаўце яе і, калі неабходна, націсніце на яе. settings: + email_subscriptions: Адключэнне захавае бягучых падпісчыкаў, але спыніць адпраўку электронных лістоў. indexable: Старонка вашага профілю можа з'явіцца ў выніках пошуку ў Google, Bing і іншых. show_application: Вы ў любым выпадку зможаце ўбачыць, якая праграма апублікавала ваш допіс. tag: @@ -153,7 +155,7 @@ be: jurisdiction: Дадайце краіну, дзе жыве той, хто плаціць за рахункі. Калі гэта кампанія ці іншая інстанцыя, дадайце краіну, дзе яна знаходзіцца, а таксама (па меры неабходнасці) горад, вобласць, тэрыторыю штата (ЗША). min_age: Не павінен быць ніжэй за мінімальны ўзрост, які патрабуюць законы Вашай юрысдыкцыі. user: - chosen_languages: У публічных стужках будуць паказвацца допісы толькі на тых мовах, якія вы пазначыце + chosen_languages: Калі ёсць пазнака, то ў публічных стужках будуць паказвацца толькі допісы на выбраных мовах. Гэтая налада не ўплывае на Вашу галоўную стужку і спісы. date_of_birth: few: Нам трэба ўпэўніцца, што Вы як мінімум %{count} чалавекі з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. many: Нам трэба ўпэўніцца, што Вы як мінімум %{count} людзей з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. @@ -161,6 +163,7 @@ be: other: Нам трэба ўпэўніцца, што Вы як мінімум %{count} чалавекі з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. role: Роля кантралюе тое, якія дазволы мае карыстальнік. user_role: + collection_limit: Абмяжоўвае колькасць Калекцый, якія можа стварыць адзін карыстальнік гэтай ролі. Майце на ўвазе, калі ласка, што калі Вы зменшыце гэтую колькасць, то карыстальнікі, у якіх быў дасягнуты папярэдні ліміт, не страцяць нічога. Але новыя Калекцыі яны стварыць не змогуць. color: Колер, які будзе выкарыстоўвацца для гэтай ролі па ўсім UI, у фармаце RGB ці hex highlighted: Гэта робіць ролю публічна бачнай name: Публічная назва ролі, калі роля дэманструецца як значок у профілю @@ -178,7 +181,7 @@ be: labels: account: attribution_domains: Сайтам дазволена пазначаць ваша аўтарства - discoverable: Уключыць профіль і допісы ў алгарытмы рэкамендацый + discoverable: Уключыць мяне ў рэкамендацыі fields: name: Пазнака value: Змесціва @@ -248,7 +251,7 @@ be: setting_default_language: Мова допісаў setting_default_privacy: Бачнасць допісаў setting_default_quote_policy: Хто можа цытаваць - setting_default_sensitive: Заўсёды пазначаць кантэнт як далікатны + setting_default_sensitive: Заўсёды пазначаць медыя як адчувальныя setting_delete_modal: Папярэджваць перад выдаленнем допісу setting_disable_hover_cards: Адключыць перадпрагляд профілю пры навядзенні setting_disable_swiping: Адключыць прагортванні @@ -317,6 +320,7 @@ be: status_page_url: URL старонкі статусу theme: Тэма па змаўчанні thumbnail: Мініяцюра сервера + thumbnail_description: Альтэрнатыўны тэкст мініяцюры trendable_by_default: Дазваляць трэнды без папярэдняй праверкі trends: Уключыць трэнды wrapstodon: Уключыць Вынікадон @@ -358,6 +362,7 @@ be: hint: Дадатковая інфармацыя text: Правіла settings: + email_subscriptions: Уключыць падпіскі праз электронную пошту indexable: Індэксаваць профіль у пошукавых сістэмах show_application: Паказваць з якой праграмы было адпраўлена паведамленне tag: @@ -386,6 +391,7 @@ be: role: Роля time_zone: Часавы пояс user_role: + collection_limit: Максімальная колькасць Калекцый на карыстальніка color: Колер значка highlighted: Паказваць ролю як значок у профілях name: Назва diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 9d2990ba9cfb05..e9f1344789e32d 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -4,7 +4,6 @@ bg: hints: account: attribution_domains: Едно на ред. Защитава от фалшиви атрибути. - discoverable: Вашите публични публикации и профил може да се представят или препоръчват в различни области на Mastodon и вашия профил може да се предлага на други потребители. display_name: Вашето пълно име или псевдоним. fields: Вашата начална страница, местоимения, години, всичко що искате. indexable: Вашите обществени публикации може да се появят в резултатите от търсене в Mastodon. Взаимодействалите с публикациите ви може да ги търсят независимо. @@ -57,9 +56,6 @@ bg: setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания) setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване - setting_display_media_default: Скриване на мултимедия отбелязана като деликатна - setting_display_media_hide_all: Винаги скриване на мултимедията - setting_display_media_show_all: Винаги показване на мултимедията setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри. setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите @@ -143,7 +139,6 @@ bg: jurisdiction: Впишете държавата, където живее всеки, който плаща сметките. Ако е дружество или друго образувание, то впишете държавата, в която е регистрирано, и градът, регионът, територията или щатът според случая. min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви. user: - chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси date_of_birth: one: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това. other: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това. @@ -165,7 +160,6 @@ bg: labels: account: attribution_domains: Уебсайтове, позволено им да приписват авторството ви - discoverable: Включване на профил и публикации в алгоритмите за откриване fields: name: Етикет value: Съдържание diff --git a/config/locales/simple_form.bn.yml b/config/locales/simple_form.bn.yml index 607e6bd8e0697e..976f058b861988 100644 --- a/config/locales/simple_form.bn.yml +++ b/config/locales/simple_form.bn.yml @@ -1,11 +1,6 @@ --- bn: simple_form: - hints: - defaults: - setting_display_media_default: সংবেদনশীল হিসেবে চিহ্নিত করা মিডিয়াসমূহ লুকান - setting_display_media_hide_all: সবসময় মিডিয়া লুকান - setting_display_media_show_all: সংবেদনশীল হিসেবে চিহ্নিত করা মিডিয়াসমূহ দেখান labels: account: fields: diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 709dd9fbbc56b6..8d2163a69f1a1a 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -10,7 +10,6 @@ br: header: WEBP, PNG, GIF pe JPG. Bihanoc'h eget %{size}. A vo izelaet betek %{dimensions}px password: Implijit 8 lizherennoù d'an neubeutañ setting_default_sensitive: Ar mediaoù kizidik a zo kuzhet dre ziouer ha gallout a reont bezañ diguzhet dre ur c'hlik - setting_display_media_default: Kuzhat mediaoù aroueziet evel kizidik form_admin_settings: theme: Neuz a vez gwelet gant an implijerien·ezed nevez pe digevreet. form_challenge: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 15904105561d4e..57cd5387e952c2 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -4,7 +4,6 @@ ca: hints: account: attribution_domains: Un per línia. Protegeix de falses atribucions. - discoverable: El teu perfil i els teus tuts públics poden aparèixer o ser recomanats en diverses àreas de Mastodon i el teu perfil pot ser suggerit a altres usuaris. display_name: El teu nom complet o el teu nom divertit. fields: La teva pàgina d'inici, pronoms, edat, el que vulguis. indexable: Els teus tuts públics poden aparèixer en els resultats de cerca de Mastodon. Les persones que han interaccionat amb el teus tuts seran sempre capaços de cercar-los. @@ -59,9 +58,6 @@ ca: setting_default_quote_policy_private: Altres no poden citar publicacions fetes a Mastodon només per a seguidors. setting_default_quote_policy_unlisted: Quan la gent et citi la seva publicació estarà amagada de les línies de temps de tendències. setting_default_sensitive: El contingut sensible està ocult per defecte i es pot mostrar fent-hi clic - setting_display_media_default: Amaga el contingut gràfic marcat com a sensible - setting_display_media_hide_all: Oculta sempre tot el contingut multimèdia - setting_display_media_show_all: Mostra sempre el contingut gràfic setting_emoji_style: Com mostrar els emojis. "Automàtic" provarà de fer servir els emojis nadius, però revertirà a twemojis en els navegadors antics. setting_system_scrollbars_ui: S'aplica només als navegadors d'escriptori basats en Safari i Chrome setting_use_blurhash: Els degradats es basen en els colors de les imatges ocultes, però n'enfosqueixen els detalls @@ -147,7 +143,6 @@ ca: jurisdiction: Indiqueu el país on resideix qui paga les factures. Si és una empresa o una altra entitat, indiqueu el país en què està registrada, així com la ciutat, regió, territori o estat, segons calqui. min_age: No hauria de ser inferior a l'edat mínima exigida per la llei de la vostra jurisdicció. user: - chosen_languages: Quan estigui marcat, només es mostraran els tuts de les llengües seleccionades en les línies de temps públiques date_of_birth: one: Ens hem d'assegurar que teniu com a mínim %{count} any per a fer servir %{domain}. No ho desarem. other: Ens hem d'assegurar que teniu com a mínim %{count} anys per a fer servir %{domain}. No ho desarem. @@ -165,7 +160,6 @@ ca: labels: account: attribution_domains: Llocs web que us poden donar crèdit - discoverable: Permet el perfil i el tuts en els algorismes de descobriment fields: name: Etiqueta value: Contingut diff --git a/config/locales/simple_form.ckb.yml b/config/locales/simple_form.ckb.yml index bf503df1390079..6b86595d8c5099 100644 --- a/config/locales/simple_form.ckb.yml +++ b/config/locales/simple_form.ckb.yml @@ -39,9 +39,6 @@ ckb: scopes: APIـیەکانی بەرنامەنووسی کە ئەم ماڵپەڕە دەستپێگەیشتنی لەگەڵیان هیە. ئەگەر بەرزترین ئاست هەڵبژێرن ئیتر نیاز بە بژاردەی ئاستی نزم نییە. setting_aggregate_reblogs: بۆ ئەو دووبارە توتانە کە بە نوێیی پێتان نیشان دراوە،دووبارە توتەکانی پێشتر زیاد مەکە(تەنها کاریگەری لەسەر توتەکانی ئەم دواییە هەیە) setting_default_sensitive: میدیای هەستیار لە بنەڕەت شاراوەیە و دەتوانرێت بە کلیکیک ئاشکرا بکرێت - setting_display_media_default: ئەو میدیایانە بشارەوە کە هەستیارن - setting_display_media_hide_all: هەمیشە میدیا بشارەوە - setting_display_media_show_all: هەمیشە میدیا نیشان بدە setting_use_blurhash: سێبەرەکان لە سەر بنەمای ڕەنگەکانی بەکارهاتوو لە وێنە داشاراوەکان دروست دەبن بەڵام وردەزانیاری وێنە تێیدا ڕوون نییە setting_use_pending_items: لەجیاتی ئەوەی بە خۆکارانە کێشان هەبێت لە نووسراوەکان بە کرتەیەک بەڕۆژبوونی پێرستی نووسراوەکان بشارەوە whole_word: کاتێک کلیل‌وشە بریتییە لە ژمارە و پیت، تنەها کاتێک پەیدا دەبێت کە لەگەڵ گشتی وشە لە نێو دەقەکە هاوئاهەنگ بێت، نە تەنها لەگەڵ بەشێک لە وشە @@ -68,8 +65,6 @@ ckb: webauthn: ئەگەر کلیلی USB بێت دڵنیابە لە تێکردنی و ئەگەر پێویست بوو، لێیبدە. tag: name: ئێوە دەتوانن گەورەیی و بجکۆلیی پیتەکان دەستکاری بکەن تاکوو خوێنەوارتر دیاربن - user: - chosen_languages: کاتێک چاودێری کرا، تەنها توتەکان بە زمانە دیاریکراوەکان لە هێڵی‌کاتی گشتی پیشان دەدرێت labels: account: fields: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 80a22c02b1f935..84d5addd282e56 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -37,9 +37,6 @@ co: scopes: L'API à quelle l'applicazione averà accessu. S'è voi selezziunate un parametru d'altu livellu, un c'hè micca bisognu di selezziunà quell'individuali. setting_aggregate_reblogs: Ùn mustrà micca e nove spartere per i statuti chì sò stati spartuti da pocu (tocca solu e spartere più ricente) setting_default_sensitive: I media sensibili sò piattati, salvu un cambiamentu di i paramettri, è ponu esse visti cù un cliccu - setting_display_media_default: Piattà i media marcati cum'è sensibili - setting_display_media_hide_all: Sempre piattà tutti i media - setting_display_media_show_all: Sempre affissà i media marcati cum'è sensibili setting_use_blurhash: I digradati blurhash sò basati nant'à i culori di u ritrattu piattatu ma senza i ditagli setting_use_pending_items: Clicchi per messe à ghjornu i statuti invece di fà sfilà a linea autumaticamente whole_word: Quandu a parolla o a frasa sana hè alfanumerica, sarà applicata solu s'ella currisponde à a parolla sana @@ -68,8 +65,6 @@ co: webauthn: S'ella hè una chjave USB assicuratevi di brancalla è, s'ellu c'hè unu, appughjà nant'à u buttone. tag: name: Pudete solu cambià a cassa di i caratteri, per esempiu per u rende più lighjevule - user: - chosen_languages: Soli i statuti scritti in e lingue selezziunate saranu mustrati indè e linee pubbliche labels: account: fields: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 1f1eb1b32dba30..0741ab2a017918 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -4,7 +4,6 @@ cs: hints: account: attribution_domains: Jeden na řádek. Chrání před falešným připisováním autorství. - discoverable: Vaše veřejné příspěvky a profil mohou být zobrazeny nebo doporučeny v různých oblastech Mastodonu a váš profil může být navrhován ostatním uživatelům. display_name: Vaše celé jméno nebo přezdívka. fields: Vaše domovská stránka, zájmena, věk, cokoliv chcete. indexable: Vaše veřejné příspěvky se mohou objevit ve výsledcích vyhledávání na Mastodonu. Lidé, kteří s vašimi příspěvky interagovaly, je mohou stále vyhledávat. @@ -61,9 +60,6 @@ cs: setting_default_quote_policy_private: Příspěvky pouze pro sledující, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními. setting_default_quote_policy_unlisted: Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt. setting_default_sensitive: Citlivá média jsou ve výchozím stavu skryta a mohou být zobrazena kliknutím - 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_emoji_style: Jak se budou zobrazovat emoji. "Auto" zkusí použít výchozí emoji, ale pro starší prohlížeče použije Twemoji. setting_quick_boosting_html: Pokud je povoleno, kliknutím na %{boost_icon} Boost ikonu okamžitě boostnete místo otevření rozbalovací nabídky boost/citace. Přemístí citaci do nabídky %{options_icon} (Možnosti). setting_system_scrollbars_ui: Platí pouze pro desktopové prohlížeče založené na Safari nebo Chrome @@ -153,7 +149,6 @@ cs: jurisdiction: Uveďte zemi, kde žije ten, kdo platí účty. Pokud je to společnost nebo jiný subjekt, uveďte zemi, v níž je zapsán do obchodního rejstříku, a město, region, území, případně stát, pokud je to povinné. min_age: Neměla by být pod minimálním věkem požadovaným zákony vaší jurisdikce. user: - chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze příspěvky ve zvolených jazycích date_of_birth: few: Musíme se ujistit, že je Vám alespoň %{count}, abyste mohli používat %{domain}. Nebudeme to ukládat. many: Musíme se ujistit, že je Vám alespoň %{count} let, abyste mohli používat %{domain}. Nebudeme to ukládat. @@ -178,7 +173,6 @@ cs: labels: account: attribution_domains: Webové stránky s povolením Vám připsat autorství - discoverable: Zobrazovat profil a příspěvky ve vyhledávacích algoritmech fields: name: Označení value: Obsah diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 646f7f08297aed..b1cbd97ef8682b 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -4,7 +4,7 @@ cy: hints: account: attribution_domains: Un i bob llinell. Yn diogelu rhag priodoli ffug. - discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill. + discoverable: Efallai y byddwch chi'n cael eich cynnwys mewn casgliadau wedi'u creu gan ddefnyddwyr eraill. Efallai y byddwch chi a'ch postiadau cyhoeddus hefyd yn cael eu hawgrymu i ddefnyddwyr mewn profiadau darganfod eraill ledled Mastodon. display_name: Eich enw llawn neu'ch enw hwyl. fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth. indexable: Mae'n bosib y bydd eich postiadau cyhoeddus yn ymddangos yng nghanlyniadau chwilio ar Mastodon. Mae'n bosibl y bydd pobl sydd wedi rhyngweithio â'ch postiadau yn dal i allu eu chwilio. @@ -61,9 +61,9 @@ cy: setting_default_quote_policy_private: Does dim modd dyfynnu postiadau sydd wedi'u hysgrifennu ar Mastodon ar gyfer dim ond dilynwyr. setting_default_quote_policy_unlisted: Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio. setting_default_sensitive: Mae cyfryngau sensitif wedi'u cuddio yn rhagosodedig a gellir eu datgelu trwy glicio - setting_display_media_default: Cuddio cyfryngau wedi eu marcio'n sensitif - setting_display_media_hide_all: Cuddio cyfryngau bob tro - setting_display_media_show_all: Dangos cyfryngau bob tro + setting_display_media_default: Rhybuddio cyn dangos cyfryngau sydd wedi'u marcio fel rhai sensitif + setting_display_media_hide_all: Rhybuddio cyn dangos yr holl gyfryngau + setting_display_media_show_all: Dangos yr holl gyfryngau heb rybudd, gan gynnwys cyfryngau sydd wedi'u marcio fel rhai sensitif setting_emoji_style: Sut i arddangos emojis. Bydd "Awto" yn ceisio defnyddio emoji cynhenid, ond mae'n disgyn yn ôl i Twemoji ar gyfer porwyr traddodiadol. setting_quick_boosting_html: Pan fydd wedi'i alluogi, bydd clicio ar yr eicon Hwb %{boost_icon} yn rhoi hwb ar unwaith yn lle agor y gwymplen hwb/dyfynnu. Mae'n symud y weithred dyfynnu i'r ddewislen %{options_icon} (Dewisiadau). setting_system_scrollbars_ui: Yn berthnasol i borwyr bwrdd gwaith yn seiliedig ar Safari a Chrome yn unig @@ -109,6 +109,7 @@ cy: status_page_url: URL tudalen lle gall pobl weld statws y gweinydd hwn yn ystod cyfnod o doriad gwasanaeth theme: Thema sy'n allgofnodi ymwelwyr a defnyddwyr newydd yn gweld. thumbnail: Delwedd tua 2:1 yn cael ei dangos ochr yn ochr â manylion eich gweinydd. + thumbnail_description: Disgrifiad o'r ddelwedd i helpu pobl â nam ar eu golwg i ddeall ei chynnwys. trendable_by_default: Hepgor adolygiad llaw o gynnwys sy'n tueddu. Gall eitemau unigol gael eu tynnu o dueddiadau o hyd ar ôl y ffaith. trends: Mae pynciau llosg yn dangos y postiadau, hashnodau, a newyddion sy'n denu sylw ar eich gweinydd. wrapstodon: Cynigiwch i ddefnyddwyr lleol greu crynodeb chwareus o'u defnydd o Mastodon yn ystod y flwyddyn. Mae'r nodwedd hon ar gael rhwng y 10fed a'r 31ain o Ragfyr bob blwyddyn, ac mae'n cael ei gynig i ddefnyddwyr a wnaeth o leiaf un postiad Cyhoeddus neu Gyhoeddus Tawel ac sydd wedi defnyddio o leiaf un hashnod o fewn y flwyddyn. @@ -134,6 +135,7 @@ cy: otp: 'Mewnbynnwch y cod dau gam a gynhyrchwyd gan eich ap ffôn neu defnyddiwch un o''ch codau adfer:' webauthn: Os mai allwedd USB ydyw, gwnewch yn siŵr ei fewnosod ac, os oes angen, tapiwch ef. settings: + email_subscriptions: Mae analluogi yn cadw tanysgrifwyr presennol ond yn atal anfon e-byst. indexable: Mae'n bosib y bydd eich tudalen broffil yn ymddangos mewn canlyniadau chwilio ar Google, Bing ac eraill. show_application: Byddwch bob amser yn gallu gweld pa ap a gyhoeddodd eich postiad beth bynnag. tag: @@ -153,7 +155,7 @@ cy: jurisdiction: Rhestrwch y wlad lle mae pwy bynnag sy'n talu'r biliau yn byw. Os yw'n gwmni neu'n endid arall, rhestrwch y wlad lle mae wedi'i ymgorffori, a'r ddinas, rhanbarth, tiriogaeth neu wladwriaeth fel y bo'n briodol. min_age: Ni ddylai fod yn is na'r isafswm oedran sy'n ofynnol gan gyfreithiau eich awdurdodaeth. user: - chosen_languages: Wedi eu dewis, dim ond tŵtiau yn yr ieithoedd hyn bydd yn cael eu harddangos mewn ffrydiau cyhoeddus + chosen_languages: Pan gaiff ei dicio, dim ond postiadau mewn ieithoedd penodol fydd yn cael eu dangos mewn llinellau amser cyhoeddus. Dyw'r gosodiad hwn ddim yn effeithio ar eich llinell amser a'ch rhestrau Cartref. date_of_birth: few: Mae'n rhaid i ni sicrhau eich bod chi yn o leiaf %{count} oed i ddefnyddio %{domain}. Fyddwn ni ddim yn cadw hyn. many: Mae'n rhaid i ni sicrhau eich bod chi yn o leiaf %{count} oed i ddefnyddio %{domain}. Fyddwn ni ddim yn cadw hyn. @@ -163,6 +165,7 @@ cy: zero: Mae'n rhaid i ni sicrhau eich bod chi yn o leiaf %{count} oed i ddefnyddio %{domain}. Fyddwn ni ddim yn cadw hyn. role: Mae'r rôl yn rheoli pa ganiatâd sydd gan y defnyddiwr. user_role: + collection_limit: Yn cyfyngu ar nifer y Casgliadau y gall un defnyddiwr gyda'r rôl hon eu creu. Cofiwch, pan fyddwch chi'n lleihau'r nifer hwn, bydd y defnyddwyr sydd eisoes ar y terfyn hwn ddim yn colli unrhyw Gasgliadau. Ond fyddan nhw ddim yn gallu creu rhai ychwanegol. color: Lliw i'w ddefnyddio ar gyfer y rôl drwy'r UI, fel RGB mewn fformat hecs highlighted: Mae hyn yn gwneud y rôl yn weladwy i'r cyhoedd name: Enw cyhoeddus y rôl, os yw'r rôl wedi'i gosod i'w dangos fel bathodyn @@ -180,7 +183,7 @@ cy: labels: account: attribution_domains: Gwefannau sy'n cael caniatâd i'ch cydnabod chi - discoverable: Proffil nodwedd a phostiadau mewn algorithmau darganfod + discoverable: Dangoswch fi mewn profiadau darganfod fields: name: Label value: Cynnwys @@ -319,6 +322,7 @@ cy: status_page_url: URL tudalen statws theme: Thema ragosodedig thumbnail: Bawdlun y gweinydd + thumbnail_description: Testun amgen llun bach trendable_by_default: Caniatáu pynciau llosg heb adolygiad trends: Galluogi pynciau llosg wrapstodon: Galluogi Wrapstodon @@ -360,6 +364,7 @@ cy: hint: Gwybodaeth ychwanegol text: Rheol settings: + email_subscriptions: Galluogi cofrestru e-bost indexable: Cynnwys tudalen proffil mewn peiriannau chwilio show_application: Dangoswch o ba ap yr anfonoch chi bostiad tag: @@ -388,6 +393,7 @@ cy: role: Rôl time_zone: Cylchfa amser user_role: + collection_limit: Uchafswm nifer y Casgliadau fesul defnyddiwr color: Lliw bathodyn highlighted: Dangos rôl fel bathodyn ar broffiliau defnyddwyr name: Enw diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 4a236d374a4201..99e4525106f8d4 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -4,7 +4,7 @@ da: hints: account: attribution_domains: Ét pr. linje. Beskytter mod falske tilskrivninger. - discoverable: Dine offentlige indlæg og profil kan blive fremhævet eller anbefalet i forskellige områder af Mastodon, og profilen kan blive foreslået til andre brugere. + discoverable: Du kan blive vist i samlinger, som andre brugere har oprettet. Du og dine offentlige indlæg kan også blive foreslået til brugere i andre opdagelsesfunktioner på Mastodon. display_name: Dit fulde navn eller et kaldenavn. fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til. indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset. @@ -61,9 +61,9 @@ da: setting_default_quote_policy_private: Kun-følgere indlæg forfattet på Mastodon kan ikke citeres af andre. setting_default_quote_policy_unlisted: Når folk citerer dig, vil deres indlæg også blive skjult fra trendtidslinjer. setting_default_sensitive: Sensitive medier er som standard skjult og kan vises med et klik - setting_display_media_default: Skjul medier med sensitiv-markering - setting_display_media_hide_all: Skjul altid medier - setting_display_media_show_all: Vis altid medier + setting_display_media_default: Advar før visning af medie markeret som følsomt + setting_display_media_hide_all: Advar før visning af alle medier + setting_display_media_show_all: Vis alle medier uden advarsel, inklusive medier markeret som følsomme setting_emoji_style: Hvordan emojis skal vises. "Auto" vil forsøge at bruge indbyggede emojis, men skifter tilbage til Twemoji i ældre webbrowsere. setting_quick_boosting_html: Når aktiveret, vil klik på %{boost_icon} fremhæv-ikonet straks fremhæve i stedet for at åbne fremhæv/citér-foldudmenuen. Flytter citeringshandlingen til %{options_icon} menuen (Indstillinger). setting_system_scrollbars_ui: Gælder kun for desktop-browsere baseret på Safari og Chrome @@ -104,11 +104,12 @@ da: site_contact_username: Hvordan folk kan kontakte dig på Mastodon. site_extended_description: Evt. yderligere oplysninger, som kan være nyttige for både besøgende og brugere. Kan struktureres vha. Markdown-syntaks. site_short_description: En kort beskrivelse mhp. entydigt at kunne identificere denne server. Hvem kører den, hvem er den for? - site_terms: Brug egen fortrolighedspolitik eller lad stå tomt for standardpolitikken. Kan struktureres med Markdown-syntaks. + site_terms: Brug din egen privatlivspolitik, eller lad feltet være tomt for at bruge standardversionen. Teksten kan formateres med Markdown-syntaks. site_title: Hvordan folk kan henvise til serveren udover domænenavnet. status_page_url: URL'en til en side, hvor status for denne server kan ses under en afbrydelse theme: Tema, som udloggede besøgende og nye brugere ser. thumbnail: Et ca. 2:1 billede vist sammen med dine serveroplysninger. + thumbnail_description: En beskrivelse af billedet, der hjælper personer med synshandicap med at forstå dets indhold. trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen. trends: Trends viser, hvilke indlæg, hashtags og nyhedshistorier der opnår momentum på din server. wrapstodon: Tilbyd lokale brugere at generere en sjov oversigt over deres brug af Mastodon i løbet af året. Denne funktion er tilgængelig mellem den 10. og 31. december hvert år og tilbydes til brugere, der har lavet mindst ét offentligt eller stille offentligt indlæg og brugt mindst ét hashtag i løbet af året. @@ -134,6 +135,7 @@ da: otp: 'Angiv tofaktorkoden generet af din mobil-app eller brug en af dine gendannelseskoder:' webauthn: Er det en USB-nøgle, så sørg for at isætte den og, om nødvendigt, åbne den manuelt. settings: + email_subscriptions: Deaktivering bevarer eksisterende abonnenter, men stopper udsendelsen af e-mails. indexable: Din profilside kan fremgå i søgeresultater på Google, Bing mv. show_application: Du vil dog altid kunne se, hvilken app, der offentliggjorde dit indlæg. tag: @@ -153,12 +155,13 @@ da: jurisdiction: Angiv landet, hvor betaleren af regningerne er bosiddende. Er det en virksomhed eller en anden entitet, angiv det land, hvor det er stiftet, og byen, regionen, området eller staten efter behov. min_age: Bør ikke være under den iht. lovgivningen i det aktuelle retsområde krævede minimumsalder. user: - chosen_languages: Når markeret, vil kun indlæg på de valgte sprog fremgå på offentlige tidslinjer + chosen_languages: Når denne indstilling er markeret, vises kun opslag på de valgte sprog i offentlige tidslinjer. Denne indstilling har ingen indflydelse på din Hjem-tidslinje og dine lister. date_of_birth: one: Vi skal sikre os, at du er mindst %{count} for at kunne bruge %{domain}. Informationen gemmes ikke. other: Vi skal sikre os, at du er mindst %{count} for at kunne bruge %{domain}. Informationen gemmes ikke. role: Rollen styrer, hvilke tilladelser brugeren er tildelt. user_role: + collection_limit: Begrænser antallet af samlinger, som en enkelt bruger med denne rolle kan oprette. Bemærk, at hvis du reducerer dette antal, vil brugere, der allerede har nået denne grænse, ikke miste nogen samlinger. De vil dog ikke kunne oprette flere. color: Farven, i RGB hex-format, der skal bruges til rollen i hele UI'en highlighted: Dette gør rollen offentligt synlig name: Offentligt rollennavn, hvis rollen er opsat til fremstå som et badge @@ -176,7 +179,7 @@ da: labels: account: attribution_domains: Websteder, man må krediteres af - discoverable: Fremhæv profil og indlæg i opdagelsesalgoritmer + discoverable: Vis mig i opdagelsesfunktioner fields: name: Etiket value: Indhold @@ -310,11 +313,12 @@ da: site_contact_username: Kontakt brugernavn site_extended_description: Udvidet beskrivelse site_short_description: Serverbeskrivelse - site_terms: Fortrolighedspolitik + site_terms: Privatlivspolitik site_title: Servernavn status_page_url: Statusside-URL theme: Standardtema thumbnail: Serverminiaturebillede + thumbnail_description: Alt-tekst til miniaturebillede trendable_by_default: Tillad ikke-reviderede trends trends: Aktivér trends wrapstodon: Aktivér Wrapstodon @@ -356,6 +360,7 @@ da: hint: Yderligere oplysninger text: Regel settings: + email_subscriptions: Aktivér e-mail-tilmeldinger indexable: Inkludér profilside i søgemaskiner show_application: Vis, fra hvilken app et indlæg er sendt tag: @@ -384,6 +389,7 @@ da: role: Rolle time_zone: Tidszone user_role: + collection_limit: Maksimalt antal samlinger pr. bruger color: Badge-farve highlighted: Vis rolle som badge på brugerprofiler name: Navn diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 589ad5da470368..60d98c40b6c9fb 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -4,7 +4,7 @@ de: hints: account: attribution_domains: Eine Domain pro Zeile. Dadurch können falsche Zuschreibungen unterbunden werden. - discoverable: Deine öffentlichen Beiträge und dein Profil können in verschiedenen Bereichen auf Mastodon vorgestellt oder empfohlen werden, ebenso kann dein Profil anderen vorgeschlagen werden. + discoverable: Dadurch kann dein Profil in Sammlungen von anderen Profilen vorgestellt werden. Ebenfalls können deine öffentlichen Beiträge in verschiedenen Bereichen auf Mastodon vorgestellt oder empfohlen werden. display_name: Dein richtiger Name oder dein Fantasiename. fields: Deine Website, Pronomen, dein Alter – alles, was du möchtest. indexable: Deine öffentlichen Beiträge können in den Suchergebnissen auf Mastodon erscheinen. Profile, die bereits mit deinen Beiträgen interagiert haben, können deine Beiträge immer auffinden. @@ -61,9 +61,9 @@ de: setting_default_quote_policy_private: Beiträge, die nur für deine Follower bestimmt sind und auf Mastodon verfasst wurden, können nicht von anderen zitiert werden. setting_default_quote_policy_unlisted: Sollten dich andere zitieren, werden ihre zitierten Beiträge ebenfalls nicht in den Trends und öffentlichen Timelines angezeigt. setting_default_sensitive: Medien, die mit einer Inhaltswarnung versehen worden sind, werden – je nach Einstellung – erst nach einem zusätzlichen Klick angezeigt - setting_display_media_default: Medien mit Inhaltswarnung ausblenden - setting_display_media_hide_all: Alle Medien grundsätzlich ausblenden - setting_display_media_show_all: Medien mit Inhaltswarnung immer anzeigen + setting_display_media_default: Vor der Anzeige von Medien, die eine Inhaltswarnung enthalten, hinweisen + setting_display_media_hide_all: Vor der Anzeige von allen Medien hinweisen + setting_display_media_show_all: Alle Medien anzeigen – auch Medien, die eine Inhaltswarnung enthalten setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.' setting_quick_boosting_html: Dadurch wird der Beitrag beim Anklicken des %{boost_icon} Teilen-Symbols sofort geteilt, anstatt das Drop-down-Menü zu öffnen. Die Möglichkeit zum Zitieren wird dabei in %{options_icon} Mehr verschoben. setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren @@ -109,6 +109,7 @@ de: status_page_url: Link zu einer Internetseite, auf der der Serverstatus während eines Ausfalls angezeigt wird theme: Das Design, das nicht angemeldete Personen sehen. thumbnail: Ein Bild ungefähr im 2:1-Format, das neben den Server-Informationen angezeigt wird. + thumbnail_description: Eine Beschreibung des Bildes, damit Menschen, die blind oder sehbehindert sind, den Inhalt besser verstehen und einordnen können. trendable_by_default: Manuelles Überprüfen angesagter Inhalte überspringen. Einzelne Elemente können später noch aus den Trends entfernt werden. trends: Trends zeigen, welche Beiträge, Hashtags und Nachrichten auf deinem Server immer beliebter werden. wrapstodon: Ermöglicht Nutzer*innen dieses Servers einen spielerischen Jahresrückblick ihrer Mastodon-Aktivität zu erstellen. Diese Funktion ist jedes Jahr zwischen dem 10. und 31. Dezember verfügbar und wird Nutzer*innen angeboten, die innerhalb des Jahres mindestens einen öffentlichen oder stillen Beitrag verfasst und mindestens einen Hashtag verwendet haben. @@ -134,6 +135,7 @@ de: otp: 'Gib den Zwei-Faktor-Code von deinem Smartphone ein oder verwende einen deiner Wiederherstellungscodes:' webauthn: Wenn es sich um einen USB-Schlüssel handelt, vergewissere dich, dass du ihn einsteckst und – falls erforderlich – antippst. settings: + email_subscriptions: Wenn deaktiviert, werden zukünftig keine E-Mails mehr versendet. Bestehende Abonnements bleiben jedoch erhalten. indexable: Deine Profilseite kann in Suchergebnissen auf Google, Bing und anderen erscheinen. show_application: Du wirst immer sehen können, über welche App dein Beitrag veröffentlicht wurde. tag: @@ -153,12 +155,13 @@ de: jurisdiction: Gib das Land an, in dem die Person lebt, die alle Rechnungen bezahlt. Falls es sich dabei um ein Unternehmen oder eine andere Einrichtung handelt, gib das Land mit dem Sitz an, sowie die Stadt oder Region. min_age: Sollte nicht unter dem gesetzlich vorgeschriebenen Mindestalter liegen. user: - chosen_languages: Wenn du hier eine oder mehrere Sprachen auswählst, werden ausschließlich Beiträge in diesen Sprachen in deinen öffentlichen Timelines angezeigt + chosen_languages: Falls aktiviert, werden in öffentlichen Timelines nur Beiträge in den ausgewählten Sprachen angezeigt. Deine Startseite sowie Listen sind hiervon nicht betroffen. date_of_birth: one: Wir müssen sicherstellen, dass du mindestens %{count} Jahr alt bist, um %{domain} verwenden zu können. Wir werden diese Information nicht aufbewahren. other: Wir müssen sicherstellen, dass du mindestens %{count} Jahre alt bist, um %{domain} verwenden zu können. Wir werden diese Information nicht aufbewahren. role: Die Rolle bestimmt, welche Berechtigungen das Konto hat. user_role: + collection_limit: Begrenzt die Anzahl an Sammlungen, die Profile mit dieser Rolle erstellen können. Solltest du die Anzahl verringern, verlieren Konten, die die maximal Anzahl bereits erreicht haben, zwar keine Sammlungen – aber sie können keine weiteren erstellen. color: Farbe, die für diese Rolle im Webinterface verwendet wird, als RGB im Hexadezimalsystem highlighted: Moderative/administrative Rolle im öffentlichen Profil anzeigen name: Name der Rolle, der auch öffentlich als Badge angezeigt wird, sofern dies unten aktiviert ist @@ -176,7 +179,7 @@ de: labels: account: attribution_domains: Websites, die auf dich verweisen dürfen - discoverable: Profil und Beiträge in Empfehlungsalgorithmen berücksichtigen + discoverable: Mich beim Entdecken berücksichtigen fields: name: Beschriftung value: Inhalt @@ -315,6 +318,7 @@ de: status_page_url: Statusseite (URL) theme: Standard-Design thumbnail: Vorschaubild des Servers + thumbnail_description: Bildbeschreibung des Vorschaubilds trendable_by_default: Trends ohne vorherige Überprüfung erlauben trends: Trends aktivieren wrapstodon: Wrapstodon aktivieren @@ -337,13 +341,13 @@ de: notification_emails: appeal: Jemand hat Einspruch gegen eine Maßnahme erhoben digest: Zusammenfassung senden - favourite: wenn jemand meinen Beitrag favorisiert + favourite: Jemand favorisierte meinen Beitrag follow: Ein neues Profil folgt mir - follow_request: Ein Profil fragt an, mir zu folgen - mention: Ich wurde erwähnt + follow_request: Jemand möchte mir folgen + mention: Jemand erwähnte mich pending_account: Ein neues Konto muss überprüft werden quote: Jemand zitierte meinen Beitrag - reblog: wenn jemand meinen Beitrag teilt + reblog: Jemand teilte meinen Beitrag report: Eine neue Meldung wurde eingereicht software_updates: all: Über alle Updates informieren @@ -356,6 +360,7 @@ de: hint: Zusätzliche Informationen text: Regel settings: + email_subscriptions: E-Mail-Abonnement aktivieren indexable: Profilseite in Suchmaschinen einbeziehen show_application: App anzeigen, über die ich einen Beitrag veröffentlicht habe tag: @@ -384,6 +389,7 @@ de: role: Rolle time_zone: Zeitzone user_role: + collection_limit: Höchstzahl an Sammlungen pro Profil color: Badge-Farbe highlighted: Badge im Profil name: Name diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 1477f1e2b15572..2a346840dcb3ca 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -4,13 +4,13 @@ el: hints: account: attribution_domains: Μία ανά γραμμή. Προστατεύει από ψευδείς ιδιότητες. - discoverable: Οι δημόσιες αναρτήσεις και το προφίλ σου μπορεί να αναδεικνύονται ή να συνιστώνται σε διάφορους τομείς του Mastodon και το προφίλ σου μπορεί να προτείνεται σε άλλους χρήστες. + discoverable: Μπορεί να αναδειχθείτε σε συλλογές που δημιουργήθηκαν από άλλους χρήστες. Εσείς και οι δημόσιες αναρτήσεις σας μπορεί επίσης να προτείνονται στους χρήστες σε άλλες εμπειρίες ανακάλυψης σε όλη το Mastodon. display_name: Το πλήρες ή το αστείο σου όνομα. fields: Η αρχική σου σελίδα, αντωνυμίες, ηλικία, ό,τι θες. indexable: Οι δημόσιες αναρτήσεις σου μπορεί να εμφανιστούν στα αποτελέσματα αναζήτησης στο Mastodon. Άτομα που έχουν αλληλεπιδράσει με τις αναρτήσεις σου μπορεί να είναι σε θέση να τις αναζητήσουν όπως και να 'χει. note: 'Μπορείς να @επισημάνεις άλλα άτομα ή #ετικέτες.' show_collections: Οι χρήστες θα είναι σε θέση να περιηγηθούν στα άτομα που ακολουθείς και στους ακόλουθούς σου. Άτομα που ακολουθείς θα βλέπουν ότι τους ακολουθείς όπως και να 'χει. - unlocked: Οι χρήστες θα είναι σε θέση να σε ακολουθήσουν χωρίς να ζητούν έγκριση. Κατάργησε την επιλογή αν θες να αξιολογείς τα αιτήματα ακολούθησης και να επιλέξεις αν θα αποδεχθείς ή απορρίψεις νέους ακόλουθους. + unlocked: Οι χρήστες θα είναι σε θέση να σε ακολουθήσουν χωρίς να ζητούν έγκριση. Κατάργησε την επιλογή αν θες να ελέγχεις τα αιτήματα ακολούθησης και να επιλέγεις αν θα αποδεχθείς ή απορρίψεις νέους ακόλουθους. account_alias: acct: Όρισε το username@domain του λογαριασμού από τον οποίο θέλεις να μετακινηθείς account_migration: @@ -39,10 +39,10 @@ el: appeal: text: Μπορείς να κάνετε έφεση σε ένα παράπτωμα μόνο μία φορά defaults: - autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα + autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθήσουν αυτόματα avatar: WEBP, PNG, GIF ή JPG. Το πολύ %{size}. Θα υποβαθμιστεί σε %{dimensions}px bot: Υποδεικνύει σε άλλους χρήστες ότι ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται - context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο + context: Ένα ή περισσότερα πλαίσια στα οποία θα εφαρμόζεται αυτό το φίλτρο current_password: Για λόγους ασφαλείας παρακαλώ γράψε τον κωδικό του τρέχοντος λογαριασμού current_username: Για επιβεβαίωση, παρακαλώ γράψε το όνομα χρήστη του τρέχοντος λογαριασμού digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου @@ -50,25 +50,25 @@ el: header: WEBP, PNG, GIF ή JPG. Το πολύ %{size}. Θα υποβαθμιστεί σε %{dimensions}px inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή που θέλεις να χρησιμοποιήσεις irreversible: Οι φιλτραρισμένες αναρτήσεις θα εξαφανιστούν αμετάκλητα, ακόμη και αν το φίλτρο αργότερα αφαιρεθεί - locale: Η γλώσσα χρήσης, των email και των ειδοποιήσεων push + locale: Η γλώσσα της διεπαφής χρήστη, των email και των ειδοποιήσεων push password: Χρησιμοποίησε τουλάχιστον 8 χαρακτήρες phrase: Θα αντιστοιχηθεί ανεξαρτήτως πεζών/κεφαλαίων ενός κειμένου ή προειδοποίησης περιεχομένου μιας ανάρτησης scopes: Ποια API θα επιτρέπεται να χρησιμοποιήσει η εφαρμογή. Αν επιλέξεις κάποιο υψηλό εύρος εφαρμογής, δε χρειάζεται να επιλέξεις και το καθένα ξεχωριστά. setting_advanced_layout: Εμφάνιση του Mastodon ως διάταξη πολλαπλών στηλών, επιτρέποντάς σας να δείτε το χρονοδιάγραμμα, τις ειδοποιήσεις και μια τρίτη στήλη της επιλογής σας. Δεν συνιστάται για μικρότερες οθόνες. setting_aggregate_reblogs: Απόκρυψη των νέων αναρτήσεων για τις αναρτήσεις που έχουν ενισχυθεί πρόσφατα (επηρεάζει μόνο τις νέες ενισχύσεις) - setting_always_send_emails: Κανονικά οι ειδοποιήσεις μέσω ηλεκτρονικού ταχυδρομείου δεν θα αποστέλλονται όταν χρησιμοποιείτε ενεργά το Mastodon + setting_always_send_emails: Κανονικά οι ειδοποιήσεις μέσω ηλεκτρονικού ταχυδρομείου δεν θα αποστέλλονται όταν χρησιμοποιείτε εκείνη τη στιγμή το Mastodon setting_boost_modal: Όταν ενεργοποιηθεί, η ενίσχυση θα ανοίξει πρώτα ένα διάλογο επιβεβαίωσης στο οποίο μπορείτε να αλλάξετε την ορατότητα της ενίσχυσής σας. setting_default_quote_policy_private: Αναρτήσεις για ακολούθους μόνο που έχουν συνταχθεί στο Mastodon, δεν μπορούν να γίνουν παράθεση από άλλους. setting_default_quote_policy_unlisted: Όταν άτομα σας παραθέτουν, η ανάρτησή τους θα είναι επίσης κρυμμένη από τις δημοφιλείς ροές. - setting_default_sensitive: Τα ευαίσθητα πολυμέσα είναι κρυμμένα και εμφανίζονται με ένα κλικ - setting_display_media_default: Απόκρυψη ευαίσθητων πολυμέσων - setting_display_media_hide_all: Μόνιμη απόκρυψη όλων των πολυμέσων - setting_display_media_show_all: Πάντα εμφάνιση πολυμέσων + setting_default_sensitive: Τα ευαίσθητα πολυμέσα είναι κρυμμένα από προεπιλογή και μπορούν να αποκαλυφθούν με ένα κλικ + setting_display_media_default: Προειδοποίηση πριν την προβολή πολυμέσων που σημαίνονται ως ευαίσθητα + setting_display_media_hide_all: Προειδοποίηση πριν την εμφάνιση όλων των πολυμέσων + setting_display_media_show_all: Εμφάνιση όλων των πολυμέσων χωρίς προειδοποίηση, συμπεριλαμβανομένων των πολυμέσων που σημαίνονται ως ευαίσθητα setting_emoji_style: Πώς να εμφανίσετε emojis. Το "Αυτόματο" θα προσπαθήσει να χρησιμοποιήσει εγγενή emoji, αλλά πέφτει πίσω στο Twemoji για προγράμματα περιήγησης παλαιού τύπου. setting_quick_boosting_html: Όταν ενεργοποιηθεί, κάνοντας κλικ στο εικονίδιο %{boost_icon} Ενίσχυση θα ενισχύσει αμέσως αντί να ανοίξει το αναπτυσσόμενο μενού ενίσχυσης/παράθεσης. Μετακινεί την ενέργεια παράθεσης στο μενού %{options_icon} (Επιλογές). setting_system_scrollbars_ui: Ισχύει μόνο για προγράμματα περιήγησης υπολογιστή με βάση το Safari και το Chrome - setting_use_blurhash: Οι χρωματισμοί βασίζονται στα χρώματα του κρυμμένου πολυμέσου αλλά θολώνουν τις λεπτομέρειες - setting_use_pending_items: Εμφάνιση ενημερώσεων ροής μετά από κλικ αντί για αυτόματη κύλισή τους + setting_use_blurhash: Οι διαβαθμίσεις βασίζονται στα χρώματα του κρυμμένου πολυμέσου αλλά θολώνουν τις λεπτομέρειες + setting_use_pending_items: Εμφάνιση ενημερώσεων ροής μετά από κλικ αντί για αυτόματη κύλιση της ροής username: Μπορείς να χρησιμοποιήσεις γράμματα, αριθμούς και κάτω παύλες whole_word: Όταν η λέξη-κλειδί ή η φράση είναι μόνο αλφαριθμητική, θα εφαρμοστεί μόνο αν αντιστοιχεί με ολόκληρη τη λέξη domain_allow: @@ -109,7 +109,8 @@ el: status_page_url: Το URL μιας σελίδας όπου κάποιος μπορεί να δει την κατάσταση αυτού του διακομιστή κατά τη διάρκεια μιας διακοπής λειτουργίας theme: Θέμα που βλέπουν αποσυνδεδεμένοι επισκέπτες ή νέοι χρήστες. thumbnail: Μια εικόνα περίπου 2:1 που εμφανίζεται παράλληλα με τις πληροφορίες του διακομιστή σου. - trendable_by_default: Παράλειψη χειροκίνητης αξιολόγησης του περιεχομένου σε τάση. Μεμονωμένα στοιχεία μπορούν ακόμη να αφαιρεθούν από τις τάσεις μετέπειτα. + thumbnail_description: Μια περιγραφή της εικόνας για να βοηθήσει τα άτομα με προβλήματα όρασης να κατανοήσουν το περιεχόμενό της. + trendable_by_default: Παράλειψη χειροκίνητου ελέγχου του περιεχομένου σε τάση. Μεμονωμένα στοιχεία μπορούν ακόμη να αφαιρεθούν από τις τάσεις μετέπειτα. trends: Τάσεις δείχνουν ποιες αναρτήσεις, ετικέτες και ειδήσεις προκαλούν έλξη στο διακομιστή σας. wrapstodon: Πρόσφερε στους τοπικούς χρήστες τη δυνατότητα να δημιουργήσουν μια παιχνιδιάρικη σύνοψη της χρήσης τους του Mastodon κατά τη διάρκεια του έτους. Αυτή η λειτουργία είναι διαθέσιμη μεταξύ της 10ης και της 31ης Δεκεμβρίου κάθε έτους, και προσφέρεται σε χρήστες που έκαναν τουλάχιστον μία δημόσια ή ήσυχα δημόσια ανάρτηση και χρησιμοποίησαν τουλάχιστον μία ετικέτα εντός του έτους. form_challenge: @@ -134,6 +135,7 @@ el: otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:' webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά. settings: + email_subscriptions: Η απενεργοποίηση διατηρεί τους υπάρχοντες συνδρομητές αλλά σταματά την αποστολή email. indexable: Η σελίδα του προφίλ σου μπορεί να εμφανιστεί στα αποτελέσματα αναζήτησης στο Google, Bing και άλλες. show_application: Θα είσαι πάντα σε θέση να δεις ποια εφαρμογή δημοσίευσε την ανάρτησή σου όπως και να 'χει. tag: @@ -153,12 +155,13 @@ el: jurisdiction: Ανέφερε τη χώρα όπου ζει αυτός που πληρώνει τους λογαριασμούς. Εάν πρόκειται για εταιρεία ή άλλη οντότητα, ανέφερε τη χώρα όπου υφίσταται, και την πόλη, περιοχή, έδαφος ή πολιτεία ανάλογα με την περίπτωση. min_age: Δεν πρέπει να είναι κάτω από την ελάχιστη ηλικία που απαιτείται από τους νόμους της δικαιοδοσίας σας. user: - chosen_languages: Όταν ενεργοποιηθεί, στη δημόσια ροή θα εμφανίζονται αναρτήσεις μόνο από τις επιλεγμένες γλώσσες + chosen_languages: Όταν ενεργοποιηθεί, μόνο αναρτήσεις σε επιλεγμένες γλώσσες θα εμφανίζονται στις δημόσιες ροές. Αυτή η ρύθμιση δεν επηρεάζει την Αρχική ροή και τις λίστες σας. date_of_birth: one: Πρέπει να βεβαιωθούμε ότι είσαι τουλάχιστον %{count} για να χρησιμοποιήσεις το %{domain}. Δε θα το αποθηκεύσουμε. - other: Πρέπει να βεβαιωθούμε ότι είσαι τουλάχιστον %{count} για να χρησιμοποιήσεις τα %{domain}. Δε θα το αποθηκεύσουμε. + other: Πρέπει να βεβαιωθούμε ότι είσαι τουλάχιστον %{count} για να χρησιμοποιήσεις το %{domain}. Δε θα το αποθηκεύσουμε. role: Ο ρόλος ελέγχει ποια δικαιώματα έχει ο χρήστης. user_role: + collection_limit: Περιορίζει τον αριθμό των Συλλογών που μπορεί να δημιουργήσει ένας μόνο χρήστης με αυτόν τον ρόλο. Παρακαλούμε σημειώστε ότι όταν μειώσετε αυτόν τον αριθμό, οι χρήστες που βρίσκονται ήδη σε αυτό το όριο δεν θα χάσουν καμία Συλλογή. Αλλά δεν θα μπορούν να δημιουργήσουν επιπρόσθετες. color: Το χρώμα που θα χρησιμοποιηθεί για το ρόλο σε ολόκληρη τη διεπαφή, ως RGB σε δεκαεξαδική μορφή highlighted: Αυτό καθιστά το ρόλο δημόσια ορατό name: Δημόσιο όνομα του ρόλου, εάν ο ρόλος έχει οριστεί να εμφανίζεται ως σήμα @@ -176,7 +179,7 @@ el: labels: account: attribution_domains: Ιστοσελίδες που επιτρέπεται να σας αναφέρουν - discoverable: Παροχή προφίλ και αναρτήσεων σε αλγορίθμους ανακάλυψης + discoverable: Ανάδειξέ με σε εμπειρίες ανακάλυψης fields: name: Ετικέτα value: Περιεχόμενο @@ -211,7 +214,7 @@ el: appeal: text: Εξηγήστε γιατί αυτή η απόφαση πρέπει να αντιστραφεί defaults: - autofollow: Προσκάλεσε για να ακολουθήσουν το λογαριασμό σου + autofollow: Προσκάλεσε να ακολουθήσουν τον λογαριασμό σου avatar: Εικόνα προφίλ bot: Αυτός είναι ένας αυτοματοποιημένος λογαριασμός (bot) chosen_languages: Φιλτράρισμα γλωσσών @@ -265,7 +268,7 @@ el: setting_theme: Θέμα ιστότοπου setting_trends: Εμφάνιση σημερινών τάσεων setting_unfollow_modal: Εμφάνιση διαλόγου επιβεβαίωσης πριν την άρση ακολούθησης κάποιου - setting_use_blurhash: Χρωματιστή απόκρυψη για τα κρυμμένα πολυμέσα + setting_use_blurhash: Εμφάνιση χρωματιστών διαβαθμίσεων για τα κρυμμένα πολυμέσα setting_use_pending_items: Αργή λειτουργία severity: Αυστηρότητα sign_in_token_attempt: Κωδικός ασφαλείας @@ -315,6 +318,7 @@ el: status_page_url: URL σελίδας κατάστασης theme: Προεπιλεγμένο θέμα thumbnail: Μικρογραφία διακομιστή + thumbnail_description: Εναλλακτικό κείμενο μικρογραφίας trendable_by_default: Επίτρεψε τις τάσεις χωρίς προηγούμενο έλεγχο trends: Ενεργοποίηση τάσεων wrapstodon: Ενεργοποίηση Wrapstodon @@ -356,6 +360,7 @@ el: hint: Επιπρόσθετες πληροφορίες text: Κανόνας settings: + email_subscriptions: Ενεργοποίηση εγγραφών μέσω email indexable: Συμπερίληψη σελίδας προφίλ στις μηχανές αναζήτησης show_application: Εμφάνιση από ποια εφαρμογή έστειλες μία ανάρτηση tag: @@ -384,6 +389,7 @@ el: role: Ρόλος time_zone: Ζώνη ώρας user_role: + collection_limit: Μέγιστος αριθμός Συλλογών ανά χρήστη color: Χρώμα σήματος highlighted: Εμφάνιση ρόλου ως σήμα στα προφίλ χρηστών name: Όνομα diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index cb376e4f9a0c45..3e819c02f0f8b3 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -4,7 +4,7 @@ en-GB: hints: account: attribution_domains: One per line. Protects from false attributions. - discoverable: Your public posts and profile may be featured or recommended in various areas of Mastodon and your profile may be suggested to other users. + discoverable: You may be featured in collections created by other users. You and your public posts may also be suggested to users in other discovery experiences throughout Mastodon. display_name: Your full name or your fun name. fields: Your homepage, pronouns, age, anything you want. indexable: Your public posts may appear in search results on Mastodon. People who have interacted with your posts may be able to search them regardless. @@ -61,9 +61,9 @@ en-GB: setting_default_quote_policy_private: Followers-only posts authored on Mastodon can't be quoted by others. setting_default_quote_policy_unlisted: When people quote you, their post will also be hidden from trending timelines. setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click - setting_display_media_default: Hide media marked as sensitive - setting_display_media_hide_all: Always hide media - setting_display_media_show_all: Always show media + setting_display_media_default: Warn before showing media marked as sensitive + setting_display_media_hide_all: Warn before showing all media + setting_display_media_show_all: Show all media without warning, including media marked as sensitive setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers. setting_quick_boosting_html: When enabled, clicking on the %{boost_icon} Boost icon will immediately boost instead of opening the boost/quote dropdown menu. Relocates the quoting action to the %{options_icon} (Options) menu. setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome @@ -109,6 +109,7 @@ en-GB: status_page_url: URL of a page where people can see the status of this server during an outage theme: Theme that logged out visitors and new users see. thumbnail: A roughly 2:1 image displayed alongside your server information. + thumbnail_description: A description of the image to help people with visual impairments understand its content. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags, and news stories are gaining traction on your server. wrapstodon: Offer local users to generate a playful summary of their Mastodon use during the year. This feature is available between the 10th and 31st of December of each year, and is offered to users who made at least one Public or Quiet Public post and used at least one hashtag within the year. @@ -134,6 +135,7 @@ en-GB: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' webauthn: If it's a USB key be sure to insert it and, if necessary, tap it. settings: + email_subscriptions: Disabling retains existing subscribers but stops sending emails. indexable: Your profile page may appear in search results on Google, Bing, and others. show_application: You will always be able to see which app published your post regardless. tag: @@ -153,12 +155,13 @@ en-GB: jurisdiction: List the country where whoever pays the bills lives. If it’s a company or other entity, list the country where it’s incorporated, and the city, region, territory, or state as appropriate. min_age: Should not be below the minimum age required by the laws of your jurisdiction. user: - chosen_languages: When checked, only posts in selected languages will be displayed in public timelines + chosen_languages: When checked, only posts in selected languages will be displayed in public timelines. This setting does not affect your Home timeline and lists. date_of_birth: one: We have to make sure you're at least %{count} to use %{domain}. We won't store this. other: We have to make sure you're at least %{count} to use %{domain}. We won't store this. role: The role controls which permissions the user has. user_role: + collection_limit: Limits the number of Collections that a single user with this role can create. Please note that when you decrease this number, users who are already at this limit will not lose any Collections. But they will not be able to create additional ones. color: Colour to be used for the role throughout the UI, as RGB in hex format highlighted: This makes the role publicly visible name: Public name of the role, if role is set to be displayed as a badge @@ -176,7 +179,7 @@ en-GB: labels: account: attribution_domains: Websites allowed to credit you - discoverable: Feature profile and posts in discovery algorithms + discoverable: Feature me in discovery experiences fields: name: Label value: Content @@ -315,6 +318,7 @@ en-GB: status_page_url: Status page URL theme: Default theme thumbnail: Server thumbnail + thumbnail_description: Thumbnail alt text trendable_by_default: Allow trends without prior review trends: Enable trends wrapstodon: Enable Wrapstodon @@ -356,6 +360,7 @@ en-GB: hint: Additional information text: Rule settings: + email_subscriptions: Enable email sign-ups indexable: Include profile page in search engines show_application: Display from which app you sent a post tag: @@ -384,6 +389,7 @@ en-GB: role: Role time_zone: Time Zone user_role: + collection_limit: Maximum number of Collections per user color: Badge colour highlighted: Display role as badge on user profiles name: Name diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index ce1e3949d24d8b..c1e07e8e69a2ee 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -4,7 +4,7 @@ en: hints: account: attribution_domains: One per line. Protects from false attributions. - discoverable: Your public posts and profile may be featured or recommended in various areas of Mastodon and your profile may be suggested to other users. + discoverable: You may be featured in collections created by other users. You and your public posts may also be suggested to users in other discovery experiences throughout Mastodon. display_name: Your full name or your fun name. fields: Your homepage, pronouns, age, anything you want. hide_collections: People will not be able to browse through your follows and followers. People that you follow will see that you follow them regardless. @@ -71,9 +71,9 @@ en: setting_default_searchability: On kmyblue and Fedibird, the search is based on the search permission setting; on Misskey, all public, local public, and non-public posts are searched regardless of this setting; on Mastodon and Firefish, instead of search permission, the "Make public posts freely searchable on other servers" setting in the profile settings is applied. In Mastodon and Firefish, the "Make public posts freely searchable on other servers" setting in the profile settings is applied instead of the search permission. setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click setting_disallow_unlisted_public_searchability: この設定を有効にすると、非収載投稿と検索範囲「誰でも」は両立できず不特定多数からの検索が不可になります。Fedibirdと同じ挙動になります - setting_display_media_default: Hide media marked as sensitive - setting_display_media_hide_all: Always hide media - setting_display_media_show_all: Always show media + setting_display_media_default: Warn before showing media marked as sensitive + setting_display_media_hide_all: Warn before showing all media + setting_display_media_show_all: Show all media without warning, including media marked as sensitive setting_dtl_force_searchability: 'With using #%{tag} tag, your post settings will be changed forcibly' setting_dtl_force_visibility: 'With using #%{tag} tag, your post settings will be changed forcibly' setting_emoji_reaction_policy: Even with this setting, users on non-kmyblue servers are free to put their emoji reaction on the post and share it within the same server. If you simply want to remove the emoji reaction from your own screen, you can disable it from the appearance settings @@ -144,6 +144,7 @@ en: streaming_other_servers_emoji_reaction: Check network lines and server load as large amounts of data are delivered. If the server load is high, try unchecking the box temporarily. theme: Theme that logged out visitors and new users see. thumbnail: A roughly 2:1 image displayed alongside your server information. + thumbnail_description: A description of the image to help people with visual impairments understand its content. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags and news stories are gaining traction on your server. wrapstodon: Offer local users to generate a playful summary of their Mastodon use during the year. This feature is available between the 10th and 31st of December of each year, and is offered to users who made at least one Public or Quiet Public post and used at least one hashtag within the year. @@ -169,6 +170,7 @@ en: otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:' webauthn: If it's an USB key be sure to insert it and, if necessary, tap it. settings: + email_subscriptions: Disabling retains existing subscribers but stops sending emails. indexable: Your profile page may appear in search results on Google, Bing, and others. show_application: You will always be able to see which app published your post regardless. tag: @@ -188,12 +190,13 @@ en: jurisdiction: List the country where whoever pays the bills lives. If it’s a company or other entity, list the country where it’s incorporated, and the city, region, territory or state as appropriate. min_age: Should not be below the minimum age required by the laws of your jurisdiction. user: - chosen_languages: When checked, only posts in selected languages will be displayed in public timelines + chosen_languages: When checked, only posts in selected languages will be displayed in public timelines. This setting does not affect your Home timeline and lists. date_of_birth: one: We have to make sure you're at least %{count} to use %{domain}. We won't store this. other: We have to make sure you're at least %{count} to use %{domain}. We won't store this. role: The role controls which permissions the user has. user_role: + collection_limit: Limits the number of Collections that a single user with this role can create. Please note that when you decrease this number, users who are already at this limit will not lose any Collections. But they will not be able to create additional ones. color: Color to be used for the role throughout the UI, as RGB in hex format highlighted: This makes the role publicly visible name: Public name of the role, if role is set to be displayed as a badge @@ -212,11 +215,8 @@ en: labels: account: attribution_domains: Websites allowed to credit you - discoverable: Feature profile and posts in discovery algorithms + discoverable: Feature me in discovery experiences fields: - examples: - name_1: 例) GitHub - value_1: 例) https://github.com/xxxxxx name: Label value: Content indexable: Include public posts in search results @@ -254,7 +254,6 @@ en: defaults: autofollow: Invite to follow your account avatar: Profile picture - bot: This is an automated account chosen_languages: Filter languages confirm_new_password: Confirm new password confirm_password: Confirm password @@ -281,7 +280,6 @@ en: note: Bio otp_attempt: Two-factor code password: Password - person: This is a normal account phrase: Keyword or phrase setting_advanced_layout: Enable advanced web interface setting_aggregate_reblogs: Group boosts in timelines @@ -451,6 +449,7 @@ en: streaming_other_servers_emoji_reaction: Streaming emoji reactions between other server users theme: Default theme thumbnail: Server thumbnail + thumbnail_description: Thumbnail alt text trendable_by_default: Allow trends without prior review trends: Enable trends unlocked_friend: Accept all friend server follows automatically @@ -494,6 +493,7 @@ en: hint: Additional information text: Rule settings: + email_subscriptions: Enable email sign-ups indexable: Include profile page in search engines show_application: Display from which app you sent a post tag: @@ -522,6 +522,7 @@ en: role: Role time_zone: Time zone user_role: + collection_limit: Maximum number of Collections per user color: Badge color highlighted: Display role as badge on user profiles name: Name diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index da17198daa388f..d7acbff0b5793f 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -4,7 +4,6 @@ eo: hints: account: attribution_domains: Unu por linio. Protektas kontraŭ falsaj atribuoj. - discoverable: Viaj publikaj afiŝoj kaj profilo povas esti elstarigitaj aŭ rekomenditaj en diversaj lokoj de Mastodon kaj via profilo povas esti proponita al aliaj uzantoj. display_name: Via plena nomo aŭ via kromnomo. fields: Via retpaĝo, pronomoj, aĝo, ĉio, kion vi volas. indexable: Viaj publikaj afiŝoj povas aperi en serĉrezultoj ĉe Mastodon. Homoj, kiuj interagis kun viaj afiŝoj, eble povos serĉi ilin sendepende. @@ -59,9 +58,6 @@ eo: setting_default_quote_policy_private: Afiŝoj nur por sekvantoj verkitaj ĉe Mastodon ne povas esti cititaj de aliaj. setting_default_quote_policy_unlisted: Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj. setting_default_sensitive: La tiklaj vidaŭdaĵoj estas implicite kaŝitaj kaj povas esti malkaŝitaj per alklako - setting_display_media_default: Kaŝi plurmediojn markitajn kiel tiklaj - setting_display_media_hide_all: Ĉiam kaŝi la vidaŭdaĵojn - setting_display_media_show_all: Ĉiam montri la vidaŭdaĵojn setting_emoji_style: Kiel montri emoĝiojn. "Aŭtomata" provos uzi denaskajn emoĝiojn, sed uzas Twemoji por malnovaj retumiloj. setting_system_scrollbars_ui: Aplikas nur por surtablaj retumiloj baziĝas de Safari kaj Chrome setting_use_blurhash: Transirojn estas bazita sur la koloroj de la kaŝitaj aŭdovidaĵoj sed ne montri iun ajn detalon @@ -146,7 +142,6 @@ eo: jurisdiction: Enlistigu la landon, kie loĝas kiu pagas la fakturojn. Se ĝi estas kompanio aŭ alia ento, listigu la landon, kie ĝi estas enkorpigita, kaj la urbon, regionon, teritorion aŭ ŝtaton laŭeble. min_age: Ne devus esti malsupre la minimuma aĝo postulita de la leĝoj de via jurisdikcio. user: - chosen_languages: Kun tio markita nur mesaĝoj en elektitaj lingvoj aperos en publikaj tempolinioj date_of_birth: one: Ni devas certigi, ke vi estas almenaŭ %{count}-jaraĝa por uzi %{domain}. Ni ne konservos ĉi tion. other: Ni devas certigi, ke vi estas almenaŭ %{count}-jaraĝaj por uzi %{domain}. Ni ne konservos ĉi tion. @@ -164,7 +159,6 @@ eo: labels: account: attribution_domains: Retejoj permesitaj krediti vin - discoverable: Elstarigi profilon kaj afiŝojn en eltrovantaj algoritmoj fields: name: Etikedo value: Enhavo diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 62961d7817d95b..0988e6b91084f8 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -4,7 +4,7 @@ es-AR: hints: account: attribution_domains: Uno por línea. Protege de falsas atribuciones. - discoverable: Tu perfil y publicaciones pueden ser destacadas o recomendadas en varias áreas de Mastodon, y tu perfil puede ser sugerido a otros usuarios. + discoverable: Puede que aparezcas en colecciones creadas por otros usuarios. También pueden sugerirse tu perfil y publicaciones a otros usuarios en otras funciones de descubrimiento de Mastodon. display_name: Tu nombre completo o tu pseudónimo. fields: Tu sitio web, pronombres, edad, o lo que quieras. indexable: Tus mensajes públicos pueden aparecer en los resultados de la búsqueda en Mastodon. La gente que interactuó con tus mensajes puede ser capaz de buscarlos sin importar el momento. @@ -61,9 +61,9 @@ es-AR: setting_default_quote_policy_private: Los mensajes solo para seguidores redactados en Mastodon no pueden ser citados por otras cuentas. setting_default_quote_policy_unlisted: Cuando otras cuentas te citen, sus publicaciones también se ocultarán de las líneas temporales de tendencias. setting_default_sensitive: El contenido de medios sensibles está oculto predeterminadamente y puede ser mostrado con un clic - setting_display_media_default: Ocultar medios marcados como sensibles - setting_display_media_hide_all: Siempre ocultar todos los medios - setting_display_media_show_all: Siempre mostrar todos los medios + setting_display_media_default: Advertir antes de mostrar medios marcados como sensibles + setting_display_media_hide_all: Advertir antes de mostrar todos los medios + setting_display_media_show_all: Mostrar todos los medios sin advertir, incluyendo los medios marcados como sensibles setting_emoji_style: Cómo se mostrarán los emojis. "Automático" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos. setting_quick_boosting_html: Al estar habilitado, haciendo clic en el ícono de adhesión %{boost_icon} vas a adherir al mensaje inmediatamente, en lugar de abrir el menú desplegable de adhesión/citas. Esto cambia la acción de citas al menú de opciones %{options_icon}. setting_system_scrollbars_ui: Solo aplica para navegadores web de escritorio basados en Safari y Chrome @@ -109,6 +109,7 @@ es-AR: status_page_url: Dirección web de una página donde la gente puede ver el estado de este servidor durante un apagón theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. + thumbnail_description: Una descripción de la imagen para ayudar a personas con discapacidades visuales a entender su contenido. trendable_by_default: Omití la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. wrapstodon: Ofrecer a los usuarios locales un resumen lúdico de su uso en Mastodon durante el año. Esta función está disponible entre los días 10 y 31 de diciembre de cada año, y se ofrece a los usuarios que enviaron a Mastodon, al menos, un mensaje público o un mensaje público pero silencioso, y que utilizaron, al menos, una etiqueta durante el año. @@ -134,6 +135,7 @@ es-AR: otp: 'Ingresá el código de autenticación de dos factores generado por la aplicación en tu dispositivo, o usá uno de tus códigos de recuperación:' webauthn: Si es una llave USB, asegurate de insertarla y, de ser necesario, tocarla. settings: + email_subscriptions: Deshabilitar retiene a los suscriptores existentes, pero detiene el envío de correos electrónicos. indexable: Tu página de perfil podría aparecer en los resultados de búsqueda en Google, Bing y otros motores de búsqueda. show_application: Sin embargo, siempre podrás ver desde qué aplicación se envió tu mensaje. tag: @@ -153,12 +155,13 @@ es-AR: jurisdiction: Listá el país donde vive quien paga las facturas. Si es una empresa u otra entidad, enumerá el país donde está basada y la ciudad, región, territorio o provincia/estado, según corresponda. min_age: No debería estar por debajo de la edad mínima requerida por las leyes de su jurisdicción. user: - chosen_languages: Cuando estén marcados, solo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas + chosen_languages: Cuando está marcado, solo los mensajes en los idiomas seleccionados se mostrarán en las líneas temporales públicas. Esta configuración no afecta a tu línea temporal principal ni a tus listas. date_of_birth: one: Tenemos que asegurarnos de que al menos tenés %{count} años de edad para usar %{domain}. No almacenaremos esta información. other: Tenemos que asegurarnos de que al menos tenés %{count} años de edad para usar %{domain}. No almacenaremos esta información. role: El rol controla qué permisos tiene el usuario. user_role: + collection_limit: Limita el número de colecciones que un solo usuario con este rol puede crear. Por favor, tené en cuenta que cuando disminuya este número, los usuarios que ya están en este límite no perderán ninguna colección. Pero no podrán crear otras más. color: Color que se utilizará para el rol a lo largo de la interface de usuario, como RGB en formato hexadecimal highlighted: Esto hace que el rol sea públicamente visible name: Nombre público del rol, si el rol se establece para que se muestre como una insignia @@ -176,7 +179,7 @@ es-AR: labels: account: attribution_domains: Sitios web autorizados a acreditarte - discoverable: Destacar perfil y mensajes en algoritmos de descubrimiento + discoverable: Mostrarme en funciones de descubrimiento fields: name: Nombre de campo value: Valor de campo @@ -315,6 +318,7 @@ es-AR: status_page_url: Dirección web de la página de estado theme: Tema predeterminado thumbnail: Miniatura del servidor + thumbnail_description: Texto alternativo de miniatura trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias wrapstodon: Habilitar MastodonAnual @@ -356,6 +360,7 @@ es-AR: hint: Información adicional text: Regla settings: + email_subscriptions: Habilitar suscripciones por correo electrónico indexable: Incluir la página de perfil en los motores de búsqueda show_application: Mostrar desde qué aplicación enviaste un mensaje tag: @@ -384,6 +389,7 @@ es-AR: role: Rol time_zone: Zona horaria user_role: + collection_limit: Número máximo de colecciones por usuario color: Color de Insignia highlighted: Mostrar rol como insignia en perfiles de usuario name: Nombre diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index c110d76ee66c66..f9d4a7a6f0f6db 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -4,7 +4,7 @@ es-MX: hints: account: attribution_domains: Uno por línea. Protege contra atribuciones falsas. - discoverable: Tu perfil y las publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. + discoverable: Es posible que aparezcas en colecciones creadas por otros usuarios. Además, es posible que se te sugiera a ti y a tus publicaciones públicas a otros usuarios en otras experiencias de descubrimiento de Mastodon. display_name: Tu nombre completo o tu apodo. fields: Tu página de inicio, pronombres, edad, lo que quieras. indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden buscarlas en cualquier momento. @@ -37,11 +37,11 @@ es-MX: starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico text: Puedes usar la sintaxis de publicaciones. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario appeal: - text: Sólo puede apelar una amonestación a la vez + text: Solo se puede apelar una amonestación una vez defaults: autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente avatar: WEBP, PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px - bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada + bot: Indica a los demás que la cuenta realiza principalmente acciones automatizadas y que es posible que no esté supervisada context: Uno o múltiples contextos en los que debe aplicarse el filtro current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual @@ -53,22 +53,22 @@ es-MX: locale: El idioma de la interfaz de usuario, correos y notificaciones push password: Usa al menos 8 caracteres phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de una publicación - scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. + scopes: A qué API tendrá acceso la aplicación. Si seleccionas un ámbito de nivel superior, no es necesario que selecciones ámbitos individuales. setting_advanced_layout: Mostrar Mastodon en un diseño de varias columnas, lo que te permite ver la cronología, las notificaciones y una tercera columna de tu elección. No se recomienda para pantallas pequeñas. - setting_aggregate_reblogs: No mostrar nuevos impulsos para las publicaciones que han sido recientemente impulsadas (sólo afecta a las publicaciones recibidas recientemente) + setting_aggregate_reblogs: No mostrar nuevos impulsos para las publicaciones que se hayan impulsado recientemente (solo afecta a los impulsos recibidos recientemente) setting_always_send_emails: Normalmente las notificaciones por correo electrónico no se enviarán cuando estés usando Mastodon activamente setting_boost_modal: Cuando está habilitado, impulsar abrirá primero un cuadro de confirmación en el que podrás cambiar la visibilidad de tu impulso. setting_default_quote_policy_private: Las publicaciones solo para seguidores hechas en Mastodon no pueden ser citadas por otros usuarios. setting_default_quote_policy_unlisted: Cuando las personas te citen, su publicación también se ocultará en las cronologías públicas. setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un clic - setting_display_media_default: Ocultar contenido multimedia marcado como sensible - setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia - setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible + setting_display_media_default: Advertir antes de mostrar contenidos marcados como sensibles + setting_display_media_hide_all: Advertir antes de mostrar todos los archivos multimedia + setting_display_media_show_all: Mostrar todos los archivos multimedia sin advertir, incluidos los marcados como sensibles setting_emoji_style: Cómo se muestran los emojis. «Automático» intentará usar emojis nativos, pero vuelve a Twemoji para los navegadores antiguos. setting_quick_boosting_html: Cuando está activado, pulsar en el icono %{boost_icon} Impulsar impulsará inmediatamente en lugar de abrir el menú desplegable Impulsar/Citas. Mueve la acción de citar al menú %{options_icon} (Opciones). setting_system_scrollbars_ui: Solo se aplica a los navegadores de escritorio basados en Safari y Chrome setting_use_blurhash: Los degradados se basan en los colores de los elementos visuales ocultos, pero ocultan cualquier detalle - setting_use_pending_items: Ocultar las publicaciones de la línea de tiempo tras un clic en lugar de desplazar automáticamente el feed + setting_use_pending_items: Ocultar las actualizaciones de la línea de tiempo con un clic, en lugar de que la cronología se desplace automáticamente username: Puedes usar letras, números y guiones bajos whole_word: Cuando la palabra clave o frase es solo alfanumérica, solo será aplicado si concuerda con toda la palabra domain_allow: @@ -109,6 +109,7 @@ es-MX: status_page_url: URL de una página donde las personas pueden ver el estado de este servidor durante una interrupción theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. + thumbnail_description: Una descripción de la imagen para ayudar a las personas con discapacidad visual a comprender su contenido. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. wrapstodon: Ofrece a los usuarios locales la posibilidad de generar un resumen divertido de su uso de Mastodon durante el año. Esta función está disponible entre el 10 y el 31 de diciembre de cada año, y se ofrece a los usuarios que hayan publicado al menos una publicación pública o pública silenciosa y hayan utilizado al menos una etiqueta durante el año. @@ -134,6 +135,7 @@ es-MX: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. settings: + email_subscriptions: Al desactivar la función, se conservan los suscriptores actuales, pero se deja de enviar correos electrónicos. indexable: Tu página de perfil puede aparecer en los resultados de búsqueda en Google, Bing, entre otros. show_application: Siempre podrás ver desde cuál aplicación realizaste una publicación. tag: @@ -153,12 +155,13 @@ es-MX: jurisdiction: Indique el país de residencia de quien paga las facturas. Si se trata de una empresa u otra entidad, indique el país en el que está constituida y la ciudad, región, territorio o estado, según proceda. min_age: No debe ser menor de la edad mínima exigida por las leyes de su jurisdicción. user: - chosen_languages: Cuando se marca, solo se mostrarán las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas + chosen_languages: Si se marca esta opción, solo se mostrarán en las cronologías públicas las publicaciones en los idiomas seleccionados. Esta configuración no afecta a tu cronología de inicio ni a tus listas. date_of_birth: one: Tenemos que asegurarnos de que tienes al menos %{count} para usar %{domain}. No almacenaremos esta información. other: Tenemos que asegurarnos de que tienes al menos %{count} para usar %{domain}. No almacenaremos esta información. role: El rol controla qué permisos tiene el usuario. user_role: + collection_limit: Limita el número de colecciones que puede crear un solo usuario con este rol. Ten en cuenta que, si reduces este número, los usuarios que ya hayan alcanzado este límite no perderán ninguna de sus colecciones, pero no podrán crear otras nuevas. color: Color que se usará para el rol en toda la interfaz de usuario, como RGB en formato hexadecimal highlighted: Esto hace que el rol sea públicamente visible name: Nombre público del rol, si el rol se establece para que se muestre como una insignia @@ -176,7 +179,7 @@ es-MX: labels: account: attribution_domains: Sitios web autorizados para acreditarte - discoverable: Destacar el perfil y las publicaciones en el algoritmo de descubrimiento + discoverable: Inclúyeme en las experiencias de descubrimiento fields: name: Etiqueta value: Contenido @@ -248,8 +251,8 @@ es-MX: setting_default_quote_policy: Quién puede citar setting_default_sensitive: Marcar siempre imágenes como sensibles setting_delete_modal: Avisarme antes de eliminar una publicación - setting_disable_hover_cards: Desactivar vista previa del perfil al pasar el cursor - setting_disable_swiping: Deshabilitar movimientos de deslizamiento + setting_disable_hover_cards: Desactivar la vista previa del perfil al pasar el cursor por encima + setting_disable_swiping: Desactivar los gestos de deslizamiento setting_display_media: Visualización multimedia setting_display_media_default: Por defecto setting_display_media_hide_all: Ocultar todo @@ -315,6 +318,7 @@ es-MX: status_page_url: URL de página de estado theme: Tema por defecto thumbnail: Miniatura del servidor + thumbnail_description: Texto alternativo de miniatura trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias wrapstodon: Habilitar Wrapstodon @@ -356,6 +360,7 @@ es-MX: hint: Información adicional text: Norma settings: + email_subscriptions: Habilitar suscripciones por correo electrónico indexable: Incluir la página de perfil en los motores de búsqueda show_application: Mostrar desde cuál aplicación enviaste una publicación tag: @@ -384,6 +389,7 @@ es-MX: role: Rol time_zone: Zona horaria user_role: + collection_limit: Número máximo de colecciones por usuario color: Color de insignia highlighted: Mostrar rol como insignia en perfiles de usuario name: Nombre diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 30da06b1d72f60..07ba58d25ef8c8 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -4,7 +4,7 @@ es: hints: account: attribution_domains: Una por línea. Protege de falsas atribuciones. - discoverable: Tu perfil y publicaciones públicas pueden ser destacadas o recomendadas en varias áreas de Mastodon y tu perfil puede ser sugerido a otros usuarios. + discoverable: Puede que aparezcas en colecciones creadas por otros usuarios. También pueden sugerirse tu perfil y publicaciones públicas a otros usuarios en otras funciones de descubrimiento de Mastodon. display_name: Tu nombre completo o tu apodo. fields: Tu carta de presentación, pronombres, edad, lo que quieras. indexable: Tus publicaciones públicas pueden aparecer en los resultados de búsqueda en Mastodon. Las personas que han interactuado con tus publicaciones pueden ser capaces de buscarlas sin importar su visibilidad. @@ -61,9 +61,9 @@ es: setting_default_quote_policy_private: Las publicaciones solo para seguidores hechas en Mastodon no pueden ser citadas por otros usuarios. setting_default_quote_policy_unlisted: Cuando las personas te citen, su publicación también se ocultará en las cronologías públicas. setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un click - setting_display_media_default: Ocultar contenido multimedia marcado como sensible - setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia - setting_display_media_show_all: Mostrar siempre contenido multimedia marcado como sensible + setting_display_media_default: Avisar antes de mostrar multimedia marcada como sensible + setting_display_media_hide_all: Avisar antes de mostrar cualquier multimedia + setting_display_media_show_all: Mostrar toda la multimedia sin avisos, incluyendo la marcada como sensible setting_emoji_style: Cómo se mostrarán los emojis. "Auto" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos. setting_quick_boosting_html: Cuando está activado, pulsar en el icono %{boost_icon} Impulsar impulsará inmediatamente en lugar de abrir el menú desplegable Impulsar/Citas. Mueve la acción de citar al menú %{options_icon} (Opciones). setting_system_scrollbars_ui: Solo aplica para navegadores de escritorio basados en Safari y Chrome @@ -109,6 +109,7 @@ es: status_page_url: URL de una página donde se pueda ver el estado de este servidor durante una incidencia theme: El tema que los visitantes no registrados y los nuevos usuarios ven. thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. + thumbnail_description: Una descripción de la imagen para ayudar a las personas con discapacidades visuales a entender su contenido. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué publicaciones, etiquetas y noticias están ganando tracción en tu servidor. wrapstodon: Ofrecer a los usuarios locales un resumen lúdico de su uso en Mastodon durante el año. Esta característica está disponible entre los días 10 y 31 de diciembre de cada año, y se ofrece a los usuarios que hicieron al menos una publicación Pública o Pública Silenciosa y utilizaron al menos una etiqueta durante el año. @@ -134,6 +135,7 @@ es: otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' webauthn: Si es una tecla USB, asegúrese de insertarla y, si es necesario, púlsela. settings: + email_subscriptions: Deshabilitar retiene a los suscriptores existentes pero detiene el envío de correos electrónicos. indexable: Puede que tu página de perfil aparezca en los resultados de búsqueda en Google, Bing y otros. show_application: Tú siempre podrás ver desde qué aplicación se ha publicado tu publicación. tag: @@ -153,12 +155,13 @@ es: jurisdiction: Lista el país donde vive quien paga las facturas. Si es una empresa u otra entidad, enumere el país donde está basada y la ciudad, región, territorio o estado según corresponda. min_age: No debería estar por debajo de la edad mínima requerida por las leyes de su jurisdicción. user: - chosen_languages: Cuando se marca, solo se mostrarán las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas + chosen_languages: Cuando está activada, solo las publicaciones en los idiomas seleccionados se mostrarán en las cronologías públicas. Esta configuración no afecta a tu cronología principal ni a tus listas. date_of_birth: one: Tenemos que asegurarnos de que tienes al menos %{count} para usar %{domain}. No guardaremos esta información. other: Tenemos que asegurarnos de que tienes al menos %{count} para usar %{domain}. No guardaremos esta información. role: El rol controla qué permisos tiene el usuario. user_role: + collection_limit: Limita el número de Colecciones que un usuario con este rol puede crear. Ten en cuenta que, al reducir este número, los usuarios que superen este límite no perderán ninguna Colección, pero tampoco podrán crear más. color: Color que se utilizará para el rol a lo largo de la interfaz de usuario, como RGB en formato hexadecimal highlighted: Esto hace que el rol sea públicamente visible name: Nombre público del rol, si el rol se establece para que se muestre como una insignia @@ -176,7 +179,7 @@ es: labels: account: attribution_domains: Sitios web autorizados a acreditarte - discoverable: Destacar perfil y publicaciones en algoritmos de descubrimiento + discoverable: Mostrarme en funciones de descubrimiento fields: name: Etiqueta value: Contenido @@ -315,6 +318,7 @@ es: status_page_url: URL de página de estado theme: Tema por defecto thumbnail: Miniatura del servidor + thumbnail_description: Texto alternativo de miniatura trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias wrapstodon: Habilitar Wrapstodon @@ -356,6 +360,7 @@ es: hint: Información adicional text: Norma settings: + email_subscriptions: Habilitar suscripciones por correo electrónico indexable: Incluye la página de perfil en los buscadores show_application: Mostrar desde qué aplicación enviaste una publicación tag: @@ -384,6 +389,7 @@ es: role: Rol time_zone: Zona horaria user_role: + collection_limit: Número máximo de Colecciones por usuario color: Color de insignia highlighted: Mostrar rol como insignia en perfiles de usuario name: Nombre diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index b83d9e4a402e1f..7ea286ab4fbda5 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -4,12 +4,12 @@ et: hints: account: attribution_domains: Üks rea kohta. See kaitseb pahatahtlike viidete eest. - discoverable: Su profiili ja avalikke postitusi võidakse Mastodoni erinevates piirkondades esile tõsta või soovitada ning su profiili soovitada teistele kasutajatele. + discoverable: Sind võidakse esile tõsta teiste kasutajate loodud kogumikes. Sind ja su avalikke postitusi võidakse soovitada ka teistele kasutajatele Mastodoni erinevate avastamiskeskkondade kaudu. display_name: Su täisnimi või naljanimi. fields: Su koduleht, sugu, vanus. Mistahes, mida soovid. indexable: Sinu avalikud postitused võivad ilmuda Mastodoni otsingutulemustes. Inimesed, kes on sinu postitustele reageerinud, saavad neid otsida nii või naa. note: 'Saad @mainida teisi inimesi või #teemaviiteid.' - show_collections: Inimesed saavad sirvida su jälgijaid ja jälgitavaid. Inimesed, keda sa jälgid, näevad seda sõltumata häälestuse valikust. + show_collections: Inimesed saavad sirvida su jälgijaid ja jälgitavaid. Inimesed, keda sa jälgid, näevad seda sõltumata seadistusest. unlocked: Teised kasutajad saavad sind jälgima hakata nõusolekut küsimata. Eemalda märge, kui soovid jälgimistaotlusi üle vaadata ja valida, kas nõustuda või keelduda uute jälgijatega. account_alias: acct: Sisesta konto kasutajanimi@domeen, mille soovid siia ümber kolida @@ -61,9 +61,9 @@ et: setting_default_quote_policy_private: Ainult jälgijatele mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida. setting_default_quote_policy_unlisted: Kui teised kasutajad sind tsiteerivad, siis nende postitused peidetakse ajajoonelt, mis näitavad populaarsust koguvaid postitusi. setting_default_sensitive: Tundlik meedia on vaikimisi peidetud ning seda saab avada sellele klikkides - setting_display_media_default: Peida tundlikuks märgitud meedia - setting_display_media_hide_all: Alati peida kõik meedia - setting_display_media_show_all: Alati näita tundlikuks märgistatud meedia + setting_display_media_default: Hoiatus enne kui näidata tundlikuks märgitud meediat + setting_display_media_hide_all: Hoiatus enne mistahes meedia näitamist + setting_display_media_show_all: Näita alati meediat ilma hoiatuseta, ka tundlikuks märgitud meediat setting_emoji_style: See määrab emojide kuvamise viisi. Automaatse valiku puhul üritatakse kasutada platvormi või klientrakenduse oma emojisid, kuid varuvariandina jääb toimima Twemoji (näiteks vanade veebibrauserite puhul). setting_quick_boosting_html: Selle eelistuse kasutamisel, Hooandmise ikooni %{boost_icon} teeb toimingu kohe ilma avamata Hooandmise/Tsiteerimise menüüvalikut. Sel puhul tsiteerimise link leidub %{options_icon} (Valikud) menüüs. setting_system_scrollbars_ui: Kehtib vaid Safaril ja Chrome'il põhinevatel tavaarvuti veebibrauserite puhul @@ -77,7 +77,7 @@ et: domain: See võib olla e-postiaadressis näha olev domeen või MX-kirje, mida aadress kasutab. Kontroll toimub liitumise käigus. with_dns_records: Püütakse lahendada selle domeeni DNS-kirjed ja ühtlasi blokeerida ka selle tulemused featured_tag: - name: 'Siin on mõned nendest teemaviiteid, mida oled viimati kasutanud:' + name: 'Siin on mõned neist teemaviidetest, mida oled viimati kasutanud:' filters: action: Vali tegevus, kui postitus vastab filtrile actions: @@ -109,9 +109,10 @@ et: status_page_url: Lehe URL, kus saab serveri maas oleku ajal näha serveri olekut theme: Teema, mida näevad sisenemata ning uued kasutajad. thumbnail: Umbes 2:1 mõõdus pilt serveri informatsiooni kõrval. + thumbnail_description: Pildi selgitus, mis aitab nägemispuudega inimestel aru saada pildi sisust. trendable_by_default: Populaarse sisu ülevaatuse vahele jätmine. Pärast seda on siiski võimalik üksikuid üksusi trendidest eemaldada. trends: Trendid näitavad, millised postitused, teemaviited ja uudislood koguvad sinu serveris tähelepanu. - wrapstodon: Paku kohalikele kasutajatele luua nende Mastodoni kasutamise aastast mänguline kokkuvõte. See võimalus on saadaval igal aastal 10. ja 31. detsembri vahel ja seda pakutakse kasutajatele, kes tegid vähemalt ühe avaliku või vaikse avaliku postituse ja kes kasutas aasta jooksul vähemalt ühte silti. + wrapstodon: Paku kohalikele kasutajatele luua nende Mastodoni kasutamise aastast mänguline kokkuvõte. See võimalus on saadaval igal aastal 10. ja 31. detsembri vahel ja seda pakutakse kasutajatele, kes tegid vähemalt ühe avaliku või vaikse avaliku postituse ja kes kasutas aasta jooksul vähemalt ühte teemaviidet. form_challenge: current_password: Sisened turvalisse alasse imports: @@ -134,6 +135,7 @@ et: otp: 'Kaheastmelise autentimise kood telefonirakendusest või mõni taastekood:' webauthn: Kui see on USB-võti, sisesta see ning vajadusel aktiveeri. settings: + email_subscriptions: Funktsionaalsuse keelamine säilitab olemasolevad tellijad, kuid peatab e-kirjade saatmise. indexable: Su profiilileht võib ilmuda Google, Bingi ja teiste otsimootorite tulemustes. show_application: Sa saad sõltumata sellest vaadata, milline äpp su postituse postitas. tag: @@ -153,12 +155,13 @@ et: jurisdiction: Nimeta riik, kus elab see, kes arveid maksab. Kui tegemist on äriühingu või muu üksusega, märgi riik, kus see on asutatud, ning vajaduse korral linn, piirkond, territoorium või osariik. min_age: Vanus ei tohiks olla väiksem, kui sinu õigusruumis nõutav alampiir. user: - chosen_languages: Keelte valimisel näidatakse avalikel ajajoontel ainult neis keeltes postitusi + chosen_languages: Kui see valik on märgitud, kuvatakse avalikul ajajoonel ainult valitud keeltes postitusi. See seadistus ei mõjuta sinu avalehe ajajoont ega loendeid. date_of_birth: one: "%{domain} saidi teenuste kasutamiseks pead olema vähemalt %{count} aastat vana. Me ei salvesta neid andmeid." other: "%{domain} saidi teenuste kasutamiseks pead olema vähemalt %{count} aastat vana. Me ei salvesta neid andmeid." role: Rollid määravad, millised õigused kasutajal on. user_role: + collection_limit: Piirab sellise rolliga kasutaja poolt loodavate kogumike arvu. Pane tähele, et kui vähendad seda arvu, ei kaota kasutajad, kes on juba piirmäära saavutanud, ühtegi kogumikku, aga nad ei saa luua uusi kogumikke. color: Rolli tähistamise värvus üle kasutajaliidese, RGB 16nd-formaadis highlighted: Teeb rolli avalikult nähtavaks name: Rolli avalik nimi, kui roll on märgitud avalikuks kuvamiseks märgina @@ -176,7 +179,7 @@ et: labels: account: attribution_domains: Veebisaidid, mis võivad sind algallikana mainida - discoverable: Tõsta postitused ja profiil avastamise algoritmides esile + discoverable: Võimalda mind teistel avatada fields: name: Nimetus value: Sisu @@ -224,6 +227,7 @@ et: email: E-posti aadress expires_in: Aegu pärast fields: Veebiviited + filter_action: Filtritoimingud header: Päis honeypot: "%{label} (ära sisesta)" inbox_url: Sõnumivahendusserveri sisendkausta võrguaadress @@ -314,6 +318,7 @@ et: status_page_url: Oleku lehe URL theme: Vaikmisi teema thumbnail: Serveri pisipilt + thumbnail_description: Pisipildi selgitustekst trendable_by_default: Luba trendid eelneva ülevaatuseta trends: Luba trendid wrapstodon: Luba Wrapstodon @@ -355,6 +360,7 @@ et: hint: Lisainfo text: Reegel settings: + email_subscriptions: Luba e-posti aadressiga liitumised indexable: Kaasa profiilileht otsimootoritesse show_application: Näita, millisest äpist postituse saatsid tag: @@ -383,6 +389,7 @@ et: role: Roll time_zone: Ajavöönd user_role: + collection_limit: Kogumike maksimumarv kasutaja kohta color: Märgi värv highlighted: Kuva roll kasutajaprofiilidel märgina name: Nimi diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 0e36f83c341dc3..0fa8290d6d4eea 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -4,7 +4,6 @@ eu: hints: account: attribution_domains: Lerroko bat. Atribuzio faltsuetatik babesten ditu. - discoverable: Zure bidalketa publikoak eta profila nabarmendu edo gomendatu egin daitezke Mastodon-go hainbat eremutan eta zure profila beste erabiltzaile batzuei iradoki dakieke. display_name: Zure izena edo ezizena. fields: Zure webgunea, izenordainak, adina, nahi duzun guztia. indexable: Zure argitalpen publikoak bilaketa-emaitzetan ager daitezke Mastodonen. Zure argitalpenekin elkarregin duten jendeak ikusi ahal izango dituzte, hala ere. @@ -61,9 +60,6 @@ eu: setting_default_quote_policy_private: Jarraitzaileentzat soilik sortutako bidalketak Mastodonen ezin dituzte beste batzuek aipatu. setting_default_quote_policy_unlisted: Jendeak aipatzen zaituenean, bere bidalketa ere joeren denbora-lerro publikoetatik ezkutatuko da. setting_default_sensitive: Multimedia hunkigarria lehenetsita ezkutatzen da, eta sakatuz ikusi daiteke - setting_display_media_default: Ezkutatu hunkigarri gisa markatutako multimedia - setting_display_media_hide_all: Ezkutatu multimedia guztia beti - setting_display_media_show_all: Erakutsi beti hunkigarri gisa markatutako multimedia setting_emoji_style: Nola bistaratu emojiak. "Automatikoki" aukeran emoji natiboak erabiltzen saiatuko dira, baina Twemojira itzuliko dira arakatzaile zaharretarako. setting_system_scrollbars_ui: Safari eta Chrome-n oinarritutako mahaigaineko nabigatzaileei bakarrik aplikatzen zaie setting_use_blurhash: Gradienteak ezkutatutakoaren koloreetan oinarritzen dira, baina xehetasunak ezkutatzen dituzte @@ -150,7 +146,6 @@ eu: jurisdiction: Zerrendatu fakturak ordaintzen dituen pertsona bizi den herrialdea. Enpresa edo bestelako erakunde bat bada, adierazi egoitza duen herrialdea eta, kasuan kasu, hiria, eskualdea, lurraldea edo estatua. min_age: Ez luke izan behar zure jurisdikzioko legeek eskatzen duten gutxieneko adinetik beherakoa. user: - chosen_languages: Markatzean, hautatutako hizkuntzetan dauden tutak besterik ez dira erakutsiko. role: Rolak erabiltzaileak dituen baimenak zeintzuk diren kontrolatzen du. user_role: color: Rolarentzat erabiltzaile interfazean erabiliko den kolorea, formatu hamaseitarreko RGB bezala @@ -168,7 +163,6 @@ eu: labels: account: attribution_domains: Akreditatzeko baimendutako webguneak - discoverable: Ezagutarazi profila eta bidalketak bilaketa algoritmoetan fields: name: Etiketa value: Edukia diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index e21ab3b523f308..25f2b2d47917ec 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -4,7 +4,6 @@ fa: hints: account: attribution_domains: در هر خط، یک مورد. از ویژگی های نادرست محافظت می کند. - discoverable: ممکن است نمایه و فرسته‌های عمومیتان در جاهای مختلف ماستودون نمایانده و توصیه شود و نمایه‌تان به دیگر کاربران پیشنهاد شود. display_name: نام کامل یا باحالتان. fields: صفحهٔ خانگی، تلفّظ، سن و هرچیزی که دوست دارید. indexable: ممکن است فرسته‌های عمومیتان در نتیجه‌های جست‌وجوی ماستودون ظاهر شود. افرادی که با فرسته‌هایتان تعامل داشتند در هر صورت می‌توانند جست‌وجویشان کنند. @@ -61,9 +60,6 @@ fa: setting_default_quote_policy_private: فرسته‌های فقط پی‌گیران روی ماستودون نمی‌توانند به دست دیگران نقل شوند. setting_default_quote_policy_unlisted: هنگامی که کسی نقلتان می‌کند هم فرسته‌اش از خط زمانی‌های داغ پنهان خواهد بود. setting_default_sensitive: تصاویر حساس به طور پیش‌فرض پنهان هستند و می‌توانند با یک کلیک آشکار شوند - setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شده‌اند پنهان کن - setting_display_media_hide_all: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن - setting_display_media_show_all: همیشه تصویرهایی را که به عنوان حساس علامت زده شده‌اند را نشان بده setting_emoji_style: چگونگی نمایش شکلک‌ها. «خودکار» تلاش خواهد کرد از شکلک‌های بومی استفاده کند؛ ولی برای مرورگرهای قدیمی به توییموجی برخواهد گشت. setting_quick_boosting_html: هنگام به کار افتادن، زدن روی %{boost_icon} نقشک تقویت به جای گشودنِ فهرست پایین افتادنی تقویت و نقل، بلافاصله تقویت خواهد کرد. کنشِ نقل قول را به فهرست %{options_icon} (گزینه‌ها) منتقل می‌کند. setting_system_scrollbars_ui: فقط برای مرورگرهای دسکتاپ مبتنی بر سافاری و کروم اعمال می شود @@ -153,7 +149,6 @@ fa: jurisdiction: کشوری را که هر کسی که صورتحسابها را پرداخت می کند در آن زندگی می کند، فهرست کنید. اگر یک شرکت یا نهاد دیگری است، کشوری که در آن ثبت شده است و شهر، منطقه، قلمرو یا ایالت در صورت لزوم فهرست کنید. min_age: نباید کم‌تر از کمینهٔ زمان لازم از سوی قوانین حقوقیتان باشد. user: - chosen_languages: اگر انتخاب کنید، تنها نوشته‌هایی که به زبان‌های برگزیدهٔ شما نوشته شده‌اند در فهرست نوشته‌های عمومی نشان داده می‌شوند date_of_birth: one: برای استفاده از %{domain} باید مطمئن شویم کمینه %{count} سال را دارید. این مورد را ذخیره نخواهیم کرد. other: برای استفاده از %{domain} باید مطمئن شویم کمینه %{count} سال را دارید. این مورد را ذخیره نخواهیم کرد. @@ -175,7 +170,6 @@ fa: labels: account: attribution_domains: وب‌سایت‌هایی که اجازه دارند به شما اعتبار بدهند - discoverable: مشخص کردن مشخصات و فرسته‌ها در الگوریتم‌های اکتشاف fields: name: برچسب value: محتوا diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 1187ffdf0593bb..33e826cf14a422 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -4,7 +4,7 @@ fi: hints: account: attribution_domains: Yksi riviä kohti. Suojaa vääriltä tekijän nimeämisiltä. - discoverable: Julkisia julkaisujasi ja profiiliasi voidaan esitellä tai suositella Mastodonin eri alueilla, ja profiiliasi voidaan ehdottaa toisille käyttäjille. + discoverable: Sinua voidaan esitellä muiden käyttäjien luomissa kokoelmissa. Sinua ja julkisia julkaisujasi voidaan ehdottaa käyttäjille muissa Mastodonin löydettävyyskokemuksissa. display_name: Koko nimesi tai lempinimesi. fields: Verkkosivustosi, pronominisi, ikäsi ja mitä ikinä haluatkaan ilmoittaa. indexable: Julkiset julkaisusi voivat näkyä Mastodonin hakutuloksissa. Käyttäjät, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. @@ -61,9 +61,9 @@ fi: setting_default_quote_policy_private: Muut eivät voi lainata vain seuraajille tarkoitettuja, Mastodonissa kirjoitettuja julkaisuja. setting_default_quote_policy_unlisted: Kun ihmiset lainaavat sinua, heidän julkaisunsa piilotetaan suosittujen julkaisujen aikajanoilta. setting_default_sensitive: Arkaluonteinen media piilotetaan oletusarvoisesti, ja se voidaan näyttää yhdellä napsautuksella - 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_display_media_default: Varoita ennen arkaluonteisen mediasisällön näyttämistä + setting_display_media_hide_all: Varoita ennen kaiken mediasisällön näyttämistä + setting_display_media_show_all: Näytä kaikki mediasisältö varoittamatta, mukaan lukien arkaluonteiseksi merkitty sisältö setting_emoji_style: Miten emojit näkyvät. ”Automaattinen” pyrkii käyttämään natiiveja emojeita, mutta Twemoji-emojeita käytetään varavaihtoehtoina vanhoissa selaimissa. setting_quick_boosting_html: Kun käytössä, %{boost_icon} Tehosta-kuvakkeen painaminen tehostaa välittömästi sen sijaan, että Tehosta/Lainaa-pudotusvalikko avautuisi. Siirtää lainaustoiminnon %{options_icon} (Valinnat) -⁠valikkoon. setting_system_scrollbars_ui: Koskee vain Safari- ja Chrome-pohjaisia työpöytäselaimia @@ -109,6 +109,7 @@ fi: status_page_url: URL-osoite sivulle, josta tämän palvelimen tilan voi ongelmatilanteissa tarkistaa theme: Teema, jonka uloskirjautuneet vierailijat ja uudet käyttäjät näkevät. thumbnail: Noin 2:1 kuva näkyy palvelimen tietojen ohessa. + thumbnail_description: Kuvan kuvaus, joka auttaa näkövammallisia ymmärtämään kuvan sisällön. 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. wrapstodon: Tarjoa paikallisille käyttäjille mahdollisuus luoda leikkisä koonti heidän Mastodonin käytöstään vuoden aikana. Tämä ominaisuus on saatavilla vuosittain 10.–⁠31. joulukuuta, ja sitä tarjotaan käyttäjille, jotka ovat laatineet ainakin yhden julkisen tai vaihvihkaa julkisen julkaisun ja käyttäneet ainakin yhtä aihetunnistetta vuoden aikana. @@ -134,6 +135,7 @@ fi: 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: + email_subscriptions: Käytöstäpoisto säilyttää olemassa olevat tilaajat mutta lopettaa sähköpostin lähettämisen. indexable: Profiilisi voi näkyä Googlen, Bingin ja muiden hakukoneiden hakutuloksissa. show_application: Voit silti aina nähdä, mistä sovelluksesta julkaisusi lähetettiin. tag: @@ -153,12 +155,13 @@ fi: jurisdiction: Mainitse valtio, jossa laskujen maksaja asuu. Jos kyseessä on yritys tai muu yhteisö, mainitse valtio, johon se on rekisteröity, ja tarvittaessa kaupunki, alue, territorio tai osavaltio. min_age: Ei pidä alittaa lainkäyttöalueesi lakien vaatimaa vähimmäisikää. user: - chosen_languages: Jos valitset kieliä oheisesta luettelosta, vain niidenkieliset julkaisut näkyvät sinulle julkisilla aikajanoilla + chosen_languages: Kun kieliä on valittuna oheisesta luettelosta, vain niidenkieliset julkaisut näkyvät julkisilla aikajanoilla. Tämä asetus ei vaikuta kotiaikajanaasi eikä listoihisi. date_of_birth: one: Meidän tulee varmistaa, että olet vähintään %{count}, jotta voit käyttää %{domain}. Emme tallenna tätä. other: Meidän tulee varmistaa, että olet vähintään %{count}, jotta voit käyttää %{domain}. Emme tallenna tätä. role: Rooli määrää, millaiset käyttöoikeudet käyttäjällä on. user_role: + collection_limit: Rajoittaa kokoelmien määrää, jonka yksittäinen käyttäjä, jolla on tämä rooli, voi luoda. Huomaa, että kun pienennät tätä lukua, käyttäjät, jotka ovat jo tällä rajalla, eivät menetä yhtäkään kokoelmaa. He eivät kuitenkaan voi luoda uusia rooleja. 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ä @@ -176,7 +179,7 @@ fi: labels: account: attribution_domains: Verkkosivustot, jotka voivat antaa sinulle tunnustusta - discoverable: Esittele profiilia ja julkaisuja löydettävyysalgoritmeissa + discoverable: Esittele minua löydettävyyskokemuksissa fields: name: Nimike value: Sisältö @@ -314,7 +317,8 @@ fi: site_title: Palvelimen nimi status_page_url: Tilasivun URL-osoite theme: Oletusteema - thumbnail: Palvelimen pienoiskuva + thumbnail: Palvelimen pikkukuva + thumbnail_description: Pikkukuvan tekstivastine trendable_by_default: Salli trendit ilman ennakkotarkastusta trends: Ota trendit käyttöön wrapstodon: Ota Wrapstodon käyttöön @@ -356,6 +360,7 @@ fi: hint: Lisätietoja text: Sääntö settings: + email_subscriptions: Ota sähköpostitilaukset käyttöön indexable: Sisällytä profiilisivu hakukoneisiin show_application: Näytä, mistä sovelluksesta lähetit julkaisun tag: @@ -384,6 +389,7 @@ fi: role: Rooli time_zone: Aikavyöhyke user_role: + collection_limit: Kokoelmien käyttäjäkohtainen enimmäismäärä color: Merkin väri highlighted: Näytä rooli merkkinä käyttäjäprofiileissa name: Nimi diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index a8799f98247790..0361c075c98c97 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -4,7 +4,6 @@ fo: hints: account: attribution_domains: Eitt á hvørja reglu. Tað verjir fyri skeivum tilsipingum. - discoverable: Tínir almennu postar og tín vangi kunnu vera drigin fram og viðmæld ymsa staðni í Mastodon og vangin hjá tær kann vera viðmæltur øðrum brúkarum. display_name: Títt fulla navn og títt stuttliga navn. fields: Heimasíðan hjá tær, fornøvn, aldur ella hvat tú vil. indexable: Almennu postar tínir kunnu vera sjónligir í leitiúrslitum á Mastodon. Óansæð, so kunnu fólk, sum hava samvirkað við tínar postar, finna teir. @@ -61,9 +60,6 @@ fo: setting_default_quote_policy_private: Postar, sum einans eru fyri fylgjarar á Mastodon, kunnu ikki siterast av øðrum. setting_default_quote_policy_unlisted: Tá fólk sitera teg, so vera teirra postar eisini fjaldir frá tíðarlinjum við ráki. setting_default_sensitive: Viðkvæmar miðlafílur eru fjaldar og kunnu avdúkast við einum klikki - setting_display_media_default: Fjal miðlafílur, sum eru merktar sum viðkvæmar - setting_display_media_hide_all: Fjal altíð miðlafílur - setting_display_media_show_all: Vís altíð miðlafílur setting_emoji_style: Hvussu kenslutekn vera víst. "Sjálvvirkandi" roynir at brúka upprunalig kenslutekn, men fellir aftur á Twitter kenslutekn í eldri kagum. setting_quick_boosting_html: Tá hetta er virkið, hendir stimbranin beinanvegin tá trýst verður á %{boost_icon} Stimbranar-ímyndin, í staðin fyri at stimbranar/siterings-valmyndin verður latin um. Flytir siteringsmøguleikan til %{options_icon} (Valmøguleikar) valmyndina. setting_system_scrollbars_ui: Er einans viðkomandi fyri skriviborðskagar grundaðir á Safari og Chrome @@ -153,7 +149,6 @@ fo: jurisdiction: Lista landið, har sum tann, ið rindar rokningarnar, livir. Er tað eitt felag ella ein onnur eind, lista landið, har tað er skrásett, umframt býin, økið, umveldið ella statin, alt eftir hvat er hóskandi. min_age: Eigur ikki at vera undir lægsta aldri, sum lógirnar í tínum rættarøki krevja. user: - chosen_languages: Tá hetta er valt, verða einans postar í valdum málum vístir á almennum tíðarlinjum date_of_birth: one: Vit mugu tryggja okkum, at tú er í minsta lagi %{count} fyri at brúka %{domain}. Vit goyma ikki hesar upplýsingar. other: Vit mugu tryggja okkum, at tú er í minsta lagi %{count} ár fyri at brúka %{domain}. Vit goyma ikki hesar upplýsingar. @@ -176,7 +171,6 @@ fo: labels: account: attribution_domains: Heimasíður, sum hava loyvi at sipa til tín - discoverable: Framheva vanga og postar í uppdagingar-algoritmum fields: name: Spjaldur value: Innihald diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 2f4ef67b300d04..cfb33954e3147d 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -4,13 +4,13 @@ fr-CA: hints: account: attribution_domains: Un par ligne. Protège contre les fausses attributions. - discoverable: Vos messages publics et votre profil peuvent être mis en avant ou recommandés dans diverses parties de Mastodon et votre profil peut être suggéré à d’autres utilisateurs. + discoverable: Vous pouvez apparaître dans les collections créées par d'autres personnes. Vous pouvez, ainsi que vos messages publics, aussi être suggéré dans d'autres expériences de découverte de Mastodon. display_name: Votre nom complet ou votre nom cool. fields: Votre page d'accueil, pronoms, âge, tout ce que vous voulez. indexable: Vos messages publics peuvent apparaître dans les résultats de recherche sur Mastodon. Les personnes qui ont interagi avec vos messages peuvent les trouver dans une recherche quoi qu’il arrive. note: 'Vous pouvez @mentionner d’autres personnes ou des #hashtags.' - show_collections: Les gens pourront voir les personnes que vous suivez ou qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. - unlocked: Les personnes pourront vous suivre sans en demander la permission. Décochez cette case si vous souhaitez examiner les demandes de suivi et choisir d'accepter ou de rejeter les nouveaux followers. + show_collections: Les gens pourront voir les personnes que vous suivez et qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. + unlocked: Les personnes pourront vous suivre sans en demander d'approbation. Décochez cette case si vous souhaitez examiner les demandes d'abonnement et choisir de les accepter ou de les rejeter. account_alias: acct: Spécifiez l’identifiant@domaine du compte que vous souhaitez faire migrer account_migration: @@ -40,14 +40,14 @@ fr-CA: text: Vous ne pouvez faire appel d'une sanction qu'une seule fois defaults: autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement - avatar: WEBP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions}px + avatar: WebP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions} px bot: Signale aux autres que ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé context: Un ou plusieurs contextes où le filtre devrait s’appliquer current_password: Par mesure de sécurité, veuillez saisir le mot de passe de ce compte current_username: Pour confirmer, veuillez saisir le nom d'utilisateur de ce compte digest: Uniquement envoyé après une longue période d’inactivité en cas de messages personnels reçus pendant votre absence email: Vous recevrez un courriel de confirmation - header: WEBP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions}px + header: WebP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions} px inbox_url: Copiez l’URL depuis la page d’accueil du relai que vous souhaitez utiliser irreversible: Les messages filtrés disparaîtront irrévocablement, même si le filtre est supprimé plus tard locale: La langue de l’interface, des courriels et des notifications @@ -61,9 +61,9 @@ fr-CA: setting_default_quote_policy_private: Les messages limités aux personnes qui vous suivent publiés depuis Mastodon ne peuvent pas être cités. setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic - setting_display_media_default: Masquer les médias marqués comme sensibles - setting_display_media_hide_all: Toujours masquer les médias - setting_display_media_show_all: Toujours afficher les médias + setting_display_media_default: Avertir avant d'afficher les médias marqués comme sensibles + setting_display_media_hide_all: Avertir avant d'afficher tous les médias + setting_display_media_show_all: Afficher tous les médias sans avertissement, y compris ceux marqués comme sensibles setting_emoji_style: Manière d'afficher les émojis. Utiliser « Auto » pour essayer d'utiliser les émojis natifs, mais Twemoji sera utilisé pour les anciens navigateurs. setting_quick_boosting_html: Lorsque cette option est activée, cliquer sur l'icône de partage %{boost_icon} va immédiatement partager le message au lieu d'ouvrir le menu déroulant Partage/Citation. L'action de citation est déplacée dans le menu %{options_icon} (options). setting_system_scrollbars_ui: S'applique uniquement aux navigateurs basés sur Safari et Chrome @@ -86,17 +86,17 @@ fr-CA: warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire - app_icon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. + app_icon: WebP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. backups_retention_period: Les utilisateur·rice·s ont la possibilité de générer des archives de leurs messages pour les télécharger plus tard. Lorsqu'elles sont définies à une valeur positive, ces archives seront automatiquement supprimées de votre stockage après le nombre de jours spécifié. - bootstrap_timeline_accounts: Ces comptes seront épinglés en haut des recommandations pour les nouveaux utilisateurs. Accepte une liste de comptes séparés par des virgules. + bootstrap_timeline_accounts: Ces comptes seront épinglés en haut des recommandations pour les nouveaux utilisateur·rice·s. Accepte une liste de comptes séparés par des virgules. closed_registrations_message: Affiché lorsque les inscriptions sont fermées - content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte de l'interaction de l'utilisateur·rice local·e avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou comme favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateurs lorsqu'elle est appliquée à des fins d'utilisation ordinaires. + content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte des interactions locales avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateur·rice·s lorsqu'il est appliquée à une instance généraliste. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. - favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. - landing_page: Sélectionner la page à afficher aux nouveaux visiteur·euse·s quand ils arrivent sur votre serveur. Pour utiliser « Tendances » les tendances doivent être activées dans les paramètres de découverte. Pour utiliser « Fil local » le paramètre « Accès au flux en direct de ce serveur » doit être défini sur « Tout le monde » dans les paramètres de découverte. + favicon: WebP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. + landing_page: Sélectionne la page à afficher aux nouveaux visiteur·euse·s quand ils arrivent sur votre serveur. Pour utiliser « Tendances » les tendances doivent être activées dans les paramètres de découverte. Pour utiliser « Fil local » le paramètre « Accès au flux en direct de ce serveur » doit être défini sur « Tout le monde » dans les paramètres de découverte. mascot: Remplace l'illustration dans l'interface Web avancée. - media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateurs distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. - min_age: Les utilisateurs seront invités à confirmer leur date de naissance lors de l'inscription + media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateur·rice·s distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. + min_age: Les utilisateur·rice·s seront invité·e·s à confirmer leur date de naissance lors de l'inscription peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. profile_directory: L'annuaire des profils répertorie tous les utilisateurs qui ont opté pour être découverts. require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif @@ -109,6 +109,7 @@ fr-CA: status_page_url: URL d'une page où les gens peuvent voir l'état de ce serveur en cas de panne theme: Thème que verront les utilisateur·rice·s déconnecté·e·s ainsi que les nouveaux·elles utilisateur·rice·s. thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. + thumbnail_description: Une description de l'image pour aider les personnes ayant une déficience visuelle à comprendre son contenu. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quelles publications, hashtags et actualités sont en train de gagner en traction sur votre serveur. wrapstodon: Offrez aux comptes locaux de générer un récapitulatif annuel de leur utilisation de Mastodon. Cette fonctionnalité est disponible chaque année du 10 au 31 décembre, et est accessible pour les comptes ayant publié au moins un message Public ou Public discret et utilisé au moins un hashtag dans l'année. @@ -134,31 +135,33 @@ fr-CA: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' webauthn: Si c'est une clé USB, assurez-vous de l'insérer et, si nécessaire, de la tapoter. settings: + email_subscriptions: La désactivation conserve les abonné·e·s mais arrête l'envoie de courriels. indexable: Votre page de profil peut apparaître dans les résultats de recherche sur Google, Bing et autres. show_application: Vous pourrez toujours voir quelle application vous avez utilisé pour publier un message dans tous les cas. tag: name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible terms_of_service: changelog: Peut être structuré avec la syntaxe Markdown. - effective_date: Un délai raisonnable peut varier entre 10 et 30 jours à compter de la date à laquelle vous informez vos utilisateurs. + effective_date: Un délai raisonnable peut varier entre 10 et 30 jours à compter de la date à laquelle vous informez vos utilisateur·rice·s. text: Peut être structuré avec la syntaxe Markdown. terms_of_service_generator: admin_email: Les avis juridiques comprennent les contre-avis, les ordonnances judiciaires, les demandes de retrait et les demandes des forces de l'ordre. - arbitration_address: Il peut s'agir de la même que l'adresse physique ci-dessus, ou « N/A » si vous utilisez une adresse e-mail. - arbitration_website: Il peut s'agir d'un formulaire web ou de « N/A » s'il s'agit d'un courrier électronique. + arbitration_address: Il peut s'agir de la même que l'adresse physique ci-dessus, ou « N/A » si vous utilisez une adresse de courriel. + arbitration_website: Il peut s'agir d'un formulaire web ou de « N/A » s'il s'agit d'une adresse de courriel. choice_of_law: Ville, région, territoire ou État dont le droit matériel interne régit toute réclamation. - dmca_address: Pour les opérateurs américains, utilisez l'adresse enregistrée dans le répertoire des agents désignés du DMCA Designated Agent Directory. Une boîte postale est disponible sur demande directe. Utilisez le formulaire de demande de dérogation pour l'utilisation d'une boîte postale par un agent désigné du Designated Agent Post Office Box Waiver Request pour envoyer un e-mail au Bureau du droit d'auteur (Copyright Office) et expliquer que vous êtes un modérateur de contenu à domicile qui craint des représailles ou une vengeance pour ses actions et que vous avez besoin d'utiliser une boîte postale afin de masquer votre adresse personnelle au public. - dmca_email: Il peut s'agir du même courriel que celui utilisé pour l'« Adresse électronique pour les avis juridiques » ci-dessus. + dmca_address: Pour les opérateurs états-uniens, utiliser l'adresse enregistrée dans le répertoire des agents désignés du DMCA (DMCA Designated Agent Directory). Une boîte postale est disponible sur demande directe, utiliser le formulaire de demande de dérogation pour l'utilisation d'une boîte postale par un agent désigné du DMCA (Designated Agent Post Office Box Waiver Request) pour envoyer un courriel au bureau du droit d'auteur (Copyright Office) et expliquer que vous êtes un modérateur de contenu à domicile qui craint des représailles ou une vengeance pour ses actions et que vous avez besoin d'utiliser une boîte postale afin de masquer votre adresse personnelle au public. + dmca_email: Il peut s'agir de la même adresse que celle utilisée pour l'« Adresse de courriel pour les avis juridiques » ci-dessus. domain: Identification unique du service en ligne que vous offrez. - jurisdiction: Indiquez le pays dans lequel réside la personne qui paie les factures. S'il s'agit d'une entreprise ou d'une autre entité, indiquez le pays dans lequel elle est enregistrée, ainsi que la ville, la région, le territoire ou l'État, le cas échéant. + jurisdiction: Indique le pays dans lequel réside la personne qui paie les factures. S'il s'agit d'une entreprise ou d'une autre entité, indiquez le pays dans lequel elle est enregistrée, ainsi que la ville, la région, le territoire ou l'État, le cas échéant. min_age: Ne doit pas être en dessous de l’âge minimum requis par les lois de votre juridiction. user: - chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés sur les fils publics + chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés dans les fils publics. Ce paramètre n'affecte pas votre fil d'actualité, ni vos listes. date_of_birth: one: Nous devons vérifier que vous avez au moins %{count} an pour utiliser %{domain}. Cette information ne sera pas conservée. other: Nous devons vérifier que vous avez au moins %{count} ans pour utiliser %{domain}. Cette information ne sera pas conservée. - role: Le rôle définit quelles autorisations a l'utilisateur⋅rice. + role: Le rôle définit les autorisations de l'utilisateur⋅rice. user_role: + collection_limit: Limite le nombre de collections qu'un compte avec ce rôle peut créer. Veuillez noter que si vous diminuez cette limite, les comptes qui la dépassent ne perdront pas de collections. Mais ile ne pourront pas en créer de nouvelles. color: Couleur à attribuer au rôle dans l'interface, au format hexadécimal RVB highlighted: Cela rend le rôle visible publiquement name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge @@ -176,12 +179,12 @@ fr-CA: labels: account: attribution_domains: Sites web autorisés à vous citer - discoverable: Autoriser des algorithmes de découverte à mettre en avant votre profil et vos messages + discoverable: M'inclure dans les expériences de découverte fields: name: Étiquette value: Contenu indexable: Inclure mes messages publics dans les résultats de recherche - show_collections: Afficher les profils abonnés et suivis sur le profil + show_collections: Afficher les abonnements et les abonné·e·s sur le profil unlocked: Accepter automatiquement les nouveaux abonnés account_alias: acct: Identifiant de l’ancien compte @@ -315,6 +318,7 @@ fr-CA: status_page_url: URL de la page de l'état du serveur theme: Thème par défaut thumbnail: Miniature du serveur + thumbnail_description: Texte alternatif de la miniature trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances wrapstodon: Activer Wrapstodon @@ -356,6 +360,7 @@ fr-CA: hint: Information supplémentaire text: Règle settings: + email_subscriptions: Activer les abonnements par courriel indexable: Inclure la page de profil dans les moteurs de recherches show_application: Afficher quelle application a été utilisée pour envoyer un message tag: @@ -368,12 +373,12 @@ fr-CA: effective_date: Date effective text: Conditions d'utilisation terms_of_service_generator: - admin_email: Adresse électronique pour les notifications légales + admin_email: Adresse de courriel pour les notifications légales arbitration_address: Adresse physique pour les notifications d'arbitrage arbitration_website: Site Web pour soumettre les notifications d'arbitrage choice_of_law: Choix de la loi dmca_address: Adresse physique pour les avis DMCA/copyright - dmca_email: Adresse e-mail pour les avis DMCA/copyright + dmca_email: Adresse de courriel pour les avis DMCA/copyright domain: Domaine jurisdiction: Juridiction min_age: Âge minimum @@ -384,6 +389,7 @@ fr-CA: role: Rôle time_zone: Fuseau horaire user_role: + collection_limit: Nombre maximum de collections par compte color: Couleur du badge highlighted: Afficher le rôle avec un badge sur les profils des utilisateur·rice·s name: Nom diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 4375b37d3d3a6b..f3bab12cc14d4e 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -4,13 +4,13 @@ fr: hints: account: attribution_domains: Un par ligne. Protège contre les fausses attributions. - discoverable: Vos messages publics et votre profil peuvent être mis en avant ou recommandés dans diverses parties de Mastodon et votre profil peut être suggéré à d’autres utilisateurs. + discoverable: Vous pouvez apparaître dans les collections créées par d'autres personnes. Vous pouvez, ainsi que vos messages publics, aussi être suggéré dans d'autres expériences de découverte de Mastodon. display_name: Votre nom complet ou votre nom rigolo. fields: Votre page personnelle, vos pronoms, votre âge, ce que vous voulez. indexable: Vos messages publics peuvent apparaître dans les résultats de recherche sur Mastodon. Les personnes qui ont interagi avec vos messages peuvent les trouver dans une recherche quoi qu’il arrive. note: 'Vous pouvez @mentionner d’autres personnes ou des #hashtags.' - show_collections: Les gens pourront voir les personnes que vous suivez ou qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. - unlocked: Les personnes pourront vous suivre sans en demander la permission. Décochez cette case si vous souhaitez examiner les demandes de suivi et choisir d'accepter ou de rejeter les nouveaux followers. + show_collections: Les gens pourront voir les personnes que vous suivez et qui vous suivent. Ceux que vous suivez verront que vous les suivez dans tous les cas. + unlocked: Les personnes pourront vous suivre sans en demander d'approbation. Décochez cette case si vous souhaitez examiner les demandes d'abonnement et choisir de les accepter ou de les rejeter. account_alias: acct: Spécifiez l’identifiant@domaine du compte à partir duquel vous souhaitez migrer account_migration: @@ -40,15 +40,15 @@ fr: text: Vous ne pouvez faire appel d'une sanction qu'une seule fois defaults: autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement - avatar: WEBP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions}px + avatar: WebP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions} px bot: Signale aux autres que ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé - context: Un ou plusieurs contextes où le filtre devrait s’appliquer + context: Un ou plusieurs contextes où le filtre doit s’appliquer current_password: Par mesure de sécurité, veuillez saisir le mot de passe de ce compte current_username: Pour confirmer, veuillez saisir l’identifiant de ce compte digest: Uniquement envoyé après une longue période d’inactivité en cas de messages personnels reçus pendant votre absence email: Vous recevrez un courriel de confirmation - header: WEBP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions}px - inbox_url: Copiez l’URL depuis la page d’accueil du relais que vous souhaitez utiliser + header: WebP, PNG, GIF ou JPG. Au plus %{size}. Sera réduit à %{dimensions} px + inbox_url: Copiez l’URL depuis la page d’accueil du relai que vous souhaitez utiliser irreversible: Les messages filtrés disparaîtront irrévocablement, même si le filtre est supprimé plus tard locale: La langue de l’interface, des courriels et des notifications password: Utilisez au moins 8 caractères @@ -61,9 +61,9 @@ fr: setting_default_quote_policy_private: Les messages limités aux personnes qui vous suivent publiés depuis Mastodon ne peuvent pas être cités. setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic - setting_display_media_default: Masquer les médias marqués comme sensibles - setting_display_media_hide_all: Toujours masquer les médias - setting_display_media_show_all: Toujours afficher les médias + setting_display_media_default: Avertir avant d'afficher les médias marqués comme sensibles + setting_display_media_hide_all: Avertir avant d'afficher tous les médias + setting_display_media_show_all: Afficher tous les médias sans avertissement, y compris ceux marqués comme sensibles setting_emoji_style: Manière d'afficher les émojis. Utiliser « Auto » pour essayer d'utiliser les émojis natifs, mais Twemoji sera utilisé pour les anciens navigateurs. setting_quick_boosting_html: Lorsque cette option est activée, cliquer sur l'icône de partage %{boost_icon} va immédiatement partager le message au lieu d'ouvrir le menu déroulant Partage/Citation. L'action de citation est déplacée dans le menu %{options_icon} (options). setting_system_scrollbars_ui: S'applique uniquement aux navigateurs basés sur Safari et Chrome @@ -75,31 +75,31 @@ fr: domain: Ce domaine pourra récupérer des données de ce serveur et les données entrantes seront traitées et stockées email_domain_block: domain: Cela peut être le nom de domaine qui apparaît dans l'adresse courriel ou l'enregistrement MX qu'il utilise. Une vérification sera faite à l'inscription. - with_dns_records: Une tentative de résolution des enregistrements DNS du domaine donné sera effectuée et les résultats seront également mis sur liste noire + with_dns_records: Une tentative de résolution DNS du domaine donné sera faite et les résultats seront également bloqués featured_tag: name: 'Voici quelques hashtags que vous avez utilisés récemment :' filters: action: Choisir l'action à effectuer quand un message correspond au filtre actions: blur: Cacher les médias derrière un avertissement, sans cacher le texte - hide: Cacher complètement le contenu filtré, faire comme s'il n'existait pas + hide: Cacher complètement le contenu filtré, comme s'il n'existait pas warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre form_admin_settings: activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire - app_icon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. + app_icon: WebP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. backups_retention_period: Les utilisateur·rice·s ont la possibilité de générer des archives de leurs messages pour les télécharger plus tard. Lorsqu'elles sont définies à une valeur positive, ces archives seront automatiquement supprimées de votre stockage après le nombre de jours spécifié. - bootstrap_timeline_accounts: Ces comptes seront épinglés en haut des recommandations pour les nouveaux utilisateurs. Accepte une liste de comptes séparés par des virgules. + bootstrap_timeline_accounts: Ces comptes seront épinglés en haut des recommandations pour les nouveaux utilisateur·rice·s. Accepte une liste de comptes séparés par des virgules. closed_registrations_message: Affiché lorsque les inscriptions sont fermées - content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte de l'interaction de l'utilisateur·rice local·e avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou comme favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateurs lorsqu'elle est appliquée à des fins d'utilisation ordinaires. + content_cache_retention_period: Tous les messages provenant d'autres serveurs (y compris les partages et les réponses) seront supprimés passé le nombre de jours spécifié, sans tenir compte des interactions locales avec ces messages. Cela inclut les messages qu'un·e utilisateur·rice aurait marqué comme signets ou favoris. Les mentions privées entre utilisateur·rice·s de différentes instances seront également perdues et impossibles à restaurer. L'utilisation de ce paramètre est destinée à des instances spécifiques et contrevient à de nombreuses attentes des utilisateur·rice·s lorsqu'il est appliquée à une instance généraliste. custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. - favicon: WEBP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. - landing_page: Sélectionner la page à afficher aux nouveaux visiteur·euse·s quand ils arrivent sur votre serveur. Pour utiliser « Tendances » les tendances doivent être activées dans les paramètres de découverte. Pour utiliser « Fil local » le paramètre « Accès au flux en direct de ce serveur » doit être défini sur « Tout le monde » dans les paramètres de découverte. + favicon: WebP, PNG, GIF ou JPG. Remplace la favicon Mastodon par défaut avec une icône personnalisée. + landing_page: Sélectionne la page à afficher aux nouveaux visiteur·euse·s quand ils arrivent sur votre serveur. Pour utiliser « Tendances » les tendances doivent être activées dans les paramètres de découverte. Pour utiliser « Fil local » le paramètre « Accès au flux en direct de ce serveur » doit être défini sur « Tout le monde » dans les paramètres de découverte. mascot: Remplace l'illustration dans l'interface Web avancée. - media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateurs distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. - min_age: Les utilisateurs seront invités à confirmer leur date de naissance lors de l'inscription + media_cache_retention_period: Les fichiers médias des messages publiés par des utilisateur·rice·s distants sont mis en cache sur votre serveur. Lorsque cette valeur est positive, les médias sont supprimés au terme du nombre de jours spécifié. Si les données des médias sont demandées après leur suppression, elles seront téléchargées à nouveau, dans la mesure où le contenu source est toujours disponible. En raison des restrictions concernant la fréquence à laquelle les cartes de prévisualisation des liens interrogent des sites tiers, il est recommandé de fixer cette valeur à au moins 14 jours, faute de quoi les cartes de prévisualisation des liens ne seront pas mises à jour à la demande avant cette échéance. + min_age: Les utilisateur·rice·s seront invité·e·s à confirmer leur date de naissance lors de l'inscription peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. profile_directory: L'annuaire des profils répertorie tous les comptes qui ont permis d'être découverts. - require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif + require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rend le texte de l’invitation « Pourquoi voulez-vous vous inscrire ? » obligatoire plutôt que facultatif site_contact_email: Comment l'on peut vous joindre pour des requêtes d'assistance ou d'ordre juridique. site_contact_username: Comment les gens peuvent vous contacter sur Mastodon. site_extended_description: Toute information supplémentaire qui peut être utile aux non-inscrit⋅e⋅s et à vos utilisateur⋅rice⋅s. Peut être structurée avec la syntaxe Markdown. @@ -109,6 +109,7 @@ fr: status_page_url: URL d'une page où les gens peuvent voir l'état de ce serveur en cas de panne theme: Thème que verront les utilisateur·rice·s déconnecté·e·s ainsi que les nouveaux·elles utilisateur·rice·s. thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. + thumbnail_description: Une description de l'image pour aider les personnes ayant une déficience visuelle à comprendre son contenu. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quels messages, hashtags et actualités gagnent en popularité sur votre serveur. wrapstodon: Offrez aux comptes locaux de générer un récapitulatif annuel de leur utilisation de Mastodon. Cette fonctionnalité est disponible chaque année du 10 au 31 décembre, et est accessible pour les comptes ayant publié au moins un message Public ou Public discret et utilisé au moins un hashtag dans l'année. @@ -134,36 +135,38 @@ fr: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' webauthn: Si c'est une clé USB, assurez-vous de l'insérer et, si nécessaire, de la tapoter. settings: + email_subscriptions: La désactivation conserve les abonné·e·s mais arrête l'envoie de courriels. indexable: Votre page de profil peut apparaître dans les résultats de recherche sur Google, Bing et autres. show_application: Vous pourrez toujours voir quelle application vous avez utilisé pour publier un message dans tous les cas. tag: name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible terms_of_service: changelog: Peut être structuré avec la syntaxe Markdown. - effective_date: Un délai raisonnable peut varier entre 10 et 30 jours à compter de la date à laquelle vous informez vos utilisateurs. + effective_date: Un délai raisonnable peut varier entre 10 et 30 jours à compter de la date à laquelle vous informez vos utilisateur·rice·s. text: Peut être structuré avec la syntaxe Markdown. terms_of_service_generator: admin_email: Les avis juridiques comprennent les contre-avis, les ordonnances judiciaires, les demandes de retrait et les demandes des forces de l'ordre. - arbitration_address: Il peut s'agir de la même que l'adresse physique ci-dessus, ou « N/A » si vous utilisez une adresse e-mail. - arbitration_website: Il peut s'agir d'un formulaire web ou de « N/A » s'il s'agit d'un courrier électronique. + arbitration_address: Il peut s'agir de la même que l'adresse physique ci-dessus, ou « N/A » si vous utilisez une adresse de courriel. + arbitration_website: Il peut s'agir d'un formulaire web ou de « N/A » s'il s'agit d'une adresse de courriel. choice_of_law: Ville, région, territoire ou État dont le droit matériel interne régit toute réclamation. - dmca_address: Pour les opérateurs américains, utilisez l'adresse enregistrée dans le répertoire des agents désignés du DMCA Designated Agent Directory. Une boîte postale est disponible sur demande directe. Utilisez le formulaire de demande de dérogation pour l'utilisation d'une boîte postale par un agent désigné du Designated Agent Post Office Box Waiver Request pour envoyer un e-mail au Bureau du droit d'auteur (Copyright Office) et expliquer que vous êtes un modérateur de contenu à domicile qui craint des représailles ou une vengeance pour ses actions et que vous avez besoin d'utiliser une boîte postale afin de masquer votre adresse personnelle au public. - dmca_email: Il peut s'agir du même courriel que celui utilisé pour l'« Adresse électronique pour les avis juridiques » ci-dessus. + dmca_address: Pour les opérateurs états-uniens, utiliser l'adresse enregistrée dans le répertoire des agents désignés du DMCA (DMCA Designated Agent Directory). Une boîte postale est disponible sur demande directe, utiliser le formulaire de demande de dérogation pour l'utilisation d'une boîte postale par un agent désigné du DMCA (Designated Agent Post Office Box Waiver Request) pour envoyer un courriel au bureau du droit d'auteur (Copyright Office) et expliquer que vous êtes un modérateur de contenu à domicile qui craint des représailles ou une vengeance pour ses actions et que vous avez besoin d'utiliser une boîte postale afin de masquer votre adresse personnelle au public. + dmca_email: Il peut s'agir de la même adresse que celle utilisée pour l'« Adresse de courriel pour les avis juridiques » ci-dessus. domain: Identification unique du service en ligne que vous offrez. - jurisdiction: Indiquez le pays dans lequel réside la personne qui paie les factures. S'il s'agit d'une entreprise ou d'une autre entité, indiquez le pays dans lequel elle est enregistrée, ainsi que la ville, la région, le territoire ou l'État, le cas échéant. + jurisdiction: Indique le pays dans lequel réside la personne qui paie les factures. S'il s'agit d'une entreprise ou d'une autre entité, indiquez le pays dans lequel elle est enregistrée, ainsi que la ville, la région, le territoire ou l'État, le cas échéant. min_age: Ne doit pas être en dessous de l’âge minimum requis par les lois de votre juridiction. user: - chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés sur les fils publics + chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés dans les fils publics. Ce paramètre n'affecte pas votre fil d'actualité, ni vos listes. date_of_birth: one: Nous devons vérifier que vous avez au moins %{count} an pour utiliser %{domain}. Cette information ne sera pas conservée. other: Nous devons vérifier que vous avez au moins %{count} ans pour utiliser %{domain}. Cette information ne sera pas conservée. - role: Le rôle définit quelles autorisations a l'utilisateur⋅rice. + role: Le rôle définit les autorisations de l'utilisateur⋅rice. user_role: + collection_limit: Limite le nombre de collections qu'un compte avec ce rôle peut créer. Veuillez noter que si vous diminuez cette limite, les comptes qui la dépassent ne perdront pas de collections. Mais ile ne pourront pas en créer de nouvelles. color: Couleur à attribuer au rôle dans l'interface, au format hexadécimal RVB highlighted: Cela rend le rôle visible publiquement - name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge + name: Nom public du rôle, si le rôle est configuré pour être affiché en tant que badge permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à … - position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure + position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure require_2fa: Les utilisateur·ice·s ayant ce rôle devront configurer l'authentification à deux facteurs pour utiliser Mastodon username_block: allow_with_approval: Au lieu de bloquer l'inscription, les inscriptions correspondantes nécessiteront votre approbation @@ -176,12 +179,12 @@ fr: labels: account: attribution_domains: Sites web autorisés à vous citer - discoverable: Autoriser des algorithmes de découverte à mettre en avant votre profil et vos messages + discoverable: M'inclure dans les expériences de découverte fields: name: Étiquette value: Contenu indexable: Inclure mes messages publics dans les résultats de recherche - show_collections: Afficher les profils abonnés et suivis sur le profil + show_collections: Afficher les abonnements et les abonné·e·s sur le profil unlocked: Accepter automatiquement les nouveaux abonnés account_alias: acct: Identifiant de l’ancien compte @@ -225,7 +228,7 @@ fr: expires_in: Expire après fields: Métadonnées du profil filter_action: Action du filtre - header: Image d’en-tête + header: Photo de couverture honeypot: "%{label} (ne pas remplir)" inbox_url: URL de la boîte de relais irreversible: Supprimer plutôt que masquer @@ -315,6 +318,7 @@ fr: status_page_url: URL de la page de l'état du serveur theme: Thème par défaut thumbnail: Miniature du serveur + thumbnail_description: Texte alternatif de la miniature trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances wrapstodon: Activer Wrapstodon @@ -356,6 +360,7 @@ fr: hint: Information supplémentaire text: Règle settings: + email_subscriptions: Activer les abonnements par courriel indexable: Inclure la page de profil dans les moteurs de recherches show_application: Afficher quelle application a été utilisée pour envoyer un message tag: @@ -368,12 +373,12 @@ fr: effective_date: Date effective text: Conditions d'utilisation terms_of_service_generator: - admin_email: Adresse électronique pour les notifications légales + admin_email: Adresse de courriel pour les notifications légales arbitration_address: Adresse physique pour les notifications d'arbitrage arbitration_website: Site Web pour soumettre les notifications d'arbitrage choice_of_law: Choix de la loi dmca_address: Adresse physique pour les avis DMCA/copyright - dmca_email: Adresse e-mail pour les avis DMCA/copyright + dmca_email: Adresse de courriel pour les avis DMCA/copyright domain: Domaine jurisdiction: Juridiction min_age: Âge minimum @@ -384,8 +389,9 @@ fr: role: Rôle time_zone: Fuseau horaire user_role: + collection_limit: Nombre maximum de collections par compte color: Couleur du badge - highlighted: Afficher le rôle avec un badge sur les profils des utilisateur·rice·s + highlighted: Afficher le rôle en tant que badge sur les profils des utilisateur·rice·s name: Nom permissions_as_keys: Autorisations position: Priorité diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 7b88eee24f6693..f2588ff3e1864e 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -4,7 +4,6 @@ fy: hints: account: attribution_domains: Ien per rigel. Beskermet tsjin falske attribúsjes. - discoverable: Jo iepenbiere berjochten kinne útljochte wurde op ferskate plakken binnen Mastodon en jo account kin oanrekommandearre wurde oan oare brûkers. display_name: Jo folsleine namme of in aardige bynamme. fields: Jo website, persoanlike foarnammewurden, leeftiid, alles wat jo mar kwyt wolle. indexable: Jo iepenbiere berjochten kinne ferskine yn de sykresultaten op Mastodon. Minsken dy’t reagearre hawwe op jo berjochten kinne se hoe dan ek trochsykje. @@ -57,9 +56,6 @@ fy: setting_aggregate_reblogs: Gjin nije boosts toane foar berjochten dy’t resintlik noch boost binne (hat allinnich effekt op nij ûntfongen boosts) setting_always_send_emails: Normaliter wurde der gjin e-mailmeldingen ferstjoerd wannear’t jo aktyf Mastodon brûke setting_default_sensitive: Gefoelige media wurdt standert ferstoppe en kin mei ien klik toand wurde - setting_display_media_default: As gefoelich markearre media ferstopje - setting_display_media_hide_all: Media altyd ferstopje - setting_display_media_show_all: Media altyd toane setting_emoji_style: Wêrmei moatte emojis werjûn wurde. ‘Automatysk’ probearret de systeemeigen emojis te brûken, mar falt werom op Twemoji foar âldere browsers. setting_system_scrollbars_ui: Allinnich fan tapassing op desktopbrowsers basearre op Safari en Chromium setting_use_blurhash: Dizige kleuroergongen binne basearre op de kleuren fan de ferstoppe media, wêrmei elk detail ferdwynt @@ -144,7 +140,6 @@ fy: jurisdiction: Fermeld it lân wêr’t de persoan wennet dy’t de rekkeningen betellet. As it in bedriuw of in oare entiteit is, fermeld it lân wêr’t it opnommen is en de stêd, regio, grûngebiet of steat, foar safier fan tapassing. min_age: Mei net leger wêze as de minimale fereaske leeftiid neffens de wetten fan jo jurisdiksje. user: - chosen_languages: Allinnich berjochten yn de selektearre talen wurde op de iepenbiere tiidline toand date_of_birth: one: Wy moatte derfoar soargje dat jo op syn minst %{count} binne om %{domain} brûke te meien. Dit wurdt net bewarre. other: Wy moatte derfoar soargje dat jo op syn minst %{count} binne om %{domain} brûke te meien. Dit wurdt net bewarre. @@ -162,7 +157,6 @@ fy: labels: account: attribution_domains: Websites dy’t jo wurdearring jaan meie - discoverable: Profyl en bydragen yn sykalgoritmen opnimme litte fields: name: Label value: Ynhâld diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index daa4e62f31b547..8ce7bf11aca0da 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -4,7 +4,7 @@ ga: hints: account: attribution_domains: Ceann in aghaidh an líne. Cosnaíonn sé ó sannadh bréagach. - discoverable: Seans go mbeidh do phostálacha poiblí agus do phróifíl le feiceáil nó molta i réimsí éagsúla de Mastodon agus is féidir do phróifíl a mholadh d’úsáideoirí eile. + discoverable: D’fhéadfá a bheith le feiceáil i mbailiúcháin arna gcruthú ag úsáideoirí eile. D’fhéadfaí tú féin agus do phoist phoiblí a mholadh d’úsáideoirí in eispéiris fionnachtana eile ar fud Mastodon freisin. 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. @@ -61,9 +61,9 @@ ga: setting_default_quote_policy_private: Ní féidir le daoine eile poist atá scríofa ar Mastodon agus atá dírithe ar leanúna amháin a lua. setting_default_quote_policy_unlisted: Nuair a luann daoine thú, beidh a bpost i bhfolach ó amlínte treochta freisin. 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_display_media_default: Tabhair rabhadh sula dtaispeántar meáin atá marcáilte mar íogair + setting_display_media_hide_all: Rabhadh sula dtaispeántar na meáin go léir + setting_display_media_show_all: Taispeáin na meáin go léir gan rabhadh, lena n-áirítear meáin atá marcáilte mar íogair setting_emoji_style: Conas emojis a thaispeáint. Déanfaidh "Auto" iarracht emoji dúchasacha a úsáid, ach titeann sé ar ais go Twemoji le haghaidh seanbhrabhsálaithe. setting_quick_boosting_html: Nuair a bhíonn sé cumasaithe, má chliceálann tú ar an deilbhín Treisithe %{boost_icon}, treiseofar láithreach é in ionad an roghchlár anuas treisithe/lua a oscailt. Bogann sé seo an gníomh lua go dtí an roghchlár %{options_icon} (Roghanna). setting_system_scrollbars_ui: Ní bhaineann sé ach le brabhsálaithe deisce bunaithe ar Safari agus Chrome @@ -109,6 +109,7 @@ ga: status_page_url: URL leathanach inar féidir le daoine stádas an fhreastalaí seo a fheiceáil le linn briseadh amach theme: Téama a fheiceann cuairteoirí logáilte amach agus úsáideoirí nua. thumbnail: Íomhá thart ar 2:1 ar taispeáint taobh le faisnéis do fhreastalaí. + thumbnail_description: Cur síos ar an íomhá chun cabhrú le daoine le lagú radhairc a hábhar a thuiscint. 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í. wrapstodon: Iarr ar úsáideoirí áitiúla achoimre spraíúil a ghiniúint ar a n-úsáid Mastodon i rith na bliana. Bíonn an ghné seo ar fáil idir an 10ú agus an 31ú Nollaig gach bliain, agus tairgtear é d’úsáideoirí a rinne post Poiblí nó Ciúin Poiblí amháin ar a laghad agus a d’úsáid hais clib amháin ar a laghad laistigh den bhliain. @@ -134,6 +135,7 @@ ga: 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: + email_subscriptions: Coinnítear síntiúsóirí reatha ach cuirtear stop le ríomhphoist a sheoladh má dhíchumasaítear iad. 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: @@ -153,7 +155,7 @@ ga: jurisdiction: Liostaigh an tír ina bhfuil cónaí ar an té a íocann na billí. Más cuideachta nó aonán eile é, liostaigh an tír ina bhfuil sé corpraithe, agus an chathair, an réigiún, an chríoch nó an stát mar is cuí. min_age: Níor chóir go mbeidís faoi bhun na haoise íosta a éilíonn dlíthe do dhlínse. user: - chosen_languages: Nuair a dhéantar iad a sheiceáil, ní thaispeánfar ach postálacha i dteangacha roghnaithe in amlínte poiblí + chosen_languages: Nuair a bheidh sé seo seiceáilte, ní thaispeánfar ach poist i dteangacha roghnaithe in amlínte poiblí. Ní dhéanann an socrú seo difear d’amlíne Baile agus do liostaí. date_of_birth: few: Caithfimid a chinntiú go bhfuil tú %{count} ar a laghad chun %{domain} a úsáid. Ní stórálfaimid é seo. many: Caithfimid a chinntiú go bhfuil tú %{count} ar a laghad chun %{domain} a úsáid. Ní stórálfaimid é seo. @@ -162,6 +164,7 @@ ga: two: Caithfimid a chinntiú go bhfuil tú %{count} ar a laghad chun %{domain} a úsáid. Ní stórálfaimid é seo. role: Rialaíonn an ról na ceadanna atá ag an úsáideoir. user_role: + collection_limit: Cuireann sé teorainn le líon na mbailiúchán is féidir le húsáideoir aonair leis an ról seo a chruthú. Tabhair faoi deara, le do thoil, nuair a laghdaíonn tú an líon seo, nach gcaillfidh úsáideoirí atá ag an teorainn seo cheana féin aon bhailiúcháin. Ach ní bheidh siad in ann cinn bhreise a chruthú. 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 @@ -179,7 +182,7 @@ ga: labels: account: attribution_domains: Tá cead ag suíomhanna Gréasáin creidmheas a thabhairt duit - discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana + discoverable: Cuir mé i láthair i dtaithí fionnachtana fields: name: Lipéad value: Ábhar @@ -318,6 +321,7 @@ ga: status_page_url: URL an leathanaigh stádais theme: Téama réamhshocraithe thumbnail: Mionsamhail freastalaí + thumbnail_description: Téacs malartach mionsamhail trendable_by_default: Ceadaigh treochtaí gan athbhreithniú roimh ré trends: Cumasaigh treochtaí wrapstodon: Cumasaigh Wrapstodon @@ -359,6 +363,7 @@ ga: hint: Eolas breise text: Riail settings: + email_subscriptions: Cumasaigh clárúcháin ríomhphoist indexable: Cuir leathanach próifíle san innill chuardaigh show_application: Taispeáin cén aip ónar sheol tú postáil tag: @@ -387,6 +392,7 @@ ga: role: Ról time_zone: Crios ama user_role: + collection_limit: Uasmhéid na mBailiúchán in aghaidh an úsáideora color: Dath suaitheantas highlighted: Taispeáin ról mar shuaitheantas ar phróifílí úsáideora name: Ainm diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index edbd86c9d79a3c..54b56ea6934abf 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -4,7 +4,6 @@ gd: hints: account: attribution_domains: Loidhne fa leth do gach fear. Dìonaidh seo o iomraidhean meallta. - discoverable: Dh’fhaoidte gun dèid na postaichean poblach ’s a’ phròifil agad a bhrosnachadh no a mholadh ann an caochladh roinnean de Mhastodon agus gun dèid a’ phròifil agad a mholadh do chàch. display_name: D’ ainm slàn no spòrsail. fields: An duilleag-dhachaigh agad, roimhearan, aois, rud sam bith a thogras tu. indexable: Faodaidh na postaichean poblach agad a nochdadh am measg toraidhean luirg air Mastodon. ’S urrainn dhan fheadhainn a rinn eadar-ghabhail leis na postaichean agad lorg annta air a h-uile dòigh. @@ -61,9 +60,6 @@ gd: setting_default_quote_policy_private: Chan urrainn do chàch postaichean dhan luchd-leantainn a-mhàin a chaidh a sgrìobhadh le Mastodon a luaidh. setting_default_quote_policy_unlisted: Nuair a luaidheas daoine thu, thèid am post aca-san fhalach o loidhnichean-ama nan treandaichean. setting_default_sensitive: Thèid meadhanan frionasach fhalach a ghnàth is gabhaidh an nochdadh le briogadh orra - setting_display_media_default: Falaich meadhanan ris a bheil comharra gu bheil iad frionasach - setting_display_media_hide_all: Falaich na meadhanan an-còmhnaidh - setting_display_media_show_all: Seall na meadhanan an-còmhnaidh setting_emoji_style: An dòigh air an dèid emojis a shealltainn. Feuchaidh “Fèin-obrachail” ris na h-emojis tùsail a chleachdadh ach thèid Twemoji a chleachdadh ’nan àite air seann-bhrabhsairean. setting_quick_boosting_html: Ma tha seo an comas, ma nì thu briogadh air ìomhaigheag %{boost_icon} a’ bhrosnachaidh, thèid a bhrosnachadh sa bhad seach a bhith a’ fosgladh clàr-taice teàrnach a’ bhrosnachaidh/luaidh. Thèid gnìomh an luaidh a ghluasad gu clàr-taice %{options_icon} nan roghainnean. setting_system_scrollbars_ui: Chan obraich seo ach air brabhsairean desktop stèidhichte air Safari ’s Chrome @@ -134,6 +130,7 @@ gd: otp: 'Cuir a-steach an còd dà-cheumnach a ghin aplacaid an fhòn agad no cleachd fear dhe na còdan aisig agad:' webauthn: Mas e iuchair USB a th’ ann, dèan cinnteach gun cuir thu a-steach e is gun doir thu gnogag air ma bhios feum air sin. settings: + email_subscriptions: Ma chuireas tu seo à comas, cumaidh tu an luchd fo-sgrìobhaidh làithreach agad ach cha dèid puist-d a chur tuilleadh. indexable: Dh’fhaoidte gun nochd duilleag na pròifil agad am measg nan toraidhean luirg air Google, Bing is eile. show_application: Gidheadh, chì thu dè an aplacaid a dh’fhoillsich am post agad an-còmhnaidh. tag: @@ -153,7 +150,7 @@ gd: jurisdiction: Innis an dùthaich far a bheil an neach a phàigheas na bilichean a’ fuireach. Mas e companaidh no eintiteas eile a th’ ann, innis an dùthaich far a bheil e corpaichte agus am baile, sgìre, ranntair no stàit mar a tha iomchaidh. min_age: Cha bu chòir seo a bhith fon aois as lugha a dh’iarras laghain an t-uachdranais laghail agad. user: - chosen_languages: Nuair a bhios cromag ris, cha nochd ach postaichean sna cànain a thagh thu air loidhnichean-ama poblach + chosen_languages: Nuair a bhios cromag ris, cha nochd ach postaichean sna cànain a thagh thu air loidhnichean-ama poblach. Cha doir an roghainn seo buaidh air loidhne-ama na dachaighe no air na liostaichean agad. date_of_birth: few: Feumaidh sinn dèanamh cinnteach gu bheil thu %{count} bliadhnaichean a dh’aois air a char as lugha mus cleachd thu %{domain}. Cha chlàraich sinn seo. one: Feumaidh sinn dèanamh cinnteach gu bheil thu %{count} bhliadhna a dh’aois air a char as lugha mus cleachd thu %{domain}. Cha chlàraich sinn seo. @@ -166,6 +163,7 @@ gd: name: Ainm poblach na dreuchd ma chaidh a suidheachadh gun nochd i na baidse permissions_as_keys: Gheibh na cleachdaichean aig a bheil an dreuchd seo inntrigeadh dha… position: Ma tha còmhstri ann, buannaichidh an dreuchd as àirde ann an cuid a shuidheachaidhean. Tha gnìomhan sònraichte ann nach urrainn ach dreuchdan le prìomhachas ìosail a ghabhail + require_2fa: Feumaidh cleachdaichean aig a bheil an dreachd seo dearbhadh dà-cheumnach a shuidheachadh airson Mastodon a chleachdadh username_block: allow_with_approval: An àite bacadh clàraidh gu tur, bidh clàraidhean a mhaidsicheas feumach air d’ aonta comparison: Thoir an aire air an Scunthorpe Problem nuair a bhacas tu maidsichean pàirteach @@ -177,7 +175,6 @@ gd: labels: account: attribution_domains: Na làraichean-lìn a dh’fhaodas iomradh a thoirt ort - discoverable: Brosnaich a’ phròifil is postaichean agad sna h-algairimean rùrachaidh fields: name: Leubail value: Susbaint @@ -225,6 +222,7 @@ gd: email: Seòladh puist-d expires_in: Falbhaidh an ùine air às dèidh fields: Raointean a bharrachd + filter_action: Gnìomh na criathraige header: Dealbh a’ bhanna-chinn honeypot: "%{label} (na lìon seo)" inbox_url: URL bogsa a-steach an ath-sheachadain @@ -241,6 +239,7 @@ gd: setting_always_send_emails: Cuir brathan puist-d an-còmhnaidh setting_auto_play_gif: Cluich GIFs beòthaichte gu fèin-obrachail setting_boost_modal: Smachd air faicsinneachd nam brosnachaidhean + setting_color_scheme: Sgeama dhathan setting_contrast: Iomsgaradh setting_default_language: Cànan postaidh setting_default_privacy: Faicsinneachd nam post @@ -355,6 +354,7 @@ gd: hint: Barrachd fiosrachaidh text: Riaghailt settings: + email_subscriptions: Cuir clàraidhean puist-d an comas indexable: Gabh a-staigh duilleag na pròifil sna h-einnseanan-luirg show_application: Seall dè an aplacaid a chuir thu post leatha tag: @@ -388,6 +388,7 @@ gd: name: Ainm permissions_as_keys: Ceadan position: Prìomhachas + require_2fa: Iarr dearbhadh dà-cheumnach username_block: allow_with_approval: Ceadaich clàradh le aontachadh comparison: Dòigh a’ choimheis diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index c308eb32d96ef8..3283190387f4f1 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -4,7 +4,7 @@ gl: hints: account: attribution_domains: Un por liña. Como protección para falsas atribucións. - discoverable: As túas publicacións públicas e perfil poden mostrarse ou recomendarse en varias zonas de Mastodon e o teu perfil ser suxerido a outras usuarias. + discoverable: Outras usuarias pódente engadir ás súas coleccións. Ti e as túas publicacións públicas tamén poden suxerirse a outras usuarias nas seccións de suxestións de Mastodon. display_name: O teu nome completo ou un nome divertido. fields: Páxina web, pronome, idade, o que ti queiras. indexable: As túas publicacións públicas poderían aparecer nos resultados das buscas en Mastodon. En calquera caso, as persoas que interactúen coas túas publicacións poderán buscalas igualmente. @@ -61,9 +61,9 @@ gl: setting_default_quote_policy_private: As publicacións só para seguidoras creadas con Mastodon non poden ser citadas. setting_default_quote_policy_unlisted: Cando alguén te cite, a súa publicación non aparecerá nas cronoloxías de popularidade. setting_default_sensitive: Medios sensibles marcados como ocultos por defecto e móstranse cun click - setting_display_media_default: Ocultar medios marcados como sensibles - setting_display_media_hide_all: Ocultar sempre os medios - setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles + setting_display_media_default: Aviso antes de mostrar multimedia marcado como sensible + setting_display_media_hide_all: Aviso antes de mostrar calquera multimedia + setting_display_media_show_all: Mostrar todo o multimedia sen avisar, incluíndo o multimedia marcado como sensible setting_emoji_style: Forma de mostrar emojis. «Auto» intentará usar os emojis nativos, e se falla recurrirase a Twemoji en navegadores antigos. setting_quick_boosting_html: Se está activo, ao premer na icona %{boost_icon} Promover farase automáticamente a promoción no lugar de abrir o menú despregable promover/citar. Sitúa a acción de citar no menú %{options_icon} (Opcións). setting_system_scrollbars_ui: Aplícase só en navegadores de escritorio baseados en Safari e Chrome @@ -109,6 +109,7 @@ gl: status_page_url: URL dunha páxina onde se pode ver o estado deste servidor cando non está a funcionar theme: Decorado que verán visitantes e novas usuarias. thumbnail: Imaxe con proporcións 2:1 mostrada xunto á información sobre o servidor. + thumbnail_description: A descrición da imaxe axuda ás persoas con problemas de visión a comprender o seu contido. trendable_by_default: Omitir a revisión manual dos contidos populares. Poderás igualmente eliminar manualmente os elementos que vaian aparecendo. trends: As tendencias mostran publicacións, cancelos e novas historias que teñen popularidade no teu servidor. wrapstodon: Ofrecerlle ás usuarias locais crear un divertido resumo do seu uso de Mastodon durante o ano. Esta ferramenta está dispoñible entre o 10 e o 31 de Decembro de cada ano, e ofréceselle ás usuarias que publicaron polo menos unha mensaxe Pública ou Pública Limitada e utilizaron polo menos un cancelo durante o ano. @@ -134,6 +135,7 @@ gl: otp: 'Escribe o código do segundo factor creado pola aplicación do teu móbil ou usa un dos códigos de recuperación:' webauthn: Se é unha chave USB asegúrate de que está conectada e preme o botón. settings: + email_subscriptions: A desactivación mantén as subscricións actuais pero deixa de enviar correos. indexable: A túa páxina de perfil podería aparecer nos resultados de busca de Google, Bing e outros. show_application: Independentemente, ti sempre poderás ver a app coa que publicaches a túa publicación. tag: @@ -153,12 +155,13 @@ gl: jurisdiction: Informa sobre o país onde vive quen paga as facturas. Se é unha empresa ou outra entidade, indica o país onde está establecida e é axeitado escribir a cidade, rexión, territorio ou estado. min_age: Non debería ser inferior á idade mínima requerida polas leis da túa xurisdición. user: - chosen_languages: Se ten marca, só as publicacións nos idiomas seleccionados serán mostrados en cronoloxías públicas + chosen_languages: Se está seleccionada, esta opción fai que só se mostren nas cronoloxías públicas as publicacións dos idiomas seleccionados. Esta opción non afecta á túa cronoloxía de inicio e listas. date_of_birth: one: Temos que confirmar que tes %{count} anos polo menos para usar %{domain}. Non gardamos este dato. other: Temos que confirmar que tes %{count} anos polo menos para usar %{domain}. Non gardamos este dato. role: Os roles establecen os permisos que ten a usuaria. user_role: + collection_limit: Limita o número de coleccións que unha única usuaria con este rol pode crear. Ten en conta que cando diminúes este número as usuarias que xa acadasen o límite non perderán ningunha colección, mais non poderán crear ningunha nova. color: Cor que se usará para o rol a través da IU, como RGB en formato hex highlighted: Isto fai o rol publicamente visible name: Nome público do rol, se o rol se mostra como unha insignia @@ -176,7 +179,7 @@ gl: labels: account: attribution_domains: Sitios web que dan fe sobre ti - discoverable: Perfil destacado e publicacións nos algoritmos de descubrimento + discoverable: Incluírme nas seccións de descubrimento fields: name: Etiqueta value: Contido @@ -232,7 +235,7 @@ gl: locale: Idioma da interface max_uses: Número máximo de usos new_password: Novo contrasinal - note: Acerca de ti + note: Sobre ti otp_attempt: Código do Segundo Factor password: Contrasinal phrase: Palabra chave ou frase @@ -315,6 +318,7 @@ gl: status_page_url: URL da páxina do estado theme: Decorado predeterminado thumbnail: Icona do servidor + thumbnail_description: Texto alternativo da miniatura trendable_by_default: Permitir tendencias sen aprobación previa trends: Activar tendencias wrapstodon: Activar Wrapstodon @@ -356,6 +360,7 @@ gl: hint: Información adicional text: Regra settings: + email_subscriptions: Activar crear contas por correo indexable: Incluír páxina de perfil nos motores de busca show_application: Mostrar a app coa que enviaches unha publicación tag: @@ -384,6 +389,7 @@ gl: role: Rol time_zone: Fuso horario user_role: + collection_limit: Número máximo de coleccións por usuaria color: Cor da insignia highlighted: Mostrar rol como insignia en perfís de usuarias name: Nome diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 7f4943c80d6c01..a7b8cb17f2d144 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -4,7 +4,7 @@ he: hints: account: attribution_domains: אחד בכל שורה. יגן מפני יחוסים מטעים. - discoverable: הפוסטים והפרופיל שלך עשויים להיות מוצגים או מומלצים באזורים שונים באתר וייתכן שהפרופיל שלך יוצע למשתמשים אחרים. + discoverable: יתכן שתופיעו באוספים שנוצרו על ידי משתמשים אחרים. אתם וההודעות הציבוריות שלכם עשויים להיות מוצעים למשתמשים דרך חוויות גילוי נוספות ברחבי מסטודון. display_name: שמך המלא או שם הכיף שלך. fields: עמוד הבית שלך, לשון הפנייה, גיל, וכל מידע אחר לפי העדפתך האישית. indexable: ההודעות הפומביות שלך עשויות להופיע בתוצאות חיפוש במסטודון. אחרים שהדהדו, חיבבו או ענו להודעות האלו יוכלו למצוא אותן בחיפוש בכל מקרה. @@ -61,9 +61,9 @@ he: setting_default_quote_policy_private: הודעות לעוקבים־בלבד שנוצרו במסטודון חסומות מציטוט על ידי אחרים. setting_default_quote_policy_unlisted: כאשר אחרים מצטטים אותך, ההודעות שלהם יוסתרו גם מ"נושאים חמים". setting_default_sensitive: מדיה רגישה מוסתרת כברירת מחדל וניתן להציגה בקליק - setting_display_media_default: הסתרת מדיה המסומנת כרגישה - setting_display_media_hide_all: הסתר מדיה תמיד - setting_display_media_show_all: גלה מדיה תמיד + setting_display_media_default: הצג אזהרה בטרם הצגת מדיה המסווגת כרגישה + setting_display_media_hide_all: הזהר בטרם הצגת מדיה כלשהי + setting_display_media_show_all: הצג את כל תכני המדיה ללא אזהרה, גם אם סומנו כרגישים setting_emoji_style: כיצד להציג רגישונים. "אוטומטי" ינסה להציג מסט האימוג'י המקומי, אבל נופל לערכת Twemoji כברירת מחדל עבור דפדפנים ישנים. setting_quick_boosting_html: כשמאופשר, לחיצה על %{boost_icon} איקון הדהוד ייצור הדהוד מיידי במקום לפתוח את תיבת הבחירה הדהוד/ציטוט. מעביר את פעולת הציטוט אל %{options_icon} תפריט אפשרויות. setting_system_scrollbars_ui: נוגע רק לגבי דפדפני דסקטופ מבוססים ספארי וכרום @@ -109,6 +109,7 @@ he: status_page_url: כתובת לבדיקת מצב שרת זה בעת תקלה theme: ערכת המראה שיראו משתמשים חדשים ומשתמשים שאינם מחוברים. thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך. + thumbnail_description: תיאור התמונה יסיע לא.נשים עם לקויות ראיה להבין את ההקשר. trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה. trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך. wrapstodon: אפשר למשתמשיך המקומיים.ות ליצור סיכום חביב של פעילותם במסטודון בשנה האחרונה. התכונה מאופשרת בין 10 ועד 31 בדצמבר כל שנה, ומצעת למשתמשים שיצרו לפחות הודעה ציבורית אחת והשתמשו לפחות בתגית אחת במשך השנה. @@ -134,6 +135,7 @@ he: otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או להשתמש באחד מקודי אחזור הגישה שלך:' webauthn: אם זהו מכשיר USB יש לוודא שהוא מוכנס, ואם יש צורך, להקיש עליו. settings: + email_subscriptions: עצירה שומרת את ההרשמה אך עוצרת את שליחת הודעות הדוא"ל. indexable: המשתמש שלך עלול להופיע בתוצאות החיפוש של גוגל, בינג או מנועי חיפוש אחרים. show_application: תמיד ניתן לראות איזו אפליקציה פרסמה את הפוסט שלך בכל מקרה. tag: @@ -153,7 +155,7 @@ he: jurisdiction: פרט את המדינה שבה גר משלם החשבונות. אם מדובר בחברה או גוף אחר, פרטו את המדינה שבה הוקם התאגיד, העיר, האזור, או המדינה בהתאם לצורך. min_age: על הערך להיות לפחות בגיל המינימלי הדרוש בחוק באיזור השיפוט שלך. user: - chosen_languages: אם פעיל, רק הודעות בשפות הנבחרות יוצגו לפידים הפומביים + chosen_languages: אם מאופשר, רק הודעות בשפות הנבחרות שלך יוצגו בצירי הזמן הפומביים. המכוון הזה אינו משפיע על ציר הבית ועל רשימות. date_of_birth: many: עלינו לוודא שגילך לפחות %{count} כדי להשתמש בשרת %{domain}. המידע לא ישמר אצלנו. one: עלינו לוודא שגילך לפחות %{count} כדי להשתמש בשרת %{domain}. המידע לא ישמר אצלנו. @@ -161,6 +163,7 @@ he: two: עלינו לוודא שגילך לפחות %{count} כדי להשתמש בשרת %{domain}. המידע לא ישמר אצלנו. role: התפקיד שולט על אילו הרשאות יש למשתמש. user_role: + collection_limit: מגביל את מספר האוספים שיכולים משתמשים בתפקיד זה ליצור. יש לשים לב שעם הורדת המספר הזה, משתמשים שכבר הגיעו לרף המירבי לא יאבדו את האוספים שיצרו, אך לא יוכלו ליצור נוספים. color: צבע לתפקיד בממשק המשתמש, כ RGB בפורמט הקסדצימלי highlighted: מאפשר נראות ציבורית של התפקיד name: שם ציבורי של התפקיד, במידה והתפקיד מוגדר ככזה שמופיע כתג @@ -178,7 +181,7 @@ he: labels: account: attribution_domains: אתרים המורשים לייחס אליך מאמרים - discoverable: הצג משתמש ופוסטים בעמוד התגליות + discoverable: הציגו אותי בחוויות גילוי fields: name: תווית value: תוכן @@ -317,6 +320,7 @@ he: status_page_url: URL של עמוד סטטוס חיצוני theme: ערכת נושא ברירת מחדל thumbnail: תמונה ממוזערת מהשרת + thumbnail_description: תיאור תמונה מוקטנת trendable_by_default: הרשאה לפריטים להופיע בנושאים החמים ללא אישור מוקדם trends: אפשר פריטים חמים (טרנדים) wrapstodon: הפעלת סיכומודון @@ -358,6 +362,7 @@ he: hint: מידע נוסף text: כלל settings: + email_subscriptions: לאפשר הרשמות דוא"ל indexable: חשיפת דף המשתמש במנועי החיפוש show_application: חשיפת שם היישומון שהעלה את ההודעה tag: @@ -386,6 +391,7 @@ he: role: תפקיד time_zone: אזור זמן user_role: + collection_limit: מספר האוספים המירבי לחשבון color: צבע תג highlighted: הצג תפקיד כתג בפרופיל משתמש name: שם diff --git a/config/locales/simple_form.hr.yml b/config/locales/simple_form.hr.yml index 0236c8c00cafee..154c225656faeb 100644 --- a/config/locales/simple_form.hr.yml +++ b/config/locales/simple_form.hr.yml @@ -9,9 +9,6 @@ hr: defaults: autofollow: Ljudi koji se registriraju kroz pozivnicu će te automatski slijediti password: Mora biti najmanje 8 znakova - setting_display_media_default: Sakrij medijski sadržaj označen kao osjetljiv - setting_display_media_hide_all: Uvijek sakrij medijski sadržaj - setting_display_media_show_all: Uvijek prikaži medijski sadržaj username: Mora sadržavati samo slova, brojeve i _ imports: data: CSV datoteka izvezena iz drugog Mastodonovog poslužitelja diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index d21fa41b99aba6..ac4c27bb52e241 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -4,7 +4,7 @@ hu: hints: account: attribution_domains: Soronként egy. Megvéd a hamis forrásmegjelölésektől. - discoverable: A nyilvános bejegyzéseid és a profilod kiemelhető vagy ajánlható a Mastodon különböző területein, a profilod más felhasználóknak is javasolható. + discoverable: Szerepelhetsz mások által létrehozott gyűjteményekben. Te és a nyilvános bejegyzéseidet pedig javasolva lehetnek más felhasználóknak a Mastodonban található más felfedezési élményekben. display_name: Teljes neved vagy vicces neved. fields: Weboldalad, megszólításaid, korod, bármi, amit szeretnél. indexable: A nyilvános bejegyzéseid megjelenhetnek a Mastodon keresési eredményei között. Azok, akik kapcsolatba léptek a bejegyzéseiddel, ettől függetlenül kereshetik azokat. @@ -61,9 +61,9 @@ hu: setting_default_quote_policy_private: A Mastodonon írt, csak követőknek szóló bejegyzéseket mások nem idézhetik. setting_default_quote_policy_unlisted: Amikor idéznek tőled, a bejegyzésük rejtve lesz a felkapott bejegyzések hírfolyamain is. setting_default_sensitive: A kényes médiatartalmat alapesetben elrejtjük, de egyetlen kattintással előhozható - setting_display_media_default: Kényes tartalomnak jelölt média elrejtése - setting_display_media_hide_all: Média elrejtése mindig - setting_display_media_show_all: Média megjelenítése mindig + setting_display_media_default: Figyelmeztetés megjelenítése a kényesnek jelölt média megjelenítése előtt + setting_display_media_hide_all: Figyelmeztetés az összes média megjelenítése előtt + setting_display_media_show_all: Figyelmeztetés minden média megjelenítése esetén, köztük a kényesnek jelöltek esetén is setting_emoji_style: Az emodzsik megjelenítési módja. Az „Automatikus” megpróbálja a natív emodzsikat használni, de az örökölt böngészők esetén a Twemojira vált vissza. setting_quick_boosting_html: Ha engedélyezve van, akkor a %{boost_icon} Megtolás azonnal megtörténik, ahelyett hogy megnyitná a megtolás/idézés legördülő menüje. Az idézési műveletet áthelyezi a %{options_icon} (Beállítások) menübe. setting_system_scrollbars_ui: Csak Chrome és Safari alapú asztali böngészőkre vonatkozik @@ -109,6 +109,7 @@ hu: status_page_url: Annak az oldalnak az URL-je, melyen ennek a kiszolgálónak az állapotát látják az emberek egy leállás során theme: A téma, melyet a kijelentkezett látogatók és az új felhasználók látnak. thumbnail: Egy durván 2:1 arányú kép, amely a kiszolgálóinformációk mellett jelenik meg. + thumbnail_description: A kép leírása a látássérültek számára, hogy jobban megértsék a tartalmát. trendable_by_default: Kézi felülvizsgálat kihagyása a felkapott tartalmaknál. Az egyes elemek utólag távolíthatók el a trendek közül. trends: A trendek azt mondják meg, hogy mely bejegyzések, hashtagek és hírbejegyzések felkapottak a kiszolgálódon. wrapstodon: Kínáld fel a lehetőséget a helyi felhasználóknak, hogy egy vidám összefoglalóban összesíthessék a Mastodon használatukat az év folyamán. Ez a lehetőség minden évben december 10. és 31. között érhető el, azoknak, aki létrehoztak legalább egy nyilvános vagy csendes nyilvános bejegyzést és használtak legalább egy hashtaget az év folyamán. @@ -134,6 +135,7 @@ hu: otp: 'Add meg a telefonodon generált kétlépcsős azonosító kódodat vagy használd az egyik tartalék bejelentkező kódot:' webauthn: Ha ez egy USB kulcs, ellenőrizd, hogy csatlakoztattad és ha szükséges, aktiváltad is. settings: + email_subscriptions: A kikapcsolás megtartja az eddigi feliratkozókat, de leállítja a levelek küldését. indexable: A profiloldalad megjelenhet a Google, a Bing és más keresőmotorok keresési eredményei között. show_application: Ettől függetlenül mindig láthatod, melyik alkalmazás tette közzé a bejegyzésedet. tag: @@ -153,12 +155,13 @@ hu: jurisdiction: Adja meg az országot, ahol a számlafizető él. Ha ez egy vállalat vagy más szervezet, adja meg az országot, ahol bejegyezték, valamint adott esetben a várost, régiót, területet vagy államot. min_age: Nem lehet a joghatóság által meghatározott minimális kor alatt. user: - chosen_languages: Ha aktív, csak a kiválasztott nyelvű bejegyzések jelennek majd meg a nyilvános idővonalon + chosen_languages: Ha be van kapcsolva, akkor csak a kiválasztott nyelvű bejegyzések jelennek meg a nyilvános idővonalakon. A beállítás nem befolyásolja a saját idővonaladat és a listáidat. date_of_birth: one: Ahhoz, hogy a(z) %{domain} weboldalt használd, meg kell győződnünk arról, hogy legalább %{count} éves vagy. Ezt nem tároljuk. other: Ahhoz, hogy a(z) %{domain} weboldalt használd, meg kell győződnünk arról, hogy legalább %{count} éves vagy. Ezt nem tároljuk. role: A szerep szabályozza, hogy a felhasználó milyen jogosultságokkal rendelkezik. user_role: + collection_limit: Korlátozza az ilyen szerepkörű felhasználók által létrehozható gyűjtemények számát. Vedd figyelembe, hogy a szám csökkentésével a korlát feletti felhasználók nem vesztik el a gyűjteményeiket. De továbbiakat már nem fognak tudni létrehozni. color: A szerephez használandó szín mindenhol a felhasználói felületen, hexa RGB formátumban highlighted: Ez nyilvánosan láthatóvá teszi a szerepet name: A szerep nyilvános neve, ha a szerepet úgy állították be, hogy jelvényként látható legyen @@ -176,7 +179,7 @@ hu: labels: account: attribution_domains: Weboldalak, melyek szerzőként tüntethetnek fel - discoverable: Profil és bejegyzések szerepeltetése a felfedezési algoritmusokban + discoverable: Szerepelhetek a felfedezési élményekben fields: name: Címke value: Tartalom @@ -315,6 +318,7 @@ hu: status_page_url: Állapotoldal URL-je theme: Alapértelmezett téma thumbnail: Kiszolgáló bélyegképe + thumbnail_description: Bélyegkép helyettesítő szövege trendable_by_default: Trendek engedélyezése előzetes ellenőrzés nélkül trends: Trendek engedélyezése wrapstodon: Wrapstodon engedélyezése @@ -356,6 +360,7 @@ hu: hint: További információk text: Szabály settings: + email_subscriptions: E-mailes regisztráció bekapcsolása indexable: A profiloldal szerepeltetése a keresőmotorokban show_application: A bejegyzést küldő alkalmazás megjelenítése tag: @@ -384,6 +389,7 @@ hu: role: Szerep time_zone: Időzóna user_role: + collection_limit: Gyűjtemények legnagyobb száma felhasználónként color: Jelvény színe highlighted: Szerep megjelenítése jelvényként a felhasználói profilokon name: Név diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml index 4bf125a5b7e19b..245d522fcf67cf 100644 --- a/config/locales/simple_form.hy.yml +++ b/config/locales/simple_form.hy.yml @@ -37,9 +37,6 @@ hy: scopes: Որ API֊ին յաւելուածն ունի հասանելիութիւն։ Եթէ ընտրել ես բարձր մակարդակի դաշտ, ապա անհատական ընտրելու կարիք չկայ։ setting_aggregate_reblogs: Չցուցադրել տարածումներն այն գրառումների համար, որոնք քիչ առաջ արդէն տարածուել են (վերաբերում է միայն վերջին տարածումներին) setting_default_sensitive: Կասկածելի բովանդակութիւնը լռելեայն փակ է եւ կարող է բացուել սեղմելով - setting_display_media_default: Թաքցնել կասկածելի բովանդակութիւնը - setting_display_media_hide_all: Երբեք մեդիա ցոյց չտալ - setting_display_media_show_all: Մեդիա միշտ ցոյց տալ setting_use_blurhash: Կտորները հիմնուում են թաքցուած վիզուալի վրայ՝ խամրեցնելով դետալները setting_use_pending_items: Թաքցնել հոսքի թարմացումները կոճակի ետեւում՝ աւտօմատ թարմացուող հոսքի փոխարէն username: Միայն լատինատառեր, թուեր եւ տակի գծիկ @@ -67,8 +64,6 @@ hy: webauthn: Եթէ սա USB է՝ վստահ եղիր տեղադրել այն եւ եթէ անհրաժեշտ է՝ թափահարել։ tag: name: Կարող ես միայն փոխել տառերի ձեւը, օրինակ, այն աւելի ընթեռնելի դարձնելու համար - user: - chosen_languages: Նշուած ժամանակ, հոսքում կերեւայ միայն ընտրուած լեզուով գրառումները labels: account: fields: diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 39992a569e9f6e..b1718009b4c72e 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -4,7 +4,6 @@ ia: hints: account: attribution_domains: Un per linea. Protege contra false attributiones. - discoverable: Tu messages public e tu profilo pote esser mittite in evidentia o recommendate in varie areas de Mastodon e tu profilo pote esser suggerite a altere usatores. display_name: Tu prenomine e nomine de familia o tu pseudonymo. fields: Tu pagina principal, pronomines, etate, tote lo que tu vole. indexable: Tu messages public pote apparer in le resultatos de recerca sur Mastodon. Le personas qui ha interagite con tu messages pote cercar los in omne caso. @@ -61,9 +60,6 @@ ia: setting_default_quote_policy_private: Le messages limitate al sequitores scribite sur Mastodon non pote esser citate per alteres. setting_default_quote_policy_unlisted: Quando le gente te cita, lor message equalmente non apparera in le chronologias de tendentias. setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic - setting_display_media_default: Celar le medios marcate como sensibile - setting_display_media_hide_all: Sempre celar contento multimedial - setting_display_media_show_all: Sempre monstrar contento multimedial setting_emoji_style: Como monstrar emojis. “Automatic” tentara usar emojis native, ma recurre al Twemojis pro navigatores ancian. setting_quick_boosting_html: Si isto es activate, un clic sur le icone %{boost_icon} Impulsar impulsara immediatemente le message in loco de aperir le menu disrolante de impulsar/citar. Isto tamben colloca le action de citar in le menu %{options_icon} (Optiones). setting_system_scrollbars_ui: Se applica solmente al navigatores de scriptorio basate sur Safari e Chrome @@ -150,7 +146,6 @@ ia: jurisdiction: Indica le pais ubi vive le persona qui paga le facturas. Si se tracta de un interprisa o altere organisation, indica le pais ubi illo es incorporate, e le citate, region, territorio o stato del maniera appropriate pro le pais. min_age: Non deberea esser infra le etate minime requirite per le leges de tu jurisdiction. user: - chosen_languages: Si marcate, solmente le messages in le linguas seligite apparera in chronologias public date_of_birth: one: Nos debe assecurar que tu ha al minus %{count} anno pro usar %{domain}. Nos non va immagazinar isto. other: Nos debe assecurar que tu ha al minus %{count} annos pro usar %{domain}. Nos non va immagazinar isto. @@ -172,7 +167,6 @@ ia: labels: account: attribution_domains: Sitos web autorisate a accreditar te - discoverable: Evidentiar le profilo e messages in le algorithmos de discoperta fields: name: Etiquetta value: Contento diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index 56c9deed9d6200..e57ee58e8cbcf4 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -3,7 +3,6 @@ id: simple_form: hints: account: - discoverable: Postingan dan profil publik Anda mungkin ditampilkan atau direkomendasikan di berbagai area Mastodon dan profil Anda mungkin disarankan ke pengguna lain. display_name: Nama lengkap Anda atau nama lucu Anda. account_alias: acct: Tentukan namapengguna@domain akun yang ingin Anda pindah @@ -47,9 +46,6 @@ id: setting_aggregate_reblogs: Jangan tampilkan boost baru untuk toot yang baru saja di-boost (hanya memengaruhi boost yang baru diterima) setting_always_send_emails: Secara normal, notifikasi email tidak akan dikirimkan kepada Anda ketika Anda sedang aktif menggunakan Mastodon setting_default_sensitive: Media sensitif disembunyikan secara bawaan dan akan ditampilkan dengan klik - setting_display_media_default: Sembunyikan media yang ditandai sebagai sensitif - setting_display_media_hide_all: Selalu sembunyikan semua media - setting_display_media_show_all: Selalu tampilkan media sensitif setting_use_blurhash: Gradien didasarkan pada warna visual yang tersembunyi tetapi mengaburkan setiap detail setting_use_pending_items: Sembunyikan pembaruan linimasa di balik klik alih-alih bergulir secara otomatis whole_word: Ketika kata kunci/frasa hanya alfanumerik, maka itu hanya akan diterapkan jika cocok dengan semua kata @@ -102,8 +98,6 @@ id: webauthn: Jika ini kunci USB pastikan dalam keadaan tercolok dan, jika perlu, ketuk. tag: name: Anda hanya dapat mengubahnya ke huruf kecil/besar, misalnya, agar lebih mudah dibaca - user: - chosen_languages: Ketika dicentang, hanya toot dalam bahasa yang dipilih yang akan ditampilkan di linimasa publik user_role: color: Warna yang digunakan untuk peran di antarmuka pengguna, sebagai RGB dalam format hex highlighted: Ini membuat peran terlihat secara publik diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index 73c3bcfa036477..e9aae4a0599253 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -3,7 +3,6 @@ ie: simple_form: hints: account: - discoverable: Tui public postas e profil posse esser recomandat in multiplic areas de Mastodon e tui profil posse esser suggestat a altri usatores. display_name: Tui complet nómine o tui amusant nómine. fields: Tui websitu, pronómines, etá, quocunc quel tu vole. indexable: Tui public postas posse aparir in sercha-resultates sur Mastodon. E in omni casu, tis qui ha interactet con tui postas va posser serchar e trovar les. @@ -55,9 +54,6 @@ ie: setting_aggregate_reblogs: Ne monstrar nov boosts por postas queles ha esset recentmen boostat (afecta solmen boostas recivet futurimen) setting_always_send_emails: Generalmen notificationes per email ne va esser misset quande tu activmen usa Mastodon setting_default_sensitive: Sensitiv medie es customarimen celat e posse esser revelat con un clicca - setting_display_media_default: Celar medie marcat quam sensitiv - setting_display_media_hide_all: Sempre celar medie - setting_display_media_show_all: Sempre monstrar medie setting_use_blurhash: Gradientes es basat sur li colores del celat visuales ma obscura omni detallies setting_use_pending_items: Celar nov postas detra un clicc vice rular li témpor-linea automaticmen username: Tu posse usar lítteres, númeres e sublineas @@ -123,8 +119,6 @@ ie: show_application: Totvez, tu va sempre posser vider quel app ha publicat tui posta. tag: name: Tu posse changear solmen li minu/majusculitá del lítteres, por exemple, por far it plu leibil - user: - chosen_languages: Quande selectet, solmen postas in ti lingues va esser monstrat in public témpor-lineas user_role: color: Color a usar por li rol tra li UI, quam RGB (rubi-verdi-blu) in formate hex highlighted: Va far li rol publicmen visibil @@ -137,7 +131,6 @@ ie: url: Ad u misser evenimentes labels: account: - discoverable: Monstrar profil e postas in algoritmes de decovrition fields: name: Etiquette value: Contenete diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 9cd295eb5f9fcc..387471ed1bb95e 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -4,7 +4,6 @@ io: hints: account: attribution_domains: Un en singla lineo. - discoverable: Vua publika posti e profilo povas remarkesar o rekomendesar en diferanta parti di Mastodon e vua profilo povas sugestesar ad altra uzanti. display_name: Vua tota nomo o vua gaya nomo. fields: Vua retsituo, pronomi, evo, irgo quan vu volas. indexable: Vua posta publika povos aparar en rezultaji di serchi che Mastodon. Personi qui interagis kun vua posti povos serchar oli irgakaze. @@ -57,9 +56,6 @@ io: setting_aggregate_reblogs: Ne montrez nova repeti di posti qui ja repetesis recente (nur efektigas repeti recevata nove) setting_always_send_emails: Normale retpostoavizi ne sendesas kande vu aktiva uzas Mastodon setting_default_sensitive: Trublema audvidaji originala celesas e povas descelesar per kliko - setting_display_media_default: Celez audvidaji qua markesis quale trublema - setting_display_media_hide_all: Omnatempe celas audvidaji - setting_display_media_show_all: Omnatempe montras audvidaji setting_system_scrollbars_ui: Nur ye tablokomputilretumili qua bazita ye Safario e Kromeo setting_use_blurhash: Inklini esas segun kolori di celesis vidaji ma kovras irga detali setting_use_pending_items: Celez tempolinetildatigo dop kliko vice automatike ruligar la fluo @@ -136,7 +132,6 @@ io: domain: Unika identifikeso di enreta servo qua vu provizas. jurisdiction: Listigez lando di paganto di fakturi. user: - chosen_languages: Kande marketigesis, nur posti en selektesis lingui montresos en publika tempolinei role: La rolo donas certena permisi a la uzanto. user_role: color: Koloro quo uzesas por rolo en tota UI, quale RGB kun hexformato @@ -151,7 +146,6 @@ io: labels: account: attribution_domains: Reteyi kua permisesis agnoskar vu - discoverable: Inkluzar profilo e posti en trovado-algoritmi fields: name: Etiketo value: Kontenajo diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 34121f6e8c071e..bc863a8d912db1 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -4,7 +4,7 @@ is: hints: account: attribution_domains: Eitt á hverja línu. Ver fyrir röngum tilvísunum. - discoverable: Opinberar færslur og notandasnið þitt geta birst eða verið mælt með á hinum ýmsu svæðum í Mastodon auk þess sem hægt er að mæla með þér við aðra notendur. + discoverable: Þú gætir komið fyrir í söfnum sem aðrir útbúa. Mögulega verður mælt með þér og opinberu færslunum þínum í þeim leiðum sem gera kleift að uppgötva aðra notendur víðs vegar á Mastodon. display_name: Fullt nafn þitt eða eitthvað til gamans. fields: Heimasíðan þín, fornöfn, aldur eða eitthvað sem þú vilt koma á framfæri. indexable: Opinberar færslur þínar gætu birst í leitarniðurstöðum á Mastodon. Fólk sem hefur haft afskipti af færslunum mun eftir sem áður geta leitað í þeim. @@ -61,9 +61,9 @@ is: setting_default_quote_policy_private: Aðrir geta ekki vitnað í færslur einungis til fylgjenda sem skrifaðar eru á Mastodon. setting_default_quote_policy_unlisted: Þegar fólk vitnar í þig verða færslurnar þeirr einnig faldar á vinsældatímalínum. setting_default_sensitive: Viðkvæmt myndefni er sjálfgefið falið og er hægt að birta með smelli - setting_display_media_default: Fela myndefni sem merkt er viðkvæmt - setting_display_media_hide_all: Alltaf fela allt myndefni - setting_display_media_show_all: Alltaf birta myndefni sem merkt er viðkvæmt + setting_display_media_default: Aðvara áður en birt er myndefni sem merkt er viðkvæmt + setting_display_media_hide_all: Aðvara áður en allt myndefni er birt + setting_display_media_show_all: Birta allt myndefni án aðvörunar, líka það sem merkt er viðkvæmt setting_emoji_style: Hvernig birta skal lyndistákn (emoji). "Sjálfvirkt" mun reyna að nota innbyggð lyndistákn, en til vara verða notuð Twemoji-tákn fyrir eldri vafra. setting_quick_boosting_html: Þegar þetta er virkt, sé smellt á %{boost_icon}-endurbirtingartáknið mun endurbirting eiga sér stað strax í stað þess að opna endurbirta/tilvitnun fellivalmyndina. Tilvitnunaraðgerðin færist þá yfir í %{options_icon} (Options) valmyndina. setting_system_scrollbars_ui: Á einungis við um vafra fyrir vinnutölvur sem byggjast á Safari og Chrome @@ -109,6 +109,7 @@ is: status_page_url: Slóð á síðu þar sem fólk getur séð ástand netþjónsins þegar vandræði koma upp theme: Þema sem útskráðir gestir og nýjir notendur sjá. thumbnail: Mynd um það bil 2:1 sem birtist samhliða upplýsingum um netþjóninn þinn. + thumbnail_description: Lýsing á myndinni sem hjálpar sjónskertu fólki að skilja efni hennar. trendable_by_default: Sleppa handvirkri yfirferð á vinsælu efni. Áfram verður hægt að fjarlægja stök atriði úr vinsældarlistum. trends: Vinsældir sýna hvaða færslur, myllumerki og fréttasögur séu í umræðunni á netþjóninum þínum. wrapstodon: Býður notendum á netþjóninum upp á skemmtilega samantekt um notkun þeirra á Mastodon á árinu sem er að líða. Þessi eiginleiki er í boði á milli 10. og 31. desember ár hvert og býðst þeim notendum sem hafa gert að minnsta kosti eina opinbera eða hljóðlega opinbera færslu og notað a. m. k. eitt myllumerki á árinu. @@ -134,6 +135,7 @@ is: otp: 'Settu inn tveggja-þátta kóðann sem farsímaforritið útbjó eða notaðu einn af endurheimtukóðunum þínum:' webauthn: Ef þetta er USB-lykill, gakktu úr skugga um að honum sé stungið í samband og ef þörf þykir að ýta á hann. settings: + email_subscriptions: Sé þetta gert óvirkt haldast fyrirliggjandi áskrifendur en sending tölvupósta stöðvast. indexable: Síðan með notandasniðinu þínu gæti birst í leitarniðurstöðum Google, Bing og fleiri. show_application: Þú munt alltaf geta séð hvaða forrit birti færsluna þína. tag: @@ -153,12 +155,13 @@ is: jurisdiction: Settu inn landið þar sem sá býr sem borgar reikningana. Ef það er fyrirtæki eða samtök, skaltu hafa það landið þar sem lögheimili þess er, auk borgar, héraðs, svæðis eða fylkis eins og við á. min_age: Ætti ekki að vera lægri en sá lágmarksaldur sek kveðið er á um í lögum þíns lögsagnarumdæmis. user: - chosen_languages: Þegar merkt er við þetta, birtast einungis færslur á völdum tungumálum á opinberum tímalínum + chosen_languages: Þegar merkt er við þetta verða einungis færslur á völdum tungumálum birtar í opinberum tímalínum. Þessi stilling hefur ekki áhrif á heimalínuna þína og lista. date_of_birth: one: Við verðum að ganga úr skugga um að þú hafir náð %{count} aldri til að nota %{domain}. Við munum ekki geyma þessar upplýsingar. other: Við verðum að ganga úr skugga um að þú hafir náð %{count} aldri til að nota %{domain}. Við munum ekki geyma þessar upplýsingar. role: Hlutverk stýrir hvaða heimildir notandinn hefur. user_role: + collection_limit: Takmarkar fjöldi safna sem hver notandi með þetta hlutverk getur útbúið. Athugaðu að með því að minnka þennan fjölda, þá munu notendur sem þegar eru við þessi mörk ekki missa nein söfn. En þeir munu ekki geta útbúið nein í viðbót. color: Litur sem notaður er fyrir hlutverkið allsstaðar í viðmótinu, sem RGB-gildi á hex-sniði highlighted: Þetta gerir hlutverk sýnilegt opinberlega name: Opinbert heiti hlutverks, ef birta á hlutverk sem merki @@ -176,7 +179,7 @@ is: labels: account: attribution_domains: Vefsvæði sem mega vitna í þig - discoverable: Hafa notandasnið og færslur með í reikniritum leitar + discoverable: Hafa mig með í leiðum sem gera kleift að uppgötva notendur fields: name: Skýring value: Efni @@ -184,9 +187,9 @@ is: show_collections: Birta fylgjendur og þá sem fylgst er með í notandasniði unlocked: Samþykkja nýja fylgjendur sjálfkrafa account_alias: - acct: Auðkenni gamla aðgangsins + acct: Kennislóð gamla aðgangsins account_migration: - acct: Auðkenni nýja aðgangsins + acct: Kennislóð nýja aðgangsins account_warning_preset: text: Forstilltur texti title: Titill @@ -315,6 +318,7 @@ is: status_page_url: Slóð á ástandssíðu theme: Sjálfgefið þema thumbnail: Smámynd vefþjóns + thumbnail_description: Hjálpartexti smámynda trendable_by_default: Leyfa vinsælt efni án undanfarandi yfirferðar trends: Virkja vinsælt wrapstodon: Virkja Ársuppgjörið @@ -356,6 +360,7 @@ is: hint: Viðbótarupplýsingar text: Regla settings: + email_subscriptions: Virkja áskriftir í tölvupósti indexable: Hafa notandasnið með í leitarvélum show_application: Birta úr hvaða forriti þú sendir færslu tag: @@ -384,6 +389,7 @@ is: role: Hlutverk time_zone: Tímabelti user_role: + collection_limit: Hámarksfjöldi safna á hvern notanda color: Litur merkis highlighted: Birta hlutverk sem merki á notandaauðkenni name: Nafn diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 657547d0b0a1aa..ea609dd40d9621 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -4,7 +4,7 @@ it: hints: account: attribution_domains: Uno per riga. Protegge da false attribuzioni. - discoverable: I tuoi post pubblici e il tuo profilo potrebbero essere presenti o consigliati in varie aree di Mastodon e il tuo profilo potrebbe essere suggerito ad altri utenti. + discoverable: Potresti essere incluso/a nelle collezioni create da altri utenti. Tu e i tuoi post pubblici potreste anche essere suggeriti ad altri utenti in altre esperienze di scoperta all'interno di Mastodon. display_name: Il tuo nome completo o il tuo soprannome. fields: La tua homepage, i pronomi, l'età, tutto quello che vuoi. indexable: I tuoi post pubblici potrebbero apparire nei risultati di ricerca su Mastodon. Le persone che hanno interagito con i tuoi post potrebbero essere in grado di cercarli anche se non hai attivato questa impostazione. @@ -61,9 +61,9 @@ it: setting_default_quote_policy_private: I post scritti e riservati ai follower su Mastodon non possono essere citati da altri. setting_default_quote_policy_unlisted: Quando le persone ti citano, il loro post verrà nascosto anche dalle timeline di tendenza. setting_default_sensitive: Media con contenuti sensibili sono nascosti in modo predefinito e possono essere rivelati con un click - setting_display_media_default: Nascondi media segnati come sensibili - setting_display_media_hide_all: Nascondi sempre tutti i media - setting_display_media_show_all: Mostra sempre i media segnati come sensibili + setting_display_media_default: Avvisa prima di mostrare contenuti multimediali contrassegnati come sensibili + setting_display_media_hide_all: Avvisa prima di mostrare tutti i contenuti multimediali + setting_display_media_show_all: Mostra tutti i contenuti multimediali senza preavviso, inclusi quelli contrassegnati come sensibili setting_emoji_style: Come visualizzare gli emoji. "Automatico" proverà a usare gli emoji nativi, ma per i browser più vecchi ricorrerà a Twemoji. setting_quick_boosting_html: Se abilitato, cliccando sull'icona Boost %{boost_icon}, il potenziamento verrà immediatamente attivato, anziché aprire il menu a discesa potenziamento/citazione. Sposta l'azione della citazione nel menu %{options_icon} (Opzioni). setting_system_scrollbars_ui: Si applica solo ai browser desktop basati su Safari e Chrome @@ -109,6 +109,7 @@ it: status_page_url: URL di una pagina in cui le persone possono visualizzare lo stato di questo server durante un disservizio theme: Tema visualizzato dai visitatori e dai nuovi utenti disconnessi. thumbnail: Un'immagine approssimativamente 2:1 visualizzata insieme alle informazioni del tuo server. + thumbnail_description: Una descrizione dell'immagine per aiutare le persone con disabilità visive a comprenderne il contenuto. trendable_by_default: Salta la revisione manuale dei contenuti di tendenza. I singoli elementi possono ancora essere rimossi dalle tendenze dopo il fatto. trends: Le tendenze mostrano quali post, hashtag e notizie stanno guadagnando popolarità sul tuo server. wrapstodon: Offri agli utenti locali la possibilità di generare un riassunto giocoso del loro utilizzo di Mastodon durante l’anno. Questa funzione è disponibile dal 10 al 31 dicembre di ogni anno ed è offerta agli utenti che hanno pubblicato almeno un post pubblico o pubblico silenzioso e utilizzato almeno un hashtag nell’arco dell’anno. @@ -134,6 +135,7 @@ it: otp: 'Inserisci il codice a due fattori generato dall''app del tuo telefono o usa uno dei codici di recupero:' webauthn: Se si tratta di una chiavetta USB assicurati di inserirla e, se necessario, toccarla. settings: + email_subscriptions: Disabilitando questa opzione, si mantengono gli iscritti esistenti ma si interrompe l'invio delle email. indexable: La pagina del tuo profilo potrebbe apparire nei risultati di ricerca su Google, Bing e altri. show_application: Tu sarai sempre in grado di vedere quale app ha pubblicato il tuo post anche se hai attivato questa impostazione. tag: @@ -153,12 +155,13 @@ it: jurisdiction: Indica il Paese in cui risiede il soggetto che paga le fatture. Se si tratta di un'azienda o di un altro ente, indicare il Paese in cui è costituito, nonché la città, la regione, il territorio o lo Stato, a seconda dei casi. min_age: Non si dovrebbe avere un'età inferiore a quella minima richiesta, dalle leggi della tua giurisdizione. user: - chosen_languages: Quando una o più lingue sono contrassegnate, nelle timeline pubbliche vengono mostrati solo i toot nelle lingue selezionate + chosen_languages: Quando selezionato, solo i post nelle lingue selezionate verranno visualizzati nelle timeline pubbliche. Questa impostazione non influisce sulla tua timeline della Home e sulle liste. date_of_birth: one: Dobbiamo assicurarci che tu abbia almeno %{count} anni per utilizzare %{domain}. Non memorizzeremo questo dato. other: Dobbiamo assicurarci che tu abbia almeno %{count} anni per utilizzare %{domain}. Non memorizzeremo questo dato. role: Il ruolo controlla quali permessi ha l'utente. user_role: + collection_limit: Limita il numero di collezioni che un singolo utente con questo ruolo può creare. Si prega di tenere presente che, quando diminuisci questo numero, gli utenti che hanno già raggiunto questo limite, non perderanno alcuna collezione. Ma non potranno crearne di nuove. color: Colore da usare per il ruolo in tutta l'UI, come RGB in formato esadecimale highlighted: Rende il ruolo visibile name: Nome pubblico del ruolo, se il ruolo è impostato per essere visualizzato come distintivo @@ -176,7 +179,7 @@ it: labels: account: attribution_domains: Siti web autorizzati ad accreditarti - discoverable: Include il profilo e i post negli algoritmi di scoperta + discoverable: Includimi nelle esperienze di scoperta fields: name: Etichetta value: Contenuto @@ -315,6 +318,7 @@ it: status_page_url: URL della pagina di stato theme: Tema predefinito thumbnail: Miniatura del server + thumbnail_description: Testo alternativo dell'immagine in miniatura trendable_by_default: Consenti le tendenze senza revisione preventiva trends: Abilita le tendenze wrapstodon: Abilita Wrapstodon @@ -356,6 +360,7 @@ it: hint: Informazioni aggiuntive text: Regola settings: + email_subscriptions: Abilita le iscrizioni via email indexable: Includi la pagina del profilo nei motori di ricerca show_application: Mostra da quale app hai inviato un post tag: @@ -384,6 +389,7 @@ it: role: Ruolo time_zone: Fuso orario user_role: + collection_limit: Numero massimo di collezioni per utente color: Colore distintivo highlighted: Mostra il ruolo come distintivo sui profili utente name: Nome diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 523d36a3fe551d..c687362c37ebbe 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -4,7 +4,6 @@ ja: hints: account: attribution_domains: 1行につき1つずつ入力してください。この設定は関わりのないwebサイトに対して虚偽の帰属表示が行われることを防止する役割があります。 - discoverable: プロフィールと公開投稿をMastodonのおすすめやハイライトとしてほかのユーザーに表示することを許可します。 display_name: フルネーム、ハンドルネームなど fields: ホームページ、代名詞、年齢など何でも構いません。 hide_collections: People will not be able to browse through your follows and followers. People that you follow will see that you follow them regardless. @@ -65,17 +64,16 @@ ja: setting_bookmark_category_needed: すべてのカテゴリから削除したとき、ブックマークが自動で外れるようになります setting_boost_modal: 有効にすると、ブーストによって、まず、ブーストの公開範囲を設定できる確認ダイアログが表示されます。 setting_custom_css_lead: '必ず覚えてください: 万が一カスタムCSSの入力を誤り、画面が正常に表示されなくなった場合は、サインイン画面の下にあるリンクよりカスタムCSSを無効化することができます。ブラウザのプライベートモードなどでサインイン画面を開き、無効化してください。' + setting_default_quote_policy_private: Mastodon で作成されたフォロワーのみの投稿は他人から引用できません。 + setting_default_quote_policy_unlisted: 誰かがあなたを引用すると、その投稿もトレンドから非表示になります。 setting_default_searchability: kmyblue・Fedibirdでは検索許可設定に基づき検索されます。Misskeyでは当設定に関係なく、全ての公開・ローカル公開・非収載投稿が検索されます。Mastodon・Firefishでは検索許可の代わりにプロフィール設定の「公開投稿を他のサーバーで自由に検索できるようにする」設定が適用されます setting_default_sensitive: 閲覧注意状態のメディアはデフォルトでは内容が伏せられ、クリックして初めて閲覧できるようになります setting_disallow_unlisted_public_searchability: この設定を有効にすると、非収載投稿と検索範囲「誰でも」は両立できず不特定多数からの検索が不可になります。Fedibirdと同じ挙動になります - setting_display_media_default: 閲覧注意としてマークされたメディアは隠す - setting_display_media_hide_all: メディアを常に隠す - setting_display_media_show_all: メディアを常に表示する setting_dtl_force_searchability: 'ハッシュタグ #%{tag} をつけて投稿するとき、検索許可を強制的に置き換えるかを設定します' setting_dtl_force_visibility: 'ハッシュタグ #%{tag} をつけて投稿するとき、公開範囲を強制的に置き換えるかを設定します' setting_emoji_reaction_policy: この設定をしてもkmyblue以外のサーバーのユーザーはその投稿に自由に絵文字をつけ、同じサーバーの中で共有できます。単にあなた自身の画面から絵文字リアクションを除去したいだけなら、外観設定から絵文字リアクションを無効にすることができます setting_emoji_reaction_streaming_notify_impl2: 当該サーバーの独自機能に対応したアプリを利用時に、絵文字リアクション機能を利用できます。動作確認していないため(そもそもそのようなアプリ自体を確認できていないため)正しく動かない場合があります - setting_emoji_style: 絵文字の表示方法。「オート」の場合、可能ならネイティブの絵文字を使用し、レガシーなブラウザではTwemojiで代替します。 + setting_emoji_style: 絵文字の表示方法。「自動」の場合、可能ならネイティブの絵文字を使用し、レガシーなブラウザではTwemojiで代替します。 setting_enable_emoji_reaction: この機能を無効にしても、他の人はあなたの投稿に絵文字をつけられます setting_enabled_visibilities: チェックを外した公開範囲は投稿することができなくなります。投稿しようとするとエラーが出ます setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします @@ -100,6 +98,7 @@ ja: featured_tag: name: 最近使用したハッシュタグ filters: + action: 投稿がフィルタに一致したときの動作を選択します actions: blur: メディアは警告して非表示にするが、テキストは表示する hide: フィルタに一致した投稿を完全に非表示にします @@ -109,6 +108,7 @@ ja: app_icon: モバイル端末で表示されるデフォルトのアプリアイコンを独自のアイコンで上書きします。WEBP、PNG、GIF、JPGが利用可能です。 auto_accept_legacy_quotes: Misskey、Fedibird形式の引用を無条件で承認し、またローカルアカウントが当該投稿を自由に引用できるようにします。各ユーザーの引用許可設定は無視されます backups_retention_period: ユーザーには、後でダウンロードするために投稿のアーカイブを生成する機能があります。正の値に設定すると、これらのアーカイブは指定された日数後に自動的にストレージから削除されます。 + bootstrap_timeline_accounts: これらのアカウントは新規ユーザーへのフォローのお勧めの最初に固定されます。コンマ区切りでアカウントを列挙してください。 closed_registrations_message: アカウント作成を停止している時に表示されます content_cache_retention_period: 他のサーバーからのすべての投稿(ブーストや返信を含む)は、指定された日数が経過すると、ローカルユーザーとのやりとりに関係なく削除されます。これには、ローカルユーザーがブックマークやお気に入りとして登録した投稿も含まれます。異なるサーバーのユーザー間の非公開な返信も失われ、復元することは不可能です。この設定の使用は特別な目的のインスタンスのためのものであり、一般的な目的のサーバーで使用した場合、多くのユーザーの期待を裏切ることになります。 custom_css: ウェブ版のMastodonでカスタムスタイルを適用できます。 @@ -140,6 +140,7 @@ ja: thumbnail: サーバー情報と共に表示される、アスペクト比が約 2:1 の画像。 trendable_by_default: トレンドの審査を省略します。トレンドは掲載後でも個別に除外できます。 trends: トレンドは、サーバー上で人気を集めている投稿、ハッシュタグ、ニュース記事などが表示されます。 + wrapstodon: ローカルユーザーが、1年間のMastodonの利用について楽しい概要を生成する機能です。この機能は、その年に、1つ以上の公開またはひかえめな公開での投稿をして、1つ以上のハッシュタグを使ったユーザーが、毎年12月10日から31日まで利用できます。 form_challenge: current_password: セキュリティ上重要なエリアにアクセスしています imports: @@ -181,7 +182,7 @@ ja: jurisdiction: 運営責任者が居住する国を記載します。企業や他の団体である場合は、その組織の所在国に加えて、市・区・州などの地域を記載します。 min_age: お住まいの国や地域の法律によって定められている最低年齢を下回ってはなりません。 user: - chosen_languages: 選択すると、選択した言語の投稿のみが公開タイムラインに表示されるようになります + chosen_languages: いずれかを選択すると、選択した言語の投稿のみが公開タイムラインに表示されます。この設定はホームタイムラインとリストには影響しません。 role: そのロールは、ユーザーが持つ権限を制御します。 user_role: color: UI 全体でロールの表示に使用される色(16進数RGB形式) @@ -197,11 +198,7 @@ ja: labels: account: attribution_domains: あなたの著者表示を許可するwebサイト - discoverable: アカウントを見つけやすくする fields: - examples: - name_1: 例) GitHub - value_1: 例) https://github.com/xxxxxx name: ラベル value: 内容 indexable: 公開投稿を検索できるようにする @@ -239,7 +236,6 @@ ja: defaults: autofollow: 招待から参加後、あなたをフォロー avatar: アイコン - bot: これはBOTアカウントです chosen_languages: 表示する言語 confirm_new_password: 新しいパスワード(確認用) confirm_password: パスワード(確認用) @@ -253,7 +249,7 @@ ja: email: メールアドレス expires_in: 有効期限 fields: プロフィール補足情報 - group: これはグループアカウントです + filter_action: フィルターの動作 header: ヘッダー honeypot: "%{label} (入力しない)" inbox_url: リレーサーバーの inbox URL @@ -265,7 +261,6 @@ ja: note: プロフィール otp_attempt: 二要素認証コード password: パスワード - person: これは通常のアカウントです phrase: キーワードまたはフレーズ setting_advanced_layout: 上級者向けUIを有効にする setting_aggregate_reblogs: ブーストをまとめる @@ -274,6 +269,7 @@ ja: setting_bio_markdown: プロフィールのMarkdownを有効にする setting_bookmark_category_needed: Webでブックマーク時にカテゴリの選択を必須にする setting_boost_modal: ブーストの公開範囲の設定 + setting_color_scheme: カラースキーム setting_community_timeline_instead_of_search_menu: スマホ使用時の画面下ナビゲーションで、検索の代わりにローカルタイムラインを表示する setting_content_font_size: 投稿本文のフォントサイズ setting_content_font_size_items: @@ -281,6 +277,7 @@ ja: medium: デフォルト x_large: 大きい大きい xx_large: 大きい大きい大きい + setting_contrast: コントラスト setting_custom_css: カスタムCSS setting_default_language: 投稿する言語 setting_default_privacy: 投稿の公開範囲 @@ -431,6 +428,7 @@ ja: trendable_by_default: 審査前のトレンドの掲載を許可する trends: トレンドを有効にする unlocked_friend: 全てのフレンドサーバー申請を自動承認する + wrapstodon: Wrapstodonを有効にする interactions: must_be_follower: フォロワー以外からの通知をブロック must_be_following: フォローしていないユーザーからの通知をブロック @@ -492,7 +490,9 @@ ja: jurisdiction: 裁判管轄 min_age: 登録可能な最低年齢 user: + date_of_birth_1i: 年 date_of_birth_2i: 月 + date_of_birth_3i: 日 role: ロール time_zone: タイムゾーン user_role: diff --git a/config/locales/simple_form.ka.yml b/config/locales/simple_form.ka.yml index d5c65efc1f5e63..66c08d41bf36bf 100644 --- a/config/locales/simple_form.ka.yml +++ b/config/locales/simple_form.ka.yml @@ -17,8 +17,6 @@ ka: data: ცსვ ფაილის ექსპორტი მოხდა მასტოდონის სხვა ინსტანციიდან sessions: otp: 'შეიყვანეთ მეორე ფაქტორის კოდი, რომელიც დააგერირა თქვენმა ტელეფონმა ან მოიხმარეთ შემდეგი აღდგენის კოდებიდან ერთ-ერთი:' - user: - chosen_languages: როდესაც მოინიშნება, ღია თაიმლაინზე გამოჩნდება ტუტები მხოლოდ არჩეულ ენებზე labels: account: fields: diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 0dc638678f6948..9c41da1e0e2093 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -21,9 +21,6 @@ kab: locale: Tutlayt n ugrudem, imaylen d yilɣa yettudemren password: Seqdec ma drus 8 n yisekkilen setting_always_send_emails: S umata, ilɣa s yimayl ur d-ttwaceyyεen ara mi ara tesseqdaceḍ Mastodon s wudem urmid - setting_display_media_default: Ffer imidyaten yettwacreḍ d infariyen - setting_display_media_hide_all: Ffer yal tikkelt akk taywalt - setting_display_media_show_all: Ffer yal tikkelt teywalt yettwacreḍ d tanafrit username: Tzemreḍ ad tesqedceḍ isekkilen, uṭṭunen akked yijerriden n wadda featured_tag: name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :' @@ -96,12 +93,14 @@ kab: phrase: Awal n tsarut neɣ tafyirt setting_advanced_layout: Rmed agrudem n web leqqayen setting_always_send_emails: Dima ttazen-d ilɣa s yimayl + setting_color_scheme: Azenziɣ n yiniten setting_default_language: Tutlayt n usuffeɣ setting_default_quote_policy: Anwa i izemren ad d-yebder 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 + setting_emoji_style: Aɣanib n yimujiten setting_hide_network: Ffer azetta-k·m inmetti setting_theme: Asental n wesmel setting_trends: Sken-d inezzaɣ n wass-a @@ -114,11 +113,15 @@ kab: whole_word: Awal akk featured_tag: name: Ahacṭag + filters: + actions: + hide: Ffer-it akk form_admin_settings: app_icon: Tignit n usnas custom_css: CSS udmawan profile_directory: Rmed akaram n imaγnuten site_contact_email: Imayl n unermas + site_contact_username: Asulay n unermas site_short_description: Aglam n uqeddac site_terms: Tasertit tabaḍnit site_title: Isem n uqeddac @@ -126,6 +129,7 @@ kab: theme: Asentel amezwer thumbnail: Tanfult n uqeddac trends: Rmed inezzaɣ + wrapstodon: Sermed Wrapstodon interactions: must_be_follower: Ssewḥel ilɣa sɣur wid akk d 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 @@ -148,6 +152,8 @@ kab: pending_account: Amiḍan amaynut yesran asenqed reblog: Yella win yesselhan adda-dik·im report: Aneqis amaynut yettwazen + software_updates: + label: Yella lqem amaynut n Mastodon rule: hint: Isallen-nniḍen text: Alugen @@ -159,10 +165,13 @@ kab: terms_of_service_generator: domain: Taɣult user: + date_of_birth_1i: Aseggas date_of_birth_2i: Ayyur + date_of_birth_3i: Ass role: Tamlilt time_zone: Tamnaḍt tasragant user_role: + color: Ini n tsakezt name: Isem permissions_as_keys: Tisirag webhook: diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml index ad80ff667cb25d..2a21beefe020b7 100644 --- a/config/locales/simple_form.kk.yml +++ b/config/locales/simple_form.kk.yml @@ -1,10 +1,6 @@ --- kk: simple_form: - hints: - defaults: - setting_display_media_hide_all: Always hide all media - setting_display_media_show_all: Always show media marked as sensitive labels: account: fields: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 76a7deae73cbac..84bed22cbac1d6 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -4,7 +4,6 @@ ko: hints: account: attribution_domains: 한 줄에 하나씩. 가짜 기여로부터 보호합니다. - discoverable: 내 공개 게시물과 프로필이 마스토돈의 다양한 추천 기능에 나타날 수 있고 프로필이 다른 사용자에게 제안될 수 있습니다 display_name: 진짜 이름 또는 재미난 이름. fields: 홈페이지, 호칭, 나이, 뭐든지 적고 싶은 것들. indexable: 내 공개 게시물이 마스토돈의 검색 결과에 나타날 수 있습니다. 내 게시물과 상호작용했던 사람들은 이 설정과 관계 없이 그 게시물을 검색할 수 있습니다. @@ -61,9 +60,6 @@ ko: setting_default_quote_policy_private: 마스토돈에서 작성된 팔로워 전용 게시물은 다른 사용자가 인용할 수 없습니다. setting_default_quote_policy_unlisted: 사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다. setting_default_sensitive: 민감한 미디어는 기본적으로 가려져 있으며 클릭해서 볼 수 있습니다 - setting_display_media_default: 민감함으로 표시된 미디어 가리기 - setting_display_media_hide_all: 모든 미디어를 가리기 - setting_display_media_show_all: 모든 미디어를 보이기 setting_emoji_style: 에모지 표현 방식. "자동"은 시스템 기본 에모지를 적용하고 그렇지 못하는 오래된 브라우저의 경우 트웨모지를 사용합니다. setting_quick_boosting_html: 활성화하면 %{boost_icon}부스트 아이콘을 클릭했을 때 부스트/인용 드롭다운 메뉴가 뜨지 않고 바로 부스트하게 됩니다. 인용은 %{options_icon} (옵션) 메뉴 안으로 이동합니다. setting_system_scrollbars_ui: 사파리와 크롬 기반의 데스크탑 브라우저만 적용됩니다 @@ -150,7 +146,6 @@ ko: jurisdiction: 요금을 지불하는 사람이 거주하는 국가를 기재하세요. 회사나 기타 법인인 경우 해당 법인이 설립된 국가와 도시, 지역, 영토 또는 주를 적절히 기재하세요. min_age: 관할지역의 법률에서 요구하는 최저 연령보다 작으면 안 됩니다. user: - chosen_languages: 체크하면, 선택 된 언어로 작성된 게시물들만 공개 타임라인에 보여집니다 date_of_birth: other: "%{domain}을 이용하려면 %{count}세 이상임을 확인해야 합니다. 이 정보는 저장되지 않습니다." role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다. @@ -170,7 +165,6 @@ ko: labels: account: attribution_domains: 나를 기여자로 올릴 수 있도록 허용된 웹사이트들 - discoverable: 발견하기 알고리즘에 프로필과 게시물을 추천하기 fields: name: 라벨 value: 내용 diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml index a2f7b2b9b12a6b..209e14fe785eb4 100644 --- a/config/locales/simple_form.ku.yml +++ b/config/locales/simple_form.ku.yml @@ -46,9 +46,6 @@ ku: setting_aggregate_reblogs: Bilindkirinên ku nû hatine weşan ji şandiyên di dema dawî de nîşan nede (tenê li ser bilindkirinên nû wergirtî bandor dike) setting_always_send_emails: Dema ku tu Mastodon bi rengek çalak bi kar tînî, bi gelemperî agahdariya e-nameyê nayê şandin setting_default_sensitive: Medyaya hestiyar berdestî ve tê veşartin û bi tikandin dikare were eşkere kirin - setting_display_media_default: Medyaya wekî hestyarî hatiye nîşankirî ye veşêre - setting_display_media_hide_all: Medyayê tim veşêre - setting_display_media_show_all: Medyayê tim nîşan bike setting_use_blurhash: Gradyen xwe bi rengên dîtbarîyên veşartî ve radigire, lê belê hûrgilîyan diveşêre setting_use_pending_items: Li şûna ku herkê wek bixweber bizivirînî nûvekirina demnameyê li paş tikandinekî veşêre whole_word: Dema peyvkilîd an jî hevok bi tenê alfahejmarî çêbe, bi tenê hemû bêjeyê re li hev bike wê pêk bê @@ -101,8 +98,6 @@ ku: webauthn: Ku kilîta USB be, jê ewle be ku wê têxî û ku pêdivî be, pê li wê bike. tag: name: Tu dikarî tenê mezinahiya tîpan biguherînî bo mînak, da ku ew bêtir were xwendin - user: - chosen_languages: Dema were nîşankirin, tenê parvekirinên bi zimanên hilbijartî dê di rêzikên giştî de werin nîşandan user_role: color: Renga ku were bikaranîn ji bo rola li seranserê navrûya bikarhêneriyê, wekî RGB di forma hex highlighted: Ev rola xwe ji raya giştî re xuya dike diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index b1d0a3e2562149..89b572c1300606 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -3,7 +3,6 @@ lad: simple_form: hints: account: - discoverable: Tus publikasyones publikas i profil pueden ser avaliadas o rekomendadas en varias partes de Mastodon i tu profil puede ser sujerido a otros utilizadores. display_name: Tu nombre para amostrar. fields: Tu deskripsyon, pronombres, edad, todo lo ke keras. indexable: Tus publikasyones publikas pueden apareser en rezultados de bushkeda en Mastodon. Personas ke enteraktuaron kon tus publikasyones syempre pueden bushkarlas inkluzo si trokes esta preferensya. @@ -56,9 +55,6 @@ lad: setting_aggregate_reblogs: No amostra muevas repartajasyones para las publikasyones ke an sido resientemente repartajadas (solo afekta a las repartajasyones risividas resientemente) setting_always_send_emails: Normalmente los avizos por posta elektronika no se embiaran kuando estes uzando Mastodon aktivamente setting_default_sensitive: Tu muevo kontenido multimedia esta eskondido i puede ser amostrado kon un klik - setting_display_media_default: Eskonde kontenido multimedia markado komo sensivle - setting_display_media_hide_all: Siempre eskonde todo el kontenido multimedia - setting_display_media_show_all: Amostra siempre el kontenido de multimedia setting_use_blurhash: Los gradientes se bazan en los kolores de las imajes eskondidas pero faziendo velados los peratim setting_use_pending_items: Eskonde muevas publikasyones detras de un klik en lugar de desplazar otomatikamente la linya username: Solo puedes uzar letras, shifras i sulinyados @@ -120,7 +116,6 @@ lad: tag: name: Solo se puede trokar la kapitalizasyon de las letras, por enshemplo, para ke sea mas meldable user: - chosen_languages: Kuando se marka, solo se amostraran las publikasyones en las linguas eskojidas en las linyas de tiempo publikas role: El rolo kontrola kualos permisos tiene el utilizador. user_role: color: Color ke se utilizara para el rolo a lo largo de la enterfaz de utilizador, komo RGB en formato heksadesimal @@ -134,7 +129,6 @@ lad: url: Ande los evenimientos seran embiados labels: account: - discoverable: Avalia profil i publikasyones en algoritmos de deskuvrimyento fields: name: Etiketa value: Kontenido diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index ade16bfa011f3b..a027191c3f9a4e 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -4,7 +4,6 @@ lt: hints: account: attribution_domains: Po vieną eilutėje. Apsaugo nuo klaidingų atributų. - discoverable: Tavo vieši įrašai ir profilis gali būti rodomi arba rekomenduojami įvairiose Mastodon vietose, o profilis gali būti siūlomas kitiems naudotojams. display_name: Tavo pilnas vardas arba smagus vardas. fields: Tavo pagrindinis puslapis, įvardžiai, amžius, bet kas, ko tik nori. indexable: Tavo vieši įrašai gali būti rodomi Mastodon paieškos rezultatuose. Žmonės, kurie bendravo su tavo įrašais, gali jų ieškoti nepriklausomai nuo to. @@ -61,9 +60,6 @@ lt: setting_default_quote_policy_private: Tik sekėjams skirti įrašai, paskelbti platformoje „Mastodon“, negali būti cituojami kitų. setting_default_quote_policy_unlisted: Kai žmonės jus cituos, jų įrašai taip pat bus paslėpti iš populiariausių naujienų srauto. setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista spustelėjus. - setting_display_media_default: Slėpti mediją, pažymėtą kaip jautrią - setting_display_media_hide_all: Visada slėpti mediją - setting_display_media_show_all: Visada rodyti mediją setting_emoji_style: Kaip rodyti emodžius. „Auto“ bandys naudoti vietinius jaustukus, bet senesnėse naršyklėse grįš prie Tvejaustukų. setting_quick_boosting_html: Kai ši funkcija įjungta, paspaudus ant %{boost_icon} Paryškinimo piktogramos, įrašas bus iškart paryškintas, o ne atidarytas išskleidžiamasis meniu „paryškinti/cituoti“. Citavimo veiksmas perkeliamas į %{options_icon} meniu. setting_system_scrollbars_ui: Taikoma tik darbalaukio naršyklėms, karkasiniais „Safari“ ir „Chrome“. @@ -126,7 +122,6 @@ lt: jurisdiction: Nurodykite šalį, kurioje gyvena tas, kas apmoka sąskaitas. Jei tai bendrovė ar kita esybė, nurodykite šalį, kurioje jis įregistruotas, ir atitinkamai miestą, regioną, teritoriją ar valstiją. min_age: Neturėtų būti žemiau mažiausio amžiaus, reikalaujamo pagal jūsų jurisdikcijos įstatymus. user: - chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis. date_of_birth: few: Turime įsitikinti, kad esate bent %{count} norint naudotis %{domain}. Mes to neišsaugosime. many: Turime įsitikinti, kad esate bent %{count} norint naudotis %{domain}. Mes to neišsaugosime. @@ -136,7 +131,6 @@ lt: labels: account: attribution_domains: Svetainės, kuriuose leidžiama jus įvardyti - discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus indexable: Įtraukti viešus įrašus į paieškos rezultatus show_collections: Rodyti sekimus ir sekėjus profilyje unlocked: Automatiškai priimti naujus sekėjus diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 00c8e57c502c4d..96a5b9344acc2f 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -4,7 +4,6 @@ lv: hints: account: attribution_domains: Viens katrā līnijā. Aizsargā no nepatiesa attiecinājuma. - discoverable: Tavas publiskās ziņas un profils var tikt piedāvāti vai ieteikti dažādās Mastodon vietās, un tavs profils var tikt ieteikts citiem lietotājiem. display_name: Tavs pilnais vārds vai tavs joku vārds. fields: Tava mājas lapa, vietniekvārdi, vecums, viss, ko vēlies. indexable: Tavi publiskie ieraksti var tikt parādīti Mastodon meklēšanas iznākumā. Cilvēki, kuri ir mijiedarbojušies ar Taviem ierakstiem, var tos meklēt neatkarīgi no tā. @@ -57,9 +56,6 @@ lv: setting_aggregate_reblogs: Nerādīt jaunus pastiprinājumus ierakstiem, kas nesen tikuši pastiprināti (ietekmēs tikai turpmāk saņemtos pastiprinājumus) setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon setting_default_sensitive: Pēc noklusējuma jūtīgi informācijas nesēji ir paslēpti, un tos var atklāt ar klikšķi - setting_display_media_default: Paslēpt attēlus un video, kas atzīmēti kā jūtīgi - setting_display_media_hide_all: Vienmēr slēpt attēlus un video - setting_display_media_show_all: Vienmēr rādīt attēlus un video setting_system_scrollbars_ui: Attiecas tikai uz darbvirsmas pārlūkiem, kuru pamatā ir Safari vai Chrome setting_use_blurhash: Pāreju pamatā ir paslēpto uzskatāmo līdzekļu krāsas, bet saturs tiek padarīts neskaidrs setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis ar automātisku plūsmas ritināšanu @@ -137,7 +133,6 @@ lv: arbitration_website: Var būt tīmekļa veidlapa vai "N/A", ja tiek izmantots e-pasts. domain: Sniegtā tiešsaistas pakalpojuma neatkārtojama identifikācija. user: - chosen_languages: Ja ieķeksēts, publiskos laika grafikos tiks parādītas tikai ziņas noteiktajās valodās role: Loma nosaka, kādas lietotājam ir atļaujas. user_role: color: Krāsa, kas jāizmanto lomai visā lietotāja saskarnē, kā RGB hex formātā @@ -152,7 +147,6 @@ lv: labels: account: attribution_domains: Tīmekļvietnes, kurām ir tiesības uzskaitīt Tevi - discoverable: Funkcijas profils un ziņas atklāšanas algoritmos fields: name: Marķējums value: Saturs diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index c35989fb815649..01348c762d666c 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -3,7 +3,6 @@ ms: simple_form: hints: account: - discoverable: Siaran awam dan profil anda mungkin dipaparkan atau disyorkan dalam pelbagai kawasan Mastodon dan profil anda mungkin dicadangkan kepada pengguna lain. display_name: Nama penuh anda atau nama anda yang menyeronokkan. fields: Halaman utama anda, kata ganti nama, umur, apa sahaja yang anda mahukan. indexable: Kiriman awam anda mungkin muncul dalam hasil carian di Mastodon. Orang yang telah berinteraksi dengan kiriman anda mungkin boleh mencarinya. @@ -53,9 +52,6 @@ ms: setting_aggregate_reblogs: Jangan tunjukkan rangsangan baharu untuk siaran yang telah dirangsang baru-baru ini (hanya menjejaskan rangsangan yang baru diterima) setting_always_send_emails: Biasanya pemberitahuan e-mel tidak akan dihantar apabila anda selalu menggunakan Mastodon setting_default_sensitive: Media sensitif disembunyikan secara lalai dan boleh didedahkan dengan satu klik - setting_display_media_default: Sembunyikan media yang ditanda sebagai sensitif - setting_display_media_hide_all: Sentiasa sembunyikan media - setting_display_media_show_all: Sentiasa paparkan media setting_use_blurhash: Kecerunan adalah berdasarkan warna visual tersembunyi tetapi mengelirukan sebarang butiran setting_use_pending_items: Sembunyikan kemas kini garis masa di belakang satu klik dan bukannya menatal suapan secara automatik username: Anda boleh menggunakan huruf, nombor dan garis bawah @@ -118,8 +114,6 @@ ms: name: Anda hanya boleh menukar selongsong huruf, sebagai contoh, untuk menjadikannya lebih mudah dibaca terms_of_service_generator: choice_of_law: City, region, territory or state the internal substantive laws of which shall govern any and all claims. - user: - chosen_languages: Apabila disemak, hanya siaran dalam bahasa terpilih akan dipaparkan dalam garis masa awam user_role: color: Warna yang akan digunakan untuk peranan ini dalam seluruh UI, sebagai RGB dalam format hex highlighted: Ini menjadikan peranan ini dipaparkan secara umum @@ -132,7 +126,6 @@ ms: url: Di mana acara akan dihantar labels: account: - discoverable: Ciri profil dan siaran dalam algoritma penemuan fields: name: Label value: Kandungan diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 0dd04a92183e27..ee22626349e2cd 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -3,7 +3,6 @@ my: simple_form: hints: account: - discoverable: သင်၏ အများမြင် ပို့စ်များနှင့် ပရိုဖိုင်များကို Mastodon ၏ နယ်ပယ်အသီးသီးတွင် ဖော်ပြခြင်း သို့မဟုတ် အကြံပြုနိုင်ပြီး သင့်ပရိုဖိုင်ကို အခြားအသုံးပြုသူများအား အကြံပြုနိုင်ပါသည်။ display_name: သင့်အမည်အပြည့်အစုံ သို့မဟုတ် သင့်အမည်ပြောင်။ fields: သင့် ပင်မစာမျက်နှာ၊ နာမ်စား၊ အသက်၊ သင်လိုချင်သည့်အရာ။ indexable: သင်၏ အများမြင်ပို့စ်များသည် Mastodon ရှိ ရှာဖွေမှုရလဒ်များတွင် ပေါ်လာနိုင်သည်။ သင့်ပို့စ်များမှတစ်ဆင့် အပြန်အလှန်တုံ့ပြန်ပြီး ရှာဖွေနိုင်ပါမည်။ @@ -53,9 +52,6 @@ my: setting_aggregate_reblogs: မကြာသေးခင်က Boost လုပ်ထားသောပို့စ်များအတွက် Boost အသစ်များကို မပြပါနှင့် (အသစ်ရရှိထားသော Boost များကိုသာ ပြသပါရန်) setting_always_send_emails: Mastodon ကို လက်ရှိအသုံးပြုနေချိန်တွင် ပုံမှန်အားဖြင့် အီးမေးလ်အသိပေးချက်များကို ပေးပို့မည်မဟုတ်ပါ setting_default_sensitive: သတိထားရသောမီဒီယာကို မူလအားဖြင့် ဖျောက်ထားနိုင်ပြီး ကလစ်တစ်ချက်နှိပ်ရုံဖြင့် ပြန်လည်ဖော်ပြနိုင်သည် - setting_display_media_default: သတိထားရသောမီဒီယာအဖြစ် သတ်မှတ်ထားမှုအား ဖျောက်ပါ - setting_display_media_hide_all: မီဒီယာကို အမြဲတမ်းဖျောက်ထားပါ - setting_display_media_show_all: မီဒီယာကို အမြဲတမ်းပြပါ setting_use_blurhash: Gradients မှာ ဖျောက်ထားသောရုပ်ပုံများ၏ အရောင်များကိုအခြေခံသော်လည်း မည်သည့်အသေးစိတ်အချက်အလက်ကိုမဆို ရှုပ်ထွေးစေနိုင်ပါသည်။ setting_use_pending_items: အပေါ်အောက်လှိမ့်မည့်အစား ကလစ်တစ်ခုနောက်တွင် စာမျက်နှာအပ်ဒိတ်များကို ဖျောက်ထားပါ။ username: အက္ခရာများ၊ နံပါတ်များနှင့် underscore များကို အသုံးပြုနိုင်သည် @@ -115,8 +111,6 @@ my: show_application: မည်သည့်အက်ပ်က သင့်ပို့စ်ကို တင်ထားကြောင်း သင်အမြဲမြင်နိုင်မည်ဖြစ်သည်။ tag: name: ဥပမာအားဖြင့် စာလုံးများကို ပိုမိုဖတ်ရှုနိုင်စေရန်မှာ သင်သာ ပြောင်းလဲနိုင်သည်။ - user: - chosen_languages: အမှန်ခြစ် ရွေးချယ်ထားသော ဘာသာစကားများဖြင့်သာ ပို့စ်များကို အများမြင်စာမျက်နှာတွင် ပြသပါမည် user_role: color: hex ပုံစံ RGB အဖြစ် UI တစ်လျှောက်လုံး အခန်းကဏ္ဍအတွက် အသုံးပြုရမည့်အရောင် highlighted: ယင်းက အခန်းကဏ္ဍကို အများမြင်အောင် ဖွင့်ပေးထားသည်။ @@ -129,7 +123,6 @@ my: url: အကြောင်းအရာများကို ဘယ်ကို ပို့မလဲ။ labels: account: - discoverable: ရှာဖွေမှု အယ်လ်ဂိုရီသမ်များတွင် ဖော်ပြပါ ပရိုဖိုင်နှင့် ပို့စ်များ fields: name: အညွှန်း value: အကြောင်းအရာ diff --git a/config/locales/simple_form.nan-TW.yml b/config/locales/simple_form.nan-TW.yml index 84b955ddb0abb5..d7b4487f03bf50 100644 --- a/config/locales/simple_form.nan-TW.yml +++ b/config/locales/simple_form.nan-TW.yml @@ -7,8 +7,6 @@ nan-TW: fields: Lí ê頭頁、代名詞、年歲,kap其他beh分享ê。 defaults: password: 用 8 ê字元以上 - setting_display_media_hide_all: 一直khàm掉媒體 - setting_display_media_show_all: 一直展示媒體 labels: terms_of_service: changelog: Siánn物有改? diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index bdf627973a724d..85b9f9d79598b7 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -4,7 +4,7 @@ nl: hints: account: attribution_domains: Eén per regel. Beschermt tegen ongeldige attributies. - discoverable: Jouw openbare berichten kunnen worden uitgelicht op verschillende plekken binnen Mastodon en jouw account kan worden aanbevolen aan andere gebruikers. + discoverable: Je kunt worden uitgelicht in verzamelingen die zijn aangemaakt door andere gebruikers. Jij en jouw openbare berichten kunnen ook worden aanbevolen aan gebruikers op verschillende plekken binnen Mastodon. display_name: Jouw volledige naam of een leuke bijnaam. fields: Jouw website, persoonlijke voornaamwoorden, leeftijd, alles wat je maar kwijt wilt. indexable: Jouw openbare berichten kunnen in de zoekresultaten op Mastodon verschijnen. Mensen die op jouw berichten hebben gereageerd kunnen ze sowieso doorzoeken. @@ -61,9 +61,9 @@ nl: setting_default_quote_policy_private: Berichten aan alleen volgers afkomstig van Mastodon kunnen niet door anderen worden geciteerd. setting_default_quote_policy_unlisted: Wanneer mensen jou citeren, verschijnt hun bericht ook niet onder trends. setting_default_sensitive: Gevoelige media wordt standaard verborgen en kan met één klik worden getoond - setting_display_media_default: Als gevoelig gemarkeerde media verbergen - setting_display_media_hide_all: Media altijd verbergen - setting_display_media_show_all: Media altijd tonen + setting_display_media_default: Geef een waarschuwing bij het tonen van als gevoelig gemarkeerde media + setting_display_media_hide_all: Geef een waarschuwing bij het tonen van alle media + setting_display_media_show_all: Geef geen waarschuwing bij het tonen van alle media, inclusief als gevoelig gemarkeerde media setting_emoji_style: Waarmee moeten emojis worden weergegeven. ‘Auto’ probeert de systeemeigen emojis te gebruiken, maar valt terug op Twemoji voor oudere webbrowsers. setting_quick_boosting_html: Wanneer dit is ingeschakeld, boost je in één keer wanneer je op het %{boost_icon} boostpictogram klikt en verplaatst de citeeroptie zich naar het %{options_icon} optiemenu. Wanneer dit is uitgeschakeld krijg je gelijk de mogelijkheid om te boosten of te citeren. setting_system_scrollbars_ui: Alleen van toepassing op desktopbrowsers gebaseerd op Safari en Chrome @@ -109,6 +109,7 @@ nl: status_page_url: URL van een pagina waar mensen de status van deze server kunnen zien tijdens een storing theme: Thema die (niet ingelogde) bezoekers en nieuwe gebruikers zien. thumbnail: Een afbeelding van ongeveer een verhouding van 2:1 die naast jouw serverinformatie wordt getoond. + thumbnail_description: Een omschrijving van de afbeelding om mensen met een visuele beperking te helpen de inhoud ervan te begrijpen. trendable_by_default: Handmatige beoordeling van trends overslaan. Individuele items kunnen later alsnog worden afgekeurd. trends: Trends laten zien welke berichten, hashtags en nieuwsberichten op jouw server aan populariteit winnen. wrapstodon: Lokale gebruikers de mogelijkheid geven om een speelse samenvatting van hun Mastodon-gebruik over het afgelopen jaar aan te maken. Deze functie is elk jaar beschikbaar tussen 10 en 31 december, en wordt aangeboden aan gebruikers die tijdens het afgelopen jaar ten minste één openbaar of minder openbaar bericht hebben geplaatst en ten minste één hashtag hebben gebruikt. @@ -134,6 +135,7 @@ nl: otp: 'Voer de tweestaps-toegangscode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:' webauthn: Wanneer het een USB-sleutel is, zorg er dan voor dat je deze in de computer steekt en, wanneer nodig, activeert. settings: + email_subscriptions: Het uitschakelen behoudt bestaande abonnees, maar stopt met het verzenden van e-mails. indexable: Jouw profielpagina kan in de zoekresultaten van Google, Bing, DuckDuckGo en andere zoekmachines verschijnen. show_application: Je kunt zelf altijd zien met welke app je een bericht hebt geplaatst. tag: @@ -153,12 +155,13 @@ nl: jurisdiction: Vermeld het land waar de persoon woont die de rekeningen betaalt. Is het een bedrijf of iets dergelijks, vermeld dan het land waar het ingeschreven staat en de stad, de regio, het grondgebied of de staat, voor zover van toepassing. min_age: Mag niet lager zijn dan de minimale vereiste leeftijd volgens de wetten van jouw jurisdictie. user: - chosen_languages: Alleen berichten in de aangevinkte talen worden op de openbare tijdlijnen getoond + chosen_languages: Indien aangevinkt, worden alleen berichten in geselecteerde talen weergegeven in openbare tijdlijnen. Deze instelling heeft geen invloed op je starttijdlijn en lijsten. date_of_birth: one: We moeten er zeker van zijn dat je tenminste %{count} bent om %{domain} te mogen gebruiken. Deze informatie wordt niet door ons opgeslagen. other: We moeten er zeker van zijn dat je tenminste %{count} bent om %{domain} te mogen gebruiken. Deze informatie wordt niet door ons opgeslagen. role: De rol bepaalt welke rechten de gebruiker heeft. user_role: + collection_limit: Beperkt het aantal verzamelingen dat een gebruiker met deze rol kan aanmaken. Houd er rekening mee dat wanneer je dit aantal verlaagt, gebruikers die al over deze limiet zijn geen Verzamelingen zullen verliezen. Zij zullen echter niet in staat zijn om er nog meer aan te maken. color: Kleur die gebruikt wordt voor de rol in de UI, als RGB in hexadecimale formaat highlighted: Dit maakt de rol openbaar zichtbaar name: Openbare naam van de rol, wanneer de rol als badge op profielpagina's wordt getoond @@ -176,7 +179,7 @@ nl: labels: account: attribution_domains: Websites die jou credit mogen geven - discoverable: Jouw account en berichten laten uitlichten door Mastodon + discoverable: Mij door Mastodon laten uitlichten fields: name: Label value: Inhoud @@ -315,6 +318,7 @@ nl: status_page_url: URL van statuspagina theme: Standaardthema thumbnail: Server-miniatuur + thumbnail_description: Alt-tekst thumbnail trendable_by_default: Trends goedkeuren zonder voorafgaande beoordeling trends: Trends inschakelen wrapstodon: Wrapstodon inschakelen @@ -356,6 +360,7 @@ nl: hint: Aanvullende informatie text: Regel settings: + email_subscriptions: Berichten per e-mail inschakelen indexable: Zoekmachines jouw profielpagina laten vinden show_application: App tonen die je voor het plaatsen van berichten gebruikt tag: @@ -384,6 +389,7 @@ nl: role: Rol time_zone: Tijdzone user_role: + collection_limit: Maximum aantal verzamelingen per gebruiker color: Kleur van badge highlighted: Rol als badge op profielpagina's tonen name: Naam diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index f30f0b6cc1ec52..5bcb37107a5d88 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -4,7 +4,6 @@ nn: hints: account: attribution_domains: Ein per line. Vernar mot falske krediteringar. - discoverable: Dei offentlege innlegga dine og profilen din kan dukka opp i tilrådingar på ulike stader på Mastodon, og profilen din kan bli føreslegen for andre folk. display_name: Ditt fulle namn eller ditt tøysenamn. fields: Heimesida di, pronomen, alder, eller kva du måtte ynskje. indexable: Dei offentlege innlegga dine kan dukka opp i søkjeresultat på Mastodon. Folk som har reagert på oinnlegga dine kan uansett søkja gjennom dei. @@ -61,9 +60,6 @@ nn: setting_default_quote_policy_private: Innlegg som er skrivne på Mastodon og berre for fylgjarar kan ikkje siterast av andre. setting_default_quote_policy_unlisted: Når folk siterer deg, vil innlegget deira ikkje syna på populære tidsliner. setting_default_sensitive: Sensitive media vert gøymde som standard, og du syner dei ved å klikka på dei - setting_display_media_default: Gøym media som er merka som sensitive - setting_display_media_hide_all: Alltid skjul alt media - setting_display_media_show_all: Vis alltid media setting_emoji_style: Korleis du skal visa smilefjes. «Auto» prøver å visa innebygde smilefjes, men bruker Twemoji som reserveløysing for eldre nettlesarar. setting_quick_boosting_html: Når dette er skrudd på og du klikkar på %{boost_icon} framhev-ikonet, vil du framheva innlegget med ein gong i staden for å opna framhev/siter-menyen. Du finn siteringa i %{options_icon} (Val)-menyen. setting_system_scrollbars_ui: Gjeld berre skrivebordsnettlesarar som er bygde på Safari og Chrome @@ -134,6 +130,7 @@ nn: otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder. webauthn: Om det er ein USB-nøkkel må du setja han inn og om nødvendig trykkja på han. settings: + email_subscriptions: Viss du skrir av, vil du ha abonnentane du har no, men dei får ikkje fleire epostar. indexable: Profilsida di kan dukka opp søkjeresultat frå Google, Bing, Duckduckgo og andre. show_application: Du vil uansett alltid kunna sjå kva app som la ut innlegga dine. tag: @@ -153,7 +150,7 @@ nn: jurisdiction: Skriv kva land den som betaler rekningane bur i. Viss det er eit firma eller ein annan organisasjon, skriv du landet der organisasjonen held til, samt adressa som trengst. min_age: Skal ikkje vere under minstealder som krevst av lover i jurisdiksjonen din. user: - chosen_languages: Når merka vil berre tuta på dei valde språka synast på offentlege tidsliner + chosen_languages: Viss du vel dette, vil du berre sjå innlegg på dei valde språka på offentlege tidsliner. Denne innstillinga påverkar ikkje heimetidslina eller listene dine. date_of_birth: one: Me må sikra oss at du er minst %{count} for å bruka %{domain}. Me lagrar ikkje dette. other: Me må sikra oss at du er minst %{count} for å bruka %{domain}. Me lagrar ikkje dette. @@ -176,7 +173,6 @@ nn: labels: account: attribution_domains: Nettstader som har lov å kreditera deg - discoverable: Ta med profilen og innlegga i oppdagingsalgoritmar fields: name: Merkelapp value: Innhald @@ -356,6 +352,7 @@ nn: hint: Meir informasjon text: Regel settings: + email_subscriptions: Skru på epostregistrering indexable: Ta med profilsida i søkjemotorar show_application: Vis kva app du brukte når du skreiv innlegg tag: diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index 94d8cc2c552720..4b44eec79d2282 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -3,7 +3,6 @@ simple_form: hints: account: - discoverable: Dine offentlige innlegg og profil kan bli omtalt eller anbefalt i ulike deler av Mastodon, og profilen din kan foreslås til andre brukere. display_name: Ditt fulle navn eller ditt morsomme navn. fields: Din hjemmeside, uttalelse, alder, eller alt annet du vil. indexable: Dine offentlige innlegg kan vises i søkeresultat på Mastodon. Personer som har samhandlet med innleggene dine kan finne de uansett. @@ -55,9 +54,6 @@ setting_aggregate_reblogs: Ikke vis nye fremhevinger for innlegg som nylig har blitt fremhevet (påvirker kun nylige fremhevinger) setting_always_send_emails: E-postvarsler sendes normalt sett ikke mens du aktivt bruker Mastodon setting_default_sensitive: Følsomme media blir i utgangspunktet skjult, og kan vises frem ved hjelp av et klikk - setting_display_media_default: Skjul media som er merket som følsomt - setting_display_media_hide_all: Skjul alltid all media - setting_display_media_show_all: Alltid vis media som er merket som sensitivt setting_use_blurhash: Gradientene er basert på fargene til de skjulte visualitetene, men gjør alle detaljer uklare setting_use_pending_items: Skjul tidslinjeoppdateringer bak et klikk, i stedet for å automatisk la strømmen skrolle username: Du kan bruke bokstaver, tall og understrekingstegn @@ -117,8 +113,6 @@ show_application: Du vil uansett kunne se hvilken app publiserte ditt innlegg. tag: name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart - user: - chosen_languages: Hvis noen av dem er valgt, vil kun innlegg i de valgte språkene bli vist i de offentlige tidslinjene user_role: color: Farge som skal brukes for rollen gjennom hele UI, som RGB i hex-format highlighted: Dette gjør rollen offentlig synlig @@ -131,7 +125,6 @@ url: Hvor hendelser vil bli sendt til labels: account: - discoverable: Anbefal profil og innlegg i Mastodons algoritmer fields: name: Etikett value: Innhold diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index bf6ff95c76e5e6..70ef164186a8b1 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -40,9 +40,6 @@ oc: setting_aggregate_reblogs: Mostrar pas los nòus partatges que son estats partejats recentament (afecta pas que los nòus partatges recebuts) setting_always_send_emails: Normalament enviam pas los corrièls de notificacion se sètz a utilizar Mastodon activament setting_default_sensitive: Los mèdias sensibles son resconduts per defaut e se revelhan amb un clic - setting_display_media_default: Rescondre los mèdias marcats coma sensibles - setting_display_media_hide_all: Totjorn rescondre los mèdias - setting_display_media_show_all: Totjorn mostrar los mèdias marcats coma sensibles setting_use_blurhash: Los degradats venon de las colors de l’imatge rescondut en enfoscar los detalhs setting_use_pending_items: Rescondre las actualizacions del flux d’actualitat aprèp un clic allòc de desfilar lo flux automaticament whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt @@ -69,8 +66,6 @@ oc: webauthn: S’es una clau USB asseguratz-vos de l’inserir, e se cal de la picanhejar. tag: name: Podètz pas que cambiar la talha de las letras, per exemple, per que sián de melhor legir - user: - chosen_languages: Quand seleccionadas, solament los tuts dins las lengas triadas seràn mostrats dins vòstre flux d’actualitat labels: account: fields: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 859fed1f39a600..1db5bdfaf11e7e 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -4,7 +4,6 @@ pl: hints: account: attribution_domains: Jedna na linię. - discoverable: Twój profil i publiczne wpisy mogą być promowane lub polecane na Mastodonie i twój profil może być sugerowany innym użytkownikom. display_name: Twoje imię lub pseudonim. fields: Co ci się tylko podoba – twoja strona domowa, zaimki, wiek… indexable: Twoje publiczne wpisy mogą pojawiać się w wynikach wyszukiwania w Mastodonie. Użytkownicy, którzy reagowali na Twoje wpisy, będą mogli je znaleźć niezależnie od tego ustawienia. @@ -61,9 +60,6 @@ pl: setting_default_quote_policy_private: Wpisy publikowane na Mastodonie wyłącznie dla obserwujących nie mogą być cytowane przez inne osoby. setting_default_quote_policy_unlisted: Kiedy ktoś cytuje twoje wpisy, będą one również ukryte na popularnych osiach czasu. setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem - setting_display_media_default: Ukrywaj zawartość multimedialną oznaczoną jako wrażliwa - setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną - setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek. setting_quick_boosting_html: Po włączeniu tej opcji kliknięcie ikonki %{boost_icon} spowoduje natychmiastowe podbicie zamiast otwarcia menu rozwijanego z opcją podbicia lub cytatu. Przenosi to akcję cytowania do menu %{options_icon} (Opcje). setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome @@ -149,7 +145,6 @@ pl: jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. min_age: Nie powinien być niższy niż minimalny wiek wymagany przez prawo twojego państwa. user: - chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu date_of_birth: few: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. many: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. @@ -173,7 +168,6 @@ pl: labels: account: attribution_domains: Strony które mogą ci przypisywać autorstwo - discoverable: Udostępniaj profil i wpisy funkcjom odkrywania fields: name: Nazwa value: Zawartość diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 847e5f44a1e63e..d390c262d7ed96 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -4,7 +4,7 @@ pt-BR: hints: account: attribution_domains: Um por linha. Protege contra atribuições falsas. - discoverable: Suas publicações e perfil públicos podem ser destaques ou recomendados em várias áreas de Mastodon, e seu perfil pode ser sugerido a outros usuários. + discoverable: Você pode aparecer em coleções criadas por outros usuários. Você e suas publicações abertas podem também ser sugeridas a outros usuários em outras experiências de descoberta no Mastodon. display_name: Seu nome completo ou apelido. fields: Sua página inicial, pronomes, idade ou qualquer coisa que quiser. indexable: Suas publicações abertas podem aparecer nos resultados da busca em Mastodon. As pessoas que interagiram com suas publicações podem conseguir pesquisá-las independentemente disso. @@ -61,9 +61,9 @@ pt-BR: setting_default_quote_policy_private: Publicações exclusivas de seguidores criadas no Mastodon não podem ser citadas por outras pessoas. setting_default_quote_policy_unlisted: Quando as pessoas citarem você, suas publicações também ficarão ocultas da linha do tempo. setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique - setting_display_media_default: Sempre ocultar mídia sensível - setting_display_media_hide_all: Sempre ocultar todas as mídias - setting_display_media_show_all: Sempre mostrar mídia sensível + setting_display_media_default: Avisar antes de mostrar mídias marcadas como conteúdo sensível + setting_display_media_hide_all: Avisar antes de mostrar todas as mídias + setting_display_media_show_all: Mostre todas as mídias sem aviso, incluindo mídias marcadas como conteúdo sensível setting_emoji_style: Como exibir emojis. "Automáticos" tentará usar emojis nativos, mas voltará para o Twemoji para navegadores legados. setting_quick_boosting_html: Quando ativado, clicar no ícone de impulsionamento %{boost_icon} impulsionará imediatamente o texto, em vez de abrir o menu suspenso de impulsionamento/citação. Move a ação de citação para o menu %{options_icon} (Opções). setting_system_scrollbars_ui: Se aplica apenas para navegadores de computador baseado no Safari e Chrome @@ -109,6 +109,7 @@ pt-BR: status_page_url: URL de uma página onde as pessoas podem ver o status deste servidor durante uma interrupção theme: Tema que visitantes e novos usuários veem. thumbnail: Uma imagem de aproximadamente 2:1 exibida ao lado da informação de sua instância. + thumbnail_description: Uma descrição da imagem para auxiliar pessoas com deficiências visuais a entenderem seu conteúdo. trendable_by_default: Pular a revisão manual do conteúdo em tendência. Itens individuais ainda poderão ser removidos das tendências após a sua exibição. trends: Tendências mostram quais publicações, hashtags e notícias estão ganhando destaque na sua instância. wrapstodon: Oferece aos usuários locais gerar um resumo divertido do Mastodon deles durante o ano. Este recurso está disponível entre 10 e 31 de dezembro de cada ano e é oferecido aos usuários que fizeram ao menos uma publicação Pública ou Silenciosa e usou ao menos uma hashtag no ano. @@ -134,6 +135,7 @@ pt-BR: otp: 'Digite o código de dois fatores gerado pelo aplicativo no seu celular ou use um dos códigos de recuperação:' webauthn: Se for uma chave USB tenha certeza de inseri-la e, se necessário, tocar nela. settings: + email_subscriptions: A desativação mantém assinantes existentes, mas para de enviar e-mails. indexable: Sua página de perfil pode aparecer nos resultados de busca no Google, Bing e outros. show_application: Você sempre conseguirá ver qual aplicativo realizou sua publicação independentemente disso. tag: @@ -153,12 +155,13 @@ pt-BR: jurisdiction: Liste o país onde quem paga as contas reside. Se for uma empresa ou outra entidade, liste o país onde ela está incorporada, e a cidade, região, território ou estado, conforme apropriado. min_age: Não deve ter menos que a idade mínima exigida pelas suas leis locais. user: - chosen_languages: Apenas as publicações dos idiomas selecionados serão exibidas nas linhas públicas + chosen_languages: Quando marcada, somente publicações nas linguagens selecionadas serão exibidas nas linhas do tempo públicas. Esta configuração não afeta sua linha do tempo Principal e listas. date_of_birth: one: Precisamos ter certeza de que você tem, no mínimo, %{count} anos para usar o %{domain} Não armazenaremos essa informação. other: Temos que ter certeza de que você é pelo menos %{count} para usar o %{domain} Não vamos armazenar isso. role: A função controla quais permissões o usuário tem. user_role: + collection_limit: Limita o número de Coleções que um único usuário com este cargo pode criar. Note que caso reduza o número, usuários que já estavam no limite permitido não perderão nenhuma de suas Coleções. Mas não conseguirão criar Coleções adicionais. color: Cor a ser usada para o cargo em toda a interface do usuário, como RGB no formato hexadecimal highlighted: Isso torna o cargo publicamente visível name: Nome público do cargo, se ele for definido para ser exibido como um distintivo @@ -176,7 +179,7 @@ pt-BR: labels: account: attribution_domains: Sites autorizados a creditar você. - discoverable: Destacar perfil e publicações nos algoritmos de descoberta + discoverable: Coloque-me em destaque nas experiências de descoberta fields: name: Rótulo value: Conteúdo @@ -315,6 +318,7 @@ pt-BR: status_page_url: Endereço da página de status theme: Tema padrão thumbnail: Miniatura do servidor + thumbnail_description: Texto alternativo da miniatura trendable_by_default: Permitir tendências sem revisão prévia trends: Habilitar tendências wrapstodon: Ativar Wrapstodon @@ -356,6 +360,7 @@ pt-BR: hint: Informações adicionais text: Regra settings: + email_subscriptions: Habilitar cadastro por e-mails indexable: Incluir página de perfil nos motores de busca show_application: Exibir a partir de qual aplicativo você publicou tag: @@ -384,6 +389,7 @@ pt-BR: role: Cargo time_zone: Fuso horário user_role: + collection_limit: Número máximo de Coleções por usuário color: Cor do emblema highlighted: Exibir cargo como distintivo nos perfis de usuários name: Nome diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index bdb754a967db91..d9ea99131fde59 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -4,7 +4,7 @@ pt-PT: hints: account: attribution_domains: Um por linha. Protege contra falsas atribuições. - discoverable: As suas publicações e perfil públicos podem ser destacados ou recomendados em várias áreas do Mastodon e o seu perfil pode ser sugerido a outros utilizadores. + discoverable: Poderá aparecer em coleções criadas por outros utilizadores. Você e as suas publicações públicas também poderão ser sugeridos a utilizadores noutras funcionalidades de descoberta disponíveis no Mastodon. display_name: O seu nome completo ou o seu nome divertido. fields: A sua página inicial, os seus pronomes, idade e tudo o que quiser. indexable: As suas mensagens públicas podem aparecer nos resultados da pesquisa no Mastodon. Independentemente disso, as pessoas que interagiram com as suas publicações podem ser capazes de as pesquisar. @@ -26,7 +26,7 @@ pt-PT: types: disable: Impede o utilizador de usar a sua conta, mas não elimina ou oculta o seu conteúdo. none: Use isto para enviar um aviso ao utilizador, sem espoletar nenhuma outra ação. - sensitive: Forçar todos os anexos multimédia deste utilizador a serem assinalados como sensíveis. + sensitive: Força todos os anexos de media deste utilizador a serem sinalizados como sensíveis. silence: Impede que o utilizador possa publicar com visibilidade pública, ocultando as suas publicações e notificações de pessoas que não o seguem. Encerra todas as denúncias contra esta conta. suspend: Evita qualquer interação de ou para esta conta e elimina o seu conteúdo. Reversível num período de 30 dias. Encerra todas as denúncias contra esta conta. warning_preset_id: Opcional. Tu ainda podes adicionar texto personalizado no fim do predefinido @@ -60,10 +60,10 @@ pt-PT: setting_boost_modal: Quando ativado, ao partilhar abrirá primeiro uma caixa de diálogo de confirmação onde poderá alterar a visibilidade da sua partilha. setting_default_quote_policy_private: As publicações exclusivas para seguidores criadas no Mastodon não podem ser citadas por outras pessoas. setting_default_quote_policy_unlisted: Quando as pessoas o citarem, as respetivas publicações também serão ocultadas dos destaques. - setting_default_sensitive: Os multimédia sensíveis são ocultados por predefinição e podem ser revelados com um clique/toque - setting_display_media_default: Esconder multimédia marcada como sensível - setting_display_media_hide_all: Esconder sempre toda a multimédia - setting_display_media_show_all: Mostrar sempre a multimédia + setting_default_sensitive: Os media sensíveis são ocultados por predefinição e podem ser revelados com um clique + setting_display_media_default: Avisar antes de mostrar media marcada como sensível + setting_display_media_hide_all: Avisar antes de mostrar qualquer media + setting_display_media_show_all: Mostrar toda a media sem aviso, incluindo media marcada como sensível setting_emoji_style: Como apresentar emojis. "Auto" tenta usar emojis nativos, mas reverte para Twemoji em navegadores mais antigos. setting_quick_boosting_html: Quando ativado, clicar no ícone %{boost_icon} Partilhar irá de imediato partilhar ao invés de abrir o menu de Partilhar/Citar. Relocaliza a ação Citar para o menu %{options_icon} (Opções). setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome @@ -81,7 +81,7 @@ pt-PT: filters: action: Escolha que ação executar quando uma publicação corresponder ao filtro actions: - blur: Esconder multimédia com um aviso à frente, sem esconder o texto + blur: Ocultar o conteúdo media por trás de um aviso, sem ocultar o próprio texto hide: Ocultar completamente o conteúdo filtrado, comportando-se como se não existisse warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: @@ -134,6 +134,7 @@ pt-PT: otp: 'Insira o código de autenticação de dois fatores gerado pelo seu telemóvel ou use um dos seus códigos de recuperação:' webauthn: Se for uma chave USB tenha certeza de inseri-la e, se necessário, toque nela. settings: + email_subscriptions: A desativação mantém os subscritores existentes, mas interrompe o envio de e-mails. indexable: A sua página de perfil pode aparecer nos resultados de pesquisa no Google, Bing e outros. show_application: Independentemente disso será sempre capaz de ver em que aplicação publicou a sua mensagem. tag: @@ -153,7 +154,7 @@ pt-PT: jurisdiction: Indique o país de residência de quem paga as contas. Se se tratar de uma empresa ou outra entidade, indique o país onde está constituída, bem como a cidade, região, território ou estado, consoante o caso. min_age: Não deve ter menos do que a idade mínima exigida pela legislação da sua jurisdição. user: - chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos + chosen_languages: Quando esta opção estiver marcada, apenas as publicações nos idiomas selecionados serão exibidas nas cronologias públicas. Esta configuração não afeta a sua cronologia inicial nem as suas listas. date_of_birth: one: Temos de nos certificar que tem pelo menos %{count} para utilizar %{domain}. Não vamos guardar esta informação. other: Temos de nos certificar que tem pelo menos %{count} para utilizar %{domain}. Não vamos guardar esta informação. @@ -176,7 +177,7 @@ pt-PT: labels: account: attribution_domains: Websites autorizados a atribuir-lhe crédito - discoverable: Destacar perfil e publicações nos algoritmos de descoberta + discoverable: Destaque-me nas funcionalidades de descoberta fields: name: Rótulo value: Conteúdo @@ -246,13 +247,13 @@ pt-PT: setting_default_language: Idioma de publicação setting_default_privacy: Visibilidade da publicação setting_default_quote_policy: Quem pode citar - setting_default_sensitive: Marcar sempre os multimédia como sensíveis + setting_default_sensitive: Marcar sempre os media como sensíveis setting_delete_modal: Avisar-me 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 multimédia + setting_display_media: Visualização de media setting_display_media_default: Pré-definição - setting_display_media_hide_all: Esconder todos + setting_display_media_hide_all: Ocultar todos setting_display_media_show_all: Mostrar todos setting_emoji_style: Estilo de emojis setting_expand_spoilers: Expandir sempre as publicações marcadas com avisos de conteúdo @@ -265,7 +266,7 @@ pt-PT: setting_theme: Tema do sítio setting_trends: Mostrar as tendências de hoje setting_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém - setting_use_blurhash: Mostrar gradientes coloridos para multimédias ocultas + setting_use_blurhash: Mostrar gradientes coloridos para medias ocultas setting_use_pending_items: Modo lento severity: Gravidade sign_in_token_attempt: Código de segurança @@ -280,7 +281,7 @@ pt-PT: name: Etiqueta filters: actions: - blur: Esconder multimédia com um aviso + blur: Ocultar media com um aviso hide: Ocultar por completo warn: Ocultar com um aviso form_admin_settings: @@ -356,6 +357,7 @@ pt-PT: hint: Informação Adicional text: Regra settings: + email_subscriptions: Ativar subscrições por e-mail indexable: Incluir página de perfil nos motores de busca show_application: Mostrar de que aplicação criou uma publicação tag: diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 020285edc9b7ea..9aefb0a290f620 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -3,7 +3,6 @@ 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. display_name: Numele dvs. complet sau numele dvs. amuzant. 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. @@ -56,9 +55,6 @@ ro: 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 @@ -125,7 +121,6 @@ ro: tag: name: Poți doar să schimbi caseta literelor, de exemplu, pentru a o face mai lizibilă user: - chosen_languages: Doar postările în limbile selectate vor fi afișate în fluxurile publice role: Rolul controlează ce permisiuni are utilizatorul. user_role: color: Culoare care va fi folosită pentru rol în întreaga interfață, ca RGB în format hexazecimal diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 568a45f16c9afa..656a4bfc208102 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -4,7 +4,6 @@ ru: hints: account: attribution_domains: По одному на строку. Защищает от ложных атрибуций. - discoverable: Отметьте флажок, чтобы ваши публичные посты и ваш профиль могли быть показаны и рекомендованы в различных разделах Mastodon, а ваш профиль мог быть предложен другим пользователям. display_name: Ваше полное имя или псевдоним. fields: Домашняя страница, местоимения, возраст — всё что угодно. indexable: Отметьте флажок, чтобы ваши публичные посты могли быть найдены при помощи поиска в Mastodon. Люди, которые взаимодействовали с вашими постами, смогут их найти вне зависимости от этой настройки. @@ -61,9 +60,6 @@ ru: setting_default_quote_policy_private: Посты, созданные в Mastodon с видимостью только для подписчиков, не могут быть процитированы другими пользователями. setting_default_quote_policy_unlisted: Если кто-нибудь процитирует вас, его пост тоже будет скрыт из алгоритмических лент. setting_default_sensitive: Медиа деликатного характера скрыты по умолчанию и могут быть показаны по нажатию на них - setting_display_media_default: Скрывать медиа деликатного характера - setting_display_media_hide_all: Скрывать все медиа - setting_display_media_show_all: Показывать все медиа setting_emoji_style: Как отображать эмодзи. Если выбран вариант «Автоматически», то будут использованы системные эмодзи, а для устаревших браузеров — Twemoji. setting_quick_boosting_html: Отметьте флажок, чтобы при нажатии на кнопку %{boost_icon} Продвинуть не выбирать между продвижением и цитированием, а сразу продвигать пост. Цитирование будет доступно из меню поста (%{options_icon}). setting_system_scrollbars_ui: Работает только в браузерах для ПК на основе Safari или Chrome @@ -152,7 +148,6 @@ ru: jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо. min_age: Не меньше минимального возраста, требуемого по закону в вашей стране. user: - chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку date_of_birth: few: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные. many: Для регистрации на %{domain} нужно убедиться, что вам не меньше %{count} лет. Мы не храним введённые здесь данные. @@ -172,7 +167,6 @@ ru: labels: account: attribution_domains: Веб-сайты, которым разрешено ссылаться на вас - discoverable: Показывать мой профиль и мои посты в алгоритмических рекомендациях fields: name: Свойство value: Значение @@ -236,6 +230,8 @@ ru: setting_always_send_emails: Всегда отправлять уведомления по электронной почте setting_auto_play_gif: Включить автовоспроизведение анимированных GIF-файлов setting_boost_modal: Настроить видимость перед продвижением + setting_color_scheme: Цветовые тема + setting_contrast: Контрастность setting_default_language: Язык публикуемых постов setting_default_privacy: Видимость поста setting_default_quote_policy: Кто может цитировать вас diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml index 2353766e21dd94..5b01dfe87e0e7a 100644 --- a/config/locales/simple_form.sc.yml +++ b/config/locales/simple_form.sc.yml @@ -41,9 +41,6 @@ sc: scopes: A ite API s'aplicatzione at a pòdere atzèdere. Si seletzionas un'àmbitu de su livellu prus artu, non serbit a nde seletzionare de sìngulos. setting_aggregate_reblogs: No ammustres cumpartziduras noas pro tuts chi sunt istados cumpartzidos dae pagu (tenet efetu isceti pro is cumpartziduras retzidas noas) setting_default_sensitive: Is elementos multimediales sensìbiles benint cuados dae is cunfiguratziones predefinidas e si podent rivelare cun un'incarcu - setting_display_media_default: Cua elementos multimediales marcados comente sensìbiles - setting_display_media_hide_all: Cua semper is elementos multimediales - setting_display_media_show_all: Ammustra semper is elementos multimediales setting_use_blurhash: Is gradientes sunt basados in subra de is colores de is immàgines cuadas ma imbelant totu is detàllios setting_use_pending_items: Cua is atualizatziones in segus de un'incarcu imbetzes de iscùrrere in automàticu su flussu de publicatziones whole_word: Cando sa crae (faeddu o fràsia) siat isceti alfanumèrica, s'at a aplicare isceti si currispondet a su faeddu intreu @@ -74,8 +71,6 @@ sc: webauthn: Si est unu dispositivu USB, assegura·ti de ddu insertare e, si serbit, toca inoghe. tag: name: Podes isceti cambiare sa minùscula/maiùscula de is lìteras, pro esèmpiu, pro fàghere in manera chi siant prus fàtziles de lèghere - user: - chosen_languages: Cando est ativadu, isceti is tuts in is idiomas seberados ant a èssere ammustrados in is lìnias de tempus pùblicas labels: account: fields: diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml index 6b800525c7fd43..a5cb428901abf1 100644 --- a/config/locales/simple_form.sco.yml +++ b/config/locales/simple_form.sco.yml @@ -44,9 +44,6 @@ sco: setting_aggregate_reblogs: Dinnae shaw new heezes fir posts thit haes been juist heezed (ainly affects new-received heezes) setting_always_send_emails: Uisually email notes wullnae get sent whan ye'r uisin Mastodon at the time setting_default_sensitive: Sensitive media is hid bi defaut an kin be revealt wi a chap - setting_display_media_default: Hide media mairked sensitive - setting_display_media_hide_all: Aye hide media - setting_display_media_show_all: Aye shaw media setting_use_blurhash: Gradients is based aff o the colors o the image thit's hid, but ye cannae see onie details setting_use_pending_items: Plank timeline updates ahin a chap insteid o automatic scrowin o the feed whole_word: Whan the keywird or phrase is alphanumeric ainly, it wull ainly get applied if it matches the haill wird @@ -99,8 +96,6 @@ sco: webauthn: Gin it's a USB key be sure fir tae insert it an, if necessary, tap it. tag: name: Ye kin ainly chynge the case o the letters, fir example, fir tae mak it mair readable - user: - chosen_languages: Whan ticked, ainly posts in selectit leids wull be displayit in public timelines user_role: color: Colour tae be uised fir the role throuoot the UI, as RGB in hex format highlighted: This maks the role visible publicly diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index a81524f182a053..28e2cc24e63165 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -4,7 +4,6 @@ si: hints: account: attribution_domains: පේළියකට එකක්. ව්‍යාජ ආරෝපණ වලින් ආරක්ෂා කරයි. - discoverable: ඔබේ පොදු සටහන් සහ පැතිකඩ Mastodon හි විවිධ ප්‍රදේශවල විශේෂාංගගත කිරීමට හෝ නිර්දේශ කිරීමට ඉඩ ඇති අතර ඔබේ පැතිකඩ වෙනත් පරිශීලකයින්ට යෝජනා කළ හැකිය. display_name: ඔබේ සම්පූර්ණ නම හෝ ඔබේ විනෝදජනක නම. fields: ඔබේ මුල් පිටුව, සර්වනාම, වයස, ඔබට අවශ්‍ය ඕනෑම දෙයක්. indexable: ඔබේ පොදු සටහන් Mastodon හි සෙවුම් ප්‍රතිඵලවල දිස්විය හැකිය. ඔබේ සටහන් සමඟ අන්තර් ක්‍රියා කළ පුද්ගලයින්ට ඒවා නොසලකා සෙවිය හැකිය. @@ -57,9 +56,6 @@ si: setting_aggregate_reblogs: මෑතකදී වැඩි කරන ලද පළ කිරීම් සඳහා නව වැඩි කිරීම් නොපෙන්වන්න (අලුතින් ලැබුණු වැඩි කිරීම් වලට පමණක් බලපායි) setting_always_send_emails: ඔබ නිතර මාස්ටඩන් භාවිතා කරන විට වි-තැපැල් දැනුම්දීම් නොලැබෙයි setting_default_sensitive: සංවේදී මාධ්‍ය පෙරනිමියෙන් සඟවා ඇති අතර ක්ලික් කිරීමකින් හෙළිදරව් කළ හැක - setting_display_media_default: සංවේදී බව සලකුණු කළ මාධ්‍ය සඟවන්න - setting_display_media_hide_all: සැමවිට මාධ්‍ය සඟවන්න - setting_display_media_show_all: සැමවිට මාධ්‍ය පෙන්වන්න setting_system_scrollbars_ui: Safari සහ Chrome මත පදනම් වූ ඩෙස්ක්ටොප් බ්‍රව්සර් සඳහා පමණක් අදාළ වේ. setting_use_blurhash: අනුක්‍රමණ සැඟවුණු දෘශ්‍යවල වර්ණ මත පදනම් වන නමුත් ඕනෑම විස්තරයක් අපැහැදිලි කරයි setting_use_pending_items: සංග්‍රහය ස්වයංක්‍රීයව අනුචලනය කරනවා වෙනුවට ක්ලික් කිරීමක් පිටුපස කාලරේඛා යාවත්කාලීන සඟවන්න @@ -143,7 +139,6 @@ si: jurisdiction: බිල්පත් ගෙවන ඕනෑම අයෙකු ජීවත් වන රට ලැයිස්තුගත කරන්න. එය සමාගමක් හෝ වෙනත් ආයතනයක් නම්, එය සංස්ථාගත කර ඇති රට සහ සුදුසු පරිදි නගරය, කලාපය, භූමිය හෝ ප්‍රාන්තය ලැයිස්තුගත කරන්න. min_age: ඔබගේ අධිකරණ බල ප්‍රදේශයේ නීති මගින් අවශ්‍ය අවම වයසට වඩා අඩු නොවිය යුතුය. user: - chosen_languages: සබල නම්, තෝරාගත් භාෂාවල ලිපි පමණක් ප්‍රසිද්ධ කාල රේඛාවේ දිස්වේ role: පරිශීලකයාට ඇති අවසරයන් භූමිකාව පාලනය කරයි. user_role: color: UI පුරා භූමිකාව සඳහා භාවිතා කළ යුතු වර්ණය, හෙක්ස් ආකෘතියෙන් RGB ලෙස @@ -158,7 +153,6 @@ si: labels: account: attribution_domains: ඔබට බැර කිරීමට අවසර දී ඇති වෙබ් අඩවි - discoverable: සොයාගැනීම් ඇල්ගොරිතමවල විශේෂාංග පැතිකඩ සහ සටහන් fields: name: නම්පත value: අන්තර්ගතය diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index f4d2b8f6f8c668..cdfa965c36c509 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -4,7 +4,6 @@ sk: hints: account: attribution_domains: Jeden na riadok. Chráni vás pred falošným pripisovaním autorstva. - discoverable: Vaše verejné príspevky a profil môžu byť zobrazované a odporúčané v rôznych častiach Mastodonu a váš profil môže byť navrhovaný ostatným. display_name: Vaše meno a priezvisko alebo prezývka. fields: Váš web, zámená, vek, čokoľvek, čo chcete o sebe uviesť. indexable: Vaše verejné príspevky sa môžu zobrazovať vo výsledkoch vyhľadávania na Mastodone. Ľudia, ktorí s nimi interagovali, ich môžu nájsť vždy. @@ -42,9 +41,6 @@ sk: setting_aggregate_reblogs: Nezobrazovať nové zdieľania pre nedávno zdieľané príspevky (týka sa iba nových zdieľaní) setting_always_send_emails: Pri bežnom používaní Mastodonu nebudete dostávať e-mailové upozornenia setting_default_sensitive: Citlivé médiá sú predvolene ukryté a môžu byť zobrazené kliknutím - setting_display_media_default: Skrývať médiá označené ako citlivé - setting_display_media_hide_all: Vždy skrývať médiá - setting_display_media_show_all: Vždy zobrazovať médiá setting_system_scrollbars_ui: Platí len pre počítačové prehliadače využívajúce technológiu Chrome alebo Safari setting_use_blurhash: Prechody sú založené na farbách skrytých vizuálov, ale skrývajú akékoľvek podrobnosti setting_use_pending_items: Časová os bude aktualizovaná až po kliknutí, feed sa nebúde posúvať automaticky @@ -73,12 +69,9 @@ sk: show_application: Tebe sa táto informácia zobrazí vždy. tag: name: Zmeniť môžeš iba veľkosť písmen, napríklad aby boli ľahšie čítateľné - user: - chosen_languages: Po zaškrtnutí budú na verejných časových osiach zobrazované iba príspevky vo vybraných jazykoch labels: account: attribution_domains: Weby, ktoré vám môžu pripisovať autorstvo - discoverable: Zobrazovať profil a príspevky v objavovacích algoritmoch fields: name: Definícia value: Hodnota diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index a633829880c260..d08352516d6649 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -4,7 +4,6 @@ sl: hints: account: attribution_domains: Ena na vrstico. Ščiti pred napačno navedbo avtorstva. - discoverable: Vaše javne objave in profil so lahko predstavljeni ali priporočeni v različnih delih Mastodona, vaš profil pa je lahko predlagan drugim uporabnikom. display_name: Vaše polno ime ali lažno ime. fields: Vaša domača stran, starost, kar koli. indexable: Vaše javne objave se lahko pojavijo v rezultatih iskanja na Mastodonu. Ljudje, ki so bili v interakciji z vašimi objavami, jih bodo lahko iskali ne glede na to. @@ -58,9 +57,6 @@ sl: setting_aggregate_reblogs: Ne prikažite novih izpostavitev za objave, ki so bile nedavno izpostavljene (vpliva samo na novo prejete izpostavitve) setting_always_send_emails: Običajno e-obvestila ne bodo poslana, če ste na Mastodonu dejavni setting_default_sensitive: Občutljivi mediji so privzeto skriti in jih je mogoče razkriti s klikom - setting_display_media_default: Skrij medij, ki je označen kot občutljiv - setting_display_media_hide_all: Vedno skrij vse medije - setting_display_media_show_all: Vedno pokaži medij, ki je označen kot občutljiv setting_system_scrollbars_ui: Velja zgolj za namizne brskalnike, ki temeljijo na Safariju in Chromeu setting_use_blurhash: Prelivi temeljijo na barvah skrite vizualne slike, vendar zakrivajo vse podrobnosti setting_use_pending_items: Skrij posodobitev časovnice za klikom namesto samodejnega posodabljanja @@ -143,7 +139,6 @@ sl: jurisdiction: Navedite državo, kjer živi tisti, ki plačuje račune. Če je to podjetje ali druga entiteta, navedite državo, kjer je bila ustanovljena. Po potrebi dopišite tudi mesto, regijo, teritorij ali zvezno državo. min_age: Ne smete biti mlajši od starostne omejitve, ki jo postavljajo zakoni vašega pravosodnega sistema. user: - chosen_languages: Ko je označeno, bodo v javnih časovnicah prikazane samo objave v izbranih jezikih role: Vloga določa, katera dovoljenja ima uporabnik. user_role: color: Barva, uporabljena za vlogo po celem up. vmesniku, podana v šestnajstiškem zapisu RGB @@ -158,7 +153,6 @@ sl: labels: account: attribution_domains: Spletna mesta, ki vas smejo navajati kot avtorja/ico - discoverable: Izpostavljaj profile in objave v algoritmih odkrivanja fields: name: Oznaka value: Vsebina diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index b36bdb59ec7765..0785e9a1bf41eb 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -4,7 +4,7 @@ sq: hints: account: attribution_domains: Një për rresht. Kjo mbron nga atribuime të rreme. - discoverable: Postimet dhe profili juaj publik mund të shfaqen, ose rekomandohen në zona të ndryshme të Mastodon-it dhe profili juaj mund të sugjerohet përdoruesve të tjerë. + discoverable: Mund të shfaqeni në koleksione të krijuar nga përdorues të tjerë. Ju dhe postimet tuaja publike mund të sugjerohen gjithashtu nga përdorues në mënyra të tjera zbulimi nëpër Mastodon. display_name: Emri juaj i plotë, ose emri juaj lojcak. fields: Faqja juaj hyrëse, përemra, moshë, ç’të keni qejf. indexable: Postimet tuaja publike mund të shfaqen në përfundime kërkimesh në Mastodon. Pavarësisht nga kjo, personat që kanë ndërvepruar me postimet tuaja, mund të jenë në gjendje të kërkojnë për to. @@ -61,9 +61,9 @@ sq: setting_default_quote_policy_private: Në Mastodon s’mund të citohen nga të tjerë postim Vetëm-për-ndjekësit. setting_default_quote_policy_unlisted: Kur njerëzit ju citojnë, nga rrjedha kohore e gjërave në modë do të kalohen si të fshehura edhe postimet e tyre. setting_default_sensitive: Media rezervat fshihet, si parazgjedhje, dhe mund të shfaqet me një klikim - setting_display_media_default: Fshih media me shenjën rezervat - setting_display_media_hide_all: Fshih përherë mediat - setting_display_media_show_all: Mediat shfaqi përherë + setting_display_media_default: Sinjalizo, para se të shfaqësh media të shënuar si me spec + setting_display_media_hide_all: Sinjalizo, para shfaqjes së çfarëdo medieje + setting_display_media_show_all: Shfaq krejt mediat pa sinjalizuar, përfshi media të shënuar si me spec setting_quick_boosting_html: Kur aktivizohet, klikimi mbi ikonën e Përforcimeve %{boost_icon} do të bëjë menjëherë përforcimin, në vend se të hapet menuja hapmbyll e përforcimeve/citimeve. E rikalon veprimin e citimit te menuja %{options_icon} (Mundësi). setting_system_scrollbars_ui: Ka vend vetëm për shfletues desktop bazuar në Safari dhe Chrome setting_use_blurhash: Gradientët bazohen në ngjyrat e elementëve pamorë të fshehur, por errësojnë çfarëdo hollësie @@ -108,6 +108,7 @@ sq: status_page_url: URL e faqe ku njerëzit mund të shohin gjendjen e këtij shërbyesi, gjatë një ndërprerje të funksionimit theme: Temë që shohin vizitorët që kanë bërë daljen dhe përdorues të rinj. thumbnail: Një figurë afërsisht 2:1 e shfaqur tok me hollësi mbi shërbyesin tuaj. + thumbnail_description: Një përshkrim i figurës, për të ndihmuar persona me probleme të pari të kuptojnë ç’përmban. trendable_by_default: Anashkalo shqyrtim dorazi lënde në modë. Gjëra individuale prapë mund të hiqen nga lëndë në modë pas publikimi. trends: Gjërat në modë shfaqin cilat postime, hashtagë dhe histori të reja po tërheqin vëmendjen në shërbyesin tuaj. wrapstodon: Jepuni përdoruesve vendorë mundësinë të prodhojnë një përmbledhje lojcake të përdorimit të Mastodon-it prej tyre përgjatë vitit. Kjo veçori është e përdorshme mes 10 dhe 31 dhjetorit të çdo viti dhe u ofrohet përdoruesve që kanë për të paktën një postim Publik, ose Publik të Heshtur dhe që kanë përdorur të paktën një hashtag brenda vitit. @@ -133,6 +134,7 @@ sq: otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimeve:' webauthn: Nëse është një diskth USB, sigurohuni se e keni futur dhe, në qoftë e nevojshme, prekeni. settings: + email_subscriptions: Çaktivzimi i mban pajtimtarët ekzistues, por resht dërgim email-esh. indexable: Faqja e profilit tuaj mund të shfaqet në përfundime kërkimi në Google, Bing dhe të tjerë. show_application: Pavarësisht nga kjo, do të jeni përherë në gjendje të shihni cili aplikacion botoi postimin tuaj. tag: @@ -152,12 +154,13 @@ sq: jurisdiction: Vendosni vendin ku jeton cilido që paguan faturat. Nëse është një shoqëri apo tjetër njësi, vendosni vendin ku është regjistruar, si dhe qytetin, rajonin, territorin apo shtetin përkatës. min_age: S’duhet të jetë nën moshën minimum të domosdoshme nga ligjet në juridiksionin tuaj. user: - chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjuhët e përzgjedhura + chosen_languages: Kur i vihet shenjë, në rrjedha kohore publike do të shfaqen vetëm postime në gjuhët e përzgjedhura. Ky rregullim s’prek rrjedhën tuaj kohore Kreu dhe lista në të. date_of_birth: one: Na duhet të sigurohemi se jeni të paktën %{count} që të përdorni %{domain}. S’do ta depozitojmë këtë. other: Na duhet të sigurohemi se jeni të paktën %{count} që të përdorni %{domain}. S’do ta depozitojmë këtë. role: Roli kontrollon cilat leje ka përdoruesi. user_role: + collection_limit: Kufizon numrin e Koleksioneve që mund të krijojë një përdorues me këtë rol. Ju lutemi, kini parasysh se kur zvogëloni këtë numër, përdoruesit që janë tashmë në këtë kufi, s’do të humbin ndonjë Koleksion. Por s’do të jenë në gjendje të krijojnë të rinj të tjerë. color: Ngjyrë për t’u përdorur për rolin nëpër UI, si RGB në format gjashtëmbëdhjetësh highlighted: Kjo e bën rolin të dukshëm publikisht name: Emër publik për rolin, nëse roli është ujdisur të shfaqet si një stemë @@ -175,7 +178,7 @@ sq: labels: account: attribution_domains: Sajte të lejuar t’ju japin hakë - discoverable: Profilin dhe postimet bëji objekt të algoritmeve të zbulimit + discoverable: Shfaqmëni në mënyra zbulimi fields: name: Etiketë value: Lëndë @@ -314,6 +317,7 @@ sq: status_page_url: URL faqeje gjendjesh theme: Temë parazgjedhje thumbnail: Miniaturë shërbyesi + thumbnail_description: Tekst alternativ miniature trendable_by_default: Lejoni gjëra në modë pa shqyrtim paraprak trends: Aktivizo gjëra në modë wrapstodon: Aktivizo Përmbledhjedon-in @@ -355,6 +359,7 @@ sq: hint: Informacion shtesë text: Rregull settings: + email_subscriptions: Aktivizo regjistrime me email indexable: Përfshi faqe profili në motorë kërkimesh show_application: Shfaq prej cilit aplikacion dërguat një postim tag: @@ -383,6 +388,7 @@ sq: role: Rol time_zone: Zonë kohore user_role: + collection_limit: Numër maksimum Koleksionesh për përdorues color: Ngjyrë steme highlighted: Shfaqe rolin si një stemë në profile përdoruesish name: Emër diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 1be4c6f2891de8..28388ee31850ed 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -3,7 +3,6 @@ sr-Latn: simple_form: hints: account: - discoverable: Vaše javne objave i profil mogu biti istaknuti ili preporučeni u različitim oblastima Mastodon-a i vaš profil može biti predložen drugim korisnicima. display_name: Vaše puno ime ili nadimak. fields: Vaša matična stranica, zamenice, godine, sve što želite. indexable: Vaše javne objave se mogu pojaviti u rezultatima pretrage na Mastodon-u. Ljudi koji su stupili u interakciju sa vašim objavama će možda moći da ih pretražuju. @@ -55,9 +54,6 @@ sr-Latn: setting_aggregate_reblogs: Ne prikazuj nova podržavanja za objave koje su nedavno podržane (utiče samo na nedavno primljena podržavanja) setting_always_send_emails: Obaveštenja e-poštom se po pravilu neće slati kada aktivno koristite Mastodon setting_default_sensitive: Osetljivi mediji su podrazumevano skriveni i mogu se otkriti klikom - setting_display_media_default: Sakrij medije označene kao osetljive - setting_display_media_hide_all: Uvek sakrij sve medije - setting_display_media_show_all: Uvek prikaži medije označene kao osetljive setting_use_blurhash: Gradijenti se formiraju na osnovu bojâ skrivenih slika i zamućuju prikaz, prikrivajući detalje setting_use_pending_items: Sakriva ažuriranja vremenske linije iza klika umesto automatskog ažuriranja i pomeranja vremenske linije username: Možete koristiti slova, brojeve i donje crte @@ -123,8 +119,6 @@ sr-Latn: show_application: Uvek ćete moći da vidite koja je aplikacija objavila vašu objavu. tag: name: Mogu se samo promeniti mala slova u velika ili obrnuto, na primer, da bi bilo čitljivije - user: - chosen_languages: Kada je označeno, objave u izabranim jezicima će biti prikazane na javnoj vremenskoj liniji user_role: color: Boja koja će se koristiti za ulogu u celom korisničkom okruženju, kao RGB u heksadecimalnom formatu highlighted: Ovo čini ulogu javno vidljivom @@ -137,7 +131,6 @@ sr-Latn: url: Gde će se događaji slati labels: account: - discoverable: Istakni funkcije i objave u algoritmima otkrivanja fields: name: Etiketa value: Sadržaj diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 2fe3d79c3af2fa..85a521eb59be9d 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -3,7 +3,6 @@ sr: simple_form: hints: account: - discoverable: Ваше јавне објаве и профил могу бити истакнути или препоручени у различитим областима Mastodon-а и ваш профил може бити предложен другим корисницима. display_name: Ваше пуно име или надимак. fields: Ваша матична страница, заменице, године, све што желите. indexable: Ваше јавне објаве се могу појавити у резултатима претраге на Mastodon-у. Људи који су ступили у интеракцију са вашим објавама ће можда моћи да их претражују. @@ -55,9 +54,6 @@ sr: setting_aggregate_reblogs: Не приказуј нова подржавања за објаве које су недавно подржане (утиче само на недавно примљена подржавања) setting_always_send_emails: Обавештења е-поштом се по правилу неће слати када активно користите Mastodon setting_default_sensitive: Осетљиви медији су подразумевано скривени и могу се открити кликом - setting_display_media_default: Сакриј медије означене као осетљиве - setting_display_media_hide_all: Увек сакриј све медије - setting_display_media_show_all: Увек прикажи медије означене као осетљиве setting_use_blurhash: Градијенти се формирају на основу бојâ скривених слика и замућују приказ, прикривајући детаље setting_use_pending_items: Сакрива ажурирања временске линије иза клика уместо аутоматског ажурирања и померања временске линије username: Можете користити слова, бројеве и доње црте @@ -123,8 +119,6 @@ sr: show_application: Увек ћете моћи да видите која је апликација објавила вашу објаву. tag: name: Могу се само променити мала слова у велика или обрнуто, на пример, да би било читљивије - user: - chosen_languages: Када је означено, објаве у изабраним језицима ће бити приказане на јавној временској линији user_role: color: Боја која ће се користити за улогу у целом корисничком окружењу, као RGB у хексадецималном формату highlighted: Ово чини улогу јавно видљивом @@ -137,7 +131,6 @@ sr: url: Где ће се догађаји слати labels: account: - discoverable: Истакни функције и објаве у алгоритмима откривања fields: name: Етикета value: Садржај diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 66b6ab26eac442..28aa09f441751d 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -4,7 +4,7 @@ sv: hints: account: attribution_domains: En per rad. Skyddar mot falska attributioner. - discoverable: Dina offentliga inlägg och din profil kan komma att presenteras eller rekommenderas inom olika områden av Mastodon och din profil kan komma att föreslås till andra användare. + discoverable: Du kan finnas med i samlingar som skapats av andra användare. Du och dina offentliga inlägg kan också föreslås för användare i andra upptäcktsupplevelser inom Mastodon. display_name: Ditt fullständiga namn eller ditt roliga namn. fields: Din hemsida, ditt pronomen, din ålder, vadhelst du vill. indexable: Dina offentliga inlägg kan visas i sökresultat på Mastodon. Personer som har interagerat med dina inlägg kan söka dem oavsett. @@ -61,9 +61,9 @@ sv: setting_default_quote_policy_private: Inlägg som endast är för följare och som författats på Mastodon kan inte citeras av andra. setting_default_quote_policy_unlisted: När folk citerar dig, kommer deras inlägg också att döljas från trendande tidslinjer. setting_default_sensitive: Känslig media döljs som standard och kan visas med ett klick - setting_display_media_default: Dölj media markerad som känslig - setting_display_media_hide_all: Dölj alltid all media - setting_display_media_show_all: Visa alltid media markerad som känslig + setting_display_media_default: Varna innan du visar media markerad som känslig + setting_display_media_hide_all: Varna innan du visar alla medier + setting_display_media_show_all: Visa alla medier utan varning, inklusive media markerad som känslig setting_emoji_style: Hur emojier visas. "Automatiskt" kommer att försöka använda webbläsarens emojier, men faller tillbaka till Twemoji för äldre webbläsare. setting_quick_boosting_html: När aktiverad, klicka på %{boost_icon} Boost-ikonen för att omedelbart boosta istället för att öppna boost/citera-rullgardinsmenyn. Flyttar citering till %{options_icon} (Alternativ)-menyn. setting_system_scrollbars_ui: Gäller endast för webbläsare som är baserade på Safari och Chrome @@ -109,6 +109,7 @@ sv: status_page_url: URL till en sida där personer kan se serverns status under ett driftavbrott theme: Tema som utloggade besökare och nya användare ser. thumbnail: En bild i cirka 2:1-proportioner som visas tillsammans med din serverinformation. + thumbnail_description: En beskrivning av bilden för att hjälpa personer med synnedsättning förstå dess innehåll. trendable_by_default: Hoppa över manuell granskning av trendande innehåll. Enskilda objekt kan ändå raderas från trender retroaktivt. trends: Trender visar vilka inlägg, hashtaggar och nyheter det pratas om på din server. wrapstodon: Erbjud lokala användare att generera en lekfull sammanfattning av deras Mastodon-användning under året. Denna funktion är tillgänglig mellan den 10 och 31 december varje år, och erbjuds till användare som gjort minst ett Offentligt eller Tyst Offentligt inlägg och använt minst en hashtag under året. @@ -134,6 +135,7 @@ sv: otp: 'Ange tvåfaktorskoden som genererades av din telefonapp, eller använd någon av dina återställningskoder:' webauthn: Om det är en USB-nyckel se till att sätta in den och, om nödvändigt, tryck på den. settings: + email_subscriptions: Om detta inaktiveras behålls befintliga prenumeranter men slutar skicka e-post. indexable: Din profilsida kan visas i sökresultat på Google, Bing och andra sökmotorer. show_application: Du kommer alltid att kunna se vilken app som publicerat ditt inlägg oavsett. tag: @@ -153,12 +155,13 @@ sv: jurisdiction: Lista det land där vem som än betalar räkningarna bor. Om det är ett företag eller annan enhet, lista landet där det är inkorporerat, och staden, regionen, territoriet eller staten på lämpligt sätt. min_age: Bör inte vara lägre än den minimiålder som krävs enligt lagarna i din jurisdiktion. user: - chosen_languages: Vid aktivering visas bara inlägg på dina valda språk i offentliga tidslinjer + chosen_languages: När detta markeras kommer endast inlägg på valda språk att visas i offentliga tidslinjer. Den här inställningen påverkar inte din hemtidslinje och dina listor. date_of_birth: one: Vi måste se till att du är minst %{count} för att använda %{domain}. Vi sparar inte denna information. other: Vi måste se till att du är minst %{count} för att använda %{domain}. Vi lagrar inte denna information. role: Rollen styr vilka behörigheter användaren har. user_role: + collection_limit: Begränsar antalet samlingar som en enda användare med denna roll kan skapa. Observera att när du minskar detta antal kommer användare som redan är på denna gräns inte att förlora några samlingar. Men de kommer inte att kunna skapa ytterligare sådana. color: Färgen som ska användas för rollen i användargränssnittet, som RGB i hex-format highlighted: Detta gör rollen synlig offentligt name: Offentligt namn på rollen, om rollen är inställd på att visas som ett emblem @@ -176,7 +179,7 @@ sv: labels: account: attribution_domains: Webbplatser som är tillåtna att kreditera dig - discoverable: Presentera profil och inlägg med upptäcktsalgoritmer + discoverable: Visa mig i upptäcktsupplevelser fields: name: Etikett value: Innehåll @@ -315,6 +318,7 @@ sv: status_page_url: URL för statussida theme: Standardtema thumbnail: Serverns tumnagelbild + thumbnail_description: Miniatyrbilders alternativa text trendable_by_default: Tillåt trender utan föregående granskning trends: Aktivera trender wrapstodon: Aktivera Wrapstodon @@ -356,6 +360,7 @@ sv: hint: Ytterligare information text: Regel settings: + email_subscriptions: Aktivera e-postregistreringar indexable: Inkludera profilsidan i sökmotorer show_application: Visa från vilket program du skickade ett inlägg tag: @@ -384,6 +389,7 @@ sv: role: Roll time_zone: Tidszon user_role: + collection_limit: Maximalt antal samlingar per användare color: Emblemsfärg highlighted: Visa roll som emblem på användarprofiler name: Namn diff --git a/config/locales/simple_form.ta.yml b/config/locales/simple_form.ta.yml index fcf031f90eb8da..179f6a1963a790 100644 --- a/config/locales/simple_form.ta.yml +++ b/config/locales/simple_form.ta.yml @@ -22,8 +22,6 @@ ta: current_username: உறுதிசெய்ய, தற்போதைய கணக்கின் பயனர் பெயரை உள்ளிடுக email: உறுதிசெய் மின்னஞ்சல் உங்களுக்கு அனுப்பப்படும் password: குறைந்தது 8 எழுத்துக்களைப் பயன்படுத்தவும் - setting_display_media_hide_all: எப்போதும் எல்லா ஊடகங்களையும் மறைக்கவும் - setting_display_media_show_all: உணர்ச்சி வயப்படு (Sensitive) குறிக்கப்பட்ட மீடியாவை எப்போதும் காட்டுங்கள் email_domain_block: with_dns_records: இக்களத்தின் DNS record-களை சரிசெய்யும் முயற்சி மேற்கொள்ளப்படும், மற்றும் அதன் முடிவுகள் தடுப்புப்பட்டியலில் சேர்க்கப்படும் labels: diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 7e4edbbaf5af22..7d611606badbaa 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -4,7 +4,6 @@ th: hints: account: attribution_domains: หนึ่งรายการต่อบรรทัด ปกป้องจากการระบุแหล่งที่มาที่ผิด - discoverable: อาจแสดงหรือแนะนำโพสต์และโปรไฟล์สาธารณะของคุณในพื้นที่ต่าง ๆ ของ Mastodon และอาจเสนอแนะโปรไฟล์ของคุณให้กับผู้ใช้อื่น ๆ display_name: ชื่อเต็มของคุณหรือชื่อแบบสนุกสนานของคุณ fields: หน้าแรก, สรรพนาม, อายุของคุณ สิ่งใดก็ตามที่คุณต้องการ indexable: โพสต์สาธารณะของคุณอาจปรากฏในผลลัพธ์การค้นหาใน Mastodon ผู้คนที่ได้โต้ตอบกับโพสต์ของคุณอาจสามารถค้นหาโพสต์เหล่านั้นได้ไม่ว่าอย่างไรก็ตาม @@ -57,9 +56,6 @@ th: setting_aggregate_reblogs: ไม่แสดงการดันใหม่สำหรับโพสต์ที่เพิ่งดัน (มีผลต่อการดันที่ได้รับใหม่เท่านั้น) setting_always_send_emails: โดยปกติจะไม่ส่งการแจ้งเตือนอีเมลเมื่อคุณกำลังใช้ Mastodon อยู่ setting_default_sensitive: ซ่อนสื่อที่ละเอียดอ่อนเป็นค่าเริ่มต้นและสามารถเปิดเผยได้ด้วยการคลิก - setting_display_media_default: ซ่อนสื่อที่มีการทำเครื่องหมายว่าละเอียดอ่อน - setting_display_media_hide_all: ซ่อนสื่อเสมอ - setting_display_media_show_all: แสดงสื่อเสมอ setting_use_blurhash: อิงการไล่ระดับสีตามสีของภาพที่ซ่อนอยู่แต่ทำให้รายละเอียดใด ๆ คลุมเครือ setting_use_pending_items: ซ่อนการอัปเดตเส้นเวลาไว้หลังการคลิกแทนที่จะเลื่อนฟีดโดยอัตโนมัติ username: คุณสามารถใช้ตัวอักษร, ตัวเลข และขีดล่าง @@ -126,7 +122,6 @@ th: tag: name: คุณสามารถเปลี่ยนได้เฉพาะตัวพิมพ์ใหญ่เล็กของตัวอักษรเท่านั้น ตัวอย่างเช่น เพื่อทำให้ตัวอักษรอ่านได้ง่ายขึ้น user: - chosen_languages: เมื่อกาเครื่องหมาย จะแสดงเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะเท่านั้น role: บทบาทควบคุมว่าสิทธิอนุญาตใดที่ผู้ใช้มี user_role: color: ใช้สีสำหรับบทบาททั่วทั้ง UI เป็น RGB ในรูปแบบฐานสิบหก @@ -141,7 +136,6 @@ th: labels: account: attribution_domains: เว็บไซต์ที่ได้รับอนุญาตให้ให้เครดิตคุณ - discoverable: แสดงโปรไฟล์และโพสต์ในอัลกอริทึมการค้นพบ fields: name: ป้ายชื่อ value: เนื้อหา diff --git a/config/locales/simple_form.tok.yml b/config/locales/simple_form.tok.yml index 81c3121f24b1a2..08e903b002d2d8 100644 --- a/config/locales/simple_form.tok.yml +++ b/config/locales/simple_form.tok.yml @@ -11,9 +11,6 @@ tok: acct: o toki e nimi@ma pi sijelo tan account_migration: acct: o toki e nimi@ma pi sijelo tawa - defaults: - setting_display_media_hide_all: sitelen ale li len - setting_display_media_show_all: sitelen ale li len ala labels: defaults: expires_in: ona o moli lon diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index f40034407b19fa..c3630cf6155c3f 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -4,7 +4,7 @@ tr: hints: account: attribution_domains: Her satırda bir tane. Sahte atıflardan korur. - discoverable: Herkese açık gönderileriniz ve profiliniz Mastodon'un çeşitli kısımlarında öne çıkarılabilir veya önerilebilir ve profiliniz başka kullanıcılara önerilebilir. + discoverable: Diğer kullanıcılar tarafından oluşturulan koleksiyonlarda yer alabilirsiniz. Siz ve herkese açık paylaşımlarınız, Mastodon'daki diğer keşif deneyimlerinde kullanıcılara önerilebilir. display_name: Tam adınız veya kullanıcı adınız. fields: Ana sayfanız, zamirleriniz, yaşınız, istediğiniz herhangi bir şey. indexable: Herkese açık gönderileriniz Mastodon arama sonuçlarında görünebilir. Gönderilerinizle etkileşen kullanıcılar her halükarda onları arayabilirler. @@ -61,9 +61,9 @@ tr: setting_default_quote_policy_private: Mastodon'da sadece takipçilere yönelik gönderiler başkaları tarafından alıntılanamaz. setting_default_quote_policy_unlisted: İnsanlar sizden alıntı yaptığında, onların gönderileri de trend zaman tünellerinden gizlenecektir. setting_default_sensitive: Hassas medya varsayılan olarak gizlidir ve bir tıklama ile gösterilebilir - setting_display_media_default: Hassas olarak işaretlenmiş medyayı gizle - setting_display_media_hide_all: Medyayı her zaman gizle - setting_display_media_show_all: Medyayı her zaman göster + setting_display_media_default: Hassas olarak işaretlenmiş medya öğelerini göstermeden önce uyarı ver + setting_display_media_hide_all: Tüm medya öğelerini göstermeden önce uyarı ver + setting_display_media_show_all: Hassas olarak işaretlenmiş medya dahil olmak üzere tüm medyayı uyarı vermeden göster setting_emoji_style: Emojiler nasıl görüntülensin. "Otomatik" seçeneği yerel emojileri kullanmaya çalışır, ancak eski tarayıcılar için Twemoji'yi kullanır. setting_quick_boosting_html: Etkinleştirildiğinde, %{boost_icon} Öne Çıkar simgesine tıklandığında, öne çıkar/alıntı açılır menüsünü görüntüleme yerine hemen öne çıkarma işlemi gerçekleştirilir. Alıntı işlevi %{options_icon} (Seçenekler) menüsüne taşınır. setting_system_scrollbars_ui: Yalnızca Safari ve Chrome tabanlı masaüstü tarayıcılar için geçerlidir @@ -109,6 +109,7 @@ tr: status_page_url: İnsanların bir kesinti halinde sunucunun durumunu görebilecekleri bir sayfanın URL'si theme: Giriş yapmamış ziyaretçilerin ve yeni kullanıcıların gördüğü tema. thumbnail: Sunucu bilginizin yanında gösterilen yaklaşık 2:1'lik görüntü. + thumbnail_description: Görme engelli kişilerin resmin içeriğini anlamasına yardımcı olacak bir açıklama. trendable_by_default: Öne çıkan içeriğin elle incelenmesini atla. Tekil öğeler sonrada öne çıkanlardan kaldırılabilir. trends: Öne çıkanlar, sunucunuzda ilgi toplayan gönderileri, etiketleri ve haber yazılarını gösterir. wrapstodon: Yerel kullanıcılara, yıl boyunca Mastodon kullanımlarının eğlenceli bir özetini oluşturma imkanı sunun. Bu özellik, her yıl 10 Aralık ile 31 Aralık tarihleri arasında kullanılabilir ve yıl içinde en az bir adet Halka Açık veya Sessiz Halka Açık gönderi paylaşan ve en az bir hashtag kullanan kullanıcılara sunulur. @@ -134,6 +135,7 @@ tr: otp: 'Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz:' webauthn: Bir USB anahtarıysa, taktığınızdan ve gerekirse üzerine tıkladığınızdan emin olun. settings: + email_subscriptions: Devre dışı bırakma işlemi mevcut aboneleri korur ancak e-posta gönderimini durdurur. indexable: Profil sayfanız Google, Bing ve diğerlerindeki arama sonuçlarında görüntülenebilir. show_application: Ne olursa olsun gönderinizi yayınlayan uygulamayı her zaman görebileceksiniz. tag: @@ -153,12 +155,13 @@ tr: jurisdiction: Faturaları ödeyen kişinin yaşadığı ülkeyi listeleyin. Bir şirket veya başka bir kuruluş ise, kurulduğu ülkeyi ve uygun şekilde şehri, bölgeyi, yöreyi veya eyaleti listeleyin. min_age: Tabi olduğunuz yasaların gerektirdiği yaştan düşük olmamalıdır. user: - chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki gönderiler genel zaman çizelgelerinde görüntülenir + chosen_languages: Bu seçenek seçilirse genel zaman akışlarında yalnızca seçilen dillerdeki gönderiler gösterilir. Bu ayar, Ana Sayfa zaman akışınızı ve listelerinizi etkilemez. date_of_birth: one: "%{domain} kullanmak için en az %{count} yaşında olduğunuzdan emin olmalıyız. Bu bilgiyi saklamıyoruz." other: "%{domain} kullanmak için en az %{count} yaşında olduğunuzdan emin olmalıyız. Bu bilgiyi saklamıyoruz." role: Rol, kullanıcıların sahip olduğu izinleri denetler. user_role: + collection_limit: Bu role sahip tek bir kullanıcının oluşturabileceği Koleksiyon sayısını sınırlar. Bu sayıyı azalttığınızda, halihazırda bu sınıra ulaşmış olan kullanıcıların mevcut Koleksiyonlarını kaybetmeyeceklerini lütfen unutmayın. Ancak bu kullanıcılar yeni Koleksiyonlar oluşturamayacaklardır. color: Arayüz boyunca rol için kullanılacak olan renk, hex biçiminde RGB highlighted: Bu rolü herkese açık hale getirir name: Rolün, eğer rozet olarak görüntülenmesi ayarlandıysa kullanılacak herkese açık ismi @@ -176,7 +179,7 @@ tr: labels: account: attribution_domains: Size atıf verebilecek websiteleri - discoverable: Profil ve gönderileri keşif algoritmalarında kullan + discoverable: Beni keşif deneyimlerinde öne çıkar fields: name: Etiket value: İçerik @@ -315,6 +318,7 @@ tr: status_page_url: Durum sayfası URL'si theme: Öntanımlı tema thumbnail: Sunucu küçük resmi + thumbnail_description: Küçük resim alternatif metni trendable_by_default: Ön incelemesiz öne çıkanlara izin ver trends: Öne çıkanları etkinleştir wrapstodon: Wrapstodonu Etkinleştir @@ -356,6 +360,7 @@ tr: hint: Ek bilgi text: Kural settings: + email_subscriptions: E-posta aboneliklerini etkinleştir indexable: Arama motorları profil sayfasını içersin show_application: Gönderiyi hangi uygulamadan gönderdiğiniz görüntülensin tag: @@ -384,6 +389,7 @@ tr: role: Rol time_zone: Zaman dilimi user_role: + collection_limit: Bir kullanıcının sahip olabileceği maksimum Koleksiyon sayısı color: Rozet rengi highlighted: Rolü kullanıcıların profilinde rozet olarak görüntüle name: Ad diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 94a8a4010b61fd..489dff3d51571e 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -4,7 +4,6 @@ uk: hints: account: attribution_domains: Один на рядок. Захищає від фальшивих приписувань авторства. - discoverable: Ваші дописи та профіль можуть бути рекомендовані в різних частинах Mastodon і ваш профіль може бути запропонований іншим користувачам. display_name: Ваше повне ім'я або ваш псевдонім. fields: Ваша домашня сторінка, займенники, вік, все, що вам заманеться. indexable: Ваші загальнодоступні дописи можуть з'явитися в результатах пошуку на Mastodon. Люди, які взаємодіяли з вашими дописами зможуть знаходити їх незалежно від цих налаштувань. @@ -61,9 +60,6 @@ uk: setting_default_quote_policy_private: Mastodon не дозволяє цитувати дописи, адресовані лише підписникам. setting_default_quote_policy_unlisted: Цитати вашого допису також буде сховано зі стрічок трендів. setting_default_sensitive: Делікатні медіа типово приховані та можуть бути розкриті натисканням - setting_display_media_default: Приховувати медіа, позначені як делікатними - setting_display_media_hide_all: Завжди приховувати медіа - setting_display_media_show_all: Завжди показувати медіа setting_emoji_style: Як показувати емоджі. «Авто» — використовувати емоджі браузера, а за їхньої відсутності — Twemoji. setting_quick_boosting_html: Якщо увімкнено, натиск на піктограму %{boost_icon} Поширити призводитиме до негайного поширення, а не відкриватиме меню поширення й цитування. Кнопку цитування буде переміщено до меню %{options_icon} Більше. setting_system_scrollbars_ui: Застосовується лише для настільних браузерів на основі Safari та Chrome @@ -149,7 +145,6 @@ uk: jurisdiction: Укажіть країну, де живе той, хто платить за рахунками. Якщо це компанія чи інша організація, вкажіть країну, де вона зареєстрована, а також місто, регіон, територію чи штат відповідно. min_age: Не повинно бути нижче мінімального віку, необхідного законодавством вашої юрисдикції. user: - chosen_languages: У глобальних стрічках будуть показані дописи тільки вибраними мовами role: Роль визначає, які права має користувач. user_role: color: Колір, який буде використовуватися для ролі у всьому інтерфейсі, як RGB у форматі hex @@ -164,7 +159,6 @@ uk: labels: account: attribution_domains: Сайти, яким можна вказувати вас як автора - discoverable: Функції профілю та дописів у алгоритмах виявлення fields: name: Мітка value: Вміст diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index bb43d41c1e9caf..a476526a01c639 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -4,9 +4,9 @@ vi: hints: account: attribution_domains: Bảo vệ khỏi những sự gán ghép sai. - discoverable: Mọi người có thể được đề xuất hồ sơ và tút công khai của bạn. + discoverable: Bạn có thể được nêu bật trong một gói khởi đầu của người khác. Bạn và tút công khai của bạn sẽ được đề xuất trên Mastodon. display_name: Tên đầy đủ hoặc biệt danh đều được. - fields: Blog của bạn, nghề nghiệp, tuổi hoặc bất cứ gì. + fields: Blog của bạn, nghề nghiệp, tuổi hoặc bất kỳ. indexable: Mọi người có thể tìm kiếm và tương tác với những tút công khai của bạn trên Mastodon. note: 'Bạn có thể @aiđó hoặc #hashtags.' show_collections: Mọi người sẽ biết bạn theo dõi ai và ai theo dõi bạn. @@ -54,18 +54,18 @@ vi: password: Tối thiểu 8 ký tự phrase: Sẽ được hiện thị trong văn bản hoặc cảnh báo nội dung của một tút scopes: Ứng dụng sẽ được phép truy cập những API nào. Nếu bạn chọn quyền cấp cao nhất, không cần chọn quyền nhỏ. - setting_advanced_layout: Hiển thị Mastodon dưới dạng bố cục nhiều cột, cho phép bạn xem dòng thời gian, thông báo và cột thứ ba mà bạn chọn. Không nên dùng cho màn hình nhỏ. + setting_advanced_layout: Cho phép bạn xem bảng tin, thông báo và một cột thứ ba mà bạn chọn. Không nên dùng nếu màn hình nhỏ. setting_aggregate_reblogs: Nếu một tút đã được đăng lại thì sẽ không hiện những lượt đăng lại khác trên bảng tin setting_always_send_emails: Bình thường thì sẽ không gửi khi bạn đang dùng Mastodon - setting_boost_modal: Nếu được bật, trước khi đăng lại sẽ mở hộp thoại xác nhận - trong đó bạn có thể thay đổi mức độ hiển thị tút của mình. + setting_boost_modal: Nếu bật, trước khi đăng lại sẽ mở hộp thoại xác nhận - trong đó bạn có thể thay đổi mức độ hiển thị tút của mình. setting_default_quote_policy_private: Không thể trích dẫn tút chỉ dành cho người theo dõi trên Mastodon. setting_default_quote_policy_unlisted: Khi ai đó trích dẫn bạn, tút của họ cũng sẽ bị ẩn khỏi bảng tin công khai. setting_default_sensitive: Bắt buộc nhấn vào mới có thể xem - setting_display_media_default: Click để xem - setting_display_media_hide_all: Luôn ẩn - setting_display_media_show_all: Luôn hiện - setting_emoji_style: Cách hiển thị Emoji. "Tự động" sẽ dùng biểu tượng cảm xúc nguyên bản, nhưng đối với các trình duyệt cũ sẽ chuyển thành Twemoji. - setting_quick_boosting_html: Nếu bật, nhấn biểu tượng %{boost_icon} Đăng lại sẽ lập tức đăng lại thay vì mở menu xổ xuống đăng lại/trích dẫn. Chuyển vị trí hành động trích dẫn sang menu %{options_icon} (Tùy chọn). + setting_display_media_default: Cảnh báo trước khi hiện phương tiện nhạy cảm + setting_display_media_hide_all: Cảnh báo trước khi hiện tất cả phương tiện + setting_display_media_show_all: Hiện tất cả phương tiện mà không cảnh báo, kể cả phương tiện đánh dấu nhạy cảm + setting_emoji_style: '"Tự động" sẽ dùng biểu tượng cảm xúc nguyên bản, nhưng đối với các trình duyệt cũ sẽ chuyển thành Twemoji.' + setting_quick_boosting_html: Nếu bật, nhấn biểu tượng %{boost_icon} Đăng lại sẽ đăng lại lập tức, thay vì mở menu xổ xuống đăng lại/trích dẫn. Chuyển vị trí hành động trích dẫn sang menu %{options_icon} (Tùy chọn). setting_system_scrollbars_ui: Chỉ áp dụng trình duyệt Chrome và Safari bản desktop setting_use_blurhash: Phủ lớp màu làm nhòe đi hình ảnh nhạy cảm setting_use_pending_items: Dồn lại toàn bộ tút mới và chỉ hiển thị khi nhấn vào @@ -109,6 +109,7 @@ vi: status_page_url: URL của trang nơi mọi người có thể xem trạng thái của máy chủ này khi ngừng hoạt động theme: Chủ đề mà khách truy cập đăng xuất và người mới nhìn thấy. thumbnail: 'Một hình ảnh tỉ lệ 2: 1 được hiển thị cùng với thông tin máy chủ của bạn.' + thumbnail_description: Mô tả hình ảnh để giúp người khiếm thị hiểu nội dung của hình ảnh. trendable_by_default: Bỏ qua việc duyệt thủ công nội dung xu hướng. Các mục riêng lẻ vẫn có thể bị xóa khỏi xu hướng sau này. trends: Hiển thị những tút, hashtag và tin tức đang được thảo luận nhiều trên máy chủ của bạn. wrapstodon: Cho phép người dùng máy chủ tạo bản tóm tắt vui nhộn về việc sử dụng Mastodon của họ trong năm. Tính năng này có sẵn từ ngày 10 đến ngày 31 tháng 12 hàng năm, và được cung cấp cho người dùng đã đăng ít nhất một tút Công khai hoặc Riêng tư và sử dụng ít nhất một hashtag trong năm. @@ -134,6 +135,7 @@ vi: otp: 'Nhập mã xác thực 2 bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:' webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều. settings: + email_subscriptions: Việc vô hiệu hóa sẽ giữ lại những người đăng ký hiện có nhưng ngừng gửi email. indexable: Trang của bạn có thể xuất hiện trong kết quả tìm kiếm trên Google, Bing và các nơi khác. show_application: Bạn luôn có thể xem ứng dụng đã đăng tút của mình. tag: @@ -153,11 +155,12 @@ vi: jurisdiction: Liệt kê quốc gia nơi người trả hóa đơn sinh sống. Nếu đó là công ty hoặc tổ chức khác, hãy liệt kê quốc gia nơi công ty được thành lập và thành phố, khu vực, lãnh thổ hoặc tiểu bang nếu phù hợp. min_age: Không được dưới độ tuổi tối thiểu theo quy định của luật pháp tại khu vực của bạn. user: - chosen_languages: Chỉ hiển thị những ngôn ngữ tút sau + chosen_languages: Khi được chọn, chỉ những tút bằng các ngôn ngữ đã chọn mới được hiển thị trên dòng thời gian công khai. Cài đặt này không ảnh hưởng đến Bảng tin và danh sách của bạn. date_of_birth: other: Chúng tôi phải đảm bảo rằng bạn ít nhất %{count} tuổi để tham gia %{domain}. Thông tin này không lưu trữ sau khi đăng ký. role: Vai trò kiểm soát những quyền mà người dùng có. user_role: + collection_limit: Giới hạn số lượng Gói khởi đầu mà một tài khoản có vai trò này có thể tạo. Xin lưu ý rằng khi bạn giảm số lượng này, những người dùng đã đạt đến giới hạn này sẽ không bị mất bất kỳ Gói khởi đầu nào. Nhưng họ sẽ không thể tạo thêm nữa. color: Màu được sử dụng cho vai trò trong toàn bộ giao diện người dùng, dưới dạng RGB ở định dạng hex highlighted: Vai trò sẽ hiển thị công khai name: Tên công khai của vai trò, nếu vai trò được đặt để hiển thị dưới dạng huy hiệu @@ -175,7 +178,7 @@ vi: labels: account: attribution_domains: Các trang web được phép ghi nhận bạn - discoverable: Đề xuất hồ sơ và tút + discoverable: Cho phép hiển thị tôi trong trải nghiệm khám phá fields: name: Nhãn value: Nội dung @@ -235,10 +238,10 @@ vi: otp_attempt: Mã xác thực 2 bước password: Mật khẩu phrase: Từ khóa hoặc cụm từ - setting_advanced_layout: Bố cục nhiều cột + setting_advanced_layout: Dùng bố cục nhiều cột setting_aggregate_reblogs: Không hiện lượt đăng lại trùng lặp setting_always_send_emails: Luôn gửi email thông báo - setting_auto_play_gif: Tự động phát ảnh GIF + setting_auto_play_gif: Phát ảnh GIF tự động setting_boost_modal: Kiểm soát khả năng đăng lại setting_color_scheme: Bảng màu setting_contrast: Độ tương phản @@ -247,17 +250,17 @@ vi: setting_default_quote_policy: Ai có thể trích dẫn setting_default_sensitive: Đánh dấu media nhạy cảm setting_delete_modal: Cảnh báo tôi trước khi xóa một tút - setting_disable_hover_cards: Không popup hồ sơ - setting_disable_swiping: Không thao tác vuốt + setting_disable_hover_cards: Không hiện popup xem trước hồ sơ + setting_disable_swiping: Không dùng thao tác vuốt setting_display_media: Media nhạy cảm setting_display_media_default: Mặc định setting_display_media_hide_all: Ẩn toàn bộ setting_display_media_show_all: Hiện toàn bộ setting_emoji_style: Phong cách Emoji - setting_expand_spoilers: Luôn mở rộng tút chứa nội dung ẩn + setting_expand_spoilers: Luôn mở rộng nội dung ẩn setting_hide_network: Ẩn quan hệ của bạn setting_missing_alt_text_modal: Cảnh báo tôi trước khi đăng media mà không có alt text - setting_quick_boosting: Bật đăng lại nhanh + setting_quick_boosting: Đăng lại nhanh setting_reduce_motion: Giảm chuyển động ảnh GIF setting_system_font_ui: Phông chữ mặc định hệ thống setting_system_scrollbars_ui: Thanh cuộn mặc định hệ thống @@ -265,7 +268,7 @@ vi: setting_trends: Hiện xu hướng trong ngày setting_unfollow_modal: Hỏi trước khi bỏ theo dõi ai đó setting_use_blurhash: Làm mờ media bị ẩn - setting_use_pending_items: Không tự động làm mới bảng tin + setting_use_pending_items: Chế độ chậm severity: Mức độ nghiêm trọng sign_in_token_attempt: Mã an toàn title: Tựa đề @@ -314,6 +317,7 @@ vi: status_page_url: URL trang trạng thái theme: Chủ đề mặc định thumbnail: Hình thu nhỏ của máy chủ + thumbnail_description: Văn bản thay thế cho hình thu nhỏ trendable_by_default: Cho phép lên xu hướng mà không cần duyệt trước trends: Bật xu hướng wrapstodon: Bật Wrapstodon @@ -355,6 +359,7 @@ vi: hint: Thông tin thêm text: Nội quy settings: + email_subscriptions: Bật đăng ký đọc email indexable: Hiện hồ sơ trong công cụ tìm kiếm show_application: Hiện ứng dụng dùng để đăng tút tag: @@ -383,6 +388,7 @@ vi: role: Vai trò time_zone: Múi giờ user_role: + collection_limit: Số lượng Gói khởi đầu tối đa cho mỗi tài khoản color: Màu huy hiệu highlighted: Hiển thị huy hiệu vai trò trên hồ sơ người dùng name: Tên diff --git a/config/locales/simple_form.zgh.yml b/config/locales/simple_form.zgh.yml index 7ba82b1bf24a9f..510ad69516a5db 100644 --- a/config/locales/simple_form.zgh.yml +++ b/config/locales/simple_form.zgh.yml @@ -1,10 +1,6 @@ --- zgh: simple_form: - hints: - defaults: - setting_display_media_hide_all: ⵙⵏⵜⵍ ⵉⵙⵏⵖⵎⵉⵙⵏ ⴰⴱⴷⴰ - setting_display_media_show_all: ⵙⵎⴰⵍ ⵉⵙⵏⵖⵎⵉⵙⵏ ⴰⴱⴷⴰ labels: account_warning_preset: title: ⴰⵣⵡⵍ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index c2e16f2459c7af..84c7e271b35b47 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -4,7 +4,7 @@ zh-CN: hints: account: attribution_domains: 每行一个域名。这样就可以保护作品免受虚假署名。 - discoverable: 你的公开嘟文和个人资料可能会在 Mastodon 的多个位置展示,你的个人资料可能会被推荐给其他用户。 + discoverable: 你可能会被收录到其他用户创建的收藏列表中。你和你的公开嘟文也可能会通过 Mastodon 上的其他发现功能推荐给其他用户。 display_name: 你的全名或昵称。 fields: 你的主页、人称代词、年龄,以及任何你想要添加的内容。 indexable: 你的公开嘟文会出现在 Mastodon 的搜索结果中。无论是否勾选,与你的嘟文有过交互的人都可能通过搜索找到它们。 @@ -61,9 +61,9 @@ zh-CN: setting_default_quote_policy_private: Mastodon上发布的仅限关注者可见的嘟文无法被他人引用。 setting_default_quote_policy_unlisted: 当其他人引用你时,他们的嘟文也会从热门时间线上隐藏。 setting_default_sensitive: 敏感内容默认隐藏,并在点击后显示 - setting_display_media_default: 隐藏被标记为敏感内容的媒体 - setting_display_media_hide_all: 始终隐藏媒体 - setting_display_media_show_all: 始终显示媒体 + setting_display_media_default: 显示被标记为敏感内容的媒体前显示警告 + setting_display_media_hide_all: 显示所有媒体前都显示警告 + setting_display_media_show_all: 显示所有媒体而不显示警告,包括被标记为敏感内容的媒体 setting_emoji_style: 如何显示Emoji表情符号。选择“自动”将尝试使用原生Emoji,但在旧浏览器中会备选使用Twemoji。 setting_quick_boosting_html: 如果启用,点击 %{boost_icon} 转嘟图标将立即转嘟,而非开启“转嘟/引用”的下拉式菜单。这会使引用嘟文操作的按钮移动到 %{options_icon} (选项)菜单中。 setting_system_scrollbars_ui: 仅对基于 Safari 或 Chromium 内核的桌面端浏览器有效 @@ -109,6 +109,7 @@ zh-CN: status_page_url: 配置一个网址,当服务中断时,人们可以通过该网址查看服务器的状态。 theme: 给未登录访客和新用户使用的主题。 thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。 + thumbnail_description: 一段图像描述,可以帮助视力障碍人士理解其内容。 trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。 trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。 wrapstodon: 为本站用户提供生成他们过去一年使用 Mastodon 情况的趣味总结的功能。此功能在每年12月10日至12月31日提供给这一年发布过至少1条公开嘟文(无论是否设置为在时间线上显示)及至少使用过1个话题标签的用户。 @@ -123,7 +124,7 @@ zh-CN: expires_in: IP 地址是一种有限的资源,它们有时是共享的,并且常常变化。因此,不推荐无限期的 IP 封禁。 ip: 输入 IPv4 或 IPv6 地址。你可以使用 CIDR 语法屏蔽 IP 段。小心不要屏蔽自己! severities: - no_access: 阻止访问所有资源 + no_access: 阻止访问全部资源 sign_up_block: 无法进行新的账号注册 sign_up_requires_approval: 新注册需要你的批准 severity: 选择如何处理来自此 IP 的请求。 @@ -134,6 +135,7 @@ zh-CN: otp: 输入你手机应用上生成的双因素认证代码,或者任意一个恢复代码: webauthn: 如果是 USB 密钥,请确保将其插入,如有必要,请点击它。 settings: + email_subscriptions: 禁用会保留现有的订阅者,而停止发送电子邮件。 indexable: 你的个人资料可能会出现在Google、Bing等的搜索结果中。 show_application: 无论如何,你始终可以看到是哪个应用发布了你的嘟文。 tag: @@ -153,11 +155,12 @@ zh-CN: jurisdiction: 请列出支付运营费用者所在的国家/地区。如果为公司或其他实体,请列出其注册的国家/地区以及相应的城市、地区、领地或州。 min_age: 不应低于你所在地法律管辖权要求的最低年龄。 user: - chosen_languages: 仅选中语言的嘟文会出现在公共时间线上(全不选则显示所有语言的嘟文) + chosen_languages: 仅选中语言的嘟文会出现在公共时间线上。此设置不影响主页时间轴及列表。 date_of_birth: other: 我们必须确保你至少年满 %{count} 岁才能使用 %{domain}。我们不会存储此信息。 role: 角色用于控制用户拥有的权限。 user_role: + collection_limit: 限制具备此角色的单个用户可创建的收藏列表数量。请注意,当你减少这个数字的时候,已经达到该限制的用户并不会因此失去任何收藏列表,只是会不能再创建新的收藏列表。 color: 在界面各处用于标记该角色的颜色,以十六进制 RGB 格式表示 highlighted: 使角色公开可见 name: 角色的公开名称,将在外显为徽章时使用 @@ -175,7 +178,7 @@ zh-CN: labels: account: attribution_domains: 授权展示你的署名的网站 - discoverable: 在发现算法中展示你的账号与嘟文 + discoverable: 将我纳入发现功能 fields: name: 标签 value: 内容 @@ -314,6 +317,7 @@ zh-CN: status_page_url: 状态页网址 theme: 默认主题 thumbnail: 本站缩略图 + thumbnail_description: 缩略图替代文本 trendable_by_default: 允许在未审核的情况下将话题置为热门 trends: 启用热门 wrapstodon: 启用 Wrapstodon 年度回顾 @@ -355,6 +359,7 @@ zh-CN: hint: 补充信息 text: 规则 settings: + email_subscriptions: 启用邮件订阅注册 indexable: 允许搜索引擎索引个人资料 show_application: 显示你发嘟使用的应用 tag: @@ -383,6 +388,7 @@ zh-CN: role: 角色 time_zone: 时区 user_role: + collection_limit: 每个用户收藏列表的最大数量 color: 徽章颜色 highlighted: 在用户资料中显示角色徽章 name: 名称 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 7c57864b2e8dea..326539481f61cd 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -3,7 +3,6 @@ zh-HK: simple_form: hints: account: - discoverable: 你的公開帖文和個人檔案可能會在 Mastodon 的各處被推薦或設為精選,並且可能把你的檔案推薦給其他使用者。 display_name: 你的全名或暱稱。 fields: 你的主頁、代名詞、年齡,任何你想顯示的資訊。 indexable: 你的公開帖文可能會出現在 Mastodon 的搜尋結果中。無論如何,與你帖文互動過的人都能搜尋到它。 @@ -55,9 +54,6 @@ zh-HK: setting_aggregate_reblogs: 請勿顯示新近被轉推的文章(只影響最新被推的文章) setting_always_send_emails: 通常當你積極使用 Mastodon 時,我們不會發送電郵通知給你 setting_default_sensitive: 敏感媒體預設隱藏,且按一下即可重新顯示 - setting_display_media_default: 隱藏標為敏感的媒體 - setting_display_media_hide_all: 總是隱藏所有媒體 - setting_display_media_show_all: 總是顯示標為敏感的媒體 setting_use_blurhash: 漸變圖樣會基於隱藏媒體內容產生,但所有細節會變得模糊 setting_use_pending_items: 關閉自動滾動更新,時間軸會在點擊後更新 username: 你可以使用字母、數字及底線 @@ -121,8 +117,6 @@ zh-HK: show_application: 你總能看到哪個應用程式發佈你的帖文。 tag: name: 你只能變更大小寫(以使其更易讀)。 - user: - chosen_languages: 只有被選擇的語言會在公開時間軸內顯示 user_role: color: 介面各處用於角色的顏色,是以十六進制 RGB 格式表示 highlighted: 這使該角色公開可見 @@ -135,7 +129,6 @@ zh-HK: url: 事件將被傳送至何處 labels: account: - discoverable: 探索演算法推薦的個人檔案和帖文 fields: name: 標籤 value: 內容 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index fcc6694b898a31..7e5a65f020aa9b 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -4,7 +4,7 @@ zh-TW: hints: account: attribution_domains: 每行一個。以保護偽造署名。 - discoverable: 公開嘟文及個人檔案可能於各 Mastodon 功能中被推薦,並且您的個人檔案可能被推薦至其他使用者。 + discoverable: 您可能會被收錄於其他使用者建立之收藏名單中。您與您的公開貼文也可能於 Mastodon 平台上的其他探索功能中,被推薦至其他使用者。 display_name: 完整名稱或暱稱。 fields: 烘培雞、自我認同代稱、年齡,及任何您想分享的。 indexable: 您的公開嘟文可能會顯示於 Mastodon 之搜尋結果中。曾與您嘟文互動過的人可能無論如何都能搜尋它們。 @@ -61,9 +61,9 @@ zh-TW: setting_default_quote_policy_private: Mastodon 上發佈之僅限跟隨者嘟文無法被其他使用者引用。 setting_default_quote_policy_unlisted: 當其他人引用您時,他們的嘟文也會自熱門時間軸隱藏。 setting_default_sensitive: 敏感內容媒體為預設隱藏,且按一下即可重新顯示 - setting_display_media_default: 隱藏標為敏感內容的媒體 - setting_display_media_hide_all: 總是隱藏所有媒體 - setting_display_media_show_all: 總是顯示標為敏感內容的媒體 + setting_display_media_default: 將標記為敏感內容之多媒體隱藏於警告之後 + setting_display_media_hide_all: 將所有多媒體內容隱藏於警告之後 + setting_display_media_show_all: 不警告並顯示所有多媒體內容,包括標記為敏感內容者 setting_emoji_style: 如何顯示 emoji 表情符號。「自動」將嘗試使用原生 emoji ,但於老式瀏覽器使用 Twemoji。 setting_quick_boosting_html: 當啟用時,點擊 %{boost_icon} 轉嘟圖示將立即轉嘟而非開啟轉嘟/引用之下拉選單。將引用嘟文操作移至 %{options_icon} (選項)選單中。 setting_system_scrollbars_ui: 僅套用至基於 Safari 或 Chrome 之桌面瀏覽器 @@ -95,7 +95,7 @@ zh-TW: favicon: WEBP、PNG、GIF、或 JPG。使用自訂圖示替代預設 Mastodon favicon 圖示。 landing_page: 選擇當新訪客第一次造訪您伺服器時所見之頁面。若您選擇「熱門趨勢」,則該功能必須於探索設定中啟用。若您選擇「本站時間軸」,則探索設定中「允許瀏覽本站嘟文之即時內容」功能必須設定為「任何人」。 mascot: 覆寫進階網頁介面中的圖例。 - media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體內容將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。 + media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體附加檔案將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。 min_age: 使用者將於註冊時被要求確認他們的生日 peers_api_enabled: 浩瀚聯邦宇宙中與此伺服器曾經擦肩而過的網域列表。不包含關於您是否與此伺服器是否有與之串連,僅僅表示您的伺服器已知此網域。這是供收集聯邦宇宙中一般性統計資料服務使用。 profile_directory: 個人檔案目錄將會列出那些有選擇被發現的使用者。 @@ -109,6 +109,7 @@ zh-TW: status_page_url: 當服務中斷時,可以提供使用者了解伺服器資訊頁面之 URL theme: 未登入之訪客或新使用者所見之佈景主題。 thumbnail: 大約 2:1 圖片會顯示於您伺服器資訊之旁。 + thumbnail_description: 用以幫助視覺障礙者理解圖片內容之描述。 trendable_by_default: 跳過手動審核熱門內容。您仍能於登上熱門趨勢後移除個別內容。 trends: 熱門趨勢將顯示於您伺服器上正在吸引大量注意力之嘟文、主題標籤、或新聞。 wrapstodon: 提供替本站使用者產生他們過去一年使用 Mastodon 的趣味總結。此功能於每年十二月十號至三十一號提供至於年中發過至少一則公開嘟文(無論顯示於時間軸與否)及至少使用一則主題標籤之使用者。 @@ -134,6 +135,7 @@ zh-TW: otp: 請輸入產生自您手機 App 的兩階段驗證碼,或輸入其中一個備用驗證碼: webauthn: 若它是 USB 安全金鑰,請確認已正確插入,如有需要請觸擊。 settings: + email_subscriptions: 停用將保留既有訂閱者,但會停止寄送電子郵件。 indexable: 個人檔案可能出現於 Google、Bing、或其他搜尋引擎。 show_application: 將總是顯示您發嘟文之應用程式 tag: @@ -153,11 +155,12 @@ zh-TW: jurisdiction: 列出帳單支付人之居住國家。若為公司或其他實體,請列出其註冊地所在的國家,及城市、地區、領土、或州別等。 min_age: 不應低於您所屬法律管轄區要求之最低年齡。 user: - chosen_languages: 當選取時,只有選取語言之嘟文會於公開時間軸中顯示 + chosen_languages: 當勾選時,公開時間軸將僅顯示所選擇語言之嘟文。此設定不會影響您首頁時間軸與列表。 date_of_birth: other: 我們必須確認您至少年滿 %{count} 以使用 %{domain}。我們不會儲存此資料。 role: 角色控制使用者有哪些權限。 user_role: + collection_limit: 限制此角色單一使用者能建立收藏名單之數量。請注意,當您降低此數值時,已超過此限制之使用者將不會失去任何收藏名單,但將無法新增更多。 color: 於整個使用者介面中用於角色的顏色,十六進位格式的 RGB highlighted: 這將使角色公開可見 name: 角色的公開名稱,如果角色設定為顯示為徽章 @@ -175,7 +178,7 @@ zh-TW: labels: account: attribution_domains: 允許對您予與信譽之網站 - discoverable: 於探索演算法中推薦個人檔案及嘟文 + discoverable: 將我納入至探索體驗 fields: name: 標籤 value: 內容 @@ -314,6 +317,7 @@ zh-TW: status_page_url: 狀態頁面 URL theme: 預設佈景主題 thumbnail: 伺服器縮圖 + thumbnail_description: 圖片預覽 ALT 說明文字 trendable_by_default: 允許熱門趨勢直接顯示,不需經過審核 trends: 啟用熱門趨勢 wrapstodon: 啟用 Mastodon 年度回顧 @@ -355,6 +359,7 @@ zh-TW: hint: 其他資訊 text: 規則 settings: + email_subscriptions: 啟用電子郵件訂閱註冊 indexable: 於搜尋引擎中包含個人檔案頁面 show_application: 顯示您發嘟文之應用程式 tag: @@ -383,6 +388,7 @@ zh-TW: role: 角色 time_zone: 時區 user_role: + collection_limit: 每位使用者收藏名單數量上限 color: 識別顏色 highlighted: 於使用者個人檔案中顯示角色徽章 name: 名稱 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 0a684eeb4cd54d..f8d138068a6b0e 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -935,8 +935,6 @@ sk: your_appeal_approved: Tvoja námietka bola schválená your_appeal_pending: Odoslal si námietku edit_profile: - basic_information: Základné informácie - hint_html: "Upravte, čo ľudia vidia vo vašom verejom profile a pri vašich príspevkoch. S vyplneným profilom a nahratou profilovou fotkou sa zvýšia šance, že vás iní ľudia budú sledovať a budú s vami komunikovať." other: Ostatné errors: '400': Požiadavka, ktorú si odoslal/a, bola buď nesprávna, alebo znehodnotená. @@ -971,10 +969,8 @@ sk: mutes: Stíšil/a si storage: Úložisko médií featured_tags: - add_new: Pridať nový errors: limit: Už ste si predvolili najvyšší možný počet hashtagov - hint_html: "Zobrazte vo svojom profile vaše najvýznamnejšie hashtagy. Zvýraznené hashtagy majú viditeľné miesto vo vašom profile a umožňujú vám rýchly prístup k vašim príspevkom, aby ste mali svoje diela a dlhodobé projekty vždy poruke." filters: contexts: account: Profily @@ -1080,12 +1076,6 @@ sk: password: heslom webauthn: bezpečnostnými kľúčmi title: História overení - mail_subscriptions: - unsubscribe: - emails: - notification_emails: - reblog: e-mailové upozornenia na zdieľania - title: Ukonči odber media_attachments: validations: images_and_video: K príspevku ktorý už obsahuje obrázky nemôžeš priložiť video diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 6061b6fc8ede8f..ca0fd7fe7dc162 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1227,7 +1227,6 @@ sl: application_mailer: notification_preferences: Spremenite e-poštne nastavitve salutation: "%{name}," - settings: 'Spremenite e-poštne nastavitve: %{link}' unsubscribe: Odjavi od naročnine view: 'Pogled:' view_profile: Ogled profila @@ -1410,8 +1409,6 @@ sl: your_appeal_pending: Oddali ste pritožbo your_appeal_rejected: Vaša pritožba je bila zavržena edit_profile: - basic_information: Osnovni podatki - hint_html: "Prilagodite, kaj ljudje vidijo na vašem javnem profilu in poleg vaših objav. Drugi vam bodo raje sledili nazaj in z vami klepetali, če boste imeli izpolnjen profil in nastavljeno profilno sliko." other: Drugo emoji_styles: auto: Samodejno @@ -1450,10 +1447,8 @@ sl: mutes: Utišani storage: Shranjeni mediji featured_tags: - add_new: Dodaj novo errors: limit: Ste že dodali največje število ključnikov - hint_html: "Kaj so izpostavljeni ključniki? Prikazani so vidno na vašem javnem profilu in ljudem omogočajo brskanje po vaših javnih objavah posebej pod temi ključniki. So odlično orodje za spremljanje ustvarjalnih del ali dolgoročnih projektov." filters: contexts: account: Profili @@ -1685,21 +1680,6 @@ sl: failed_sign_in_html: Spodletela prijava z metodo %{method} iz %{ip} (%{browser}) successful_sign_in_html: Uspešna prijava z metodo %{method} iz %{ip} (%{browser}) title: Zgodovina overjanja - mail_subscriptions: - unsubscribe: - action: Da, odjavi me - complete: Odjavljeni - confirmation_html: Ali se res želite odjaviti od prejemanja %{type} za Mastodon na %{domain} na svojo e-pošto %{email}? Kadarkoli se lahko znova prijavite iz svojih nastavitev e-poštnih obvestil. - emails: - notification_emails: - favourite: e-sporočil z obvestili o priljubljenosti - follow: e-sporočil z obvestili o sledenju - follow_request: e-sporočil o zahtevah za sledenje - mention: e-sporočil z obvestili o omembah - reblog: e-sporočil z obvestili o izpostavljanju - resubscribe_html: Če ste se odjavili po pomoti, se lahko znova prijavite iz svojih nastavitev e-poštnih obvestil. - success_html: Nič več ne boste prejemali %{type} za Mastodon na %{domain} na svoj e-naslov %{email}. - title: Odjavi od naročnine media_attachments: validations: images_and_video: Videoposnetka ni mogoče priložiti objavi, ki že vsebuje slike diff --git a/config/locales/sq.yml b/config/locales/sq.yml index caf915df780a4f..6b2a166153b173 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -757,6 +757,7 @@ sq: other: "%{count} përdorues" categories: administration: Administrim + email: Email invites: Ftesa moderation: Moderim special: Special @@ -785,6 +786,8 @@ sq: manage_blocks_description: U lejon përdoruesve të bllkojnë shërbime email dhe adresa IP manage_custom_emojis: Të Administrojë Emoxhi Vetjake manage_custom_emojis_description: U lejon përdoruesve të administrojnë te shërbyesi emoxhi vetjake + manage_email_subscriptions: Administroni Pajtime Me Email + manage_email_subscriptions_description: Lejojini përdoruesit të pajtohen me email te përdorues me këtë leje manage_federation: Të Administrojë Federim manage_federation_description: U lejon përdoruesve të bllokojnë ose lejojnë federim me përkatësi të tjera dhe të kontrollojnë shpërndarjen manage_invites: Të Administrojë Ftesa @@ -1220,7 +1223,6 @@ sq: application_mailer: notification_preferences: Ndryshoni parapëlqime rreth email-esh salutation: "%{name}," - settings: 'Ndryshoni parapëlqime rreth email-esh: %{link}' unsubscribe: Shpajtohuni view: 'Parje:' view_profile: Shihni profilin @@ -1405,9 +1407,42 @@ sq: your_appeal_pending: Keni parashtruar një apelim your_appeal_rejected: Apelimi juaj është hedhur poshtë edit_profile: - basic_information: Hollësi elementare - hint_html: "Përshtatni ç’shohin njerëzit në profilin tuaj publik dhe në krah të postimeve tuaja. Personat e tjerë ka më shumë gjasa t’ju ndjekin dhe ndërveprojnë me ju, kur keni të plotësuar profilin dhe një foto profili." other: Tjetër + redesign_body: Përpunimi i profilit tanimë mund të kryhet drejt e nga faqja e profilit. + redesign_button: Kalo atje + redesign_title: Ka një rrugë të re përpunimi profili + email_subscription_mailer: + confirmation: + action: Ripohoni adresë email + instructions_to_confirm: Ripohoni se do të donit të merrni email -e nga %{name} (@%{acct}), kur boton postime të reja. + instructions_to_ignore: Nëse s’jeni i sigurt pse e morët këtë email, mund ta fshini. S’do të pajtoheni, po qe se nuk klikoni mbi lidhjen më sipër. + subject: Ripohoni adresën tuaj email + title: Të merren përditësime me email nga %{name}? + notification: + create_account: Krijoni një llogari Mastodon + footer: + privacy_html: Email-et dërgohen nga %{domain}, një shërbyes i bazuar në Mastodon. Që të kuptoni se si ky shërbyes përpunon të dhënat tuaja personale, referojuni Rregullave të Privatësisë. + reason_for_email_html: Po e merrni këtë email ngaqë keni zgjedhur përditësime me email nga %{name}. S’doni t’i merrni këta email-e? Shpajtohuni + interact_with_this_post: + one: Ndërveproni me këtë postim dhe zbuloni më tepër si ai. + other: Ndërveproni me këto postime dhe zbuloni më tepër. + subject: + plural: Postime të reja nga %{name} + singular: 'Postim i ri: “%{excerpt}”' + title: + plural: Postime të reja nga %{name} + singular: 'Postim i ri: “%{excerpt}”' + email_subscriptions: + active: Aktiv + confirmations: + show: + changed_your_mind: Ndërruat mendje? + success_html: Tani do të filloni të merrni email-e, kur %{name} boton postime të reja. Shtojeni %{sender} te kontaktet tuaj, që këto postime të mos përfundojnë te dosja juaj e Të padëshiruarve. + title: U regjistruat + unsubscribe: Shpajtohuni + inactive: Joaktiv + status: Gjendje + subscribers: Pajtimtarë errors: '400': Kërkesa që parashtruar qe e pavlefshme ose e keqformuar. '403': S’keni leje të shihni këtë faqe. @@ -1442,10 +1477,8 @@ sq: mutes: Heshtoni storage: Depozitë media featured_tags: - add_new: Shtoni të re errors: limit: Keni përdorur tashmë numrin maksimum të hashtag-ëve - hint_html: "Çfarë janë hashtag-ët e zgjedhur? Këta shfaqen dukshëm te profili juaj publik dhe u lejojnë të tjerëve të shfletojnë postime tuajt publikë posaçërisht nën këta hashtag-ë. Janë një mjet i goditur për të ndjekur punë krijuese ose projekte afatgjata." filters: contexts: account: Profile @@ -1638,21 +1671,6 @@ sq: failed_sign_in_html: Dështoi përpjekje hyrjeje me %{method} nga %{ip} (%{browser}) successful_sign_in_html: Hyrje e suksesshme me %{method} nga %{ip} (%{browser}) title: Historik mirëfilltësimesh - mail_subscriptions: - unsubscribe: - action: Po, shpajtomëni - complete: U shpajtuat - confirmation_html: Jeni i sigurt se doni të shpajtoheni nga marrje %{type} për Mastodon te %{domain} në email-in tuaj %{email}? Mundeni përherë të ripajtoheni që nga rregullimet tuaja për njoftime me email. - emails: - notification_emails: - favourite: email-e njoftimesh parapëlqimesh - follow: email-e njoftimesh ndjekjeje - follow_request: email-e kërkesash ndjekjeje - mention: email-e njoftimesh përmendjesh - reblog: email-e njoftimesh përforcimesh - resubscribe_html: Nëse u shpajtuat gabimisht, mund të ripajtoheni që nga rregullimet tuaja për njoftime me email. - success_html: S’do të merrni më %{type} për Mastodon te %{domain} në email-in tuaj te %{email}. - title: Shpajtohuni media_attachments: validations: images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë @@ -1698,6 +1716,25 @@ sq: copy_account_note_text: 'Ky përdorues ka ikur prej %{acct}, ja ku janë shënimet tuaja të mëparshme mbi të:' navigation: toggle_menu: Shfaq/Fshih menunë + notification_fallbacks: + added_to_collection: + title_html: "%{name} ju shtoi te një koleksion" + admin_report: + title_html: "%{name} raportoi %{target}" + admin_sign_up: + title_and_others_html: + one: U regjistrua %{name} dhe një tjetër + other: U regjistruan %{name} dhe %{count} të tjerë + title_html: U regjistrua %{name} + collection_update: + title_html: "%{name} përditësoi një koleksion në të cilin gjendeni" + generic: + sign_in: Bëni hyrjen te aplikacioni web Mastodon + moderation_warning: + title: Keni marrë një sinjalizim moderimi. + severed_relationships: + summary_html: Një përgjegjës prej %{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ë. %{link} që të merrni një listë të marrëdhënieve të humbura. + title: U humbën lidhje me %{name} notification_mailer: admin: report: @@ -1790,6 +1827,8 @@ sq: posting_defaults: Parazgjedhje postimesh public_timelines: Rrjedha kohore publike privacy: + email_subscriptions: Dërgo postime me email + email_subscriptions_hint_html: Shtoni te profili juaj një fotmular regjistrimi me email, që u shfaqet përdoruesve jo të futur në llogari. Kur vizitorët japin adresën e tyre email dhe zgjedhin, Mastodon-i do të dërgojë përditësime me email për postimet tuaja publike. hint_html: "Përshtatni mënyrën se si dëshironi të gjenden prej të tjerëve profili dhe postimet tuaja. Një larmi veçorish të Mastodon-it mund t’ju ndihmojnë të shtriheni në një publik më të gjerë, kur aktivizohen. Ndaluni një çast t’i shqyrtoni këto rregullime, për t’u siguruar se i përshtaten rastit tuaj." privacy: Privatësi privacy_hint_html: Kontrolloni sa doni të tregoni prej vetes për të mirën e të tjerëve. Njerëzit zbulojnë profile interensante dhe aplikacione të lezetshme duke shfletuar ndjekjet e personave të tjerë dhe duke parë se prej cilëve aplikacione postuan, por mund të parapëlqeni ta mbani të fshehur këtë. @@ -2052,6 +2091,28 @@ sq: resume_app_authorization: Rinis autorizim aplikacioni role_requirement: "%{domain} lyp që të ujdisni Mirëfilltësim Dyfaktorësh, para se të përdorni Mastodon-in." webauthn: Kyçe sigurie + unsubscriptions: + create: + action: Kalo te faqja hyrëse e shërbyesit + email_subscription: + confirmation_html: S’do të merrni më email-e nga %{name}. + title: U shpajtuat + user: + confirmation_html: S’do të merrni më %{type} nga Mastodon-i në %{domain}. + notification_emails: + favourite: email-e njoftimesh parapëlqimesh + follow: email-e njoftimesh ndjekjeje + follow_request: email-e kërkesash ndjekjeje + mention: email-e njoftimesh përmendjesh + reblog: email-e njoftimesh përforcimesh + show: + action: Shpajtohuni + email_subscription: + confirmation_html: Do të reshtni së marri email-e, kur kjo llogari të botojë postime të reja. + title: Të bëhet shpajtim nga %{name}? + user: + confirmation_html: Do të reshtni së marri %{type} nga Mastodon-i në %{domain}. + title: Të bëhet shpajtim nga %{type}? user_mailer: announcement_published: description: 'Përgjegjësit e %{domain} po bëjnë një njoftim:' diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 3f9eee3caed723..82b52b8240628c 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1162,8 +1162,6 @@ sr-Latn: your_appeal_pending: Priložili ste žalbu your_appeal_rejected: Vaša žalba je odbijena edit_profile: - basic_information: Osnovne informacije - hint_html: "Prilagodite šta ljudi vide na vašem javnom profilu i pored vaših objava. Veća je verovatnoća da će vas drugi pratiti i komunicirati sa vama kada imate popunjen profil i sliku profila." other: Ostalo errors: '400': Zahtev koji ste podneli je bio nelegitiman ili u pogrešnom formatu. @@ -1199,10 +1197,8 @@ sr-Latn: mutes: Ignorišete storage: Multimedijalno skladište featured_tags: - add_new: Dodaj novu errors: limit: Već ste istakli maksimalan broj heš oznaka - hint_html: "Istaknite najvažnije heš oznake na svom profilu. Odličan alat za praćenje vaših kreativnih radova i dugoročnih projekata, istaknute heš oznake su istaknute na vašem profilu i omogućuju brz pristup vašim objavama." filters: contexts: account: Profili @@ -1357,11 +1353,6 @@ sr-Latn: failed_sign_in_html: Neuspešan pokušaj prijavljivanja putem %{method} sa %{ip} (%{browser}) successful_sign_in_html: Uspešan pokušaj prijavljivanja putem %{method} sa %{ip} (%{browser}) title: Istorija autentifikacije - mail_subscriptions: - unsubscribe: - action: Da, odjavi me - complete: Odjavljen - title: Odjavi se media_attachments: validations: images_and_video: Ne može da se prikači video na status koji već ima slike diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 35d845bb1ea3c2..51ad0e572b294f 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1192,8 +1192,6 @@ sr: your_appeal_pending: Приложили сте жалбу your_appeal_rejected: Ваша жалба је одбијена edit_profile: - basic_information: Основне информације - hint_html: "Прилагодите шта људи виде на вашем јавном профилу и поред ваших објава. Већа је вероватноћа да ће вас други пратити и комуницирати са вама када имате попуњен профил и слику профила." other: Остало errors: '400': Захтев који сте поднели је био нелегитиман или у погрешном формату. @@ -1229,10 +1227,8 @@ sr: mutes: Игноришете storage: Мултимедијално складиште featured_tags: - add_new: Додај нову errors: limit: Већ сте истакли максималан број хеш ознака - hint_html: "Истакните најважније хеш ознаке на свом профилу. Одличан алат за праћење ваших креативних радова и дугорочних пројеката, истакнуте хеш ознаке су истакнуте на вашем профилу и омогућују брз приступ вашим објавама." filters: contexts: account: Профили @@ -1387,11 +1383,6 @@ sr: failed_sign_in_html: Неуспешан покушај пријављивања путем %{method} са %{ip} (%{browser}) successful_sign_in_html: Успешан покушај пријављивања путем %{method} са %{ip} (%{browser}) title: Историја аутентификације - mail_subscriptions: - unsubscribe: - action: Да, одјави ме - complete: Одјављен - title: Одјави се media_attachments: validations: images_and_video: Не може да се прикачи видео на статус који већ има слике diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d1b61289dc2eea..8a7262b0961aa6 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -12,6 +12,9 @@ sv: followers: one: Följare other: Följare + following: + one: Följer + other: Följer instance_actor_flash: Detta konto är en virtuell aktör som används för att representera servern i sig och inte någon enskild användare. Den används för federeringsändamål och bör inte stängas av. last_active: senast aktiv link_verified_on: Ägarskap för denna länk kontrollerades den %{date} @@ -759,6 +762,7 @@ sv: categories: administration: Administration devops: DevOps + email: E-post invites: Inbjudningar moderation: Moderering special: Särskild @@ -787,6 +791,8 @@ sv: manage_blocks_description: Tillåter användare att blockera e-postleverantörer och IP-adresser manage_custom_emojis: Hantera egna emojier manage_custom_emojis_description: Tillåter användare att hantera egna emojier på servern + manage_email_subscriptions: Hantera e-postprenumerationer + manage_email_subscriptions_description: Tillåt användare att prenumerera på användare med denna behörighet via e-post manage_federation: Hantera federering manage_federation_description: Tillåter användare att blockera eller tillåta federering med andra domäner, samt kontrollera levererbarhet manage_invites: Hantera inbjudningar @@ -1228,7 +1234,6 @@ sv: application_mailer: notification_preferences: Ändra e-postpreferenser salutation: "%{name}," - settings: 'Ändra e-postinställningar: %{link}' unsubscribe: Avprenumerera view: 'Granska:' view_profile: Visa profil @@ -1278,6 +1283,7 @@ sv: progress: confirm: Bekräfta e-postadress details: Dina uppgifter + list: Registreringsframsteg review: Vår recension rules: Acceptera regler providers: @@ -1412,9 +1418,42 @@ sv: your_appeal_pending: Du har lämnat in en överklagan your_appeal_rejected: Din överklagan har avvisats edit_profile: - basic_information: Allmän information - hint_html: "Anpassa vad folk ser på din offentliga profil och bredvid dina inlägg. Andra personer är mer benägna att följa dig och interagera med dig när du har en ifylld profil och en profilbild." other: Övrigt + redesign_body: Profilredigering kan nu nås direkt från profilsidan. + redesign_button: Gå dit + redesign_title: Det finns en ny profilredigeringsupplevelse + email_subscription_mailer: + confirmation: + action: Bekräfta e-postadress + instructions_to_confirm: Bekräfta att du vill ta emot e-post från %{name} (@%{acct}) när de publicerar nya inlägg. + instructions_to_ignore: Om du inte är säker på varför du fick detta e-postmeddelande kan du radera det. Du kommer inte att prenumerera om du inte klickar på länken ovan. + subject: Bekräfta din e-postadress + title: Få e-postuppdateringar från %{name}? + notification: + create_account: Skapa ett Mastodon-konto + footer: + privacy_html: E-postmeddelanden skickas från %{domain}, en server som drivs av Mastodon. För att förstå hur denna server behandlar dina personuppgifter, se sekretesspolicy:n. + reason_for_email_html: Du får detta e-postmeddelande eftersom du valt att ta emot e-postuppdateringar från %{name}. Vill du inte ta emot dessa e-postmeddelanden? Avprenumerera + interact_with_this_post: + one: Interagera med detta inlägg och upptäck mer som det. + other: Interagera med dessa inlägg och upptäck mer. + subject: + plural: Nya inlägg från %{name} + singular: 'Nytt inlägg: "%{excerpt}"' + title: + plural: Nya inlägg från %{name} + singular: 'Nytt inlägg: "%{excerpt}"' + email_subscriptions: + active: Aktiv + confirmations: + show: + changed_your_mind: Ändrade du dig? + success_html: Du kommer nu att börja få e-postmeddelanden när %{name} publicerar nya inlägg. Lägg till %{sender} till dina kontakter så att dessa inlägg inte hamnar i din skräppostmapp. + title: Du är registrerad + unsubscribe: Avprenumerera + inactive: Inaktiv + status: Status + subscribers: Prenumeranter emoji_styles: auto: Automatiskt native: Ursprunglig @@ -1453,10 +1492,8 @@ sv: mutes: Du tystar storage: Medialagring featured_tags: - add_new: Lägg till ny errors: limit: Du har redan fäst det maximala antalet hashtags - hint_html: "Vad är utvalda hashtaggar? De visas tydligt på din offentliga profil och låter andra bläddra bland dina offentliga inlägg specifikt under dessa hashtaggar. De är ett bra verktyg för att hålla reda på kreativa arbeten eller långsiktiga projekt." filters: contexts: account: Profiler @@ -1649,21 +1686,6 @@ sv: failed_sign_in_html: Misslyckat inloggningsförsök med %{method} från %{ip} (%{browser}) successful_sign_in_html: Lyckad inloggning med %{method} från %{ip} (%{browser}) title: Autentiseringshistorik - mail_subscriptions: - unsubscribe: - action: Ja, avsluta prenumerationen - complete: Prenumeration avslutad - confirmation_html: Är du säker på att du vill avregistrera dig från att ta emot %{type} för Mastodon på %{domain} med din e-post på %{email}? Du kan alltid återprenumerera bland dina e-postmeddelandeinställningar. - emails: - notification_emails: - favourite: aviseringsmejl för favoriserade inlägg - follow: aviseringsmejl för följda inlägg - follow_request: aviseringsmejl för följdförfrågningar - mention: aviseringsmejl för inlägg där du nämns - reblog: aviseringsmejl för förhöjda inlägg - resubscribe_html: Om du slutat prenumerera av misstag kan du återprenumerera i dina e-postaviseringsinställningar. - success_html: Du får inte längre %{type} för Mastodon på %{domain} till din e-post på %{email}. - title: Avsluta prenumeration media_attachments: validations: images_and_video: Det går inte att bifoga en video till ett inlägg som redan innehåller bilder @@ -1801,6 +1823,8 @@ sv: posting_defaults: Standardinställningar för inlägg public_timelines: Publika tidslinjer privacy: + email_subscriptions: Skicka inlägg via e-post + email_subscriptions_hint_html: Lägg till ett e-postregistreringsformulär till din profil som visas för utloggade användare. När en besökare anger sin e-postadress och väljer det kommer Mastodon att skicka e-postuppdateringar för dina offentliga inlägg. hint_html: "Anpassa hur du vill att din profil och dina inlägg ska hittas. En mängd funktioner i Mastodon kan hjälpa dig att nå en bredare publik när den är aktiverad. Ta en stund att granska dessa inställningar för att se att de passar ditt användningsfall." privacy: Integritet privacy_hint_html: Kontrollera hur mycket du vill avslöja till förmån för andra. Andra upptäcker intressanta profiler och coola appar genom att bläddra bland vad andra följer och se vilka appar de lägger upp från, men du kanske föredrar att hålla det dolt. @@ -2064,6 +2088,28 @@ sv: resume_app_authorization: Fortsätt app-autentisering role_requirement: "%{domain} kräver att du ställer in tvåfaktorsautentisering innan du kan använda Mastodon." webauthn: Säkerhetsnycklar + unsubscriptions: + create: + action: Gå till serverns hemsida + email_subscription: + confirmation_html: Du kommer inte längre att få e-post från %{name}. + title: Du har avprenumererat + user: + confirmation_html: Du får inte längre %{type} från Mastodon på %{domain}. + notification_emails: + favourite: aviseringsmejl för favoriserade inlägg + follow: aviseringsmejl för följda inlägg + follow_request: aviseringsmejl för följdförfrågningar + mention: aviseringsmejl för inlägg där du nämns + reblog: aviseringsmejl för förhöjda inlägg + show: + action: Avprenumerera + email_subscription: + confirmation_html: Du kommer att sluta ta emot e-post när detta konto publicerar nya inlägg. + title: Avprenumerera från %{name}? + user: + confirmation_html: Du kommer sluta ta emot %{type} från Mastodon på %{domain}. + title: Avprenumerera från %{type}? user_mailer: announcement_published: description: 'Administratörerna på %{domain} gör ett tillkännagivande:' diff --git a/config/locales/th.yml b/config/locales/th.yml index b3e24132355747..f94f0641504ab9 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1124,7 +1124,6 @@ th: application_mailer: notification_preferences: เปลี่ยนการกำหนดลักษณะอีเมล salutation: "%{name}," - settings: 'เปลี่ยนการกำหนดลักษณะอีเมล: %{link}' unsubscribe: เลิกบอกรับ view: 'ดู:' view_profile: ดูโปรไฟล์ @@ -1297,8 +1296,6 @@ th: your_appeal_pending: คุณได้ส่งการอุทธรณ์ your_appeal_rejected: ปฏิเสธการอุทธรณ์ของคุณแล้ว edit_profile: - basic_information: ข้อมูลพื้นฐาน - hint_html: "ปรับแต่งสิ่งที่ผู้คนเห็นในโปรไฟล์สาธารณะของคุณและถัดจากโพสต์ของคุณ ผู้คนอื่น ๆ มีแนวโน้มที่จะติดตามคุณกลับและโต้ตอบกับคุณมากขึ้นเมื่อคุณมีโปรไฟล์ที่กรอกแล้วและรูปภาพโปรไฟล์" other: อื่น ๆ errors: '400': คำขอที่คุณได้ส่งไม่ถูกต้องหรือผิดรูปแบบ @@ -1334,10 +1331,8 @@ th: mutes: คุณซ่อน storage: ที่เก็บข้อมูลสื่อ featured_tags: - add_new: เพิ่มใหม่ errors: limit: คุณได้แสดงแฮชแท็กถึงจำนวนสูงสุดไปแล้ว - hint_html: "แสดงแฮชแท็กที่สำคัญที่สุดของคุณในโปรไฟล์ของคุณ เครื่องมือที่ยอดเยี่ยมสำหรับการติดตามงานสร้างสรรค์และโครงการระยะยาวของคุณ จะแสดงแฮชแท็กที่น่าสนใจอย่างเด่นชัดในโปรไฟล์ของคุณและอนุญาตให้เข้าถึงโพสต์ของคุณเองได้อย่างรวดเร็ว" filters: contexts: account: โปรไฟล์ @@ -1508,21 +1503,6 @@ th: failed_sign_in_html: ความพยายามในการลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) ล้มเหลว successful_sign_in_html: ลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) สำเร็จ title: ประวัติการรับรองความถูกต้อง - mail_subscriptions: - unsubscribe: - action: ใช่ เลิกบอกรับ - complete: เลิกบอกรับแล้ว - confirmation_html: คุณแน่ใจหรือไม่ว่าต้องการเลิกบอกรับจากการรับ %{type} สำหรับ Mastodon ใน %{domain} ไปยังอีเมลของคุณที่ %{email}? คุณสามารถบอกรับใหม่ได้เสมอจาก การตั้งค่าการแจ้งเตือนอีเมล ของคุณ - emails: - notification_emails: - favourite: อีเมลการแจ้งเตือนการชื่นชอบ - follow: อีเมลการแจ้งเตือนการติดตาม - follow_request: อีเมลคำขอติดตาม - mention: อีเมลการแจ้งเตือนการกล่าวถึง - reblog: อีเมลการแจ้งเตือนการดัน - resubscribe_html: หากคุณได้เลิกบอกรับโดยไม่ได้ตั้งใจ คุณสามารถบอกรับใหม่ได้จาก การตั้งค่าการแจ้งเตือนอีเมล ของคุณ - success_html: คุณจะไม่ได้รับ %{type} สำหรับ Mastodon ใน %{domain} ไปยังอีเมลของคุณที่ %{email} อีกต่อไป - title: เลิกบอกรับ media_attachments: validations: images_and_video: ไม่สามารถแนบวิดีโอกับโพสต์ที่มีภาพอยู่แล้ว diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d58aab2664e264..b601f2d36d7d07 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -762,6 +762,7 @@ tr: categories: administration: Yönetim devops: DevOps + email: E-posta invites: Davetler moderation: Denetim special: Özel @@ -790,6 +791,8 @@ tr: manage_blocks_description: Kullanıcıların e-posta sağlayıcıları ve IP adreslerini engellemesine izin verir manage_custom_emojis: Özel İfadeleri Yönetme manage_custom_emojis_description: Kullanıcıların sunucudaki özel ifadeleri yönetmesine izin verir + manage_email_subscriptions: E-posta Aboneliklerini Yönet + manage_email_subscriptions_description: Kullanıcılara bu izne sahip diğer kullanıcıları e-posta yoluyla takip etme olanağı verin manage_federation: Birleştirme Yönetme manage_federation_description: Kullanıcıların diğer alan adlarıyla birleştirmeye izin vermesi veya engellemesine ve teslim edilebilirliği denetlemesine izin verir manage_invites: Davetleri Yönetme @@ -1231,7 +1234,6 @@ tr: application_mailer: notification_preferences: E-posta tercihlerini değiştir salutation: "%{name}," - settings: 'E-posta tercihlerini değiştir: %{link}' unsubscribe: Abonelikten çık view: 'Görüntüle:' view_profile: Profili görüntüle @@ -1416,9 +1418,42 @@ tr: your_appeal_pending: Bir itiraz gönderdiniz your_appeal_rejected: İtirazınız reddedildi edit_profile: - basic_information: Temel bilgiler - hint_html: "İnsanlara herkese açık profilinizde ve gönderilerinizin yanında ne göstermek istediğinizi düzenleyin. Dolu bir profile ve bir profil resmine sahip olduğunuzda diğer insanlar daha yüksek ihtimalle sizi takip etmek ve sizinle etkileşime geçmek isteyeceklerdir." other: Diğer + redesign_body: Profil düzenlemeye şimdi doğrudan profil sayfasından da erişilebilir. + redesign_button: Git + redesign_title: Yeni bir profile düzenleme deneyimi var + email_subscription_mailer: + confirmation: + action: E-posta adresini onayla + instructions_to_confirm: "%{name} (@%{acct}) yeni bir gönderi yayınladığında e-posta almak istediğinizi onaylayın." + instructions_to_ignore: Bu e-postayı neden aldığınızdan emin değilseniz silebilirsiniz. Yukarıdaki bağlantıya tıklamazsanız aboneliğiniz başlamayacaktır. + subject: E-posta adresinizi onaylayın + title: "%{name} kişisinden e-posta güncellemeleri alınsın mı?" + notification: + create_account: Bir Mastodon hesabı oluşturun + footer: + privacy_html: E-postalar Mastodon destekli %{domain} sunucusundan gönderilmektedir. Bu sunucunun kişisel verilerinizi nasıl işlediğini öğrenmek için Gizlilik Politikası sayfasına bakabilirsiniz. + reason_for_email_html: Bu e-postayı, %{name}'den e-posta güncellemelerini almayı seçtiğiniz için alıyorsunuz. Bu e-postaları almak istemiyor musunuz? Aboneliği iptal edebilirsiniz + interact_with_this_post: + one: Bu gönderiyle etkileşim kurun ve benzer içerikleri keşfedin. + other: Bu gönderilerle etkileşim kurun ve benzer içerikleri keşfedin. + subject: + plural: "%{name} kişisinden yeni gönderiler" + singular: 'Yeni gönderi: "%{excerpt}"' + title: + plural: "%{name} kişisinden yeni gönderiler" + singular: 'Yeni gönderi: "%{excerpt}"' + email_subscriptions: + active: Etkin + confirmations: + show: + changed_your_mind: Fikrinizi mi değiştirdiniz? + success_html: "%{name} yeni bir yazı yayınladığında artık e-posta almaya başlayacaksınız. Bu yazılar spam klasörüne düşmesin diye %{sender}'ı kişi listenize ekleyin." + title: Abone oldunuz + unsubscribe: Abonelikten çık + inactive: Etkin değil + status: Durum + subscribers: Aboneler emoji_styles: auto: Otomatik native: Yerel @@ -1457,10 +1492,8 @@ tr: mutes: Sessize aldıkların storage: Medya depolaması featured_tags: - add_new: Yeni ekle errors: limit: Zaten azami etiket sayısını öne çıkardınız - hint_html: "Öne çıkan etiketler nelerdir? Genel profilinizde belirgin bir şekilde görüntülenirler ve kişilerin genel yayınlarınıza özellikle bu etiketler altında göz atmalarına izin verir. Yaratıcı çalışmaları veya uzun vadeli projeleri takip etmek için harika bir araçtır." filters: contexts: account: Profiller @@ -1653,21 +1686,6 @@ tr: failed_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarısız oturum açma girişimi" successful_sign_in_html: "%{method} yöntemiyle %{ip} (%{browser}) adresinden başarılı oturum açma" title: Kimlik doğrulama geçmişi - mail_subscriptions: - unsubscribe: - action: Evet, abonelikten çık - complete: Abonelikten çık - confirmation_html: '%{domain} üzerindeki Mastodon için %{type} almayı durdurarak %{email} adresinize aboneliğinizi iptal etmek istediğinizden emin misiniz? e-posta bildirim ayarlarınızdan her zaman yeniden abone olabilirsiniz.' - emails: - notification_emails: - favourite: favori bildirim e-postaları - follow: takip bildirim e-postaları - follow_request: takip isteği bildirim e-postaları - mention: bahsetme bildirim e-postaları - reblog: öne çıkanlar bildirim e-postaları - resubscribe_html: Abonelikten yanlışlıkla çıktıysanız, e-posta bildirim ayarlarınızdan yeniden abone olabilirsiniz. - success_html: Artık %{email} adresindeki e-postanıza %{domain} üzerindeki Mastodon için %{type} almayacaksınız. - title: Abonelikten çık media_attachments: validations: images_and_video: Zaten resim içeren bir duruma video eklenemez @@ -1805,6 +1823,8 @@ tr: posting_defaults: Gönderi varsayılanları public_timelines: Genel zaman çizelgeleri privacy: + email_subscriptions: Gönderileri e-posta ile gönder + email_subscriptions_hint_html: Profilinize oturumu kapatmış kullanıcılara gösterilecek bir e-posta kayıt formu ekleyin. Ziyaretçiler e-posta adreslerini girip abonelik isteğinde bulunduklarında, Mastodon kamuya açık gönderilerinizle ilgili güncellemeleri e-posta yoluyla gönderecektir. hint_html: "Profilinizin ve gönderilerinizin nasıl bulunmasını istediğinizi yapılandırın. Mastodon'daki çeşitli özellik etkinleştirildiklerinde çok daha geniş bir izleyici kitlesine ulaşmanıza yardımcı olabilir. Durumunuza uyup uymadığını anlamak için bu ayarlara bir göz atın." privacy: Gizlilik privacy_hint_html: Başkalarına ne kadar bilgi göstermek istediğinizi denetleyin. İnsanlar ilginç profilleri ve havalı uygulamaları diğer kişilerin takiplerine ve gönderileri paylaştıkları uygulamalara bakarak keşfederler, ama belki de gizli tutmak isteyebilirsiniz. @@ -2068,6 +2088,28 @@ tr: resume_app_authorization: Uygulama yetkilendirmeyi sürdür role_requirement: "%{domain} Mastodon'u kullanabilmeniz için İki Aşamalı Kimlik Doğrulama'yı ayarlamanızı gerektirir." webauthn: Güvenlik anahtarları + unsubscriptions: + create: + action: Sunucu anasayfasına git + email_subscription: + confirmation_html: "%{name} kişisinden artık e-posta almayacaksınız." + title: Abonelikten ayrıldınız + user: + confirmation_html: Artık %{domain} adresindeki Mastodon'dan %{type} almayacaksınız. + notification_emails: + favourite: öne çıkanlar bildirim e-postaları + follow: takip bildirim e-postaları + follow_request: takip isteği bildirim e-postaları + mention: bahsetme bildirim e-postaları + reblog: öne çıkanlar bildirim e-postaları + show: + action: Abonelikten çık + email_subscription: + confirmation_html: Bu hesap yeni gönderiler yayınladığında e-posta almayacaksınız. + title: "%{name} kişisinin aboneliğinden ayrıl?" + user: + confirmation_html: "%{domain} adresindeki Mastodon'dan artık %{type} almayacaksınız." + title: "%{type} aboneliğinden çıkılsın mı?" user_mailer: announcement_published: description: "%{domain} yöneticileri bir duyuru yapıyorlar:" diff --git a/config/locales/tt.yml b/config/locales/tt.yml index a9677476aedb25..b82b637c1c3219 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -369,8 +369,6 @@ tt: csv: СSV lists: Исемлекләр storage: Медиа-файллар саклагычы - featured_tags: - add_new: Яңа өстәү filters: contexts: notifications: Искәртүләр diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 11dcf51c6eb73f..3f684e0a29db90 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1180,7 +1180,6 @@ uk: application_mailer: notification_preferences: Змінити налаштування електронної пошти salutation: "%{name}," - settings: 'Змінити налаштування електронної пошти: %{link}' unsubscribe: Відписатися view: 'Перегляд:' view_profile: Показати профіль @@ -1360,8 +1359,6 @@ uk: your_appeal_pending: Ви не подавали апеляцій your_appeal_rejected: Вашу апеляцію було відхилено edit_profile: - basic_information: Основна інформація - hint_html: "Налаштуйте те, що люди бачитимуть у вашому загальнодоступному профілі та поруч із вашими дописами. Інші люди з більшою ймовірністю підпишуться на вас та взаємодіятимуть з вами, якщо у вас є заповнений профіль та зображення профілю." other: Інше emoji_styles: auto: Авто @@ -1400,10 +1397,8 @@ uk: mutes: Список нехтуваних storage: Ваш медіавміст featured_tags: - add_new: Додати новий errors: limit: Ви досягли максимальної кількості хештеґів - hint_html: "Що таке виділені хештеги? Чудовий інструмент для відстеження ваших творчих робіт і довготривалих проєктів, рекомендовані хештеги показані першими у вашому профілі та дозволяють швидко отримати доступ до ваших власних повідомлень." filters: contexts: account: Профілі @@ -1570,21 +1565,6 @@ uk: failed_sign_in_html: Не вдалося увійти з %{method} з %{ip} (%{browser}) successful_sign_in_html: Успішний вхід з %{method} з %{ip} (%{browser}) title: Історія входів - mail_subscriptions: - unsubscribe: - action: Так, відписатися - complete: Відписалися - confirmation_html: Ви впевнені, що хочете відписатися від отримання %{type} для Mastodon на %{domain} до своєї скриньки %{email}? Ви можете повторно підписатися у налаштуваннях сповіщень електронною поштою. - emails: - notification_emails: - favourite: отримувати сповіщення про вподобання електронною поштою - follow: отримувати сповіщення про підписки електронною поштою - follow_request: отримувати сповіщення про запити на стеження електронною поштою - mention: отримувати сповіщення про згадки електронною поштою - reblog: отримувати сповіщення про поширення електронною поштою - resubscribe_html: Якщо ви відписалися помилково, ви можете повторно підписатися в налаштуваннях сповіщень електронною поштою. - success_html: Ви більше не отримуватимете %{type} для Mastodon %{domain} на адресу %{email}. - title: Відписатися media_attachments: validations: images_and_video: Не можна додати відео до допису з зображеннями diff --git a/config/locales/vi.yml b/config/locales/vi.yml index f773dda729cbf4..f4aee09dd8be33 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -480,7 +480,7 @@ vi: export_domain_allows: new: title: Nhập tên miền cho phép - no_file: Không có tập tin nào được chọn + no_file: Không có tệp nào được chọn export_domain_blocks: import: description_html: Bạn sắp nhập danh sách các tên miền chặn. Vui lòng xem lại danh sách này thật cẩn thận, đặc biệt nếu bạn không phải là tác giả của danh sách này. @@ -491,7 +491,7 @@ vi: invalid_domain_block: 'Một hoặc nhiều tên miền đã bị bỏ qua do (các) lỗi sau: %{error}' new: title: Nhập máy chủ chặn - no_file: Không có tập tin nào được chọn + no_file: Không có tệp nào được chọn fasp: debug: callbacks: @@ -592,7 +592,7 @@ vi: created_msg: Thêm lưu ý kiểm duyệt máy chủ thành công! description_html: Xem và để lại lưu ý cho các kiểm duyệt viên khác destroyed_msg: Xóa lưu ý kiểm duyệt máy chủ thành công! - placeholder: Thông tin về máy chủ này, hành động trước đây, hoặc bất cứ lưu ý giúp bạn kiểm duyệt máy chủ này trong tương lai. + placeholder: Thông tin về máy chủ này, hành động trước đây, hoặc mọi lưu ý giúp bạn kiểm duyệt máy chủ này trong tương lai. title: Lưu ý kiểm duyệt private_comment: Bình luận riêng public_comment: Bình luận công khai @@ -747,6 +747,7 @@ vi: categories: administration: Quản trị viên devops: Nhà phát triển + email: Email invites: Lời mời moderation: Kiểm duyệt special: Đặc biệt @@ -774,6 +775,8 @@ vi: manage_blocks_description: Cho phép người dùng tự chặn các nhà cung cấp email và địa chỉ IP manage_custom_emojis: Quản lý emoji manage_custom_emojis_description: Cho phép quản lý các emoji tùy chỉnh trên máy chủ + manage_email_subscriptions: Quản lý đăng ký đọc qua email + manage_email_subscriptions_description: Cho phép người dùng đăng ký nhận thông báo qua email từ những người dùng có quyền này manage_federation: Quản lý liên hợp manage_federation_description: Cho phép chặn hoặc liên hợp với các máy chủ khác và kiểm soát khả năng phân phối manage_invites: Quản lý lời mời @@ -874,7 +877,7 @@ vi: modes: approved: Yêu cầu phê duyệt để đăng ký none: Không ai có thể đăng ký - open: Bất cứ ai cũng có thể đăng ký + open: Bất kỳ ai cũng có thể đăng ký warning_hint: Chúng tôi khuyên bạn nên sử dụng "Duyệt đăng ký thủ công" trừ khi bạn tin tưởng đội ngũ kiểm duyệt của mình có thể xử lý kịp thời các đăng ký spam và độc hại. security: authorized_fetch: Yêu cầu xác thực từ các máy chủ liên hợp @@ -883,8 +886,8 @@ vi: federation_authentication: Thực thi xác thực liên hợp title: Cài đặt máy chủ site_uploads: - delete: Xóa tập tin đã tải lên - destroyed_msg: Đã xóa tập tin tải lên thành công! + delete: Xóa tệp đã tải lên + destroyed_msg: Đã xóa tệp tải lên thành công! software_updates: critical_update: Quan trọng — vui lòng cập nhật sớm description: Bạn nên cập nhật Mastodon phiên bản mới nhất để được hưởng lợi từ các bản sửa lỗi và thêm tính năng mới. Nhất là để tránh các vấn đề bảo mật. Vì những lý do này, Mastodon sẽ kiểm tra các bản cập nhật 30 phút một lần và sẽ thông báo cho bạn theo tùy chọn thông báo qua email của bạn. @@ -1197,9 +1200,9 @@ vi: hint_html: Nếu bạn muốn chuyển từ máy chủ khác sang máy chủ này, bắt buộc bạn phải tạo tên người dùng mới thì mới có thể tiến hành chuyển được người theo dõi. Hành động này không ảnh hưởng gì và có thể đảo ngược. Việc di chuyển tài khoản được bắt đầu từ tài khoản cũ. remove: Bỏ liên kết bí danh appearance: - advanced_settings: Cài đặt nâng cao + advanced_settings: Nâng cao animations_and_accessibility: Hiệu ứng - boosting_preferences: Thiết lập đăng lại + boosting_preferences: Đăng lại boosting_preferences_info_html: "Mẹo: Bất kể cài đặt, Shift + Click trên biểu tượng %{icon} Đăng lại sẽ lập tức đăng lại." discovery: Khám phá localization: @@ -1210,7 +1213,6 @@ vi: application_mailer: notification_preferences: Thay đổi thiết lập email salutation: "%{name}," - settings: 'Thay đổi thiết lập email: %{link}' unsubscribe: Hủy đăng ký view: 'Chi tiết:' view_profile: Xem trang hồ sơ @@ -1221,7 +1223,7 @@ vi: logout: Đăng xuất regenerate_token: Tạo lại mã truy cập token_regenerated: Mã truy cập được tạo lại thành công - warning: Hãy rất cẩn thận với dữ liệu này. Không bao giờ chia sẻ nó với bất cứ ai! + warning: Hãy rất cẩn thận với dữ liệu này. Không bao giờ chia sẻ nó với bất kỳ ai! your_token: Mã truy cập của bạn auth: apply_for_account: Xin đăng ký @@ -1395,9 +1397,41 @@ vi: your_appeal_pending: Bạn đã gửi một khiếu nại your_appeal_rejected: Khiếu nại của bạn bị từ chối edit_profile: - basic_information: Thông tin cơ bản - hint_html: Mọi người sẽ muốn theo dõi và tương tác với bạn hơn nếu bạn có ảnh đại diện và hồ sơ hoàn chỉnh. other: Khác + redesign_body: Giờ đây, hồ sơ đã có thể chỉnh sửa trực tiếp từ trang hồ sơ. + redesign_button: Tới đó + redesign_title: Đã có trải nghiệm sửa hồ sơ mới + email_subscription_mailer: + confirmation: + action: Xác nhận địa chỉ email + instructions_to_confirm: Xác nhận bạn muốn nhận email từ %{name} (@%{acct}) khi họ đăng tút mới. + instructions_to_ignore: Nếu bạn không chắc tại sao mình nhận được email này, bạn có thể xóa nó. Bạn sẽ không được đăng ký nếu không nhấn vào liên kết ở trên. + subject: Xác nhận địa chỉ email của bạn + title: Nhận cập nhật qua email từ %{name}? + notification: + create_account: Tạo một tài khoản Mastodon + footer: + privacy_html: Các email sẽ được gửi từ %{domain}, một máy chủ vận hành nhờ Mastodon. Để hiểu cách máy chủ này xử lý dữ liệu cá nhân của bạn, vui lòng tham khảo Chính sách bảo mật. + reason_for_email_html: Bạn nhận được email này vì bạn đã đăng ký nhận tút mới qua email từ %{name}. Không muốn nhận email này? Hủy đăng ký đọc + interact_with_this_post: + other: Hãy tương tác với những tút này và khám phá thêm nhiều điều thú vị. + subject: + plural: Những tút mới từ %{name} + singular: 'Tút mới: "%{excerpt}"' + title: + plural: Những tút mới từ %{name} + singular: 'Tút mới: "%{excerpt}"' + email_subscriptions: + active: Hoạt động + confirmations: + show: + changed_your_mind: Thay đổi ý định? + success_html: Bạn sẽ bắt đầu nhận được email khi %{name} đăng tút mới. Thêm %{sender} vào danh bạ của bạn để những tút này không bị chuyển vào thư mục Spam. + title: Bạn đã đăng ký đọc + unsubscribe: Hủy đăng ký đọc + inactive: Không hoạt động + status: Trạng thái + subscribers: Người đăng ký đọc emoji_styles: auto: Tự động native: Nguyên bản @@ -1428,18 +1462,16 @@ vi: in_progress: Đang tổng hợp dữ liệu của bạn... request: Tải về dữ liệu của bạn size: Dung lượng - blocks: Người chặn + blocks: Tài khoản đã chặn bookmarks: Tút đã lưu csv: CSV - domain_blocks: Máy chủ chặn + domain_blocks: Máy chủ đã chặn lists: Danh sách - mutes: Tài khoản bị phớt lờ - storage: Tập tin + mutes: Tài khoản đã phớt lờ + storage: Tệp featured_tags: - add_new: Thêm mới errors: limit: Bạn đã đạt tới số lượng hashtag tối đa - hint_html: "Nêu bật những hashtag thường dùng. Một công cụ tuyệt vời để theo dõi chuỗi tác phẩm sáng tạo và dự án dài hạn của bạn, cũng như giúp truy cập nhanh vào các tút." filters: contexts: account: Trang hồ sơ @@ -1498,14 +1530,14 @@ vi: other: Chọn tất cả%{count} mục trùng hợp với tìm kiếm của bạn. today: hôm nay validation_errors: - other: Đã có %{count} lỗi xảy ra! Xem chi tiết bên dưới + other: Đã xảy ra %{count} lỗi! Xem chi tiết bên dưới imports: errors: empty: File CSV trống incompatible_type: Không tương thích với loại nhập đã chọn - invalid_csv_file: 'Tập tin CSV không hợp lệ. Lỗi: %{error}' + invalid_csv_file: 'Tệp CSV không hợp lệ. Lỗi: %{error}' over_rows_processing_limit: chứa nhiều hơn %{count} hàng - too_large: Tập tin quá lớn + too_large: Tệp quá lớn failures: Thất bại imported: Đã nhập mismatched_types_warning: Có vẻ như bạn đã chọn sai loại cho lần nhập này, vui lòng kiểm tra lại. @@ -1612,26 +1644,11 @@ vi: failed_sign_in_html: Đăng nhập thất bại bằng %{method} từ %{ip} (%{browser}) successful_sign_in_html: Đăng nhập bằng %{method} từ %{ip} (%{browser}) title: Lịch sử đăng nhập - mail_subscriptions: - unsubscribe: - action: Đúng, hủy đăng ký - complete: Đã hủy đăng ký - confirmation_html: Bạn có chắc muốn hủy đăng ký %{type} Mastodon trên %{domain} tới %{email}? Bạn có thể đăng ký lại từ cài đặt thông báo email. - emails: - notification_emails: - favourite: email thông báo lượt thích - follow: email thông báo người theo dõi mới - follow_request: email thông báo yêu cầu theo dõi - mention: email thông báo lượt nhắc đến - reblog: email thông báo lượt đăng lại - resubscribe_html: Nếu đổi ý, bạn có thể đăng ký lại từ cài đặt thông báo email. - success_html: Bạn sẽ không còn nhận %{type} Mastodon trên %{domain} tới %{email}. - title: Hủy đăng ký media_attachments: validations: images_and_video: Không thể đính kèm video vào tút đã chứa hình ảnh not_found: Không tìm thấy %{ids} hoặc nó đã bị đính kèm với tút khác - not_ready: Tập tin này vẫn chưa xử lý xong. Hãy thử lại sau! + not_ready: Tệp này vẫn chưa xử lý xong. Hãy thử lại sau! too_many: Không thể đính kèm hơn 4 tệp migrations: acct: Chuyển sang @@ -1672,6 +1689,26 @@ vi: copy_account_note_text: 'Tài khoản này chuyển từ %{acct}, đây là lịch sử kiểm duyệt của họ:' navigation: toggle_menu: Bật/tắt menu + notification_fallbacks: + added_to_collection: + title_html: "%{name} đã thêm bạn vào một gói khởi đầu" + admin_report: + title_html: "%{name} báo cáo %{target}" + admin_sign_up: + title_and_others_html: + other: "%{name} và %{count} người khác đã đăng ký" + title_html: "%{name} đã đăng ký" + collection_update: + title_html: "%{name} đã cập nhật gói khởi đầu có bạn" + generic: + sign_in: Đăng nhập Mastodon bản web + summary_html: Bạn đang sử dụng một ứng dụng không hỗ trợ phiên bản Mastodon mới nhất. %{link} để có đầy đủ tính năng. + moderation_warning: + summary_html: Bạn đang sử dụng một ứng dụng không hỗ trợ phiên bản Mastodon mới nhất. %{link}. + title: Bạn vừa nhận một cảnh cáo kiểm duyệt. + severed_relationships: + summary_html: Quản trị viên %{from} vừa vô hiệu hóa %{target}, điều này nghĩa là bạn không thể nhận được thông báo cập nhật từ họ hoặc tương tác với họ nữa. %{link} để khôi phục danh sách các mối quan hệ đã mất. + title: Mất kết nối với %{name} notification_mailer: admin: report: @@ -1764,6 +1801,8 @@ vi: posting_defaults: Mặc định cho tút public_timelines: Bảng tin privacy: + email_subscriptions: Gửi tút qua email + email_subscriptions_hint_html: Thêm biểu mẫu đăng ký email vào hồ sơ của bạn, biểu mẫu này sẽ hiển thị cho cả người dùng chưa đăng nhập. Khi khách truy cập nhập địa chỉ email của họ và chọn đăng ký, Mastodon sẽ gửi thông báo qua email về các tút công khai của bạn. hint_html: Tùy chỉnh cách mọi người tìm thấy hồ sơ và tút của bạn. privacy: Riêng tư privacy_hint_html: Kiểm soát mức độ tiết lộ chi tiết. Mọi người khám phá các hồ sơ thú vị và các ứng dụng thú vị bằng cách xem bạn theo dõi ai và bạn đăng bằng ứng dụng nào, nhưng có thể bạn muốn ẩn nó đi. @@ -1885,7 +1924,7 @@ vi: profile: Hồ sơ relationships: Quan hệ severed_relationships: Quan hệ đứt gãy - statuses_cleanup: Tự động xóa tút cũ + statuses_cleanup: Xóa tút cũ tự động strikes: Lần cảnh cáo two_factor_authentication: Xác thực 2 bước webauthn_authentication: Khóa bảo mật @@ -1935,7 +1974,7 @@ vi: quote_policies: followers: Chỉ người theo dõi nobody: Chỉ tôi - public: Bất cứ ai + public: Bất kỳ ai quote_post_author: Trích dẫn từ tút của @%{acct} title: '%{name}: "%{quote}"' visibilities: @@ -1944,9 +1983,9 @@ vi: public: Công khai public_long: Bất kỳ ai trong và ngoài Mastodon unlisted: Hạn chế - unlisted_long: Ẩn khỏi kết quả tìm kiếm, xu hướng và dòng thời gian công khai của Mastodon + unlisted_long: Ẩn khỏi kết quả tìm kiếm, xu hướng và bảng tin công khai statuses_cleanup: - enabled: Tự động xóa những tút cũ + enabled: Xóa những tút cũ tự động enabled_hint: Trừ những ngoại lệ bên dưới exceptions: Ngoại lệ explanation: Có thể xảy ra độ trễ nhất định giữa thời điểm đạt ngưỡng và thời điểm tút bị xóa. @@ -2023,6 +2062,28 @@ vi: resume_app_authorization: Tiếp tục xác thực bằng ứng dụng role_requirement: "%{domain} yêu cầu bạn thiết lập Xác thụec 2 bước trước khi sử dụng Mastodon." webauthn: Khóa bảo mật + unsubscriptions: + create: + action: Đến trang chủ máy chủ + email_subscription: + confirmation_html: Bạn sẽ không còn nhận được email từ %{name}. + title: Bạn đã hủy đăng ký đọc + user: + confirmation_html: Bạn sẽ không còn nhận %{type} từ Mastodon trên %{domain}. + notification_emails: + favourite: email thông báo lượt thích + follow: email thông báo người theo dõi mới + follow_request: email thông báo yêu cầu theo dõi + mention: email thông báo lượt nhắc đến + reblog: email thông báo lượt đăng lại + show: + action: Hủy đăng ký đọc + email_subscription: + confirmation_html: Bạn sẽ ngừng nhận email khi tài khoản này đăng tút mới. + title: Hủy đăng ký đọc %{name}? + user: + confirmation_html: Bạn sẽ không còn nhận %{type} từ Mastodon trên %{domain}. + title: Hủy đăng ký đọc %{type}? user_mailer: announcement_published: description: 'Quản trị viên %{domain} gửi một thông báo:' diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index c161b996819792..96f026c3175437 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -747,10 +747,11 @@ zh-CN: categories: administration: 管理 devops: 开发运维 + email: 电子邮件 invites: 邀请 moderation: 审核 special: 特殊 - delete: 刪除 + delete: 删除 description_html: 使用 用户角色,你可以自定义你的用户可以访问的 Mastodon 功能和区域。 edit: 编辑角色 '%{name}' everyone: 默认权限 @@ -774,6 +775,8 @@ zh-CN: manage_blocks_description: 允许用户屏蔽邮箱域名与IP地址 manage_custom_emojis: 管理自定义表情 manage_custom_emojis_description: 允许用户管理站点上的自定义表情 + manage_email_subscriptions: 管理邮件订阅 + manage_email_subscriptions_description: 允许其他用户通过电子邮件订阅具备此权限的用户 manage_federation: 管理联合 manage_federation_description: 允许用户禁止或允许本站同其他站点的联合,并控制消息投递能力 manage_invites: 管理邀请 @@ -1210,7 +1213,6 @@ zh-CN: application_mailer: notification_preferences: 更改邮件偏好 salutation: "%{name}:" - settings: 更改邮件偏好: %{link} unsubscribe: 取消订阅 view: 点此链接查看详情: view_profile: 查看个人资料 @@ -1395,9 +1397,41 @@ zh-CN: your_appeal_pending: 你已经提交了一次申诉 your_appeal_rejected: 你的申诉已被驳回 edit_profile: - basic_information: 基本信息 - hint_html: "自定义公开资料和嘟文旁边显示的内容。当你填写完整的个人资料并设置了头像时,其他人更有可能关注你并与你互动。" other: 其他 + redesign_body: 个人资料编辑功能现在可以直接在个人资料页面访问。 + redesign_button: 前往 + redesign_title: 全新个人资料编辑体验现已到来 + email_subscription_mailer: + confirmation: + action: 确认电子邮件地址 + instructions_to_confirm: 确认你确实想要在 %{name}(@%{acct})发布新嘟文时收到电子邮件通知。 + instructions_to_ignore: 如果你不知道为什么收到这封电子邮件,可以直接删除。如果你不点击上方链接,则不会为你订阅。 + subject: 确认你的电子邮件地址 + title: 要接收来自 %{name} 的电子邮件推送吗? + notification: + create_account: 创建 Mastodon 账号 + footer: + privacy_html: 电子邮件发送自 %{domain},由 Mastodon 驱动的社区实例。要了解本站如何处理你的个人信息,请参见隐私政策。 + reason_for_email_html: 你收到此邮件是因为你先前订阅了来自 %{name} 的嘟文邮件通知。不想再收到这些电子邮件?可以取消订阅 + interact_with_this_post: + other: 和嘟文互动,发现更多类似嘟文。 + subject: + plural: 来自 %{name} 的新嘟文 + singular: 新嘟文:“%{excerpt}” + title: + plural: 来自 %{name} 的新嘟文 + singular: 新嘟文:“%{excerpt}” + email_subscriptions: + active: 已生效 + confirmations: + show: + changed_your_mind: 改变主意了吗? + success_html: 现在开始当 %{name} 发布新嘟文时你会收到邮件提醒。记得将 %{sender} 添加到邮箱联系人中,以免嘟文推送被丢入垃圾邮件文件夹。 + title: 你已成功订阅 + unsubscribe: 取消订阅 + inactive: 未生效 + status: 状态 + subscribers: 订阅者 emoji_styles: auto: 自动 native: 原生 @@ -1436,10 +1470,8 @@ zh-CN: mutes: 已被你隐藏的 storage: 媒体文件存储 featured_tags: - add_new: 添加新条目 errors: limit: 你所推荐的话题数已达上限 - hint_html: "什么是精选话题? 它们被显示在你的公开个人资料中的突出位置,人们可以在这些标签下浏览你的公共嘟文。 它们是跟踪创作或长期项目的进度的重要工具。" filters: contexts: account: 个人资料 @@ -1612,21 +1644,6 @@ zh-CN: failed_sign_in_html: 失败的 %{method} 登录尝试,来自 %{ip} (%{browser}) successful_sign_in_html: 通过 %{method} 成功登录,来自 %{ip} (%{browser}) title: 认证历史 - mail_subscriptions: - unsubscribe: - action: 是,取消订阅 - complete: 已取消订阅 - confirmation_html: 你确定要退订来自 %{domain} 上的 Mastodon 的 %{type} 到你的邮箱 %{email} 吗?你可以随时在邮件通知设置中重新订阅。 - emails: - notification_emails: - favourite: 嘟文被喜欢邮件通知 - follow: 账号被关注邮件通知 - follow_request: 关注请求邮件通知 - mention: 账号被提及邮件通知 - reblog: 嘟文被转嘟邮件通知 - resubscribe_html: 如果你不小心取消了订阅,可以在你的邮件通知设置中重新订阅。 - success_html: 你将不会在你的邮箱 %{email} 中收到 %{domain} 上的 Mastodon的 %{type} - title: 取消订阅 media_attachments: validations: images_and_video: 无法在嘟文中同时插入视频和图片 @@ -1672,6 +1689,26 @@ zh-CN: copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注: navigation: toggle_menu: 隐藏/显示菜单 + notification_fallbacks: + added_to_collection: + title_html: "%{name} 将你添加到了收藏列表" + admin_report: + title_html: "%{name} 举报了 %{target}" + admin_sign_up: + title_and_others_html: + other: "%{name} 及另外 %{count} 个人注册了" + title_html: "%{name} 注册了" + collection_update: + title_html: "%{name} 更新了你所在的收藏列表" + generic: + sign_in: 登录到 Mastodon 网页 App + summary_html: 你使用的应用程序不支持最新版本的 Mastodon。要使用完整功能,请%{link}。 + moderation_warning: + summary_html: 你使用的应用程序不支持最新版本的 Mastodon。%{link}。 + title: 你收到了一条管理警告。 + severed_relationships: + summary_html: "%{from} 的管理员封禁了 %{target},这意味着你将无法再收到对方的更新或与其互动。要获取失去的关系列表,%{link}。" + title: 与 %{name} 的联系已断开 notification_mailer: admin: report: @@ -1764,6 +1801,8 @@ zh-CN: posting_defaults: 发布默认值 public_timelines: 公共时间线 privacy: + email_subscriptions: 通过电子邮件发送嘟文 + email_subscriptions_hint_html: 在你的个人资料中添加电子邮件订阅表单,此表单会显示给未登录的用户。当访客输入电子邮件地址并选择订阅时,Mastodon 将在你更新公开嘟文时为这些访客发送电子邮件通知。 hint_html: "自定义你希望如何找到你的个人资料和嘟文。启用Mastodon中的各种功能可以帮助你扩大受众范围。请花点时间查看这些设置,确保它们适合你的使用情况。" privacy: 隐私 privacy_hint_html: 控制你愿意向他人透露多少信息。通过浏览他人的关注列表和查看他们发嘟所用的应用,人们可以发现有趣的用户和酷炫的应用,但你可能更喜欢将其隐藏起来。 @@ -2023,6 +2062,28 @@ zh-CN: resume_app_authorization: 恢复应用程序授权 role_requirement: "%{domain} 要求你设置双因素认证以使用 Mastodon。" webauthn: 安全密钥 + unsubscriptions: + create: + action: 转到服务器主页 + email_subscription: + confirmation_html: 你将不会再收到来自 %{name} 的电子邮件。 + title: 你已取消订阅 + user: + confirmation_html: 你将不会再收到 %{domain} 上的 Mastodon 的%{type}。 + notification_emails: + favourite: 嘟文被喜欢邮件通知 + follow: 账号被关注邮件通知 + follow_request: 关注请求邮件通知 + mention: 账号被提及邮件通知 + reblog: 嘟文被转嘟邮件通知 + show: + action: 取消订阅 + email_subscription: + confirmation_html: 你将不再收到此账号发布新嘟文时的通知邮件。 + title: 取消订阅%{name}? + user: + confirmation_html: 你将停止接收 %{domain} 上的 Mastodon 的%{type}。 + title: 取消订阅%{type}? user_mailer: announcement_published: description: "%{domain}管理员发布了一则公告:" diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index ac26ce9af44581..e5d984ce42ee98 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1162,8 +1162,6 @@ zh-HK: your_appeal_pending: 你已提交申訴 your_appeal_rejected: 你的申訴已被駁回 edit_profile: - basic_information: 基本資料 - hint_html: "自訂你的公開個人檔案和帖文內容。當你有完整的個人檔案和頭像時,其他人更願意追蹤你和與你互動。" other: 其他 errors: '400': 你的請求無效或格式不正確。 @@ -1199,10 +1197,8 @@ zh-HK: mutes: 你所靜音的用戶 storage: 媒體容量大小 featured_tags: - add_new: 新增 errors: limit: 你推薦的標籤數量已達上限 - hint_html: "甚麼是推薦主題標籤? 它們會被顯示在你的個人資料頁面,讓其他人可以根據標籤瀏覽你的公開文章,令人們更易找到你創作或者長期作品!" filters: contexts: account: 個人資料 @@ -1341,11 +1337,6 @@ zh-HK: failed_sign_in_html: 以 %{method} 從 %{ip} (%{browser}) 登入失敗 successful_sign_in_html: 以 %{method} 從 %{ip} (%{browser}) 成功登入 title: 驗證操作歷史 - mail_subscriptions: - unsubscribe: - action: 沒錯,取消訂閱 - complete: 已取消訂閱 - title: 取消訂閱 media_attachments: validations: images_and_video: 不能在已有圖片的文章上加入影片 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 4585b729bc4091..50ded2f32b30e6 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -8,7 +8,7 @@ zh-TW: title: 關於本站 accounts: errors: - cannot_be_added_to_collections: 此帳號無法被加至集合中。 + cannot_be_added_to_collections: 此帳號無法被加至收藏名單中。 followers: other: 跟隨者 following: @@ -747,6 +747,7 @@ zh-TW: categories: administration: 管理員 devops: DevOps + email: 電子郵件 invites: 邀請 moderation: 站務 special: 特殊 @@ -774,6 +775,8 @@ zh-TW: manage_blocks_description: 允許使用者封鎖電子郵件提供商與 IP 位址 manage_custom_emojis: 管理自訂 emoji 表情符號 manage_custom_emojis_description: 允許使用者管理伺服器上之自訂 emoji 表情符號 + manage_email_subscriptions: 管理電子郵件訂閱 + manage_email_subscriptions_description: 此權限允許使用者透過電子郵件訂閱其他使用者動態 manage_federation: 管理聯邦宇宙 manage_federation_description: 允許使用者封鎖或允許與其他網域的聯邦宇宙,並控制傳遞能力 manage_invites: 管理邀請 @@ -1212,7 +1215,6 @@ zh-TW: application_mailer: notification_preferences: 變更電子郵件設定 salutation: "%{name}、" - settings: 變更電子郵件設定︰%{link} unsubscribe: 取消訂閱 view: 進入瀏覽: view_profile: 檢視個人檔案 @@ -1397,9 +1399,41 @@ zh-TW: your_appeal_pending: 您已遞交申訴 your_appeal_rejected: 您的申訴已被駁回 edit_profile: - basic_information: 基本資訊 - hint_html: "自訂人們能於您個人檔案及嘟文旁所見之內容。當您完成填寫個人檔案及設定大頭貼後,其他人們比較願意跟隨您並與您互動。" other: 其他 + redesign_body: 個人檔案編輯功能現在能自個人檔案頁面直接存取。 + redesign_button: 前往 + redesign_title: 全新個人檔案編輯體驗 + email_subscription_mailer: + confirmation: + action: 確認電子郵件地址 + instructions_to_confirm: 確認您想要收到來自 %{name} (@%{acct}) 發表新嘟文時的電子郵件。 + instructions_to_ignore: 您若不確定為何您收到此電子郵件,您可以刪除它。您若不點擊上方連結,將不會訂閱。 + subject: 確認您的電子郵件地址 + title: 是否想要收到來自 %{name} 之電子郵件通訊? + notification: + create_account: 建立 Mastodon 帳號 + footer: + privacy_html: 這些電子郵件由 Mastodon 伺服器 %{domain} 寄出。欲了解這台伺服器如何處理您的個人資料,請參考 隱私權政策。 + reason_for_email_html: 您正收到這封電子郵件,因為您選擇收到來自 %{name} 之電子郵件通訊。不想再收到這些電子郵件?取消訂閱 + interact_with_this_post: + other: 與此嘟文互動並且發現更多類似嘟文。 + subject: + plural: 來自 %{name} 之新嘟文 + singular: 新嘟文:「%{excerpt}」 + title: + plural: 來自 %{name} 之新嘟文 + singular: 新嘟文:「%{excerpt}」 + email_subscriptions: + active: 生效中 + confirmations: + show: + changed_your_mind: 改變主意了嗎? + success_html: 您將開始收到當 %{name} 發表新嘟文之電子郵件。請新增 %{sender} 至您的通訊錄使這些嘟文不被分類至垃圾信件夾。 + title: 已完成註冊 + unsubscribe: 取消訂閱 + inactive: 已停用 + status: 狀態 + subscribers: 訂閱者 emoji_styles: auto: 自動 native: 原生風格 @@ -1438,10 +1472,8 @@ zh-TW: mutes: 您靜音的使用者 storage: 匯出檔案大小 featured_tags: - add_new: 新增 errors: limit: 您所推薦之主題標籤數量已達上限 - hint_html: "於個人檔案上展示您的推薦主題標籤 展示創意作品或者長期更新的專案的絕佳工具,推薦主題標籤於您個人資料頁面顯眼地展示,並且能快速存取您自己的嘟文。" filters: contexts: account: 個人檔案 @@ -1614,21 +1646,6 @@ zh-TW: failed_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入嘗試失敗 successful_sign_in_html: 使用來自 %{ip} (%{browser}) 的 %{method} 登入成功 title: 認證歷史紀錄 - mail_subscriptions: - unsubscribe: - action: 是的,取消訂閱 - complete: 取消訂閱 - confirmation_html: 您確定要取要取消訂閱自 Mastodon 上 %{domain} 之 %{type} 至您電子郵件 %{email} 嗎?您隨時可以自電子郵件通知設定重新訂閱。 - emails: - notification_emails: - favourite: 最愛通知電子郵件 - follow: 跟隨通知電子郵件 - follow_request: 跟隨請求通知電子郵件 - mention: 提及通知電子郵件 - reblog: 轉嘟通知電子郵件 - resubscribe_html: 若您不慎錯誤地取消訂閱,您可以自電子郵件通知設定重新訂閱。 - success_html: 您將不再收到來自 Mastodon 上 %{domain} 之 %{type} 至您電子郵件 %{email}。 - title: 取消訂閱 media_attachments: validations: images_and_video: 無法於已有圖片之嘟文中加入影片 @@ -1674,6 +1691,11 @@ zh-TW: copy_account_note_text: 此使用者轉移自 %{acct},以下是您之前關於他們的備註: navigation: toggle_menu: 切換選單 + notification_fallbacks: + added_to_collection: + title_html: "%{name} 將您加入至收藏名單" + admin_report: + title_html: "%{name} 已檢舉 %{target}" notification_mailer: admin: report: @@ -1766,6 +1788,8 @@ zh-TW: posting_defaults: 嘟文預設值 public_timelines: 公開時間軸 privacy: + email_subscriptions: 以電子郵件寄送嘟文 + email_subscriptions_hint_html: 於您的個人檔案中新增電子郵件訂閱表單,該表單將對未登入使用者顯示。當訪客輸入他們的電子郵件地址並選擇訂閱時,Mastodon 將會寄送您公開嘟文之電子郵件通訊。 hint_html: "自訂您希望如何使您的個人檔案及嘟文被發現。藉由啟用一系列 Mastodon 功能以幫助您觸及更廣的受眾。煩請花些時間確認您是否欲啟用這些設定。" privacy: 隱私權 privacy_hint_html: 控制您希望向其他人揭露之內容。人們透過瀏覽其他人的跟隨者與其發嘟之應用程式發現有趣的個人檔案與酷炫的 Mastodon 應用程式,但您能選擇將其隱藏。 @@ -2011,7 +2035,7 @@ zh-TW: two_factor_authentication: add: 新增 disable: 停用兩階段驗證 - disabled_success: 已成功啟用兩階段驗證 + disabled_success: 已成功停用兩階段驗證 edit: 編輯 enabled: 兩階段驗證已啟用 enabled_success: 兩階段驗證已成功啟用 @@ -2025,6 +2049,28 @@ zh-TW: resume_app_authorization: 恢復應用程式授權 role_requirement: "%{domain} 要求您設定兩階段驗證以使用 Mastodon。" webauthn: 安全金鑰 + unsubscriptions: + create: + action: 前往伺服器首頁 + email_subscription: + confirmation_html: 您將不再收到來自 %{name} 之電子郵件。 + title: 您已成功取消訂閱 + user: + confirmation_html: 您將不再收到來自 %{domain} Mastodon 之 %{type}。 + notification_emails: + favourite: 最愛通知電子郵件 + follow: 跟隨通知電子郵件 + follow_request: 跟隨請求通知電子郵件 + mention: 提及通知電子郵件 + reblog: 轉嘟通知電子郵件 + show: + action: 取消訂閱 + email_subscription: + confirmation_html: 您將不再收到來自此帳號新嘟文之電子郵件。 + title: 取消訂閱 %{name}? + user: + confirmation_html: 您將不再收到來自 %{domain} Mastodon 之 %{type}。 + title: 取消訂閱 %{type}? user_mailer: announcement_published: description: "%{domain} 之管理員正在進行公告:" diff --git a/config/routes.rb b/config/routes.rb index e43b715e33142e..ff129755592675 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -73,13 +73,15 @@ def redirect_with_vary(path) devise_scope :user do get '/invite/:invite_code', to: 'auth/registrations#new', as: :public_invite - resource :unsubscribe, only: [:show, :create], controller: :mail_subscriptions + resource :unsubscribe, only: [:show, :create], controller: :unsubscriptions namespace :auth do resource :setup, only: [:show, :update], controller: :setup resource :challenge, only: [:create] - get 'sessions/security_key_options', to: 'sessions#webauthn_options' post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation + namespace :sessions do + resource :security_key_options, only: :show + end end end @@ -97,7 +99,6 @@ def redirect_with_vary(path) get '/authorize_follow', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" } concern :account_resources do - resources :collections, only: [:show], constraints: { id: /\d+/ } resources :followers, only: [:index], controller: :follower_accounts resources :following, only: [:index], controller: :following_accounts @@ -126,6 +127,7 @@ def redirect_with_vary(path) scope path: 'ap', as: 'ap' do resources :accounts, path: 'users', only: [:show], param: :id, concerns: :account_resources do + resources :collections, only: [:show], constraints: { id: /\d+/ } resources :collection_items, only: [:show] resources :feature_authorizations, only: [:show], module: :activitypub resources :featured_collections, only: [:index], module: :activitypub @@ -142,6 +144,8 @@ def redirect_with_vary(path) end end + resources :collections, only: [:show], constraints: { id: /\d+/ } + resource :inbox, only: [:create], module: :activitypub resources :group_contexts, only: [:show], module: :activitypub, controller: :group_contexts resources :contexts, only: [:show], module: :activitypub, constraints: { id: /[0-9]+-[0-9]+/ } do @@ -160,6 +164,7 @@ def redirect_with_vary(path) with_options to: 'accounts#show' do get '/@:username', as: :short_account get '/@:username/featured' + get '/@:username/collections' get '/@:username/with_replies', as: :short_account_with_replies get '/@:username/media', as: :short_account_media get '/@:username/tagged/:tag', as: :short_account_tag @@ -190,15 +195,19 @@ def redirect_with_vary(path) resources :statuses, only: :show end + namespace :email_subscriptions do + resource :confirmation, only: :show + end + resources :media, only: [:show] do - get :player + member { get :player } end resources :tags, only: [:show] resources :emojis, only: [:show] resources :invites, only: [:index, :create, :destroy] resources :filters, except: [:show] do - resources :statuses, only: [:index], controller: 'filters/statuses' do + resources :statuses, only: [:index], module: :filters do collection do post :batch end @@ -217,7 +226,9 @@ def redirect_with_vary(path) resource :statuses_cleanup, controller: :statuses_cleanup, only: [:show, :update] get '/media_proxy/:id/(*any)', to: 'media_proxy#show', as: :media_proxy, format: false - get '/backups/:id/download', to: 'backups#download', as: :download_backup, format: false + resources :backups, only: [] do + member { get :download, format: false } + end resource :authorize_interaction, only: [:show] resource :share, only: [:show] diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 3bd0caabb89d08..ce801b0715b62d 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -3,13 +3,13 @@ namespace :admin do get '/dashboard', to: 'dashboard#index' - resources :domain_allows, only: [:new, :create, :destroy] - resources :domain_blocks, only: [:new, :create, :destroy, :update, :edit] do - collection do - post :batch - end + concern :batch do + collection { post :batch } end + resources :domain_allows, only: [:new, :create, :destroy] + resources :domain_blocks, only: [:new, :create, :destroy, :update, :edit], concerns: :batch + resources :export_domain_allows, only: [:new] do collection do get :export, constraints: { format: :csv } @@ -24,11 +24,7 @@ end end - resources :email_domain_blocks, only: [:index, :new, :create] do - collection do - post :batch - end - end + resources :email_domain_blocks, only: [:index, :new, :create], concerns: :batch resources :action_logs, only: [:index] resources :warning_presets, except: [:new, :show] @@ -116,7 +112,7 @@ post :stop_delivery end - resources :moderation_notes, controller: 'instances/moderation_notes', only: [:create, :destroy] + resources :moderation_notes, module: :instances, only: [:create, :destroy] end resources :rules, only: [:index, :new, :create, :edit, :update, :destroy] do @@ -132,13 +128,13 @@ post :disable end - resource :secret, only: [], controller: 'webhooks/secrets' do + resource :secret, only: [], module: :webhooks do post :rotate end end resources :reports, only: [:index, :show] do - resources :actions, only: [:create], controller: 'reports/actions' do + resources :actions, only: [:create], module: :reports do collection do post :preview end @@ -154,7 +150,7 @@ resources :report_notes, only: [:create, :destroy] - resources :accounts, only: [:index, :show, :destroy] do + resources :accounts, only: [:index, :show, :destroy], concerns: :batch do member do post :enable post :unsensitive @@ -171,29 +167,12 @@ post :unblock_email end - collection do - post :batch - end - resource :change_email, only: [:show, :update] resource :reset, only: [:create] resource :action, only: [:new, :create], controller: 'account_actions' resources :collections, only: [:show] - - resources :statuses, only: [:index, :show] do - member do - post :remove_history - post :remove_media - post :force_sensitive - post :force_cw - post :remove_status - end - - collection do - post :batch - end - end + resources :statuses, only: [:index, :show], concerns: :batch resources :relationships, only: [:index] @@ -211,17 +190,9 @@ end end - resources :custom_emojis, only: [:index, :new, :create, :edit, :update] do - collection do - post :batch - end - end + resources :custom_emojis, only: [:index, :new, :create, :edit, :update], concerns: :batch - resources :ip_blocks, only: [:index, :new, :create] do - collection do - post :batch - end - end + resources :ip_blocks, only: [:index, :new, :create], concerns: :batch resources :roles, except: [:show] resources :account_moderation_notes, only: [:create, :destroy] @@ -229,30 +200,14 @@ resources :tags, only: [:index, :show, :update] namespace :trends do - resources :links, only: [:index] do - collection do - post :batch - end - end - - resources :tags, only: [:index] do - collection do - post :batch - end - end - - resources :statuses, only: [:index] do - collection do - post :batch - end + with_options only: [:index], concerns: :batch do + resources :links + resources :tags + resources :statuses end namespace :links do - resources :preview_card_providers, only: [:index], path: :publishers do - collection do - post :batch - end - end + resources :preview_card_providers, only: [:index], path: :publishers, concerns: :batch end end @@ -267,9 +222,5 @@ resources :software_updates, only: [:index] - resources :username_blocks, except: [:show, :destroy] do - collection do - post :batch - end - end + resources :username_blocks, except: [:show, :destroy], concerns: :batch end diff --git a/config/routes/api.rb b/config/routes/api.rb index 444ee946c899db..436006a7e01922 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -8,6 +8,7 @@ namespace :v1_alpha do resources :accounts, only: [] do resources :collections, only: [:index] + resources :in_collections, only: [:index] end resources :async_refreshes, only: :show @@ -157,14 +158,13 @@ resources :peers, only: [:index] resources :rules, only: [:index] resources :domain_blocks, only: [:index] + resources :terms_of_service, only: [:index, :show], param: :date + resource :privacy_policy, only: [:show] - resource :terms_of_service, only: [:show] resource :extended_description, only: [:show] resource :translation_languages, only: [:show] resource :languages, only: [:show] resource :activity, only: [:show], controller: :activity - - get '/terms_of_service/:date', to: 'terms_of_services#show' end end @@ -236,6 +236,7 @@ resources :identity_proofs, only: :index resources :featured_tags, only: :index resources :endorsements, only: :index + resources :email_subscriptions, only: :create end member do @@ -298,7 +299,7 @@ end namespace :featured_tags do - get :suggestions, to: 'suggestions#index' + resources :suggestions, only: :index end resources :featured_tags, only: [:index, :create, :destroy] @@ -340,32 +341,20 @@ resources :ip_blocks, only: [:index, :show, :update, :create, :destroy] namespace :trends do - resources :tags, only: [:index] do - member do - post :approve - post :reject - end - end - resources :links, only: [:index] do + concern :approvable do member do post :approve post :reject end end - resources :statuses, only: [:index] do - member do - post :approve - post :reject - end + with_options only: [:index], concerns: :approvable do + resources :tags + resources :links + resources :statuses end namespace :links do - resources :preview_card_providers, only: [:index], path: :publishers do - member do - post :approve - post :reject - end - end + resources :preview_card_providers, only: [:index], path: :publishers, concerns: :approvable end end diff --git a/config/routes/settings.rb b/config/routes/settings.rb index 7fb627ffe485a7..5551b54fb67b41 100644 --- a/config/routes/settings.rb +++ b/config/routes/settings.rb @@ -9,7 +9,7 @@ namespace :preferences do resource :appearance, only: [:show, :update], controller: :appearance - resource :posting_defaults, only: [:show, :update], controller: :posting_defaults + resource :posting_defaults, only: [:show, :update] resource :notifications, only: [:show, :update] resource :reaching, only: [:show, :update], controller: :reaching resource :custom_css, only: [:show, :update], controller: :custom_css diff --git a/config/settings.yml b/config/settings.yml index dbeeb4d87ef5c4..bd91e6d9c38771 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,6 +26,7 @@ defaults: &defaults preview_sensitive_media: false noindex: false theme: 'default' + thumbnail_description: '' trends: true trendable_by_default: false disallowed_hashtags: # space separated string or list of hashtags without the hash diff --git a/config/sidekiq.yml b/config/sidekiq.yml index d5e2cd521ea976..c68580d839ab55 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -73,3 +73,7 @@ interval: 1 day class: Scheduler::Fasp::FollowRecommendationCleanupScheduler queue: scheduler + collection_item_cleanup_scheduler: + interval: 1 hour + class: Scheduler::CollectionItemCleanupScheduler + queue: scheduler diff --git a/db/migrate/20260311212130_create_email_subscriptions.rb b/db/migrate/20260311212130_create_email_subscriptions.rb new file mode 100644 index 00000000000000..b750ccc7fc8ac8 --- /dev/null +++ b/db/migrate/20260311212130_create_email_subscriptions.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class CreateEmailSubscriptions < ActiveRecord::Migration[8.1] + def change + create_table :email_subscriptions do |t| + t.references :account, null: false, foreign_key: { on_delete: :cascade } + t.string :email, null: false + t.string :locale, null: false + t.string :confirmation_token, index: { unique: true, where: 'confirmation_token is not null' } + t.datetime :confirmed_at + + t.timestamps + end + + add_index :email_subscriptions, [:account_id, :email], unique: true + end +end diff --git a/db/migrate/20260323105645_create_keypairs.rb b/db/migrate/20260323105645_create_keypairs.rb new file mode 100644 index 00000000000000..e3ab970a7c1e10 --- /dev/null +++ b/db/migrate/20260323105645_create_keypairs.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class CreateKeypairs < ActiveRecord::Migration[8.0] + def change + create_table :keypairs do |t| + t.references :account, null: false, foreign_key: { on_delete: :cascade } + + t.string :uri, null: false + t.integer :type, null: false + t.string :public_key, null: false + t.string :private_key + t.datetime :expires_at + t.boolean :revoked, default: false, null: false + + t.timestamps + end + + add_index :keypairs, :uri, unique: true + end +end diff --git a/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb b/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb new file mode 100644 index 00000000000000..df8604ebf12efd --- /dev/null +++ b/db/migrate/20260325151755_add_unique_indexes_to_collections_and_items.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class AddUniqueIndexesToCollectionsAndItems < ActiveRecord::Migration[8.1] + disable_ddl_transaction! + + def change + add_index :collections, :uri, unique: true, where: 'uri IS NOT NULL', algorithm: :concurrently + add_index :collection_items, :uri, unique: true, where: 'uri IS NOT NULL', algorithm: :concurrently + end +end diff --git a/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb b/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb new file mode 100644 index 00000000000000..0b4ba869bc011e --- /dev/null +++ b/db/migrate/20260326112324_remove_unique_index_on_collection_item_object_uris.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveUniqueIndexOnCollectionItemObjectUris < ActiveRecord::Migration[8.1] + def change + remove_index :collection_items, :object_uri, unique: true, where: '(activity_uri IS NOT NULL)' + end +end diff --git a/db/migrate/20260410083500_add_index_to_collection_items_account_id_collection_id.rb b/db/migrate/20260410083500_add_index_to_collection_items_account_id_collection_id.rb new file mode 100644 index 00000000000000..35acd93ec0732d --- /dev/null +++ b/db/migrate/20260410083500_add_index_to_collection_items_account_id_collection_id.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class AddIndexToCollectionItemsAccountIdCollectionId < ActiveRecord::Migration[8.1] + disable_ddl_transaction! + + def up + add_index_to_table + remove_index :collection_items, [:account_id] + end + + def down + add_index :collection_items, [:account_id] + remove_index_from_table + end + + private + + def add_index_to_table + add_index :collection_items, [:account_id, :collection_id], unique: true, algorithm: :concurrently + rescue ActiveRecord::RecordNotUnique + remove_index_from_table + deduplicate_records + retry + end + + def remove_index_from_table + remove_index :collection_items, [:account_id, :collection_id] + end + + def deduplicate_records + safety_assured do + execute <<~SQL.squish + DELETE FROM collection_items + WHERE id NOT IN ( + SELECT DISTINCT ON(account_id, collection_id) id FROM collection_items + ORDER BY account_id, collection_id, id ASC + ) + SQL + end + end +end diff --git a/db/migrate/20260415133505_add_url_to_collections.rb b/db/migrate/20260415133505_add_url_to_collections.rb new file mode 100644 index 00000000000000..b40a792fc4d59f --- /dev/null +++ b/db/migrate/20260415133505_add_url_to_collections.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddURLToCollections < ActiveRecord::Migration[8.1] + def change + add_column :collections, :url, :string + end +end diff --git a/db/migrate/20260420124030_add_collection_limit_to_user_roles.rb b/db/migrate/20260420124030_add_collection_limit_to_user_roles.rb new file mode 100644 index 00000000000000..659fd4b0f9e0bb --- /dev/null +++ b/db/migrate/20260420124030_add_collection_limit_to_user_roles.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddCollectionLimitToUserRoles < ActiveRecord::Migration[8.1] + def change + add_column :user_roles, :collection_limit, :integer, null: false, default: 10 + end +end diff --git a/db/migrate/20260423141611_add_index_to_collection_item_state.rb b/db/migrate/20260423141611_add_index_to_collection_item_state.rb new file mode 100644 index 00000000000000..498dbc7eb8b9ff --- /dev/null +++ b/db/migrate/20260423141611_add_index_to_collection_item_state.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddIndexToCollectionItemState < ActiveRecord::Migration[8.1] + disable_ddl_transaction! + + def change + add_index :collection_items, :state, where: 'state IN (2, 3)', algorithm: :concurrently + end +end diff --git a/db/post_migrate/20220617202502_migrate_roles.rb b/db/post_migrate/20220617202502_migrate_roles.rb index 950699d9c99af5..620d7d54b9b4af 100644 --- a/db/post_migrate/20220617202502_migrate_roles.rb +++ b/db/post_migrate/20220617202502_migrate_roles.rb @@ -7,7 +7,7 @@ class UserRole < ApplicationRecord; end class User < ApplicationRecord; end def up - load Rails.root.join('db', 'seeds', '03_roles.rb') + create_user_roles owner_role = UserRole.find_by(name: 'Owner') moderator_role = UserRole.find_by(name: 'Moderator') @@ -24,4 +24,30 @@ def down User.where(role_id: [admin_role.id, owner_role.id]).in_batches.update_all(admin: true) if admin_role User.where(role_id: moderator_role.id).in_batches.update_all(moderator: true) if moderator_role end + + private + + def create_user_roles + now = Time.zone.now.to_fs(:db) + + safety_assured do + execute <<~SQL.squish + INSERT INTO user_roles ( id, permissions, created_at, updated_at ) + VALUES ( -99, 65536, '#{now}', '#{now}' ) + ON CONFLICT DO NOTHING + SQL + + [ + ['Moderator', 10, 1308], + ['Admin', 100, 983_036], + ['Owner', 1000, 1], + ].each do |name, position, permissions| + execute <<~SQL.squish + INSERT INTO user_roles ( name, position, highlighted, permissions, created_at, updated_at ) + SELECT '#{name}', #{position}, true, #{permissions}, '#{now}', '#{now}' + WHERE NOT EXISTS ( SELECT 1 FROM user_roles WHERE name = '#{name}' ) + SQL + end + end + end end diff --git a/db/schema.rb b/db/schema.rb index 6495cdb62d5599..469f52c9f435e4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2026_03_19_142348) do +ActiveRecord::Schema[8.1].define(version: 2026_04_23_141611) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -491,10 +491,11 @@ t.integer "state", default: 0, null: false t.datetime "updated_at", null: false t.string "uri" - t.index ["account_id"], name: "index_collection_items_on_account_id" + t.index ["account_id", "collection_id"], name: "index_collection_items_on_account_id_and_collection_id", unique: true t.index ["approval_uri"], name: "index_collection_items_on_approval_uri", unique: true, where: "(approval_uri IS NOT NULL)" t.index ["collection_id"], name: "index_collection_items_on_collection_id" - t.index ["object_uri"], name: "index_collection_items_on_object_uri", unique: true, where: "(activity_uri IS NOT NULL)" + t.index ["state"], name: "index_collection_items_on_state", where: "(state = ANY (ARRAY[2, 3]))" + t.index ["uri"], name: "index_collection_items_on_uri", unique: true, where: "(uri IS NOT NULL)" end create_table "collection_reports", force: :cascade do |t| @@ -521,8 +522,10 @@ t.bigint "tag_id" t.datetime "updated_at", null: false t.string "uri" + t.string "url" t.index ["account_id"], name: "index_collections_on_account_id" t.index ["tag_id"], name: "index_collections_on_tag_id" + t.index ["uri"], name: "index_collections_on_uri", unique: true, where: "(uri IS NOT NULL)" end create_table "conversation_mutes", force: :cascade do |t| @@ -655,6 +658,19 @@ t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true end + create_table "email_subscriptions", force: :cascade do |t| + t.bigint "account_id", null: false + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "created_at", null: false + t.string "email", null: false + t.string "locale", null: false + t.datetime "updated_at", null: false + t.index ["account_id", "email"], name: "index_email_subscriptions_on_account_id_and_email", unique: true + t.index ["account_id"], name: "index_email_subscriptions_on_account_id" + t.index ["confirmation_token"], name: "index_email_subscriptions_on_confirmation_token", unique: true, where: "(confirmation_token IS NOT NULL)" + end + create_table "emoji_reactions", force: :cascade do |t| t.bigint "account_id", null: false t.datetime "created_at", precision: nil, null: false @@ -877,6 +893,20 @@ t.index ["ip"], name: "index_ip_blocks_on_ip", unique: true end + create_table "keypairs", force: :cascade do |t| + t.bigint "account_id", null: false + t.datetime "created_at", null: false + t.datetime "expires_at" + t.string "private_key" + t.string "public_key", null: false + t.boolean "revoked", default: false, null: false + t.integer "type", null: false + t.datetime "updated_at", null: false + t.string "uri", null: false + t.index ["account_id"], name: "index_keypairs_on_account_id" + t.index ["uri"], name: "index_keypairs_on_uri", unique: true + end + create_table "list_accounts", force: :cascade do |t| t.bigint "account_id", null: false t.bigint "follow_id" @@ -1674,6 +1704,7 @@ end create_table "user_roles", force: :cascade do |t| + t.integer "collection_limit", default: 10, null: false t.string "color", default: "", null: false t.datetime "created_at", null: false t.boolean "highlighted", default: false, null: false @@ -1855,6 +1886,7 @@ add_foreign_key "custom_filter_statuses", "statuses", on_delete: :cascade add_foreign_key "custom_filters", "accounts", on_delete: :cascade add_foreign_key "email_domain_blocks", "email_domain_blocks", column: "parent_id", on_delete: :cascade + add_foreign_key "email_subscriptions", "accounts", on_delete: :cascade add_foreign_key "emoji_reactions", "accounts", on_delete: :cascade add_foreign_key "emoji_reactions", "custom_emojis", on_delete: :cascade add_foreign_key "emoji_reactions", "statuses", on_delete: :cascade @@ -1878,6 +1910,7 @@ add_foreign_key "identities", "users", name: "fk_bea040f377", on_delete: :cascade add_foreign_key "instance_moderation_notes", "accounts", on_delete: :cascade add_foreign_key "invites", "users", on_delete: :cascade + add_foreign_key "keypairs", "accounts", on_delete: :cascade add_foreign_key "list_accounts", "accounts", on_delete: :cascade add_foreign_key "list_accounts", "follow_requests", on_delete: :cascade add_foreign_key "list_accounts", "follows", on_delete: :cascade diff --git a/docker-compose.yml b/docker-compose.yml index befc8919b172b9..b33e968d4fff2c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes build: . - image: kmyblue:23.0-dev + image: kmyblue:24.0-dev restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: build: dockerfile: ./streaming/Dockerfile context: . - image: kmyblue-streaming:23.0-dev + image: kmyblue-streaming:24.0-dev restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: kmyblue:23.0-dev + image: kmyblue:24.0-dev restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/docs/hero-nodes.gif b/docs/hero-nodes.gif new file mode 100644 index 00000000000000..5692e2ef7cd851 Binary files /dev/null and b/docs/hero-nodes.gif differ diff --git a/lib/chewy/strategy/mastodon.rb b/lib/chewy/strategy/mastodon.rb index a4b655c506e0d1..7eba23a0c9a5a2 100644 --- a/lib/chewy/strategy/mastodon.rb +++ b/lib/chewy/strategy/mastodon.rb @@ -17,6 +17,9 @@ def leave RedisConnection.with do |redis| redis.pipelined do |pipeline| @stash.each do |type, ids| + ids = ids&.compact + next if ids.blank? + pipeline.sadd("chewy:queue:#{type.name}", ids) end end diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index e5db9d6ed23aca..c575c45c1f995e 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -282,8 +282,9 @@ def deduplicate_accounts! deduplicate_remote_accounts!(accounts) end end - + ensure say 'Restoring index_accounts_on_username_and_domain_lower…' + if migrator_version < 2020_06_20_164023 database_connection.add_index :accounts, 'lower (username), lower(domain)', name: 'index_accounts_on_username_and_domain_lower', unique: true else @@ -309,8 +310,9 @@ def deduplicate_users! deduplicate_users_process_confirmation_token deduplicate_users_process_remember_token deduplicate_users_process_password_token - + ensure say 'Restoring users indexes…' + database_connection.add_index :users, ['confirmation_token'], name: 'index_users_on_confirmation_token', unique: true database_connection.add_index :users, ['email'], name: 'index_users_on_email', unique: true database_connection.add_index :users, ['remember_token'], name: 'index_users_on_remember_token', unique: true if migrator_version < 2022_01_18_183010 @@ -380,8 +382,9 @@ def deduplicate_account_domain_blocks! duplicate_record_ids(:account_domain_blocks, 'account_id, domain').each do |row| AccountDomainBlock.where(id: row['ids'].split(',').drop(1)).delete_all end - + ensure say 'Restoring account domain blocks indexes…' + database_connection.add_index :account_domain_blocks, %w(account_id domain), name: 'index_account_domain_blocks_on_account_id_and_domain', unique: true end @@ -394,9 +397,11 @@ def deduplicate_account_identity_proofs! duplicate_record_ids(:account_identity_proofs, 'account_id, provider, provider_username').each do |row| AccountIdentityProof.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - - say 'Restoring account identity proofs indexes…' - database_connection.add_index :account_identity_proofs, %w(account_id provider provider_username), name: 'index_account_proofs_on_account_and_provider_and_username', unique: true + ensure + if db_table_exists?(:account_identity_proofs) + say 'Restoring account identity proofs indexes…' + database_connection.add_index :account_identity_proofs, %w(account_id provider provider_username), name: 'index_account_proofs_on_account_and_provider_and_username', unique: true + end end def deduplicate_announcement_reactions! @@ -408,9 +413,11 @@ def deduplicate_announcement_reactions! duplicate_record_ids(:announcement_reactions, 'account_id, announcement_id, name').each do |row| AnnouncementReaction.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - - say 'Restoring announcement_reactions indexes…' - database_connection.add_index :announcement_reactions, %w(account_id announcement_id name), name: 'index_announcement_reactions_on_account_id_and_announcement_id', unique: true + ensure + if db_table_exists?(:announcement_reactions) + say 'Restoring announcement_reactions indexes…' + database_connection.add_index :announcement_reactions, %w(account_id announcement_id name), name: 'index_announcement_reactions_on_account_id_and_announcement_id', unique: true + end end def deduplicate_conversations! @@ -427,8 +434,9 @@ def deduplicate_conversations! other.destroy end end - + ensure say 'Restoring conversations indexes…' + if migrator_version < 2022_03_07_083603 database_connection.add_index :conversations, ['uri'], name: 'index_conversations_on_uri', unique: true else @@ -450,8 +458,9 @@ def deduplicate_custom_emojis! other.destroy end end - + ensure say 'Restoring custom_emojis indexes…' + database_connection.add_index :custom_emojis, %w(shortcode domain), name: 'index_custom_emojis_on_shortcode_and_domain', unique: true end @@ -469,8 +478,9 @@ def deduplicate_custom_emoji_categories! other.destroy end end - + ensure say 'Restoring custom_emoji_categories indexes…' + database_connection.add_index :custom_emoji_categories, ['name'], name: 'index_custom_emoji_categories_on_name', unique: true end @@ -481,8 +491,9 @@ def deduplicate_domain_allows! duplicate_record_ids(:domain_allows, 'domain').each do |row| DomainAllow.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - + ensure say 'Restoring domain_allows indexes…' + database_connection.add_index :domain_allows, ['domain'], name: 'index_domain_allows_on_domain', unique: true end @@ -505,8 +516,9 @@ def deduplicate_domain_blocks! domain_blocks.each(&:destroy) end - + ensure say 'Restoring domain_blocks indexes…' + database_connection.add_index :domain_blocks, ['domain'], name: 'index_domain_blocks_on_domain', unique: true end @@ -519,9 +531,11 @@ def deduplicate_unavailable_domains! duplicate_record_ids(:unavailable_domains, 'domain').each do |row| UnavailableDomain.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - - say 'Restoring unavailable_domains indexes…' - database_connection.add_index :unavailable_domains, ['domain'], name: 'index_unavailable_domains_on_domain', unique: true + ensure + if db_table_exists?(:unavailable_domains) + say 'Restoring unavailable_domains indexes…' + database_connection.add_index :unavailable_domains, ['domain'], name: 'index_unavailable_domains_on_domain', unique: true + end end def deduplicate_email_domain_blocks! @@ -532,8 +546,9 @@ def deduplicate_email_domain_blocks! domain_blocks = EmailDomainBlock.where(id: row['ids'].split(',')).order(EmailDomainBlock.arel_table[:parent_id].asc.nulls_first).to_a domain_blocks.drop(1).each(&:destroy) end - + ensure say 'Restoring email_domain_blocks indexes…' + database_connection.add_index :email_domain_blocks, ['domain'], name: 'index_email_domain_blocks_on_domain', unique: true end @@ -544,8 +559,9 @@ def deduplicate_media_attachments! duplicate_record_ids_without_nulls(:media_attachments, 'shortcode').each do |row| MediaAttachment.where(id: row['ids'].split(',').drop(1)).update_all(shortcode: nil) end - + ensure say 'Restoring media_attachments indexes…' + if migrator_version < 2022_03_10_060626 database_connection.add_index :media_attachments, ['shortcode'], name: 'index_media_attachments_on_shortcode', unique: true else @@ -560,8 +576,9 @@ def deduplicate_preview_cards! duplicate_record_ids(:preview_cards, 'url').each do |row| PreviewCard.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - + ensure say 'Restoring preview_cards indexes…' + database_connection.add_index :preview_cards, ['url'], name: 'index_preview_cards_on_url', unique: true end @@ -577,8 +594,9 @@ def deduplicate_statuses! status.destroy end end - + ensure say 'Restoring statuses indexes…' + if migrator_version < 2022_03_10_060706 database_connection.add_index :statuses, ['uri'], name: 'index_statuses_on_uri', unique: true else @@ -599,8 +617,9 @@ def deduplicate_tags! tag.destroy end end - + ensure say 'Restoring tags indexes…' + if migrator_version < 2021_04_21_121431 database_connection.add_index :tags, 'lower((name)::text)', name: 'index_tags_on_name_lower', unique: true else @@ -617,9 +636,11 @@ def deduplicate_webauthn_credentials! duplicate_record_ids(:webauthn_credentials, 'external_id').each do |row| WebauthnCredential.where(id: row['ids'].split(',')).order(id: :desc).to_a.drop(1).each(&:destroy) end - - say 'Restoring webauthn_credentials indexes…' - database_connection.add_index :webauthn_credentials, ['external_id'], name: 'index_webauthn_credentials_on_external_id', unique: true + ensure + if db_table_exists?(:webauthn_credentials) + say 'Restoring webauthn_credentials indexes…' + database_connection.add_index :webauthn_credentials, ['external_id'], name: 'index_webauthn_credentials_on_external_id', unique: true + end end def deduplicate_webhooks! @@ -631,9 +652,11 @@ def deduplicate_webhooks! duplicate_record_ids(:webhooks, 'url').each do |row| Webhook.where(id: row['ids'].split(',')).order(id: :desc).drop(1).each(&:destroy) end - - say 'Restoring webhooks indexes…' - database_connection.add_index :webhooks, ['url'], name: 'index_webhooks_on_url', unique: true + ensure + if db_table_exists?(:webhooks) + say 'Restoring webhooks indexes…' + database_connection.add_index :webhooks, ['url'], name: 'index_webhooks_on_url', unique: true + end end def deduplicate_software_updates! diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 84b8617b1be59d..28bc2e2ba8a545 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -35,7 +35,7 @@ def patch end def default_prerelease - 'alpha.6' + 'alpha.7' end def prerelease diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 66f6245d6dc48e..79902b2029a0a3 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -27,6 +27,12 @@ namespace :mastodon do q.messages[:valid?] = 'Invalid domain. If you intend to use unicode characters, enter punycode here' end + if env['LOCAL_DOMAIN'].include?('mastodon') || env['LOCAL_DOMAIN'].include?('mstdn') + prompt.warn 'The Mastodon name is a trademark and its use is restricted.' + prompt.warn 'You can read the trademark policy at https://joinmastodon.org/trademark' + next prompt.warn 'Nothing saved. Bye!' if prompt.no?('Continue anyway?') + end + prompt.say "\n" prompt.say('Single user mode disables registrations and redirects the landing page to your public profile.') diff --git a/package.json b/package.json index 5f5b68e7f51b64..7be9e2003eefc6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.13.0", + "packageManager": "yarn@4.14.1", "engines": { "node": ">=20" }, @@ -49,7 +49,8 @@ "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@formatjs/intl-pluralrules": "^5.4.4", + "@formatjs/intl-pluralrules": "^6.0.0", + "@formatjs/unplugin": "^1.1.5", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", "@optimize-lodash/rollup-plugin": "^6.0.0", @@ -58,11 +59,10 @@ "@rolldown/plugin-babel": "^0.2.2", "@use-gesture/react": "^10.3.1", "@vitejs/plugin-legacy": "^8.0.0", - "@vitejs/plugin-react": "^5.0.0", + "@vitejs/plugin-react": "^6.0.0", "arrow-key-navigation": "^1.2.0", "async-mutex": "^0.5.0", "axios": "^1.4.0", - "babel-plugin-formatjs": "^10.5.37", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "baseline-browser-mapping": "^2.8.30", "blurhash": "^2.0.5", @@ -86,7 +86,7 @@ "http-link-header": "^1.1.1", "idb": "^8.0.3", "immutable": "^4.3.0", - "intl-messageformat": "^10.7.16", + "intl-messageformat": "^11.0.0", "js-yaml": "^4.1.0", "lande": "^1.0.10", "lodash": "^4.17.21", @@ -101,7 +101,7 @@ "react-helmet": "^6.1.0", "react-immutable-proptypes": "^2.2.0", "react-immutable-pure-component": "^2.2.2", - "react-intl": "^7.1.10", + "react-intl": "^10.0.0", "react-overlays": "^5.2.1", "react-redux": "^9.0.4", "react-redux-loading-bar": "^5.0.8", @@ -110,7 +110,6 @@ "react-select": "^5.7.3", "react-sparklines": "^1.7.0", "react-textarea-autosize": "^8.4.1", - "react-toggle": "^4.1.3", "redux-immutable": "^4.0.0", "regenerator-runtime": "^0.14.0", "requestidlecallback": "^0.3.0", @@ -128,7 +127,7 @@ "vite": "^8.0.0", "vite-plugin-manifest-sri": "^0.2.0", "vite-plugin-pwa": "^1.2.0", - "vite-plugin-svgr": "^4.5.0", + "vite-plugin-svgr": "^5.0.0", "wicg-inert": "^3.1.2", "workbox-expiration": "^7.3.0", "workbox-routing": "^7.3.0", @@ -163,17 +162,16 @@ "@types/react-router-dom": "^5.3.3", "@types/react-sparklines": "^1.7.2", "@types/react-test-renderer": "^18.0.0", - "@types/react-toggle": "^4.0.3", "@types/redux-immutable": "^4.0.3", "@types/requestidlecallback": "^0.3.5", "@vitest/browser": "^4.1.0", "@vitest/browser-playwright": "^4.1.0", "@vitest/coverage-v8": "^4.1.0", "@vitest/ui": "^4.1.0", - "chromatic": "^13.3.3", + "chromatic": "^16.0.0", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.2.5", - "eslint-plugin-formatjs": "^5.3.1", + "eslint-plugin-formatjs": "^6.0.0", "eslint-plugin-import": "~2.32.0", "eslint-plugin-jsdoc": "^62.0.0", "eslint-plugin-jsx-a11y": "~6.10.2", @@ -193,7 +191,7 @@ "storybook": "^10.3.0", "stylelint": "^17.0.0", "stylelint-config-standard-scss": "^17.0.0", - "typescript": "~5.9.0", + "typescript": "~6.0.0", "typescript-eslint": "^8.55.0", "typescript-plugin-css-modules": "^5.2.0", "vitest": "^4.1.0" diff --git a/publiccode.yml b/publiccode.yml new file mode 100644 index 00000000000000..079e1417a6d567 --- /dev/null +++ b/publiccode.yml @@ -0,0 +1,191 @@ +publiccodeYmlVersion: 0.5.0 +name: Mastodon +url: https://github.com/mastodon/mastodon +landingURL: https://joinmastodon.org +softwareVersion: v4.5.8 +releaseDate: 2026-03-24 +logo: app/javascript/images/logo.svg +platforms: + - linux + - windows + - web + - mac + - ios + - android +categories: + - communications + - marketing + - online-community + - social-media-management +organisation: + uri: https://joinmastodon.org + name: Mastodon GmbH +usedBy: + - European Commission + - German Federal Government + - Dutch Government +roadmap: https://joinmastodon.org/roadmap +developmentStatus: stable +softwareType: standalone/backend +intendedAudience: + countries: + - AT + - BE + - BG + - CY + - CZ + - DE + - DK + - EE + - ES + - FI + - FR + - GR + - HR + - HU + - IE + - IT + - LT + - LU + - LV + - MT + - NL + - PL + - PT + - RO + - SE + - SI + - SK + scope: + - society + - government + - education + - culture +description: + en: + localisedName: Mastodon + shortDescription: Connecting the world through thriving online communities + longDescription: + 'Mastodon is a free, open-source social network server based on + ActivityPub where users can follow friends and discover new ones. On + Mastodon, users can publish anything they want: links, pictures, text, and + video. All Mastodon servers are interoperable as a federated network + (users on one server can seamlessly communicate with users from another + one, including non-Mastodon software that implements ActivityPub!)' + documentation: https://docs.joinmastodon.org + features: + - Microblogging + - Multimedia (Images, Video, Audio) + - Polls + - Public profiles + - RSS feeds + - User roles and permissions + - Two factor authentication +legal: + license: AGPL-3.0-or-later +maintenance: + type: internal + contacts: + - name: Eugen Rochko + email: eugen@joinmastodon.org + affiliation: Mastodon GmbH +localisation: + localisationReady: true + availableLanguages: + - af + - an + - ar + - ast + - be + - bg + - bn + - br + - bs + - ca + - ckb + - co + - cs + - cy + - da + - de + - el + - en + - en-GB + - eo + - es + - es-AR + - es-MX + - et + - eu + - fa + - fi + - fo + - fr + - fr-CA + - fy + - ga + - gd + - gl + - he + - hi + - hr + - hu + - hy + - ia + - id + - ie + - ig + - io + - is + - it + - ja + - ka + - kab + - kk + - kn + - ko + - ku + - kw + - la + - lt + - lv + - mk + - ml + - mr + - ms + - my + - nan-TW + - nl + - nn + - 'no' + - oc + - pa + - pl + - pt-BR + - pt-PT + - ro + - ru + - sa + - sc + - sco + - si + - sk + - sl + - sq + - sr + - sr-Latn + - sv + - szl + - ta + - te + - th + - tr + - tt + - ug + - uk + - ur + - vi + - zgh + - zh-CN + - zh-HK + - zh-TW diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index f8e78759ccb4e8..10b8d774cf01cd 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -63,11 +63,12 @@ def accounts_table_rows note2 = Fabricate(:account_moderation_note, target_account: account, content: 'Note 2 remarks') get :show, params: { id: account.id } - expect(response).to have_http_status(200) - expect(response.body) - .to include(note1.content) - .and include(note2.content) + expect(response) + .to have_http_status(200) + expect(response.parsed_body) + .to have_css("#account_moderation_note_#{note1.id}", text: note1.content) + .and have_css("#account_moderation_note_#{note2.id}", text: note2.content) end end diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb index b67ee30f74b188..6b955dd803daf3 100644 --- a/spec/controllers/admin/disputes/appeals_controller_spec.rb +++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb @@ -23,9 +23,11 @@ it 'returns a page that lists details of appeals' do get :index - expect(response).to have_http_status(:success) - expect(response.body).to include("#{strike.account.username}") - expect(response.body).to include("#{appeal.account.username}") + expect(response) + .to have_http_status(:success) + expect(response.parsed_body) + .to have_css('span.username', text: strike.account.username) + .and have_css('span.target', text: appeal.account.username) end end diff --git a/spec/controllers/admin/export_domain_blocks_controller_spec.rb b/spec/controllers/admin/export_domain_blocks_controller_spec.rb index 1e748e34b651ac..758e519bc32d01 100644 --- a/spec/controllers/admin/export_domain_blocks_controller_spec.rb +++ b/spec/controllers/admin/export_domain_blocks_controller_spec.rb @@ -27,6 +27,8 @@ get :export, params: { format: :csv } expect(response).to have_http_status(200) + expect(response) + .to have_attachment('domain_blocks.csv') expect(response.body).to eq(domain_blocks_csv_file) end diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb index b6508eb38bf404..3027c92fcf3944 100644 --- a/spec/controllers/admin/instances_controller_spec.rb +++ b/spec/controllers/admin/instances_controller_spec.rb @@ -47,11 +47,11 @@ def instance_directory_links it 'shows an instance page' do get :show, params: { id: account_popular_main.domain } - expect(response).to have_http_status(200) - - expect(response.body) - .to include(I18n.t('admin.instances.totals_time_period_hint_html')) - .and include(I18n.t('accounts.nothing_here')) + expect(response) + .to have_http_status(200) + expect(response.parsed_body) + .to have_css('p', text: I18n.t('admin.instances.totals_time_period_hint_html')) + .and have_css('p', text: I18n.t('accounts.nothing_here')) expect(Admin::ActionLogFilter).to have_received(:new).with(target_domain: account_popular_main.domain) end diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 42e9a850b526d7..9e94cb5d1a8291 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -265,8 +265,8 @@ end it 'renders two factor authentication page' do - expect(response.body) - .to include(I18n.t('simple_form.hints.sessions.otp')) + expect(response.parsed_body) + .to have_css('p.hint.authentication-hint', text: I18n.t('simple_form.hints.sessions.otp')) end end @@ -281,8 +281,8 @@ end it 'renders two factor authentication page' do - expect(response.body) - .to include(I18n.t('simple_form.hints.sessions.otp')) + expect(response.parsed_body) + .to have_css('p.hint.authentication-hint', text: I18n.t('simple_form.hints.sessions.otp')) end end @@ -292,8 +292,8 @@ end it 'renders two factor authentication page' do - expect(response.body) - .to include(I18n.t('simple_form.hints.sessions.otp')) + expect(response.parsed_body) + .to have_css('p.hint.authentication-hint', text: I18n.t('simple_form.hints.sessions.otp')) end end @@ -426,8 +426,8 @@ def process_maximum_two_factor_attempts end it 'renders webauthn authentication page' do - expect(response.body) - .to include(I18n.t('simple_form.title.sessions.webauthn')) + expect(response.parsed_body) + .to have_css('h3.title', text: I18n.t('simple_form.title.sessions.webauthn')) end end @@ -437,8 +437,8 @@ def process_maximum_two_factor_attempts end it 'renders webauthn authentication page' do - expect(response.body) - .to include(I18n.t('simple_form.title.sessions.webauthn')) + expect(response.parsed_body) + .to have_css('h3.title', text: I18n.t('simple_form.title.sessions.webauthn')) end end diff --git a/spec/controllers/concerns/account_controller_concern_spec.rb b/spec/controllers/concerns/account_controller_concern_spec.rb index b5c8c166433f5c..2f7e230d482b79 100644 --- a/spec/controllers/concerns/account_controller_concern_spec.rb +++ b/spec/controllers/concerns/account_controller_concern_spec.rb @@ -59,8 +59,8 @@ def success .to have_http_status(200) .and have_http_link_header(webfinger_url(resource: account.to_webfinger_s)).for(rel: 'lrdd', type: 'application/jrd+json') .and have_http_link_header(ActivityPub::TagManager.instance.uri_for(account)).for(rel: 'alternate', type: 'application/activity+json') - expect(response.body) - .to include(account.username) + expect(response.parsed_body) + .to eq(account.username) end end end diff --git a/spec/controllers/concerns/settings/export_controller_concern_spec.rb b/spec/controllers/concerns/settings/export_controller_concern_spec.rb index 6c1a06114c5d67..782ec88ecd6020 100644 --- a/spec/controllers/concerns/settings/export_controller_concern_spec.rb +++ b/spec/controllers/concerns/settings/export_controller_concern_spec.rb @@ -23,7 +23,8 @@ def export_data expect(response).to have_http_status(200) expect(response.media_type).to eq 'text/csv' - expect(response.headers['Content-Disposition']).to start_with 'attachment; filename="anonymous.csv"' + expect(response) + .to have_attachment('anonymous.csv') expect(response.body).to eq 'body data value' end diff --git a/spec/controllers/settings/imports_controller_spec.rb b/spec/controllers/settings/imports_controller_spec.rb index c2c6c353f31077..a8fa9fdd35a4dc 100644 --- a/spec/controllers/settings/imports_controller_spec.rb +++ b/spec/controllers/settings/imports_controller_spec.rb @@ -22,8 +22,8 @@ it 'assigns the expected imports', :aggregate_failures do expect(response).to have_http_status(200) expect(response.headers['Cache-Control']).to include('private, no-store') - expect(response.body) - .to include("bulk_import_#{import.id}") + expect(response.parsed_body) + .to have_css("#bulk_import_#{import.id}") .and not_include("bulk_import_#{other_import.id}") end end @@ -136,7 +136,7 @@ describe 'GET #failures' do subject { get :failures, params: { id: bulk_import.id }, format: :csv } - shared_examples 'export failed rows' do |expected_contents| + shared_examples 'export failed rows' do |filename, expected_contents| let(:bulk_import) { Fabricate(:bulk_import, account: user.account, type: import_type, state: :finished) } before do @@ -147,8 +147,12 @@ it 'returns expected contents', :aggregate_failures do subject - expect(response).to have_http_status(200) - expect(response.body).to eq expected_contents + expect(response) + .to have_http_status(200) + expect(response) + .to have_attachment(filename) + expect(response.body) + .to eq expected_contents end end @@ -162,7 +166,7 @@ ] end - it_behaves_like 'export failed rows', "Account address,Show boosts,Notify on new posts,Languages\nfoo@bar,true,false,\nuser@bar,false,true,\"fr, de\"\n" + it_behaves_like 'export failed rows', 'following_accounts_failures.csv', "Account address,Show boosts,Notify on new posts,Languages\nfoo@bar,true,false,\nuser@bar,false,true,\"fr, de\"\n" end context 'with blocks' do @@ -175,7 +179,7 @@ ] end - it_behaves_like 'export failed rows', "foo@bar\nuser@bar\n" + it_behaves_like 'export failed rows', 'blocked_accounts_failures.csv', "foo@bar\nuser@bar\n" end context 'with mutes' do @@ -188,7 +192,7 @@ ] end - it_behaves_like 'export failed rows', "Account address,Hide notifications\nfoo@bar,true\nuser@bar,false\n" + it_behaves_like 'export failed rows', 'muted_accounts_failures.csv', "Account address,Hide notifications\nfoo@bar,true\nuser@bar,false\n" end context 'with domain blocks' do @@ -201,7 +205,7 @@ ] end - it_behaves_like 'export failed rows', "bad.domain\nevil.domain\n" + it_behaves_like 'export failed rows', 'blocked_domains_failures.csv', "bad.domain\nevil.domain\n" end context 'with bookmarks' do @@ -214,7 +218,7 @@ ] end - it_behaves_like 'export failed rows', "https://foo.com/1\nhttps://foo.com/2\n" + it_behaves_like 'export failed rows', 'bookmarks_failures.csv', "https://foo.com/1\nhttps://foo.com/2\n" end context 'with lists' do @@ -227,7 +231,7 @@ ] end - it_behaves_like 'export failed rows', "Amigos,user@example.com\nFrenemies,user@org.org\n" + it_behaves_like 'export failed rows', 'lists_failures.csv', "Amigos,user@example.com\nFrenemies,user@org.org\n" end end diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index db4fb19411fb0c..a87c55364e5a4b 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -12,7 +12,8 @@ expect(response).to have_http_status(200) expect(response.body) .to include(qr_code_markup) - .and include(I18n.t('settings.two_factor_authentication')) + expect(response.parsed_body) + .to have_title(I18n.t('settings.two_factor_authentication')) end def qr_code_markup @@ -80,7 +81,8 @@ def totp_provisioning_uri .to have_http_status(200) expect(response.body) .to include(*otp_backup_codes) - .and include(I18n.t('settings.two_factor_authentication')) + expect(response.parsed_body) + .to have_title(I18n.t('settings.two_factor_authentication')) end end @@ -98,8 +100,8 @@ def totp_provisioning_uri it 'renders page with error message' do subject - expect(response.body) - .to include(I18n.t('otp_authentication.wrong_code')) + expect(response.parsed_body) + .to have_css('.flash-message', text: I18n.t('otp_authentication.wrong_code')) end it_behaves_like 'renders expected page' diff --git a/spec/fabricators/email_subscription_fabricator.rb b/spec/fabricators/email_subscription_fabricator.rb new file mode 100644 index 00000000000000..8d61945564730d --- /dev/null +++ b/spec/fabricators/email_subscription_fabricator.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +Fabricator(:email_subscription) do + account + email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } + locale 'en' +end diff --git a/spec/fabricators/keypair_fabricator.rb b/spec/fabricators/keypair_fabricator.rb new file mode 100644 index 00000000000000..5eae3872d271f6 --- /dev/null +++ b/spec/fabricators/keypair_fabricator.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +keypair = OpenSSL::PKey::RSA.new(2048) +public_key = keypair.public_key.to_pem +private_key = keypair.to_pem + +Fabricator(:keypair) do + account + type :rsa + public_key public_key + expires_at nil + revoked false + + after_build do |keypair| + keypair.uri ||= ActivityPub::TagManager.instance.key_uri_for(keypair.account) + keypair.private_key ||= private_key if keypair.account.local? + end +end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 6772e3217c1af3..83bce761b2d2f6 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -98,14 +98,14 @@ def current_account end end - describe 'available_sign_up_path' do + describe 'available_sign_up_url' do context 'when registrations are closed' do before do allow(Setting).to receive(:[]).with('registrations_mode').and_return 'none' end it 'redirects to joinmastodon site' do - expect(helper.available_sign_up_path).to match(/joinmastodon.org/) + expect(helper.available_sign_up_url).to match(/joinmastodon.org/) end end @@ -117,13 +117,13 @@ def current_account end it 'redirects to joinmastodon site' do - expect(helper.available_sign_up_path).to match(/joinmastodon.org/) + expect(helper.available_sign_up_url).to match(/joinmastodon.org/) end end context 'when registrations are allowed' do it 'returns a link to the registration page' do - expect(helper.available_sign_up_path).to eq(new_user_registration_path) + expect(helper.available_sign_up_url).to eq(new_user_registration_url) end end end diff --git a/spec/helpers/settings_helper_spec.rb b/spec/helpers/settings_helper_spec.rb index ecff2edbfa159d..63773634e943da 100644 --- a/spec/helpers/settings_helper_spec.rb +++ b/spec/helpers/settings_helper_spec.rb @@ -3,6 +3,22 @@ require 'rails_helper' RSpec.describe SettingsHelper do + describe '#user_settings_collection' do + subject { helper.user_settings_collection(value) } + + context 'with valid value' do + let(:value) { 'web.contrast' } + + it { is_expected.to eq(%w(auto high)) } + end + + context 'with invalid value' do + let(:value) { 'web.nothing_at_this_key_at_all_fake_fake_fake' } + + it { is_expected.to be_empty } + end + end + describe 'session_device_icon' do context 'with a mobile device' do let(:session) { SessionActivation.new(user_agent: 'Mozilla/5.0 (iPhone)') } diff --git a/spec/helpers/theme_helper_spec.rb b/spec/helpers/theme_helper_spec.rb index 9222a300055663..b6b50a7bfa5990 100644 --- a/spec/helpers/theme_helper_spec.rb +++ b/spec/helpers/theme_helper_spec.rb @@ -108,11 +108,20 @@ it { is_expected.to eq('default') } end - context 'when theme is changed in settings', skip: 'theme.yml has only one theme' do - before { Setting.theme = 'contrast' } + context 'when theme is changed in settings' do + before do + allow(Themes.instance).to receive(:names).and_return(%w(default contrast)) + Setting.theme = 'contrast' + end it { is_expected.to eq('contrast') } end + + context 'when theme is changed to invalid value' do + before { Setting.theme = 'fakethemename' } + + it { is_expected.to eq('default') } + end end context 'when user is signed in' do diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb index d6f54ba1b8f11e..a95f0c1f376c66 100644 --- a/spec/lib/activitypub/activity/accept_spec.rb +++ b/spec/lib/activitypub/activity/accept_spec.rb @@ -172,7 +172,7 @@ end end - context 'with a FeatureRequest', feature: :collections_federation do + context 'with a FeatureRequest', feature: :collections do let(:collection) { Fabricate(:collection, account: recipient) } let(:collection_item) { Fabricate(:collection_item, collection:, account: sender, state: :pending) } let(:object) { collection_item.activity_uri } diff --git a/spec/lib/activitypub/activity/add_spec.rb b/spec/lib/activitypub/activity/add_spec.rb index d0bdfbe2185979..b444f38a3d0058 100644 --- a/spec/lib/activitypub/activity/add_spec.rb +++ b/spec/lib/activitypub/activity/add_spec.rb @@ -80,7 +80,7 @@ end end - context 'when the target is the `featuredCollections` collection', feature: :collections_federation do + context 'when the target is the `featuredCollections` collection', feature: :collections do subject { described_class.new(activity_json, account) } let(:account) { Fabricate(:remote_account, collections_url: 'https://example.com/actor/1/featured_collections') } @@ -122,7 +122,7 @@ end end - context 'when the target is a collection', feature: :collections_federation do + context 'when the target is a collection', feature: :collections do subject { described_class.new(activity_json, collection.account) } let(:collection) { Fabricate(:remote_collection) } diff --git a/spec/lib/activitypub/activity/delete_spec.rb b/spec/lib/activitypub/activity/delete_spec.rb index 047138d3053971..e0901d8f993d7a 100644 --- a/spec/lib/activitypub/activity/delete_spec.rb +++ b/spec/lib/activitypub/activity/delete_spec.rb @@ -120,7 +120,7 @@ end end - context 'with a FeatureAuthorization', feature: :collections_federation do + context 'with a FeatureAuthorization', feature: :collections do let(:recipient) { Fabricate(:account) } let(:approval_uri) { 'https://example.com/authorizations/1' } let(:collection) { Fabricate(:collection, account: recipient) } diff --git a/spec/lib/activitypub/activity/feature_request_spec.rb b/spec/lib/activitypub/activity/feature_request_spec.rb index ac3e42b27213d8..5d134b6cebb230 100644 --- a/spec/lib/activitypub/activity/feature_request_spec.rb +++ b/spec/lib/activitypub/activity/feature_request_spec.rb @@ -20,18 +20,20 @@ } end - describe '#perform', feature: :collections_federation do + describe '#perform', feature: :collections do subject { described_class.new(json, sender) } context 'when recipient is discoverable' do let(:discoverable) { true } - it 'schedules a job to send an `Accept` activity' do + it 'schedules a job to send an `Accept` activity as well as a notification worker' do expect { subject.perform } - .to enqueue_sidekiq_job(ActivityPub::DeliveryWorker) + .to enqueue_sidekiq_job(LocalNotificationWorker).with(recipient.id, anything, 'CollectionItem', 'added_to_collection') + .and enqueue_sidekiq_job(ActivityPub::DeliveryWorker) .with(satisfying do |body| response_json = JSON.parse(body) response_json['type'] == 'Accept' && + response_json['object'] == 'https://example.com/feature_requests/1' && response_json['to'] == sender.uri end, recipient.id, sender.inbox_url) end @@ -46,9 +48,33 @@ .with(satisfying do |body| response_json = JSON.parse(body) response_json['type'] == 'Reject' && + response_json['object'] == 'https://example.com/feature_requests/1' && response_json['to'] == sender.uri end, recipient.id, sender.inbox_url) end end + + context 'when the collection is not yet known' do + let(:discoverable) { true } + let(:collection) { instance_double(Collection, uri: 'https://example.com/collections/1') } + let(:stubbed_service) do + service = instance_double(ActivityPub::FetchRemoteFeaturedCollectionService) + allow(service).to receive(:call) do + Fabricate(:remote_collection, account: sender, uri: collection.uri) + end + service + end + + before do + allow(ActivityPub::FetchRemoteFeaturedCollectionService).to receive(:new).and_return(stubbed_service) + end + + it 'fetches the collection before handling the request' do + subject.perform + + expect(ActivityPub::DeliveryWorker).to have_enqueued_sidekiq_job + expect(stubbed_service).to have_received(:call) + end + end end end diff --git a/spec/lib/activitypub/activity/flag_spec.rb b/spec/lib/activitypub/activity/flag_spec.rb index be1bd42a14a810..54f76c9badb5b6 100644 --- a/spec/lib/activitypub/activity/flag_spec.rb +++ b/spec/lib/activitypub/activity/flag_spec.rb @@ -143,7 +143,34 @@ end end - context 'when an account is passed but no status' do + context 'when the activity includes and account and a collection' do + let(:collection) { Fabricate(:collection, account: flagged) } + let(:json) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => flag_id, + 'type' => 'Flag', + 'content' => 'Boo!!', + 'actor' => ActivityPub::TagManager.instance.uri_for(sender), + 'object' => [ + ActivityPub::TagManager.instance.uri_for(flagged), + ActivityPub::TagManager.instance.uri_for(collection), + ], + } + end + + it 'creates a report with an attached collection' do + subject.perform + + report = Report.find_by(account: sender, target_account: flagged) + + expect(report).to_not be_nil + expect(report.comment).to eq 'Boo!!' + expect(report.collections).to contain_exactly(collection) + end + end + + context 'when an account is passed but no status or collection' do let(:mentioned) { Fabricate(:account) } let(:json) do diff --git a/spec/lib/activitypub/activity/reject_spec.rb b/spec/lib/activitypub/activity/reject_spec.rb index 42974b251fc001..4ac340a4adc333 100644 --- a/spec/lib/activitypub/activity/reject_spec.rb +++ b/spec/lib/activitypub/activity/reject_spec.rb @@ -170,8 +170,11 @@ } end - it 'deletes the collection item' do - expect { subject.perform }.to change(collection.collection_items, :count).by(-1) + it 'sets the collection item state to `rejected`' do + expect do + subject.perform + collection_item.reload + end.to change(collection_item, :state).to('rejected') end end diff --git a/spec/lib/activitypub/activity/update_spec.rb b/spec/lib/activitypub/activity/update_spec.rb index 5c74b3dde803e1..8c37b296dcb873 100644 --- a/spec/lib/activitypub/activity/update_spec.rb +++ b/spec/lib/activitypub/activity/update_spec.rb @@ -318,8 +318,11 @@ end end - context 'with a `FeaturedCollection` object', feature: :collections_federation do + context 'with a `FeaturedCollection` object', feature: :collections do let(:collection) { Fabricate(:remote_collection, account: sender, name: 'old name', discoverable: false) } + let(:account) { Fabricate(:account) } + let!(:collection_item) { Fabricate(:collection_item, account:, collection:, uri: 'https://example.com/featured_stamps/1') } + let(:featured_collection_json) do { '@context' => 'https://www.w3.org/ns/activitystreams', @@ -328,13 +331,21 @@ 'attributedTo' => sender.uri, 'name' => 'Cool people', 'summary' => 'People you should follow.', - 'totalItems' => 0, + 'totalItems' => 1, 'sensitive' => false, 'discoverable' => true, 'published' => '2026-03-09T15:19:25Z', 'updated' => Time.zone.now.iso8601, + 'orderedItems' => [ + { + 'type' => 'FeaturedItem', + 'id' => ActivityPub::TagManager.instance.uri_for(collection_item), + 'object' => ActivityPub::TagManager.instance.uri_for(account), + }, + ], } end + let(:json) do { '@context' => 'https://www.w3.org/ns/activitystreams', @@ -343,18 +354,41 @@ 'object' => featured_collection_json, } end - let(:stubbed_service) do - instance_double(ActivityPub::ProcessFeaturedCollectionService, call: true) - end - before do - allow(ActivityPub::ProcessFeaturedCollectionService).to receive(:new).and_return(stubbed_service) + it 'updates the collection and notifies local user' do + expect { subject.perform } + .to change { collection.reload.name }.to(featured_collection_json['name']) + .and enqueue_sidekiq_job(LocalNotificationWorker).with(account.id, collection.id, 'Collection', 'collection_update') end - it 'updates the collection' do - subject.perform + context 'when the metadata does not actually change' do + let(:featured_collection_json) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => collection.uri, + 'type' => 'FeaturedCollection', + 'attributedTo' => sender.uri, + 'name' => collection.name, + 'summary' => collection.description_html, + 'totalItems' => 1, + 'sensitive' => false, + 'discoverable' => true, + 'published' => '2026-03-09T15:19:25Z', + 'updated' => Time.zone.now.iso8601, + 'orderedItems' => [ + { + 'type' => 'FeaturedItem', + 'id' => ActivityPub::TagManager.instance.uri_for(collection_item), + 'object' => ActivityPub::TagManager.instance.uri_for(account), + }, + ], + } + end - expect(stubbed_service).to have_received(:call).with(sender, featured_collection_json) + it 'does not notify the local user' do + expect { subject.perform } + .to_not enqueue_sidekiq_job(LocalNotificationWorker) + end end end end diff --git a/spec/lib/activitypub/linked_data_signature_spec.rb b/spec/lib/activitypub/linked_data_signature_spec.rb index 8128fdd070b645..7aaff9680e3d00 100644 --- a/spec/lib/activitypub/linked_data_signature_spec.rb +++ b/spec/lib/activitypub/linked_data_signature_spec.rb @@ -7,6 +7,7 @@ subject { described_class.new(json) } + let(:keyid) { 'http://example.com/alice#rsa-key' } let!(:sender) { Fabricate(:account, uri: 'http://example.com/alice', domain: 'example.com') } let(:raw_json) do @@ -25,7 +26,7 @@ context 'when signature matches' do let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end @@ -40,7 +41,7 @@ context 'when local account record is missing a public key' do let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end @@ -59,15 +60,14 @@ allow(ActivityPub::FetchRemoteKeyService).to receive(:new).and_return(service_stub) - allow(service_stub).to receive(:call).with('http://example.com/alice') do - sender.update!(public_key: old_key) - sender + allow(service_stub).to receive(:call).with(keyid) do + Keypair.new(account: sender, type: :rsa, public_key: old_key, uri: keyid) end end it 'fetches key and returns creator' do expect(subject.verify_actor!).to eq sender - expect(service_stub).to have_received(:call).with('http://example.com/alice').once + expect(service_stub).to have_received(:call).with(keyid).once end end @@ -82,7 +82,7 @@ context 'when signature is tampered' do let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end @@ -100,7 +100,7 @@ let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end @@ -116,7 +116,7 @@ let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end @@ -132,7 +132,7 @@ let(:raw_signature) do { - 'creator' => 'http://example.com/alice', + 'creator' => keyid, 'created' => '2017-09-23T20:21:34Z', } end diff --git a/spec/lib/fasp/request_spec.rb b/spec/lib/fasp/request_spec.rb index 6456057b5e7190..cdc20270cdb2a1 100644 --- a/spec/lib/fasp/request_spec.rb +++ b/spec/lib/fasp/request_spec.rb @@ -86,14 +86,16 @@ WebMock.enable! end - it 'raises Mastodon::ValidationError' do - resolver = instance_double(Resolv::DNS) + let(:resolv_service) { instance_double(Resolv) } - allow(resolver).to receive(:getaddresses).with('reqprov.example.com').and_return(%w(0.0.0.0 2001:db8::face)) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + before do + allow(Resolv).to receive(:new).and_return(resolv_service) + allow(resolv_service).to receive(:getaddresses).with('reqprov.example.com').and_return(%w(0.0.0.0 2001:db8::face)) + end - expect { subject.send(method, '/test_path') }.to raise_error(Mastodon::ValidationError) + it 'raises Mastodon::ValidationError' do + expect { subject.send(method, '/test_path') } + .to raise_error(Mastodon::ValidationError) end end end diff --git a/spec/lib/private_address_check_spec.rb b/spec/lib/private_address_check_spec.rb index ee9f9295d50024..20a94983d9e492 100644 --- a/spec/lib/private_address_check_spec.rb +++ b/spec/lib/private_address_check_spec.rb @@ -4,17 +4,11 @@ RSpec.describe PrivateAddressCheck do describe 'private_address?' do + let(:private_ips) { %w(192.168.1.7 0.0.0.0 127.0.0.1 ::ffff:0.0.0.1) } + it 'returns true for private addresses' do - # rubocop:disable RSpec/ExpectActual - expect( - [ - '192.168.1.7', - '0.0.0.0', - '127.0.0.1', - '::ffff:0.0.0.1', - ] - ).to all satisfy('return true') { |addr| described_class.private_address?(IPAddr.new(addr)) } - # rubocop:enable RSpec/ExpectActual + expect(private_ips) + .to all(satisfy { |addr| described_class.private_address?(IPAddr.new(addr)) }) end end end diff --git a/spec/lib/request/socket_spec.rb b/spec/lib/request/socket_spec.rb new file mode 100644 index 00000000000000..2c6a12a304771e --- /dev/null +++ b/spec/lib/request/socket_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Request::Socket do + describe '.open' do + context 'when an IPv6 only host lookup' do + let(:resolv_service) { instance_double(Resolv) } + let(:socket_service) { instance_double(Socket).as_null_object } + + before do + allow(Resolv).to receive(:new).and_return(resolv_service) + allow(Socket).to receive(:new).and_return(socket_service) + allow(resolv_service).to receive(:getaddresses).with('example.com').and_return(%w(2001:4860:4860::8844)) + end + + it 'returns a valid socket' do + described_class.open('example.com') + + expect(Socket) + .to have_received(:new) + .with(Socket::AF_INET6, Socket::SOCK_STREAM, 0) + end + end + end +end diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb index da6182345502ce..228c8bbb67cee3 100644 --- a/spec/lib/request_spec.rb +++ b/spec/lib/request_spec.rb @@ -66,15 +66,20 @@ def initialized_url_value expect(a_request(:get, 'http://example.com')).to have_been_made.once end - it 'executes a HTTP request when the first address is private' do - resolver = instance_double(Resolv::DNS) + context 'when first address is private' do + let(:resolv_service) { instance_double(Resolv) } - allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:4860:4860::8844)) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + before do + allow(Resolv).to receive(:new).and_return(resolv_service) + allow(resolv_service).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:4860:4860::8844)) + end - expect { |block| subject.perform(&block) }.to yield_control - expect(a_request(:get, 'http://example.com')).to have_been_made.once + it 'executes a HTTP request' do + expect { |block| subject.perform(&block) } + .to yield_control + expect(a_request(:get, 'http://example.com')) + .to have_been_made.once + end end it 'makes a request with expected headers, yields, and closes the underlying connection' do @@ -123,14 +128,16 @@ def initialized_url_value WebMock.enable! end - it 'raises Mastodon::ValidationError' do - resolver = instance_double(Resolv::DNS) + let(:resolv_service) { instance_double(Resolv) } - allow(resolver).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:db8::face)) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + before do + allow(Resolv).to receive(:new).with([be_a(Resolv::Hosts), be_a(Resolv::DNS)]).and_return(resolv_service) + allow(resolv_service).to receive(:getaddresses).with('example.com').and_return(%w(0.0.0.0 2001:db8::face)) + end - expect { subject.perform }.to raise_error Mastodon::ValidationError + it 'raises Mastodon::ValidationError' do + expect { subject.perform } + .to raise_error Mastodon::ValidationError end end diff --git a/spec/lib/webfinger_resource_spec.rb b/spec/lib/webfinger_resource_spec.rb index 0b86b41c481db3..581fa7264b4961 100644 --- a/spec/lib/webfinger_resource_spec.rb +++ b/spec/lib/webfinger_resource_spec.rb @@ -11,133 +11,127 @@ Rails.configuration.x.web_domain = before_web end - describe '#username' do + describe '#account' do + subject { described_class.new(resource).account } + describe 'with a URL value' do - it 'raises with a route whose controller is not AccountsController' do - resource = 'https://example.com/users/alice/other' + context 'with a route whose controller is not AccountsController' do + let(:resource) { 'https://example.com/users/alice/other' } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'raises with a route whose action is not show' do - resource = 'https://example.com/users/alice' - - recognized = Rails.application.routes.recognize_path(resource) - allow(recognized).to receive(:[]).with(:controller).and_return('accounts') - allow(recognized).to receive(:[]).with(:username).and_return('alice') - allow(recognized).to receive(:[]).with(:action).and_return('create') + context 'with a string that does not start with an URL' do + let(:resource) { 'website for http://example.com/users/alice.other' } - allow(Rails.application.routes).to receive(:recognize_path).with(resource).and_return(recognized) + it 'raises an error' do + expect { subject }.to raise_error(described_class::InvalidRequest) + end + end - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) - expect(recognized).to have_received(:[]).exactly(3).times + context 'with a valid HTTPS route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "https://example.com/users/#{account.username}" } - expect(Rails.application.routes).to have_received(:recognize_path) - .with(resource) - .at_least(:once) + it { is_expected.to eq(account) } end - it 'raises with a string that doesnt start with URL' do - resource = 'website for http://example.com/users/alice/other' + context 'with a valid HTTPS route to an existing user using the new API scheme' do + let(:account) { Fabricate(:account) } + let(:resource) { "https://example.com/ap/users/#{account.id}" } - expect do - described_class.new(resource).username - end.to raise_error(described_class::InvalidRequest) + it { is_expected.to eq(account) } end - it 'finds the username in a valid https route' do - resource = 'https://example.com/users/alice' + context 'with a valid HTTPS route to a non-existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { 'https://example.com/users/alice' } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'finds the username in a mixed case http route' do - resource = 'HTTp://exAMPLe.com/users/alice' + context 'with a mixed case HTTP but valid route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "HTTp://example.com/users/#{account.username}" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end - it 'finds the username in a valid http route' do - resource = 'http://example.com/users/alice' + context 'with a valid HTTP route to an existing user' do + let(:account) { Fabricate(:account) } + let(:resource) { "http://example.com/users/#{account.username}" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end end describe 'with a username and hostname value' do - it 'raises on a non-local domain' do - resource = 'user@remote-host.com' + context 'with a non-local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@remote-host.com" } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'finds username for a local domain' do - Rails.configuration.x.local_domain = 'example.com' - resource = 'alice@example.com' + context 'with a valid handle for a local user with local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@example.com" } + + before { Rails.configuration.x.local_domain = 'example.com' } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end - it 'finds username for a web domain' do - Rails.configuration.x.web_domain = 'example.com' - resource = 'alice@example.com' + context 'with a valid handle for a local user with web domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "#{account.username}@example.com" } - result = described_class.new(resource).username - expect(result).to eq 'alice' + before { Rails.configuration.x.web_domain = 'example.com' } + + it { is_expected.to eq(account) } end end describe 'with an acct value' do - it 'raises on a non-local domain' do - resource = 'acct:user@remote-host.com' + context 'with a non-local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@remote-host.com" } - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) + it 'raises an error' do + expect { subject }.to raise_error(ActiveRecord::RecordNotFound) + end end - it 'raises on a nonsense domain' do - resource = 'acct:user@remote-host@remote-hostess.remote.local@remote' - - expect do - described_class.new(resource).username - end.to raise_error(ActiveRecord::RecordNotFound) - end + context 'with a valid handle for a local user with local domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@example.com" } - it 'finds the username for a local account if the domain is the local one' do - Rails.configuration.x.local_domain = 'example.com' - resource = 'acct:alice@example.com' + before { Rails.configuration.x.local_domain = 'example.com' } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end - it 'finds the username for a local account if the domain is the Web one' do - Rails.configuration.x.web_domain = 'example.com' - resource = 'acct:alice@example.com' + context 'with a valid handle for a local user with web domain' do + let(:account) { Fabricate(:account) } + let(:resource) { "acct:#{account.username}@example.com" } + + before { Rails.configuration.x.web_domain = 'example.com' } - result = described_class.new(resource).username - expect(result).to eq 'alice' + it { is_expected.to eq(account) } end end describe 'with a nonsense resource' do - it 'raises InvalidRequest' do - resource = 'df/:dfkj' + let(:resource) { 'df/:dfkj' } - expect do - described_class.new(resource).username - end.to raise_error(described_class::InvalidRequest) + it 'raises an error' do + expect { subject }.to raise_error(described_class::InvalidRequest) end end end diff --git a/spec/mailers/email_subscription_mailer_spec.rb b/spec/mailers/email_subscription_mailer_spec.rb new file mode 100644 index 00000000000000..4782291145baea --- /dev/null +++ b/spec/mailers/email_subscription_mailer_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe EmailSubscriptionMailer do + describe '.confirmation' do + let(:email_subscription) { Fabricate(:email_subscription) } + let(:mail) { described_class.with(subscription: email_subscription).confirmation } + + it 'renders the email' do + expect { mail.deliver } + .to send_email( + to: email_subscription.email, + from: 'notifications@localhost', + subject: I18n.t('email_subscription_mailer.confirmation.subject') + ) + end + end + + describe '.notification' do + let(:email_subscription) { Fabricate(:email_subscription, confirmed_at: Time.now.utc) } + let(:statuses) { Fabricate.times(num_of_statuses, :status) } + let(:mail) { described_class.with(subscription: email_subscription).notification(statuses) } + + context 'with a single status' do + let(:num_of_statuses) { 1 } + + it 'renders the email' do + expect { mail.deliver } + .to send_email( + to: email_subscription.email, + from: 'notifications@localhost', + subject: I18n.t('email_subscription_mailer.notification.subject.singular', name: email_subscription.account.display_name, excerpt: statuses.first.text.truncate(17)) + ) + end + end + + context 'with multiple statuses' do + let(:num_of_statuses) { 2 } + + it 'renders the email' do + expect { mail.deliver } + .to send_email( + to: email_subscription.email, + from: 'notifications@localhost', + subject: I18n.t('email_subscription_mailer.notification.subject.plural', name: email_subscription.account.display_name, excerpt: ActionController::Base.helpers.truncate(statuses.first.text, length: 17)) + ) + end + end + end +end diff --git a/spec/mailers/previews/email_subscription_mailer_preview.rb b/spec/mailers/previews/email_subscription_mailer_preview.rb new file mode 100644 index 00000000000000..436e24c390d725 --- /dev/null +++ b/spec/mailers/previews/email_subscription_mailer_preview.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +# Preview all emails at http://localhost:3000/rails/mailers/admin_mailer + +class EmailSubscriptionMailerPreview < ActionMailer::Preview + # Preview this email at http://localhost:3000/rails/mailers/email_subscription_mailer/confirmation + def confirmation + EmailSubscriptionMailer.with(subscription: EmailSubscription.last!).confirmation + end + + # Preview this email at http://localhost:3000/rails/mailers/email_subscription_mailer/notification + def notification + EmailSubscriptionMailer.with(subscription: EmailSubscription.last!).notification(Status.where(visibility: :public).without_replies.without_reblogs.limit(5)) + end +end diff --git a/spec/models/account/fields_spec.rb b/spec/models/account/fields_spec.rb new file mode 100644 index 00000000000000..1cf3b98dcc6ee4 --- /dev/null +++ b/spec/models/account/fields_spec.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Account, '#fields' do + subject { Fabricate.build :account } + + describe 'Validations' do + context 'when account is local' do + subject { Fabricate.build :account, domain: nil } + + it { is_expected.to allow_value(fields_empty_name_value).for(:fields) } + it { is_expected.to_not allow_values(fields_over_limit, fields_empty_name).for(:fields) } + + def fields_empty_name_value + Array.new(described_class::DEFAULT_FIELDS_SIZE) { %w(name value).index_with('') } + end + + def fields_over_limit + Array.new(described_class::DEFAULT_FIELDS_SIZE + 1) { { 'name' => 'Name', 'value' => 'Value', 'verified_at' => '01/01/1970' } } + end + + def fields_empty_name + [{ 'name' => '', 'value' => 'Value', 'verified_at' => '01/01/1970' }] + end + end + end + + describe '#fields' do + subject { account.fields } + + let(:account) { Fabricate.build :account } + + context 'when attribute is nil' do + before { account.fields = nil } + + it { is_expected.to be_empty } + end + + context 'when attribute has valid data' do + before { account.fields = [{ 'name' => 'Personal Web Site', 'value' => 'https://host.example' }] } + + it 'returns array of account field objects' do + expect(subject) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Personal/, value: /host.example/)) + ) + end + end + + context 'when attribute has invalid data' do + before { account.fields = [{ 'blurp' => 'zorp', '@@@@' => '###' }] } + + it { is_expected.to be_empty } + end + end + + describe '#fields_attributes=' do + let(:account) { Fabricate.build :account } + + context 'when sent empty hash' do + it 'assigns empty array to fields' do + account.fields_attributes = {} + + expect(account.fields) + .to be_empty + end + end + + context 'when sent indexed hash' do + it 'assigns fields array' do + account.fields_attributes = { + '0' => { name: 'Color', value: 'Red' }, + '1' => { name: 'Size', value: 'Medium' }, + } + + expect(account.fields) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Color/, value: /Red/)), + be_a(Account::Field).and(have_attributes(name: /Size/, value: /Medium/)) + ) + end + end + + context 'when sent indexed hash with missing values' do + it 'rejects blanks and assigns fields array' do + account.fields_attributes = { + '0' => { name: 'Color', value: 'Red' }, + '1' => { name: '', value: '' }, + } + + expect(account.fields) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Color/, value: /Red/)) + ) + end + end + + context 'when sent array of field hashes' do + it 'assigns fields array' do + account.fields_attributes = [ + { name: 'Color', value: 'Red' }, + { name: 'Size', value: 'Medium' }, + ] + + expect(account.fields) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Color/, value: /Red/)), + be_a(Account::Field).and(have_attributes(name: /Size/, value: /Medium/)) + ) + end + end + + context 'when fields were previously a hash' do + before { account.fields = {} } + + it 'assigns fields array' do + account.fields_attributes = { + '0' => { name: 'Color', value: 'Red' }, + } + + expect(account.fields) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Color/, value: /Red/)) + ) + end + end + + context 'when fields were previously verified' do + before { account.fields = [{ name: 'Color', value: 'Red', verified_at: 2.weeks.ago.to_datetime }] } + + it 'assigns fields array with preserved verification' do + account.fields_attributes = { + '0' => { name: 'Color', value: 'Red' }, + } + + expect(account.fields) + .to be_an(Array) + .and contain_exactly( + be_a(Account::Field).and(have_attributes(name: /Color/, value: /Red/, verified_at: 2.weeks.ago.to_datetime).and(be_verified)) + ) + end + end + end + + describe '#build_fields' do + let(:account) { Fabricate.build :account } + + before { stub_const('Account::DEFAULT_FIELDS_SIZE', 4) } + + context 'when fields already full' do + before { account.fields = Array.new(Account::DEFAULT_FIELDS_SIZE) { |i| { name: "Name#{i}", value: 'Test' } } } + + it 'returns nil without updating fields' do + expect(account.build_fields) + .to be_nil + + expect(account.fields) + .to be_an(Array) + .and have_attributes(size: Account::DEFAULT_FIELDS_SIZE) + end + end + + context 'when fields partially full' do + before { account.fields = Array.new(2) { |i| { name: "Name#{i}", value: 'Test' } } } + + it 'returns nil without updating fields' do + expect(account.build_fields) + .to be_an(Array) + + expect(account.attributes['fields']) + .to be_an(Array) + .and contain_exactly( + include('name' => /Name/), + include('name' => /Name/), + include('name' => ''), + include('name' => '') + ) + end + end + + context 'when fields were previously a hash' do + before { account.fields = {} } + + it 'assigns fields array with empty values' do + expect(account.build_fields) + .to be_an(Array) + + expect(account.attributes['fields']) + .to be_an(Array) + .and all(include('name' => '', 'value' => '')) + end + end + end +end diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb index 1bb238f7ef8796..55d299799c1711 100644 --- a/spec/models/account_migration_spec.rb +++ b/spec/models/account_migration_spec.rb @@ -51,4 +51,24 @@ it { is_expected.to_not allow_value(target_acct).for(:acct) } end end + + describe '#remaining_cooldown_days' do + subject { account_migration.remaining_cooldown_days } + + before { stub_const('AccountMigration::COOLDOWN_PERIOD', 30.days) } + + let(:account_migration) { Fabricate :account_migration, created_at: } + + context 'with a record still in cooldown' do + let(:created_at) { 15.days.ago } + + it { is_expected.to eq(15) } + end + + context 'with a record out of cooldown' do + let(:created_at) { 150.days.ago } + + it { is_expected.to be_negative } + end + end end diff --git a/spec/models/account_relationship_severance_event_spec.rb b/spec/models/account_relationship_severance_event_spec.rb new file mode 100644 index 00000000000000..d3a600eee41545 --- /dev/null +++ b/spec/models/account_relationship_severance_event_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +RSpec.describe AccountRelationshipSeveranceEvent do + describe 'Associations' do + it { is_expected.to belong_to(:account) } + it { is_expected.to belong_to(:relationship_severance_event) } + it { is_expected.to have_many(:severed_relationships).through(:relationship_severance_event) } + end + + describe '#identifier' do + subject { account_relationship_severance_event.identifier } + + let(:account_relationship_severance_event) { Fabricate.build :account_relationship_severance_event, relationship_severance_event:, created_at: DateTime.new(2026, 3, 15, 1, 2, 3) } + let(:relationship_severance_event) { Fabricate.build :relationship_severance_event, target_name: 'host.example' } + + context 'with a hostname target and timestamp' do + it { is_expected.to eq('host.example-2026-03-15') } + end + end +end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index ca22e7a3773616..288ddbf6bb4ca9 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -732,9 +732,6 @@ it { is_expected.to_not allow_values(account_note_over_limit).for(:note) } - it { is_expected.to allow_value(fields_empty_name_value).for(:fields) } - it { is_expected.to_not allow_values(fields_over_limit, fields_empty_name).for(:fields) } - it { is_expected.to validate_absence_of(:followers_url).on(:create) } it { is_expected.to validate_absence_of(:inbox_url).on(:create) } it { is_expected.to validate_absence_of(:shared_inbox_url).on(:create) } @@ -776,18 +773,6 @@ def display_name_over_limit def account_note_over_limit 'a' * described_class::NOTE_LENGTH_LIMIT * 2 end - - def fields_empty_name_value - Array.new(4) { { 'name' => '', 'value' => '' } } - end - - def fields_over_limit - Array.new(described_class::DEFAULT_FIELDS_SIZE + 1) { { 'name' => 'Name', 'value' => 'Value', 'verified_at' => '01/01/1970' } } - end - - def fields_empty_name - [{ 'name' => '', 'value' => 'Value', 'verified_at' => '01/01/1970' }] - end end describe 'scopes' do @@ -973,19 +958,42 @@ def fields_empty_name end describe '#featureable_by?' do - subject { Fabricate.build(:account, domain: (local ? nil : 'example.com'), discoverable:, feature_approval_policy:) } + subject { Fabricate.build(:account, domain: (local ? nil : 'example.com'), discoverable:, locked:, feature_approval_policy:) } + let(:locked) { false } let(:local_account) { Fabricate(:account) } context 'when account is local' do let(:local) { true } - let(:feature_approval_policy) { nil } + let(:feature_approval_policy) { 0 } context 'when account is discoverable' do let(:discoverable) { true } - it 'returns `true`' do - expect(subject.featureable_by?(local_account)).to be true + context 'when the account is not locked' do + let(:locked) { false } + + it 'returns `true`' do + expect(subject.featureable_by?(local_account)).to be true + end + end + + context 'when the account is locked' do + let(:locked) { true } + + it 'returns `false`' do + expect(subject.featureable_by?(local_account)).to be false + end + + context 'when the other account is a follower' do + before do + local_account.follow!(subject) + end + + it 'returns `true`' do + expect(subject.featureable_by?(local_account)).to be true + end + end end end @@ -1003,23 +1011,17 @@ def fields_empty_name let(:discoverable) { true } let(:feature_approval_policy) { (0b10 << 16) | 0 } - it 'returns `false`' do - expect(subject.featureable_by?(local_account)).to be false - end - - context 'when collections federation is enabled', feature: :collections_federation do - context 'when the policy allows it' do - it 'returns `true`' do - expect(subject.featureable_by?(local_account)).to be true - end + context 'when the policy allows it' do + it 'returns `true`' do + expect(subject.featureable_by?(local_account)).to be true end + end - context 'when the policy forbids it' do - let(:feature_approval_policy) { 0 } + context 'when the policy forbids it' do + let(:feature_approval_policy) { 0 } - it 'returns `false`' do - expect(subject.featureable_by?(local_account)).to be false - end + it 'returns `false`' do + expect(subject.featureable_by?(local_account)).to be false end end end diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb index 62d7e40e28cef7..e5dfc909b72e87 100644 --- a/spec/models/block_spec.rb +++ b/spec/models/block_spec.rb @@ -24,7 +24,7 @@ end context 'when URI is blank' do - subject { Fabricate.build :follow, uri: nil } + subject { Fabricate.build :block, uri: nil } it 'populates the value' do expect { subject.save } diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb index a3bd01d2a85dec..4eb36aeb4645ca 100644 --- a/spec/models/bulk_import_spec.rb +++ b/spec/models/bulk_import_spec.rb @@ -39,4 +39,28 @@ end end end + + describe '#failure_count' do + subject { described_class.new(processed_items: 100, imported_items: 90).failure_count } + + it { is_expected.to eq(10) } + end + + describe '#processing_complete?' do + subject { Fabricate.build :bulk_import, processed_items:, total_items: } + + context 'when processed and total are the same' do + let(:processed_items) { 100 } + let(:total_items) { 100 } + + it { is_expected.to be_processing_complete } + end + + context 'when processed and total are not the same' do + let(:processed_items) { 100 } + let(:total_items) { 200 } + + it { is_expected.to_not be_processing_complete } + end + end end diff --git a/spec/models/collection_spec.rb b/spec/models/collection_spec.rb index 6937829ebbac50..b9a545364217c5 100644 --- a/spec/models/collection_spec.rb +++ b/spec/models/collection_spec.rb @@ -10,8 +10,6 @@ it { is_expected.to validate_length_of(:name).is_at_most(40) } - it { is_expected.to validate_presence_of(:description) } - it { is_expected.to validate_length_of(:description).is_at_most(100) } it { is_expected.to_not allow_value(nil).for(:local) } @@ -29,10 +27,6 @@ it { is_expected.to validate_length_of(:name).is_at_most(Collection::NAME_LENGTH_HARD_LIMIT) } - it { is_expected.to_not validate_presence_of(:description) } - - it { is_expected.to validate_presence_of(:description_html) } - it { is_expected.to validate_length_of(:description_html).is_at_most(Collection::DESCRIPTION_LENGTH_HARD_LIMIT) } it { is_expected.to validate_presence_of(:uri) } @@ -64,17 +58,50 @@ let(:collection_items) { Fabricate.build_times(described_class::MAX_ITEMS + 1, :collection_item, collection: nil) } it { is_expected.to_not be_valid } + + context 'when the limit is only exceeded due to `rejected` and `revoked` items' do + let(:collection_items) do + items = Fabricate.build_times(described_class::MAX_ITEMS - 2, :collection_item, collection: nil, state: :accepted) + items << Fabricate.build(:collection_item, collection: nil, state: :pending) + items << Fabricate.build(:collection_item, collection: nil, state: :rejected) + items << Fabricate.build(:collection_item, collection: nil, state: :revoked) + items + end + + it { is_expected.to be_valid } + end + end + + context 'when the user is already at the per-user limit of collections' do + subject { Fabricate.build(:collection, account:) } + + let(:role) { Fabricate(:user_role, collection_limit: 2) } + let(:user) { Fabricate(:user, role:) } + let(:account) { user.account } + + before do + Fabricate.times(2, :collection, account:) + end + + it { is_expected.to_not be_valid } end end describe '#item_for' do subject { Fabricate(:collection) } - let!(:items) { Fabricate.times(2, :collection_item, collection: subject) } + let!(:accepted_items) { Fabricate.times(2, :collection_item, collection: subject, state: :accepted) } + let!(:pending_item) { Fabricate(:collection_item, collection: subject, state: :pending) } + + before do + %i(rejected revoked).each do |state| + Fabricate(:collection_item, collection: subject, state:) + end + end context 'when given no account' do - it 'returns all items' do - expect(subject.items_for).to match_array(items) + it 'returns all accepted items' do + expect(subject.items_for).to match_array(accepted_items) end end @@ -82,11 +109,19 @@ let(:account) { Fabricate(:account) } before do - account.block!(items.first.account) + account.block!(accepted_items.first.account) end it 'does not return items blocked by this account' do - expect(subject.items_for(account)).to contain_exactly(items.last) + expect(subject.items_for(account)).to contain_exactly(accepted_items.last) + end + end + + context 'when given the owner of the collection' do + let(:account) { subject.account } + + it 'returns accepted and pending items' do + expect(subject.items_for(account)).to match_array(accepted_items + [pending_item]) end end end diff --git a/spec/models/email_subscription_spec.rb b/spec/models/email_subscription_spec.rb new file mode 100644 index 00000000000000..6e1a0483f85a86 --- /dev/null +++ b/spec/models/email_subscription_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe EmailSubscription do + describe '#confirmed?' do + it 'returns true when confirmed' do + subject.confirmed_at = Time.now.utc + expect(subject.confirmed?).to be true + end + + it 'returns false when not confirmed' do + subject.confirmed_at = nil + expect(subject.confirmed?).to be false + end + end + + describe '#confirm!' do + subject { Fabricate(:email_subscription) } + + it 'records confirmation time' do + subject.confirm! + expect(subject.confirmed_at).to_not be_nil + end + end + + describe 'Callbacks' do + subject { Fabricate(:email_subscription) } + + it 'generates token and delivers confirmation email', :inline_jobs do + emails = capture_emails { subject } + + expect(subject.confirmed_at).to be_nil + expect(subject.confirmation_token).to_not be_nil + expect(emails.size).to eq(1) + expect(emails.first) + .to have_attributes( + to: contain_exactly(subject.email), + subject: eq(I18n.t('email_subscription_mailer.confirmation.subject', name: subject.account.username, domain: Rails.configuration.x.local_domain)) + ) + end + end +end diff --git a/spec/models/keypair_spec.rb b/spec/models/keypair_spec.rb new file mode 100644 index 00000000000000..e7b18d8e68f147 --- /dev/null +++ b/spec/models/keypair_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Keypair do + describe '#keypair' do + let(:keypair) { Fabricate(:keypair) } + + it 'returns an RSA key pair' do + expect(keypair.keypair).to be_instance_of OpenSSL::PKey::RSA + end + end + + describe 'from_keyid' do + context 'when a key with the given key ID exists' do + let(:account) { Fabricate(:account, domain: 'example.com') } + let(:keypair) { Fabricate(:keypair, account: account) } + + it 'returns the expected Keypair' do + expect(described_class.from_keyid(keypair.uri)) + .to eq keypair + end + end + + context 'when no key with the expected key ID exists but there is an account with the same ID and a key' do + let(:account) { Fabricate(:account, domain: 'example.com') } + let(:keyid) { "#{ActivityPub::TagManager.instance.uri_for(account)}#main-rsa-key" } + + it 'returns the expected Keypair' do + expect(described_class.from_keyid(keyid)) + .to have_attributes( + account: account, + type: 'rsa', + uri: keyid + ) + end + end + + context 'when no key with the expected key ID exists but there is an account with the same ID and no key' do + let(:account) { Fabricate(:account, domain: 'example.com', public_key: '', private_key: nil) } + let(:keyid) { "#{ActivityPub::TagManager.instance.uri_for(account)}#main-rsa-key" } + + it 'returns nil' do + expect(described_class.from_keyid(keyid)) + .to be_nil + end + end + + context 'when no key with the expected key ID exists and no matching account exists' do + let(:keyid) { 'https://example.com/alice#main-key' } + + it 'returns nil' do + expect(described_class.from_keyid(keyid)) + .to be_nil + end + end + end +end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 61ef531fe188e2..d0a06013d29b1b 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -338,6 +338,23 @@ def previous_name_error_message expect(results).to eq [tag] end + it 'finds tag records from padded term queries' do + tag = Fabricate(:tag, name: 'MATCH') + _miss_tag = Fabricate(:tag, name: 'miss') + + results = described_class.search_for(' match ') + + expect(results) + .to contain_exactly(tag) + end + + it 'handles nil query' do + results = described_class.search_for(nil) + + expect(results) + .to be_empty + end + it 'finds the exact matching tag as the first item' do similar_tag = Fabricate(:tag, name: 'matchlater', reviewed_at: Time.now.utc) tag = Fabricate(:tag, name: 'match', reviewed_at: Time.now.utc) @@ -364,5 +381,16 @@ def previous_name_error_message expect(results).to eq [tag, unlisted_tag] end + + it 'excludes non reviewed tags via option' do + tag = Fabricate(:tag, name: 'match', reviewed_at: 5.days.ago) + unreviewed_tag = Fabricate(:tag, name: 'matchreviewed', reviewed_at: nil) + + results = described_class.search_for('match', 5, 0, exclude_unreviewed: true) + + expect(results) + .to include(tag) + .and not_include(unreviewed_tag) + end end end diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb index d26c63ca2fee82..bae6df77475fee 100644 --- a/spec/models/user_role_spec.rb +++ b/spec/models/user_role_spec.rb @@ -31,6 +31,12 @@ it { is_expected.to_not allow_values('x', '112233445566', '#xxyyzz').for(:color) } end + describe 'collection_limit' do + subject { Fabricate.build :user_role } + + it { is_expected.to validate_numericality_of(:collection_limit).only_integer.is_greater_than_or_equal_to(0) } + end + context 'when current_account is set' do subject { Fabricate :user_role } diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 31487cc3ef2ede..3e11cc6dfc085f 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -131,9 +131,9 @@ def sign_in(resource, _deprecated = nil, scope: nil) config.around do |example| if example.metadata[:inline_jobs] == true - Sidekiq::Testing.inline! + Sidekiq.testing!(:inline) else - Sidekiq::Testing.fake! + Sidekiq.testing!(:fake) end example.run end diff --git a/spec/requests/admin/change_emails_spec.rb b/spec/requests/admin/change_emails_spec.rb index 3df29eb77b450d..06646a44d3016a 100644 --- a/spec/requests/admin/change_emails_spec.rb +++ b/spec/requests/admin/change_emails_spec.rb @@ -14,5 +14,17 @@ expect(response) .to have_http_status(400) end + + context 'when email is not changed' do + subject { put admin_account_change_email_path(user.account_id, user: { unconfirmed_email: 'original@host.example' }) } + + let(:user) { Fabricate :user, email: 'original@host.example' } + + it 'does not updated the user record' do + expect { expect { subject }.to_not send_email } + .to not_change { user.reload.unconfirmed_email } + .and(not_change { user.reload.updated_at }) + end + end end end diff --git a/spec/requests/admin/export_domain_allows_spec.rb b/spec/requests/admin/export_domain_allows_spec.rb index dd1a55a02245b2..4314bdfb5053d2 100644 --- a/spec/requests/admin/export_domain_allows_spec.rb +++ b/spec/requests/admin/export_domain_allows_spec.rb @@ -27,6 +27,8 @@ .to have_http_status(200) expect(response.body) .to eq(domain_allows_csv_file) + expect(response) + .to have_attachment('domain_allows.csv') expect(response.media_type) .to eq('text/csv') end diff --git a/spec/requests/api/v1/accounts/email_subscriptions_spec.rb b/spec/requests/api/v1/accounts/email_subscriptions_spec.rb new file mode 100644 index 00000000000000..ef7a31476af7b8 --- /dev/null +++ b/spec/requests/api/v1/accounts/email_subscriptions_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Accounts Email Subscriptions API', feature: :email_subscriptions do + let(:account) { Fabricate(:user).account } + + describe 'POST /api/v1/accounts/:id/email_subscriptions' do + context 'when the account has the permission' do + let(:role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:manage_email_subscriptions]) } + + before do + account.user.update!(role: role) + end + + context 'when user has enabled the setting' do + before do + account.user.settings['email_subscriptions'] = true + account.user.save! + end + + it 'returns http success' do + post "/api/v1/accounts/#{account.id}/email_subscriptions", params: { email: 'test@example.com' } + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'when user has not enabled the setting' do + it 'returns http not found' do + post "/api/v1/accounts/#{account.id}/email_subscriptions", params: { email: 'test@example.com' } + + expect(response).to have_http_status(404) + end + end + end + + context 'when the account does not have the permission' do + it 'returns http not found' do + post "/api/v1/accounts/#{account.id}/email_subscriptions", params: { email: 'test@example.com' } + + expect(response).to have_http_status(404) + end + end + end +end diff --git a/spec/requests/api/v1/instances/terms_of_services_spec.rb b/spec/requests/api/v1/instances/terms_of_services_spec.rb index 5feb49f48d58a5..3a352a6d0cb623 100644 --- a/spec/requests/api/v1/instances/terms_of_services_spec.rb +++ b/spec/requests/api/v1/instances/terms_of_services_spec.rb @@ -4,21 +4,76 @@ RSpec.describe 'Terms of Service' do describe 'GET /api/v1/instance/terms_of_service' do - before do - Fabricate(:terms_of_service) + context 'with a current TOS record' do + before do + Fabricate(:terms_of_service) + end + + it 'returns http success' do + get api_v1_instance_terms_of_service_index_path + + expect(response) + .to have_http_status(200) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(:content) + end + end + + context 'without a current TOS record' do + it 'returns http success' do + get api_v1_instance_terms_of_service_index_path + + expect(response) + .to have_http_status(404) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(error: /not found/i) + end + end + end + + describe 'GET /api/v1/instance/terms_of_service/:date' do + context 'with an effective TOS record' do + before do + travel_to 2.days.ago do + Fabricate(:terms_of_service, effective_date: 2.days.from_now, published_at: Date.current) + end + end + + it 'returns http success' do + get api_v1_instance_terms_of_service_path(date: Date.current.to_s) + + expect(response) + .to have_http_status(200) + expect(response.media_type) + .to eq('application/json') + + expect(response.parsed_body) + .to be_present + .and include(:content) + end end - it 'returns http success' do - get api_v1_instance_terms_of_service_path + context 'without an effective TOS record' do + it 'returns http not found' do + get api_v1_instance_terms_of_service_path(date: Date.current.to_s) - expect(response) - .to have_http_status(200) - expect(response.content_type) - .to start_with('application/json') + expect(response) + .to have_http_status(404) + expect(response.media_type) + .to eq('application/json') - expect(response.parsed_body) - .to be_present - .and include(:content) + expect(response.parsed_body) + .to be_present + .and include(error: /not found/i) + end end end end diff --git a/spec/requests/api/v1/profiles_spec.rb b/spec/requests/api/v1/profiles_spec.rb index 7d0d1a3622465d..0107b9c404867f 100644 --- a/spec/requests/api/v1/profiles_spec.rb +++ b/spec/requests/api/v1/profiles_spec.rb @@ -44,8 +44,10 @@ 'indexable' => account.indexable, 'display_name' => account.display_name, 'fields' => [], + 'formatted_fields' => [], 'attribution_domains' => [], 'note' => account.note, + 'formatted_note' => account.note, 'show_featured' => account.show_featured, 'show_media' => account.show_media, 'show_media_replies' => account.show_media_replies, diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index 029bbdb1cd2f88..d7d16b1e03fcae 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -406,6 +406,56 @@ end end + context 'with a quote in an unlisted message' do + let!(:quoted_status) { Fabricate(:status, quote_approval_policy: InteractionPolicy::POLICY_FLAGS[:public] << 16) } + let(:params) do + { + status: 'Hello, this is a quote', + quoted_status_id: quoted_status.id, + visibility: 'unlisted', + } + end + + it 'returns a quote post, as well as rate limit headers', :aggregate_failures do + expect { subject }.to change(user.account.statuses, :count).by(1) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body[:quote]).to be_present + expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s + expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s + end + + context 'when the quoter is blocked by the quotee' do + before do + quoted_status.account.block!(user.account) + end + + it 'returns an error and does not create a post', :aggregate_failures do + expect { subject }.to_not change(user.account.statuses, :count) + + expect(response).to have_http_status(404) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'when the quotee is blocked by the quoter' do + before do + user.account.block!(quoted_status.account) + end + + it 'returns an error and does not create a post', :aggregate_failures do + expect { subject }.to_not change(user.account.statuses, :count) + + expect(response).to have_http_status(404) + expect(response.content_type) + .to start_with('application/json') + end + end + end + context 'with a quote of a reblog' do let(:quoted_status) { Fabricate(:status, quote_approval_policy: InteractionPolicy::POLICY_FLAGS[:public] << 16) } let(:reblog) { Fabricate(:status, reblog: quoted_status) } diff --git a/spec/requests/api/v1_alpha/collections_spec.rb b/spec/requests/api/v1_alpha/collections_spec.rb index a0573342d8f708..f448659bf59e53 100644 --- a/spec/requests/api/v1_alpha/collections_spec.rb +++ b/spec/requests/api/v1_alpha/collections_spec.rb @@ -180,7 +180,6 @@ 'error' => a_hash_including({ 'details' => a_hash_including({ 'name' => [{ 'error' => 'ERR_BLANK', 'description' => "can't be blank" }], - 'description' => [{ 'error' => 'ERR_BLANK', 'description' => "can't be blank" }], }), }), }) diff --git a/spec/requests/api/v1_alpha/in_collections_spec.rb b/spec/requests/api/v1_alpha/in_collections_spec.rb new file mode 100644 index 00000000000000..a4bd3110bed523 --- /dev/null +++ b/spec/requests/api/v1_alpha/in_collections_spec.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Api::V1Alpha::InCollections', feature: :collections do + include_context 'with API authentication', oauth_scopes: 'read:collections write:collections' + + describe 'GET /api/v1_alpha/in_collections' do + subject do + get "/api/v1_alpha/accounts/#{account.id}/in_collections", headers: headers, params: params + end + + let(:params) { {} } + let(:account) { user.account } + + before { Fabricate.times(3, :collection_item, account: account) } + + it 'returns all collections for the given account and http success' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:collections].size).to eq 3 + end + + context 'with limit param' do + let(:params) { { limit: '1' } } + + it 'returns only a single result' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:collections].size).to eq 1 + + expect(response) + .to include_pagination_headers( + next: api_v1_alpha_account_in_collections_url(account, limit: 1, offset: 1) + ) + end + end + + context 'with limit and offset params' do + let(:params) { { limit: '1', offset: '1' } } + + it 'returns the correct result and headers' do + subject + + expect(response).to have_http_status(200) + expect(response.parsed_body[:collections].size).to eq 1 + + expect(response) + .to include_pagination_headers( + prev: api_v1_alpha_account_in_collections_url(account, limit: 1, offset: 0), + next: api_v1_alpha_account_in_collections_url(account, limit: 1, offset: 2) + ) + end + end + + context 'when requested account is different from current account' do + let(:account) { Fabricate(:account) } + + it 'returns http forbidden' do + subject + + expect(response) + .to have_http_status(403) + end + end + end +end diff --git a/spec/requests/api/v2/instance_spec.rb b/spec/requests/api/v2/instance_spec.rb index 39e7105f095dc7..d9d5df1bea8ea2 100644 --- a/spec/requests/api/v2/instance_spec.rb +++ b/spec/requests/api/v2/instance_spec.rb @@ -66,8 +66,15 @@ def include_configuration_limits include( configuration: include( accounts: include( + max_display_name_length: Account::DISPLAY_NAME_LENGTH_LIMIT, + max_note_length: Account::NOTE_LENGTH_LIMIT, + max_avatar_description_length: Account::Avatar::MAX_DESCRIPTION_LENGTH, + max_header_description_length: Account::Header::MAX_DESCRIPTION_LENGTH, max_featured_tags: FeaturedTag::LIMIT, - max_pinned_statuses: StatusPinValidator::PIN_LIMIT + max_pinned_statuses: StatusPinValidator::PIN_LIMIT, + max_profile_fields: Account::DEFAULT_FIELDS_SIZE, + profile_field_name_limit: Account::Field::MAX_CHARACTERS_LOCAL, + profile_field_value_limit: Account::Field::MAX_CHARACTERS_LOCAL ), statuses: include( max_characters: StatusLengthValidator::MAX_CHARS, diff --git a/spec/requests/auth/sessions/security_key_options_spec.rb b/spec/requests/auth/sessions/security_key_options_spec.rb index e53b9802b4c820..17ec364a9be0dc 100644 --- a/spec/requests/auth/sessions/security_key_options_spec.rb +++ b/spec/requests/auth/sessions/security_key_options_spec.rb @@ -5,9 +5,9 @@ RSpec.describe 'Security Key Options' do describe 'GET /auth/sessions/security_key_options' do - let!(:user) do - Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret) - end + subject { get '/auth/sessions/security_key_options' } + + let!(:user) { Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret) } context 'with WebAuthn and OTP enabled as second factor' do let(:domain) { "#{Rails.configuration.x.use_https ? 'https' : 'http'}://#{Rails.configuration.x.web_domain}" } @@ -19,31 +19,55 @@ user.update(webauthn_id: WebAuthn.generate_user_id) Fabricate( :webauthn_credential, - user_id: user.id, external_id: public_key_credential.id, - public_key: public_key_credential.public_key + public_key: public_key_credential.public_key, + user_id: user.id ) - post '/auth/sign_in', params: { user: { email: user.email, password: user.password } } end - it 'returns http success' do - get '/auth/sessions/security_key_options' + context 'when signed in' do + before { post '/auth/sign_in', params: { user: { email: user.email, password: user.password } } } - expect(response) - .to have_http_status 200 - expect(response.content_type) - .to start_with('application/json') + it 'returns http success' do + subject + + expect(response) + .to have_http_status 200 + expect(response.media_type) + .to eq('application/json') + expect(response.parsed_body) + .to include( + challenge: be_present, + userVerification: eq('discouraged'), + allowCredentials: contain_exactly(include(type: 'public-key', id: be_present)) + ) + end + end + + context 'when not signed in' do + it 'returns http unauthorized' do + subject + + expect(response) + .to have_http_status 401 + expect(response.media_type) + .to eq('application/json') + expect(response.parsed_body) + .to include(error: I18n.t('webauthn_credentials.not_enabled')) + end end end context 'when WebAuthn not enabled' do it 'returns http unauthorized' do - get '/auth/sessions/security_key_options' + subject expect(response) .to have_http_status 401 - expect(response.content_type) - .to start_with('application/json') + expect(response.media_type) + .to eq('application/json') + expect(response.parsed_body) + .to include(error: I18n.t('webauthn_credentials.not_enabled')) end end end diff --git a/spec/requests/collections_spec.rb b/spec/requests/collections_spec.rb index fece4b62b82af7..bdebb03f605168 100644 --- a/spec/requests/collections_spec.rb +++ b/spec/requests/collections_spec.rb @@ -3,8 +3,20 @@ require 'rails_helper' RSpec.describe 'Collections' do - describe 'GET /@:account_username/collections/:id', feature: :collections do - subject { get account_collection_path(account, collection, format: :json) } + describe 'GET /collections/:id', feature: :collections do + subject { get collection_path(collection) } + + let(:collection) { Fabricate(:collection) } + + it 'returns success' do + subject + + expect(response).to have_http_status(200) + end + end + + describe 'GET /ap/:account_id/collections/:id', feature: :collections do + subject { get ap_account_collection_path(account.id, collection, format: :json) } let(:collection) { Fabricate(:collection) } let(:account) { collection.account } @@ -80,7 +92,7 @@ context 'with "HTTP Signature" access signed by a remote account' do subject do - get account_collection_path(account, collection, format: :json), + get ap_account_collection_path(account.id, collection, format: :json), headers: nil, sign_with: remote_account end diff --git a/spec/requests/email_subscriptions/confirmations_spec.rb b/spec/requests/email_subscriptions/confirmations_spec.rb new file mode 100644 index 00000000000000..909aab1b77bba9 --- /dev/null +++ b/spec/requests/email_subscriptions/confirmations_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Email Subscriptions Confirmation' do + describe 'GET /email_subscriptions/confirmation' do + context 'when email subscription is unconfirmed' do + let!(:email_subscription) { Fabricate(:email_subscription, confirmed_at: nil) } + + it 'renders success page and updates subscription as confirmed' do + get email_subscriptions_confirmation_path(confirmation_token: email_subscription.confirmation_token) + + expect(response) + .to have_http_status(200) + expect(email_subscription.reload.confirmed?) + .to be true + end + end + + context 'when email subscription is already confirmed' do + let!(:email_subscription) { Fabricate(:email_subscription, confirmed_at: Time.now.utc) } + + it 'renders success page' do + get email_subscriptions_confirmation_path(confirmation_token: email_subscription.confirmation_token) + + expect(response) + .to have_http_status(200) + expect(email_subscription.reload.confirmed?) + .to be true + end + end + end +end diff --git a/spec/requests/media_spec.rb b/spec/requests/media_spec.rb index 523c4689d6a5c5..a124c1d7c8e943 100644 --- a/spec/requests/media_spec.rb +++ b/spec/requests/media_spec.rb @@ -93,7 +93,7 @@ let(:media) { Fabricate :media_attachment } it 'responds with not found' do - get medium_player_path(media) + get player_medium_path(media) expect(response) .to have_http_status(404) diff --git a/spec/requests/severed_relationships_spec.rb b/spec/requests/severed_relationships_spec.rb index e0116120cb0f96..becc16570d2163 100644 --- a/spec/requests/severed_relationships_spec.rb +++ b/spec/requests/severed_relationships_spec.rb @@ -16,10 +16,8 @@ .to have_http_status(200) expect(response.content_type) .to start_with('text/csv') - expect(response.headers['Content-Disposition']) - .to match(<<~FILENAME.squish) - attachment; filename="following-example.com-#{Date.current}.csv" - FILENAME + expect(response) + .to have_attachment("following-example.com-#{Date.current}.csv") expect(response.body) .to include('Account address') end @@ -44,10 +42,8 @@ .to have_http_status(200) expect(response.content_type) .to start_with('text/csv') - expect(response.headers['Content-Disposition']) - .to match(<<~FILENAME.squish) - attachment; filename="followers-example.com-#{Date.current}.csv" - FILENAME + expect(response) + .to have_attachment("followers-example.com-#{Date.current}.csv") expect(response.body) .to include('Account address') end diff --git a/spec/requests/signature_verification_spec.rb b/spec/requests/signature_verification_spec.rb index 3119138a0a01d4..7b863e6897e6d8 100644 --- a/spec/requests/signature_verification_spec.rb +++ b/spec/requests/signature_verification_spec.rb @@ -71,7 +71,47 @@ context 'with an HTTP Signature (draft version)' do context 'with a known account' do - let!(:actor) { Fabricate(:account, domain: 'remote.domain', uri: 'https://remote.domain/users/bob', private_key: nil, public_key: actor_keypair.public_key.to_pem) } + let!(:actor) { Fabricate(:account, username: 'bob', domain: 'remote.domain', uri: 'https://remote.domain/users/bob', private_key: nil, public_key: actor_keypair.public_key.to_pem, protocol: :activitypub) } + + let(:actor_json) do + { + '@context': [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + ], + id: ActivityPub::TagManager.instance.uri_for(actor), + type: 'Person', + preferredUsername: 'bob', + inbox: 'https://remote.domain/inbox', + publicKey: { + id: 'https://remote.domain/users/bob#main-key', + owner: 'https://remote.domain/users/bob', + publicKeyPem: actor_keypair.public_key.to_pem, + }, + } + end + + context 'with an acct key ID' do + let(:signature_header) do + 'keyId="acct:bob@remote.domain",algorithm="rsa-sha256",headers="date host (request-target)",signature="Z8ilar3J7bOwqZkMp7sL8sRs4B1FT+UorbmvWoE+A5UeoOJ3KBcUmbsh+k3wQwbP5gMNUrra9rEWabpasZGphLsbDxfbsWL3Cf0PllAc7c1c7AFEwnewtExI83/qqgEkfWc2z7UDutXc2NfgAx89Ox8DXU/fA2GG0jILjB6UpFyNugkY9rg6oI31UnvfVi3R7sr3/x8Ea3I9thPvqI2byF6cojknSpDAwYzeKdngX3TAQEGzFHz3SDWwyp3jeMWfwvVVbM38FxhvAnSumw7YwWW4L7M7h4M68isLimoT3yfCn2ucBVL5Dz8koBpYf/40w7QidClAwCafZQFC29yDOg=="' # rubocop:disable Layout/LineLength + end + + it 'successfuly verifies signature', :aggregate_failures do + expect(signature_header).to eq build_signature_string(actor_keypair, 'acct:bob@remote.domain', 'get /activitypub/success', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) + + get '/activitypub/success', headers: { + 'Host' => 'www.example.com', + 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', + 'Signature' => signature_header, + } + + expect(response).to have_http_status(200) + expect(response.parsed_body).to match( + signed_request: true, + signature_actor_id: actor.id.to_s + ) + end + end context 'with a valid signature on a GET request' do let(:signature_header) do @@ -93,6 +133,30 @@ signature_actor_id: actor.id.to_s ) end + + context 'when the key material has changed' do + # Let the user be known with the default test keys + let!(:actor) { Fabricate(:account, username: 'bob', domain: 'remote.domain', uri: 'https://remote.domain/users/bob', private_key: nil, protocol: :activitypub) } + + # Needed to update the keypair + before { stub_key_requests } + + it 'successfuly verifies signature after refreshing the account', :aggregate_failures do + expect(signature_header).to eq build_signature_string(actor_keypair, 'https://remote.domain/users/bob#main-key', 'get /activitypub/success', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) + + get '/activitypub/success', headers: { + 'Host' => 'www.example.com', + 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', + 'Signature' => signature_header, + } + + expect(response).to have_http_status(200) + expect(response.parsed_body).to match( + signed_request: true, + signature_actor_id: actor.id.to_s + ) + end + end end context 'with a valid signature on a GET request that has a query string' do @@ -144,6 +208,9 @@ 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="SDMa4r/DQYMXYxVgYO2yEqGWWUXugKjVuz0I8dniQAk+aunzBaF2aPu+4grBfawAshlx1Xytl8lhb0H2MllEz16/tKY7rUrb70MK0w8ohXgpb0qs3YvQgdj4X24L1x2MnkFfKHR/J+7TBlnivq0HZqXm8EIkPWLv+eQxu8fbowLwHIVvRd/3t6FzvcfsE0UZKkoMEX02542MhwSif6cu7Ec/clsY9qgKahb9JVGOGS1op9Lvg/9y1mc8KCgD83U5IxVygYeYXaVQ6gixA9NgZiTCwEWzHM5ELm7w5hpdLFYxYOHg/3G3fiqJzpzNQAcCD4S4JxfE7hMI0IzVlNLT6A=="' # rubocop:disable Layout/LineLength end + # Signature verification will fail, so the key will be refetched + before { stub_key_requests } + it 'fails to verify signature', :aggregate_failures do expect(signature_header).to eq build_signature_string(actor_keypair, 'https://remote.domain/users/bob#main-key', 'get /activitypub/success?foo=42', { 'Date' => 'Wed, 20 Dec 2023 10:00:00 GMT', 'Host' => 'www.example.com' }) @@ -162,6 +229,9 @@ end context 'with a mismatching path' do + # Signature verification will fail, so the key will be refetched + before { stub_key_requests } + it 'fails to verify signature', :aggregate_failures do get '/activitypub/alternative-path', headers: { 'Host' => 'www.example.com', @@ -313,6 +383,9 @@ end context 'with a tampered path in a POST request' do + # Signature verification will fail, so the key will be refetched + before { stub_key_requests } + it 'fails to verify signature', :aggregate_failures do post '/activitypub/alternative-path', params: 'Hello world', headers: { 'Host' => 'www.example.com', @@ -663,6 +736,11 @@ def stub_tests_controller end end + def stub_key_requests + stub_request(:get, 'https://remote.domain/users/bob').to_return(status: 200, body: actor_json.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, 'https://remote.domain/users/bob#main-key').to_return(status: 200, body: actor_json.to_json, headers: { 'Content-Type': 'application/activity+json' }) + end + def activitypub_tests_controller Class.new(ApplicationController) do include SignatureVerification diff --git a/spec/requests/mail_subscriptions_spec.rb b/spec/requests/unsubscriptions_spec.rb similarity index 90% rename from spec/requests/mail_subscriptions_spec.rb rename to spec/requests/unsubscriptions_spec.rb index cc6557cab01903..95a149922316df 100644 --- a/spec/requests/mail_subscriptions_spec.rb +++ b/spec/requests/unsubscriptions_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -RSpec.describe 'MailSubscriptionsController' do +RSpec.describe 'UnsubscriptionsController' do let(:user) { Fabricate(:user) } let(:token) { user.to_sgid(for: 'unsubscribe').to_s } let(:type) { 'follow' } @@ -39,9 +39,8 @@ expect(response).to have_http_status(200) expect(response.body).to include( - I18n.t('mail_subscriptions.unsubscribe.action') + I18n.t('unsubscriptions.show.action') ) - expect(response.body).to include(user.email) end end @@ -60,9 +59,8 @@ expect(response).to have_http_status(200) expect(response.body).to include( - I18n.t('mail_subscriptions.unsubscribe.complete') + I18n.t('unsubscriptions.create.title') ) - expect(response.body).to include(user.email) end it 'updates notification settings' do diff --git a/spec/serializers/activitypub/actor_serializer_spec.rb b/spec/serializers/activitypub/actor_serializer_spec.rb index 734da6673c0d3d..73702c979c1014 100644 --- a/spec/serializers/activitypub/actor_serializer_spec.rb +++ b/spec/serializers/activitypub/actor_serializer_spec.rb @@ -56,6 +56,18 @@ }, }) end + + context 'when actor is locked' do + let(:record) { Fabricate(:account, locked: true) } + + it 'includes an automatic policy allowing followers' do + expect(subject).to include('interactionPolicy' => { + 'canFeature' => { + 'automaticApproval' => [ActivityPub::TagManager.instance.followers_uri_for(record)], + }, + }) + end + end end context 'when actor is not discoverable' do diff --git a/spec/serializers/activitypub/featured_collection_serializer_spec.rb b/spec/serializers/activitypub/featured_collection_serializer_spec.rb index c0ae43abb923cd..df582237ab8455 100644 --- a/spec/serializers/activitypub/featured_collection_serializer_spec.rb +++ b/spec/serializers/activitypub/featured_collection_serializer_spec.rb @@ -25,6 +25,7 @@ 'attributedTo' => ActivityPub::TagManager.instance.uri_for(collection.account), 'sensitive' => false, 'discoverable' => false, + 'url' => collection_url(collection), 'topic' => { 'href' => match(%r{/tags/people$}), 'type' => 'Hashtag', @@ -38,6 +39,7 @@ 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_items.first.account), 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_items.first.account_id, collection_items.first), + 'published' => match_api_datetime_format, }, { 'id' => ActivityPub::TagManager.instance.uri_for(collection_items.last), @@ -45,6 +47,7 @@ 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_items.last.account), 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_items.last.account_id, collection_items.last), + 'published' => match_api_datetime_format, }, ], 'published' => match_api_datetime_format, @@ -67,4 +70,18 @@ expect(subject).to_not have_key('summary') end end + + context 'when not all items are accepted' do + before do + collection_items.first.update!(state: :pending) + end + + it 'only includes accepted items' do + items = subject['orderedItems'] + + expect(subject['totalItems']).to eq 1 + expect(items.size).to eq 1 + expect(items.first['id']).to eq ActivityPub::TagManager.instance.uri_for(collection_items.last) + end + end end diff --git a/spec/serializers/activitypub/featured_item_serializer_spec.rb b/spec/serializers/activitypub/featured_item_serializer_spec.rb index 7aca086192a295..18afdd10fee3d4 100644 --- a/spec/serializers/activitypub/featured_item_serializer_spec.rb +++ b/spec/serializers/activitypub/featured_item_serializer_spec.rb @@ -7,7 +7,7 @@ subject { serialized_record_json(collection_item, described_class, adapter: ActivityPub::Adapter) } - let(:collection_item) { Fabricate(:collection_item) } + let(:collection_item) { Fabricate(:collection_item, created_at: Time.utc(2026, 4, 16, 1)) } context 'when a local account is featured' do it 'serializes to the expected structure' do @@ -17,6 +17,7 @@ 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_item.account), 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_item.account_id, collection_item), + 'published' => '2026-04-16T01:00:00Z', }) end end diff --git a/spec/serializers/activitypub/flag_serializer_spec.rb b/spec/serializers/activitypub/flag_serializer_spec.rb index 75f787a73a9fc4..a66a49bc87670a 100644 --- a/spec/serializers/activitypub/flag_serializer_spec.rb +++ b/spec/serializers/activitypub/flag_serializer_spec.rb @@ -22,4 +22,34 @@ expect(subject).to_not have_key('cc') expect(subject).to_not have_key('target') end + + context 'with status' do + let(:target_account) { Fabricate(:account) } + let(:status) { Fabricate(:status, account: target_account) } + let(:report) { Fabricate(:report, target_account:, status_ids: [status.id]) } + + it 'includes the status URI in `object`' do + expect(subject).to include({ + 'object' => [ + tag_manager.uri_for(target_account), + tag_manager.uri_for(status), + ], + }) + end + end + + context 'with collection', feature: :collections do + let(:target_account) { Fabricate(:account) } + let(:collection) { Fabricate(:collection, account: target_account) } + let(:report) { Fabricate(:report, target_account:, collections: [collection]) } + + it 'includes the collection URI in `object`' do + expect(subject).to include({ + 'object' => [ + tag_manager.uri_for(target_account), + tag_manager.uri_for(collection), + ], + }) + end + end end diff --git a/spec/serializers/rest/account_serializer_spec.rb b/spec/serializers/rest/account_serializer_spec.rb index 998de6b0fb990a..e8e437cbd30f19 100644 --- a/spec/serializers/rest/account_serializer_spec.rb +++ b/spec/serializers/rest/account_serializer_spec.rb @@ -93,6 +93,32 @@ 'current_user' => 'automatic', }) end + + context 'when account is locked' do + let(:account) { Fabricate(:account, locked: true) } + + context 'when the current account does not follow the user' do + it 'includes a policy that allows featuring for followers and has "denied" for the current user' do + expect(subject['feature_approval']).to include({ + 'automatic' => ['followers'], + 'manual' => [], + 'current_user' => 'denied', + }) + end + end + + context 'when the current account follows the user' do + before { current_user.account.follow!(account) } + + it 'includes a policy that allows featuring for followers and has "automatic" for the current user' do + expect(subject['feature_approval']).to include({ + 'automatic' => ['followers'], + 'manual' => [], + 'current_user' => 'automatic', + }) + end + end + end end context 'when account is not discoverable' do diff --git a/spec/serializers/rest/collection_item_serializer_spec.rb b/spec/serializers/rest/collection_item_serializer_spec.rb index 348107fb9160c5..b57daf1157f067 100644 --- a/spec/serializers/rest/collection_item_serializer_spec.rb +++ b/spec/serializers/rest/collection_item_serializer_spec.rb @@ -11,22 +11,33 @@ state:) end - context 'when state is `accepted`' do - let(:state) { :accepted } - + shared_examples 'full result' do it 'includes the relevant attributes including the account' do expect(subject) .to include( 'id' => '2342', 'account_id' => collection_item.account_id.to_s, - 'state' => 'accepted' + 'state' => state.to_s, + 'created_at' => match_api_datetime_format ) end end - %i(pending rejected revoked).each do |unaccepted_state| - context "when state is `#{unaccepted_state}`" do - let(:state) { unaccepted_state } + context 'when state is `accepted`' do + let(:state) { :accepted } + + it_behaves_like 'full result' + end + + context 'when state is `pending`' do + let(:state) { :pending } + + it_behaves_like 'full result' + end + + %i(rejected revoked).each do |rejected_state| + context "when state is `#{rejected_state}`" do + let(:state) { rejected_state } it 'does not include an account' do expect(subject.keys).to_not include('account_id') diff --git a/spec/serializers/rest/collection_serializer_spec.rb b/spec/serializers/rest/collection_serializer_spec.rb index 67ff464d187fa5..8055c2afbe165e 100644 --- a/spec/serializers/rest/collection_serializer_spec.rb +++ b/spec/serializers/rest/collection_serializer_spec.rb @@ -29,6 +29,7 @@ expect(subject) .to include( 'account_id' => collection.account_id.to_s, + 'uri' => include('2342'), 'id' => '2342', 'name' => 'Exquisite follows', 'description' => 'Always worth a follow', @@ -36,6 +37,7 @@ 'local' => true, 'sensitive' => true, 'discoverable' => false, + 'url' => ActivityPub::TagManager.instance.url_for(collection), 'tag' => a_hash_including('name' => 'discovery'), 'created_at' => match_api_datetime_format, 'updated_at' => match_api_datetime_format, @@ -45,7 +47,11 @@ end context 'when the collection is remote' do - let(:collection) { Fabricate(:remote_collection, description_html: '

    remote

    ') } + let(:collection) { Fabricate(:remote_collection, description_html: '

    remote

    ', url: 'https://example.com/c/1') } + + it 'includes the uri' do + expect(subject).to include('url' => 'https://example.com/c/1') + end it 'includes the html description' do expect(subject) @@ -61,4 +67,30 @@ end end end + + context 'when the collection has items in different states' do + before do + %i(accepted pending rejected revoked).each do |state| + Fabricate(:collection_item, collection:, state:) + end + end + + context 'when `current_user` is the owner of the collection' do + let(:current_user) { collection.account.user } + + it 'includes accepted and pending items' do + expect(subject['item_count']).to eq 2 + expect(subject['items'].size).to eq 2 + expect(subject['items'].pluck('state')).to contain_exactly('accepted', 'pending') + end + end + + context 'when `current_user` is not the owner of the collection' do + it 'only includes the accepted item' do + expect(subject['item_count']).to eq 1 + expect(subject['items'].size).to eq 1 + expect(subject['items'].first['state']).to eq 'accepted' + end + end + end end diff --git a/spec/serializers/rest/notification_group_serializer_spec.rb b/spec/serializers/rest/notification_group_serializer_spec.rb index 01fd8ce0a1fe43..bd9bbe0fc7d7be 100644 --- a/spec/serializers/rest/notification_group_serializer_spec.rb +++ b/spec/serializers/rest/notification_group_serializer_spec.rb @@ -6,10 +6,16 @@ subject do serialized_record_json( notification_group, - described_class + described_class, + options: { + scope: current_user, + scope_name: :current_user, + supported_notification_types: [], + } ) end + let(:current_user) { Fabricate(:user) } let(:notification_group) { NotificationGroup.new pagination_data: { latest_notification_at: 3.days.ago }, notification: Fabricate(:notification), sample_accounts: [] } context 'when latest_page_notification_at is populated' do @@ -20,4 +26,28 @@ ) end end + + shared_examples 'with fallback notifications' do |type, fabricators| + let(:activities) { fabricators.map { |fabricator| Fabricate(fabricator) } } + let(:notifications) { activities.map { |activity| Fabricate(:notification, type:, activity:, account: current_user.account) } } + let(:notification_group) { NotificationGroup.new(notification: notifications.last, sample_accounts: notifications.map(&:from_account)) } + + it 'renders correctly' do + expect(subject) + .to include( + 'type' => type, + 'fallback' => include( + 'title' => anything, + 'summary' => anything + ) + ) + end + end + + it_behaves_like 'with fallback notifications', 'severed_relationships', [:account_relationship_severance_event] + it_behaves_like 'with fallback notifications', 'moderation_warning', [:account_warning] + it_behaves_like 'with fallback notifications', 'admin.report', [:report] + it_behaves_like 'with fallback notifications', 'admin.report', [:report, :report] + it_behaves_like 'with fallback notifications', 'added_to_collection', [:collection_item] + it_behaves_like 'with fallback notifications', 'collection_update', [:collection] end diff --git a/spec/serializers/rest/notification_serializer_spec.rb b/spec/serializers/rest/notification_serializer_spec.rb index b833bcb6e1a095..377efdb93b6749 100644 --- a/spec/serializers/rest/notification_serializer_spec.rb +++ b/spec/serializers/rest/notification_serializer_spec.rb @@ -6,10 +6,16 @@ subject do serialized_record_json( notification, - described_class + described_class, + options: { + scope: current_user, + scope_name: :current_user, + supported_notification_types: [], + } ) end + let(:current_user) { Fabricate(:user) } let(:notification) { Fabricate :notification } context 'when created_at is populated' do @@ -20,4 +26,25 @@ ) end end + + shared_examples 'with fallback notifications' do |type, fabricator| + let(:notification) { Fabricate(:notification, type:, activity: Fabricate(fabricator), account: current_user.account) } + + it 'renders correctly' do + expect(subject) + .to include( + 'type' => type, + 'fallback' => include( + 'title' => anything, + 'summary' => anything + ) + ) + end + end + + it_behaves_like 'with fallback notifications', 'severed_relationships', :account_relationship_severance_event + it_behaves_like 'with fallback notifications', 'moderation_warning', :account_warning + it_behaves_like 'with fallback notifications', 'admin.report', :report + it_behaves_like 'with fallback notifications', 'added_to_collection', :collection_item + it_behaves_like 'with fallback notifications', 'collection_update', :collection end diff --git a/spec/serializers/rest/role_serializer_spec.rb b/spec/serializers/rest/role_serializer_spec.rb new file mode 100644 index 00000000000000..5b3804758720cf --- /dev/null +++ b/spec/serializers/rest/role_serializer_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe REST::RoleSerializer do + subject { serialized_record_json(role, described_class) } + + let(:everyone) do + Fabricate.build(:user_role, permissions: 0) + end + let(:role) do + Fabricate.build(:user_role, id: 2342, name: 'test role', color: '#ABC', highlighted: true, permissions: 2300, collection_limit: 11) + end + + before do + allow(UserRole).to receive(:everyone).and_return(everyone) + end + + it 'includes the relevant attributes' do + expect(subject) + .to include({ + 'id' => '2342', + 'name' => 'test role', + 'color' => '#ABC', + 'highlighted' => true, + 'permissions' => '2300', + }) + end + + context 'when collections are enabled', feature: :collections do + it 'includes the relevant attributes' do + expect(subject) + .to include({ + 'id' => '2342', + 'name' => 'test role', + 'color' => '#ABC', + 'highlighted' => true, + 'permissions' => '2300', + 'collection_limit' => 11, + }) + end + end +end diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 3c1dec9a6d8060..a0800cdd72f6df 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -138,5 +138,97 @@ expect(subject.call('https://fake.address/@foo', prefetched_body: actor.to_json)).to be_nil end end + + context 'when the actor uses the webfinger propery from FEP-2c59' do + before do + actor[:webfinger] = acct + end + + context 'when URI and WebFinger share the same host' do + let(:acct) { 'alice@example.com' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}")).to have_been_made.once + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'example.com' + end + + it_behaves_like 'sets profile data' + end + + context 'when WebFinger returns a different URI' do + let(:acct) { 'alice@example.com' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/bob', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and does not create account' do + expect(account).to be_nil + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, "https://example.com/.well-known/webfinger?resource=acct:#{acct}")).to have_been_made.once + end + end + + context 'when WebFinger is at another domain' do + let(:acct) { 'alice@iscool.af' } + let!(:webfinger) { { subject: "acct:#{acct}", links: [{ rel: 'self', href: 'https://example.com/alice', type: 'application/activity+json' }] } } + + before do + stub_request(:get, 'https://example.com/alice').to_return(body: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://iscool.af/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and follows redirect and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to_not have_been_made + expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'iscool.af' + end + + it_behaves_like 'sets profile data' + end + + context 'when WebFinger is at another domain and redirects back' do + let(:acct) { 'alice@iscool.af' } + 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: actor.to_json, headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, "https://iscool.af/.well-known/webfinger?resource=acct:#{acct}").to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: webfinger.to_json, headers: { 'Content-Type': 'application/jrd+json' }) + end + + it 'fetches resource and looks up webfinger and follows redirect and sets values' do + account + + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once + expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once + expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made + + expect(account.username).to eq 'alice' + expect(account.domain).to eq 'example.com' + end + + it_behaves_like 'sets profile data' + end + end end end diff --git a/spec/services/activitypub/fetch_remote_key_service_spec.rb b/spec/services/activitypub/fetch_remote_key_service_spec.rb index 74378ea5fa6754..339e4b7ec1cd45 100644 --- a/spec/services/activitypub/fetch_remote_key_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_key_service_spec.rb @@ -56,7 +56,7 @@ end describe '#call' do - let(:account) { subject.call(public_key_id) } + let(:keypair) { subject.call(public_key_id) } context 'when the key is a sub-object from the actor' do before do @@ -64,7 +64,9 @@ end it 'returns the expected account' do - expect(account.uri).to eq 'https://example.com/alice' + expect(keypair.account.uri).to eq 'https://example.com/alice' + expect(keypair.uri).to eq public_key_id + expect(keypair.public_key).to eq public_key_pem end end @@ -76,7 +78,9 @@ end it 'returns the expected account' do - expect(account.uri).to eq 'https://example.com/alice' + expect(keypair.account.uri).to eq 'https://example.com/alice' + expect(keypair.uri).to eq public_key_id + expect(keypair.public_key).to eq public_key_pem end end @@ -89,7 +93,7 @@ end it 'returns the nil' do - expect(account).to be_nil + expect(keypair).to be_nil end end end diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 2cc7c733a58f6c..b6a4649bed96ea 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -454,7 +454,7 @@ end end - context 'with collection URIs', feature: :collections_federation do + context 'with collection URIs', feature: :collections do let(:payload) do { 'id' => 'https://foo.test', @@ -485,6 +485,216 @@ end end + context 'with a single keypair' do + let(:public_key) { 'foo' } + + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: { + id: 'https://foo.test/actor#key1', + owner: 'https://foo.test/actor', + publicKeyPem: public_key, + }, + }.with_indifferent_access + end + + it 'stores the key' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: 'https://foo.test/actor#key1', + type: 'rsa', + public_key: + ) + ) + end + + context 'when the account was known with a legacy key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice') } + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.public_key }.to('') + .and change { alice.reload.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: }))) + end + end + + context 'when the account was known with an old key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice', public_key: '') } + + before do + Fabricate(:keypair, account: alice, uri: 'https://foo.test/actor#old-key', type: :rsa) + end + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.keypairs.to_a }.from(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#old-key' }))).to(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: }))) + + expect(alice.reload.public_key) + .to eq '' + end + end + end + + context 'when the key is in a separate document' do + let(:key_id) { 'https://foo.test/actor/main-key' } + let(:public_key) { 'foo' } + + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: key_id, + }.deep_stringify_keys + end + + let(:key_document) do + { + id: key_id, + owner: 'https://foo.test/actor', + publicKeyPem: public_key, + }.deep_stringify_keys + end + + before do + stub_request(:get, key_id).to_return(status: 200, body: key_document.to_json, headers: { 'Content-Type': 'application/activity+json' }) + end + + it 'stores the key' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: key_id, + public_key:, + type: 'rsa' + ) + ) + end + + context 'when the key document is a bogus copy of the author (GoToSocial quirk)' do + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: { + id: key_id, + owner: 'https://foo.test/actor', + publicKeyPem: public_key, + }, + }.deep_stringify_keys + end + + let(:key_document) { payload } + + it 'stores the key' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: key_id, + public_key:, + type: 'rsa' + ) + ) + end + end + + context 'when the account was known with a legacy key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice') } + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.public_key }.to('') + .and change { alice.reload.keypairs.to_a }.from([]).to(contain_exactly(have_attributes({ uri: key_id, type: 'rsa', public_key: }))) + end + end + + context 'when the account was known with an old key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice', public_key: '') } + + before do + Fabricate(:keypair, account: alice, uri: 'https://foo.test/actor#old-key', type: :rsa) + end + + it 'invalidates the legacy key and stores the new key' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.keypairs.to_a }.from(contain_exactly(have_attributes({ uri: 'https://foo.test/actor#old-key' }))).to(contain_exactly(have_attributes({ uri: key_id, type: 'rsa', public_key: }))) + + expect(alice.reload.public_key) + .to eq '' + end + end + end + + context 'with multiple keypairs' do + let(:payload) do + { + id: 'https://foo.test/actor', + type: 'Actor', + inbox: 'https://foo.test/inbox', + preferredUsername: 'alice', + publicKey: [ + { + id: 'https://foo.test/actor#key1', + owner: 'https://foo.test/actor', + publicKeyPem: 'foo', + }, + { + id: 'https://foo.test/actor#key2', + owner: 'https://foo.test/actor', + publicKeyPem: 'bar', + }, + ], + }.with_indifferent_access + end + + it 'stores the keys' do + account = subject.call('alice', 'example.com', payload) + + expect(account.public_key).to eq '' + expect(account.keypairs).to contain_exactly( + have_attributes( + uri: 'https://foo.test/actor#key1', + type: 'rsa', + public_key: 'foo' + ), + have_attributes( + uri: 'https://foo.test/actor#key2', + type: 'rsa', + public_key: 'bar' + ) + ) + end + + context 'when the account was known with a legacy key' do + let!(:alice) { Fabricate(:account, uri: 'https://foo.test/actor', domain: 'example.com', username: 'alice') } + + it 'invalidates the legacy key and stores the new keys' do + expect { subject.call('alice', 'example.com', payload) } + .to change { alice.reload.public_key }.to('') + .and change { alice.keypairs.to_a }.from([]).to( + contain_exactly( + have_attributes({ uri: 'https://foo.test/actor#key1', type: 'rsa', public_key: 'foo' }), + have_attributes({ uri: 'https://foo.test/actor#key2', type: 'rsa', public_key: 'bar' }) + ) + ) + end + end + end + context 'with attribution domains' do let(:payload) do { diff --git a/spec/services/activitypub/process_featured_collection_service_spec.rb b/spec/services/activitypub/process_featured_collection_service_spec.rb index c68120bf0dfc0b..6a74eaa398b21a 100644 --- a/spec/services/activitypub/process_featured_collection_service_spec.rb +++ b/spec/services/activitypub/process_featured_collection_service_spec.rb @@ -16,6 +16,7 @@ 'name' => 'Good people from other servers', 'sensitive' => false, 'discoverable' => true, + 'url' => 'https://example.com/c/1', 'topic' => { 'type' => 'Hashtag', 'name' => '#people', @@ -50,9 +51,11 @@ expect(new_collection.description_html).to eq '

    A list of remote actors you should follow.

    ' expect(new_collection.sensitive).to be false expect(new_collection.discoverable).to be true + expect(new_collection.url).to eq 'https://example.com/c/1' expect(new_collection.tag.formatted_name).to eq '#people' - expect(ActivityPub::ProcessFeaturedItemWorker).to have_enqueued_sidekiq_job.exactly(2).times + expect(ActivityPub::ProcessFeaturedItemWorker).to have_enqueued_sidekiq_job.with(new_collection.id, 'https://example.com/featured_items/1', 1, nil) + expect(ActivityPub::ProcessFeaturedItemWorker).to have_enqueued_sidekiq_job.with(new_collection.id, 'https://example.com/featured_items/2', 2, nil) end end @@ -74,6 +77,18 @@ end end + context 'when the json does not include a `url`' do + let(:featured_collection_json) do + base_json.except('url') + end + + it 'uses the `id` instead' do + subject.call(account, featured_collection_json) + + expect(Collection.last.url).to eq 'https://example.com/featured_collections/1' + end + end + context 'when the collection already exists' do let(:collection) { Fabricate(:remote_collection, account:, uri: base_json['id'], name: 'placeholder') } diff --git a/spec/services/activitypub/process_featured_item_service_spec.rb b/spec/services/activitypub/process_featured_item_service_spec.rb index bfcea2a5da4a54..14147b37849855 100644 --- a/spec/services/activitypub/process_featured_item_service_spec.rb +++ b/spec/services/activitypub/process_featured_item_service_spec.rb @@ -19,6 +19,7 @@ 'featuredObject' => featured_object_uri, 'featuredObjectType' => 'Person', 'featureAuthorization' => feature_authorization_uri, + 'published' => '2026-04-16T01:00:00Z', } end let(:stubbed_service) do @@ -56,6 +57,7 @@ new_item = collection.collection_items.last expect(new_item.object_uri).to eq 'https://example.com/actor/1' expect(new_item.approval_uri).to be_nil + expect(new_item.created_at).to eq Time.utc(2026, 4, 16, 1) expect(new_item.position).to eq 3 end end diff --git a/spec/services/add_account_to_collection_service_spec.rb b/spec/services/add_account_to_collection_service_spec.rb index 35c7432ebe92f5..dd7983ca6226da 100644 --- a/spec/services/add_account_to_collection_service_spec.rb +++ b/spec/services/add_account_to_collection_service_spec.rb @@ -22,19 +22,27 @@ end context 'when the account is local' do - it 'federates an `Add` activity', feature: :collections_federation do + it 'federates an `Add` activity and schedules a notification' do subject.call(collection, account) - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::AccountRawDistributionWorker) + .to have_enqueued_sidekiq_job + .with(anything, collection.account_id) + expect(LocalNotificationWorker) + .to have_enqueued_sidekiq_job + .with(account.id, anything, 'CollectionItem', 'added_to_collection') end end - context 'when the account is remote', feature: :collections_federation do + context 'when the account is remote' do let(:account) { Fabricate(:remote_account, feature_approval_policy: (0b10 << 16)) } - it 'federates a `FeatureRequest` activity' do + it 'marks the item as `pending` and federates a `FeatureRequest` activity' do subject.call(collection, account) + new_item = collection.collection_items.last + expect(new_item).to be_pending + expect(ActivityPub::FeatureRequestWorker).to have_enqueued_sidekiq_job end end diff --git a/spec/services/block_service_spec.rb b/spec/services/block_service_spec.rb index d9687a5404dc0a..f708c3bd390407 100644 --- a/spec/services/block_service_spec.rb +++ b/spec/services/block_service_spec.rb @@ -19,6 +19,28 @@ .to change { sender.blocking?(bob) }.from(false).to(true) .and change { NotificationPermission.exists?(account: sender, from_account: bob) }.from(true).to(false) end + + context 'when the block affects collections' do + context 'when the sender features the target in a collection' do + let(:collection) { Fabricate(:collection, account: sender) } + let!(:collection_item) { Fabricate(:collection_item, collection:, account: bob) } + + it 'removes the affected item from the collection' do + expect { subject.call(sender, bob) }.to change(CollectionItem, :count).by(-1) + expect { collection_item.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + end + + context 'when the sender is featured by the target in a collection' do + let(:collection) { Fabricate(:collection, account: bob) } + let!(:collection_item) { Fabricate(:collection_item, collection:, account: sender) } + + it 'revokes the inclusion in the collection' do + subject.call(sender, bob) + expect(collection_item.reload).to be_revoked + end + end + end end describe 'remote ActivityPub' do diff --git a/spec/services/bootstrap_timeline_service_spec.rb b/spec/services/bootstrap_timeline_service_spec.rb index c99813bceba89f..4c2d129e9e33bc 100644 --- a/spec/services/bootstrap_timeline_service_spec.rb +++ b/spec/services/bootstrap_timeline_service_spec.rb @@ -3,35 +3,31 @@ require 'rails_helper' RSpec.describe BootstrapTimelineService do - subject { described_class.new } + subject { described_class.new.call(new_user.account) } + + let(:invite) { nil } + let(:new_user) { Fabricate(:user, invite_code: invite&.code) } context 'when the new user has registered from an invite' do - let(:service) { instance_double(FollowService) } let(:autofollow) { false } let(:inviter) { Fabricate(:user, confirmed_at: 2.days.ago) } let(:invite) { Fabricate(:invite, user: inviter, max_uses: nil, expires_at: 1.hour.from_now, autofollow: autofollow) } - let(:new_user) { Fabricate(:user, invite_code: invite.code) } - - before do - allow(FollowService).to receive(:new).and_return(service) - allow(service).to receive(:call) - end context 'when the invite has auto-follow enabled' do let(:autofollow) { true } - it 'calls FollowService to follow the inviter' do - subject.call(new_user.account) - expect(service).to have_received(:call).with(new_user.account, inviter.account) + it 'follows the inviter' do + subject + expect(new_user.account.following?(inviter.account)).to be true end end context 'when the invite does not have auto-follow enable' do let(:autofollow) { false } - it 'calls FollowService to follow the inviter' do - subject.call(new_user.account) - expect(service).to_not have_received(:call) + it 'does not follow the inviter' do + subject + expect(new_user.account.following?(inviter.account)).to be false end end end diff --git a/spec/services/create_collection_service_spec.rb b/spec/services/create_collection_service_spec.rb index 0d71117e732cd8..67acb3b7ae1322 100644 --- a/spec/services/create_collection_service_spec.rb +++ b/spec/services/create_collection_service_spec.rb @@ -29,7 +29,7 @@ expect(collection).to be_local end - it 'federates an `Add` activity', feature: :collections_federation do + it 'federates an `Add` activity' do subject.call(base_params, author) expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job @@ -62,12 +62,26 @@ end end + context 'when some accounts are local' do + it 'schedules notifications' do + subject.call(params, author) + + expect(LocalNotificationWorker) + .to have_enqueued_sidekiq_job + .with(accounts.last.id, anything, 'CollectionItem', 'added_to_collection') + end + end + context 'when some accounts are remote' do let(:accounts) { Fabricate.times(2, :remote_account, feature_approval_policy: (0b10 << 16)) } - it 'federates `FeatureRequest` activities', feature: :collections_federation do + it 'marks the new items as `pending` and federates `FeatureRequest` activities' do subject.call(params, author) + new_collection = author.collections.last + expect(new_collection.collection_items.size).to eq 2 + expect(new_collection.collection_items).to all(be_pending) + expect(ActivityPub::FeatureRequestWorker).to have_enqueued_sidekiq_job.exactly(2).times end end diff --git a/spec/services/delete_collection_item_service_spec.rb b/spec/services/delete_collection_item_service_spec.rb index bdd37ad4a82c5e..f9a235b902e827 100644 --- a/spec/services/delete_collection_item_service_spec.rb +++ b/spec/services/delete_collection_item_service_spec.rb @@ -13,17 +13,30 @@ expect { subject.call(collection_item) }.to change(collection.collection_items, :count).by(-1) end - it 'federates a `Remove` activity', feature: :collections_federation do - subject.call(collection_item) + context 'when the collection is local' do + it 'federates a `Remove` activity' do + subject.call(collection_item) - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + end + + context 'when `revoke` is set to true' do + it 'revokes the collection item' do + subject.call(collection_item, revoke: true) + + expect(collection_item.reload).to be_revoked + end + end end - context 'when `revoke` is set to true' do - it 'revokes the collection item' do - subject.call(collection_item, revoke: true) + context 'when the collection is remote' do + let(:collection) { Fabricate(:remote_collection) } + let!(:collection_item) { Fabricate(:collection_item, collection:, state: :accepted) } + + it 'destroys the collection withouth federating anything' do + expect { subject.call(collection_item, revoke: true) }.to change(collection.collection_items, :count).by(-1) - expect(collection_item.reload).to be_revoked + expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job end end end diff --git a/spec/services/delete_collection_service_spec.rb b/spec/services/delete_collection_service_spec.rb index bd4ed5fef6faf2..06ed82b21dbfa3 100644 --- a/spec/services/delete_collection_service_spec.rb +++ b/spec/services/delete_collection_service_spec.rb @@ -12,7 +12,7 @@ expect { subject.call(collection) }.to change(Collection, :count).by(-1) end - it 'federates a `Remove` activity', feature: :collections_federation do + it 'federates a `Remove` activity' do subject.call(collection) expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index eaf00c1ed84cd2..6174d8cac9b0aa 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -30,6 +30,49 @@ expect(subject.call(url)).to eq known_account end + context 'when searching for a remote collection', feature: :collections do + let(:account) { Fabricate(:account) } + let(:collection_account) { Fabricate(:account, domain: 'example.com', protocol: :activitypub) } + + let(:uri) { 'https://example.com/featured_collections/1' } + + let(:payload) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => uri, + 'type' => 'FeaturedCollection', + 'name' => 'Incredible people', + 'summary' => 'These are really amazing', + 'attributedTo' => collection_account.uri, + 'sensitive' => false, + 'discoverable' => true, + 'totalItems' => 0, + } + end + + before do + stub_request(:get, uri).to_return(status: 200, body: payload.to_json, headers: { 'Content-Type': 'application/activity+json' }) + end + + it 'returns the collection' do + expect(subject.call(uri, on_behalf_of: account)) + .to be_a(Collection) + .and have_attributes( + uri: uri + ) + end + end + + context 'when searching for a local collection', feature: :collections do + let(:account) { Fabricate(:account) } + let(:collection) { Fabricate(:collection) } + + it 'returns the collection' do + expect(subject.call(ActivityPub::TagManager.instance.uri_for(collection), on_behalf_of: account)) + .to eq(collection) + end + end + context 'when searching for a remote private status' do let(:account) { Fabricate(:account) } let(:poster) { Fabricate(:account, domain: 'example.com') } diff --git a/spec/services/revoke_collection_item_service_spec.rb b/spec/services/revoke_collection_item_service_spec.rb index 8ea753dcc5ec43..18357f53ddf73b 100644 --- a/spec/services/revoke_collection_item_service_spec.rb +++ b/spec/services/revoke_collection_item_service_spec.rb @@ -12,13 +12,15 @@ .to change { collection_item.reload.state }.from('accepted').to('revoked') end - context 'when the collection is remote', feature: :collections_federation do - let(:collection) { Fabricate(:remote_collection) } + context 'when the collection is remote' do + let(:account) { Fabricate(:remote_account, inbox_url: 'https://example.com/actor/1/inbox') } + let(:collection) { Fabricate(:remote_collection, account:) } let(:collection_item) { Fabricate(:collection_item, collection:, uri: 'https://example.com') } it 'federates a `Delete` activity' do subject.call(collection_item) + expect(ActivityPub::DeliveryWorker).to have_enqueued_sidekiq_job.with(instance_of(String), collection_item.account_id, 'https://example.com/actor/1/inbox') expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job end end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 3260addb319e99..07aa06151869ec 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -86,6 +86,6 @@ end def empty_results - { accounts: [], hashtags: [], statuses: [] } + { accounts: [], hashtags: [], statuses: [], collections: [] } end end diff --git a/spec/services/update_collection_service_spec.rb b/spec/services/update_collection_service_spec.rb index b7b9547dbb9e60..088d5768ed0b61 100644 --- a/spec/services/update_collection_service_spec.rb +++ b/spec/services/update_collection_service_spec.rb @@ -6,28 +6,23 @@ subject { described_class.new } let(:collection) { Fabricate(:collection) } + let!(:collection_item) { Fabricate(:collection_item, collection:) } describe '#call' do context 'when given valid parameters' do - it 'updates the collection' do - subject.call(collection, { name: 'Newly updated name' }) - - expect(collection.name).to eq 'Newly updated name' - end - - context 'when something actually changed' do - it 'federates an `Update` activity', feature: :collections_federation do - subject.call(collection, { name: 'updated' }) - - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job - end + it 'updates the collection, sends a notification and federates an `Update` activity' do + expect { subject.call(collection, { name: 'Newly updated name' }) } + .to change(collection, :name).to('Newly updated name') + .and enqueue_sidekiq_job(LocalNotificationWorker).with(collection_item.account_id, collection.id, collection.class.name, 'collection_update') + .and enqueue_sidekiq_job(ActivityPub::AccountRawDistributionWorker) end context 'when nothing changed' do - it 'does not federate an activity', feature: :collections_federation do + it 'does not federate an activity' do subject.call(collection, { name: collection.name }) expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job + expect(LocalNotificationWorker).to_not have_enqueued_sidekiq_job end end end diff --git a/spec/support/examples/workers/fasp/delivery_failure.rb b/spec/support/examples/workers/fasp/delivery_failure.rb index 006d93e80d8f77..aeb6364dbe3755 100644 --- a/spec/support/examples/workers/fasp/delivery_failure.rb +++ b/spec/support/examples/workers/fasp/delivery_failure.rb @@ -2,15 +2,18 @@ RSpec.shared_examples 'worker handling fasp delivery failures' do context 'when provider is not available' do + let(:delivery_last_failed_at) { 1.minute.ago.beginning_of_minute } + before do - provider.update(delivery_last_failed_at: 1.minute.ago) + provider.update(delivery_last_failed_at:) domain = Addressable::URI.parse(provider.base_url).normalized_host UnavailableDomain.create!(domain:) end - it 'does not attempt connecting and does not fail the job' do + it 'does not attempt connecting, does not fail the job and does not update the provider' do expect { subject }.to_not raise_error expect(stubbed_request).to_not have_been_made + expect(provider.reload.delivery_last_failed_at).to eq delivery_last_failed_at end end diff --git a/spec/support/matchers/attachments.rb b/spec/support/matchers/attachments.rb new file mode 100644 index 00000000000000..482f3a055cbec3 --- /dev/null +++ b/spec/support/matchers/attachments.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +RSpec::Matchers.define :have_attachment do |value| + match do |response| + expect(response.headers['Content-Disposition']) + .to match(<<~FILENAME.squish) + attachment; filename="#{value}" + FILENAME + end + + failure_message do |response| + <<~ERROR + Expected response to have file attachment of `#{value}` but was: + Content-Disposition: #{response.headers['Content-Disposition']} + ERROR + end +end diff --git a/spec/system/account_notes_spec.rb b/spec/system/account_notes_spec.rb deleted file mode 100644 index eaef248347cb1c..00000000000000 --- a/spec/system/account_notes_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe 'Account notes', :inline_jobs, :js, :streaming do - include ProfileStories - - let(:email) { 'test@example.com' } - let(:password) { 'password' } - let(:confirmed_at) { Time.zone.now } - let(:finished_onboarding) { true } - - let!(:other_account) { Fabricate(:account) } - let(:note_text) { 'This is a personal note' } - - before { as_a_logged_in_user } - - it 'can be written and viewed' do - visit_profile(other_account) - - fill_in frontend_translations('account_note.placeholder'), with: note_text - - # This is a bit awkward since there is no button to save the change - # The easiest way is to send ctrl+enter ourselves - find_field(class: 'account__header__account-note__content').send_keys [:control, :enter] - - expect(page) - .to have_css('.account__header__account-note__content', text: note_text) - - # Navigate back and forth and ensure the comment is still here - visit root_url - visit_profile(other_account) - - expect(AccountNote.find_by(account: bob.account, target_account: other_account).comment) - .to eq note_text - - expect(page) - .to have_css('.account__header__account-note__content', text: note_text) - end - - def visit_profile(account) - visit short_account_path(account) - - expect(page) - .to have_css('div.app-holder') - .and have_css('form.compose-form') - end -end diff --git a/spec/system/admin/software_updates_spec.rb b/spec/system/admin/software_updates_spec.rb index d9e4bf36fa682f..7eec0c659d0b58 100644 --- a/spec/system/admin/software_updates_spec.rb +++ b/spec/system/admin/software_updates_spec.rb @@ -3,23 +3,26 @@ require 'rails_helper' RSpec.describe 'finding software updates through the admin interface' do - before do - Fabricate(:software_update, version: '99.99.99', type: 'major', urgent: true, release_notes: 'https://github.com/mastodon/mastodon/releases/v99') - Fabricate(:software_update, version: '3.5.0', type: 'major', urgent: true, release_notes: 'https://github.com/mastodon/mastodon/releases/v3.5.0') + before { sign_in Fabricate(:owner_user) } - sign_in Fabricate(:owner_user), scope: :user - end + let!(:latest_release) { Fabricate(:software_update, version: '99.99.99', type: 'major', urgent: true, release_notes: 'https://github.com/mastodon/mastodon/releases/v99') } + let!(:other_release) { Fabricate(:software_update, version: '98.0.0', type: 'major', release_notes: '') } + let!(:outdated_release) { Fabricate(:software_update, version: '3.5.0', type: 'major', urgent: true, release_notes: 'https://github.com/mastodon/mastodon/releases/v3.5.0') } it 'shows a link to the software updates page, which links to release notes' do visit settings_profile_path click_on I18n.t('admin.critical_update_pending') - expect(page).to have_title(I18n.t('admin.software_updates.title')) - - expect(page).to have_content('99.99.99') - .and have_no_content('3.5.0') + expect(page) + .to have_title(I18n.t('admin.software_updates.title')) + .and have_content(latest_release.version) + .and have_content(other_release.version) + .and have_no_content(outdated_release.version) - click_on I18n.t('admin.software_updates.release_notes') - expect(page).to have_current_path('https://github.com/mastodon/mastodon/releases/v99', url: true) + within("#software_update_#{latest_release.id}") do + click_on I18n.t('admin.software_updates.release_notes') + end + expect(page) + .to have_current_path('https://github.com/mastodon/mastodon/releases/v99', url: true) end end diff --git a/spec/system/media_spec.rb b/spec/system/media_spec.rb index ec069cdcaa9ee3..1ffd8b73812a81 100644 --- a/spec/system/media_spec.rb +++ b/spec/system/media_spec.rb @@ -15,7 +15,7 @@ let(:media) { Fabricate :media_attachment, type: :video } it 'visits the player page and renders media' do - visit medium_player_path(media) + visit player_medium_path(media) expect(page) .to have_css('body', class: 'player') @@ -27,7 +27,7 @@ let(:media) { Fabricate :media_attachment, type: :gifv } it 'visits the player page and renders media' do - visit medium_player_path(media) + visit player_medium_path(media) expect(page) .to have_css('body', class: 'player') @@ -39,7 +39,7 @@ let(:media) { Fabricate :media_attachment, type: :audio } it 'visits the player page and renders media' do - visit medium_player_path(media) + visit player_medium_path(media) expect(page) .to have_css('body', class: 'player') diff --git a/spec/system/profile_spec.rb b/spec/system/profile_spec.rb index eb0aed15935cd7..87fe4b03b27375 100644 --- a/spec/system/profile_spec.rb +++ b/spec/system/profile_spec.rb @@ -17,25 +17,6 @@ .to have_title("alice (@alice@#{local_domain_uri.host})") end - it 'I can change my account' do - visit settings_profile_path - - fill_in 'Display name', with: 'Bob' - fill_in 'Bio', with: 'Bob is silent' - - account_fields_labels.first.fill_in with: 'Personal Website' - account_fields_values.first.fill_in with: 'https://host.example/personal' - - account_fields_labels.last.fill_in with: 'Professional Biography' - account_fields_values.last.fill_in with: 'https://host.example/pro' - - expect { submit_form } - .to change { bob.account.reload.display_name }.to('Bob') - .and(change_account_fields) - expect(page) - .to have_content 'Changes successfully saved!' - end - def submit_form first('button[type=submit]').click end diff --git a/spec/system/settings/featured_tags_spec.rb b/spec/system/settings/featured_tags_spec.rb deleted file mode 100644 index 2460817f94e273..00000000000000 --- a/spec/system/settings/featured_tags_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe 'Settings Featured Tags' do - let(:user) { Fabricate(:user) } - - before { sign_in(user) } - - describe 'Managing tags' do - let(:tag) { Fabricate(:tag) } - let(:status) { Fabricate :status, account: user.account } - - before { status.tags << tag } - - it 'Views, adds, and removes featured tags' do - visit settings_featured_tags_path - - # Link to existing tag used on a status - expect(page.body) - .to include( - settings_featured_tags_path(featured_tag: { name: tag.name }) - ) - - # Invalid entry - fill_in 'featured_tag_name', with: 'test, #foo !bleh' - expect { click_on I18n.t('featured_tags.add_new') } - .to_not change(user.account.featured_tags, :count) - - # Valid entry - fill_in 'featured_tag_name', with: '#friends' - expect { click_on I18n.t('featured_tags.add_new') } - .to change(user.account.featured_tags, :count).by(1) - - # Delete the created entry - expect { click_on I18n.t('filters.index.delete') } - .to change(user.account.featured_tags, :count).by(-1) - expect(page) - .to have_title(I18n.t('settings.featured_tags')) - end - end -end diff --git a/spec/system/settings/profiles_spec.rb b/spec/system/settings/profiles_spec.rb deleted file mode 100644 index 23d9ab2fda13f6..00000000000000 --- a/spec/system/settings/profiles_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe 'Settings profile page' do - let(:user) { Fabricate :user } - let(:account) { user.account } - - before do - sign_in user - end - - it 'Views and updates profile information' do - visit settings_profile_path - - expect(page) - .to have_private_cache_control - - fill_in display_name_field, with: 'New name' - attach_file avatar_field, Rails.root.join('spec', 'fixtures', 'files', 'avatar.gif') - - expect { click_on submit_button } - .to change { account.reload.display_name }.to('New name') - .and(change { account.reload.avatar.instance.avatar_file_name }.from(nil).to(be_present)) - expect(ActivityPub::UpdateDistributionWorker) - .to have_enqueued_sidekiq_job(account.id) - end - - def display_name_field - form_label('defaults.display_name') - end - - def avatar_field - form_label('defaults.avatar') - end -end diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index 0ffbf7fb8bca54..e71794b80834f1 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -3,109 +3,101 @@ require 'rails_helper' RSpec.describe EmailMxValidator do - let(:user) { Fabricate.build :user, email: } - let(:email) { 'foo@example.com' } - let(:resolv_dns_double) { instance_double(Resolv::DNS) } - - context 'with an e-mail domain that is explicitly allowed' do - around do |example| - original = Rails.configuration.x.email_domains_allowlist - Rails.configuration.x.email_domains_allowlist = 'example.com' - example.run - Rails.configuration.x.email_domains_allowlist = original - end + subject { record_class.new } - context 'when there are not DNS records' do - before { configure_resolver('example.com') } + context 'with no options' do + let(:record_class) do + Class.new do + include ActiveModel::Validations + + def self.name = 'Record' - it 'does not add errors to record' do - subject.validate(user) - expect(user.errors).to be_empty + attr_accessor :email + + validates :email, email_mx: true end end - end - context 'when there are DNS records for the domain' do - before { configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) } + let(:user) { Fabricate.build :user, email: } + let(:email) { 'foo@example.com' } + let(:resolv_dns_double) { instance_double(Resolv::DNS) } + + context 'with an e-mail domain that is explicitly allowed' do + around do |example| + original = Rails.configuration.x.email_domains_allowlist + Rails.configuration.x.email_domains_allowlist = 'example.com' + example.run + Rails.configuration.x.email_domains_allowlist = original + end + + context 'when there are not DNS records' do + before { configure_resolver('example.com') } - it 'does not add errors to record' do - subject.validate(user) - expect(user.errors).to be_empty + it { is_expected.to allow_value(email).for(:email) } + end end - end - context 'when the TagManager fails to normalize the domain' do - before do - allow(TagManager).to receive(:instance).and_return(tag_manage_double) - allow(tag_manage_double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError) + context 'when there are DNS records for the domain' do + before { configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) } + + it { is_expected.to allow_value(email).for(:email) } end - let(:tag_manage_double) { instance_double(TagManager) } + context 'when the TagManager fails to normalize the domain' do + before do + allow(TagManager).to receive(:instance).and_return(tag_manage_double) + allow(tag_manage_double).to receive(:normalize_domain).with('example.com').and_raise(Addressable::URI::InvalidURIError) + end - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + let(:tag_manage_double) { instance_double(TagManager) } + + it { is_expected.to_not allow_value(email).for(:email) } end - end - context 'when the email portion is blank' do - let(:email) { 'foo@' } + context 'when the email portion is blank' do + let(:email) { 'foo@' } - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + it { is_expected.to_not allow_value(email).for(:email) } end - end - context 'when the email domain contains empty labels' do - let(:email) { 'foo@example..com' } + context 'when the email domain contains empty labels' do + let(:email) { 'foo@example..com' } - before { configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) } + before { configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) } - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + it { is_expected.to_not allow_value(email).for(:email) } end - end - context 'when there are no DNS records for the email domain' do - before { configure_resolver('example.com') } + context 'when there are no DNS records for the email domain' do + before { configure_resolver('example.com') } - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + it { is_expected.to_not allow_value(email).for(:email) } end - end - context 'when MX record does not lead to an IP' do - before do - configure_resolver('example.com', mx: resolv_double_mx('mail.example.com')) - configure_resolver('mail.example.com') - end + context 'when MX record does not lead to an IP' do + before do + configure_resolver('example.com', mx: resolv_double_mx('mail.example.com')) + configure_resolver('mail.example.com') + end - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + it { is_expected.to_not allow_value(email).for(:email) } end - end - context 'when the MX record has an email domain block' do - before do - Fabricate :email_domain_block, domain: 'mail.example.com' - configure_resolver( - 'example.com', - mx: resolv_double_mx('mail.example.com') - ) - configure_resolver( - 'mail.example.com', - a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'), - aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2') - ) - end + context 'when the MX record has an email domain block' do + before do + Fabricate :email_domain_block, domain: 'mail.example.com' + configure_resolver( + 'example.com', + mx: resolv_double_mx('mail.example.com') + ) + configure_resolver( + 'mail.example.com', + a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'), + aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2') + ) + end - it 'adds errors to record' do - subject.validate(user) - expect(user.errors).to be_present + it { is_expected.to_not allow_value(email).for(:email) } end end diff --git a/spec/workers/scheduler/collection_item_cleanup_scheduler_spec.rb b/spec/workers/scheduler/collection_item_cleanup_scheduler_spec.rb new file mode 100644 index 00000000000000..0a13053f81d3e7 --- /dev/null +++ b/spec/workers/scheduler/collection_item_cleanup_scheduler_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Scheduler::CollectionItemCleanupScheduler do + let(:worker) { described_class.new } + + describe '#perform' do + let!(:old_rejected_item) { Fabricate(:collection_item, state: :rejected, updated_at: 25.hours.ago) } + let!(:old_revoked_item) { Fabricate(:collection_item, state: :revoked, updated_at: 26.hours.ago) } + let!(:new_revoked_item) { Fabricate(:collection_item, state: :revoked, updated_at: 2.hours.ago) } + let!(:accepted_item) { Fabricate(:collection_item, state: :accepted, updated_at: 30.hours.ago) } + + it 'deletes the rejected and revoked items older than 24 hours' do + expect { subject.perform }.to change(CollectionItem, :count).by(-2) + + expect { old_rejected_item.reload }.to raise_error(ActiveRecord::RecordNotFound) + expect { old_revoked_item.reload }.to raise_error(ActiveRecord::RecordNotFound) + expect { new_revoked_item.reload }.to_not raise_error + expect { accepted_item.reload }.to_not raise_error + end + end +end diff --git a/streaming/index.js b/streaming/index.js index 9284c399105560..2865635cdf0287 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -3,6 +3,7 @@ import fs from 'node:fs'; import http from 'node:http'; import path from 'node:path'; +import querystring from 'node:querystring'; import url from 'node:url'; import cors from 'cors'; @@ -105,6 +106,19 @@ const parseJSON = (json, req) => { } }; +/** + * Parses the query string from a request object. + * @param {Request?} req + */ +const parseQueryString = (req) => { + if (!req?.url) { + return undefined; + } + const url = new URL(req.url, "http://./"); + const qs = url.search.slice(1); + return querystring.parse(qs); +} + // Used for priming the counters/gauges for the various metrics that are // per-channel const CHANNEL_NAMES = [ @@ -436,8 +450,8 @@ const startServer = async () => { */ const accountFromRequest = (req) => new Promise((resolve, reject) => { const authorization = req.headers.authorization; - const location = req.url ? url.parse(req.url, true) : undefined; - const accessToken = location?.query.access_token || req.headers['sec-websocket-protocol']; + const query = parseQueryString(req); + const accessToken = query?.access_token || req.headers['sec-websocket-protocol']; if (!authorization && !accessToken) { reject(new AuthenticationError('Missing access token')); @@ -1503,8 +1517,8 @@ const startServer = async () => { * @param {import('pino').Logger} log */ function onConnection(ws, req, log) { - // Note: url.parse could throw, which would terminate the connection, so we - // increment the connected clients metric straight away when we establish + // In case the handler throws, which would terminate the connection, + // increment the connected clients metric straight away when it establishes // the connection, without waiting: metrics.connectedClients.labels({ type: 'websocket' }).inc(); @@ -1589,15 +1603,10 @@ const startServer = async () => { subscribeWebsocketToSystemChannel(session); - // Parse the URL for the connection arguments (if supplied), url.parse can throw: - const location = req.url && url.parse(req.url, true); - - if (location && location.query.stream) { - subscribeWebsocketToChannel( - session, - firstParam(location.query.stream), - location.query, - ); + // Parse the URL for the connection arguments (if supplied) + const query = parseQueryString(req); + if (query && query.stream) { + subscribeWebsocketToChannel(session, firstParam(query.stream), query); } } diff --git a/streaming/package.json b/streaming/package.json index 3989917b08710a..8308c47032f3ca 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.13.0", + "packageManager": "yarn@4.14.1", "engines": { "node": ">=20" }, @@ -27,7 +27,7 @@ "pino": "^10.0.0", "pino-http": "^11.0.0", "prom-client": "^15.0.0", - "uuid": "^13.0.0", + "uuid": "^14.0.0", "ws": "^8.12.1" }, "devDependencies": { @@ -38,7 +38,7 @@ "@types/ws": "^8.5.9", "globals": "^17.3.0", "pino-pretty": "^13.0.0", - "typescript": "~5.9.0", + "typescript": "~6.0.0", "typescript-eslint": "^8.55.0" }, "optionalDependencies": { diff --git a/stylelint.config.js b/stylelint.config.js index 1db58de646d4cd..10a2f1cd555694 100644 --- a/stylelint.config.js +++ b/stylelint.config.js @@ -5,8 +5,7 @@ module.exports = { 'coverage/**/*', 'node_modules/**/*', 'public/assets/**/*', - 'public/packs/**/*', - 'public/packs-test/**/*', + 'public/packs*/**/*', 'vendor/**/*', ], reportDescriptionlessDisables: true, @@ -51,6 +50,13 @@ module.exports = { true, { ignorePseudoClasses: ['global'] }, ], + + 'property-no-unknown': [ + true, + { + ignoreProperties: ['composes'], + }, + ], }, }, ], diff --git a/tsconfig.json b/tsconfig.json index db727baf185d0a..98401ec95a8a21 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,6 @@ { "compilerOptions": { "jsx": "react-jsx", - "target": "esnext", - "module": "ES2022", - "moduleResolution": "bundler", "allowJs": true, "resolveJsonModule": true, "noEmit": true, @@ -14,15 +11,14 @@ "esModuleInterop": true, "skipLibCheck": true, "types": ["vite/client", "vitest/globals"], - "baseUrl": "./", "incremental": true, "tsBuildInfoFile": "tmp/cache/tsconfig.tsbuildinfo", "paths": { - "@/*": ["app/javascript/*"], - "mastodon": ["app/javascript/mastodon"], - "mastodon/*": ["app/javascript/mastodon/*"], - "images/*": ["app/javascript/images/*"], - "styles/*": ["app/javascript/styles/*"] + "@/*": ["./app/javascript/*"], + "mastodon": ["./app/javascript/mastodon"], + "mastodon/*": ["./app/javascript/mastodon/*"], + "images/*": ["./app/javascript/images/*"], + "styles/*": ["./app/javascript/styles/*"] }, "plugins": [{ "name": "typescript-plugin-css-modules" }] }, diff --git a/vite.config.mts b/vite.config.mts index cb8188e5ea37c6..0b14ee8c9467bf 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -1,10 +1,12 @@ import { readdir } from 'node:fs/promises'; import path from 'node:path'; +import formatjs from '@formatjs/unplugin/vite'; import { optimizeLodashImports } from '@optimize-lodash/rollup-plugin'; import babel from '@rolldown/plugin-babel'; import legacy from '@vitejs/plugin-legacy'; import react from '@vitejs/plugin-react'; +import browserslist from 'browserslist'; import postcssPresetEnv from 'postcss-preset-env'; import Compress from 'rollup-plugin-gzip'; import { visualizer } from 'rollup-plugin-visualizer'; @@ -171,8 +173,9 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { plugins: [ react(), babel({ - plugins: ['formatjs', 'transform-react-remove-prop-types'], + plugins: ['transform-react-remove-prop-types'], }), + formatjs(), MastodonThemes(), MastodonAssetsManifest(), MastodonServiceWorkerLocales(), @@ -180,6 +183,7 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { legacy({ renderLegacyChunks: false, modernPolyfills: true, + modernTargets: browserslist.loadConfig({ path: process.cwd() }), }), isProdBuild && (Compress() as PluginOption), command === 'build' && diff --git a/yarn.lock b/yarn.lock index 9a0f058e1ec428..ea03704740d30b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 8 + version: 9 cacheKey: 10c0 "@aashutoshrathi/word-wrap@npm:^1.2.3": @@ -101,7 +101,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" dependencies: @@ -124,29 +124,6 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/core@npm:7.28.5" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.5" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-module-transforms": "npm:^7.28.3" - "@babel/helpers": "npm:^7.28.4" - "@babel/parser": "npm:^7.28.5" - "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.5" - "@babel/types": "npm:^7.28.5" - "@jridgewell/remapping": "npm:^2.3.5" - 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/535f82238027621da6bdffbdbe896ebad3558b311d6f8abc680637a9859b96edbf929ab010757055381570b29cf66c4a295b5618318d27a4273c0e2033925e72 - languageName: node - linkType: hard - "@babel/generator@npm:^7.28.5": version: 7.28.5 resolution: "@babel/generator@npm:7.28.5" @@ -182,7 +159,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2, @babel/helper-compilation-targets@npm:^7.28.6": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: @@ -257,7 +234,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.27.1, @babel/helper-module-imports@npm:^7.28.6": +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: @@ -280,19 +257,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.28.3": - version: 7.28.3 - resolution: "@babel/helper-module-transforms@npm:7.28.3" - dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.3" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb - languageName: node - linkType: hard - "@babel/helper-optimise-call-expression@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" @@ -302,7 +266,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-plugin-utils@npm:7.28.6" checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d @@ -377,16 +341,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/helpers@npm:7.28.4" - dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.4" - checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 - languageName: node - linkType: hard - "@babel/helpers@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helpers@npm:7.28.6" @@ -509,17 +463,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.25.9": - version: 7.27.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/bc5afe6a458d5f0492c02a54ad98c5756a0c13bd6d20609aae65acd560a9e141b0876da5f358dce34ea136f271c1016df58b461184d7ae9c4321e0f98588bc84 - languageName: node - linkType: hard - "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -996,28 +939,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 - languageName: node - linkType: hard - "@babel/plugin-transform-regenerator@npm:^7.29.0": version: 7.29.0 resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" @@ -1279,7 +1200,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": +"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" dependencies: @@ -1294,7 +1215,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.5": +"@babel/traverse@npm:^7.28.5": version: 7.28.5 resolution: "@babel/traverse@npm:7.28.5" dependencies: @@ -1309,7 +1230,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -1319,16 +1240,6 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.28.4": - version: 7.28.5 - resolution: "@babel/types@npm:7.28.5" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a - languageName: node - linkType: hard - "@bcoe/v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "@bcoe/v8-coverage@npm:1.0.2" @@ -1400,7 +1311,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^3.0.0, @csstools/css-calc@npm:^3.1.1": +"@csstools/css-calc@npm:^3.0.0": version: 3.1.1 resolution: "@csstools/css-calc@npm:3.1.1" peerDependencies: @@ -1410,6 +1321,16 @@ __metadata: languageName: node linkType: hard +"@csstools/css-calc@npm:^3.1.1, @csstools/css-calc@npm:^3.2.0": + version: 3.2.0 + resolution: "@csstools/css-calc@npm:3.2.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/a4dffeef3cb8ec9e8c1e44fa68c7634033050be52ea0b56ba6ac3815b635b587c6f3a8f8cd7b8f53881c2dd0ab9ec0af77227c532ed81b8e24a05aa997d22337 + languageName: node + linkType: hard + "@csstools/css-color-parser@npm:^4.0.0": version: 4.0.0 resolution: "@csstools/css-color-parser@npm:4.0.0" @@ -1424,15 +1345,15 @@ __metadata: linkType: hard "@csstools/css-color-parser@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/css-color-parser@npm:4.0.2" + version: 4.1.0 + resolution: "@csstools/css-color-parser@npm:4.1.0" dependencies: "@csstools/color-helpers": "npm:^6.0.2" - "@csstools/css-calc": "npm:^3.1.1" + "@csstools/css-calc": "npm:^3.2.0" peerDependencies: "@csstools/css-parser-algorithms": ^4.0.0 "@csstools/css-tokenizer": ^4.0.0 - checksum: 10c0/487cf507ef4630f74bd67d84298294ed269900b206ade015a968d20047e07ff46f235b72e26fe0c6b949a03f8f9f00a22c363da49c1b06ca60b32d0188e546be + checksum: 10c0/b5b8a697b4c1b22dd535b4d93b2ffce338d38e587ac1ab20b781c08328bfa99e5f763a99d990983560df543862fa9bd578ee966c18f9d3381c8e33c641d32a0e languageName: node linkType: hard @@ -2085,7 +2006,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.7.1": +"@emnapi/core@npm:^1.4.3": version: 1.9.0 resolution: "@emnapi/core@npm:1.9.0" dependencies: @@ -2095,7 +2016,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.7.1": +"@emnapi/runtime@npm:^1.4.3": version: 1.9.0 resolution: "@emnapi/runtime@npm:1.9.0" dependencies: @@ -2577,6 +2498,13 @@ __metadata: languageName: node linkType: hard +"@formatjs/bigdecimal@npm:0.2.0": + version: 0.2.0 + resolution: "@formatjs/bigdecimal@npm:0.2.0" + checksum: 10c0/dec607e3d9d4b8c5d0474862e867726cbf322a24d543d5b2cbc3cab6fea187ac787a8e1a0e3df5ceef85a1ab9d58112a08bb7af40b1b3a3b00670431b0603510 + languageName: node + linkType: hard + "@formatjs/cli@npm:^6.1.1": version: 6.7.4 resolution: "@formatjs/cli@npm:6.7.4" @@ -2609,103 +2537,159 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:2.3.6": - version: 2.3.6 - resolution: "@formatjs/ecma402-abstract@npm:2.3.6" +"@formatjs/ecma402-abstract@npm:3.2.0": + version: 3.2.0 + resolution: "@formatjs/ecma402-abstract@npm:3.2.0" dependencies: - "@formatjs/fast-memoize": "npm:2.2.7" - "@formatjs/intl-localematcher": "npm:0.6.2" - decimal.js: "npm:^10.4.3" - tslib: "npm:^2.8.0" - checksum: 10c0/63be2a73d3168bf45ab5d50db58376e852db5652d89511ae6e44f1fa03ad96ebbfe9b06a1dfaa743db06e40eb7f33bd77530b9388289855cca79a0e3fc29eacf + "@formatjs/bigdecimal": "npm:0.2.0" + "@formatjs/fast-memoize": "npm:3.1.1" + "@formatjs/intl-localematcher": "npm:0.8.2" + checksum: 10c0/b3c8ac881c3d7533fb4127ca3d771d2a32cb89e6efbbcc72d80b1dcc6a798494ace9ca5ee822b25eb08ebdc7ee2885a9e33496a436b40271ffc915ece605a3ce languageName: node linkType: hard -"@formatjs/fast-memoize@npm:2.2.7": - version: 2.2.7 - resolution: "@formatjs/fast-memoize@npm:2.2.7" +"@formatjs/fast-memoize@npm:3.1.1": + version: 3.1.1 + resolution: "@formatjs/fast-memoize@npm:3.1.1" + checksum: 10c0/79b24dc1389a49b2b2fb9e90a2ba922a4057d4b74e7bc33a3811f0dc94a5a868d28e8e37917b68c2f831070d11dfd0889de686f269bf5214085a44efc1c25a8c + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:3.1.2": + version: 3.1.2 + resolution: "@formatjs/fast-memoize@npm:3.1.2" + checksum: 10c0/25af387ebb53146c8c09af34cda4ce82768f0855227ec854fb315d6dc2e7859e16724860fdea7991b3c7c5741154e3fcdd5169ef7a11ba1afb3ffd860613931c + languageName: node + linkType: hard + +"@formatjs/icu-messageformat-parser@npm:3.5.3": + version: 3.5.3 + resolution: "@formatjs/icu-messageformat-parser@npm:3.5.3" dependencies: - tslib: "npm:^2.8.0" - checksum: 10c0/f5eabb0e4ab7162297df8252b4cfde194b23248120d9df267592eae2be2d2f7c4f670b5a70523d91b4ecdc35d40e65823bb8eeba8dd79fbf8601a972bf3b8866 + "@formatjs/ecma402-abstract": "npm:3.2.0" + "@formatjs/icu-skeleton-parser": "npm:2.1.3" + checksum: 10c0/9a9632348df058e0da339234381b11f71b5ace1c93eaf1950b3eb45f4e146a73f8923af82818543e90c1135523b254d2c04fb47cab3624eb1f601d2a4edd35c6 languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.11.4": - version: 2.11.4 - resolution: "@formatjs/icu-messageformat-parser@npm:2.11.4" +"@formatjs/icu-messageformat-parser@npm:3.5.4": + version: 3.5.4 + resolution: "@formatjs/icu-messageformat-parser@npm:3.5.4" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - "@formatjs/icu-skeleton-parser": "npm:1.8.16" - tslib: "npm:^2.8.0" - checksum: 10c0/3ea9e9dae18282881d19a5f88107b6013f514ec8675684ed2c04bee2a174032377858937243e3bd9c9263a470988a3773a53bf8d208a34a78e7843ce66f87f3b + "@formatjs/icu-skeleton-parser": "npm:2.1.4" + checksum: 10c0/3ff5ab209b63113d6b1779a4e8de6ee2cf941f3ad3f3ede2c8e425953a25456b6a1d880d734845244615dc9887fad10b62e75dee38858c731e45812402110efb languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.16": - version: 1.8.16 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.16" +"@formatjs/icu-skeleton-parser@npm:2.1.3": + version: 2.1.3 + resolution: "@formatjs/icu-skeleton-parser@npm:2.1.3" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - tslib: "npm:^2.8.0" - checksum: 10c0/6fa1586dc11c925cd8d17e927cc635d238c969a6b7e97282a924376f78622fc25336c407589d19796fb6f8124a0e7765f99ecdb1aac014edcfbe852e7c3d87f3 + "@formatjs/ecma402-abstract": "npm:3.2.0" + checksum: 10c0/6a8ed06c722bce1d73d54b2d72462bfe46b752f43d09e3d8c14649ef775b06f3c7f8d36274e67e6cfb95800bf43230a2595a7e1790922ebb683711201fcbccc8 languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.6.2": - version: 0.6.2 - resolution: "@formatjs/intl-localematcher@npm:0.6.2" +"@formatjs/icu-skeleton-parser@npm:2.1.4": + version: 2.1.4 + resolution: "@formatjs/icu-skeleton-parser@npm:2.1.4" + checksum: 10c0/9d6292443e4079c5718c50e32041a3bd192047449d181ae87e8cb6ef78c90f156f8b2d454008c9d0c2920c215daee5250c0eb214d13a105522a631f269e71b3c + languageName: node + linkType: hard + +"@formatjs/intl-localematcher@npm:0.8.2": + version: 0.8.2 + resolution: "@formatjs/intl-localematcher@npm:0.8.2" dependencies: - tslib: "npm:^2.8.0" - checksum: 10c0/22a17a4c67160b6c9f52667914acfb7b79cd6d80630d4ac6d4599ce447cb89d2a64f7d58fa35c3145ddb37fef893f0a45b9a55e663a4eb1f2ae8b10a89fac235 + "@formatjs/fast-memoize": "npm:3.1.1" + checksum: 10c0/3bf838a018184837b167964849dafdcdeac95531a24f4df7d868638d4ad716854a250e9bccac9ab4568264c0db7470e70b99363da1db308fdc882b87f3eca651 languageName: node linkType: hard -"@formatjs/intl-pluralrules@npm:^5.4.4": - version: 5.4.6 - resolution: "@formatjs/intl-pluralrules@npm:5.4.6" +"@formatjs/intl-pluralrules@npm:^6.0.0": + version: 6.3.1 + resolution: "@formatjs/intl-pluralrules@npm:6.3.1" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - "@formatjs/intl-localematcher": "npm:0.6.2" - decimal.js: "npm:^10.4.3" - tslib: "npm:^2.8.0" - checksum: 10c0/95dd6fb3e9bd84ce44cc194f6f815d690703bd60b75bf2ae895535d2d9a1a675765879de9b54f854882fc1335cbfac6a535873d5b2d75cc5ca93c6ca172aa272 + "@formatjs/bigdecimal": "npm:0.2.0" + "@formatjs/ecma402-abstract": "npm:3.2.0" + "@formatjs/intl-localematcher": "npm:0.8.2" + checksum: 10c0/8c0847d21d06276557316a01998528b79310b1c5411b0932b51dc88640a8ed6181c2221694d1d206a217f5a2be29227edfa52d1eca0873bc7c8c04b9a7dc2cc7 languageName: node linkType: hard -"@formatjs/intl@npm:3.1.8": - version: 3.1.8 - resolution: "@formatjs/intl@npm:3.1.8" +"@formatjs/intl@npm:4.1.5": + version: 4.1.5 + resolution: "@formatjs/intl@npm:4.1.5" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - "@formatjs/fast-memoize": "npm:2.2.7" - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - intl-messageformat: "npm:10.7.18" - tslib: "npm:^2.8.0" + "@formatjs/ecma402-abstract": "npm:3.2.0" + "@formatjs/fast-memoize": "npm:3.1.1" + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + intl-messageformat: "npm:11.2.0" + checksum: 10c0/2fd7c6211b38fd6178093e7358f015dc461bc80d428372064a0c144b1a32fce4050c34fa58b77af715b8dbf77909d408b59c7e714b0c612d1b573defe70828b2 + languageName: node + linkType: hard + +"@formatjs/ts-transformer@npm:4.4.2": + version: 4.4.2 + resolution: "@formatjs/ts-transformer@npm:4.4.2" + dependencies: + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + "@types/node": "npm:22 || 24" + json-stable-stringify: "npm:^1.3.0" + typescript: "npm:^5.6.0" peerDependencies: - typescript: ^5.6.0 + ts-jest: ^29 peerDependenciesMeta: - typescript: + ts-jest: optional: true - checksum: 10c0/b291e867bcde491737f70254ec30898e120f36784b5ee2911dcc271fbd744e90382f03232ac7f5a55d46071f4ffccfc84b63445734117b75ca1ced659f6b7827 + checksum: 10c0/3385706cb4c72c4a7fed49d659b83dc98db22591c8904cc807b730e1fcc824584aa3edee7fdb9085720a3506c6daa271b34778ee7bef16eeacc39a625026c9e9 languageName: node linkType: hard -"@formatjs/ts-transformer@npm:3.14.2": - version: 3.14.2 - resolution: "@formatjs/ts-transformer@npm:3.14.2" +"@formatjs/ts-transformer@npm:4.4.3": + version: 4.4.3 + resolution: "@formatjs/ts-transformer@npm:4.4.3" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - "@types/node": "npm:^22.0.0" - chalk: "npm:^4.1.2" + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + "@types/node": "npm:22 || 24" json-stable-stringify: "npm:^1.3.0" - tslib: "npm:^2.8.0" - typescript: "npm:^5.6.0" + typescript: "npm:^5.6 || 6" peerDependencies: ts-jest: ^29 peerDependenciesMeta: ts-jest: optional: true - checksum: 10c0/990cf49cdc318e37825ec26b1b24d7368e89c5d03184867a4accd8b35d6d6d99a20a8abe6366c9870e56da9e04f4672990ca428686306c9ad8204b401c7d19f8 + checksum: 10c0/f5a4b32098e2c37c7ab7b40a798b6fa8e24e23516384579a698175ab214e2052e45256cc39880891de8db583c326a2e9f8581e1d4f7a0dc5d4aaa2291dec058d + languageName: node + linkType: hard + +"@formatjs/unplugin@npm:^1.1.5": + version: 1.1.6 + resolution: "@formatjs/unplugin@npm:1.1.6" + dependencies: + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + "@formatjs/ts-transformer": "npm:4.4.3" + magic-string: "npm:^0.30.0" + oxc-parser: "npm:^0.120.0" + unplugin: "npm:^3.0.0" + peerDependencies: + "@rspack/core": ">=1" + esbuild: ">=0.17" + rollup: ">=3" + vite: ">=5" + webpack: ^5.104.1 + peerDependenciesMeta: + "@rspack/core": + optional: true + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + checksum: 10c0/9371206edfb7d0197a04fc64b6095eea759b04a135fc766a9fe49b9252a65c7fae1c487f40952e3ae6e82ca77ee0aae456c46e42ecc7753f1990bc95e673f064 languageName: node linkType: hard @@ -2948,7 +2932,8 @@ __metadata: "@dnd-kit/utilities": "npm:^3.2.2" "@eslint/js": "npm:^9.39.2" "@formatjs/cli": "npm:^6.1.1" - "@formatjs/intl-pluralrules": "npm:^5.4.4" + "@formatjs/intl-pluralrules": "npm:^6.0.0" + "@formatjs/unplugin": "npm:^1.1.5" "@gamestdio/websocket": "npm:^0.3.2" "@github/webauthn-json": "npm:^2.1.1" "@optimize-lodash/rollup-plugin": "npm:^6.0.0" @@ -2980,12 +2965,11 @@ __metadata: "@types/react-router-dom": "npm:^5.3.3" "@types/react-sparklines": "npm:^1.7.2" "@types/react-test-renderer": "npm:^18.0.0" - "@types/react-toggle": "npm:^4.0.3" "@types/redux-immutable": "npm:^4.0.3" "@types/requestidlecallback": "npm:^0.3.5" "@use-gesture/react": "npm:^10.3.1" "@vitejs/plugin-legacy": "npm:^8.0.0" - "@vitejs/plugin-react": "npm:^5.0.0" + "@vitejs/plugin-react": "npm:^6.0.0" "@vitest/browser": "npm:^4.1.0" "@vitest/browser-playwright": "npm:^4.1.0" "@vitest/coverage-v8": "npm:^4.1.0" @@ -2993,11 +2977,10 @@ __metadata: arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" axios: "npm:^1.4.0" - babel-plugin-formatjs: "npm:^10.5.37" babel-plugin-transform-react-remove-prop-types: "npm:^0.4.24" baseline-browser-mapping: "npm:^2.8.30" blurhash: "npm:^2.0.5" - chromatic: "npm:^13.3.3" + chromatic: "npm:^16.0.0" classnames: "npm:^2.3.2" cocoon-js-vanilla: "npm:^1.5.1" color-blend: "npm:^4.0.0" @@ -3013,7 +2996,7 @@ __metadata: escape-html: "npm:^1.0.3" eslint: "npm:^9.39.2" eslint-import-resolver-typescript: "npm:^4.2.5" - eslint-plugin-formatjs: "npm:^5.3.1" + eslint-plugin-formatjs: "npm:^6.0.0" eslint-plugin-import: "npm:~2.32.0" eslint-plugin-jsdoc: "npm:^62.0.0" eslint-plugin-jsx-a11y: "npm:~6.10.2" @@ -3031,7 +3014,7 @@ __metadata: husky: "npm:^9.0.11" idb: "npm:^8.0.3" immutable: "npm:^4.3.0" - intl-messageformat: "npm:^10.7.16" + intl-messageformat: "npm:^11.0.0" js-yaml: "npm:^4.1.0" lande: "npm:^1.0.10" lint-staged: "npm:^16.2.6" @@ -3051,7 +3034,7 @@ __metadata: react-helmet: "npm:^6.1.0" react-immutable-proptypes: "npm:^2.2.0" react-immutable-pure-component: "npm:^2.2.2" - react-intl: "npm:^7.1.10" + react-intl: "npm:^10.0.0" react-overlays: "npm:^5.2.1" react-redux: "npm:^9.0.4" react-redux-loading-bar: "npm:^5.0.8" @@ -3061,7 +3044,6 @@ __metadata: react-sparklines: "npm:^1.7.0" react-test-renderer: "npm:^18.2.0" react-textarea-autosize: "npm:^8.4.1" - react-toggle: "npm:^4.1.3" redux-immutable: "npm:^4.0.0" regenerator-runtime: "npm:^0.14.0" requestidlecallback: "npm:^0.3.0" @@ -3078,14 +3060,14 @@ __metadata: tesseract.js: "npm:^7.0.0" tiny-queue: "npm:^0.2.1" twitter-text: "npm:3.1.0" - typescript: "npm:~5.9.0" + typescript: "npm:~6.0.0" typescript-eslint: "npm:^8.55.0" typescript-plugin-css-modules: "npm:^5.2.0" use-debounce: "npm:^10.0.0" vite: "npm:^8.0.0" vite-plugin-manifest-sri: "npm:^0.2.0" vite-plugin-pwa: "npm:^1.2.0" - vite-plugin-svgr: "npm:^4.5.0" + vite-plugin-svgr: "npm:^5.0.0" vitest: "npm:^4.1.0" wicg-inert: "npm:^3.1.2" workbox-expiration: "npm:^7.3.0" @@ -3124,10 +3106,10 @@ __metadata: pino-http: "npm:^11.0.0" pino-pretty: "npm:^13.0.0" prom-client: "npm:^15.0.0" - typescript: "npm:~5.9.0" + typescript: "npm:~6.0.0" typescript-eslint: "npm:^8.55.0" utf-8-validate: "npm:^6.0.3" - uuid: "npm:^13.0.0" + uuid: "npm:^14.0.0" ws: "npm:^8.12.1" dependenciesMeta: bufferutil: @@ -3175,13 +3157,14 @@ __metadata: linkType: hard "@napi-rs/wasm-runtime@npm:^1.1.1": - version: 1.1.1 - resolution: "@napi-rs/wasm-runtime@npm:1.1.1" + version: 1.1.3 + resolution: "@napi-rs/wasm-runtime@npm:1.1.3" dependencies: - "@emnapi/core": "npm:^1.7.1" - "@emnapi/runtime": "npm:^1.7.1" "@tybys/wasm-util": "npm:^0.10.1" - checksum: 10c0/04d57b67e80736e41fe44674a011878db0a8ad893f4d44abb9d3608debb7c174224cba2796ed5b0c1d367368159f3ca6be45f1c59222f70e32ddc880f803d447 + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/745bb32a023b95095a18d93658bf4564403c2283ca0500a043afcf566ac6082bd0611792f14636276bab07dc2ce6d862591c8aabddae02ec697245b05bc6f144 languageName: node linkType: hard @@ -3287,7 +3270,149 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.120.0": +"@oxc-parser/binding-android-arm-eabi@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.120.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-android-arm64@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-android-arm64@npm:0.120.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-arm64@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-darwin-arm64@npm:0.120.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-x64@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-darwin-x64@npm:0.120.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-freebsd-x64@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-freebsd-x64@npm:0.120.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.120.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-musleabihf@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.120.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-gnu@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.120.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-musl@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.120.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-ppc64-gnu@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.120.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-gnu@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.120.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-musl@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.120.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-s390x-gnu@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.120.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-gnu@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.120.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-musl@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.120.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-openharmony-arm64@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.120.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-wasm32-wasi@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.120.0" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.1" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-arm64-msvc@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.120.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-ia32-msvc@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.120.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-x64-msvc@npm:0.120.0": + version: 0.120.0 + resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.120.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.120.0, @oxc-project/types@npm:^0.120.0": version: 0.120.0 resolution: "@oxc-project/types@npm:0.120.0" checksum: 10c0/3090ca95ed1467ae790a79cf7aa49d1ea4ac390dbfccb7afb914c138034d01e72115e2e137a3cc76f409ba424e4d2b160a599fe137c88033ad68ba2df1e40b29 @@ -3827,13 +3952,6 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.47": - version: 1.0.0-beta.47 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.47" - checksum: 10c0/eb0cfa7334d66f090c47eaac612174936b05f26e789352428cb6e03575b590f355de30d26b42576ea4e613d8887b587119d19b2e4b3a8909ceb232ca1cf746c8 - languageName: node - linkType: hard - "@rolldown/pluginutils@npm:1.0.0-rc.10": version: 1.0.0-rc.10 resolution: "@rolldown/pluginutils@npm:1.0.0-rc.10" @@ -3841,6 +3959,13 @@ __metadata: languageName: node linkType: hard +"@rolldown/pluginutils@npm:1.0.0-rc.7": + version: 1.0.0-rc.7 + resolution: "@rolldown/pluginutils@npm:1.0.0-rc.7" + checksum: 10c0/9d5490b5805b25bcd1720ca01c4c032b55a0ef953dab36a8dd42c568e82214576baa464f3027cd5dff3fabcfbe3bf3db2251d12b60220f5d1cd2ffde5ee37082 + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0": version: 5.3.1 resolution: "@rollup/plugin-babel@npm:5.3.1" @@ -3917,9 +4042,9 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.0, @rollup/pluginutils@npm:^5.2.0": - version: 5.2.0 - resolution: "@rollup/pluginutils@npm:5.2.0" +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.0, @rollup/pluginutils@npm:^5.3.0": + version: 5.3.0 + resolution: "@rollup/pluginutils@npm:5.3.0" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" @@ -3929,7 +4054,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: 10c0/794890d512751451bcc06aa112366ef47ea8f9125dac49b1abf72ff8b079518b09359de9c60a013b33266541634e765ae61839c749fae0edb59a463418665c55 + checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 languageName: node linkType: hard @@ -4343,7 +4468,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:*, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -4365,15 +4490,6 @@ __metadata: languageName: node linkType: hard -"@types/babel__helper-plugin-utils@npm:^7.10.3": - version: 7.10.3 - resolution: "@types/babel__helper-plugin-utils@npm:7.10.3" - dependencies: - "@types/babel__core": "npm:*" - checksum: 10c0/c22f68e8019c1e75e42fccc6eaca94a269fa177c4544599aa084b216b879b626f63f89755a4ac2dc9054b6e9ed4e0fab1e3460d36ce20767c99aef4a3c81fce3 - languageName: node - linkType: hard - "@types/babel__template@npm:*": version: 7.4.3 resolution: "@types/babel__template@npm:7.4.3" @@ -4384,7 +4500,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.6, @types/babel__traverse@npm:^7.20.7": +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.7": version: 7.28.0 resolution: "@types/babel__traverse@npm:7.28.0" dependencies: @@ -4469,30 +4585,20 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:^9.6.1": - version: 9.6.1 - resolution: "@types/eslint@npm:9.6.1" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": +"@types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard -"@types/estree@npm:0.0.39": - version: 0.0.39 - resolution: "@types/estree@npm:0.0.39" - checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 - languageName: node - linkType: hard - "@types/express-serve-static-core@npm:^5.0.0": version: 5.1.0 resolution: "@types/express-serve-static-core@npm:5.1.0" @@ -4564,7 +4670,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": +"@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -4606,12 +4712,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^22.0.0": - version: 22.13.14 - resolution: "@types/node@npm:22.13.14" +"@types/node@npm:*, @types/node@npm:22 || 24": + version: 24.12.0 + resolution: "@types/node@npm:24.12.0" dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/fa2ab5b8277bfbcc86c42e46a3ea9871b0d559894cc9d955685d17178c9499f0b1bf03d1d1ea8d92ef2dda818988f4035acb8abf9dc15423a998fa56173ab804 + undici-types: "npm:~7.16.0" + checksum: 10c0/8b31c0af5b5474f13048a4e77c57f22cd4f8fe6e58c4b6fde9456b0c13f46a5bfaf5744ff88fd089581de9f0d6e99c584e022681de7acb26a58d258c654c4843 languageName: node linkType: hard @@ -4640,10 +4746,10 @@ __metadata: languageName: node linkType: hard -"@types/picomatch@npm:^3": - version: 3.0.2 - resolution: "@types/picomatch@npm:3.0.2" - checksum: 10c0/f35d16fe10a6e13ead6499dd7d7d317e4fd78e48260398104e837e5ca83d393024bdc6f432cb644c0a69b0726a071fcc6eb09befbbcfafb3c3c5f71dbbfde487 +"@types/picomatch@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/picomatch@npm:4.0.2" + checksum: 10c0/0f46198c2d1beb5061816745355888e94a80a449a49af1ef69723f50e850c678b50cff299bd461f71e8009d46705e7cdeda8c8ffa23815b2e942c83877f855b9 languageName: node linkType: hard @@ -4760,15 +4866,6 @@ __metadata: languageName: node linkType: hard -"@types/react-toggle@npm:^4.0.3": - version: 4.0.5 - resolution: "@types/react-toggle@npm:4.0.5" - dependencies: - "@types/react": "npm:*" - checksum: 10c0/f557b85c96715b145bcc3beb2903f88ee3a6045ef85da0f80561c7cc2ecdc531e2d4ae121ed8ec3a1761264de25b8410653744093f37abf042201587add7ffa6 - languageName: node - linkType: hard - "@types/react-transition-group@npm:^4.4.0": version: 4.4.8 resolution: "@types/react-transition-group@npm:4.4.8" @@ -4993,7 +5090,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.55.0, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.48.0": +"@typescript-eslint/utils@npm:8.55.0, @typescript-eslint/utils@npm:^8.48.0": version: 8.55.0 resolution: "@typescript-eslint/utils@npm:8.55.0" dependencies: @@ -5018,6 +5115,13 @@ __metadata: languageName: node linkType: hard +"@unicode/unicode-17.0.0@npm:^1.6.16": + version: 1.6.16 + resolution: "@unicode/unicode-17.0.0@npm:1.6.16" + checksum: 10c0/0d45cedb8349663e7d98509b0c78c10630adc86121003635e731654f152e84711eed1e9002d3ac588c77eadc360a1e1b51e4d153c7ff26443ee58f2bc77184e2 + languageName: node + linkType: hard + "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1": version: 1.11.1 resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1" @@ -5194,19 +5298,21 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^5.0.0": - version: 5.1.1 - resolution: "@vitejs/plugin-react@npm:5.1.1" +"@vitejs/plugin-react@npm:^6.0.0": + version: 6.0.1 + resolution: "@vitejs/plugin-react@npm:6.0.1" dependencies: - "@babel/core": "npm:^7.28.5" - "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" - "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.47" - "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.18.0" + "@rolldown/pluginutils": "npm:1.0.0-rc.7" peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/e590efaea1eabfbb1beb6e8c9fac0742fd299808e3368e63b2825ce24740adb8a28fcb2668b14b7ca1bdb42890cfefe94d02dd358dcbbf8a27ddf377b9a82abf + "@rolldown/plugin-babel": ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + "@rolldown/plugin-babel": + optional: true + babel-plugin-react-compiler: + optional: true + checksum: 10c0/6c42f53a970cb6b0776ba5b4203bb01690ac564c56fca706d4037b50aec965ddc0f11530ab58ab2cd0fbe8c12e14cff6966b22d90391283b4a53294e3ddd478d languageName: node linkType: hard @@ -5813,25 +5919,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-formatjs@npm:^10.5.37": - version: 10.5.41 - resolution: "babel-plugin-formatjs@npm:10.5.41" - dependencies: - "@babel/core": "npm:^7.26.10" - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - "@formatjs/ts-transformer": "npm:3.14.2" - "@types/babel__core": "npm:^7.20.5" - "@types/babel__helper-plugin-utils": "npm:^7.10.3" - "@types/babel__traverse": "npm:^7.20.6" - tslib: "npm:^2.8.0" - checksum: 10c0/bbe0e182185c72e4136a4cf37b2366952ad5b1d090de00a132757d2a65a5a6aef95ada93dffdc4ed0cf4338a0ff29c5a0d025d77e8b774b088c69bd68ac07ca6 - languageName: node - linkType: hard - "babel-plugin-macros@npm:^3.1.0": version: 3.1.0 resolution: "babel-plugin-macros@npm:3.1.0" @@ -5983,11 +6070,11 @@ __metadata: linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.2 - resolution: "brace-expansion@npm:2.0.2" + version: 2.1.0 + resolution: "brace-expansion@npm:2.1.0" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf + checksum: 10c0/439cedf3e23d7993b37919f1d6fdc653ec21a42437ec3e7460bea9ca8b17edf7a24a633273c31d61aa4335877cf29a443f1871814131c87997a1e6223e1f1502 languageName: node linkType: hard @@ -6150,9 +6237,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001770 - resolution: "caniuse-lite@npm:1.0.30001770" - checksum: 10c0/02d15a8b723af65318cb4d888a52bb090076898da7b0de99e8676d537f8d1d2ae4797e81518e1e30cbfe84c33b048c322e8bfafc5b23cfee8defb0d2bf271149 + version: 1.0.30001790 + resolution: "caniuse-lite@npm:1.0.30001790" + checksum: 10c0/eec0adc1dcb35d51e57bcfa0657493cb57ef43f0ceb03c1edcfee34d43e7a938e6beed2781118c7a5ee99d4f71d443977f08ca5a549005cf89260733af9ad3f8 languageName: node linkType: hard @@ -6183,7 +6270,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.0.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -6223,9 +6310,9 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^13.3.3": - version: 13.3.3 - resolution: "chromatic@npm:13.3.3" +"chromatic@npm:^16.0.0": + version: 16.0.0 + resolution: "chromatic@npm:16.0.0" peerDependencies: "@chromatic-com/cypress": ^0.*.* || ^1.0.0 "@chromatic-com/playwright": ^0.*.* || ^1.0.0 @@ -6238,11 +6325,11 @@ __metadata: chroma: dist/bin.js chromatic: dist/bin.js chromatic-cli: dist/bin.js - checksum: 10c0/6fc54df030113d91ef00a2050f5cb13ca182b355dae2c29cdd326fac6cf21d8ddc2cd93dc3f5db04379b7769d4df8e3ea5f18c3642e9e3a48545565f992a838c + checksum: 10c0/ebebbf1c7d57e1ee9863997416c5125aab0a1886dce60fcb0358d34a51e0e1a45edc4635c8f8fb56d9facbcf21cd48014320c550f723b4791da51dde8552ee2b languageName: node linkType: hard -"classnames@npm:^2.2.5, classnames@npm:^2.3.2": +"classnames@npm:^2.3.2": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10c0/afff4f77e62cea2d79c39962980bf316bacb0d7c49e13a21adaadb9221e1c6b9d3cdb829d8bb1b23c406f4e740507f37e1dcf506f7e3b7113d17c5bab787aa69 @@ -6731,7 +6818,7 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.4.3, decimal.js@npm:^10.6.0": +"decimal.js@npm:^10.6.0": version: 10.6.0 resolution: "decimal.js@npm:10.6.0" checksum: 10c0/07d69fbcc54167a340d2d97de95f546f9ff1f69d2b45a02fd7a5292412df3cd9eb7e23065e532a318f5474a2e1bccf8392fdf0443ef467f97f3bf8cb0477e5aa @@ -6996,7 +7083,7 @@ __metadata: languageName: node linkType: hard -"emoji-regex@npm:10.3.0, emoji-regex@npm:^10.3.0": +"emoji-regex@npm:^10.3.0": version: 10.3.0 resolution: "emoji-regex@npm:10.3.0" checksum: 10c0/b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 @@ -7456,22 +7543,19 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-formatjs@npm:^5.3.1": - version: 5.4.2 - resolution: "eslint-plugin-formatjs@npm:5.4.2" +"eslint-plugin-formatjs@npm:^6.0.0": + version: 6.4.3 + resolution: "eslint-plugin-formatjs@npm:6.4.3" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - "@formatjs/ts-transformer": "npm:3.14.2" - "@types/eslint": "npm:^9.6.1" - "@types/picomatch": "npm:^3" - "@typescript-eslint/utils": "npm:^8.27.0" + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + "@formatjs/ts-transformer": "npm:4.4.2" + "@types/picomatch": "npm:^4.0.0" + "@unicode/unicode-17.0.0": "npm:^1.6.16" magic-string: "npm:^0.30.0" picomatch: "npm:2 || 3 || 4" - tslib: "npm:^2.8.0" - unicode-emoji-utils: "npm:^1.2.0" peerDependencies: - eslint: ^9.23.0 - checksum: 10c0/46bee038c54a7da58647eaccee6c956857ad81499b60f814914921b26852e6bf9b0efabb9556d7aab0e151ba349dcf949dc5f14a356b80bc5e63f338e7f7cc7f + eslint: 9 || 10 + checksum: 10c0/348f72c8668ebeb10c7273103b6b91230684b97bf683eddaeaeb6a298e6fa483028504274ed53f3971d5acb68aaa790b89e184328a1520b41158c1b9ef770b39 languageName: node linkType: hard @@ -8841,15 +8925,24 @@ __metadata: languageName: node linkType: hard -"intl-messageformat@npm:10.7.18, intl-messageformat@npm:^10.7.16": - version: 10.7.18 - resolution: "intl-messageformat@npm:10.7.18" +"intl-messageformat@npm:11.2.0": + version: 11.2.0 + resolution: "intl-messageformat@npm:11.2.0" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - "@formatjs/fast-memoize": "npm:2.2.7" - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - tslib: "npm:^2.8.0" - checksum: 10c0/d54da9987335cb2bca26246304cea2ca6b1cb44ca416d6b28f3aa62b11477c72f7ce0bf3f11f5d236ceb1842bdc3378a926e606496d146fde18783ec92c314e1 + "@formatjs/ecma402-abstract": "npm:3.2.0" + "@formatjs/fast-memoize": "npm:3.1.1" + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + checksum: 10c0/0f0a92324ef61c885902ff41c99754a65f0cc5cbe25d690c1771605117df4f97a786bb06dec50f12a7047e4cb2fab1f2516002df32e93be6ac02e1967e928e44 + languageName: node + linkType: hard + +"intl-messageformat@npm:^11.0.0": + version: 11.2.1 + resolution: "intl-messageformat@npm:11.2.1" + dependencies: + "@formatjs/fast-memoize": "npm:3.1.2" + "@formatjs/icu-messageformat-parser": "npm:3.5.4" + checksum: 10c0/c4d2e43c2e7940a8dbd75d7a3b77d722c7ac8802707f7410067097e3a923243343bd36367edb4e922b13d1a10425a2f52c544c65c9368841d481816ed04c6c2b languageName: node linkType: hard @@ -10729,6 +10822,76 @@ __metadata: languageName: node linkType: hard +"oxc-parser@npm:^0.120.0": + version: 0.120.0 + resolution: "oxc-parser@npm:0.120.0" + dependencies: + "@oxc-parser/binding-android-arm-eabi": "npm:0.120.0" + "@oxc-parser/binding-android-arm64": "npm:0.120.0" + "@oxc-parser/binding-darwin-arm64": "npm:0.120.0" + "@oxc-parser/binding-darwin-x64": "npm:0.120.0" + "@oxc-parser/binding-freebsd-x64": "npm:0.120.0" + "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.120.0" + "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.120.0" + "@oxc-parser/binding-linux-arm64-gnu": "npm:0.120.0" + "@oxc-parser/binding-linux-arm64-musl": "npm:0.120.0" + "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.120.0" + "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.120.0" + "@oxc-parser/binding-linux-riscv64-musl": "npm:0.120.0" + "@oxc-parser/binding-linux-s390x-gnu": "npm:0.120.0" + "@oxc-parser/binding-linux-x64-gnu": "npm:0.120.0" + "@oxc-parser/binding-linux-x64-musl": "npm:0.120.0" + "@oxc-parser/binding-openharmony-arm64": "npm:0.120.0" + "@oxc-parser/binding-wasm32-wasi": "npm:0.120.0" + "@oxc-parser/binding-win32-arm64-msvc": "npm:0.120.0" + "@oxc-parser/binding-win32-ia32-msvc": "npm:0.120.0" + "@oxc-parser/binding-win32-x64-msvc": "npm:0.120.0" + "@oxc-project/types": "npm:^0.120.0" + dependenciesMeta: + "@oxc-parser/binding-android-arm-eabi": + optional: true + "@oxc-parser/binding-android-arm64": + optional: true + "@oxc-parser/binding-darwin-arm64": + optional: true + "@oxc-parser/binding-darwin-x64": + optional: true + "@oxc-parser/binding-freebsd-x64": + optional: true + "@oxc-parser/binding-linux-arm-gnueabihf": + optional: true + "@oxc-parser/binding-linux-arm-musleabihf": + optional: true + "@oxc-parser/binding-linux-arm64-gnu": + optional: true + "@oxc-parser/binding-linux-arm64-musl": + optional: true + "@oxc-parser/binding-linux-ppc64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-musl": + optional: true + "@oxc-parser/binding-linux-s390x-gnu": + optional: true + "@oxc-parser/binding-linux-x64-gnu": + optional: true + "@oxc-parser/binding-linux-x64-musl": + optional: true + "@oxc-parser/binding-openharmony-arm64": + optional: true + "@oxc-parser/binding-wasm32-wasi": + optional: true + "@oxc-parser/binding-win32-arm64-msvc": + optional: true + "@oxc-parser/binding-win32-ia32-msvc": + optional: true + "@oxc-parser/binding-win32-x64-msvc": + optional: true + checksum: 10c0/12b717560645480f12954b2eaaabcf8043dfc7a8bc0105627ff11d7958d52a90eaf9f5cfb6af82f148d5e69ef7c57ac5a84f8834fc1edda695b2b09d6bb4e73d + languageName: node + linkType: hard + "oxfmt@npm:^0.33.0": version: 0.33.0 resolution: "oxfmt@npm:0.33.0" @@ -11091,10 +11254,10 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:2 || 3 || 4, picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 +"picomatch@npm:2 || 3 || 4, picomatch@npm:^4.0.2, picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 languageName: node linkType: hard @@ -12042,25 +12205,18 @@ __metadata: languageName: node linkType: hard -"react-intl@npm:^7.1.10": - version: 7.1.14 - resolution: "react-intl@npm:7.1.14" +"react-intl@npm:^10.0.0": + version: 10.1.1 + resolution: "react-intl@npm:10.1.1" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.6" - "@formatjs/icu-messageformat-parser": "npm:2.11.4" - "@formatjs/intl": "npm:3.1.8" - "@types/hoist-non-react-statics": "npm:^3.3.1" - "@types/react": "npm:16 || 17 || 18 || 19" - hoist-non-react-statics: "npm:^3.3.2" - intl-messageformat: "npm:10.7.18" - tslib: "npm:^2.8.0" + "@formatjs/ecma402-abstract": "npm:3.2.0" + "@formatjs/icu-messageformat-parser": "npm:3.5.3" + "@formatjs/intl": "npm:4.1.5" + intl-messageformat: "npm:11.2.0" peerDependencies: - react: 16 || 17 || 18 || 19 - typescript: ^5.6.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/b4361427ea05b4c9e7d87635a323854ca871710e01cd2a46b5da70b34b78a50661c04b2065258f3f49be134ca414c429c804bc34edc277784a9ffa0c04a30b04 + "@types/react": 19 + react: 19 + checksum: 10c0/97ac04e5813d22bb0f7cbc7332c41a683b61deddd9f1e2720c72536bc74abb23713b02602bf69c1fbd99ab1d087ff1b334a1ef89b2332c867b9030187d128dd9 languageName: node linkType: hard @@ -12145,13 +12301,6 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.18.0": - version: 0.18.0 - resolution: "react-refresh@npm:0.18.0" - checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 - languageName: node - linkType: hard - "react-router-dom@npm:^5.3.4": version: 5.3.4 resolution: "react-router-dom@npm:5.3.4" @@ -12267,19 +12416,6 @@ __metadata: languageName: node linkType: hard -"react-toggle@npm:^4.1.3": - version: 4.1.3 - resolution: "react-toggle@npm:4.1.3" - dependencies: - classnames: "npm:^2.2.5" - peerDependencies: - prop-types: ">= 15.3.0 < 19" - react: ">= 15.3.0 < 19" - react-dom: ">= 15.3.0 < 19" - checksum: 10c0/afae643981d6fb922d66830ec0e9c793e729d7a55e3974edf212965acc8dc51f0d098ae6e409461d3ff2f87fe027dc3556a1a746f8472ed3a79c8878bf338fee - languageName: node - linkType: hard - "react-transition-group@npm:^4.3.0": version: 4.4.5 resolution: "react-transition-group@npm:4.4.5" @@ -13974,12 +14110,12 @@ __metadata: linkType: hard "tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" + version: 0.2.16 + resolution: "tinyglobby@npm:0.2.16" dependencies: fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + picomatch: "npm:^4.0.4" + checksum: 10c0/f2e09fd93dd95c41e522113b686ff6f7c13020962f8698a864a257f3d7737599afc47722b7ab726e12f8a813f779906187911ff8ee6701ede65072671a7e934b languageName: node linkType: hard @@ -14142,7 +14278,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -14306,7 +14442,17 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.6.0, typescript@npm:~5.9.0": +"typescript@npm:^5.6 || 6, typescript@npm:~6.0.0": + version: 6.0.2 + resolution: "typescript@npm:6.0.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/4b860b0bf87cc0fee0f66d8ef2640b5a8a8a8c74d1129adb82e389e5f97124383823c47946bef8a73ede371461143a3aa8544399d2133c7b2e4f07e81860af7f + languageName: node + linkType: hard + +"typescript@npm:^5.6.0": version: 5.9.3 resolution: "typescript@npm:5.9.3" bin: @@ -14316,7 +14462,17 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.6.0#optional!builtin, typescript@patch:typescript@npm%3A~5.9.0#optional!builtin": +"typescript@patch:typescript@npm%3A^5.6 || 6#optional!builtin, typescript@patch:typescript@npm%3A~6.0.0#optional!builtin": + version: 6.0.2 + resolution: "typescript@patch:typescript@npm%3A6.0.2#optional!builtin::version=6.0.2&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/49f0b84fc6ca55653e77752b8a61beabc09ee3dae5d965c31596225aa6ef213c5727b1d2e895b900416dc603854ba0872ac4a812c2a4ed6793a601f9c675de02 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.6.0#optional!builtin": version: 5.9.3 resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: @@ -14352,10 +14508,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a languageName: node linkType: hard @@ -14373,15 +14529,6 @@ __metadata: languageName: node linkType: hard -"unicode-emoji-utils@npm:^1.2.0": - version: 1.2.0 - resolution: "unicode-emoji-utils@npm:1.2.0" - dependencies: - emoji-regex: "npm:10.3.0" - checksum: 10c0/224413cab5f915abbbbf3e6061878f3c1b67acf7c6ab1d4bf283f13d290677633d614a7fd58b7af8cec54dc3a4e4f51c01f4797caa23c7c83cdaa759fe6de9ce - languageName: node - linkType: hard - "unicode-match-property-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-match-property-ecmascript@npm:2.0.0" @@ -14466,6 +14613,17 @@ __metadata: languageName: node linkType: hard +"unplugin@npm:^3.0.0": + version: 3.0.0 + resolution: "unplugin@npm:3.0.0" + dependencies: + "@jridgewell/remapping": "npm:^2.3.5" + picomatch: "npm:^4.0.3" + webpack-virtual-modules: "npm:^0.6.2" + checksum: 10c0/9b3a9eb7c1cfaab677160b9659b008b4562e08360b6c715f31bdd7692738a75de91f217931032ec247979f71e83d4c9b908245cf47d984b26fb318b60b1d2d36 + languageName: node + linkType: hard + "unrs-resolver@npm:^1.7.11": version: 1.11.1 resolution: "unrs-resolver@npm:1.11.1" @@ -14640,12 +14798,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^13.0.0": - version: 13.0.0 - resolution: "uuid@npm:13.0.0" +"uuid@npm:^14.0.0": + version: 14.0.0 + resolution: "uuid@npm:14.0.0" bin: uuid: dist-node/bin/uuid - checksum: 10c0/950e4c18d57fef6c69675344f5700a08af21e26b9eff2bf2180427564297368c538ea11ac9fb2e6528b17fc3966a9fd2c5049361b0b63c7d654f3c550c9b3d67 + checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50 languageName: node linkType: hard @@ -14691,16 +14849,16 @@ __metadata: languageName: node linkType: hard -"vite-plugin-svgr@npm:^4.5.0": - version: 4.5.0 - resolution: "vite-plugin-svgr@npm:4.5.0" +"vite-plugin-svgr@npm:^5.0.0": + version: 5.2.0 + resolution: "vite-plugin-svgr@npm:5.2.0" dependencies: - "@rollup/pluginutils": "npm:^5.2.0" + "@rollup/pluginutils": "npm:^5.3.0" "@svgr/core": "npm:^8.1.0" "@svgr/plugin-jsx": "npm:^8.1.0" peerDependencies: - vite: ">=2.6.0" - checksum: 10c0/3e1959fec626bb4f5a8ec13ff15bc40ffbc1c0ff38149bebe3f37dc2d67ed1f276f129ff7983e06946cf712e19996affd9d6868aa7d20d8921d1fe4449109b55 + vite: ">=3.0.0" + checksum: 10c0/818ddea9a25839f9a5e3903f55e738b3de2f76c374148a637e61e31e6a3ada815a061d3e8010306a9f2701827d2f34d8fbc5db47bf1e74059050ad7a57c0f601 languageName: node linkType: hard