Merge pull request #2406 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes up to 38fe6ecd05
lolsob-rspec
Claire 2023-09-16 09:57:00 +02:00 committed by GitHub
commit 1f7643db6d
407 changed files with 8961 additions and 2439 deletions

View File

@ -4,6 +4,9 @@ on:
platforms: platforms:
required: true required: true
type: string type: string
cache:
type: boolean
default: true
use_native_arm64_builder: use_native_arm64_builder:
type: boolean type: boolean
push_to_images: push_to_images:
@ -24,7 +27,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v2 - uses: docker/setup-qemu-action@v2
if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder
@ -92,5 +95,5 @@ jobs:
push: ${{ inputs.push_to_images != '' }} push: ${{ inputs.push_to_images != '' }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha cache-from: ${{ inputs.cache && 'type=gha' || '' }}
cache-to: type=gha,mode=max cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }}

View File

@ -26,6 +26,7 @@ jobs:
with: with:
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false use_native_arm64_builder: false
cache: false
push_to_images: | push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon ghcr.io/${{ github.repository_owner }}/mastodon
version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }} version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }}

View File

@ -18,7 +18,7 @@ jobs:
steps: steps:
# Repository needs to be cloned so `git rev-parse` below works # Repository needs to be cloned so `git rev-parse` below works
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- id: version_vars - id: version_vars
run: | run: |
echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short HEAD) >> $GITHUB_OUTPUT echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short HEAD) >> $GITHUB_OUTPUT

View File

@ -16,6 +16,8 @@ jobs:
use_native_arm64_builder: false use_native_arm64_builder: false
push_to_images: | push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon ghcr.io/${{ github.repository_owner }}/mastodon
# Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
cache: false
# Only tag with latest when ran against the latest stable branch # Only tag with latest when ran against the latest stable branch
# This needs to be updated after each minor version release # This needs to be updated after each minor version release
flavor: | flavor: |

View File

@ -25,7 +25,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Install native Ruby dependencies - name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev run: sudo apt-get install -y libicu-dev libidn11-dev

View File

@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Install system dependencies - name: Install system dependencies
run: | run: |

View File

@ -27,7 +27,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL

View File

@ -14,7 +14,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Increase Git http.postBuffer - name: Increase Git http.postBuffer
# This is needed due to a bug in Ubuntu's cURL version? # This is needed due to a bug in Ubuntu's cURL version?

View File

@ -20,7 +20,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: crowdin action - name: crowdin action
uses: crowdin/github-action@v1 uses: crowdin/github-action@v1

View File

@ -33,7 +33,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -28,7 +28,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Install native Ruby dependencies - name: Install native Ruby dependencies
run: | run: |

View File

@ -37,7 +37,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -29,7 +29,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -29,7 +29,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -29,7 +29,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Install native Ruby dependencies - name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev run: sudo apt-get install -y libicu-dev libidn11-dev

View File

@ -31,7 +31,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -33,7 +33,7 @@ jobs:
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@ -70,7 +70,7 @@ jobs:
BUNDLE_RETRY: 3 BUNDLE_RETRY: 3
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Install native Ruby dependencies - name: Install native Ruby dependencies
run: | run: |

View File

@ -69,7 +69,7 @@ jobs:
BUNDLE_RETRY: 3 BUNDLE_RETRY: 3
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Install native Ruby dependencies - name: Install native Ruby dependencies
run: | run: |

View File

@ -32,7 +32,7 @@ jobs:
SECRET_KEY_BASE: precompile_placeholder SECRET_KEY_BASE: precompile_placeholder
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
@ -127,7 +127,7 @@ jobs:
- 3 - 3
- 4 - 4
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/download-artifact@v3 - uses: actions/download-artifact@v3
with: with:
@ -202,7 +202,7 @@ jobs:
- '.ruby-version' - '.ruby-version'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/download-artifact@v3 - uses: actions/download-artifact@v3
with: with:
@ -250,3 +250,116 @@ jobs:
with: with:
name: e2e-screenshots name: e2e-screenshots
path: tmp/screenshots/ path: tmp/screenshots/
test-search:
name: Testing search
runs-on: ubuntu-latest
needs:
- build
services:
postgres:
image: postgres:14-alpine
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7-alpine
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.13
env:
discovery.type: single-node
xpack.security.enabled: false
options: >-
--health-cmd "curl http://localhost:9200/_cluster/health"
--health-interval 10s
--health-timeout 5s
--health-retries 10
ports:
- 9200:9200
env:
DB_HOST: localhost
DB_USER: postgres
DB_PASS: postgres
DISABLE_SIMPLECOV: true
RAILS_ENV: test
BUNDLE_WITH: test
ES_ENABLED: true
ES_HOST: localhost
ES_PORT: 9200
strategy:
fail-fast: false
matrix:
ruby-version:
- '3.0'
- '3.1'
- '.ruby-version'
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
path: './public'
name: ${{ github.sha }}
- name: Update package index
run: sudo apt-get update
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Install additional system dependencies
run: sudo apt-get install -y ffmpeg imagemagick
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version}}
bundler-cache: true
- run: yarn --frozen-lockfile
- name: Load database schema
run: './bin/rails db:create db:schema:load db:seed'
- run: bundle exec rake spec:search
- name: Archive logs
uses: actions/upload-artifact@v3
if: failure()
with:
name: test-search-logs-${{ matrix.ruby-version }}
path: log/
- name: Archive test screenshots
uses: actions/upload-artifact@v3
if: failure()
with:
name: test-search-screenshots
path: tmp/screenshots/

2
.nvmrc
View File

@ -1 +1 @@
16.20 20.6

View File

@ -37,7 +37,7 @@ Layout/HashAlignment:
Layout/LeadingCommentSpace: Layout/LeadingCommentSpace:
Exclude: Exclude:
- 'config/application.rb' - 'config/application.rb'
- 'config/initializers/omniauth.rb' - 'config/initializers/3_omniauth.rb'
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. # Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
@ -86,7 +86,7 @@ Lint/UnusedBlockArgument:
Lint/UselessAssignment: Lint/UselessAssignment:
Exclude: Exclude:
- 'app/services/activitypub/process_status_update_service.rb' - 'app/services/activitypub/process_status_update_service.rb'
- 'config/initializers/omniauth.rb' - 'config/initializers/3_omniauth.rb'
- 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb' - 'db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb'
- 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb' - 'db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb'
- 'spec/controllers/api/v1/favourites_controller_spec.rb' - 'spec/controllers/api/v1/favourites_controller_spec.rb'
@ -576,11 +576,11 @@ Style/FetchEnvVar:
- 'config/environments/development.rb' - 'config/environments/development.rb'
- 'config/environments/production.rb' - 'config/environments/production.rb'
- 'config/initializers/2_limited_federation_mode.rb' - 'config/initializers/2_limited_federation_mode.rb'
- 'config/initializers/3_omniauth.rb'
- 'config/initializers/blacklists.rb' - 'config/initializers/blacklists.rb'
- 'config/initializers/cache_buster.rb' - 'config/initializers/cache_buster.rb'
- 'config/initializers/content_security_policy.rb' - 'config/initializers/content_security_policy.rb'
- 'config/initializers/devise.rb' - 'config/initializers/devise.rb'
- 'config/initializers/omniauth.rb'
- 'config/initializers/paperclip.rb' - 'config/initializers/paperclip.rb'
- 'config/initializers/vapid.rb' - 'config/initializers/vapid.rb'
- 'lib/mastodon/premailer_webpack_strategy.rb' - 'lib/mastodon/premailer_webpack_strategy.rb'
@ -814,7 +814,7 @@ Style/StringLiterals:
# AllowedMethods: define_method, mail, respond_to # AllowedMethods: define_method, mail, respond_to
Style/SymbolProc: Style/SymbolProc:
Exclude: Exclude:
- 'config/initializers/omniauth.rb' - 'config/initializers/3_omniauth.rb'
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, AllowSafeAssignment. # Configuration parameters: EnforcedStyle, AllowSafeAssignment.

View File

@ -8,7 +8,7 @@ The following changelog entries focus on changes visible to users, administrator
### Added ### Added
- **Add full-text search of opted-in public posts and rework search operators** ([Gargron](https://github.com/mastodon/mastodon/pull/26485), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26344), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26657), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26650), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26659), [Gargron](https://github.com/mastodon/mastodon/pull/26660), [Gargron](https://github.com/mastodon/mastodon/pull/26663), [Gargron](https://github.com/mastodon/mastodon/pull/26688), [Gargron](https://github.com/mastodon/mastodon/pull/26689), [Gargron](https://github.com/mastodon/mastodon/pull/26686), [Gargron](https://github.com/mastodon/mastodon/pull/26687), [Gargron](https://github.com/mastodon/mastodon/pull/26692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26697), [Gargron](https://github.com/mastodon/mastodon/pull/26699), [Gargron](https://github.com/mastodon/mastodon/pull/26701), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26710), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26739), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26754), [Gargron](https://github.com/mastodon/mastodon/pull/26662), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26755), [Gargron](https://github.com/mastodon/mastodon/pull/26781), [Gargron](https://github.com/mastodon/mastodon/pull/26782), [Gargron](https://github.com/mastodon/mastodon/pull/26760)) - **Add full-text search of opted-in public posts and rework search operators** ([Gargron](https://github.com/mastodon/mastodon/pull/26485), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26344), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26657), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26650), [jsgoldstein](https://github.com/mastodon/mastodon/pull/26659), [Gargron](https://github.com/mastodon/mastodon/pull/26660), [Gargron](https://github.com/mastodon/mastodon/pull/26663), [Gargron](https://github.com/mastodon/mastodon/pull/26688), [Gargron](https://github.com/mastodon/mastodon/pull/26689), [Gargron](https://github.com/mastodon/mastodon/pull/26686), [Gargron](https://github.com/mastodon/mastodon/pull/26687), [Gargron](https://github.com/mastodon/mastodon/pull/26692), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26697), [Gargron](https://github.com/mastodon/mastodon/pull/26699), [Gargron](https://github.com/mastodon/mastodon/pull/26701), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26710), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26739), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26754), [Gargron](https://github.com/mastodon/mastodon/pull/26662), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26755), [Gargron](https://github.com/mastodon/mastodon/pull/26781), [Gargron](https://github.com/mastodon/mastodon/pull/26782), [Gargron](https://github.com/mastodon/mastodon/pull/26760), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26756), [Gargron](https://github.com/mastodon/mastodon/pull/26784), [Gargron](https://github.com/mastodon/mastodon/pull/26807), [Gargron](https://github.com/mastodon/mastodon/pull/26835), [Gargron](https://github.com/mastodon/mastodon/pull/26847), [Gargron](https://github.com/mastodon/mastodon/pull/26834), [arbolitoloco1](https://github.com/mastodon/mastodon/pull/26893), [tribela](https://github.com/mastodon/mastodon/pull/26896))
This introduces a new `public_statuses` Elasticsearch index for public posts by users who have opted in to their posts being searchable (`toot#indexable` flag). This introduces a new `public_statuses` Elasticsearch index for public posts by users who have opted in to their posts being searchable (`toot#indexable` flag).
This also revisits the other indexes to provide more useful indexing, and adds new search operators such as `from:me`, `before:2022-11-01`, `after:2022-11-01`, `during:2022-11-01`, `language:fr`, `has:poll`, or `in:library` (for searching only in posts you have written or interacted with). This also revisits the other indexes to provide more useful indexing, and adds new search operators such as `from:me`, `before:2022-11-01`, `after:2022-11-01`, `during:2022-11-01`, `language:fr`, `has:poll`, or `in:library` (for searching only in posts you have written or interacted with).
Results are now ordered chronologically. Results are now ordered chronologically.
@ -24,7 +24,7 @@ The following changelog entries focus on changes visible to users, administrator
The `forward` parameter still needs to be set for `forward_to_domains` to be taken into account. The `forward` parameter still needs to be set for `forward_to_domains` to be taken into account.
The forwarded-to domains can only include that of the original author and people being replied to. The forwarded-to domains can only include that of the original author and people being replied to.
- **Add forwarding of reported replies to servers being replied to** ([Gargron](https://github.com/mastodon/mastodon/pull/25341), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26189)) - **Add forwarding of reported replies to servers being replied to** ([Gargron](https://github.com/mastodon/mastodon/pull/25341), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26189))
- Add direct link to the Single-Sign On provider if there is only one sign up method available ([CSDUMMI](https://github.com/mastodon/mastodon/pull/26083), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26368)) - Add `ONE_CLICK_SSO_LOGIN` environment variable to directly link to the Single-Sign On provider if there is only one sign up method available ([CSDUMMI](https://github.com/mastodon/mastodon/pull/26083), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26368), [CSDUMMI](https://github.com/mastodon/mastodon/pull/26857), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26901))
- **Add webhook templating** ([Gargron](https://github.com/mastodon/mastodon/pull/23289)) - **Add webhook templating** ([Gargron](https://github.com/mastodon/mastodon/pull/23289))
- **Add webhooks for local `status.created`, `status.updated`, `account.updated` and `report.updated`** ([VyrCossont](https://github.com/mastodon/mastodon/pull/24133), [VyrCossont](https://github.com/mastodon/mastodon/pull/24243), [VyrCossont](https://github.com/mastodon/mastodon/pull/24211)) - **Add webhooks for local `status.created`, `status.updated`, `account.updated` and `report.updated`** ([VyrCossont](https://github.com/mastodon/mastodon/pull/24133), [VyrCossont](https://github.com/mastodon/mastodon/pull/24243), [VyrCossont](https://github.com/mastodon/mastodon/pull/24211))
- **Add exclusive lists** ([dariusk](https://github.com/mastodon/mastodon/pull/22048), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25324)) - **Add exclusive lists** ([dariusk](https://github.com/mastodon/mastodon/pull/22048), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25324))
@ -36,9 +36,12 @@ The following changelog entries focus on changes visible to users, administrator
- **Add `S3_DISABLE_CHECKSUM_MODE` environment variable for compatibility with some S3-compatible providers** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26435)) - **Add `S3_DISABLE_CHECKSUM_MODE` environment variable for compatibility with some S3-compatible providers** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26435))
- **Add auto-refresh of accounts we get new messages/edits of** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26510)) - **Add auto-refresh of accounts we get new messages/edits of** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26510))
- **Add Elasticsearch cluster health check and indexes mismatch check to dashboard** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26448), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26605), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26658)) - **Add Elasticsearch cluster health check and indexes mismatch check to dashboard** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26448), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26605), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26658))
- Add admin API for managing tags ([rrgeorge](https://github.com/mastodon/mastodon/pull/26872))
- Add a link to hashtag timelines from the Trending hashtags moderation interface ([gunchleoc](https://github.com/mastodon/mastodon/pull/26724))
- Add timezone to datetimes in e-mails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26822))
- Add `authorized_fetch` server setting in addition to env var ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25798)) - Add `authorized_fetch` server setting in addition to env var ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25798))
- Add avatar image to webfinger responses ([tvler](https://github.com/mastodon/mastodon/pull/26558)) - Add avatar image to webfinger responses ([tvler](https://github.com/mastodon/mastodon/pull/26558))
- Add debug logging on signature verification failure ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26637)) - Add debug logging on signature verification failure ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26637), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26812))
- Add explicit error messages when DeepL quota is exceeded ([lutoma](https://github.com/mastodon/mastodon/pull/26704)) - Add explicit error messages when DeepL quota is exceeded ([lutoma](https://github.com/mastodon/mastodon/pull/26704))
- Add Elasticsearch/OpenSearch version to “Software” in admin dashboard ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26652)) - Add Elasticsearch/OpenSearch version to “Software” in admin dashboard ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26652))
- Add `data-nosnippet` attribute to remote posts and local posts with `noindex` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26648)) - Add `data-nosnippet` attribute to remote posts and local posts with `noindex` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26648))
@ -47,7 +50,6 @@ The following changelog entries focus on changes visible to users, administrator
- Add `DELETE /api/v1/profile/avatar` and `DELETE /api/v1/profile/header` to the REST API ([danielmbrasil](https://github.com/mastodon/mastodon/pull/25124), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26573)) - Add `DELETE /api/v1/profile/avatar` and `DELETE /api/v1/profile/header` to the REST API ([danielmbrasil](https://github.com/mastodon/mastodon/pull/25124), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26573))
- Add `ES_PRESET` option to customize numbers of shards and replicas ([Gargron](https://github.com/mastodon/mastodon/pull/26483), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26489)) - Add `ES_PRESET` option to customize numbers of shards and replicas ([Gargron](https://github.com/mastodon/mastodon/pull/26483), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26489))
This can have a value of `single_node_cluster` (default), `small_cluster` (uses one replica) or `large_cluster` (uses one replica and a higher number of shards). This can have a value of `single_node_cluster` (default), `small_cluster` (uses one replica) or `large_cluster` (uses one replica and a higher number of shards).
- Add missing `instances` option to `tootctl search deploy` ([tribela](https://github.com/mastodon/mastodon/pull/26461))
- Add `CACHE_BUSTER_HTTP_METHOD` environment variable ([renchap](https://github.com/mastodon/mastodon/pull/26528), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26542)) - Add `CACHE_BUSTER_HTTP_METHOD` environment variable ([renchap](https://github.com/mastodon/mastodon/pull/26528), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26542))
- Add support for `DB_PASS` when using `DATABASE_URL` ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/26295)) - Add support for `DB_PASS` when using `DATABASE_URL` ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/26295))
- Add `GET /api/v1/instance/languages` to REST API ([danielmbrasil](https://github.com/mastodon/mastodon/pull/24443)) - Add `GET /api/v1/instance/languages` to REST API ([danielmbrasil](https://github.com/mastodon/mastodon/pull/24443))
@ -64,7 +66,7 @@ The following changelog entries focus on changes visible to users, administrator
- Add users index on `unconfirmed_email` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25672), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25702)) - Add users index on `unconfirmed_email` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25672), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25702))
- Add superapp index on `oauth_applications` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25670)) - Add superapp index on `oauth_applications` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25670))
- Add index to backups on `user_id` column ([mjankowski](https://github.com/mastodon/mastodon/pull/25647)) - Add index to backups on `user_id` column ([mjankowski](https://github.com/mastodon/mastodon/pull/25647))
- Add onboarding prompt when home feed too slow in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/25267), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25556), [Gargron](https://github.com/mastodon/mastodon/pull/25579), [renchap](https://github.com/mastodon/mastodon/pull/25580), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25581), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25917)) - Add onboarding prompt when home feed too slow in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/25267), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25556), [Gargron](https://github.com/mastodon/mastodon/pull/25579), [renchap](https://github.com/mastodon/mastodon/pull/25580), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25581), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25917), [Gargron](https://github.com/mastodon/mastodon/pull/26829))
- Add `POST /api/v1/conversations/:id/unread` API endpoint to mark a conversation as unread ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25509)) - Add `POST /api/v1/conversations/:id/unread` API endpoint to mark a conversation as unread ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25509))
- Add `translate="no"` to outgoing mentions and links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25524)) - Add `translate="no"` to outgoing mentions and links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/25524))
- Add unsubscribe link and headers to e-mails ([Gargron](https://github.com/mastodon/mastodon/pull/25378), [c960657](https://github.com/mastodon/mastodon/pull/26085)) - Add unsubscribe link and headers to e-mails ([Gargron](https://github.com/mastodon/mastodon/pull/25378), [c960657](https://github.com/mastodon/mastodon/pull/26085))
@ -109,7 +111,7 @@ The following changelog entries focus on changes visible to users, administrator
- **Change hashtags to be displayed separately when they are the last line of a post** ([renchap](https://github.com/mastodon/mastodon/pull/26499), [renchap](https://github.com/mastodon/mastodon/pull/26614), [renchap](https://github.com/mastodon/mastodon/pull/26615)) - **Change hashtags to be displayed separately when they are the last line of a post** ([renchap](https://github.com/mastodon/mastodon/pull/26499), [renchap](https://github.com/mastodon/mastodon/pull/26614), [renchap](https://github.com/mastodon/mastodon/pull/26615))
- **Change reblogs to be excluded from "Posts and replies" tab in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/26302)) - **Change reblogs to be excluded from "Posts and replies" tab in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/26302))
- **Change interaction modal in web interface** ([Gargron, ClearlyClaire](https://github.com/mastodon/mastodon/pull/26075), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26269), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26268), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26267), [mgmn](https://github.com/mastodon/mastodon/pull/26459), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26593)) - **Change interaction modal in web interface** ([Gargron, ClearlyClaire](https://github.com/mastodon/mastodon/pull/26075), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26269), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26268), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26267), [mgmn](https://github.com/mastodon/mastodon/pull/26459), [tribela](https://github.com/mastodon/mastodon/pull/26461), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26593), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26795))
- **Change design of link previews in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/26136), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26151), [Gargron](https://github.com/mastodon/mastodon/pull/26153), [Gargron](https://github.com/mastodon/mastodon/pull/26250), [Gargron](https://github.com/mastodon/mastodon/pull/26287), [Gargron](https://github.com/mastodon/mastodon/pull/26286), [c960657](https://github.com/mastodon/mastodon/pull/26184)) - **Change design of link previews in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/26136), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26151), [Gargron](https://github.com/mastodon/mastodon/pull/26153), [Gargron](https://github.com/mastodon/mastodon/pull/26250), [Gargron](https://github.com/mastodon/mastodon/pull/26287), [Gargron](https://github.com/mastodon/mastodon/pull/26286), [c960657](https://github.com/mastodon/mastodon/pull/26184))
- **Change "direct message" nomenclature to "private mention" in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/24248)) - **Change "direct message" nomenclature to "private mention" in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/24248))
- **Change translation feature to cover Content Warnings, poll options and media descriptions** ([c960657](https://github.com/mastodon/mastodon/pull/24175), [S-H-GAMELINKS](https://github.com/mastodon/mastodon/pull/25251), [c960657](https://github.com/mastodon/mastodon/pull/26168), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26452)) - **Change translation feature to cover Content Warnings, poll options and media descriptions** ([c960657](https://github.com/mastodon/mastodon/pull/24175), [S-H-GAMELINKS](https://github.com/mastodon/mastodon/pull/25251), [c960657](https://github.com/mastodon/mastodon/pull/26168), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26452))
@ -122,9 +124,10 @@ The following changelog entries focus on changes visible to users, administrator
This deprecates `statsd` support and disables the sidekiq integration unless `STATSD_SIDEKIQ` is set to `true`. This deprecates `statsd` support and disables the sidekiq integration unless `STATSD_SIDEKIQ` is set to `true`.
This is because the `nsa` gem is unmaintained, and its sidekiq integration is known to add very significant overhead. This is because the `nsa` gem is unmaintained, and its sidekiq integration is known to add very significant overhead.
Later versions of Mastodon will have other ways to get the same metrics. Later versions of Mastodon will have other ways to get the same metrics.
- **Change replica support to native Rails adapter** ([krainboltgreene](https://github.com/mastodon/mastodon/pull/25693), [Gargron](https://github.com/mastodon/mastodon/pull/25849), [Gargron](https://github.com/mastodon/mastodon/pull/25874), [Gargron](https://github.com/mastodon/mastodon/pull/25851), [Gargron](https://github.com/mastodon/mastodon/pull/25977), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26074), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26386)) - **Change replica support to native Rails adapter** ([krainboltgreene](https://github.com/mastodon/mastodon/pull/25693), [Gargron](https://github.com/mastodon/mastodon/pull/25849), [Gargron](https://github.com/mastodon/mastodon/pull/25874), [Gargron](https://github.com/mastodon/mastodon/pull/25851), [Gargron](https://github.com/mastodon/mastodon/pull/25977), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26074), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26386), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26856))
This is a breaking change, dropping `makara` support, and requiring you to update your database configuration if you are using replicas. This is a breaking change, dropping `makara` support, and requiring you to update your database configuration if you are using replicas.
To tell Mastodon to use a read replica, you can either set the `REPLICA_DB_NAME` environment variable (along with `REPLICA_DB_USER`, `REPLICA_DB_PASS`, `REPLICA_DB_HOST`, and `REPLICA_DB_PORT`, if they differ from the primary database), or the `REPLICA_DATABASE_URL` environment variable if your configuration is based on `DATABASE_URL`. To tell Mastodon to use a read replica, you can either set the `REPLICA_DB_NAME` environment variable (along with `REPLICA_DB_USER`, `REPLICA_DB_PASS`, `REPLICA_DB_HOST`, and `REPLICA_DB_PORT`, if they differ from the primary database), or the `REPLICA_DATABASE_URL` environment variable if your configuration is based on `DATABASE_URL`.
- Change DCT method used for JPEG encoding to float ([electroCutie](https://github.com/mastodon/mastodon/pull/26675))
- Change from `node-redis` to `ioredis` for streaming ([gmemstr](https://github.com/mastodon/mastodon/pull/26581)) - Change from `node-redis` to `ioredis` for streaming ([gmemstr](https://github.com/mastodon/mastodon/pull/26581))
- Change private statuses index to index without crutches ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26713)) - Change private statuses index to index without crutches ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26713))
- Change video compression parameters ([Gargron](https://github.com/mastodon/mastodon/pull/26631), [Gargron](https://github.com/mastodon/mastodon/pull/26745), [Gargron](https://github.com/mastodon/mastodon/pull/26766)) - Change video compression parameters ([Gargron](https://github.com/mastodon/mastodon/pull/26631), [Gargron](https://github.com/mastodon/mastodon/pull/26745), [Gargron](https://github.com/mastodon/mastodon/pull/26766))
@ -161,7 +164,7 @@ The following changelog entries focus on changes visible to users, administrator
- Change vacuum scheduler to also delete expired tokens and unused application records ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24868), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24871)) - Change vacuum scheduler to also delete expired tokens and unused application records ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24868), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24871))
- Change "Sign in" to "Login" ([Gargron](https://github.com/mastodon/mastodon/pull/24942)) - Change "Sign in" to "Login" ([Gargron](https://github.com/mastodon/mastodon/pull/24942))
- Change domain suspensions to also be checked before trying to fetch unknown remote resources ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24535)) - Change domain suspensions to also be checked before trying to fetch unknown remote resources ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24535))
- Change media components to use aspect-ratio rather than compute height themselves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24686), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24943)) - Change media components to use aspect-ratio rather than compute height themselves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24686), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24943), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26801))
- Change logo version in header based on screen size in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24707)) - Change logo version in header based on screen size in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24707))
- Change label from "For you" to "People" on explore screen in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24706)) - Change label from "For you" to "People" on explore screen in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24706))
- Change logged-out WebUI HTML pages to be cached for a few seconds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24708)) - Change logged-out WebUI HTML pages to be cached for a few seconds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24708))
@ -172,7 +175,7 @@ The following changelog entries focus on changes visible to users, administrator
- Change account search in moderation interface to allow searching by username including the leading `@` ([HeitorMC](https://github.com/mastodon/mastodon/pull/24242)) - Change account search in moderation interface to allow searching by username including the leading `@` ([HeitorMC](https://github.com/mastodon/mastodon/pull/24242))
- Change all components to use the same error page in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24512)) - Change all components to use the same error page in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24512))
- Change search pop-out in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24305)) - Change search pop-out in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24305))
- Change user settings to be stored in a more optimal way ([Gargron](https://github.com/mastodon/mastodon/pull/23630), [c960657](https://github.com/mastodon/mastodon/pull/24321), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24453), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24460), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24558), [Gargron](https://github.com/mastodon/mastodon/pull/24761), [Gargron](https://github.com/mastodon/mastodon/pull/24783), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25508), [jsgoldstein](https://github.com/mastodon/mastodon/pull/25340)) - Change user settings to be stored in a more optimal way ([Gargron](https://github.com/mastodon/mastodon/pull/23630), [c960657](https://github.com/mastodon/mastodon/pull/24321), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24453), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24460), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24558), [Gargron](https://github.com/mastodon/mastodon/pull/24761), [Gargron](https://github.com/mastodon/mastodon/pull/24783), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25508), [jsgoldstein](https://github.com/mastodon/mastodon/pull/25340), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26884))
- Change media upload limits and remove client-side resizing ([Gargron](https://github.com/mastodon/mastodon/pull/23726)) - Change media upload limits and remove client-side resizing ([Gargron](https://github.com/mastodon/mastodon/pull/23726))
- Change design of account rows in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24247), [Gargron](https://github.com/mastodon/mastodon/pull/24343), [Gargron](https://github.com/mastodon/mastodon/pull/24956), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25131)) - Change design of account rows in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/24247), [Gargron](https://github.com/mastodon/mastodon/pull/24343), [Gargron](https://github.com/mastodon/mastodon/pull/24956), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/25131))
- Change log-out to use Single Logout when using external log-in through OIDC ([CSDUMMI](https://github.com/mastodon/mastodon/pull/24020)) - Change log-out to use Single Logout when using external log-in through OIDC ([CSDUMMI](https://github.com/mastodon/mastodon/pull/24020))
@ -195,6 +198,7 @@ The following changelog entries focus on changes visible to users, administrator
- **Remove support for Ruby 2.7** ([nschonni](https://github.com/mastodon/mastodon/pull/24237)) - **Remove support for Ruby 2.7** ([nschonni](https://github.com/mastodon/mastodon/pull/24237))
- **Remove clustering from streaming API** ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/24655)) - **Remove clustering from streaming API** ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/24655))
- **Remove anonymous access to the streaming API** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23989)) - **Remove anonymous access to the streaming API** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23989))
- Remove obfuscation of reply count in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26768))
- Remove `kmr` from language selection, as it was a duplicate for `ku` ([gunchleoc](https://github.com/mastodon/mastodon/pull/26014), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26787)) - Remove `kmr` from language selection, as it was a duplicate for `ku` ([gunchleoc](https://github.com/mastodon/mastodon/pull/26014), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26787))
- Remove 16:9 cropping from web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26132)) - Remove 16:9 cropping from web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26132))
- Remove back button from bookmarks, favourites and lists screens in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26126)) - Remove back button from bookmarks, favourites and lists screens in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26126))
@ -211,6 +215,14 @@ The following changelog entries focus on changes visible to users, administrator
- **Fix broken links in account gallery** ([c960657](https://github.com/mastodon/mastodon/pull/24218)) - **Fix broken links in account gallery** ([c960657](https://github.com/mastodon/mastodon/pull/24218))
- **Fix blocking subdomains of an already-blocked domain** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26392)) - **Fix blocking subdomains of an already-blocked domain** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26392))
- **Fix migration handler not updating lists** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24808)) - **Fix migration handler not updating lists** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24808))
- Fix paragraph margins resulting in irregular read-more cut-off in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26828))
- Fix notification permissions being requested immediately after login ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26472))
- Fix performances of profile directory ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26840), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26842))
- Fix mute button and volume slider feeling disconnected in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/26827), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/26860))
- Fix “Scoped order is ignored, it's forced to be batch order.” warnings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26793))
- Fix blocked domain appearing in account feeds ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26823))
- Fix moderator rights inconsistencies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26729))
- Fix crash when encountering invalid URL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26814))
- Fix invalid `Content-Type` header for WebP images ([c960657](https://github.com/mastodon/mastodon/pull/26773)) - Fix invalid `Content-Type` header for WebP images ([c960657](https://github.com/mastodon/mastodon/pull/26773))
- Fix minor inefficiencies in `tootctl search deploy` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26721)) - Fix minor inefficiencies in `tootctl search deploy` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26721))
- Fix filter form in profiles directory overflowing instead of wrapping ([arbolitoloco1](https://github.com/mastodon/mastodon/pull/26682)) - Fix filter form in profiles directory overflowing instead of wrapping ([arbolitoloco1](https://github.com/mastodon/mastodon/pull/26682))

View File

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1.4 # syntax=docker/dockerfile:1.4
# This needs to be bookworm-slim because the Ruby image is built on bookworm-slim # This needs to be bookworm-slim because the Ruby image is built on bookworm-slim
ARG NODE_VERSION="16.20-bookworm-slim" ARG NODE_VERSION="20.6-bookworm-slim"
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim as ruby FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim as ruby
FROM node:${NODE_VERSION} as build FROM node:${NODE_VERSION} as build
@ -17,6 +17,7 @@ COPY Gemfile* package.json yarn.lock /opt/mastodon/
# hadolint ignore=DL3008 # hadolint ignore=DL3008
RUN apt-get update && \ RUN apt-get update && \
apt-get -yq dist-upgrade && \
apt-get install -y --no-install-recommends build-essential \ apt-get install -y --no-install-recommends build-essential \
git \ git \
libicu-dev \ libicu-dev \

View File

@ -27,4 +27,5 @@ More information on HTTP Signatures, as well as examples, can be found here: htt
- Linked-Data Signatures: https://docs.joinmastodon.org/spec/security/#ld - Linked-Data Signatures: https://docs.joinmastodon.org/spec/security/#ld
- Bearcaps: https://docs.joinmastodon.org/spec/bearcaps/ - Bearcaps: https://docs.joinmastodon.org/spec/bearcaps/
- Followers collection synchronization: https://git.activitypub.dev/ActivityPubDev/Fediverse-Enhancement-Proposals/src/branch/main/feps/fep-8fcf.md - Followers collection synchronization: https://codeberg.org/fediverse/fep/src/branch/main/fep/8fcf/fep-8fcf.md
- Search indexing consent for actors: https://codeberg.org/fediverse/fep/src/branch/main/fep/5feb/fep-5feb.md

View File

@ -39,47 +39,47 @@ GIT
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actioncable (7.0.7.2) actioncable (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
nio4r (~> 2.0) nio4r (~> 2.0)
websocket-driver (>= 0.6.1) websocket-driver (>= 0.6.1)
actionmailbox (7.0.7.2) actionmailbox (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
activejob (= 7.0.7.2) activejob (= 7.0.8)
activerecord (= 7.0.7.2) activerecord (= 7.0.8)
activestorage (= 7.0.7.2) activestorage (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
mail (>= 2.7.1) mail (>= 2.7.1)
net-imap net-imap
net-pop net-pop
net-smtp net-smtp
actionmailer (7.0.7.2) actionmailer (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
actionview (= 7.0.7.2) actionview (= 7.0.8)
activejob (= 7.0.7.2) activejob (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
net-imap net-imap
net-pop net-pop
net-smtp net-smtp
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
actionpack (7.0.7.2) actionpack (7.0.8)
actionview (= 7.0.7.2) actionview (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
rack (~> 2.0, >= 2.2.4) rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.7.2) actiontext (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
activerecord (= 7.0.7.2) activerecord (= 7.0.8)
activestorage (= 7.0.7.2) activestorage (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
globalid (>= 0.6.0) globalid (>= 0.6.0)
nokogiri (>= 1.8.5) nokogiri (>= 1.8.5)
actionview (7.0.7.2) actionview (7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
builder (~> 3.1) builder (~> 3.1)
erubi (~> 1.4) erubi (~> 1.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
@ -89,22 +89,22 @@ GEM
activemodel (>= 4.1, < 7.1) activemodel (>= 4.1, < 7.1)
case_transform (>= 0.2) case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3) jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (7.0.7.2) activejob (7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
globalid (>= 0.3.6) globalid (>= 0.3.6)
activemodel (7.0.7.2) activemodel (7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
activerecord (7.0.7.2) activerecord (7.0.8)
activemodel (= 7.0.7.2) activemodel (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
activestorage (7.0.7.2) activestorage (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
activejob (= 7.0.7.2) activejob (= 7.0.8)
activerecord (= 7.0.7.2) activerecord (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
marcel (~> 1.0) marcel (~> 1.0)
mini_mime (>= 1.1.0) mini_mime (>= 1.1.0)
activesupport (7.0.7.2) activesupport (7.0.8)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2) i18n (>= 1.6, < 2)
minitest (>= 5.1) minitest (>= 5.1)
@ -409,7 +409,7 @@ GEM
activerecord activerecord
kaminari-core (= 1.2.2) kaminari-core (= 1.2.2)
kaminari-core (1.2.2) kaminari-core (1.2.2)
kt-paperclip (7.2.0) kt-paperclip (7.2.1)
activemodel (>= 4.2.0) activemodel (>= 4.2.0)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
marcel (~> 1.0.1) marcel (~> 1.0.1)
@ -520,7 +520,7 @@ GEM
pastel (0.8.0) pastel (0.8.0)
tty-color (~> 0.5) tty-color (~> 0.5)
pg (1.5.4) pg (1.5.4)
pghero (3.3.3) pghero (3.3.4)
activerecord (>= 6) activerecord (>= 6)
posix-spawn (0.3.15) posix-spawn (0.3.15)
premailer (1.21.0) premailer (1.21.0)
@ -556,20 +556,20 @@ GEM
rack rack
rack-test (2.1.0) rack-test (2.1.0)
rack (>= 1.3) rack (>= 1.3)
rails (7.0.7.2) rails (7.0.8)
actioncable (= 7.0.7.2) actioncable (= 7.0.8)
actionmailbox (= 7.0.7.2) actionmailbox (= 7.0.8)
actionmailer (= 7.0.7.2) actionmailer (= 7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
actiontext (= 7.0.7.2) actiontext (= 7.0.8)
actionview (= 7.0.7.2) actionview (= 7.0.8)
activejob (= 7.0.7.2) activejob (= 7.0.8)
activemodel (= 7.0.7.2) activemodel (= 7.0.8)
activerecord (= 7.0.7.2) activerecord (= 7.0.8)
activestorage (= 7.0.7.2) activestorage (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
bundler (>= 1.15.0) bundler (>= 1.15.0)
railties (= 7.0.7.2) railties (= 7.0.8)
rails-controller-testing (1.0.5) rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1) actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1)
@ -584,9 +584,9 @@ GEM
rails-i18n (7.0.7) rails-i18n (7.0.7)
i18n (>= 0.7, < 2) i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8) railties (>= 6.0.0, < 8)
railties (7.0.7.2) railties (7.0.8)
actionpack (= 7.0.7.2) actionpack (= 7.0.8)
activesupport (= 7.0.7.2) activesupport (= 7.0.8)
method_source method_source
rake (>= 12.2) rake (>= 12.2)
thor (~> 1.0) thor (~> 1.0)
@ -640,7 +640,7 @@ GEM
sidekiq (>= 5, < 8) sidekiq (>= 5, < 8)
rspec-support (3.12.1) rspec-support (3.12.1)
rspec_chunked (0.6) rspec_chunked (0.6)
rubocop (1.56.2) rubocop (1.56.3)
base64 (~> 0.1.1) base64 (~> 0.1.1)
json (~> 2.3) json (~> 2.3)
language_server-protocol (>= 3.17.0) language_server-protocol (>= 3.17.0)
@ -745,7 +745,7 @@ GEM
unicode-display_width (>= 1.1.1, < 3) unicode-display_width (>= 1.1.1, < 3)
terrapin (0.6.0) terrapin (0.6.0)
climate_control (>= 0.0.3, < 1.0) climate_control (>= 0.0.3, < 1.0)
test-prof (1.2.2) test-prof (1.2.3)
thor (1.2.2) thor (1.2.2)
tilt (2.2.0) tilt (2.2.0)
timeout (0.4.0) timeout (0.4.0)

View File

@ -14,8 +14,8 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
## Supported Versions ## Supported Versions
| Version | Supported | | Version | Supported |
| ------- | --------- | | ------- | ---------------- |
| 4.1.x | Yes | | 4.1.x | Yes |
| 4.0.x | Yes | | 4.0.x | Until 2023-10-31 |
| 3.5.x | Yes | | 3.5.x | Until 2023-12-31 |
| < 3.5 | No | | < 3.5 | No |

3
Vagrantfile vendored
View File

@ -76,7 +76,8 @@ path.logs: /var/log/elasticsearch
network.host: 0.0.0.0 network.host: 0.0.0.0
http.port: 9200 http.port: 9200
discovery.seed_hosts: ["localhost"] discovery.seed_hosts: ["localhost"]
cluster.initial_master_nodes: ["node-1"]' > /etc/elasticsearch/elasticsearch.yml cluster.initial_master_nodes: ["node-1"]
xpack.security.enabled: false' > /etc/elasticsearch/elasticsearch.yml
sudo systemctl restart elasticsearch sudo systemctl restart elasticsearch

View File

@ -0,0 +1,74 @@
# frozen_string_literal: true
class Api::V1::Admin::TagsController < Api::BaseController
include Authorization
before_action -> { authorize_if_got_token! :'admin:read' }, only: [:index, :show]
before_action -> { authorize_if_got_token! :'admin:write' }, only: :update
before_action :set_tags, only: :index
before_action :set_tag, except: :index
after_action :insert_pagination_headers, only: :index
after_action :verify_authorized
LIMIT = 100
PAGINATION_PARAMS = %i(limit).freeze
def index
authorize :tag, :index?
render json: @tags, each_serializer: REST::Admin::TagSerializer
end
def show
authorize @tag, :show?
render json: @tag, serializer: REST::Admin::TagSerializer
end
def update
authorize @tag, :update?
@tag.update!(tag_params.merge(reviewed_at: Time.now.utc))
render json: @tag, serializer: REST::Admin::TagSerializer
end
private
def set_tag
@tag = Tag.find(params[:id])
end
def set_tags
@tags = Tag.all.to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
end
def tag_params
params.permit(:display_name, :trendable, :usable, :listable)
end
def insert_pagination_headers
set_pagination_headers(next_path, prev_path)
end
def next_path
api_v1_admin_tags_url(pagination_params(max_id: pagination_max_id)) if records_continue?
end
def prev_path
api_v1_admin_tags_url(pagination_params(min_id: pagination_since_id)) unless @tags.empty?
end
def pagination_max_id
@tags.last.id
end
def pagination_since_id
@tags.first.id
end
def records_continue?
@tags.size == limit_param(LIMIT)
end
def pagination_params(core_params)
params.slice(*PAGINATION_PARAMS).permit(*PAGINATION_PARAMS).merge(core_params)
end
end

View File

@ -16,8 +16,10 @@ class Api::V1::DirectoriesController < Api::BaseController
end end
def set_accounts def set_accounts
with_read_replica do
@accounts = accounts_scope.offset(params[:offset]).limit(limit_param(DEFAULT_ACCOUNTS_LIMIT)) @accounts = accounts_scope.offset(params[:offset]).limit(limit_param(DEFAULT_ACCOUNTS_LIMIT))
end end
end
def accounts_scope def accounts_scope
Account.discoverable.tap do |scope| Account.discoverable.tap do |scope|

View File

@ -41,5 +41,7 @@ class Api::V1::Peers::SearchController < Api::BaseController
domain = TagManager.instance.normalize_domain(domain) domain = TagManager.instance.normalize_domain(domain)
@domains = Instance.searchable.where(Instance.arel_table[:domain].matches("#{Instance.sanitize_sql_like(domain)}%", false, true)).limit(10).pluck(:domain) @domains = Instance.searchable.where(Instance.arel_table[:domain].matches("#{Instance.sanitize_sql_like(domain)}%", false, true)).limit(10).pluck(:domain)
end end
rescue Addressable::URI::InvalidURIError
@domains = []
end end
end end

View File

@ -119,7 +119,7 @@ module SignatureVerification
private private
def fail_with!(message, **options) def fail_with!(message, **options)
Rails.logger.warn { "Signature verification failed: #{message}" } Rails.logger.debug { "Signature verification failed: #{message}" }
@signature_verification_failure_reason = { error: message }.merge(options) @signature_verification_failure_reason = { error: message }.merge(options)
@signed_request_actor = nil @signed_request_actor = nil

View File

@ -12,7 +12,7 @@ module WebAppControllerConcern
end end
def skip_csrf_meta_tags? def skip_csrf_meta_tags?
!(ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil? !(ENV['ONE_CLICK_SSO_LOGIN'] == 'true' && ENV['OMNIAUTH_ONLY'] == 'true' && Devise.omniauth_providers.length == 1) && current_user.nil?
end end
def set_app_body_class def set_app_body_class

View File

@ -140,7 +140,9 @@ const fromAcct = (acct: string) => {
}; };
const fetchInteractionURL = (uri_or_domain: string) => { const fetchInteractionURL = (uri_or_domain: string) => {
if (/^https?:\/\//.test(uri_or_domain)) { if (uri_or_domain === '') {
fetchInteractionURLFailure();
} else if (/^https?:\/\//.test(uri_or_domain)) {
fromURL(uri_or_domain); fromURL(uri_or_domain);
} else if (uri_or_domain.includes('@')) { } else if (uri_or_domain.includes('@')) {
fromAcct(uri_or_domain); fromAcct(uri_or_domain);

View File

@ -18,6 +18,7 @@ import {
importFetchedStatuses, importFetchedStatuses,
} from './importer'; } from './importer';
import { submitMarkers } from './markers'; import { submitMarkers } from './markers';
import { register as registerPushNotifications } from './push_notifications';
import { saveSettings } from './settings'; import { saveSettings } from './settings';
@ -384,6 +385,10 @@ export function requestBrowserPermission(callback = noOp) {
requestNotificationPermission((permission) => { requestNotificationPermission((permission) => {
dispatch(setBrowserPermission(permission)); dispatch(setBrowserPermission(permission));
callback(permission); callback(permission);
if (permission === 'granted') {
dispatch(registerPushNotifications());
}
}); });
}; };
} }

View File

@ -1,3 +1,7 @@
import { fromJS } from 'immutable';
import { searchHistory } from 'flavours/glitch/settings';
import api from '../api'; import api from '../api';
import { fetchRelationships } from './accounts'; import { fetchRelationships } from './accounts';
@ -15,8 +19,7 @@ export const SEARCH_EXPAND_REQUEST = 'SEARCH_EXPAND_REQUEST';
export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS'; export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS';
export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL'; export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL';
export const SEARCH_RESULT_CLICK = 'SEARCH_RESULT_CLICK'; export const SEARCH_HISTORY_UPDATE = 'SEARCH_HISTORY_UPDATE';
export const SEARCH_RESULT_FORGET = 'SEARCH_RESULT_FORGET';
export function changeSearch(value) { export function changeSearch(value) {
return { return {
@ -37,17 +40,17 @@ export function submitSearch(type) {
const signedIn = !!getState().getIn(['meta', 'me']); const signedIn = !!getState().getIn(['meta', 'me']);
if (value.length === 0) { if (value.length === 0) {
dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '')); dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '', type));
return; return;
} }
dispatch(fetchSearchRequest()); dispatch(fetchSearchRequest(type));
api(getState).get('/api/v2/search', { api(getState).get('/api/v2/search', {
params: { params: {
q: value, q: value,
resolve: signedIn, resolve: signedIn,
limit: 10, limit: 11,
type, type,
}, },
}).then(response => { }).then(response => {
@ -59,7 +62,7 @@ export function submitSearch(type) {
dispatch(importFetchedStatuses(response.data.statuses)); dispatch(importFetchedStatuses(response.data.statuses));
} }
dispatch(fetchSearchSuccess(response.data, value)); dispatch(fetchSearchSuccess(response.data, value, type));
dispatch(fetchRelationships(response.data.accounts.map(item => item.id))); dispatch(fetchRelationships(response.data.accounts.map(item => item.id)));
}).catch(error => { }).catch(error => {
dispatch(fetchSearchFail(error)); dispatch(fetchSearchFail(error));
@ -67,16 +70,18 @@ export function submitSearch(type) {
}; };
} }
export function fetchSearchRequest() { export function fetchSearchRequest(searchType) {
return { return {
type: SEARCH_FETCH_REQUEST, type: SEARCH_FETCH_REQUEST,
searchType,
}; };
} }
export function fetchSearchSuccess(results, searchTerm) { export function fetchSearchSuccess(results, searchTerm, searchType) {
return { return {
type: SEARCH_FETCH_SUCCESS, type: SEARCH_FETCH_SUCCESS,
results, results,
searchType,
searchTerm, searchTerm,
}; };
} }
@ -90,15 +95,16 @@ export function fetchSearchFail(error) {
export const expandSearch = type => (dispatch, getState) => { export const expandSearch = type => (dispatch, getState) => {
const value = getState().getIn(['search', 'value']); const value = getState().getIn(['search', 'value']);
const offset = getState().getIn(['search', 'results', type]).size; const offset = getState().getIn(['search', 'results', type]).size - 1;
dispatch(expandSearchRequest()); dispatch(expandSearchRequest(type));
api(getState).get('/api/v2/search', { api(getState).get('/api/v2/search', {
params: { params: {
q: value, q: value,
type, type,
offset, offset,
limit: 11,
}, },
}).then(({ data }) => { }).then(({ data }) => {
if (data.accounts) { if (data.accounts) {
@ -116,8 +122,9 @@ export const expandSearch = type => (dispatch, getState) => {
}); });
}; };
export const expandSearchRequest = () => ({ export const expandSearchRequest = (searchType) => ({
type: SEARCH_EXPAND_REQUEST, type: SEARCH_EXPAND_REQUEST,
searchType,
}); });
export const expandSearchSuccess = (results, searchTerm, searchType) => ({ export const expandSearchSuccess = (results, searchTerm, searchType) => ({
@ -161,16 +168,34 @@ export const openURL = routerHistory => (dispatch, getState) => {
}); });
}; };
export const clickSearchResult = (q, type) => ({ export const clickSearchResult = (q, type) => (dispatch, getState) => {
type: SEARCH_RESULT_CLICK, const previous = getState().getIn(['search', 'recent']);
const me = getState().getIn(['meta', 'me']);
const current = previous.add(fromJS({ type, q })).takeLast(4);
result: { searchHistory.set(me, current.toJS());
type, dispatch(updateSearchHistory(current));
q, };
},
export const forgetSearchResult = q => (dispatch, getState) => {
const previous = getState().getIn(['search', 'recent']);
const me = getState().getIn(['meta', 'me']);
const current = previous.filterNot(result => result.get('q') === q);
searchHistory.set(me, current.toJS());
dispatch(updateSearchHistory(current));
};
export const updateSearchHistory = recent => ({
type: SEARCH_HISTORY_UPDATE,
recent,
}); });
export const forgetSearchResult = q => ({ export const hydrateSearch = () => (dispatch, getState) => {
type: SEARCH_RESULT_FORGET, const me = getState().getIn(['meta', 'me']);
q, const history = searchHistory.get(me);
});
if (history !== null) {
dispatch(updateSearchHistory(history));
}
};

View File

@ -2,6 +2,7 @@ import { Iterable, fromJS } from 'immutable';
import { hydrateCompose } from './compose'; import { hydrateCompose } from './compose';
import { importFetchedAccounts } from './importer'; import { importFetchedAccounts } from './importer';
import { hydrateSearch } from './search';
import { saveSettings } from './settings'; import { saveSettings } from './settings';
export const STORE_HYDRATE = 'STORE_HYDRATE'; export const STORE_HYDRATE = 'STORE_HYDRATE';
@ -34,6 +35,7 @@ export function hydrateStore(rawState) {
}); });
dispatch(hydrateCompose()); dispatch(hydrateCompose());
dispatch(hydrateSearch());
dispatch(importFetchedAccounts(Object.values(rawState.accounts))); dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
dispatch(saveSettings()); dispatch(saveSettings());
}; };

View File

@ -33,8 +33,6 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
return ( return (
<div className='dismissable-banner'> <div className='dismissable-banner'>
<div className='dismissable-banner__message'>{children}</div>
<div className='dismissable-banner__action'> <div className='dismissable-banner__action'>
<IconButton <IconButton
icon='times' icon='times'
@ -42,6 +40,8 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
onClick={handleDismiss} onClick={handleDismiss}
/> />
</div> </div>
<div className='dismissable-banner__message'>{children}</div>
</div> </div>
); );
}; };

View File

@ -212,11 +212,11 @@ class Audio extends PureComponent {
}; };
toggleMute = () => { toggleMute = () => {
const muted = !this.state.muted; const muted = !(this.state.muted || this.state.volume === 0);
this.setState({ muted }, () => { this.setState((state) => ({ muted, volume: Math.max(state.volume || 0.5, 0.05) }), () => {
if (this.gainNode) { if (this.gainNode) {
this.gainNode.gain.value = muted ? 0 : this.state.volume; this.gainNode.gain.value = this.state.muted ? 0 : this.state.volume;
} }
}); });
}; };
@ -294,7 +294,7 @@ class Audio extends PureComponent {
const { x } = getPointerPosition(this.volume, e); const { x } = getPointerPosition(this.volume, e);
if(!isNaN(x)) { if(!isNaN(x)) {
this.setState({ volume: x }, () => { this.setState((state) => ({ volume: x, muted: state.muted && x === 0 }), () => {
if (this.gainNode) { if (this.gainNode) {
this.gainNode.gain.value = this.state.muted ? 0 : x; this.gainNode.gain.value = this.state.muted ? 0 : x;
} }
@ -473,8 +473,9 @@ class Audio extends PureComponent {
render () { render () {
const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props; const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props;
const { paused, muted, volume, currentTime, duration, buffer, dragging, revealed } = this.state; const { paused, volume, currentTime, duration, buffer, dragging, revealed } = this.state;
const progress = Math.min((currentTime / duration) * 100, 100); const progress = Math.min((currentTime / duration) * 100, 100);
const muted = this.state.muted || volume === 0;
let warning; let warning;
@ -564,12 +565,12 @@ class Audio extends PureComponent {
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
<div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}> <div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}>
<div className='video-player__volume__current' style={{ width: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} /> <div className='video-player__volume__current' style={{ width: `${muted ? 0 : volume * 100}%`, backgroundColor: this._getAccentColor() }} />
<span <span
className='video-player__volume__handle' className='video-player__volume__handle'
tabIndex={0} tabIndex={0}
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} style={{ left: `${muted ? 0 : volume * 100}%`, backgroundColor: this._getAccentColor() }}
/> />
</div> </div>

View File

@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
import { Icon } from 'flavours/glitch/components/icon'; import { Icon } from 'flavours/glitch/components/icon';
import { searchEnabled } from 'flavours/glitch/initial_state'; import { domain, searchEnabled } from 'flavours/glitch/initial_state';
import { focusRoot } from 'flavours/glitch/utils/dom_helpers'; import { focusRoot } from 'flavours/glitch/utils/dom_helpers';
import { HASHTAG_REGEX } from 'flavours/glitch/utils/hashtags'; import { HASHTAG_REGEX } from 'flavours/glitch/utils/hashtags';
@ -18,7 +18,17 @@ const messages = defineMessages({
placeholderSignedIn: { id: 'search.search_or_paste', defaultMessage: 'Search or paste URL' }, placeholderSignedIn: { id: 'search.search_or_paste', defaultMessage: 'Search or paste URL' },
}); });
// The component. const labelForRecentSearch = search => {
switch(search.get('type')) {
case 'account':
return `@${search.get('q')}`;
case 'hashtag':
return `#${search.get('q')}`;
default:
return search.get('q');
}
};
class Search extends PureComponent { class Search extends PureComponent {
static contextTypes = { static contextTypes = {
@ -56,6 +66,7 @@ class Search extends PureComponent {
{ label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:') } }, { label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:') } },
{ label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:') } }, { label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:') } },
{ label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:') } }, { label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:') } },
{ label: <><mark>in:</mark> <FormattedList type='disjunction' value={['all', 'library']} /></>, action: e => { e.preventDefault(); this._insertText('in:') } }
]; ];
setRef = c => { setRef = c => {
@ -197,12 +208,16 @@ class Search extends PureComponent {
}; };
handleRecentSearchClick = search => { handleRecentSearchClick = search => {
const { onChange } = this.props;
const { router } = this.context; const { router } = this.context;
if (search.get('type') === 'account') { if (search.get('type') === 'account') {
router.history.push(`/@${search.get('q')}`); router.history.push(`/@${search.get('q')}`);
} else if (search.get('type') === 'hashtag') { } else if (search.get('type') === 'hashtag') {
router.history.push(`/tags/${search.get('q')}`); router.history.push(`/tags/${search.get('q')}`);
} else {
onChange(search.get('q'));
this._submit(search.get('type'));
} }
this._unfocus(); this._unfocus();
@ -231,11 +246,15 @@ class Search extends PureComponent {
} }
_submit (type) { _submit (type) {
const { onSubmit, openInRoute } = this.props; const { onSubmit, openInRoute, value, onClickSearchResult } = this.props;
const { router } = this.context; const { router } = this.context;
onSubmit(type); onSubmit(type);
if (value) {
onClickSearchResult(value, type);
}
if (openInRoute) { if (openInRoute) {
router.history.push('/search'); router.history.push('/search');
} }
@ -253,7 +272,7 @@ class Search extends PureComponent {
const { recent } = this.props; const { recent } = this.props;
return recent.toArray().map(search => ({ return recent.toArray().map(search => ({
label: search.get('type') === 'account' ? `@${search.get('q')}` : `#${search.get('q')}`, label: labelForRecentSearch(search),
action: () => this.handleRecentSearchClick(search), action: () => this.handleRecentSearchClick(search),
@ -362,18 +381,20 @@ class Search extends PureComponent {
</> </>
)} )}
{searchEnabled && (
<>
<h4><FormattedMessage id='search_popout.options' defaultMessage='Search options' /></h4> <h4><FormattedMessage id='search_popout.options' defaultMessage='Search options' /></h4>
{searchEnabled ? (
<div className='search__popout__menu'> <div className='search__popout__menu'>
{this.defaultOptions.map(({ key, label, action }, i) => ( {this.defaultOptions.map(({ key, label, action }, i) => (
<button key={key} onMouseDown={action} className={classNames('search__popout__menu__item', { selected: selectedOption === (options.length + i) })}> <button key={key} onMouseDown={action} className={classNames('search__popout__menu__item', { selected: selectedOption === ((options.length || recent.size) + i) })}>
{label} {label}
</button> </button>
))} ))}
</div> </div>
</> ) : (
<div className='search__popout__menu__message'>
<FormattedMessage id='search_popout.full_text_search_disabled_message' defaultMessage='Not available on {domain}.' values={{ domain }} />
</div>
)} )}
</div> </div>
</div> </div>

View File

@ -1,6 +1,6 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
@ -10,36 +10,26 @@ import { Icon } from 'flavours/glitch/components/icon';
import { LoadMore } from 'flavours/glitch/components/load_more'; import { LoadMore } from 'flavours/glitch/components/load_more';
import AccountContainer from 'flavours/glitch/containers/account_container'; import AccountContainer from 'flavours/glitch/containers/account_container';
import StatusContainer from 'flavours/glitch/containers/status_container'; import StatusContainer from 'flavours/glitch/containers/status_container';
import { searchEnabled } from 'flavours/glitch/initial_state'; import { SearchSection } from 'flavours/glitch/features/explore/components/search_section';
const messages = defineMessages({ const INITIAL_PAGE_LIMIT = 10;
dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' },
}); const withoutLastResult = list => {
if (list.size > INITIAL_PAGE_LIMIT && list.size % INITIAL_PAGE_LIMIT === 1) {
return list.skipLast(1);
} else {
return list;
}
};
class SearchResults extends ImmutablePureComponent { class SearchResults extends ImmutablePureComponent {
static propTypes = { static propTypes = {
results: ImmutablePropTypes.map.isRequired, results: ImmutablePropTypes.map.isRequired,
suggestions: ImmutablePropTypes.list.isRequired,
fetchSuggestions: PropTypes.func.isRequired,
expandSearch: PropTypes.func.isRequired, expandSearch: PropTypes.func.isRequired,
dismissSuggestion: PropTypes.func.isRequired,
searchTerm: PropTypes.string, searchTerm: PropTypes.string,
intl: PropTypes.object.isRequired,
}; };
componentDidMount () {
if (this.props.searchTerm === '') {
this.props.fetchSuggestions();
}
}
componentDidUpdate () {
if (this.props.searchTerm === '') {
this.props.fetchSuggestions();
}
}
handleLoadMoreAccounts = () => this.props.expandSearch('accounts'); handleLoadMoreAccounts = () => this.props.expandSearch('accounts');
handleLoadMoreStatuses = () => this.props.expandSearch('statuses'); handleLoadMoreStatuses = () => this.props.expandSearch('statuses');
@ -47,98 +37,51 @@ class SearchResults extends ImmutablePureComponent {
handleLoadMoreHashtags = () => this.props.expandSearch('hashtags'); handleLoadMoreHashtags = () => this.props.expandSearch('hashtags');
render () { render () {
const { intl, results, suggestions, dismissSuggestion, searchTerm } = this.props; const { results } = this.props;
let accounts, statuses, hashtags; let accounts, statuses, hashtags;
let count = 0;
if (searchTerm === '' && !suggestions.isEmpty()) {
return (
<div className='drawer--results'>
<div className='trends'>
<div className='trends__header'>
<Icon fixedWidth id='user-plus' />
<FormattedMessage id='suggestions.header' defaultMessage='You might be interested in…' />
</div>
{suggestions && suggestions.map(suggestion => (
<AccountContainer
key={suggestion.get('account')}
id={suggestion.get('account')}
actionIcon={suggestion.get('source') === 'past_interaction' ? 'times' : null}
actionTitle={suggestion.get('source') === 'past_interaction' ? intl.formatMessage(messages.dismissSuggestion) : null}
onActionClick={dismissSuggestion}
/>
))}
</div>
</div>
);
} else if(results.get('statuses') && results.get('statuses').size === 0 && !searchEnabled && !(searchTerm.startsWith('@') || searchTerm.startsWith('#') || searchTerm.includes(' '))) {
statuses = (
<section className='search-results__section'>
<h5><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></h5>
<div className='search-results__info'>
<FormattedMessage id='search_results.statuses_fts_disabled' defaultMessage='Searching posts by their content is not enabled on this Mastodon server.' />
</div>
</section>
);
}
if (results.get('accounts') && results.get('accounts').size > 0) { if (results.get('accounts') && results.get('accounts').size > 0) {
count += results.get('accounts').size;
accounts = ( accounts = (
<section className='search-results__section'> <SearchSection title={<><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}>
<h5><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></h5> {withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)}
{(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
{results.get('accounts').map(accountId => <AccountContainer id={accountId} key={accountId} />)} </SearchSection>
{results.get('accounts').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
</section>
);
}
if (results.get('statuses') && results.get('statuses').size > 0) {
count += results.get('statuses').size;
statuses = (
<section className='search-results__section'>
<h5><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></h5>
{results.get('statuses').map(statusId => <StatusContainer id={statusId} key={statusId} />)}
{results.get('statuses').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
</section>
); );
} }
if (results.get('hashtags') && results.get('hashtags').size > 0) { if (results.get('hashtags') && results.get('hashtags').size > 0) {
count += results.get('hashtags').size;
hashtags = ( hashtags = (
<section className='search-results__section'> <SearchSection title={<><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
<h5><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5> {withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
{(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreHashtags} />}
{results.get('hashtags').map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} </SearchSection>
);
{results.get('hashtags').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreHashtags} />} }
</section>
if (results.get('statuses') && results.get('statuses').size > 0) {
statuses = (
<SearchSection title={<><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
{withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
{(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
</SearchSection>
); );
} }
// The result.
return ( return (
<div className='drawer--results'> <div className='drawer--results'>
<header className='search-results__header'> <header className='search-results__header'>
<Icon id='search' fixedWidth /> <Icon id='search' fixedWidth />
<FormattedMessage id='search_results.total' defaultMessage='{count, plural, one {# result} other {# results}}' values={{ count }} /> <FormattedMessage id='explore.search_results' defaultMessage='Search results' />
</header> </header>
{accounts} {accounts}
{statuses}
{hashtags} {hashtags}
{statuses}
</div> </div>
); );
} }
} }
export default injectIntl(SearchResults); export default SearchResults;

View File

@ -15,7 +15,7 @@ import Search from '../components/search';
const mapStateToProps = state => ({ const mapStateToProps = state => ({
value: state.getIn(['search', 'value']), value: state.getIn(['search', 'value']),
submitted: state.getIn(['search', 'submitted']), submitted: state.getIn(['search', 'submitted']),
recent: state.getIn(['search', 'recent']), recent: state.getIn(['search', 'recent']).reverse(),
}); });
const mapDispatchToProps = dispatch => ({ const mapDispatchToProps = dispatch => ({

View File

@ -0,0 +1,20 @@
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
export const SearchSection = ({ title, onClickMore, children }) => (
<div className='search-results__section'>
<div className='search-results__section__header'>
<h3>{title}</h3>
{onClickMore && <button onClick={onClickMore}><FormattedMessage id='search_results.see_all' defaultMessage='See all' /></button>}
</div>
{children}
</div>
);
SearchSection.propTypes = {
title: PropTypes.node.isRequired,
onClickMore: PropTypes.func,
children: PropTypes.children,
};

View File

@ -9,14 +9,14 @@ import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { expandSearch } from 'flavours/glitch/actions/search'; import { submitSearch, expandSearch } from 'flavours/glitch/actions/search';
import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag'; import { ImmutableHashtag as Hashtag } from 'flavours/glitch/components/hashtag';
import { LoadMore } from 'flavours/glitch/components/load_more'; import { Icon } from 'flavours/glitch/components/icon';
import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; import ScrollableList from 'flavours/glitch/components/scrollable_list';
import Account from 'flavours/glitch/containers/account_container'; import Account from 'flavours/glitch/containers/account_container';
import Status from 'flavours/glitch/containers/status_container'; import Status from 'flavours/glitch/containers/status_container';
import { SearchSection } from './components/search_section';
const messages = defineMessages({ const messages = defineMessages({
title: { id: 'search_results.title', defaultMessage: 'Search for {q}' }, title: { id: 'search_results.title', defaultMessage: 'Search for {q}' },
@ -26,85 +26,175 @@ const mapStateToProps = state => ({
isLoading: state.getIn(['search', 'isLoading']), isLoading: state.getIn(['search', 'isLoading']),
results: state.getIn(['search', 'results']), results: state.getIn(['search', 'results']),
q: state.getIn(['search', 'searchTerm']), q: state.getIn(['search', 'searchTerm']),
submittedType: state.getIn(['search', 'type']),
}); });
const appendLoadMore = (id, list, onLoadMore) => { const INITIAL_PAGE_LIMIT = 10;
if (list.size >= 5) { const INITIAL_DISPLAY = 4;
return list.push(<LoadMore key={`${id}-load-more`} visible onClick={onLoadMore} />);
const hidePeek = list => {
if (list.size > INITIAL_PAGE_LIMIT && list.size % INITIAL_PAGE_LIMIT === 1) {
return list.skipLast(1);
} else { } else {
return list; return list;
} }
}; };
const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => ( const renderAccounts = accounts => hidePeek(accounts).map(id => (
<Account key={`account-${item}`} id={item} /> <Account key={id} id={id} />
)), onLoadMore); ));
const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => ( const renderHashtags = hashtags => hidePeek(hashtags).map(hashtag => (
<Hashtag key={`tag-${item.get('name')}`} hashtag={item} /> <Hashtag key={hashtag.get('name')} hashtag={hashtag} />
)), onLoadMore); ));
const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => ( const renderStatuses = statuses => hidePeek(statuses).map(id => (
<Status key={`status-${item}`} id={item} /> <Status key={id} id={id} />
)), onLoadMore); ));
class Results extends PureComponent { class Results extends PureComponent {
static propTypes = { static propTypes = {
results: ImmutablePropTypes.map, results: ImmutablePropTypes.contains({
accounts: ImmutablePropTypes.orderedSet,
statuses: ImmutablePropTypes.orderedSet,
hashtags: ImmutablePropTypes.orderedSet,
}),
isLoading: PropTypes.bool, isLoading: PropTypes.bool,
multiColumn: PropTypes.bool, multiColumn: PropTypes.bool,
dispatch: PropTypes.func.isRequired, dispatch: PropTypes.func.isRequired,
q: PropTypes.string, q: PropTypes.string,
intl: PropTypes.object, intl: PropTypes.object,
submittedType: PropTypes.oneOf(['accounts', 'statuses', 'hashtags']),
}; };
state = { state = {
type: 'all', type: this.props.submittedType || 'all',
}; };
handleSelectAll = () => this.setState({ type: 'all' }); static getDerivedStateFromProps(props, state) {
handleSelectAccounts = () => this.setState({ type: 'accounts' }); if (props.submittedType !== state.type) {
handleSelectHashtags = () => this.setState({ type: 'hashtags' }); return {
handleSelectStatuses = () => this.setState({ type: 'statuses' }); type: props.submittedType || 'all',
handleLoadMoreAccounts = () => this.loadMore('accounts'); };
handleLoadMoreStatuses = () => this.loadMore('statuses'); }
handleLoadMoreHashtags = () => this.loadMore('hashtags');
loadMore (type) { return null;
};
handleSelectAll = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for a specific type, we need to resubmit
// the query to get all types of results
if (submittedType) {
dispatch(submitSearch());
}
this.setState({ type: 'all' });
};
handleSelectAccounts = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'accounts') {
dispatch(submitSearch('accounts'));
}
this.setState({ type: 'accounts' });
};
handleSelectHashtags = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'hashtags') {
dispatch(submitSearch('hashtags'));
}
this.setState({ type: 'hashtags' });
}
handleSelectStatuses = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'statuses') {
dispatch(submitSearch('statuses'));
}
this.setState({ type: 'statuses' });
}
handleLoadMoreAccounts = () => this._loadMore('accounts');
handleLoadMoreStatuses = () => this._loadMore('statuses');
handleLoadMoreHashtags = () => this._loadMore('hashtags');
_loadMore (type) {
const { dispatch } = this.props; const { dispatch } = this.props;
dispatch(expandSearch(type)); dispatch(expandSearch(type));
} }
handleLoadMore = () => {
const { type } = this.state;
if (type !== 'all') {
this._loadMore(type);
}
};
render () { render () {
const { intl, isLoading, q, results } = this.props; const { intl, isLoading, q, results } = this.props;
const { type } = this.state; const { type } = this.state;
let filteredResults = ImmutableList(); // We request 1 more result than we display so we can tell if there'd be a next page
const hasMore = type !== 'all' ? results.get(type, ImmutableList()).size > INITIAL_PAGE_LIMIT && results.get(type).size % INITIAL_PAGE_LIMIT === 1 : false;
let filteredResults;
if (!isLoading) { if (!isLoading) {
const accounts = results.get('accounts', ImmutableList());
const hashtags = results.get('hashtags', ImmutableList());
const statuses = results.get('statuses', ImmutableList());
switch(type) { switch(type) {
case 'all': case 'all':
filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts), renderHashtags(results, this.handleLoadMoreHashtags), renderStatuses(results, this.handleLoadMoreStatuses)); filteredResults = (accounts.size + hashtags.size + statuses.size) > 0 ? (
<>
{accounts.size > 0 && (
<SearchSection key='accounts' title={<><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>} onClickMore={this.handleLoadMoreAccounts}>
{accounts.take(INITIAL_DISPLAY).map(id => <Account key={id} id={id} />)}
</SearchSection>
)}
{hashtags.size > 0 && (
<SearchSection key='hashtags' title={<><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>} onClickMore={this.handleLoadMoreHashtags}>
{hashtags.take(INITIAL_DISPLAY).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
</SearchSection>
)}
{statuses.size > 0 && (
<SearchSection key='statuses' title={<><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>} onClickMore={this.handleLoadMoreStatuses}>
{statuses.take(INITIAL_DISPLAY).map(id => <Status key={id} id={id} />)}
</SearchSection>
)}
</>
) : [];
break; break;
case 'accounts': case 'accounts':
filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts)); filteredResults = renderAccounts(accounts);
break; break;
case 'hashtags': case 'hashtags':
filteredResults = filteredResults.concat(renderHashtags(results, this.handleLoadMoreHashtags)); filteredResults = renderHashtags(hashtags);
break; break;
case 'statuses': case 'statuses':
filteredResults = filteredResults.concat(renderStatuses(results, this.handleLoadMoreStatuses)); filteredResults = renderStatuses(statuses);
break; break;
} }
if (filteredResults.size === 0) {
filteredResults = (
<div className='empty-column-indicator'>
<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />
</div>
);
}
} }
return ( return (
@ -117,7 +207,16 @@ class Results extends PureComponent {
</div> </div>
<div className='explore__search-results'> <div className='explore__search-results'>
{isLoading ? <LoadingIndicator /> : filteredResults} <ScrollableList
scrollKey='search-results'
isLoading={isLoading}
onLoadMore={this.handleLoadMore}
hasMore={hasMore}
emptyMessage={<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />}
bindToDocument
>
{filteredResults}
</ScrollableList>
</div> </div>
<Helmet> <Helmet>

View File

@ -100,8 +100,41 @@ class LoginForm extends React.PureComponent {
this.input = c; this.input = c;
}; };
isValueValid = (value) => {
let likelyAcct = false;
let url = null;
if (value.startsWith('/')) {
return false;
}
if (value.startsWith('@')) {
value = value.slice(1);
likelyAcct = true;
}
// The user is in the middle of typing something, do not error out
if (value === '') {
return true;
}
if (/^https?:\/\//.test(value) && !likelyAcct) {
url = value;
} else {
url = `https://${value}`;
}
try {
new URL(url);
return true;
} catch(_) {
return false;
}
};
handleChange = ({ target }) => { handleChange = ({ target }) => {
this.setState(state => ({ value: target.value, isLoading: true, error: false, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions()); const error = !this.isValueValid(target.value);
this.setState(state => ({ error, value: target.value, isLoading: true, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions());
}; };
handleMessage = (event) => { handleMessage = (event) => {
@ -115,11 +148,18 @@ class LoginForm extends React.PureComponent {
this.setState({ isSubmitting: false, error: true }); this.setState({ isSubmitting: false, error: true });
} else if (event.data?.type === 'fetchInteractionURL-success') { } else if (event.data?.type === 'fetchInteractionURL-success') {
if (/^https?:\/\//.test(event.data.template)) { if (/^https?:\/\//.test(event.data.template)) {
try {
const url = new URL(event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)));
if (localStorage) { if (localStorage) {
localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain); localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain);
} }
window.location.href = event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)); window.location.href = url;
} catch (e) {
console.error(e);
this.setState({ isSubmitting: false, error: true });
}
} else { } else {
this.setState({ isSubmitting: false, error: true }); this.setState({ isSubmitting: false, error: true });
} }
@ -259,7 +299,7 @@ class LoginForm extends React.PureComponent {
spellcheck='false' spellcheck='false'
/> />
<Button onClick={this.handleSubmit} disabled={isSubmitting}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button> <Button onClick={this.handleSubmit} disabled={isSubmitting || error}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
</div> </div>
{hasPopOut && ( {hasPopOut && (

View File

@ -220,8 +220,9 @@ class Video extends PureComponent {
const { x } = getPointerPosition(this.volume, e); const { x } = getPointerPosition(this.volume, e);
if(!isNaN(x)) { if(!isNaN(x)) {
this.setState({ volume: x }, () => { this.setState((state) => ({ volume: x, muted: state.muted && x === 0 }), () => {
this.video.volume = x; this.video.volume = x;
this.video.muted = this.state.muted;
}); });
} }
}, 15); }, 15);
@ -428,10 +429,11 @@ class Video extends PureComponent {
}; };
toggleMute = () => { toggleMute = () => {
const muted = !this.video.muted; const muted = !(this.video.muted || this.state.volume === 0);
this.setState({ muted }, () => { this.setState((state) => ({ muted, volume: Math.max(state.volume || 0.5, 0.05) }), () => {
this.video.muted = muted; this.video.volume = this.state.volume;
this.video.muted = this.state.muted;
}); });
}; };
@ -508,8 +510,10 @@ class Video extends PureComponent {
render () { render () {
const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, lang, letterbox, fullwidth, detailed, sensitive, editable, blurhash, autoFocus } = this.props; const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, lang, letterbox, fullwidth, detailed, sensitive, editable, blurhash, autoFocus } = this.props;
const { currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const { currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, revealed } = this.state;
const progress = Math.min((currentTime / duration) * 100, 100); const progress = Math.min((currentTime / duration) * 100, 100);
const muted = this.state.muted || volume === 0;
const playerStyle = {}; const playerStyle = {};
if (inline) { if (inline) {
@ -603,12 +607,12 @@ class Video extends PureComponent {
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
<div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}> <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
<div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} /> <div className='video-player__volume__current' style={{ width: `${muted ? 0 : volume * 100}%` }} />
<span <span
className={classNames('video-player__volume__handle')} className={classNames('video-player__volume__handle')}
tabIndex={0} tabIndex={0}
style={{ left: `${volume * 100}%` }} style={{ left: `${muted ? 0 : volume * 100}%` }}
/> />
</div> </div>

View File

@ -33,7 +33,7 @@ function main() {
console.error(err); console.error(err);
} }
if (registration) { if (registration && 'Notification' in window && Notification.permission === 'granted') {
const registerPushNotifications = await import('flavours/glitch/actions/push_notifications'); const registerPushNotifications = await import('flavours/glitch/actions/push_notifications');
store.dispatch(registerPushNotifications.register()); store.dispatch(registerPushNotifications.register());

View File

@ -1,4 +1,4 @@
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
import { import {
COMPOSE_MENTION, COMPOSE_MENTION,
@ -12,9 +12,9 @@ import {
SEARCH_FETCH_FAIL, SEARCH_FETCH_FAIL,
SEARCH_FETCH_SUCCESS, SEARCH_FETCH_SUCCESS,
SEARCH_SHOW, SEARCH_SHOW,
SEARCH_EXPAND_REQUEST,
SEARCH_EXPAND_SUCCESS, SEARCH_EXPAND_SUCCESS,
SEARCH_RESULT_CLICK, SEARCH_HISTORY_UPDATE,
SEARCH_RESULT_FORGET,
} from 'flavours/glitch/actions/search'; } from 'flavours/glitch/actions/search';
const initialState = ImmutableMap({ const initialState = ImmutableMap({
@ -24,6 +24,7 @@ const initialState = ImmutableMap({
results: ImmutableMap(), results: ImmutableMap(),
isLoading: false, isLoading: false,
searchTerm: '', searchTerm: '',
type: null,
recent: ImmutableOrderedSet(), recent: ImmutableOrderedSet(),
}); });
@ -37,6 +38,8 @@ export default function search(state = initialState, action) {
map.set('results', ImmutableMap()); map.set('results', ImmutableMap());
map.set('submitted', false); map.set('submitted', false);
map.set('hidden', false); map.set('hidden', false);
map.set('searchTerm', '');
map.set('type', null);
}); });
case SEARCH_SHOW: case SEARCH_SHOW:
return state.set('hidden', false); return state.set('hidden', false);
@ -48,27 +51,29 @@ export default function search(state = initialState, action) {
return state.withMutations(map => { return state.withMutations(map => {
map.set('isLoading', true); map.set('isLoading', true);
map.set('submitted', true); map.set('submitted', true);
map.set('type', action.searchType);
}); });
case SEARCH_FETCH_FAIL: case SEARCH_FETCH_FAIL:
return state.set('isLoading', false); return state.set('isLoading', false);
case SEARCH_FETCH_SUCCESS: case SEARCH_FETCH_SUCCESS:
return state.withMutations(map => { return state.withMutations(map => {
map.set('results', ImmutableMap({ map.set('results', ImmutableMap({
accounts: ImmutableList(action.results.accounts.map(item => item.id)), accounts: ImmutableOrderedSet(action.results.accounts.map(item => item.id)),
statuses: ImmutableList(action.results.statuses.map(item => item.id)), statuses: ImmutableOrderedSet(action.results.statuses.map(item => item.id)),
hashtags: fromJS(action.results.hashtags), hashtags: ImmutableOrderedSet(fromJS(action.results.hashtags)),
})); }));
map.set('searchTerm', action.searchTerm); map.set('searchTerm', action.searchTerm);
map.set('type', action.searchType);
map.set('isLoading', false); map.set('isLoading', false);
}); });
case SEARCH_EXPAND_REQUEST:
return state.set('type', action.searchType);
case SEARCH_EXPAND_SUCCESS: case SEARCH_EXPAND_SUCCESS:
const results = action.searchType === 'hashtags' ? fromJS(action.results.hashtags) : action.results[action.searchType].map(item => item.id); const results = action.searchType === 'hashtags' ? ImmutableOrderedSet(fromJS(action.results.hashtags)) : action.results[action.searchType].map(item => item.id);
return state.updateIn(['results', action.searchType], list => list.concat(results)); return state.updateIn(['results', action.searchType], list => list.union(results));
case SEARCH_RESULT_CLICK: case SEARCH_HISTORY_UPDATE:
return state.update('recent', set => set.add(fromJS(action.result))); return state.set('recent', ImmutableOrderedSet(fromJS(action.recent)));
case SEARCH_RESULT_FORGET:
return state.update('recent', set => set.filterNot(result => result.get('q') === action.q));
default: default:
return state; return state;
} }

View File

@ -46,3 +46,4 @@ export default class Settings {
export const pushNotificationsSetting = new Settings('mastodon_push_notification_data'); export const pushNotificationsSetting = new Settings('mastodon_push_notification_data');
export const tagHistory = new Settings('mastodon_tag_history'); export const tagHistory = new Settings('mastodon_tag_history');
export const bannerSettings = new Settings('mastodon_banner_settings'); export const bannerSettings = new Settings('mastodon_banner_settings');
export const searchHistory = new Settings('mastodon_search_history');

View File

@ -365,7 +365,7 @@
flex-shrink: 0; flex-shrink: 0;
button { button {
background: darken($ui-base-color, 4%); background: transparent;
border: 0; border: 0;
margin: 0; margin: 0;
} }
@ -383,26 +383,18 @@
position: relative; position: relative;
&.active { &.active {
color: $secondary-text-color; color: $primary-text-color;
&::before, &::before {
&::after {
display: block; display: block;
content: ''; content: '';
position: absolute; position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 0;
transform: translateX(-50%);
border-style: solid;
border-width: 0 10px 10px;
border-color: transparent transparent lighten($ui-base-color, 8%);
}
&::after {
bottom: -1px; bottom: -1px;
border-color: transparent transparent $ui-base-color; left: 0;
width: 100%;
height: 3px;
border-radius: 4px;
background: $highlight-text-color;
} }
} }
} }

View File

@ -985,7 +985,6 @@ $ui-header-height: 55px;
border-radius: 8px; border-radius: 8px;
border: 1px solid $highlight-text-color; border: 1px solid $highlight-text-color;
background: rgba($highlight-text-color, 0.15); background: rgba($highlight-text-color, 0.15);
padding-inline-end: 45px;
overflow: hidden; overflow: hidden;
&__background-image { &__background-image {
@ -1045,10 +1044,8 @@ $ui-header-height: 55px;
} }
&__action { &__action {
position: absolute; float: right;
inset-inline-end: 0; padding: 15px 10px;
top: 0;
padding: 10px;
.icon-button { .icon-button {
color: $highlight-text-color; color: $highlight-text-color;

View File

@ -132,22 +132,39 @@
} }
.search-results__section { .search-results__section {
margin-bottom: 5px; border-bottom: 1px solid lighten($ui-base-color, 8%);
h5 { &:last-child {
border-bottom: 0;
}
&__header {
background: darken($ui-base-color, 4%); background: darken($ui-base-color, 4%);
border-bottom: 1px solid lighten($ui-base-color, 8%); border-bottom: 1px solid lighten($ui-base-color, 8%);
cursor: default;
display: flex;
padding: 15px; padding: 15px;
font-weight: 500; font-weight: 500;
font-size: 16px; font-size: 14px;
color: $dark-text-color; color: $darker-text-color;
display: flex;
justify-content: space-between;
.fa { h3 .fa {
display: inline-block;
margin-inline-end: 5px; margin-inline-end: 5px;
} }
button {
color: $highlight-text-color;
padding: 0;
border: 0;
background: 0;
font: inherit;
&:hover,
&:active,
&:focus {
text-decoration: underline;
}
}
} }
.account:last-child, .account:last-child,

View File

@ -78,6 +78,11 @@
font-weight: 700; font-weight: 700;
color: $primary-text-color; color: $primary-text-color;
} }
span {
overflow: inherit;
text-overflow: inherit;
}
} }
} }
} }

View File

@ -113,4 +113,11 @@ body.rtl {
.fa-chevron-right::before { .fa-chevron-right::before {
content: '\F053'; content: '\F053';
} }
.dismissable-banner,
.warning-banner {
&__action {
float: left;
}
}
} }

View File

@ -1,37 +0,0 @@
import api from '../api';
export const ACCOUNT_NOTE_SUBMIT_REQUEST = 'ACCOUNT_NOTE_SUBMIT_REQUEST';
export const ACCOUNT_NOTE_SUBMIT_SUCCESS = 'ACCOUNT_NOTE_SUBMIT_SUCCESS';
export const ACCOUNT_NOTE_SUBMIT_FAIL = 'ACCOUNT_NOTE_SUBMIT_FAIL';
export function submitAccountNote(id, value) {
return (dispatch, getState) => {
dispatch(submitAccountNoteRequest());
api(getState).post(`/api/v1/accounts/${id}/note`, {
comment: value,
}).then(response => {
dispatch(submitAccountNoteSuccess(response.data));
}).catch(error => dispatch(submitAccountNoteFail(error)));
};
}
export function submitAccountNoteRequest() {
return {
type: ACCOUNT_NOTE_SUBMIT_REQUEST,
};
}
export function submitAccountNoteSuccess(relationship) {
return {
type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
relationship,
};
}
export function submitAccountNoteFail(error) {
return {
type: ACCOUNT_NOTE_SUBMIT_FAIL,
error,
};
}

View File

@ -0,0 +1,18 @@
import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
import api from '../api';
export const submitAccountNote = createAppAsyncThunk(
'account_note/submit',
async (args: { id: string; value: string }, { getState }) => {
// TODO: replace `unknown` with `ApiRelationshipJSON` when it is merged
const response = await api(getState).post<unknown>(
`/api/v1/accounts/${args.id}/note`,
{
comment: args.value,
},
);
return { relationship: response.data };
},
);

View File

@ -18,6 +18,7 @@ import {
importFetchedStatuses, importFetchedStatuses,
} from './importer'; } from './importer';
import { submitMarkers } from './markers'; import { submitMarkers } from './markers';
import { register as registerPushNotifications } from './push_notifications';
import { saveSettings } from './settings'; import { saveSettings } from './settings';
export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE';
@ -293,6 +294,10 @@ export function requestBrowserPermission(callback = noOp) {
requestNotificationPermission((permission) => { requestNotificationPermission((permission) => {
dispatch(setBrowserPermission(permission)); dispatch(setBrowserPermission(permission));
callback(permission); callback(permission);
if (permission === 'granted') {
dispatch(registerPushNotifications());
}
}); });
}; };
} }

View File

@ -1,3 +1,7 @@
import { fromJS } from 'immutable';
import { searchHistory } from 'mastodon/settings';
import api from '../api'; import api from '../api';
import { fetchRelationships } from './accounts'; import { fetchRelationships } from './accounts';
@ -15,8 +19,7 @@ export const SEARCH_EXPAND_REQUEST = 'SEARCH_EXPAND_REQUEST';
export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS'; export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS';
export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL'; export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL';
export const SEARCH_RESULT_CLICK = 'SEARCH_RESULT_CLICK'; export const SEARCH_HISTORY_UPDATE = 'SEARCH_HISTORY_UPDATE';
export const SEARCH_RESULT_FORGET = 'SEARCH_RESULT_FORGET';
export function changeSearch(value) { export function changeSearch(value) {
return { return {
@ -37,17 +40,17 @@ export function submitSearch(type) {
const signedIn = !!getState().getIn(['meta', 'me']); const signedIn = !!getState().getIn(['meta', 'me']);
if (value.length === 0) { if (value.length === 0) {
dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '')); dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '', type));
return; return;
} }
dispatch(fetchSearchRequest()); dispatch(fetchSearchRequest(type));
api(getState).get('/api/v2/search', { api(getState).get('/api/v2/search', {
params: { params: {
q: value, q: value,
resolve: signedIn, resolve: signedIn,
limit: 5, limit: 11,
type, type,
}, },
}).then(response => { }).then(response => {
@ -59,7 +62,7 @@ export function submitSearch(type) {
dispatch(importFetchedStatuses(response.data.statuses)); dispatch(importFetchedStatuses(response.data.statuses));
} }
dispatch(fetchSearchSuccess(response.data, value)); dispatch(fetchSearchSuccess(response.data, value, type));
dispatch(fetchRelationships(response.data.accounts.map(item => item.id))); dispatch(fetchRelationships(response.data.accounts.map(item => item.id)));
}).catch(error => { }).catch(error => {
dispatch(fetchSearchFail(error)); dispatch(fetchSearchFail(error));
@ -67,16 +70,18 @@ export function submitSearch(type) {
}; };
} }
export function fetchSearchRequest() { export function fetchSearchRequest(searchType) {
return { return {
type: SEARCH_FETCH_REQUEST, type: SEARCH_FETCH_REQUEST,
searchType,
}; };
} }
export function fetchSearchSuccess(results, searchTerm) { export function fetchSearchSuccess(results, searchTerm, searchType) {
return { return {
type: SEARCH_FETCH_SUCCESS, type: SEARCH_FETCH_SUCCESS,
results, results,
searchType,
searchTerm, searchTerm,
}; };
} }
@ -90,15 +95,16 @@ export function fetchSearchFail(error) {
export const expandSearch = type => (dispatch, getState) => { export const expandSearch = type => (dispatch, getState) => {
const value = getState().getIn(['search', 'value']); const value = getState().getIn(['search', 'value']);
const offset = getState().getIn(['search', 'results', type]).size; const offset = getState().getIn(['search', 'results', type]).size - 1;
dispatch(expandSearchRequest()); dispatch(expandSearchRequest(type));
api(getState).get('/api/v2/search', { api(getState).get('/api/v2/search', {
params: { params: {
q: value, q: value,
type, type,
offset, offset,
limit: 11,
}, },
}).then(({ data }) => { }).then(({ data }) => {
if (data.accounts) { if (data.accounts) {
@ -116,8 +122,9 @@ export const expandSearch = type => (dispatch, getState) => {
}); });
}; };
export const expandSearchRequest = () => ({ export const expandSearchRequest = (searchType) => ({
type: SEARCH_EXPAND_REQUEST, type: SEARCH_EXPAND_REQUEST,
searchType,
}); });
export const expandSearchSuccess = (results, searchTerm, searchType) => ({ export const expandSearchSuccess = (results, searchTerm, searchType) => ({
@ -166,16 +173,34 @@ export const openURL = (value, history, onFailure) => (dispatch, getState) => {
}); });
}; };
export const clickSearchResult = (q, type) => ({ export const clickSearchResult = (q, type) => (dispatch, getState) => {
type: SEARCH_RESULT_CLICK, const previous = getState().getIn(['search', 'recent']);
const me = getState().getIn(['meta', 'me']);
const current = previous.add(fromJS({ type, q })).takeLast(4);
result: { searchHistory.set(me, current.toJS());
type, dispatch(updateSearchHistory(current));
q, };
},
export const forgetSearchResult = q => (dispatch, getState) => {
const previous = getState().getIn(['search', 'recent']);
const me = getState().getIn(['meta', 'me']);
const current = previous.filterNot(result => result.get('q') === q);
searchHistory.set(me, current.toJS());
dispatch(updateSearchHistory(current));
};
export const updateSearchHistory = recent => ({
type: SEARCH_HISTORY_UPDATE,
recent,
}); });
export const forgetSearchResult = q => ({ export const hydrateSearch = () => (dispatch, getState) => {
type: SEARCH_RESULT_FORGET, const me = getState().getIn(['meta', 'me']);
q, const history = searchHistory.get(me);
});
if (history !== null) {
dispatch(updateSearchHistory(history));
}
};

View File

@ -2,6 +2,7 @@ import { Iterable, fromJS } from 'immutable';
import { hydrateCompose } from './compose'; import { hydrateCompose } from './compose';
import { importFetchedAccounts } from './importer'; import { importFetchedAccounts } from './importer';
import { hydrateSearch } from './search';
export const STORE_HYDRATE = 'STORE_HYDRATE'; export const STORE_HYDRATE = 'STORE_HYDRATE';
export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY'; export const STORE_HYDRATE_LAZY = 'STORE_HYDRATE_LAZY';
@ -20,6 +21,7 @@ export function hydrateStore(rawState) {
}); });
dispatch(hydrateCompose()); dispatch(hydrateCompose());
dispatch(hydrateSearch());
dispatch(importFetchedAccounts(Object.values(rawState.accounts))); dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
}; };
} }

View File

@ -1,76 +0,0 @@
// @ts-check
import axios from 'axios';
import LinkHeader from 'http-link-header';
import ready from './ready';
/**
* @param {import('axios').AxiosResponse} response
* @returns {LinkHeader}
*/
export const getLinks = response => {
const value = response.headers.link;
if (!value) {
return new LinkHeader();
}
return LinkHeader.parse(value);
};
/** @type {import('axios').RawAxiosRequestHeaders} */
const csrfHeader = {};
/**
* @returns {void}
*/
const setCSRFHeader = () => {
/** @type {HTMLMetaElement | null} */
const csrfToken = document.querySelector('meta[name=csrf-token]');
if (csrfToken) {
csrfHeader['X-CSRF-Token'] = csrfToken.content;
}
};
ready(setCSRFHeader);
/**
* @param {() => import('immutable').Map<string,any>} getState
* @returns {import('axios').RawAxiosRequestHeaders}
*/
const authorizationHeaderFromState = getState => {
const accessToken = getState && getState().getIn(['meta', 'access_token'], '');
if (!accessToken) {
return {};
}
return {
'Authorization': `Bearer ${accessToken}`,
};
};
/**
* @param {() => import('immutable').Map<string,any>} getState
* @returns {import('axios').AxiosInstance}
*/
export default function api(getState) {
return axios.create({
headers: {
...csrfHeader,
...authorizationHeaderFromState(getState),
},
transformResponse: [
function (data) {
try {
return JSON.parse(data);
} catch {
return data;
}
},
],
});
}

View File

@ -0,0 +1,63 @@
import type { AxiosResponse, RawAxiosRequestHeaders } from 'axios';
import axios from 'axios';
import LinkHeader from 'http-link-header';
import ready from './ready';
import type { GetState } from './store';
export const getLinks = (response: AxiosResponse) => {
const value = response.headers.link as string | undefined;
if (!value) {
return new LinkHeader();
}
return LinkHeader.parse(value);
};
const csrfHeader: RawAxiosRequestHeaders = {};
const setCSRFHeader = () => {
const csrfToken = document.querySelector<HTMLMetaElement>(
'meta[name=csrf-token]',
);
if (csrfToken) {
csrfHeader['X-CSRF-Token'] = csrfToken.content;
}
};
void ready(setCSRFHeader);
const authorizationHeaderFromState = (getState?: GetState) => {
const accessToken =
getState && (getState().meta.get('access_token', '') as string);
if (!accessToken) {
return {};
}
return {
Authorization: `Bearer ${accessToken}`,
} as RawAxiosRequestHeaders;
};
// eslint-disable-next-line import/no-default-export
export default function api(getState: GetState) {
return axios.create({
headers: {
...csrfHeader,
...authorizationHeaderFromState(getState),
},
transformResponse: [
function (data: unknown) {
try {
return JSON.parse(data as string) as unknown;
} catch {
return data;
}
},
],
});
}

View File

@ -6,21 +6,10 @@ import { reduceMotion } from '../initial_state';
import { ShortNumber } from './short_number'; import { ShortNumber } from './short_number';
const obfuscatedCount = (count: number) => {
if (count < 0) {
return 0;
} else if (count <= 1) {
return count;
} else {
return '1+';
}
};
interface Props { interface Props {
value: number; value: number;
obfuscate?: boolean;
} }
export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => { export const AnimatedNumber: React.FC<Props> = ({ value }) => {
const [previousValue, setPreviousValue] = useState(value); const [previousValue, setPreviousValue] = useState(value);
const [direction, setDirection] = useState<1 | -1>(1); const [direction, setDirection] = useState<1 | -1>(1);
@ -36,11 +25,7 @@ export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => {
); );
if (reduceMotion) { if (reduceMotion) {
return obfuscate ? ( return <ShortNumber value={value} />;
<>{obfuscatedCount(value)}</>
) : (
<ShortNumber value={value} />
);
} }
const styles = [ const styles = [
@ -67,11 +52,7 @@ export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => {
transform: `translateY(${style.y * 100}%)`, transform: `translateY(${style.y * 100}%)`,
}} }}
> >
{obfuscate ? (
obfuscatedCount(data as number)
) : (
<ShortNumber value={data as number} /> <ShortNumber value={data as number} />
)}
</span> </span>
))} ))}
</span> </span>

View File

@ -33,8 +33,6 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
return ( return (
<div className='dismissable-banner'> <div className='dismissable-banner'>
<div className='dismissable-banner__message'>{children}</div>
<div className='dismissable-banner__action'> <div className='dismissable-banner__action'>
<IconButton <IconButton
icon='times' icon='times'
@ -42,6 +40,8 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
onClick={handleDismiss} onClick={handleDismiss}
/> />
</div> </div>
<div className='dismissable-banner__message'>{children}</div>
</div> </div>
); );
}; };

View File

@ -24,7 +24,6 @@ interface Props {
overlay: boolean; overlay: boolean;
tabIndex: number; tabIndex: number;
counter?: number; counter?: number;
obfuscateCount?: boolean;
href?: string; href?: string;
ariaHidden: boolean; ariaHidden: boolean;
} }
@ -105,7 +104,6 @@ export class IconButton extends PureComponent<Props, States> {
tabIndex, tabIndex,
title, title,
counter, counter,
obfuscateCount,
href, href,
ariaHidden, ariaHidden,
} = this.props; } = this.props;
@ -131,7 +129,7 @@ export class IconButton extends PureComponent<Props, States> {
<Icon id={icon} fixedWidth aria-hidden='true' />{' '} <Icon id={icon} fixedWidth aria-hidden='true' />{' '}
{typeof counter !== 'undefined' && ( {typeof counter !== 'undefined' && (
<span className='icon-button__counter'> <span className='icon-button__counter'>
<AnimatedNumber value={counter} obfuscate={obfuscateCount} /> <AnimatedNumber value={counter} />
</span> </span>
)} )}
</> </>

View File

@ -362,7 +362,7 @@ class StatusActionBar extends ImmutablePureComponent {
return ( return (
<div className='status__action-bar'> <div className='status__action-bar'>
<IconButton className='status__action-bar__button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount /> <IconButton className='status__action-bar__button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
<IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} /> <IconButton className={classNames('status__action-bar__button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={withCounters ? status.get('reblogs_count') : undefined} />
<IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} /> <IconButton className='status__action-bar__button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={withCounters ? status.get('favourites_count') : undefined} />
<IconButton className='status__action-bar__button bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /> <IconButton className='status__action-bar__button bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} />

View File

@ -11,7 +11,7 @@ const mapStateToProps = (state, { account }) => ({
const mapDispatchToProps = (dispatch, { account }) => ({ const mapDispatchToProps = (dispatch, { account }) => ({
onSave (value) { onSave (value) {
dispatch(submitAccountNote(account.get('id'), value)); dispatch(submitAccountNote({ id: account.get('id'), value}));
}, },
}); });

View File

@ -205,11 +205,11 @@ class Audio extends PureComponent {
}; };
toggleMute = () => { toggleMute = () => {
const muted = !this.state.muted; const muted = !(this.state.muted || this.state.volume === 0);
this.setState({ muted }, () => { this.setState((state) => ({ muted, volume: Math.max(state.volume || 0.5, 0.05) }), () => {
if (this.gainNode) { if (this.gainNode) {
this.gainNode.gain.value = muted ? 0 : this.state.volume; this.gainNode.gain.value = this.state.muted ? 0 : this.state.volume;
} }
}); });
}; };
@ -287,7 +287,7 @@ class Audio extends PureComponent {
const { x } = getPointerPosition(this.volume, e); const { x } = getPointerPosition(this.volume, e);
if(!isNaN(x)) { if(!isNaN(x)) {
this.setState({ volume: x }, () => { this.setState((state) => ({ volume: x, muted: state.muted && x === 0 }), () => {
if (this.gainNode) { if (this.gainNode) {
this.gainNode.gain.value = this.state.muted ? 0 : x; this.gainNode.gain.value = this.state.muted ? 0 : x;
} }
@ -466,8 +466,9 @@ class Audio extends PureComponent {
render () { render () {
const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props; const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props;
const { paused, muted, volume, currentTime, duration, buffer, dragging, revealed } = this.state; const { paused, volume, currentTime, duration, buffer, dragging, revealed } = this.state;
const progress = Math.min((currentTime / duration) * 100, 100); const progress = Math.min((currentTime / duration) * 100, 100);
const muted = this.state.muted || volume === 0;
let warning; let warning;
@ -557,12 +558,12 @@ class Audio extends PureComponent {
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
<div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}> <div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}>
<div className='video-player__volume__current' style={{ width: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} /> <div className='video-player__volume__current' style={{ width: `${muted ? 0 : volume * 100}%`, backgroundColor: this._getAccentColor() }} />
<span <span
className='video-player__volume__handle' className='video-player__volume__handle'
tabIndex={0} tabIndex={0}
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} style={{ left: `${muted ? 0 : volume * 100}%`, backgroundColor: this._getAccentColor() }}
/> />
</div> </div>

View File

@ -8,7 +8,7 @@ import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import { Icon } from 'mastodon/components/icon'; import { Icon } from 'mastodon/components/icon';
import { searchEnabled } from 'mastodon/initial_state'; import { domain, searchEnabled } from 'mastodon/initial_state';
import { HASHTAG_REGEX } from 'mastodon/utils/hashtags'; import { HASHTAG_REGEX } from 'mastodon/utils/hashtags';
const messages = defineMessages({ const messages = defineMessages({
@ -16,6 +16,17 @@ const messages = defineMessages({
placeholderSignedIn: { id: 'search.search_or_paste', defaultMessage: 'Search or paste URL' }, placeholderSignedIn: { id: 'search.search_or_paste', defaultMessage: 'Search or paste URL' },
}); });
const labelForRecentSearch = search => {
switch(search.get('type')) {
case 'account':
return `@${search.get('q')}`;
case 'hashtag':
return `#${search.get('q')}`;
default:
return search.get('q');
}
};
class Search extends PureComponent { class Search extends PureComponent {
static contextTypes = { static contextTypes = {
@ -53,6 +64,7 @@ class Search extends PureComponent {
{ label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:') } }, { label: <><mark>before:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('before:') } },
{ label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:') } }, { label: <><mark>during:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('during:') } },
{ label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:') } }, { label: <><mark>after:</mark> <FormattedMessage id='search_popout.specific_date' defaultMessage='specific date' /></>, action: e => { e.preventDefault(); this._insertText('after:') } },
{ label: <><mark>in:</mark> <FormattedList type='disjunction' value={['all', 'library']} /></>, action: e => { e.preventDefault(); this._insertText('in:') } }
]; ];
setRef = c => { setRef = c => {
@ -186,12 +198,16 @@ class Search extends PureComponent {
}; };
handleRecentSearchClick = search => { handleRecentSearchClick = search => {
const { onChange } = this.props;
const { router } = this.context; const { router } = this.context;
if (search.get('type') === 'account') { if (search.get('type') === 'account') {
router.history.push(`/@${search.get('q')}`); router.history.push(`/@${search.get('q')}`);
} else if (search.get('type') === 'hashtag') { } else if (search.get('type') === 'hashtag') {
router.history.push(`/tags/${search.get('q')}`); router.history.push(`/tags/${search.get('q')}`);
} else {
onChange(search.get('q'));
this._submit(search.get('type'));
} }
this._unfocus(); this._unfocus();
@ -220,11 +236,15 @@ class Search extends PureComponent {
} }
_submit (type) { _submit (type) {
const { onSubmit, openInRoute } = this.props; const { onSubmit, openInRoute, value, onClickSearchResult } = this.props;
const { router } = this.context; const { router } = this.context;
onSubmit(type); onSubmit(type);
if (value) {
onClickSearchResult(value, type);
}
if (openInRoute) { if (openInRoute) {
router.history.push('/search'); router.history.push('/search');
} }
@ -242,7 +262,7 @@ class Search extends PureComponent {
const { recent } = this.props; const { recent } = this.props;
return recent.toArray().map(search => ({ return recent.toArray().map(search => ({
label: search.get('type') === 'account' ? `@${search.get('q')}` : `#${search.get('q')}`, label: labelForRecentSearch(search),
action: () => this.handleRecentSearchClick(search), action: () => this.handleRecentSearchClick(search),
@ -353,18 +373,20 @@ class Search extends PureComponent {
</> </>
)} )}
{searchEnabled && (
<>
<h4><FormattedMessage id='search_popout.options' defaultMessage='Search options' /></h4> <h4><FormattedMessage id='search_popout.options' defaultMessage='Search options' /></h4>
{searchEnabled ? (
<div className='search__popout__menu'> <div className='search__popout__menu'>
{this.defaultOptions.map(({ key, label, action }, i) => ( {this.defaultOptions.map(({ key, label, action }, i) => (
<button key={key} onMouseDown={action} className={classNames('search__popout__menu__item', { selected: selectedOption === (options.length + i) })}> <button key={key} onMouseDown={action} className={classNames('search__popout__menu__item', { selected: selectedOption === ((options.length || recent.size) + i) })}>
{label} {label}
</button> </button>
))} ))}
</div> </div>
</> ) : (
<div className='search__popout__menu__message'>
<FormattedMessage id='search_popout.full_text_search_disabled_message' defaultMessage='Not available on {domain}.' values={{ domain }} />
</div>
)} )}
</div> </div>
</div> </div>

View File

@ -1,46 +1,36 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { Icon } from 'mastodon/components/icon'; import { Icon } from 'mastodon/components/icon';
import { LoadMore } from 'mastodon/components/load_more'; import { LoadMore } from 'mastodon/components/load_more';
import { SearchSection } from 'mastodon/features/explore/components/search_section';
import { ImmutableHashtag as Hashtag } from '../../../components/hashtag'; import { ImmutableHashtag as Hashtag } from '../../../components/hashtag';
import AccountContainer from '../../../containers/account_container'; import AccountContainer from '../../../containers/account_container';
import StatusContainer from '../../../containers/status_container'; import StatusContainer from '../../../containers/status_container';
import { searchEnabled } from '../../../initial_state';
const messages = defineMessages({ const INITIAL_PAGE_LIMIT = 10;
dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' },
}); const withoutLastResult = list => {
if (list.size > INITIAL_PAGE_LIMIT && list.size % INITIAL_PAGE_LIMIT === 1) {
return list.skipLast(1);
} else {
return list;
}
};
class SearchResults extends ImmutablePureComponent { class SearchResults extends ImmutablePureComponent {
static propTypes = { static propTypes = {
results: ImmutablePropTypes.map.isRequired, results: ImmutablePropTypes.map.isRequired,
suggestions: ImmutablePropTypes.list.isRequired,
fetchSuggestions: PropTypes.func.isRequired,
expandSearch: PropTypes.func.isRequired, expandSearch: PropTypes.func.isRequired,
dismissSuggestion: PropTypes.func.isRequired,
searchTerm: PropTypes.string, searchTerm: PropTypes.string,
intl: PropTypes.object.isRequired,
}; };
componentDidMount () {
if (this.props.searchTerm === '') {
this.props.fetchSuggestions();
}
}
componentDidUpdate () {
if (this.props.searchTerm === '') {
this.props.fetchSuggestions();
}
}
handleLoadMoreAccounts = () => this.props.expandSearch('accounts'); handleLoadMoreAccounts = () => this.props.expandSearch('accounts');
handleLoadMoreStatuses = () => this.props.expandSearch('statuses'); handleLoadMoreStatuses = () => this.props.expandSearch('statuses');
@ -48,97 +38,52 @@ class SearchResults extends ImmutablePureComponent {
handleLoadMoreHashtags = () => this.props.expandSearch('hashtags'); handleLoadMoreHashtags = () => this.props.expandSearch('hashtags');
render () { render () {
const { intl, results, suggestions, dismissSuggestion, searchTerm } = this.props; const { results } = this.props;
if (searchTerm === '' && !suggestions.isEmpty()) {
return (
<div className='search-results'>
<div className='trends'>
<div className='trends__header'>
<Icon id='user-plus' fixedWidth />
<FormattedMessage id='suggestions.header' defaultMessage='You might be interested in…' />
</div>
{suggestions && suggestions.map(suggestion => (
<AccountContainer
key={suggestion.get('account')}
id={suggestion.get('account')}
actionIcon={suggestion.get('source') === 'past_interactions' ? 'times' : null}
actionTitle={suggestion.get('source') === 'past_interactions' ? intl.formatMessage(messages.dismissSuggestion) : null}
onActionClick={dismissSuggestion}
/>
))}
</div>
</div>
);
}
let accounts, statuses, hashtags; let accounts, statuses, hashtags;
let count = 0;
if (results.get('accounts') && results.get('accounts').size > 0) { if (results.get('accounts') && results.get('accounts').size > 0) {
count += results.get('accounts').size;
accounts = ( accounts = (
<div className='search-results__section'> <SearchSection title={<><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}>
<h5><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></h5> {withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)}
{(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
{results.get('accounts').map(accountId => <AccountContainer key={accountId} id={accountId} />)} </SearchSection>
{results.get('accounts').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
</div>
);
}
if (results.get('statuses') && results.get('statuses').size > 0) {
count += results.get('statuses').size;
statuses = (
<div className='search-results__section'>
<h5><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></h5>
{results.get('statuses').map(statusId => <StatusContainer key={statusId} id={statusId} />)}
{results.get('statuses').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
</div>
);
} else if(results.get('statuses') && results.get('statuses').size === 0 && !searchEnabled && !(searchTerm.startsWith('@') || searchTerm.startsWith('#') || searchTerm.includes(' '))) {
statuses = (
<div className='search-results__section'>
<h5><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></h5>
<div className='search-results__info'>
<FormattedMessage id='search_results.statuses_fts_disabled' defaultMessage='Searching posts by their content is not enabled on this Mastodon server.' />
</div>
</div>
); );
} }
if (results.get('hashtags') && results.get('hashtags').size > 0) { if (results.get('hashtags') && results.get('hashtags').size > 0) {
count += results.get('hashtags').size;
hashtags = ( hashtags = (
<div className='search-results__section'> <SearchSection title={<><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
<h5><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5> {withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
{(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreHashtags} />}
{results.get('hashtags').map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)} </SearchSection>
{results.get('hashtags').size >= 5 && <LoadMore visible onClick={this.handleLoadMoreHashtags} />}
</div>
); );
} }
if (results.get('statuses') && results.get('statuses').size > 0) {
statuses = (
<SearchSection title={<><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
{withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
{(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
</SearchSection>
);
}
return ( return (
<div className='search-results'> <div className='search-results'>
<div className='search-results__header'> <div className='search-results__header'>
<Icon id='search' fixedWidth /> <Icon id='search' fixedWidth />
<FormattedMessage id='search_results.total' defaultMessage='{count, plural, one {# result} other {# results}}' values={{ count }} /> <FormattedMessage id='explore.search_results' defaultMessage='Search results' />
</div> </div>
{accounts} {accounts}
{statuses}
{hashtags} {hashtags}
{statuses}
</div> </div>
); );
} }
} }
export default injectIntl(SearchResults); export default SearchResults;

View File

@ -15,7 +15,7 @@ import Search from '../components/search';
const mapStateToProps = state => ({ const mapStateToProps = state => ({
value: state.getIn(['search', 'value']), value: state.getIn(['search', 'value']),
submitted: state.getIn(['search', 'submitted']), submitted: state.getIn(['search', 'submitted']),
recent: state.getIn(['search', 'recent']), recent: state.getIn(['search', 'recent']).reverse(),
}); });
const mapDispatchToProps = dispatch => ({ const mapDispatchToProps = dispatch => ({

View File

@ -0,0 +1,20 @@
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
export const SearchSection = ({ title, onClickMore, children }) => (
<div className='search-results__section'>
<div className='search-results__section__header'>
<h3>{title}</h3>
{onClickMore && <button onClick={onClickMore}><FormattedMessage id='search_results.see_all' defaultMessage='See all' /></button>}
</div>
{children}
</div>
);
SearchSection.propTypes = {
title: PropTypes.node.isRequired,
onClickMore: PropTypes.func,
children: PropTypes.children,
};

View File

@ -9,13 +9,15 @@ import { List as ImmutableList } from 'immutable';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { expandSearch } from 'mastodon/actions/search'; import { submitSearch, expandSearch } from 'mastodon/actions/search';
import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag'; import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';
import { LoadMore } from 'mastodon/components/load_more'; import { Icon } from 'mastodon/components/icon';
import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollableList from 'mastodon/components/scrollable_list';
import Account from 'mastodon/containers/account_container'; import Account from 'mastodon/containers/account_container';
import Status from 'mastodon/containers/status_container'; import Status from 'mastodon/containers/status_container';
import { SearchSection } from './components/search_section';
const messages = defineMessages({ const messages = defineMessages({
title: { id: 'search_results.title', defaultMessage: 'Search for {q}' }, title: { id: 'search_results.title', defaultMessage: 'Search for {q}' },
}); });
@ -24,85 +26,175 @@ const mapStateToProps = state => ({
isLoading: state.getIn(['search', 'isLoading']), isLoading: state.getIn(['search', 'isLoading']),
results: state.getIn(['search', 'results']), results: state.getIn(['search', 'results']),
q: state.getIn(['search', 'searchTerm']), q: state.getIn(['search', 'searchTerm']),
submittedType: state.getIn(['search', 'type']),
}); });
const appendLoadMore = (id, list, onLoadMore) => { const INITIAL_PAGE_LIMIT = 10;
if (list.size >= 5) { const INITIAL_DISPLAY = 4;
return list.push(<LoadMore key={`${id}-load-more`} visible onClick={onLoadMore} />);
const hidePeek = list => {
if (list.size > INITIAL_PAGE_LIMIT && list.size % INITIAL_PAGE_LIMIT === 1) {
return list.skipLast(1);
} else { } else {
return list; return list;
} }
}; };
const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => ( const renderAccounts = accounts => hidePeek(accounts).map(id => (
<Account key={`account-${item}`} id={item} /> <Account key={id} id={id} />
)), onLoadMore); ));
const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => ( const renderHashtags = hashtags => hidePeek(hashtags).map(hashtag => (
<Hashtag key={`tag-${item.get('name')}`} hashtag={item} /> <Hashtag key={hashtag.get('name')} hashtag={hashtag} />
)), onLoadMore); ));
const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => ( const renderStatuses = statuses => hidePeek(statuses).map(id => (
<Status key={`status-${item}`} id={item} /> <Status key={id} id={id} />
)), onLoadMore); ));
class Results extends PureComponent { class Results extends PureComponent {
static propTypes = { static propTypes = {
results: ImmutablePropTypes.map, results: ImmutablePropTypes.contains({
accounts: ImmutablePropTypes.orderedSet,
statuses: ImmutablePropTypes.orderedSet,
hashtags: ImmutablePropTypes.orderedSet,
}),
isLoading: PropTypes.bool, isLoading: PropTypes.bool,
multiColumn: PropTypes.bool, multiColumn: PropTypes.bool,
dispatch: PropTypes.func.isRequired, dispatch: PropTypes.func.isRequired,
q: PropTypes.string, q: PropTypes.string,
intl: PropTypes.object, intl: PropTypes.object,
submittedType: PropTypes.oneOf(['accounts', 'statuses', 'hashtags']),
}; };
state = { state = {
type: 'all', type: this.props.submittedType || 'all',
}; };
handleSelectAll = () => this.setState({ type: 'all' }); static getDerivedStateFromProps(props, state) {
handleSelectAccounts = () => this.setState({ type: 'accounts' }); if (props.submittedType !== state.type) {
handleSelectHashtags = () => this.setState({ type: 'hashtags' }); return {
handleSelectStatuses = () => this.setState({ type: 'statuses' }); type: props.submittedType || 'all',
handleLoadMoreAccounts = () => this.loadMore('accounts'); };
handleLoadMoreStatuses = () => this.loadMore('statuses'); }
handleLoadMoreHashtags = () => this.loadMore('hashtags');
loadMore (type) { return null;
};
handleSelectAll = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for a specific type, we need to resubmit
// the query to get all types of results
if (submittedType) {
dispatch(submitSearch());
}
this.setState({ type: 'all' });
};
handleSelectAccounts = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'accounts') {
dispatch(submitSearch('accounts'));
}
this.setState({ type: 'accounts' });
};
handleSelectHashtags = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'hashtags') {
dispatch(submitSearch('hashtags'));
}
this.setState({ type: 'hashtags' });
}
handleSelectStatuses = () => {
const { submittedType, dispatch } = this.props;
// If we originally searched for something else (but not everything),
// we need to resubmit the query for this specific type
if (submittedType !== 'statuses') {
dispatch(submitSearch('statuses'));
}
this.setState({ type: 'statuses' });
}
handleLoadMoreAccounts = () => this._loadMore('accounts');
handleLoadMoreStatuses = () => this._loadMore('statuses');
handleLoadMoreHashtags = () => this._loadMore('hashtags');
_loadMore (type) {
const { dispatch } = this.props; const { dispatch } = this.props;
dispatch(expandSearch(type)); dispatch(expandSearch(type));
} }
handleLoadMore = () => {
const { type } = this.state;
if (type !== 'all') {
this._loadMore(type);
}
};
render () { render () {
const { intl, isLoading, q, results } = this.props; const { intl, isLoading, q, results } = this.props;
const { type } = this.state; const { type } = this.state;
let filteredResults = ImmutableList(); // We request 1 more result than we display so we can tell if there'd be a next page
const hasMore = type !== 'all' ? results.get(type, ImmutableList()).size > INITIAL_PAGE_LIMIT && results.get(type).size % INITIAL_PAGE_LIMIT === 1 : false;
let filteredResults;
if (!isLoading) { if (!isLoading) {
const accounts = results.get('accounts', ImmutableList());
const hashtags = results.get('hashtags', ImmutableList());
const statuses = results.get('statuses', ImmutableList());
switch(type) { switch(type) {
case 'all': case 'all':
filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts), renderHashtags(results, this.handleLoadMoreHashtags), renderStatuses(results, this.handleLoadMoreStatuses)); filteredResults = (accounts.size + hashtags.size + statuses.size) > 0 ? (
<>
{accounts.size > 0 && (
<SearchSection key='accounts' title={<><Icon id='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>} onClickMore={this.handleLoadMoreAccounts}>
{accounts.take(INITIAL_DISPLAY).map(id => <Account key={id} id={id} />)}
</SearchSection>
)}
{hashtags.size > 0 && (
<SearchSection key='hashtags' title={<><Icon id='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>} onClickMore={this.handleLoadMoreHashtags}>
{hashtags.take(INITIAL_DISPLAY).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
</SearchSection>
)}
{statuses.size > 0 && (
<SearchSection key='statuses' title={<><Icon id='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>} onClickMore={this.handleLoadMoreStatuses}>
{statuses.take(INITIAL_DISPLAY).map(id => <Status key={id} id={id} />)}
</SearchSection>
)}
</>
) : [];
break; break;
case 'accounts': case 'accounts':
filteredResults = filteredResults.concat(renderAccounts(results, this.handleLoadMoreAccounts)); filteredResults = renderAccounts(accounts);
break; break;
case 'hashtags': case 'hashtags':
filteredResults = filteredResults.concat(renderHashtags(results, this.handleLoadMoreHashtags)); filteredResults = renderHashtags(hashtags);
break; break;
case 'statuses': case 'statuses':
filteredResults = filteredResults.concat(renderStatuses(results, this.handleLoadMoreStatuses)); filteredResults = renderStatuses(statuses);
break; break;
} }
if (filteredResults.size === 0) {
filteredResults = (
<div className='empty-column-indicator'>
<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />
</div>
);
}
} }
return ( return (
@ -115,7 +207,16 @@ class Results extends PureComponent {
</div> </div>
<div className='explore__search-results'> <div className='explore__search-results'>
{isLoading ? <LoadingIndicator /> : filteredResults} <ScrollableList
scrollKey='search-results'
isLoading={isLoading}
onLoadMore={this.handleLoadMore}
hasMore={hasMore}
emptyMessage={<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />}
bindToDocument
>
{filteredResults}
</ScrollableList>
</div> </div>
<Helmet> <Helmet>

View File

@ -100,8 +100,41 @@ class LoginForm extends React.PureComponent {
this.input = c; this.input = c;
}; };
isValueValid = (value) => {
let likelyAcct = false;
let url = null;
if (value.startsWith('/')) {
return false;
}
if (value.startsWith('@')) {
value = value.slice(1);
likelyAcct = true;
}
// The user is in the middle of typing something, do not error out
if (value === '') {
return true;
}
if (/^https?:\/\//.test(value) && !likelyAcct) {
url = value;
} else {
url = `https://${value}`;
}
try {
new URL(url);
return true;
} catch(_) {
return false;
}
};
handleChange = ({ target }) => { handleChange = ({ target }) => {
this.setState(state => ({ value: target.value, isLoading: true, error: false, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions()); const error = !this.isValueValid(target.value);
this.setState(state => ({ error, value: target.value, isLoading: true, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions());
}; };
handleMessage = (event) => { handleMessage = (event) => {
@ -115,11 +148,18 @@ class LoginForm extends React.PureComponent {
this.setState({ isSubmitting: false, error: true }); this.setState({ isSubmitting: false, error: true });
} else if (event.data?.type === 'fetchInteractionURL-success') { } else if (event.data?.type === 'fetchInteractionURL-success') {
if (/^https?:\/\//.test(event.data.template)) { if (/^https?:\/\//.test(event.data.template)) {
try {
const url = new URL(event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)));
if (localStorage) { if (localStorage) {
localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain); localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain);
} }
window.location.href = event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)); window.location.href = url;
} catch (e) {
console.error(e);
this.setState({ isSubmitting: false, error: true });
}
} else { } else {
this.setState({ isSubmitting: false, error: true }); this.setState({ isSubmitting: false, error: true });
} }
@ -259,7 +299,7 @@ class LoginForm extends React.PureComponent {
spellcheck='false' spellcheck='false'
/> />
<Button onClick={this.handleSubmit} disabled={isSubmitting}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button> <Button onClick={this.handleSubmit} disabled={isSubmitting || error}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
</div> </div>
{hasPopOut && ( {hasPopOut && (

View File

@ -194,7 +194,7 @@ class Footer extends ImmutablePureComponent {
return ( return (
<div className='picture-in-picture__footer'> <div className='picture-in-picture__footer'>
<IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount /> <IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} />
<IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} /> <IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} />
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} /> <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} />
{withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} />} {withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} />}

View File

@ -217,8 +217,9 @@ class Video extends PureComponent {
const { x } = getPointerPosition(this.volume, e); const { x } = getPointerPosition(this.volume, e);
if(!isNaN(x)) { if(!isNaN(x)) {
this.setState({ volume: x }, () => { this.setState((state) => ({ volume: x, muted: state.muted && x === 0 }), () => {
this.video.volume = x; this.video.volume = x;
this.video.muted = this.state.muted;
}); });
} }
}, 15); }, 15);
@ -425,10 +426,11 @@ class Video extends PureComponent {
}; };
toggleMute = () => { toggleMute = () => {
const muted = !this.video.muted; const muted = !(this.video.muted || this.state.volume === 0);
this.setState({ muted }, () => { this.setState((state) => ({ muted, volume: Math.max(state.volume || 0.5, 0.05) }), () => {
this.video.muted = muted; this.video.volume = this.state.volume;
this.video.muted = this.state.muted;
}); });
}; };
@ -501,8 +503,9 @@ class Video extends PureComponent {
render () { render () {
const { preview, src, aspectRatio, onOpenVideo, onCloseVideo, intl, alt, lang, detailed, sensitive, editable, blurhash, autoFocus } = this.props; const { preview, src, aspectRatio, onOpenVideo, onCloseVideo, intl, alt, lang, detailed, sensitive, editable, blurhash, autoFocus } = this.props;
const { currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const { currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, revealed } = this.state;
const progress = Math.min((currentTime / duration) * 100, 100); const progress = Math.min((currentTime / duration) * 100, 100);
const muted = this.state.muted || volume === 0;
let preload; let preload;
@ -593,12 +596,12 @@ class Video extends PureComponent {
<button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button> <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
<div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}> <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
<div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} /> <div className='video-player__volume__current' style={{ width: `${muted ? 0 : volume * 100}%` }} />
<span <span
className={classNames('video-player__volume__handle')} className={classNames('video-player__volume__handle')}
tabIndex={0} tabIndex={0}
style={{ left: `${volume * 100}%` }} style={{ left: `${muted ? 0 : volume * 100}%` }}
/> />
</div> </div>

View File

@ -282,9 +282,7 @@
"search_results.hashtags": "Hutsetiket", "search_results.hashtags": "Hutsetiket",
"search_results.nothing_found": "Hierdie soekwoorde lewer niks op nie", "search_results.nothing_found": "Hierdie soekwoorde lewer niks op nie",
"search_results.statuses": "Plasings", "search_results.statuses": "Plasings",
"search_results.statuses_fts_disabled": "Hierdie Mastodonbediener is nie opgestel om soekwoorde in plasings te kan vind nie.",
"search_results.title": "Soek {q}", "search_results.title": "Soek {q}",
"search_results.total": "{count, number} {count, plural, one {resultaat} other {resultate}}",
"server_banner.administered_by": "Administrasie deur:", "server_banner.administered_by": "Administrasie deur:",
"sign_in_banner.sign_in": "Sign in", "sign_in_banner.sign_in": "Sign in",
"status.admin_status": "Open hierdie plasing as moderator", "status.admin_status": "Open hierdie plasing as moderator",

View File

@ -504,9 +504,7 @@
"search_results.hashtags": "Etiquetas", "search_results.hashtags": "Etiquetas",
"search_results.nothing_found": "No se podió trobar cosa pa estes termins de busqueda", "search_results.nothing_found": "No se podió trobar cosa pa estes termins de busqueda",
"search_results.statuses": "Publicacions", "search_results.statuses": "Publicacions",
"search_results.statuses_fts_disabled": "Buscar publicacions per lo suyo conteniu no ye disponible en este servidor de Mastodon.",
"search_results.title": "Buscar {q}", "search_results.title": "Buscar {q}",
"search_results.total": "{count, number} {count, plural, one {resultau} other {resultaus}}",
"server_banner.about_active_users": "Usuarios activos en o servidor entre los zaguers 30 días (Usuarios Activos Mensuals)", "server_banner.about_active_users": "Usuarios activos en o servidor entre los zaguers 30 días (Usuarios Activos Mensuals)",
"server_banner.active_users": "usuarios activos", "server_banner.active_users": "usuarios activos",
"server_banner.administered_by": "Administrau per:", "server_banner.administered_by": "Administrau per:",
@ -570,8 +568,6 @@
"subscribed_languages.lead": "Nomás los mensaches en os idiomas triaus amaneixerán en o suyo inicio y atras linias de tiempo dimpués d'o cambio. Tríe garra pa recibir mensaches en totz los idiomas.", "subscribed_languages.lead": "Nomás los mensaches en os idiomas triaus amaneixerán en o suyo inicio y atras linias de tiempo dimpués d'o cambio. Tríe garra pa recibir mensaches en totz los idiomas.",
"subscribed_languages.save": "Alzar cambios", "subscribed_languages.save": "Alzar cambios",
"subscribed_languages.target": "Cambiar idiomas suscritos pa {target}", "subscribed_languages.target": "Cambiar idiomas suscritos pa {target}",
"suggestions.dismiss": "Descartar sucherencia",
"suggestions.header": "Ye posible que t'intrese…",
"tabs_bar.home": "Inicio", "tabs_bar.home": "Inicio",
"tabs_bar.notifications": "Notificacions", "tabs_bar.notifications": "Notificacions",
"time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}", "time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}",

View File

@ -27,7 +27,7 @@
"account.edit_profile": "تعديل الملف الشخصي", "account.edit_profile": "تعديل الملف الشخصي",
"account.enable_notifications": "أشعرني عندما ينشر @{name}", "account.enable_notifications": "أشعرني عندما ينشر @{name}",
"account.endorse": "أوصِ به على صفحتك الشخصية", "account.endorse": "أوصِ به على صفحتك الشخصية",
"account.featured_tags.last_status_at": "آخر مشاركة في {date}", "account.featured_tags.last_status_at": "آخر منشور في {date}",
"account.featured_tags.last_status_never": "لا توجد رسائل", "account.featured_tags.last_status_never": "لا توجد رسائل",
"account.featured_tags.title": "وسوم {name} المميَّزة", "account.featured_tags.title": "وسوم {name} المميَّزة",
"account.follow": "متابعة", "account.follow": "متابعة",
@ -35,11 +35,11 @@
"account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.", "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
"account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}", "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
"account.following": "الاشتراكات", "account.following": "الاشتراكات",
"account.following_counter": "{count, plural, zero{لا يُتابِع} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}", "account.following_counter": "{count, plural, zero{لا يُتابِع أحدًا} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.", "account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
"account.follows_you": "يُتابِعُك", "account.follows_you": "يُتابِعُك",
"account.go_to_profile": "اذهب إلى الملف الشخصي", "account.go_to_profile": "اذهب إلى الملف الشخصي",
"account.hide_reblogs": "إخفاء مشاركات @{name}", "account.hide_reblogs": "إخفاء المعاد نشرها مِن @{name}",
"account.in_memoriam": "في الذكرى.", "account.in_memoriam": "في الذكرى.",
"account.joined_short": "انضم في", "account.joined_short": "انضم في",
"account.languages": "تغيير اللغات المشترَك فيها", "account.languages": "تغيير اللغات المشترَك فيها",
@ -60,7 +60,7 @@
"account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة", "account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة",
"account.requested_follow": "لقد طلب {name} متابعتك", "account.requested_follow": "لقد طلب {name} متابعتك",
"account.share": "شارِك الملف التعريفي لـ @{name}", "account.share": "شارِك الملف التعريفي لـ @{name}",
"account.show_reblogs": "عرض مشاركات @{name}", "account.show_reblogs": "اعرض إعادات نشر @{name}",
"account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}", "account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
"account.unblock": "إلغاء الحَظر عن @{name}", "account.unblock": "إلغاء الحَظر عن @{name}",
"account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}", "account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}",
@ -77,11 +77,11 @@
"admin.dashboard.retention.cohort": "شهر التسجيل", "admin.dashboard.retention.cohort": "شهر التسجيل",
"admin.dashboard.retention.cohort_size": "المستخدمون الجدد", "admin.dashboard.retention.cohort_size": "المستخدمون الجدد",
"admin.impact_report.instance_accounts": "ملفات حسابات سوف يتم حذفها", "admin.impact_report.instance_accounts": "ملفات حسابات سوف يتم حذفها",
"admin.impact_report.instance_followers": "المتابعون الذين سوف يخسرهم مستخدمونا", "admin.impact_report.instance_followers": "المتابِعون الذين سوف يخسرهم مستخدمونا",
"admin.impact_report.instance_follows": "المتابعون الذين سوف يخسرهم مستخدموهم", "admin.impact_report.instance_follows": "المتابِعون الذين سوف يخسرهم مستخدموهم",
"admin.impact_report.title": "موجز التأثير", "admin.impact_report.title": "موجز التأثير",
"alert.rate_limited.message": "يُرجى إعادة المحاولة بعد {retry_time, time, medium}.", "alert.rate_limited.message": "يُرجى إعادة المحاولة بعد {retry_time, time, medium}.",
"alert.rate_limited.title": "المُعَدَّل مَحدود", "alert.rate_limited.title": "معدل الطلبات محدود",
"alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.", "alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.",
"alert.unexpected.title": "المعذرة!", "alert.unexpected.title": "المعذرة!",
"announcement.announcement": "إعلان", "announcement.announcement": "إعلان",
@ -96,7 +96,7 @@
"bundle_column_error.network.title": "خطأ في الشبكة", "bundle_column_error.network.title": "خطأ في الشبكة",
"bundle_column_error.retry": "إعادة المُحاولة", "bundle_column_error.retry": "إعادة المُحاولة",
"bundle_column_error.return": "العودة إلى الرئيسية", "bundle_column_error.return": "العودة إلى الرئيسية",
"bundle_column_error.routing.body": "تعذر العثور على الصفحة المطلوبة. هل أنت متأكد من أنّ عنوان URL في شريط العناوين صحيح؟", "bundle_column_error.routing.body": "تعذر العثور على الصفحة المطلوبة. هل أنت متأكد من أنّ الرابط التشعبي URL في شريط العناوين صحيح؟",
"bundle_column_error.routing.title": "404", "bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "إغلاق", "bundle_modal_error.close": "إغلاق",
"bundle_modal_error.message": "لقد حدث خطأ ما أثناء تحميل هذا العنصر.", "bundle_modal_error.message": "لقد حدث خطأ ما أثناء تحميل هذا العنصر.",
@ -113,8 +113,8 @@
"column.direct": "الإشارات الخاصة", "column.direct": "الإشارات الخاصة",
"column.directory": "تَصَفُّحُ المَلفات الشخصية", "column.directory": "تَصَفُّحُ المَلفات الشخصية",
"column.domain_blocks": "النطاقات المحظورة", "column.domain_blocks": "النطاقات المحظورة",
"column.favourites": "Favorites", "column.favourites": "المفضلة",
"column.firehose": "التغذيات المباشرة", "column.firehose": "الموجزات الحية",
"column.follow_requests": "طلبات المتابعة", "column.follow_requests": "طلبات المتابعة",
"column.home": "الرئيسية", "column.home": "الرئيسية",
"column.lists": "القوائم", "column.lists": "القوائم",
@ -135,10 +135,11 @@
"community.column_settings.remote_only": "عن بُعد فقط", "community.column_settings.remote_only": "عن بُعد فقط",
"compose.language.change": "تغيير اللغة", "compose.language.change": "تغيير اللغة",
"compose.language.search": "البحث عن لغة…", "compose.language.search": "البحث عن لغة…",
"compose.published.body": "تم نشر المنشور.", "compose.published.body": "نُشِرَ المنشور.",
"compose.published.open": "فتح", "compose.published.open": "افتحه",
"compose.saved.body": "تم حفظ المنشور.",
"compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد", "compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
"compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.", "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من الطرف إلى نهاية الطرف. لذا، لا تشارك أي معلومات حساسة عبر ماستدون.",
"compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير منشور للعامة. إلّا الرسائل المنشورة للعامة يُمكن البحث عنها بواسطة وسم.", "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير منشور للعامة. إلّا الرسائل المنشورة للعامة يُمكن البحث عنها بواسطة وسم.",
"compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).", "compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
"compose_form.lock_disclaimer.lock": "مُقفَل", "compose_form.lock_disclaimer.lock": "مُقفَل",
@ -150,27 +151,27 @@
"compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة", "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
"compose_form.publish": "نشر", "compose_form.publish": "نشر",
"compose_form.publish_form": "انشر", "compose_form.publish_form": "منشور جديد",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "احفظ التعديلات", "compose_form.save_changes": "احفظ التعديلات",
"compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}", "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}", "compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}", "compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.spoiler.marked": "إزالة تحذير المحتوى", "compose_form.spoiler.marked": "إزالة تحذير المحتوى",
"compose_form.spoiler.unmarked": نَّ النص غير مخفي", "compose_form.spoiler.unmarked": ضافة تحذير للمحتوى",
"compose_form.spoiler_placeholder": "اُكتُب تحذيركَ هُنا", "compose_form.spoiler_placeholder": "اُكتُب تحذيركَ هُنا",
"confirmation_modal.cancel": "إلغاء", "confirmation_modal.cancel": "إلغاء",
"confirmations.block.block_and_report": "حظره والإبلاغ عنه", "confirmations.block.block_and_report": "حظره والإبلاغ عنه",
"confirmations.block.confirm": "حظر", "confirmations.block.confirm": "حظر",
"confirmations.block.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَظرَ {name}؟", "confirmations.block.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَظرَ {name}؟",
"confirmations.cancel_follow_request.confirm": "إلغاء الطلب", "confirmations.cancel_follow_request.confirm": "إلغاء الطلب",
"confirmations.cancel_follow_request.message": "متأكد من إلغاء طلب متابعة {name}؟", "confirmations.cancel_follow_request.message": "متأكد من أنك تريد إلغاء طلب متابعتك لـ {name}؟",
"confirmations.delete.confirm": "حذف", "confirmations.delete.confirm": "حذف",
"confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟", "confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟",
"confirmations.delete_list.confirm": "حذف", "confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟", "confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟",
"confirmations.discard_edit_media.confirm": "تجاهل", "confirmations.discard_edit_media.confirm": "تجاهل",
"confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، تجاهلها على أي حال؟", "confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟",
"confirmations.domain_block.confirm": "حظر اِسم النِّطاق بشكلٍ كامل", "confirmations.domain_block.confirm": "حظر اِسم النِّطاق بشكلٍ كامل",
"confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.", "confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.",
"confirmations.edit.confirm": "تعديل", "confirmations.edit.confirm": "تعديل",
@ -198,11 +199,11 @@
"directory.recently_active": "نشط مؤخرا", "directory.recently_active": "نشط مؤخرا",
"disabled_account_banner.account_settings": "إعدادات الحساب", "disabled_account_banner.account_settings": "إعدادات الحساب",
"disabled_account_banner.text": "حسابك {disabledAccount} معطل حاليا.", "disabled_account_banner.text": "حسابك {disabledAccount} معطل حاليا.",
"dismissable_banner.community_timeline": "هذه هي أحدث المشاركات العامة من الأشخاص الذين تُستضاف حساباتهم على {domain}.", "dismissable_banner.community_timeline": "هذه هي أحدث المنشورات العامة من أشخاص تُستضاف حساباتهم على {domain}.",
"dismissable_banner.dismiss": "رفض", "dismissable_banner.dismiss": "رفض",
"dismissable_banner.explore_links": "هذه القصص الإخبارية يتحدث عنها حاليًا أشخاص على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.", "dismissable_banner.explore_links": "هذه هي القصص الإخبارية الأكثر مشاركة على الشبكة الاجتماعية اليوم. القصص الإخبارية الأحدث التي تنشرها أشخاص مختلفة هي مصنفة في الأعلى.",
"dismissable_banner.explore_statuses": "هذه هي المنشورات الرائجة على الشبكات الاجتماعيّة اليوم. تظهر المنشورات التي أعيد مشاركتها وحازت على مفضّلات أكثر في مرتبة عليا.", "dismissable_banner.explore_statuses": "هذه هي المنشورات الرائجة على الشبكات الاجتماعيّة اليوم. تظهر المنشورات المعاد نشرها والحائزة على مفضّلات أكثر في مرتبة عليا.",
"dismissable_banner.explore_tags": "هذه الوسوم تكتسب جذب اهتمام الناس حاليًا على هذا الخادم وكذا على الخوادم الأخرى للشبكة اللامركزية.", "dismissable_banner.explore_tags": "هذه هي الوسوم تكتسب جذب الاهتمام حاليًا على الويب الاجتماعي. الوسوم التي يستخدمها مختلف الناس تحتل مرتبة عليا.",
"dismissable_banner.public_timeline": "هذه هي أحدث المنشورات العامة من الناس على الشبكة الاجتماعية التي يتبعها الناس على {domain}.", "dismissable_banner.public_timeline": "هذه هي أحدث المنشورات العامة من الناس على الشبكة الاجتماعية التي يتبعها الناس على {domain}.",
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
"embed.preview": "إليك ما سيبدو عليه:", "embed.preview": "إليك ما سيبدو عليه:",
@ -226,7 +227,7 @@
"empty_column.account_unavailable": "الملف التعريفي غير متوفر", "empty_column.account_unavailable": "الملف التعريفي غير متوفر",
"empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.", "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
"empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.", "empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.",
"empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!", "empty_column.community": "الخيط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
"empty_column.direct": "لم يتم الإشارة إليك بشكل خاص بعد. عندما تتلقى أو ترسل إشارة، سيتم عرضها هنا.", "empty_column.direct": "لم يتم الإشارة إليك بشكل خاص بعد. عندما تتلقى أو ترسل إشارة، سيتم عرضها هنا.",
"empty_column.domain_blocks": "ليس هناك نطاقات تم حجبها بعد.", "empty_column.domain_blocks": "ليس هناك نطاقات تم حجبها بعد.",
"empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!", "empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!",
@ -235,9 +236,9 @@
"empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.", "empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.",
"empty_column.followed_tags": "لم تُتابع أي وسم بعدُ. ستظهر الوسوم هنا حينما تفعل ذلك.", "empty_column.followed_tags": "لم تُتابع أي وسم بعدُ. ستظهر الوسوم هنا حينما تفعل ذلك.",
"empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.", "empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
"empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.", "empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسة فارغ. قم بمتابعة المزيد من الناس كي يمتلأ.",
"empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر منشورات.", "empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر منشورات.",
"empty_column.lists": "ليس عندك أية قائمة بعد. سوف تظهر قائمتك هنا إن قمت بإنشاء واحدة.", "empty_column.lists": "ليس عندك أية قائمة بعد. سوف تظهر قوائمك هنا إن قمت بإنشاء واحدة.",
"empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.", "empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.",
"empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.", "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
"empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات", "empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات",
@ -250,7 +251,7 @@
"explore.search_results": "نتائج البحث", "explore.search_results": "نتائج البحث",
"explore.suggested_follows": "أشخاص", "explore.suggested_follows": "أشخاص",
"explore.title": "استكشف", "explore.title": "استكشف",
"explore.trending_links": "الأخبار", "explore.trending_links": "المُستجدّات",
"explore.trending_statuses": "المنشورات", "explore.trending_statuses": "المنشورات",
"explore.trending_tags": "وُسُوم", "explore.trending_tags": "وُسُوم",
"filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.", "filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.",
@ -266,7 +267,7 @@
"filter_modal.select_filter.expired": "منتهية الصلاحيّة", "filter_modal.select_filter.expired": "منتهية الصلاحيّة",
"filter_modal.select_filter.prompt_new": "فئة جديدة: {name}", "filter_modal.select_filter.prompt_new": "فئة جديدة: {name}",
"filter_modal.select_filter.search": "البحث أو الإنشاء", "filter_modal.select_filter.search": "البحث أو الإنشاء",
"filter_modal.select_filter.subtitle": "استخدام فئة موجودة أو إنشاء فئة جديدة", "filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة",
"filter_modal.select_filter.title": "تصفية هذا المنشور", "filter_modal.select_filter.title": "تصفية هذا المنشور",
"filter_modal.title.status": "تصفية منشور", "filter_modal.title.status": "تصفية منشور",
"firehose.all": "الكل", "firehose.all": "الكل",
@ -274,9 +275,9 @@
"firehose.remote": "خوادم أخرى", "firehose.remote": "خوادم أخرى",
"follow_request.authorize": "ترخيص", "follow_request.authorize": "ترخيص",
"follow_request.reject": "رفض", "follow_request.reject": "رفض",
"follow_requests.unlocked_explanation": "على الرغم من أن حسابك غير مقفل، فإن موظفين الـ{domain} ظنوا أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.", "follow_requests.unlocked_explanation": "حتى وإن كان حسابك غير مقفل، يعتقد فريق {domain} أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.",
"followed_tags": "الوسوم المتابَعة", "followed_tags": "الوسوم المتابَعة",
"footer.about": "حَول", "footer.about": "عن",
"footer.directory": "دليل الصفحات التعريفية", "footer.directory": "دليل الصفحات التعريفية",
"footer.get_app": "احصل على التطبيق", "footer.get_app": "احصل على التطبيق",
"footer.invite": "دعوة أشخاص", "footer.invite": "دعوة أشخاص",
@ -295,19 +296,26 @@
"hashtag.column_settings.tag_mode.any": "أي كان مِن هذه", "hashtag.column_settings.tag_mode.any": "أي كان مِن هذه",
"hashtag.column_settings.tag_mode.none": "لا شيء مِن هذه", "hashtag.column_settings.tag_mode.none": "لا شيء مِن هذه",
"hashtag.column_settings.tag_toggle": "إدراج الوسوم الإضافية لهذا العمود", "hashtag.column_settings.tag_toggle": "إدراج الوسوم الإضافية لهذا العمود",
"hashtag.counter_by_accounts": "{count, plural, zero {لَا مُشارك} one {مُشارَك واحد} two {مُشارِكان إثنان} few {{counter} مشاركين} many {{counter} مُشاركًا} other {{counter} مُشارِك}}",
"hashtag.counter_by_uses": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
"hashtag.counter_by_uses_today": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
"hashtag.follow": "اتبع الوسم", "hashtag.follow": "اتبع الوسم",
"hashtag.unfollow": "ألغِ متابعة الوسم", "hashtag.unfollow": "ألغِ متابعة الوسم",
"home.actions.go_to_explore": "اطّلع على الرائج حاليا", "hashtags.and_other": "…و {count, plural, zero {} one {# واحد آخر} two {# اثنان آخران} few {# آخرون} many {# آخَرًا}other {# آخرون}}",
"home.actions.go_to_explore": "اطّلع على ما هو رائج حاليا",
"home.actions.go_to_suggestions": "ابحث عن أشخاص لِمُتابعتهم", "home.actions.go_to_suggestions": "ابحث عن أشخاص لِمُتابعتهم",
"home.column_settings.basic": "الأساسية", "home.column_settings.basic": "الأساسية",
"home.column_settings.show_reblogs": "اعرض الترقيات", "home.column_settings.show_reblogs": "اعرض المعاد نشرها",
"home.column_settings.show_replies": "اعرض الردود", "home.column_settings.show_replies": "اعرض الردود",
"home.explore_prompt.body": "سوف يحتوي خيط أخبارك الرئيسي على مزيج من المشاركات من الوسوم التي اخترت متابعتها، والأشخاص الذين اخترت متابعتهم، والمنشورات التي قاموا بدعمها. ومع ذلك، إن كانت تبدو الأمور هادئة جدا، ماذا لو:", "home.explore_prompt.body": "سوف يحتوي خيط أخبارك الرئيسي على مزيج من المنشورات مِنها التي تحتوي على وسوم اخترتَ متابعتها، وأشخاص اخترتَ متابعتهم والمنشورات التي أعادوا نشرها. ومع ذلك، إن لا زال خيط أخبارك يبدو هادئا جدا، ماذا لو:",
"home.explore_prompt.title": "هذا مقرك الرئيسي داخل ماستدون.", "home.explore_prompt.title": "هذه هي صفحتك الرئيسة في ماستدون.",
"home.hide_announcements": "إخفاء الإعلانات", "home.hide_announcements": "إخفاء الإعلانات",
"home.pending_critical_update.body": "يرجى تحديث خادم ماستدون في أقرب وقت ممكن!",
"home.pending_critical_update.link": "اطّلع على التحديثات",
"home.pending_critical_update.title": "تحديث أمان حرج متوفر!",
"home.show_announcements": "إظهار الإعلانات", "home.show_announcements": "إظهار الإعلانات",
"interaction_modal.description.favourite": "بفضل حساب على ماستدون، يمكنك إضافة هذا المنشور إلى مفضلتك لإبلاغ الناشر عن تقديرك وكذا للاحتفاظ بالمنشور إلى وقت لاحق.", "interaction_modal.description.favourite": "بفضل حساب على ماستدون، يمكنك إضافة هذا المنشور إلى مفضلتك لإبلاغ الناشر عن تقديرك وكذا للاحتفاظ بالمنشور إلى وقت لاحق.",
"interaction_modal.description.follow": "مع حساب في ماستدون، يمكنك متابعة {name} وتلقي منشوراته على خيطك الرئيس.", "interaction_modal.description.follow": "بفضل حساب في ماستدون، يمكنك متابعة {name} وتلقي منشوراته في موجزات خيطك الرئيس.",
"interaction_modal.description.reblog": "مع حساب في ماستدون، يمكنك تعزيز هذا المنشور ومشاركته مع مُتابِعيك.", "interaction_modal.description.reblog": "مع حساب في ماستدون، يمكنك تعزيز هذا المنشور ومشاركته مع مُتابِعيك.",
"interaction_modal.description.reply": "مع حساب في ماستدون، يمكنك الرد على هذا المنشور.", "interaction_modal.description.reply": "مع حساب في ماستدون، يمكنك الرد على هذا المنشور.",
"interaction_modal.login.action": "خذني إلى خادمي", "interaction_modal.login.action": "خذني إلى خادمي",
@ -316,27 +324,27 @@
"interaction_modal.on_another_server": "على خادم مختلف", "interaction_modal.on_another_server": "على خادم مختلف",
"interaction_modal.on_this_server": "على هذا الخادم", "interaction_modal.on_this_server": "على هذا الخادم",
"interaction_modal.sign_in": "لم تقم بتسجيل الدخول إلى هذا الخادم. أين هو مستضاف حسابك؟", "interaction_modal.sign_in": "لم تقم بتسجيل الدخول إلى هذا الخادم. أين هو مستضاف حسابك؟",
"interaction_modal.sign_in_hint": "تلميح: هذا هو الموقع الذي سجّلت عن طريقه. إن لم تتذكّر/ين اسم الموقع، يمكنك البحث عن الرسالة الترحيبيّة في بريدك الالكتروني. يمكنك أيضاً استخدام إسم المستخدم/ـة الكامل! (مثلاً: @Mastadon@mastadon.social)", "interaction_modal.sign_in_hint": "تلميح: هذا هو الموقع الذي أنشأت فيه حسابك. إن لم تتذكّر/ين اسم الموقع، يمكنك البحث عن الرسالة الترحيبيّة في بريدك الإلكتروني. كما يمكنك أيضاً استخدام اسم المستخدم/ـة الكامل! (مثلاً: @Mastodon@mastodon.social)",
"interaction_modal.title.favourite": "إضافة منشور {name} إلى المفضلة", "interaction_modal.title.favourite": "إضافة منشور {name} إلى المفضلة",
"interaction_modal.title.follow": "اتبع {name}", "interaction_modal.title.follow": "اتبع {name}",
"interaction_modal.title.reblog": "مشاركة منشور {name}", "interaction_modal.title.reblog": "إعادة نشر منشور {name}",
"interaction_modal.title.reply": "الرد على منشور {name}", "interaction_modal.title.reply": "الرد على منشور {name}",
"intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}", "intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}",
"intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}", "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}",
"intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}", "intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}",
"keyboard_shortcuts.back": "للعودة", "keyboard_shortcuts.back": "للعودة",
"keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين", "keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين",
"keyboard_shortcuts.boost": لترقية", "keyboard_shortcuts.boost": إعادة النشر",
"keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة", "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة",
"keyboard_shortcuts.compose": "للتركيز على نافذة تحرير النصوص", "keyboard_shortcuts.compose": "للتركيز على نافذة تحرير النصوص",
"keyboard_shortcuts.description": "الوصف", "keyboard_shortcuts.description": "الوصف",
"keyboard_shortcuts.direct": "to open direct messages column", "keyboard_shortcuts.direct": "لفتح عمود الإشارات الخاصة",
"keyboard_shortcuts.down": "للانتقال إلى أسفل القائمة", "keyboard_shortcuts.down": "للانتقال إلى أسفل القائمة",
"keyboard_shortcuts.enter": "لفتح المنشور", "keyboard_shortcuts.enter": "لفتح المنشور",
"keyboard_shortcuts.favourite": "لإضافة المنشور إلى المفضلة", "keyboard_shortcuts.favourite": "لإضافة المنشور إلى المفضلة",
"keyboard_shortcuts.favourites": "لفتح قائمة المفضلات", "keyboard_shortcuts.favourites": "لفتح قائمة المفضلات",
"keyboard_shortcuts.federated": "لفتح الخيط الزمني الفديرالي", "keyboard_shortcuts.federated": "لفتح الخيط الزمني الفديرالي",
"keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.heading": "اختصارات لوحة المفاتيح",
"keyboard_shortcuts.home": "لفتح الخيط الرئيسي", "keyboard_shortcuts.home": "لفتح الخيط الرئيسي",
"keyboard_shortcuts.hotkey": "مفتاح الاختصار", "keyboard_shortcuts.hotkey": "مفتاح الاختصار",
"keyboard_shortcuts.legend": "لعرض هذا المفتاح", "keyboard_shortcuts.legend": "لعرض هذا المفتاح",
@ -371,10 +379,10 @@
"lists.delete": "احذف القائمة", "lists.delete": "احذف القائمة",
"lists.edit": "عدّل القائمة", "lists.edit": "عدّل القائمة",
"lists.edit.submit": "تعديل العنوان", "lists.edit.submit": "تعديل العنوان",
"lists.exclusive": "إخفاء هذه المشاركات من الصفحة الرئيسية", "lists.exclusive": "إخفاء هذه المنشورات من الخيط الرئيسي",
"lists.new.create": نشاء قائمة", "lists.new.create": ضافة قائمة",
"lists.new.title_placeholder": "عنوان القائمة الجديدة", "lists.new.title_placeholder": "عنوان القائمة الجديدة",
"lists.replies_policy.followed": "أي مستخدم متابِع", "lists.replies_policy.followed": "أي مستخدم متابَع",
"lists.replies_policy.list": "أعضاء القائمة", "lists.replies_policy.list": "أعضاء القائمة",
"lists.replies_policy.none": "لا أحد", "lists.replies_policy.none": "لا أحد",
"lists.replies_policy.title": "عرض الردود لـ:", "lists.replies_policy.title": "عرض الردود لـ:",
@ -402,10 +410,11 @@
"navigation_bar.filters": "الكلمات المكتومة", "navigation_bar.filters": "الكلمات المكتومة",
"navigation_bar.follow_requests": "طلبات المتابعة", "navigation_bar.follow_requests": "طلبات المتابعة",
"navigation_bar.followed_tags": "الوسوم المتابَعة", "navigation_bar.followed_tags": "الوسوم المتابَعة",
"navigation_bar.follows_and_followers": "المتابِعين والمتابَعون", "navigation_bar.follows_and_followers": "المتابِعون والمتابَعون",
"navigation_bar.lists": "القوائم", "navigation_bar.lists": "القوائم",
"navigation_bar.logout": "خروج", "navigation_bar.logout": "خروج",
"navigation_bar.mutes": "الحسابات المكتومة", "navigation_bar.mutes": "الحسابات المكتومة",
"navigation_bar.opened_in_classic_interface": "تُفتَح المنشورات والحسابات وغيرها من الصفحات الخاصة بشكل مبدئي على واجهة الويب التقليدية.",
"navigation_bar.personal": "شخصي", "navigation_bar.personal": "شخصي",
"navigation_bar.pins": "المنشورات المُثَبَّتَة", "navigation_bar.pins": "المنشورات المُثَبَّتَة",
"navigation_bar.preferences": "التفضيلات", "navigation_bar.preferences": "التفضيلات",
@ -416,7 +425,7 @@
"notification.admin.report": "{name} أبلغ عن {target}", "notification.admin.report": "{name} أبلغ عن {target}",
"notification.admin.sign_up": "أنشأ {name} حسابًا", "notification.admin.sign_up": "أنشأ {name} حسابًا",
"notification.favourite": "أضاف {name} منشورك إلى مفضلته", "notification.favourite": "أضاف {name} منشورك إلى مفضلته",
"notification.follow": "{name} يتابعك", "notification.follow": "يتابعك {name}",
"notification.follow_request": "لقد طلب {name} متابعتك", "notification.follow_request": "لقد طلب {name} متابعتك",
"notification.mention": "{name} ذكرك", "notification.mention": "{name} ذكرك",
"notification.own_poll": "انتهى استطلاعك للرأي", "notification.own_poll": "انتهى استطلاعك للرأي",
@ -426,7 +435,7 @@
"notification.update": "عدّلَ {name} منشورًا", "notification.update": "عدّلَ {name} منشورًا",
"notifications.clear": "مسح الإشعارات", "notifications.clear": "مسح الإشعارات",
"notifications.clear_confirmation": "متأكد من أنك تود مسح جميع الإشعارات الخاصة بك و المتلقاة إلى حد الآن ؟", "notifications.clear_confirmation": "متأكد من أنك تود مسح جميع الإشعارات الخاصة بك و المتلقاة إلى حد الآن ؟",
"notifications.column_settings.admin.report": "التقارير الجديدة:", "notifications.column_settings.admin.report": "التبليغات الجديدة:",
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:", "notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
"notifications.column_settings.alert": "إشعارات سطح المكتب", "notifications.column_settings.alert": "إشعارات سطح المكتب",
"notifications.column_settings.favourite": "المفضلة:", "notifications.column_settings.favourite": "المفضلة:",
@ -438,7 +447,7 @@
"notifications.column_settings.mention": "الإشارات:", "notifications.column_settings.mention": "الإشارات:",
"notifications.column_settings.poll": "نتائج استطلاع الرأي:", "notifications.column_settings.poll": "نتائج استطلاع الرأي:",
"notifications.column_settings.push": "الإشعارات", "notifications.column_settings.push": "الإشعارات",
"notifications.column_settings.reblog": "الترقيّات:", "notifications.column_settings.reblog": "المعاد نشرها:",
"notifications.column_settings.show": "اعرِضها في عمود", "notifications.column_settings.show": "اعرِضها في عمود",
"notifications.column_settings.sound": "أصدر صوتا", "notifications.column_settings.sound": "أصدر صوتا",
"notifications.column_settings.status": "منشورات جديدة:", "notifications.column_settings.status": "منشورات جديدة:",
@ -446,7 +455,7 @@
"notifications.column_settings.unread_notifications.highlight": "علّم الإشعارات غير المقرؤة", "notifications.column_settings.unread_notifications.highlight": "علّم الإشعارات غير المقرؤة",
"notifications.column_settings.update": "التعديلات:", "notifications.column_settings.update": "التعديلات:",
"notifications.filter.all": "الكل", "notifications.filter.all": "الكل",
"notifications.filter.boosts": "الترقيات", "notifications.filter.boosts": "المعاد نشرها",
"notifications.filter.favourites": "المفضلة", "notifications.filter.favourites": "المفضلة",
"notifications.filter.follows": "يتابِع", "notifications.filter.follows": "يتابِع",
"notifications.filter.mentions": "الإشارات", "notifications.filter.mentions": "الإشارات",
@ -461,40 +470,40 @@
"notifications_permission_banner.enable": "تفعيل إشعارات سطح المكتب", "notifications_permission_banner.enable": "تفعيل إشعارات سطح المكتب",
"notifications_permission_banner.how_to_control": "لتلقي الإشعارات عندما لا يكون ماستدون مفتوح، قم بتفعيل إشعارات سطح المكتب، يمكنك التحكم بدقة في أنواع التفاعلات التي تولد إشعارات سطح المكتب من خلال زر الـ{icon} أعلاه بمجرد تفعيلها.", "notifications_permission_banner.how_to_control": "لتلقي الإشعارات عندما لا يكون ماستدون مفتوح، قم بتفعيل إشعارات سطح المكتب، يمكنك التحكم بدقة في أنواع التفاعلات التي تولد إشعارات سطح المكتب من خلال زر الـ{icon} أعلاه بمجرد تفعيلها.",
"notifications_permission_banner.title": "لا تفوت شيئاً أبداً", "notifications_permission_banner.title": "لا تفوت شيئاً أبداً",
"onboarding.action.back": "العودة للخلف", "onboarding.action.back": "تراجع",
"onboarding.actions.back": "العودة للخلف", "onboarding.actions.back": "تراجع",
"onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_explore": "خذني إلى المتداولة",
"onboarding.actions.go_to_home": "Go to your home feed", "onboarding.actions.go_to_home": "خذني إلى وصلات خيطي الرئيس",
"onboarding.compose.template": "مرحبا #ماستدون!", "onboarding.compose.template": "مرحبا #ماستدون!",
"onboarding.follows.empty": "نأسف، لا يمكن عرض نتائج في الوقت الحالي. جرب البحث أو انتقل لصفحة الاستكشاف لإيجاد أشخاص للمتابعة، أو حاول مرة أخرى.", "onboarding.follows.empty": "نأسف، لا يمكن عرض نتائج في الوقت الحالي. جرب البحث أو انتقل لصفحة الاستكشاف لإيجاد أشخاص للمتابعة، أو حاول مرة أخرى.",
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.lead": "مقتطفات خيطك الرئيس هي الطريقة الأساسية لتجربة ماستدون. كلما زاد عدد الأشخاص الذين تتبعهم، كلما زاد خيط أخبارك نشاطا وإثارة للاهتمام. بداية، إليك بعض الاقتراحات:",
"onboarding.follows.title": "Popular on Mastodon", "onboarding.follows.title": "أضفِ طابعا شخصيا على موجزات خيطك الرئيس",
"onboarding.share.lead": "اسمح للأشخاص بمعرفة إمكانية الوصول إليك على ماستدون!", "onboarding.share.lead": "اسمح للأشخاص بمعرفة إمكانية الوصول إليك على ماستدون!",
"onboarding.share.message": "أنا {username} على #Mastodon! اتبعني على {url}", "onboarding.share.message": "أنا {username} في #Mastodon! تعال لمتابعتي على {url}",
"onboarding.share.next_steps": "الخطوات المحتملة التالية:", "onboarding.share.next_steps": "الخطوات المحتملة التالية:",
"onboarding.share.title": "شارك ملفك التعريفي", "onboarding.share.title": "شارك ملفك التعريفي",
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.lead": "أنت الآن جزء من ماستدون، منصة إعلامية اجتماعية فريدة من نوعها ولا مركزية حيث أنت - وليست الخوارزميات - من يقوم بضبط تجربتك الخاصة. دعنا نبدأ على هذه الحدود الاجتماعية الجديدة:",
"onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.skip": "ألست بحاجة للمساعدة للبداية؟",
"onboarding.start.title": "لقد قمت بها!", "onboarding.start.title": "لقد نجحت!",
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", "onboarding.steps.follow_people.body": "إن متابعة الأشخاص المثيرين للاهتمام هي غاية ماستدون.",
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", "onboarding.steps.follow_people.title": "أضفِ طابعا شخصيا على خيطك الرئيس",
"onboarding.steps.publish_status.body": "Say hello to the world.", "onboarding.steps.publish_status.body": "قل مرحبا للعالَم عبر نصّ أو صور أو فيديوهات أو استطلاعات رأي {emoji}",
"onboarding.steps.publish_status.title": "قم بإنشاء أول منشور لك", "onboarding.steps.publish_status.title": "قم بإنشاء أول منشور لك",
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", "onboarding.steps.setup_profile.body": "قم بتعزيز تفاعلاتك عبر الحصول على مِلَفّ شخصي شامل.",
"onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.setup_profile.title": "قم بتخصيص ملفك التعريفي",
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.body": "أخبر أصدقائك بكيفية العثور عليك على ماستدون",
"onboarding.steps.share_profile.title": "Share your profile", "onboarding.steps.share_profile.title": "شارك مِلَفّ ماستدون التعريفي الخاص بك",
"onboarding.tips.2fa": "<strong>هل تعلم؟</strong> يمكنك تأمين حسابك عن طريق إعداد المصادقة ذات عاملين في إعدادات حسابك. تعمل مع أي تطبيق TOTP من اختيارك، لا حاجة لرقم هاتف!", "onboarding.tips.2fa": "<strong>هل تعلم؟</strong> يمكنك تأمين حسابك عن طريق إعداد المصادقة ذات عاملين في إعدادات حسابك. تعمل مع أي تطبيق TOTP من اختيارك، لا حاجة لرقم هاتف!",
"onboarding.tips.accounts_from_other_servers": "<strong>هل تعلم؟</strong> لأن ماستدون لامركزية فإن بعض الحسابات التي تصادفها ستكون مستضافة على خوادم غير خادمك. ومع ذلك يمكنك التفاعل معها بسلاسة! خادمهم هو النصف الآخر من اسم المستخدم خاصتهم!", "onboarding.tips.accounts_from_other_servers": "<strong>هل تعلم؟</strong> لأن ماستدون لامركزية فإن بعض الحسابات التي تصادفها ستكون مستضافة على خوادم غير خادمك. ومع ذلك يمكنك التفاعل معها بسلاسة! خادمهم هو النصف الآخر من اسم المستخدم خاصتهم!",
"onboarding.tips.migration": "<strong>هل تعلم؟</strong> إذا شعرت بأن {domain} ليس خياراً ممتازاً لك في المستقبل، فيمكنك الانتقال إلى خادم ماستدون آخر دون خسارة متابعيك. يمكنك حتى استضافة خادمك الخاص!", "onboarding.tips.migration": "<strong>هل تعلم؟</strong> إذا شعرت بأن {domain} ليس خياراً ممتازاً لك في المستقبل، فيمكنك الانتقال إلى خادم ماستدون آخر دون خسارة متابعيك. يمكنك حتى استضافة خادمك الخاص!",
"onboarding.tips.verification": "<strong>هل تعلم؟</strong> يمكنك تأكيد حسابك عبر وضع رابط إلى ملفك الشخصي على ماستدون في موقعك الخاص وإضافة رابط موقعك على ملفك الشخصي. لا حاجة لأي رسوم أو مستندات!", "onboarding.tips.verification": "<strong>هل تعلم؟</strong> يمكنك تأكيد حسابك عبر وضع رابط إلى ملف ماستدون الشخصي الخاص بك في موقعك الخاص وإضافة رابط موقعك على ملفك الشخصي. لا حاجة لأي رسوم أو مستندات!",
"password_confirmation.exceeds_maxlength": "تأكيد كلمة المرور يتجاوز الحد الأقصى لطول كلمة المرور", "password_confirmation.exceeds_maxlength": "تأكيد كلمة المرور يتجاوز الحد الأقصى لطول كلمة المرور",
"password_confirmation.mismatching": "تأكيد كلمة المرور غير مطابق", "password_confirmation.mismatching": "تأكيد كلمة المرور غير مطابق",
"picture_in_picture.restore": "ضعها مرة أخرى", "picture_in_picture.restore": "ضعها مرة أخرى",
"poll.closed": "انتهى", "poll.closed": "انتهى",
"poll.refresh": "تحديث", "poll.refresh": "تحديث",
"poll.reveal": "عرض النتائج", "poll.reveal": "عرض النتائج",
"poll.total_people": "{count, plural, one {# شخص} two {# شخصين} few {# أشخاص} many {# أشخاص} other {# أشخاص}}", "poll.total_people": "{count, plural, one {شخص واحد} two {شخصان} few {# أشخاص} many {# شخصًا} other {# شخصٍ}}",
"poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}", "poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}",
"poll.vote": "صَوّت", "poll.vote": "صَوّت",
"poll.voted": "لقد صوّتت على هذه الإجابة", "poll.voted": "لقد صوّتت على هذه الإجابة",
@ -514,7 +523,7 @@
"privacy_policy.title": "سياسة الخصوصية", "privacy_policy.title": "سياسة الخصوصية",
"refresh": "أنعِش", "refresh": "أنعِش",
"regeneration_indicator.label": "جارٍ التحميل…", "regeneration_indicator.label": "جارٍ التحميل…",
"regeneration_indicator.sublabel": "جارٍ تجهيز تغذية صفحتك الرئيسية!", "regeneration_indicator.sublabel": "جارٍ تجهيز موجزات خيطك الرئيس!",
"relative_time.days": "{number}ي", "relative_time.days": "{number}ي",
"relative_time.full.days": "منذ {number, plural, zero {} one {# يوم} two {# يومين} few {# أيام} many {# أيام} other {# يوم}}", "relative_time.full.days": "منذ {number, plural, zero {} one {# يوم} two {# يومين} few {# أيام} many {# أيام} other {# يوم}}",
"relative_time.full.hours": "منذ {number, plural, zero {} one {ساعة واحدة} two {ساعتَيْن} few {# ساعات} many {# ساعة} other {# ساعة}}", "relative_time.full.hours": "منذ {number, plural, zero {} one {ساعة واحدة} two {ساعتَيْن} few {# ساعات} many {# ساعة} other {# ساعة}}",
@ -528,7 +537,8 @@
"relative_time.today": "اليوم", "relative_time.today": "اليوم",
"reply_indicator.cancel": "إلغاء", "reply_indicator.cancel": "إلغاء",
"report.block": "حظر", "report.block": "حظر",
"report.block_explanation": "لن ترى مشاركاتهم ولن يمكنهم متابعتك أو رؤية مشاركاتك، سيكون بديهيا لهم أنهم مكتمون.", "report.block_explanation": "لن ترى منشوراته ولن يمكنه متابعتك أو رؤية منشوراتك، سيكون بديهيا له أنه مكتوم.",
"report.categories.legal": "إشعارات قانونية",
"report.categories.other": "أخرى", "report.categories.other": "أخرى",
"report.categories.spam": "مزعج", "report.categories.spam": "مزعج",
"report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم", "report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم",
@ -541,7 +551,7 @@
"report.forward": "التحويل إلى {target}", "report.forward": "التحويل إلى {target}",
"report.forward_hint": "هذا الحساب ينتمي إلى خادم آخَر. هل تودّ إرسال نسخة مجهولة مِن التقرير إلى هنالك أيضًا؟", "report.forward_hint": "هذا الحساب ينتمي إلى خادم آخَر. هل تودّ إرسال نسخة مجهولة مِن التقرير إلى هنالك أيضًا؟",
"report.mute": "كتم", "report.mute": "كتم",
"report.mute_explanation": "لن ترى مشاركاتهم. لكن سيبقى بإمكانهم متابعتك ورؤية مشاركاتك دون أن يعرفوا أنهم مكتمون.", "report.mute_explanation": "لن ترى منشوراته. لكن سيبقى بإمكانه متابعتك ورؤية منشوراتك دون أن يعرف أنه مكتوم.",
"report.next": "التالي", "report.next": "التالي",
"report.placeholder": "تعليقات إضافية", "report.placeholder": "تعليقات إضافية",
"report.reasons.dislike": "لايعجبني", "report.reasons.dislike": "لايعجبني",
@ -557,7 +567,7 @@
"report.rules.subtitle": "اختر كل ما ينطبق", "report.rules.subtitle": "اختر كل ما ينطبق",
"report.rules.title": "ما هي القواعد المنتهكة؟", "report.rules.title": "ما هي القواعد المنتهكة؟",
"report.statuses.subtitle": "اختر كل ما ينطبق", "report.statuses.subtitle": "اختر كل ما ينطبق",
"report.statuses.title": "هل توجد مشاركات تدعم صحة هذا البلاغ؟", "report.statuses.title": "هل هناك أي منشورات تدعم صحة هذا التبليغ؟",
"report.submit": "إرسال", "report.submit": "إرسال",
"report.target": "ابلغ عن {target}", "report.target": "ابلغ عن {target}",
"report.thanks.take_action": "فيما يلي خياراتك للتحكم بما يُعرَض عليك في ماستدون:", "report.thanks.take_action": "فيما يلي خياراتك للتحكم بما يُعرَض عليك في ماستدون:",
@ -565,7 +575,7 @@
"report.thanks.title": "هل ترغب في مشاهدة هذا؟", "report.thanks.title": "هل ترغب في مشاهدة هذا؟",
"report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.", "report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.",
"report.unfollow": "إلغاء متابعة @{name}", "report.unfollow": "إلغاء متابعة @{name}",
"report.unfollow_explanation": "أنت تتابع هذا الحساب، لإزالة مَنشوراته من تغذيَتِكَ الرئيسة ألغ متابعته.", "report.unfollow_explanation": "أنت تتابع هذا الحساب، لإزالة مَنشوراته من موجزات خيطك الرئيس، ألغ متابعته.",
"report_notification.attached_statuses": "{count, plural, one {{count} منشور} other {{count} منشورات}} مرفقة", "report_notification.attached_statuses": "{count, plural, one {{count} منشور} other {{count} منشورات}} مرفقة",
"report_notification.categories.legal": "أمور قانونية", "report_notification.categories.legal": "أمور قانونية",
"report_notification.categories.other": "آخر", "report_notification.categories.other": "آخر",
@ -574,22 +584,26 @@
"report_notification.open": "فتح التقرير", "report_notification.open": "فتح التقرير",
"search.no_recent_searches": "ما من عمليات بحث تمت مؤخرًا", "search.no_recent_searches": "ما من عمليات بحث تمت مؤخرًا",
"search.placeholder": "ابحث", "search.placeholder": "ابحث",
"search.quick_action.account_search": "الملفات الشخصية المطابقة {x}", "search.quick_action.account_search": "الملفات التعريفية المطابقة لـ {x}",
"search.quick_action.go_to_account": "الذهاب إلى الصفحة الشخصية لـ {x}", "search.quick_action.go_to_account": "الذهاب إلى الصفحة الشخصية لـ {x}",
"search.quick_action.go_to_hashtag": "الذهاب إلى الوسم {x}", "search.quick_action.go_to_hashtag": "الذهاب إلى وسم {x}",
"search.quick_action.open_url": "فتح الرابط التشعبي في ماستدون", "search.quick_action.open_url": "فتح الرابط التشعبي في ماستدون",
"search.quick_action.status_search": "المشاركات المطابقة {x}", "search.quick_action.status_search": "المنشورات المطابقة لـ {x}",
"search.search_or_paste": "ابحث أو أدخل رابطا تشعبيا URL", "search.search_or_paste": "ابحث أو أدخل رابطا تشعبيا URL",
"search_popout.full_text_search_disabled_message": "غير متوفر على {domain}.",
"search_popout.language_code": "رمز لغة ISO",
"search_popout.options": "خيارات البحث",
"search_popout.quick_actions": "الإجراءات السريعة", "search_popout.quick_actions": "الإجراءات السريعة",
"search_popout.recent": "عمليات البحث الأخيرة", "search_popout.recent": "عمليات البحث الأخيرة",
"search_popout.specific_date": "تاريخ محدد",
"search_popout.user": "مستخدم",
"search_results.accounts": "الصفحات التعريفية", "search_results.accounts": "الصفحات التعريفية",
"search_results.all": "الكل", "search_results.all": "الكل",
"search_results.hashtags": "الوُسوم", "search_results.hashtags": "الوُسوم",
"search_results.nothing_found": "تعذر العثور على نتائج تتضمن هذه المصطلحات", "search_results.nothing_found": "تعذر العثور على نتائج تتضمن هذه المصطلحات",
"search_results.see_all": "رؤية الكل",
"search_results.statuses": "المنشورات", "search_results.statuses": "المنشورات",
"search_results.statuses_fts_disabled": "البحث عن المنشورات عن طريق المحتوى ليس مفعل في خادم ماستدون هذا.",
"search_results.title": "البحث عن {q}", "search_results.title": "البحث عن {q}",
"search_results.total": "{count, number} {count, plural, zero {} one {نتيجة} two {نتيجتين} few {نتائج} many {نتائج} other {نتائج}}",
"server_banner.about_active_users": "الأشخاص الذين يستخدمون هذا الخادم خلال الأيام الثلاثين الأخيرة (المستخدمون النشطون شهريًا)", "server_banner.about_active_users": "الأشخاص الذين يستخدمون هذا الخادم خلال الأيام الثلاثين الأخيرة (المستخدمون النشطون شهريًا)",
"server_banner.active_users": "مستخدم نشط", "server_banner.active_users": "مستخدم نشط",
"server_banner.administered_by": "يُديره:", "server_banner.administered_by": "يُديره:",
@ -605,8 +619,8 @@
"status.admin_status": "افتح هذا المنشور على واجهة الإشراف", "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
"status.block": "احجب @{name}", "status.block": "احجب @{name}",
"status.bookmark": "أضفه إلى الفواصل المرجعية", "status.bookmark": "أضفه إلى الفواصل المرجعية",
"status.cancel_reblog_private": "إلغاء الترقية", "status.cancel_reblog_private": "إلغاء إعادة النشر",
"status.cannot_reblog": "تعذرت ترقية هذا المنشور", "status.cannot_reblog": "لا يمكن إعادة نشر هذا المنشور",
"status.copy": "انسخ رابط الرسالة", "status.copy": "انسخ رابط الرسالة",
"status.delete": "احذف", "status.delete": "احذف",
"status.detailed_status": "تفاصيل المحادثة", "status.detailed_status": "تفاصيل المحادثة",
@ -625,17 +639,17 @@
"status.load_more": "حمّل المزيد", "status.load_more": "حمّل المزيد",
"status.media.open": "اضغط للفتح", "status.media.open": "اضغط للفتح",
"status.media.show": "اضغط للإظهار", "status.media.show": "اضغط للإظهار",
"status.media_hidden": "الصورة مستترة", "status.media_hidden": "وسائط مخفية",
"status.mention": "أذكُر @{name}", "status.mention": "أذكُر @{name}",
"status.more": "المزيد", "status.more": "المزيد",
"status.mute": "أكتم @{name}", "status.mute": "أكتم @{name}",
"status.mute_conversation": "كتم المحادثة", "status.mute_conversation": "كتم المحادثة",
"status.open": "وسع هذه المشاركة", "status.open": "وسّع هذا المنشور",
"status.pin": "دبّسه على الصفحة التعريفية", "status.pin": "دبّسه على الصفحة التعريفية",
"status.pinned": "منشور مثبَّت", "status.pinned": "منشور مثبَّت",
"status.read_more": "اقرأ المزيد", "status.read_more": "اقرأ المزيد",
"status.reblog": "رَقِّي", "status.reblog": "إعادة النشر",
"status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", "status.reblog_private": "إعادة النشر إلى الجمهور الأصلي",
"status.reblogged_by": "شارَكَه {name}", "status.reblogged_by": "شارَكَه {name}",
"status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"status.redraft": "إزالة وإعادة الصياغة", "status.redraft": "إزالة وإعادة الصياغة",
@ -653,16 +667,14 @@
"status.show_more_all": "توسيع الكل", "status.show_more_all": "توسيع الكل",
"status.show_original": "إظهار الأصل", "status.show_original": "إظهار الأصل",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.translate": "ترجم", "status.translate": "ترجمة",
"status.translated_from_with": "مترجم من {lang} باستخدام {provider}", "status.translated_from_with": "مترجم من {lang} باستخدام {provider}",
"status.uncached_media_warning": "المعاينة غير متوفرة", "status.uncached_media_warning": "المعاينة غير متوفرة",
"status.unmute_conversation": "فك الكتم عن المحادثة", "status.unmute_conversation": "فك الكتم عن المحادثة",
"status.unpin": "فك التدبيس من الصفحة التعريفية", "status.unpin": "فك التدبيس من الصفحة التعريفية",
"subscribed_languages.lead": "فقط المشاركات في اللغات المحددة ستظهر في الرئيسيه وتسرد الجداول الزمنية بعد التغيير. حدد لا شيء لتلقي المشاركات بجميع اللغات.", "subscribed_languages.lead": "فقط المنشورات في اللغات المحددة ستظهر في خيطك الرئيسي وتسرد في الجداول الزمنية بعد تأكيد التغيير. لا تقم بأي خيار لتلقي المنشورات في جميع اللغات.",
"subscribed_languages.save": "حفظ التغييرات", "subscribed_languages.save": "حفظ التغييرات",
"subscribed_languages.target": "تغيير اللغات المشتركة لـ {target}", "subscribed_languages.target": "تغيير اللغات المشتركة لـ {target}",
"suggestions.dismiss": "إلغاء الاقتراح",
"suggestions.header": "يمكن أن يهمك…",
"tabs_bar.home": "الرئيسية", "tabs_bar.home": "الرئيسية",
"tabs_bar.notifications": "الإشعارات", "tabs_bar.notifications": "الإشعارات",
"time_remaining.days": "{number, plural, one {# يوم} other {# أيام}} متبقية", "time_remaining.days": "{number, plural, one {# يوم} other {# أيام}} متبقية",
@ -674,7 +686,7 @@
"timeline_hint.resources.followers": "المتابِعون", "timeline_hint.resources.followers": "المتابِعون",
"timeline_hint.resources.follows": "المتابَعون", "timeline_hint.resources.follows": "المتابَعون",
"timeline_hint.resources.statuses": "المنشورات القديمة", "timeline_hint.resources.statuses": "المنشورات القديمة",
"trends.counter_by_accounts": "{count, plural, one {{counter} شخص واحد} other {{counter} أشخاص}} في {days, plural, one {اليوم الماضي} other {{days} الأسام الماضية}}", "trends.counter_by_accounts": "{count, plural, one {شخص واحد} two {شخصان} few {{counter} أشخاصٍ} many {{counter} شخصًا} other {{counter} شخصًا}} {days, plural, one {خلال اليوم الماضي} two {خلال اليومَيْنِ الماضيَيْنِ} few {خلال {days} أيام الماضية} many {خلال {days} يومًا الماضية} other {خلال {days} يومٍ الماضية}}",
"trends.trending_now": "المتداولة الآن", "trends.trending_now": "المتداولة الآن",
"ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.", "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
"units.short.billion": "{count} مليار", "units.short.billion": "{count} مليار",

View File

@ -218,6 +218,7 @@
"home.column_settings.basic": "Configuración básica", "home.column_settings.basic": "Configuración básica",
"home.column_settings.show_reblogs": "Amosar los artículos compartíos", "home.column_settings.show_reblogs": "Amosar los artículos compartíos",
"home.column_settings.show_replies": "Amosar les rempuestes", "home.column_settings.show_replies": "Amosar les rempuestes",
"home.pending_critical_update.body": "¡Anueva'l sirvidor de Mastodon namás que puedas!",
"interaction_modal.description.follow": "Con una cuenta de Mastodon, pues siguir a {name} pa recibir los artículos de so nel to feed d'aniciu.", "interaction_modal.description.follow": "Con una cuenta de Mastodon, pues siguir a {name} pa recibir los artículos de so nel to feed d'aniciu.",
"interaction_modal.description.reblog": "Con una cuenta de Mastodon, pues compartir esti artículu colos perfiles que te sigan.", "interaction_modal.description.reblog": "Con una cuenta de Mastodon, pues compartir esti artículu colos perfiles que te sigan.",
"interaction_modal.description.reply": "Con una cuenta de Mastodon, pues responder a esti artículu.", "interaction_modal.description.reply": "Con una cuenta de Mastodon, pues responder a esti artículu.",
@ -412,9 +413,7 @@
"search_results.hashtags": "Etiquetes", "search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "Nun se pudo atopar nada con esos términos de busca", "search_results.nothing_found": "Nun se pudo atopar nada con esos términos de busca",
"search_results.statuses": "Artículos", "search_results.statuses": "Artículos",
"search_results.statuses_fts_disabled": "Esti sirvidor de Mastodon nun tien activada la busca d'artículos pol so conteníu.",
"search_results.title": "Busca de: {q}", "search_results.title": "Busca de: {q}",
"search_results.total": "{count, number} {count, plural, one {resultáu} other {resultaos}}",
"server_banner.introduction": "{domain} ye parte de la rede social descentralizada que tien la teunoloxía de {mastodon}.", "server_banner.introduction": "{domain} ye parte de la rede social descentralizada que tien la teunoloxía de {mastodon}.",
"server_banner.learn_more": "Saber más", "server_banner.learn_more": "Saber más",
"server_banner.server_stats": "Estadístiques del sirvidor:", "server_banner.server_stats": "Estadístiques del sirvidor:",
@ -465,7 +464,6 @@
"status.uncached_media_warning": "La previsualización nun ta disponible", "status.uncached_media_warning": "La previsualización nun ta disponible",
"status.unmute_conversation": "Activar los avisos de la conversación", "status.unmute_conversation": "Activar los avisos de la conversación",
"status.unpin": "Lliberar del perfil", "status.unpin": "Lliberar del perfil",
"suggestions.header": "Quiciabes t'interese…",
"tabs_bar.home": "Aniciu", "tabs_bar.home": "Aniciu",
"tabs_bar.notifications": "Avisos", "tabs_bar.notifications": "Avisos",
"time_remaining.days": "{number, plural, one {Queda # día} other {Queden # díes}}", "time_remaining.days": "{number, plural, one {Queda # día} other {Queden # díes}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Шукаць мовы...", "compose.language.search": "Шукаць мовы...",
"compose.published.body": "Допіс апублікаваны.", "compose.published.body": "Допіс апублікаваны.",
"compose.published.open": "Адкрыць", "compose.published.open": "Адкрыць",
"compose.saved.body": "Допіс захаваны.",
"compose_form.direct_message_warning_learn_more": "Даведацца больш", "compose_form.direct_message_warning_learn_more": "Даведацца больш",
"compose_form.encryption_warning": "Допісы ў Mastodon не абаронены скразным шыфраваннем. Не дзяліцеся ніякай канфідэнцыяльнай інфармацыяй праз Mastodon.", "compose_form.encryption_warning": "Допісы ў Mastodon не абаронены скразным шыфраваннем. Не дзяліцеся ніякай канфідэнцыяльнай інфармацыяй праз Mastodon.",
"compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, бо ён не публічны. Толькі публічныя допісы можна знайсці па хэштэгу.", "compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, бо ён не публічны. Толькі публічныя допісы можна знайсці па хэштэгу.",
@ -300,6 +301,7 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}} за сёння", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}} за сёння",
"hashtag.follow": "Падпісацца на хэштэг", "hashtag.follow": "Падпісацца на хэштэг",
"hashtag.unfollow": "Адпісацца ад хэштэга", "hashtag.unfollow": "Адпісацца ад хэштэга",
"hashtags.and_other": "…і яшчэ {count, plural, other {#}}",
"home.actions.go_to_explore": "Паглядзіце, што ў трэндзе", "home.actions.go_to_explore": "Паглядзіце, што ў трэндзе",
"home.actions.go_to_suggestions": "Знайсці людзей, каб падпісацца", "home.actions.go_to_suggestions": "Знайсці людзей, каб падпісацца",
"home.column_settings.basic": "Асноўныя", "home.column_settings.basic": "Асноўныя",
@ -532,6 +534,7 @@
"reply_indicator.cancel": "Скасаваць", "reply_indicator.cancel": "Скасаваць",
"report.block": "Заблакіраваць", "report.block": "Заблакіраваць",
"report.block_explanation": "Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за вамі і бачыць вашы допісы. Ён зможа зразумець, што яго заблакіравалі.", "report.block_explanation": "Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за вамі і бачыць вашы допісы. Ён зможа зразумець, што яго заблакіравалі.",
"report.categories.legal": "Права",
"report.categories.other": "Іншае", "report.categories.other": "Іншае",
"report.categories.spam": "Спам", "report.categories.spam": "Спам",
"report.categories.violation": "Змест парушае адно ці некалькі правілаў сервера", "report.categories.violation": "Змест парушае адно ці некалькі правілаў сервера",
@ -583,16 +586,19 @@
"search.quick_action.open_url": "Адкрыць спасылку ў Mastodon", "search.quick_action.open_url": "Адкрыць спасылку ў Mastodon",
"search.quick_action.status_search": "Супадзенне паведамленняў {x}", "search.quick_action.status_search": "Супадзенне паведамленняў {x}",
"search.search_or_paste": "Пошук", "search.search_or_paste": "Пошук",
"search_popout.language_code": "ISO код мовы",
"search_popout.options": "Параметры пошуку",
"search_popout.quick_actions": "Хуткія дзеянні", "search_popout.quick_actions": "Хуткія дзеянні",
"search_popout.recent": "Нядаўнія запыты", "search_popout.recent": "Нядаўнія запыты",
"search_popout.specific_date": "канкрэтная дата",
"search_popout.user": "карыстальнік",
"search_results.accounts": "Профілі", "search_results.accounts": "Профілі",
"search_results.all": "Усё", "search_results.all": "Усё",
"search_results.hashtags": "Хэштэгі", "search_results.hashtags": "Хэштэгі",
"search_results.nothing_found": "Па дадзенаму запыту нічога не знойдзена", "search_results.nothing_found": "Па дадзенаму запыту нічога не знойдзена",
"search_results.see_all": "Праглядзець усе",
"search_results.statuses": "Допісы", "search_results.statuses": "Допісы",
"search_results.statuses_fts_disabled": "Пошук публікацый па зместу не ўключаны на гэтым серверы Mastodon.",
"search_results.title": "Пошук {q}", "search_results.title": "Пошук {q}",
"search_results.total": "{count, number} {count, plural, one {вынік} few {вынікі} many {вынікаў} other {выніку}}",
"server_banner.about_active_users": "Людзі, якія карыстаюцца гэтым сервера на працягу апошніх 30 дзён (Штомесячна Актыўныя Карыстальнікі)", "server_banner.about_active_users": "Людзі, якія карыстаюцца гэтым сервера на працягу апошніх 30 дзён (Штомесячна Актыўныя Карыстальнікі)",
"server_banner.active_users": "актыўныя карыстальнікі", "server_banner.active_users": "актыўныя карыстальнікі",
"server_banner.administered_by": "Адміністратар:", "server_banner.administered_by": "Адміністратар:",
@ -664,8 +670,6 @@
"subscribed_languages.lead": "Толькі допісы ў абраных мовах будуць паказвацца ў вашых стужках пасля змены. Не абірайце нічога, каб бачыць допісы на ўсіх мовах.", "subscribed_languages.lead": "Толькі допісы ў абраных мовах будуць паказвацца ў вашых стужках пасля змены. Не абірайце нічога, каб бачыць допісы на ўсіх мовах.",
"subscribed_languages.save": "Захаваць змены", "subscribed_languages.save": "Захаваць змены",
"subscribed_languages.target": "Змяніць мовы падпіскі для {target}", "subscribed_languages.target": "Змяніць мовы падпіскі для {target}",
"suggestions.dismiss": "Адхіліць прапанову",
"suggestions.header": "Гэта можа Вас зацікавіць…",
"tabs_bar.home": "Галоўная", "tabs_bar.home": "Галоўная",
"tabs_bar.notifications": "Апавяшчэнні", "tabs_bar.notifications": "Апавяшчэнні",
"time_remaining.days": "{number, plural, one {застаўся # дзень} few {засталося # дні} many {засталося # дзён} other {засталося # дня}}", "time_remaining.days": "{number, plural, one {застаўся # дзень} few {засталося # дні} many {засталося # дзён} other {засталося # дня}}",

View File

@ -113,6 +113,7 @@
"column.direct": "Частни споменавания", "column.direct": "Частни споменавания",
"column.directory": "Разглеждане на профили", "column.directory": "Разглеждане на профили",
"column.domain_blocks": "Блокирани домейни", "column.domain_blocks": "Блокирани домейни",
"column.favourites": "Любими",
"column.firehose": "Инфоканали на живо", "column.firehose": "Инфоканали на живо",
"column.follow_requests": "Заявки за последване", "column.follow_requests": "Заявки за последване",
"column.home": "Начало", "column.home": "Начало",
@ -136,6 +137,7 @@
"compose.language.search": "Търсене на езици...", "compose.language.search": "Търсене на езици...",
"compose.published.body": "Публикувана публикация.", "compose.published.body": "Публикувана публикация.",
"compose.published.open": "Отваряне", "compose.published.open": "Отваряне",
"compose.saved.body": "Запазена публикация.",
"compose_form.direct_message_warning_learn_more": "Още информация", "compose_form.direct_message_warning_learn_more": "Още информация",
"compose_form.encryption_warning": "Публикациите в Mastodon не са криптирани от край до край. Не споделяйте никаква чувствителна информация там.", "compose_form.encryption_warning": "Публикациите в Mastodon не са криптирани от край до край. Не споделяйте никаква чувствителна информация там.",
"compose_form.hashtag_warning": "Тази публикация няма да се вписва под никакъв хаштаг, тъй като не е обществена. Само публични публикации могат да се търсят по хаштаг.", "compose_form.hashtag_warning": "Тази публикация няма да се вписва под никакъв хаштаг, тъй като не е обществена. Само публични публикации могат да се търсят по хаштаг.",
@ -180,6 +182,7 @@
"confirmations.mute.explanation": "Това ще скрие публикациите от тях и публикации, които ги споменават, но все още ще им позволява да виждат публикациите ви и да ви следват.", "confirmations.mute.explanation": "Това ще скрие публикациите от тях и публикации, които ги споменават, но все още ще им позволява да виждат публикациите ви и да ви следват.",
"confirmations.mute.message": "Наистина ли искате да заглушите {name}?", "confirmations.mute.message": "Наистина ли искате да заглушите {name}?",
"confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.confirm": "Изтриване и преработване",
"confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.",
"confirmations.reply.confirm": "Отговор", "confirmations.reply.confirm": "Отговор",
"confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?", "confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?",
"confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.confirm": "Без следване",
@ -199,6 +202,7 @@
"dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.", "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.",
"dismissable_banner.dismiss": "Отхвърляне", "dismissable_banner.dismiss": "Отхвърляне",
"dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.", "dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.",
"dismissable_banner.explore_statuses": "Има публикации през социалната мрежа, които днес набират популярност. По-новите публикации с повече подсилвания и любими са класирани по-високо.",
"dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.", "dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.",
"dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.", "dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.",
"embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.", "embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.",
@ -227,6 +231,8 @@
"empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.", "empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.",
"empty_column.domain_blocks": "Още няма блокирани домейни.", "empty_column.domain_blocks": "Още няма блокирани домейни.",
"empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!", "empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!",
"empty_column.favourited_statuses": "Още нямате никакви любими публикации. Правейки любима, то тя ще се покаже тук.",
"empty_column.favourites": "Още никого не е слагал публикацията в любими. Когато някой го направи, този човек ще се покаже тук.",
"empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.", "empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.",
"empty_column.followed_tags": "Още не сте последвали никакви хаштагове. Последваните хаштагове ще се покажат тук.", "empty_column.followed_tags": "Още не сте последвали никакви хаштагове. Последваните хаштагове ще се покажат тук.",
"empty_column.hashtag": "Още няма нищо в този хаштаг.", "empty_column.hashtag": "Още няма нищо в този хаштаг.",
@ -290,21 +296,36 @@
"hashtag.column_settings.tag_mode.any": "Някое от тези", "hashtag.column_settings.tag_mode.any": "Някое от тези",
"hashtag.column_settings.tag_mode.none": "Никое от тези", "hashtag.column_settings.tag_mode.none": "Никое от тези",
"hashtag.column_settings.tag_toggle": "Включва допълнителни хаштагове за тази колона", "hashtag.column_settings.tag_toggle": "Включва допълнителни хаштагове за тази колона",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} участник} other {{counter} участници}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} публикация} other {{counter} публикации}} днес",
"hashtag.follow": "Следване на хаштаг", "hashtag.follow": "Следване на хаштаг",
"hashtag.unfollow": "Спиране на следване на хаштаг", "hashtag.unfollow": "Спиране на следване на хаштаг",
"hashtags.and_other": "…и {count, plural, other {# още}}",
"home.actions.go_to_explore": "Вижте какво изгрява", "home.actions.go_to_explore": "Вижте какво изгрява",
"home.actions.go_to_suggestions": "Намиране на хора за следване", "home.actions.go_to_suggestions": "Намиране на хора за следване",
"home.column_settings.basic": "Основно", "home.column_settings.basic": "Основно",
"home.column_settings.show_reblogs": "Показване на подсилванията", "home.column_settings.show_reblogs": "Показване на подсилванията",
"home.column_settings.show_replies": "Показване на отговорите", "home.column_settings.show_replies": "Показване на отговорите",
"home.explore_prompt.body": "Вашият начален инфоканал ще е смес на публикации от хаштаговете, които сте избрали да следвате, избраните хора да следвате, а и публикациите, които са подсилили. Ако изглежда твърде тихо в момента, то може да искате да:",
"home.explore_prompt.title": "Това е началната ви база с Mastodon.", "home.explore_prompt.title": "Това е началната ви база с Mastodon.",
"home.hide_announcements": "Скриване на оповестяванията", "home.hide_announcements": "Скриване на оповестяванията",
"home.pending_critical_update.body": "Обновете сървъра си в Mastodon възможно най-скоро!",
"home.pending_critical_update.link": "Преглед на обновяванията",
"home.pending_critical_update.title": "Налично критично обновяване на сигурността!",
"home.show_announcements": "Показване на оповестяванията", "home.show_announcements": "Показване на оповестяванията",
"interaction_modal.description.favourite": "Имайки акаунт в Mastodon, може да сложите тази публикации в любими, за да позволите на автора да узнае, че я цените и да я запазите за по-късно.",
"interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.", "interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.",
"interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.", "interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.",
"interaction_modal.description.reply": "С акаунт в Mastodon може да добавите отговор към тази публикация.", "interaction_modal.description.reply": "С акаунт в Mastodon може да добавите отговор към тази публикация.",
"interaction_modal.login.action": "Към началото",
"interaction_modal.login.prompt": "Домейнът на сървъра ви, примерно, mastodon.social",
"interaction_modal.no_account_yet": "Още не е в Мастодон?",
"interaction_modal.on_another_server": "На различен сървър", "interaction_modal.on_another_server": "На различен сървър",
"interaction_modal.on_this_server": "На този сървър", "interaction_modal.on_this_server": "На този сървър",
"interaction_modal.sign_in": "Не сте влезли в този сървър. Къде се хоства акаунтът ви?",
"interaction_modal.sign_in_hint": "Съвет: Ето уебсайта, където сте се регистрирали. Ако не помните, то погледнете е-писмо за добре дошли във входящата си поща. Може също да въведете пълното си потребителско име! (примерно: @Mastodon@mastodon.social)",
"interaction_modal.title.favourite": "Означавам публикация на {name} като любима",
"interaction_modal.title.follow": "Последване на {name}", "interaction_modal.title.follow": "Последване на {name}",
"interaction_modal.title.reblog": "Подсилване на публикацията на {name}", "interaction_modal.title.reblog": "Подсилване на публикацията на {name}",
"interaction_modal.title.reply": "Отговаряне на публикацията на {name}", "interaction_modal.title.reply": "Отговаряне на публикацията на {name}",
@ -320,6 +341,8 @@
"keyboard_shortcuts.direct": "за отваряне на колоната с частни споменавания", "keyboard_shortcuts.direct": "за отваряне на колоната с частни споменавания",
"keyboard_shortcuts.down": "Преместване надолу в списъка", "keyboard_shortcuts.down": "Преместване надолу в списъка",
"keyboard_shortcuts.enter": "Отваряне на публикация", "keyboard_shortcuts.enter": "Отваряне на публикация",
"keyboard_shortcuts.favourite": "Любима публикация",
"keyboard_shortcuts.favourites": "Отваряне на списъка с любими",
"keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток", "keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток",
"keyboard_shortcuts.heading": "Клавишни съчетания", "keyboard_shortcuts.heading": "Клавишни съчетания",
"keyboard_shortcuts.home": "Отваряне на началната часова ос", "keyboard_shortcuts.home": "Отваряне на началната часова ос",
@ -350,6 +373,7 @@
"lightbox.previous": "Назад", "lightbox.previous": "Назад",
"limited_account_hint.action": "Показване на профила въпреки това", "limited_account_hint.action": "Показване на профила въпреки това",
"limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.", "limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.",
"link_preview.author": "От {name}",
"lists.account.add": "Добавяне към списък", "lists.account.add": "Добавяне към списък",
"lists.account.remove": "Премахване от списъка", "lists.account.remove": "Премахване от списъка",
"lists.delete": "Изтриване на списъка", "lists.delete": "Изтриване на списъка",
@ -382,6 +406,7 @@
"navigation_bar.domain_blocks": "Блокирани домейни", "navigation_bar.domain_blocks": "Блокирани домейни",
"navigation_bar.edit_profile": "Редактиране на профила", "navigation_bar.edit_profile": "Редактиране на профила",
"navigation_bar.explore": "Изследване", "navigation_bar.explore": "Изследване",
"navigation_bar.favourites": "Любими",
"navigation_bar.filters": "Заглушени думи", "navigation_bar.filters": "Заглушени думи",
"navigation_bar.follow_requests": "Заявки за последване", "navigation_bar.follow_requests": "Заявки за последване",
"navigation_bar.followed_tags": "Последвани хаштагове", "navigation_bar.followed_tags": "Последвани хаштагове",
@ -389,6 +414,7 @@
"navigation_bar.lists": "Списъци", "navigation_bar.lists": "Списъци",
"navigation_bar.logout": "Излизане", "navigation_bar.logout": "Излизане",
"navigation_bar.mutes": "Заглушени потребители", "navigation_bar.mutes": "Заглушени потребители",
"navigation_bar.opened_in_classic_interface": "Публикации, акаунти и други особени страници се отварят по подразбиране в класическия мрежови интерфейс.",
"navigation_bar.personal": "Лично", "navigation_bar.personal": "Лично",
"navigation_bar.pins": "Закачени публикации", "navigation_bar.pins": "Закачени публикации",
"navigation_bar.preferences": "Предпочитания", "navigation_bar.preferences": "Предпочитания",
@ -398,6 +424,7 @@
"not_signed_in_indicator.not_signed_in": "Трябва ви вход за достъп до ресурса.", "not_signed_in_indicator.not_signed_in": "Трябва ви вход за достъп до ресурса.",
"notification.admin.report": "{name} докладва {target}", "notification.admin.report": "{name} докладва {target}",
"notification.admin.sign_up": "{name} се регистрира", "notification.admin.sign_up": "{name} се регистрира",
"notification.favourite": "{name} направи любима публикацията ви",
"notification.follow": "{name} ви последва", "notification.follow": "{name} ви последва",
"notification.follow_request": "{name} поиска да ви последва", "notification.follow_request": "{name} поиска да ви последва",
"notification.mention": "{name} ви спомена", "notification.mention": "{name} ви спомена",
@ -411,6 +438,7 @@
"notifications.column_settings.admin.report": "Нови доклади:", "notifications.column_settings.admin.report": "Нови доклади:",
"notifications.column_settings.admin.sign_up": "Нови регистрации:", "notifications.column_settings.admin.sign_up": "Нови регистрации:",
"notifications.column_settings.alert": "Известия на работния плот", "notifications.column_settings.alert": "Известия на работния плот",
"notifications.column_settings.favourite": "Любими:",
"notifications.column_settings.filter_bar.advanced": "Показване на всички категории", "notifications.column_settings.filter_bar.advanced": "Показване на всички категории",
"notifications.column_settings.filter_bar.category": "Лента за бърз филтър", "notifications.column_settings.filter_bar.category": "Лента за бърз филтър",
"notifications.column_settings.filter_bar.show_bar": "Показване на лентата с филтри", "notifications.column_settings.filter_bar.show_bar": "Показване на лентата с филтри",
@ -428,6 +456,7 @@
"notifications.column_settings.update": "Промени:", "notifications.column_settings.update": "Промени:",
"notifications.filter.all": "Всичко", "notifications.filter.all": "Всичко",
"notifications.filter.boosts": "Подсилвания", "notifications.filter.boosts": "Подсилвания",
"notifications.filter.favourites": "Любими",
"notifications.filter.follows": "Последвания", "notifications.filter.follows": "Последвания",
"notifications.filter.mentions": "Споменавания", "notifications.filter.mentions": "Споменавания",
"notifications.filter.polls": "Резултати от анкетата", "notifications.filter.polls": "Резултати от анкетата",
@ -509,6 +538,7 @@
"reply_indicator.cancel": "Отказ", "reply_indicator.cancel": "Отказ",
"report.block": "Блокиране", "report.block": "Блокиране",
"report.block_explanation": "Няма да им виждате публикациите. Те няма да могат да виждат публикациите ви или да ви последват. Те ще могат да казват, че са били блокирани.", "report.block_explanation": "Няма да им виждате публикациите. Те няма да могат да виждат публикациите ви или да ви последват. Те ще могат да казват, че са били блокирани.",
"report.categories.legal": "Правни въпроси",
"report.categories.other": "Друго", "report.categories.other": "Друго",
"report.categories.spam": "Спам", "report.categories.spam": "Спам",
"report.categories.violation": "Съдържание, нарушаващо едно или повече правила на сървъра", "report.categories.violation": "Съдържание, нарушаващо едно или повече правила на сървъра",
@ -560,16 +590,20 @@
"search.quick_action.open_url": "Отваряне на URL адреса в Mastodon", "search.quick_action.open_url": "Отваряне на URL адреса в Mastodon",
"search.quick_action.status_search": "Съвпадение на публикации {x}", "search.quick_action.status_search": "Съвпадение на публикации {x}",
"search.search_or_paste": "Търсене или поставяне на URL адрес", "search.search_or_paste": "Търсене или поставяне на URL адрес",
"search_popout.full_text_search_disabled_message": "Не е достъпно на {domain}.",
"search_popout.language_code": "Код на езика по ISO",
"search_popout.options": "Възможности при търсене",
"search_popout.quick_actions": "Бързи действия", "search_popout.quick_actions": "Бързи действия",
"search_popout.recent": "Скорошни търсения", "search_popout.recent": "Скорошни търсения",
"search_popout.specific_date": "особена дата",
"search_popout.user": "потребител",
"search_results.accounts": "Профили", "search_results.accounts": "Профили",
"search_results.all": "Всичко", "search_results.all": "Всичко",
"search_results.hashtags": "Хаштагове", "search_results.hashtags": "Хаштагове",
"search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене", "search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене",
"search_results.see_all": "Поглед на всички",
"search_results.statuses": "Публикации", "search_results.statuses": "Публикации",
"search_results.statuses_fts_disabled": "Търсенето на публикации по съдържанието им не се включва в този сървър на Mastodon.",
"search_results.title": "Търсене за {q}", "search_results.title": "Търсене за {q}",
"search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}",
"server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)", "server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)",
"server_banner.active_users": "дейни потребители", "server_banner.active_users": "дейни потребители",
"server_banner.administered_by": "Администрира се от:", "server_banner.administered_by": "Администрира се от:",
@ -578,6 +612,8 @@
"server_banner.server_stats": "Статистика на сървъра:", "server_banner.server_stats": "Статистика на сървъра:",
"sign_in_banner.create_account": "Създаване на акаунт", "sign_in_banner.create_account": "Създаване на акаунт",
"sign_in_banner.sign_in": "Вход", "sign_in_banner.sign_in": "Вход",
"sign_in_banner.sso_redirect": "Влизане или регистриране",
"sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, отбелязвате като любими, споделяте и отговаряте на публикации. Може също така да взаимодействате от акаунта си на друг сървър.",
"status.admin_account": "Отваряне на интерфейс за модериране за @{name}", "status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
"status.admin_domain": "Отваряне на модериращия интерфейс за {domain}", "status.admin_domain": "Отваряне на модериращия интерфейс за {domain}",
"status.admin_status": "Отваряне на публикацията в модериращия интерфейс", "status.admin_status": "Отваряне на публикацията в модериращия интерфейс",
@ -594,6 +630,7 @@
"status.edited": "Редактирано на {date}", "status.edited": "Редактирано на {date}",
"status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}", "status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}",
"status.embed": "Вграждане", "status.embed": "Вграждане",
"status.favourite": "Любимо",
"status.filter": "Филтриране на публ.", "status.filter": "Филтриране на публ.",
"status.filtered": "Филтрирано", "status.filtered": "Филтрирано",
"status.hide": "Скриване на публ.", "status.hide": "Скриване на публ.",
@ -638,8 +675,6 @@
"subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.", "subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.",
"subscribed_languages.save": "Запазване на промените", "subscribed_languages.save": "Запазване на промените",
"subscribed_languages.target": "Смяна на езика за {target}", "subscribed_languages.target": "Смяна на езика за {target}",
"suggestions.dismiss": "Отхвърляне на предложение",
"suggestions.header": "Може да имате интерес от…",
"tabs_bar.home": "Начало", "tabs_bar.home": "Начало",
"tabs_bar.notifications": "Известия", "tabs_bar.notifications": "Известия",
"time_remaining.days": "{number, plural, one {остава # ден} other {остават # дни}}", "time_remaining.days": "{number, plural, one {остава # ден} other {остават # дни}}",

View File

@ -109,6 +109,8 @@
"column.direct": "গোপনে মেনশন করুন", "column.direct": "গোপনে মেনশন করুন",
"column.directory": "প্রোফাইল ব্রাউজ করুন", "column.directory": "প্রোফাইল ব্রাউজ করুন",
"column.domain_blocks": "লুকোনো ডোমেনগুলি", "column.domain_blocks": "লুকোনো ডোমেনগুলি",
"column.favourites": "পছন্দসমূহ",
"column.firehose": "সরাসরি প্রবাহ",
"column.follow_requests": "অনুসরণের অনুমতি অনুরোধকারী", "column.follow_requests": "অনুসরণের অনুমতি অনুরোধকারী",
"column.home": "বাড়ি", "column.home": "বাড়ি",
"column.lists": "তালিকাগুলো", "column.lists": "তালিকাগুলো",
@ -129,6 +131,7 @@
"community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী", "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
"compose.language.change": "ভাষা পরিবর্তন করুন", "compose.language.change": "ভাষা পরিবর্তন করুন",
"compose.language.search": "ভাষা অনুসন্ধান করুন...", "compose.language.search": "ভাষা অনুসন্ধান করুন...",
"compose.published.open": "দেখো",
"compose_form.direct_message_warning_learn_more": "আরো জানুন", "compose_form.direct_message_warning_learn_more": "আরো জানুন",
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "এই পোস্টটি কোনো হ্যাশট্যাগের বিষয় নয় কারণ এটি সর্বজনীনভাবে উপলব্ধ নয়। শুধুমাত্র জনসাধারণের কাছে পোস্ট করা বার্তাই হ্যাশট্যাগ দ্বারা অনুসন্ধান করা যেতে পারে।", "compose_form.hashtag_warning": "এই পোস্টটি কোনো হ্যাশট্যাগের বিষয় নয় কারণ এটি সর্বজনীনভাবে উপলব্ধ নয়। শুধুমাত্র জনসাধারণের কাছে পোস্ট করা বার্তাই হ্যাশট্যাগ দ্বারা অনুসন্ধান করা যেতে পারে।",
@ -161,8 +164,10 @@
"confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?", "confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?",
"confirmations.delete_list.confirm": "মুছে ফেলুন", "confirmations.delete_list.confirm": "মুছে ফেলুন",
"confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?",
"confirmations.discard_edit_media.confirm": "বাতিল করো",
"confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান", "confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান",
"confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।", "confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।",
"confirmations.edit.confirm": "সম্পাদন",
"confirmations.logout.confirm": "প্রস্থান", "confirmations.logout.confirm": "প্রস্থান",
"confirmations.logout.message": "আপনি লগ আউট করতে চান?", "confirmations.logout.message": "আপনি লগ আউট করতে চান?",
"confirmations.mute.confirm": "সরিয়ে ফেলুন", "confirmations.mute.confirm": "সরিয়ে ফেলুন",
@ -177,15 +182,18 @@
"conversation.mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন", "conversation.mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন",
"conversation.open": "কথপোকথন দেখান", "conversation.open": "কথপোকথন দেখান",
"conversation.with": "{names} এর সঙ্গে", "conversation.with": "{names} এর সঙ্গে",
"copypaste.copied": "অনুলিপিকৃত",
"directory.federated": "পরিচিত ফেডিভারসের থেকে", "directory.federated": "পরিচিত ফেডিভারসের থেকে",
"directory.local": "শুধু {domain} থেকে", "directory.local": "শুধু {domain} থেকে",
"directory.new_arrivals": "নতুন আগত", "directory.new_arrivals": "নতুন আগত",
"directory.recently_active": "সম্প্রতি সক্রিয়", "directory.recently_active": "সম্প্রতি সক্রিয়",
"dismissable_banner.dismiss": "সরাও",
"dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
"dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
"embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।", "embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।",
"embed.preview": "সেটা দেখতে এরকম হবে:", "embed.preview": "সেটা দেখতে এরকম হবে:",
"emoji_button.activity": "কার্যকলাপ", "emoji_button.activity": "কার্যকলাপ",
"emoji_button.clear": "পরিষ্কার",
"emoji_button.custom": "প্রথা", "emoji_button.custom": "প্রথা",
"emoji_button.flags": "পতাকা", "emoji_button.flags": "পতাকা",
"emoji_button.food": "খাদ্য ও পানীয়", "emoji_button.food": "খাদ্য ও পানীয়",
@ -217,10 +225,20 @@
"error.unexpected_crash.next_steps": "পাতাটি রিফ্রেশ করে চেষ্টা করুন। তবুও যদি না হয়, তবে আপনি অন্য একটি ব্রাউজার অথবা আপনার ডিভাইসের জন্যে এপের মাধ্যমে মাস্টডন ব্যাবহার করতে পারবেন।.", "error.unexpected_crash.next_steps": "পাতাটি রিফ্রেশ করে চেষ্টা করুন। তবুও যদি না হয়, তবে আপনি অন্য একটি ব্রাউজার অথবা আপনার ডিভাইসের জন্যে এপের মাধ্যমে মাস্টডন ব্যাবহার করতে পারবেন।.",
"errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন", "errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
"errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন", "errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
"explore.suggested_follows": "মানুষ",
"explore.title": "পরিব্রাজন",
"explore.trending_links": "সংবাদ", "explore.trending_links": "সংবাদ",
"explore.trending_statuses": "পোস্ট",
"explore.trending_tags": "হ্যাশট্যাগ",
"filter_modal.select_filter.expired": "মেয়াদোত্তীর্ণ",
"firehose.all": "সব",
"firehose.local": "এই সার্ভার",
"follow_request.authorize": "অনুমতি দিন", "follow_request.authorize": "অনুমতি দিন",
"follow_request.reject": "প্রত্যাখ্যান করুন", "follow_request.reject": "প্রত্যাখ্যান করুন",
"follow_requests.unlocked_explanation": "আপনার অ্যাকাউন্টটি লক না থাকলেও, {domain} কর্মীরা ভেবেছিলেন যে আপনি এই অ্যাকাউন্টগুলি থেকে ম্যানুয়ালি অনুসরণের অনুরোধগুলি পর্যালোচনা করতে চাইতে পারেন।", "follow_requests.unlocked_explanation": "আপনার অ্যাকাউন্টটি লক না থাকলেও, {domain} কর্মীরা ভেবেছিলেন যে আপনি এই অ্যাকাউন্টগুলি থেকে ম্যানুয়ালি অনুসরণের অনুরোধগুলি পর্যালোচনা করতে চাইতে পারেন।",
"footer.about": "পরিচিতি",
"footer.get_app": "অ্যাপ নামাও",
"footer.status": "অবস্থা",
"generic.saved": "সংরক্ষণ হয়েছে", "generic.saved": "সংরক্ষণ হয়েছে",
"getting_started.heading": "শুরু করা", "getting_started.heading": "শুরু করা",
"hashtag.column_header.tag_mode.all": "এবং {additional}", "hashtag.column_header.tag_mode.all": "এবং {additional}",
@ -274,6 +292,7 @@
"lightbox.close": "বন্ধ", "lightbox.close": "বন্ধ",
"lightbox.next": "পরবর্তী", "lightbox.next": "পরবর্তী",
"lightbox.previous": "পূর্ববর্তী", "lightbox.previous": "পূর্ববর্তী",
"link_preview.author": "{name} এর লিখা",
"lists.account.add": "তালিকাতে যুক্ত করতে", "lists.account.add": "তালিকাতে যুক্ত করতে",
"lists.account.remove": "তালিকা থেকে বাদ দিতে", "lists.account.remove": "তালিকা থেকে বাদ দিতে",
"lists.delete": "তালিকা মুছে ফেলতে", "lists.delete": "তালিকা মুছে ফেলতে",
@ -289,6 +308,8 @@
"media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান", "media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান",
"mute_modal.duration": "সময়কাল", "mute_modal.duration": "সময়কাল",
"mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?", "mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?",
"mute_modal.indefinite": "অনির্দিষ্ট",
"navigation_bar.about": "পরিচিতি",
"navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী", "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী",
"navigation_bar.bookmarks": "বুকমার্ক", "navigation_bar.bookmarks": "বুকমার্ক",
"navigation_bar.community_timeline": "স্থানীয় সময়রেখা", "navigation_bar.community_timeline": "স্থানীয় সময়রেখা",
@ -296,6 +317,8 @@
"navigation_bar.discover": "ঘুরে দেখুন", "navigation_bar.discover": "ঘুরে দেখুন",
"navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি", "navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
"navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে", "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
"navigation_bar.explore": "পরিব্রাজন",
"navigation_bar.favourites": "পছন্দসমূহ",
"navigation_bar.filters": "বন্ধ করা শব্দ", "navigation_bar.filters": "বন্ধ করা শব্দ",
"navigation_bar.follow_requests": "অনুসরণের অনুরোধগুলি", "navigation_bar.follow_requests": "অনুসরণের অনুরোধগুলি",
"navigation_bar.follows_and_followers": "অনুসরণ এবং অনুসরণকারী", "navigation_bar.follows_and_followers": "অনুসরণ এবং অনুসরণকারী",
@ -306,6 +329,7 @@
"navigation_bar.pins": "পিন দেওয়া টুট", "navigation_bar.pins": "পিন দেওয়া টুট",
"navigation_bar.preferences": "পছন্দসমূহ", "navigation_bar.preferences": "পছন্দসমূহ",
"navigation_bar.public_timeline": "যুক্তবিশ্বের সময়রেখা", "navigation_bar.public_timeline": "যুক্তবিশ্বের সময়রেখা",
"navigation_bar.search": "অনুসন্ধান",
"navigation_bar.security": "নিরাপত্তা", "navigation_bar.security": "নিরাপত্তা",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
"notification.follow": "{name} আপনাকে অনুসরণ করেছেন", "notification.follow": "{name} আপনাকে অনুসরণ করেছেন",
@ -317,6 +341,7 @@
"notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে", "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে",
"notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?", "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?",
"notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি", "notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি",
"notifications.column_settings.favourite": "পছন্দসমূহ:",
"notifications.column_settings.filter_bar.advanced": "সব শ্রেণীগুলো দেখানো", "notifications.column_settings.filter_bar.advanced": "সব শ্রেণীগুলো দেখানো",
"notifications.column_settings.filter_bar.category": "সংক্ষিপ্ত ছাঁকনি অংশ", "notifications.column_settings.filter_bar.category": "সংক্ষিপ্ত ছাঁকনি অংশ",
"notifications.column_settings.follow": "নতুন অনুসরণকারীরা:", "notifications.column_settings.follow": "নতুন অনুসরণকারীরা:",
@ -328,8 +353,10 @@
"notifications.column_settings.show": "কলামে দেখানো", "notifications.column_settings.show": "কলামে দেখানো",
"notifications.column_settings.sound": "শব্দ বাজানো", "notifications.column_settings.sound": "শব্দ বাজানো",
"notifications.column_settings.status": "New toots:", "notifications.column_settings.status": "New toots:",
"notifications.column_settings.update": "সম্পাদনা:",
"notifications.filter.all": "সব", "notifications.filter.all": "সব",
"notifications.filter.boosts": "সমর্থনগুলো", "notifications.filter.boosts": "সমর্থনগুলো",
"notifications.filter.favourites": "পছন্দসমূহ",
"notifications.filter.follows": "অনুসরণের", "notifications.filter.follows": "অনুসরণের",
"notifications.filter.mentions": "উল্লেখিত", "notifications.filter.mentions": "উল্লেখিত",
"notifications.filter.polls": "নির্বাচনের ফলাফল", "notifications.filter.polls": "নির্বাচনের ফলাফল",
@ -348,8 +375,11 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile", "onboarding.steps.share_profile.title": "Share your profile",
"onboarding.tips.accounts_from_other_servers": "<strong>তুমি কি জানতে?</strong> যেহেতু মাস্টোডন বিকেন্দ্রীভূত, কিছু অ্যাকাউন্ট তোমার নিজের ছাড়া অন্য কোনো সার্ভারে থাকতে পারে। অথচ তুমি তাদের সাথে কোনো সমস্যা ছাড়াই কথা বলতে পারছো! তাদের সার্ভার তাদের ব্যবহারকারী নামের দ্বিতীয় অর্ধাংশ!", "onboarding.tips.accounts_from_other_servers": "<strong>তুমি কি জানতে?</strong> যেহেতু মাস্টোডন বিকেন্দ্রীভূত, কিছু অ্যাকাউন্ট তোমার নিজের ছাড়া অন্য কোনো সার্ভারে থাকতে পারে। অথচ তুমি তাদের সাথে কোনো সমস্যা ছাড়াই কথা বলতে পারছো! তাদের সার্ভার তাদের ব্যবহারকারী নামের দ্বিতীয় অর্ধাংশ!",
"onboarding.tips.migration": "<strong>তুমি কি জানো?</strong> {domain} তোমার পছন্দ না হলে, ভবিষ্যতে তুমি অন্য কোনো সার্ভারে যেতে পারো তোমার অনুসরণকারীদেরকে না হারিয়েই। এমনকি তুমি নিজের সার্ভারও তৈরি করতে পারো!",
"picture_in_picture.restore": "ফিরত রাখো",
"poll.closed": "বন্ধ", "poll.closed": "বন্ধ",
"poll.refresh": "বদলেছে কিনা দেখতে", "poll.refresh": "বদলেছে কিনা দেখতে",
"poll.reveal": "ফলাফল দেখো",
"poll.total_people": "{count, plural, one {# ব্যক্তি} other {# ব্যক্তি}}", "poll.total_people": "{count, plural, one {# ব্যক্তি} other {# ব্যক্তি}}",
"poll.total_votes": "{count, plural, one {# ভোট} other {# ভোট}}", "poll.total_votes": "{count, plural, one {# ভোট} other {# ভোট}}",
"poll.vote": "ভোট", "poll.vote": "ভোট",
@ -367,23 +397,37 @@
"regeneration_indicator.label": "আসছে…", "regeneration_indicator.label": "আসছে…",
"regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!", "regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!",
"relative_time.days": "{number} দিন", "relative_time.days": "{number} দিন",
"relative_time.full.just_now": "এইমাত্র",
"relative_time.hours": "{number} ঘন্টা", "relative_time.hours": "{number} ঘন্টা",
"relative_time.just_now": "এখন", "relative_time.just_now": "এখন",
"relative_time.minutes": "{number}মিঃ", "relative_time.minutes": "{number}মিঃ",
"relative_time.seconds": "{number} সেকেন্ড", "relative_time.seconds": "{number} সেকেন্ড",
"relative_time.today": "আজ", "relative_time.today": "আজ",
"reply_indicator.cancel": "বাতিল করতে", "reply_indicator.cancel": "বাতিল করতে",
"report.block": "অবরোধ",
"report.categories.other": "অন্যান্য",
"report.categories.spam": "স্প্যাম",
"report.category.title_account": "প্রোফাইল",
"report.category.title_status": "পোস্ট",
"report.close": "সম্পন্ন",
"report.forward": "এটা আরো পাঠান {target} তে", "report.forward": "এটা আরো পাঠান {target} তে",
"report.forward_hint": "এই নিবন্ধনটি অন্য একটি সার্ভারে। অপ্রকাশিতনামাভাবে রিপোর্টের কপি সেখানেও কি পাঠাতে চান ?", "report.forward_hint": "এই নিবন্ধনটি অন্য একটি সার্ভারে। অপ্রকাশিতনামাভাবে রিপোর্টের কপি সেখানেও কি পাঠাতে চান ?",
"report.mute": "নিঃশব্দ",
"report.next": "পরবর্তী",
"report.placeholder": "অন্য কোনো মন্তব্য", "report.placeholder": "অন্য কোনো মন্তব্য",
"report.reasons.spam": "এটি স্প্যাম",
"report.submit": "জমা দিন", "report.submit": "জমা দিন",
"report.target": "{target} রিপোর্ট করুন", "report.target": "{target} রিপোর্ট করুন",
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
"report_notification.categories.legal": "আইনি",
"report_notification.categories.other": "অন্যান্য",
"report_notification.categories.spam": "স্প্যাম",
"search.placeholder": "অনুসন্ধান", "search.placeholder": "অনুসন্ধান",
"search_results.accounts": "প্রোফাইল",
"search_results.all": "সব",
"search_results.hashtags": "হ্যাশট্যাগগুলি", "search_results.hashtags": "হ্যাশট্যাগগুলি",
"search_results.statuses": "টুট", "search_results.statuses": "টুট",
"search_results.statuses_fts_disabled": "তাদের সামগ্রী দ্বারা টুটগুলি অনুসন্ধান এই মস্তোডন সার্ভারে সক্ষম নয়।", "server_banner.learn_more": "আরো জানো",
"search_results.total": "{count, number} {count, plural, one {ফলাফল} other {ফলাফল}}",
"sign_in_banner.sign_in": "Sign in", "sign_in_banner.sign_in": "Sign in",
"status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন", "status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন",
"status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন", "status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন",
@ -394,9 +438,12 @@
"status.copy": "লেখাটির লিংক কপি করতে", "status.copy": "লেখাটির লিংক কপি করতে",
"status.delete": "মুছে ফেলতে", "status.delete": "মুছে ফেলতে",
"status.detailed_status": "বিস্তারিত কথোপকথনের হিসেবে দেখতে", "status.detailed_status": "বিস্তারিত কথোপকথনের হিসেবে দেখতে",
"status.edit": "সম্পাদন",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.embed": "এমবেড করতে", "status.embed": "এমবেড করতে",
"status.favourite": "পছন্দ",
"status.filtered": "ছাঁকনিদিত", "status.filtered": "ছাঁকনিদিত",
"status.hide": "পোস্ট লুকাও",
"status.load_more": "আরো দেখুন", "status.load_more": "আরো দেখুন",
"status.media_hidden": "মিডিয়া লুকানো আছে", "status.media_hidden": "মিডিয়া লুকানো আছে",
"status.mention": "@{name}কে উল্লেখ করতে", "status.mention": "@{name}কে উল্লেখ করতে",
@ -423,10 +470,9 @@
"status.show_more": "আরো দেখাতে", "status.show_more": "আরো দেখাতে",
"status.show_more_all": "সবগুলোতে আরো দেখতে", "status.show_more_all": "সবগুলোতে আরো দেখতে",
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.translate": "অনুবাদ",
"status.unmute_conversation": "আলোচনার প্রজ্ঞাপন চালু করতে", "status.unmute_conversation": "আলোচনার প্রজ্ঞাপন চালু করতে",
"status.unpin": "নিজের পাতা থেকে পিন করে রাখাটির পিন খুলতে", "status.unpin": "নিজের পাতা থেকে পিন করে রাখাটির পিন খুলতে",
"suggestions.dismiss": "সাহায্যের পরামর্শগুলো সরাতে",
"suggestions.header": "আপনি হয়তোবা এগুলোতে আগ্রহী হতে পারেন…",
"tabs_bar.home": "বাড়ি", "tabs_bar.home": "বাড়ি",
"tabs_bar.notifications": "প্রজ্ঞাপনগুলো", "tabs_bar.notifications": "প্রজ্ঞাপনগুলো",
"time_remaining.days": "{number, plural, one {# day} other {# days}} বাকি আছে", "time_remaining.days": "{number, plural, one {# day} other {# days}} বাকি আছে",
@ -456,6 +502,7 @@
"upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন", "upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন",
"upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…", "upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
"upload_modal.apply": "প্রয়োগ করুন", "upload_modal.apply": "প্রয়োগ করুন",
"upload_modal.applying": "প্রয়োগ করা হচ্ছে…",
"upload_modal.choose_image": "ছবি নির্বাচন করুন", "upload_modal.choose_image": "ছবি নির্বাচন করুন",
"upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন", "upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন",
"upload_modal.edit_media": "মিডিয়া সম্পাদনা করুন", "upload_modal.edit_media": "মিডিয়া সম্পাদনা করুন",

View File

@ -495,9 +495,7 @@
"search_results.hashtags": "Gerioù-klik", "search_results.hashtags": "Gerioù-klik",
"search_results.nothing_found": "Disoc'h ebet gant ar gerioù-se", "search_results.nothing_found": "Disoc'h ebet gant ar gerioù-se",
"search_results.statuses": "Toudoù", "search_results.statuses": "Toudoù",
"search_results.statuses_fts_disabled": "Klask toudoù dre oc'h endalc'h n'eo ket aotreet war ar servijer-mañ.",
"search_results.title": "Klask {q}", "search_results.title": "Klask {q}",
"search_results.total": "{count, number} {count, plural, one {disoc'h} other {a zisoc'h}}",
"server_banner.active_users": "implijerien·ezed oberiant", "server_banner.active_users": "implijerien·ezed oberiant",
"server_banner.administered_by": "Meret gant :", "server_banner.administered_by": "Meret gant :",
"server_banner.learn_more": "Gouzout hiroc'h", "server_banner.learn_more": "Gouzout hiroc'h",
@ -556,8 +554,6 @@
"status.unpin": "Dispilhennañ eus ar profil", "status.unpin": "Dispilhennañ eus ar profil",
"subscribed_languages.save": "Enrollañ ar cheñchamantoù", "subscribed_languages.save": "Enrollañ ar cheñchamantoù",
"subscribed_languages.target": "Cheñch ar yezhoù koumanantet evit {target}", "subscribed_languages.target": "Cheñch ar yezhoù koumanantet evit {target}",
"suggestions.dismiss": "Dilezel damvenegoù",
"suggestions.header": "Marteze e vefec'h dedenet gant…",
"tabs_bar.home": "Degemer", "tabs_bar.home": "Degemer",
"tabs_bar.notifications": "Kemennoù", "tabs_bar.notifications": "Kemennoù",
"time_remaining.days": "{number, plural,one {# devezh} other {# a zevezh}} a chom", "time_remaining.days": "{number, plural,one {# devezh} other {# a zevezh}} a chom",

View File

@ -72,7 +72,6 @@
"report.submit": "Submit report", "report.submit": "Submit report",
"report.target": "Report {target}", "report.target": "Report {target}",
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
"search_results.total": "{count, plural, one {# result} other {# results}}",
"sign_in_banner.sign_in": "Sign in", "sign_in_banner.sign_in": "Sign in",
"status.admin_status": "Open this status in the moderation interface", "status.admin_status": "Open this status in the moderation interface",
"status.copy": "Copy link to status", "status.copy": "Copy link to status",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Cerca idiomes...", "compose.language.search": "Cerca idiomes...",
"compose.published.body": "Tut publicat.", "compose.published.body": "Tut publicat.",
"compose.published.open": "Obre", "compose.published.open": "Obre",
"compose.saved.body": "Tut desat.",
"compose_form.direct_message_warning_learn_more": "Més informació", "compose_form.direct_message_warning_learn_more": "Més informació",
"compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.", "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
"compose_form.hashtag_warning": "Aquest tut no apareixerà a les llistes d'etiquetes perquè no és públic. Només els tuts públics apareixen a les cerques per etiqueta.", "compose_form.hashtag_warning": "Aquest tut no apareixerà a les llistes d'etiquetes perquè no és públic. Només els tuts públics apareixen a les cerques per etiqueta.",
@ -300,6 +301,7 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} avui", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} avui",
"hashtag.follow": "Segueix l'etiqueta", "hashtag.follow": "Segueix l'etiqueta",
"hashtag.unfollow": "Deixa de seguir l'etiqueta", "hashtag.unfollow": "Deixa de seguir l'etiqueta",
"hashtags.and_other": "…i {count, plural, other {# més}}",
"home.actions.go_to_explore": "Mira què és tendència", "home.actions.go_to_explore": "Mira què és tendència",
"home.actions.go_to_suggestions": "Troba persones a seguir", "home.actions.go_to_suggestions": "Troba persones a seguir",
"home.column_settings.basic": "Bàsic", "home.column_settings.basic": "Bàsic",
@ -308,6 +310,9 @@
"home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que s'impulsen. Ara mateix es veu força tranquil·la, què et sembla si:", "home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que s'impulsen. Ara mateix es veu força tranquil·la, què et sembla si:",
"home.explore_prompt.title": "Aquest és la teva base a Mastodon.", "home.explore_prompt.title": "Aquest és la teva base a Mastodon.",
"home.hide_announcements": "Amaga els anuncis", "home.hide_announcements": "Amaga els anuncis",
"home.pending_critical_update.body": "Si us plau actualitza el teu servidor Mastodon tant aviat com sigui possible!",
"home.pending_critical_update.link": "Veure actualitzacions",
"home.pending_critical_update.title": "Actualització de seguretat crítica disponible!",
"home.show_announcements": "Mostra els anuncis", "home.show_announcements": "Mostra els anuncis",
"interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquest tut perquè l'autor sàpiga que t'ha agradat i desar-lo per a més endavant.", "interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquest tut perquè l'autor sàpiga que t'ha agradat i desar-lo per a més endavant.",
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.", "interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Llistes", "navigation_bar.lists": "Llistes",
"navigation_bar.logout": "Tanca la sessió", "navigation_bar.logout": "Tanca la sessió",
"navigation_bar.mutes": "Usuaris silenciats", "navigation_bar.mutes": "Usuaris silenciats",
"navigation_bar.opened_in_classic_interface": "Els tuts, comptes i altres pàgines especifiques s'obren per defecte en la interfície web clàssica.",
"navigation_bar.personal": "Personal", "navigation_bar.personal": "Personal",
"navigation_bar.pins": "Tuts fixats", "navigation_bar.pins": "Tuts fixats",
"navigation_bar.preferences": "Preferències", "navigation_bar.preferences": "Preferències",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Cancel·la", "reply_indicator.cancel": "Cancel·la",
"report.block": "Bloca", "report.block": "Bloca",
"report.block_explanation": "No veuràs els seus tuts. Ells no podran veure els teus tuts ni et podran seguir. Podran saber que estan blocats.", "report.block_explanation": "No veuràs els seus tuts. Ells no podran veure els teus tuts ni et podran seguir. Podran saber que estan blocats.",
"report.categories.legal": "Legal",
"report.categories.other": "Altres", "report.categories.other": "Altres",
"report.categories.spam": "Brossa", "report.categories.spam": "Brossa",
"report.categories.violation": "El contingut viola una o més regles del servidor", "report.categories.violation": "El contingut viola una o més regles del servidor",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Obrir enllaç a Mastodon", "search.quick_action.open_url": "Obrir enllaç a Mastodon",
"search.quick_action.status_search": "Tuts coincidint amb {x}", "search.quick_action.status_search": "Tuts coincidint amb {x}",
"search.search_or_paste": "Cerca o escriu l'URL", "search.search_or_paste": "Cerca o escriu l'URL",
"search_popout.full_text_search_disabled_message": "No disponible a {domain}.",
"search_popout.language_code": "Codi de llengua ISO",
"search_popout.options": "Opcions de cerca",
"search_popout.quick_actions": "Accions ràpides", "search_popout.quick_actions": "Accions ràpides",
"search_popout.recent": "Cerques recents", "search_popout.recent": "Cerques recents",
"search_popout.specific_date": "data específica",
"search_popout.user": "usuari",
"search_results.accounts": "Perfils", "search_results.accounts": "Perfils",
"search_results.all": "Tots", "search_results.all": "Tots",
"search_results.hashtags": "Etiquetes", "search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca", "search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
"search_results.see_all": "Veure'ls tots",
"search_results.statuses": "Tuts", "search_results.statuses": "Tuts",
"search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
"search_results.title": "Cerca de {q}", "search_results.title": "Cerca de {q}",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"server_banner.about_active_users": "Gent que ha fet servir aquest servidor en els darrers 30 dies (Usuaris Actius Mensuals)", "server_banner.about_active_users": "Gent que ha fet servir aquest servidor en els darrers 30 dies (Usuaris Actius Mensuals)",
"server_banner.active_users": "usuaris actius", "server_banner.active_users": "usuaris actius",
"server_banner.administered_by": "Administrat per:", "server_banner.administered_by": "Administrat per:",
@ -664,8 +675,6 @@
"subscribed_languages.lead": "Només els tuts en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre tuts en totes les llengües.", "subscribed_languages.lead": "Només els tuts en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre tuts en totes les llengües.",
"subscribed_languages.save": "Desa els canvis", "subscribed_languages.save": "Desa els canvis",
"subscribed_languages.target": "Canvia les llengües subscrites per a {target}", "subscribed_languages.target": "Canvia les llengües subscrites per a {target}",
"suggestions.dismiss": "Ignora el suggeriment",
"suggestions.header": "És possible que t'interessi…",
"tabs_bar.home": "Inici", "tabs_bar.home": "Inici",
"tabs_bar.notifications": "Notificacions", "tabs_bar.notifications": "Notificacions",
"time_remaining.days": "{number, plural, one {# dia restant} other {# dies restants}}", "time_remaining.days": "{number, plural, one {# dia restant} other {# dies restants}}",

View File

@ -523,9 +523,7 @@
"search_results.hashtags": "هەشتاگ", "search_results.hashtags": "هەشتاگ",
"search_results.nothing_found": "هیچ بۆ ئەم زاراوە گەڕانانە نەدۆزراوەتەوە", "search_results.nothing_found": "هیچ بۆ ئەم زاراوە گەڕانانە نەدۆزراوەتەوە",
"search_results.statuses": "توتەکان", "search_results.statuses": "توتەکان",
"search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
"search_results.title": "گەڕان بەدوای {q}", "search_results.title": "گەڕان بەدوای {q}",
"search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
"server_banner.about_active_users": "ئەو کەسانەی لە ماوەی ٣٠ ڕۆژی ڕابردوودا ئەم سێرڤەرە بەکاردەهێنن (بەکارهێنەرانی چالاک مانگانە)", "server_banner.about_active_users": "ئەو کەسانەی لە ماوەی ٣٠ ڕۆژی ڕابردوودا ئەم سێرڤەرە بەکاردەهێنن (بەکارهێنەرانی چالاک مانگانە)",
"server_banner.active_users": "بەکارهێنەرانی چالاک", "server_banner.active_users": "بەکارهێنەرانی چالاک",
"server_banner.administered_by": "بەڕێوەبردن لەلایەن:", "server_banner.administered_by": "بەڕێوەبردن لەلایەن:",
@ -591,8 +589,6 @@
"subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.", "subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.",
"subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان", "subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان",
"subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}", "subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}",
"suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
"suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
"tabs_bar.home": "سەرەتا", "tabs_bar.home": "سەرەتا",
"tabs_bar.notifications": "ئاگادارییەکان", "tabs_bar.notifications": "ئاگادارییەکان",
"time_remaining.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە", "time_remaining.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",

View File

@ -345,8 +345,6 @@
"search.placeholder": "Circà", "search.placeholder": "Circà",
"search_results.hashtags": "Hashtag", "search_results.hashtags": "Hashtag",
"search_results.statuses": "Statuti", "search_results.statuses": "Statuti",
"search_results.statuses_fts_disabled": "A ricerca di i cuntinuti di i statuti ùn hè micca attivata nant'à stu servore Mastodon.",
"search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}",
"sign_in_banner.sign_in": "Sign in", "sign_in_banner.sign_in": "Sign in",
"status.admin_account": "Apre l'interfaccia di muderazione per @{name}", "status.admin_account": "Apre l'interfaccia di muderazione per @{name}",
"status.admin_status": "Apre stu statutu in l'interfaccia di muderazione", "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione",
@ -388,8 +386,6 @@
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.unmute_conversation": "Ùn piattà più a cunversazione", "status.unmute_conversation": "Ùn piattà più a cunversazione",
"status.unpin": "Spuntarulà da u prufile", "status.unpin": "Spuntarulà da u prufile",
"suggestions.dismiss": "Righjittà a pruposta",
"suggestions.header": "Site forse interessatu·a da…",
"tabs_bar.home": "Accolta", "tabs_bar.home": "Accolta",
"tabs_bar.notifications": "Nutificazione", "tabs_bar.notifications": "Nutificazione",
"time_remaining.days": "{number, plural, one {# ghjornu ferma} other {# ghjorni fermanu}}", "time_remaining.days": "{number, plural, one {# ghjornu ferma} other {# ghjorni fermanu}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Prohledat jazyky...", "compose.language.search": "Prohledat jazyky...",
"compose.published.body": "Příspěvek zveřejněn.", "compose.published.body": "Příspěvek zveřejněn.",
"compose.published.open": "Otevřít", "compose.published.open": "Otevřít",
"compose.saved.body": "Příspěvek uložen.",
"compose_form.direct_message_warning_learn_more": "Zjistit více", "compose_form.direct_message_warning_learn_more": "Zjistit více",
"compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné citlivé informace.", "compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné citlivé informace.",
"compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, protože není veřejný. Podle hashtagu lze vyhledávat jen veřejné příspěvky.", "compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, protože není veřejný. Podle hashtagu lze vyhledávat jen veřejné příspěvky.",
@ -305,6 +306,9 @@
"home.explore_prompt.body": "Váš domovský kanál bude obsahovat směs příspěvků z hashtagů, které jste se rozhodli sledovat, lidí, které jste se rozhodli sledovat, a příspěvků, které boostují. Pokud vám to připadá příliš klidné, možná budete chtít:", "home.explore_prompt.body": "Váš domovský kanál bude obsahovat směs příspěvků z hashtagů, které jste se rozhodli sledovat, lidí, které jste se rozhodli sledovat, a příspěvků, které boostují. Pokud vám to připadá příliš klidné, možná budete chtít:",
"home.explore_prompt.title": "Toto je vaše domovská základna uvnitř Mastodonu.", "home.explore_prompt.title": "Toto je vaše domovská základna uvnitř Mastodonu.",
"home.hide_announcements": "Skrýt oznámení", "home.hide_announcements": "Skrýt oznámení",
"home.pending_critical_update.body": "Aktualizujte, prosím, svůj Mastodon server co nejdříve!",
"home.pending_critical_update.link": "Zobrazit aktualizace",
"home.pending_critical_update.title": "K dispozici je kritická bezpečnostní aktualizace!",
"home.show_announcements": "Zobrazit oznámení", "home.show_announcements": "Zobrazit oznámení",
"interaction_modal.description.favourite": "Pokud máte účet na Mastodonu, můžete tento příspěvek označit jako oblíbený a dát tak autorovi najevo, že si ho vážíte, a uložit si ho na později.", "interaction_modal.description.favourite": "Pokud máte účet na Mastodonu, můžete tento příspěvek označit jako oblíbený a dát tak autorovi najevo, že si ho vážíte, a uložit si ho na později.",
"interaction_modal.description.follow": "S účtem na Mastodonu můžete sledovat uživatele {name} a přijímat příspěvky ve vašem domovském kanálu.", "interaction_modal.description.follow": "S účtem na Mastodonu můžete sledovat uživatele {name} a přijímat příspěvky ve vašem domovském kanálu.",
@ -406,6 +410,7 @@
"navigation_bar.lists": "Seznamy", "navigation_bar.lists": "Seznamy",
"navigation_bar.logout": "Odhlásit se", "navigation_bar.logout": "Odhlásit se",
"navigation_bar.mutes": "Skrytí uživatelé", "navigation_bar.mutes": "Skrytí uživatelé",
"navigation_bar.opened_in_classic_interface": "Příspěvky, účty a další specifické stránky jsou ve výchozím nastavení otevřeny v klasickém webovém rozhraní.",
"navigation_bar.personal": "Osobní", "navigation_bar.personal": "Osobní",
"navigation_bar.pins": "Připnuté příspěvky", "navigation_bar.pins": "Připnuté příspěvky",
"navigation_bar.preferences": "Předvolby", "navigation_bar.preferences": "Předvolby",
@ -580,16 +585,18 @@
"search.quick_action.open_url": "Otevřít URL v Mastodonu", "search.quick_action.open_url": "Otevřít URL v Mastodonu",
"search.quick_action.status_search": "Příspěvky odpovídající {x}", "search.quick_action.status_search": "Příspěvky odpovídající {x}",
"search.search_or_paste": "Hledat nebo vložit URL", "search.search_or_paste": "Hledat nebo vložit URL",
"search_popout.language_code": "Kód jazyka podle ISO",
"search_popout.options": "Možnosti hledání",
"search_popout.quick_actions": "Rychlé akce", "search_popout.quick_actions": "Rychlé akce",
"search_popout.recent": "Nedávná vyhledávání", "search_popout.recent": "Nedávná vyhledávání",
"search_popout.user": "uživatel",
"search_results.accounts": "Profily", "search_results.accounts": "Profily",
"search_results.all": "Vše", "search_results.all": "Vše",
"search_results.hashtags": "Hashtagy", "search_results.hashtags": "Hashtagy",
"search_results.nothing_found": "Pro tyto hledané výrazy nebylo nic nenalezeno", "search_results.nothing_found": "Pro tyto hledané výrazy nebylo nic nenalezeno",
"search_results.see_all": "Zobrazit vše",
"search_results.statuses": "Příspěvky", "search_results.statuses": "Příspěvky",
"search_results.statuses_fts_disabled": "Vyhledávání příspěvků podle jejich obsahu není na tomto Mastodon serveru povoleno.",
"search_results.title": "Hledat {q}", "search_results.title": "Hledat {q}",
"search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledků} other {výsledků}}",
"server_banner.about_active_users": "Lidé používající tento server během posledních 30 dní (měsíční aktivní uživatelé)", "server_banner.about_active_users": "Lidé používající tento server během posledních 30 dní (měsíční aktivní uživatelé)",
"server_banner.active_users": "aktivní uživatelé", "server_banner.active_users": "aktivní uživatelé",
"server_banner.administered_by": "Spravováno:", "server_banner.administered_by": "Spravováno:",
@ -661,8 +668,6 @@
"subscribed_languages.lead": "Ve vašem domovském kanálu a časových osách se po změně budou objevovat pouze příspěvky ve vybraných jazycích. Pro příjem příspěvků ve všech jazycích nevyberte žádný jazyk.", "subscribed_languages.lead": "Ve vašem domovském kanálu a časových osách se po změně budou objevovat pouze příspěvky ve vybraných jazycích. Pro příjem příspěvků ve všech jazycích nevyberte žádný jazyk.",
"subscribed_languages.save": "Uložit změny", "subscribed_languages.save": "Uložit změny",
"subscribed_languages.target": "Změnit odebírané jazyky na {target}", "subscribed_languages.target": "Změnit odebírané jazyky na {target}",
"suggestions.dismiss": "Odmítnout návrh",
"suggestions.header": "Mohlo by vás zajímat…",
"tabs_bar.home": "Domů", "tabs_bar.home": "Domů",
"tabs_bar.notifications": "Oznámení", "tabs_bar.notifications": "Oznámení",
"time_remaining.days": "{number, plural, one {Zbývá # den} few {Zbývají # dny} many {Zbývá # dní} other {Zbývá # dní}}", "time_remaining.days": "{number, plural, one {Zbývá # den} few {Zbývají # dny} many {Zbývá # dní} other {Zbývá # dní}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Chwilio ieithoedd...", "compose.language.search": "Chwilio ieithoedd...",
"compose.published.body": "Postiad wedi ei gyhoeddi.", "compose.published.body": "Postiad wedi ei gyhoeddi.",
"compose.published.open": "Agor", "compose.published.open": "Agor",
"compose.saved.body": "Post wedi'i gadw.",
"compose_form.direct_message_warning_learn_more": "Dysgu mwy", "compose_form.direct_message_warning_learn_more": "Dysgu mwy",
"compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth sensitif dros Mastodon.", "compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth sensitif dros Mastodon.",
"compose_form.hashtag_warning": "Ni fydd y postiad hwn wedi ei restru o dan unrhyw hashnod gan nad yw'n gyhoeddus. Dim ond postiadau cyhoeddus y mae modd eu chwilio drwy hashnod.", "compose_form.hashtag_warning": "Ni fydd y postiad hwn wedi ei restru o dan unrhyw hashnod gan nad yw'n gyhoeddus. Dim ond postiadau cyhoeddus y mae modd eu chwilio drwy hashnod.",
@ -198,11 +199,11 @@
"directory.recently_active": "Ar-lein yn ddiweddar", "directory.recently_active": "Ar-lein yn ddiweddar",
"disabled_account_banner.account_settings": "Gosodiadau'r cyfrif", "disabled_account_banner.account_settings": "Gosodiadau'r cyfrif",
"disabled_account_banner.text": "Mae eich cyfrif {disabledAccount} wedi ei analluogi ar hyn o bryd.", "disabled_account_banner.text": "Mae eich cyfrif {disabledAccount} wedi ei analluogi ar hyn o bryd.",
"dismissable_banner.community_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl gyda chyfrifon ar {domain}.", "dismissable_banner.community_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl sydd â chyfrifon ar {domain}.",
"dismissable_banner.dismiss": "Diddymu", "dismissable_banner.dismiss": "Diddymu",
"dismissable_banner.explore_links": "Dyma'r straeon newyddion sy'n cael eu trafod ar hyn o bryd gan bobl ar y gweinydd hwn a rhai eraill ar y rhwydwaith datganoledig yma.", "dismissable_banner.explore_links": "Dyma straeon newyddion syn cael eu rhannu fwyaf ar y we gymdeithasol heddiw. Mae'r straeon newyddion diweddaraf sy'n cael eu postio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.",
"dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sy'n cael eu poblogeiddio heddiw. Mae postiadau mwy diweddar gyda mwy o hybiau a ffefrynnau yn cael eu graddio'n uwch.", "dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.",
"dismissable_banner.explore_tags": "Mae'r hashnodau hyn yn denu sylw ymhlith pobl ar y gweinydd hwn a gweinyddwyr eraill y rhwydwaith datganoledig ar hyn o bryd.", "dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.",
"dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.", "dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.",
"embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:", "embed.preview": "Dyma sut olwg fydd arno:",
@ -295,16 +296,23 @@
"hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain", "hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain",
"hashtag.column_settings.tag_mode.none": "Dim o'r rhain", "hashtag.column_settings.tag_mode.none": "Dim o'r rhain",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"hashtag.counter_by_accounts": "{cyfrif, lluosog, un {{counter} cyfranogwr} arall {{counter} cyfranogwr}}",
"hashtag.counter_by_uses": "{count, plural, one {postiad {counter}} other {postiad {counter}}}",
"hashtag.counter_by_uses_today": "{cyfrif, lluosog, un {{counter} postiad} arall {{counter} postiad}} heddiw",
"hashtag.follow": "Dilyn hashnod", "hashtag.follow": "Dilyn hashnod",
"hashtag.unfollow": "Dad-ddilyn hashnod", "hashtag.unfollow": "Dad-ddilyn hashnod",
"home.actions.go_to_explore": "Gweld beth sy'n tueddu", "hashtags.and_other": "…a {count, plural, other {# more}}",
"home.actions.go_to_explore": "Gweld beth yw'r tuedd",
"home.actions.go_to_suggestions": "Ffeindio pobl i'w dilyn", "home.actions.go_to_suggestions": "Ffeindio pobl i'w dilyn",
"home.column_settings.basic": "Syml", "home.column_settings.basic": "Syml",
"home.column_settings.show_reblogs": "Dangos hybiau", "home.column_settings.show_reblogs": "Dangos hybiau",
"home.column_settings.show_replies": "Dangos atebion", "home.column_settings.show_replies": "Dangos atebion",
"home.explore_prompt.body": "Bydd eich llif cartref yn cynnwys cymysgedd o bostiadau o'r hashnodau rydych chi wedi dewis eu dilyn, y bobl rydych chi wedi dewis eu dilyn, a'r postiadau maen nhw'n rhoi hwb iddyn nhw. Os yw hynny'n teimlo'n rhy dawel, efallai y byddwch am:", "home.explore_prompt.body": "Bydd eich llif cartref yn cynnwys cymysgedd o bostiadau o'r hashnodau rydych chi wedi dewis eu dilyn, y bobl rydych chi wedi dewis eu dilyn, a'r postiadau maen nhw'n rhoi hwb iddyn nhw. Os yw hynny'n teimlo'n rhy dawel, efallai y byddwch eisiau:",
"home.explore_prompt.title": "Dyma'ch cartref o fewn Mastodon.", "home.explore_prompt.title": "Dyma'ch cartref o fewn Mastodon.",
"home.hide_announcements": "Cuddio cyhoeddiadau", "home.hide_announcements": "Cuddio cyhoeddiadau",
"home.pending_critical_update.body": "Diweddarwch eich gweinydd Mastodon cyn gynted â phosibl!",
"home.pending_critical_update.link": "Gweld y diweddariadau",
"home.pending_critical_update.title": "Mae diweddariad diogelwch hanfodol ar gael!",
"home.show_announcements": "Dangos cyhoeddiadau", "home.show_announcements": "Dangos cyhoeddiadau",
"interaction_modal.description.favourite": "Gyda chyfrif ar Mastodon, gallwch chi hoffi'r postiad hwn er mwyn roi gwybod i'r awdur eich bod chi'n ei werthfawrogi ac yn ei gadw ar gyfer nes ymlaen.", "interaction_modal.description.favourite": "Gyda chyfrif ar Mastodon, gallwch chi hoffi'r postiad hwn er mwyn roi gwybod i'r awdur eich bod chi'n ei werthfawrogi ac yn ei gadw ar gyfer nes ymlaen.",
"interaction_modal.description.follow": "Gyda chyfrif ar Mastodon, gallwch ddilyn {name} i dderbyn eu postiadau yn eich llif cartref.", "interaction_modal.description.follow": "Gyda chyfrif ar Mastodon, gallwch ddilyn {name} i dderbyn eu postiadau yn eich llif cartref.",
@ -406,6 +414,7 @@
"navigation_bar.lists": "Rhestrau", "navigation_bar.lists": "Rhestrau",
"navigation_bar.logout": "Allgofnodi", "navigation_bar.logout": "Allgofnodi",
"navigation_bar.mutes": "Defnyddwyr wedi'u tewi", "navigation_bar.mutes": "Defnyddwyr wedi'u tewi",
"navigation_bar.opened_in_classic_interface": "Mae postiadau, cyfrifon a thudalennau penodol eraill yn cael eu hagor fel rhagosodiad yn y rhyngwyneb gwe clasurol.",
"navigation_bar.personal": "Personol", "navigation_bar.personal": "Personol",
"navigation_bar.pins": "Postiadau wedi eu pinio", "navigation_bar.pins": "Postiadau wedi eu pinio",
"navigation_bar.preferences": "Dewisiadau", "navigation_bar.preferences": "Dewisiadau",
@ -529,6 +538,7 @@
"reply_indicator.cancel": "Canslo", "reply_indicator.cancel": "Canslo",
"report.block": "Blocio", "report.block": "Blocio",
"report.block_explanation": "Ni welwch chi eu postiadau. Ni allan nhw weld eich postiadau na'ch dilyn. Byddan nhw'n gallu gweld eu bod nhw wedi'u rhwystro.", "report.block_explanation": "Ni welwch chi eu postiadau. Ni allan nhw weld eich postiadau na'ch dilyn. Byddan nhw'n gallu gweld eu bod nhw wedi'u rhwystro.",
"report.categories.legal": "Cyfreithiol",
"report.categories.other": "Arall", "report.categories.other": "Arall",
"report.categories.spam": "Sbam", "report.categories.spam": "Sbam",
"report.categories.violation": "Mae cynnwys yn torri un neu fwy o reolau'r gweinydd", "report.categories.violation": "Mae cynnwys yn torri un neu fwy o reolau'r gweinydd",
@ -580,16 +590,20 @@
"search.quick_action.open_url": "Agor URL yn Mastodon", "search.quick_action.open_url": "Agor URL yn Mastodon",
"search.quick_action.status_search": "Postiadau sy'n cyfateb i {x}", "search.quick_action.status_search": "Postiadau sy'n cyfateb i {x}",
"search.search_or_paste": "Chwilio neu gludo URL", "search.search_or_paste": "Chwilio neu gludo URL",
"search_popout.full_text_search_disabled_message": "Ddim ar gael ar {domain}.",
"search_popout.language_code": "Cod iaith ISO",
"search_popout.options": "Dewisiadau chwilio",
"search_popout.quick_actions": "Gweithredoedd cyflym", "search_popout.quick_actions": "Gweithredoedd cyflym",
"search_popout.recent": "Chwilio diweddar", "search_popout.recent": "Chwilio diweddar",
"search_popout.specific_date": "dyddiad penodol",
"search_popout.user": "defnyddiwr",
"search_results.accounts": "Proffilau", "search_results.accounts": "Proffilau",
"search_results.all": "Popeth", "search_results.all": "Popeth",
"search_results.hashtags": "Hashnodau", "search_results.hashtags": "Hashnodau",
"search_results.nothing_found": "Methu dod o hyd i unrhyw beth ar gyfer y termau chwilio hyn", "search_results.nothing_found": "Methu dod o hyd i unrhyw beth ar gyfer y termau chwilio hyn",
"search_results.see_all": "Gweld y cyfan",
"search_results.statuses": "Postiadau", "search_results.statuses": "Postiadau",
"search_results.statuses_fts_disabled": "Nid yw chwilio postiadau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
"search_results.title": "Chwilio am {q}", "search_results.title": "Chwilio am {q}",
"search_results.total": "{count, number} {count, plural, zero {canlyniad} one {canlyniad} two {ganlyniad} other {canlyniad}}",
"server_banner.about_active_users": "Pobl sy'n defnyddio'r gweinydd hwn yn ystod y 30 diwrnod diwethaf (Defnyddwyr Gweithredol Misol)", "server_banner.about_active_users": "Pobl sy'n defnyddio'r gweinydd hwn yn ystod y 30 diwrnod diwethaf (Defnyddwyr Gweithredol Misol)",
"server_banner.active_users": "defnyddwyr gweithredol", "server_banner.active_users": "defnyddwyr gweithredol",
"server_banner.administered_by": "Gweinyddir gan:", "server_banner.administered_by": "Gweinyddir gan:",
@ -661,8 +675,6 @@
"subscribed_languages.lead": "Dim ond postiadau mewn ieithoedd penodol fydd yn ymddangos yn eich ffrydiau ar ôl y newid. Dewiswch ddim byd i dderbyn postiadau ym mhob iaith.", "subscribed_languages.lead": "Dim ond postiadau mewn ieithoedd penodol fydd yn ymddangos yn eich ffrydiau ar ôl y newid. Dewiswch ddim byd i dderbyn postiadau ym mhob iaith.",
"subscribed_languages.save": "Cadw'r newidiadau", "subscribed_languages.save": "Cadw'r newidiadau",
"subscribed_languages.target": "Newid ieithoedd tanysgrifio {target}", "subscribed_languages.target": "Newid ieithoedd tanysgrifio {target}",
"suggestions.dismiss": "Diystyru'r awgrym",
"suggestions.header": "Efallai y bydd gennych ddiddordeb mewn…",
"tabs_bar.home": "Cartref", "tabs_bar.home": "Cartref",
"tabs_bar.notifications": "Hysbysiadau", "tabs_bar.notifications": "Hysbysiadau",
"time_remaining.days": "{number, plural, one {# diwrnod} other {# diwrnod}} ar ôl", "time_remaining.days": "{number, plural, one {# diwrnod} other {# diwrnod}} ar ôl",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Søg efter sprog...", "compose.language.search": "Søg efter sprog...",
"compose.published.body": "Indlæg udgivet.", "compose.published.body": "Indlæg udgivet.",
"compose.published.open": "Åbn", "compose.published.open": "Åbn",
"compose.saved.body": "Indlæg gemt.",
"compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.direct_message_warning_learn_more": "Få mere at vide",
"compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.",
"compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.", "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.",
@ -198,7 +199,7 @@
"directory.recently_active": "Aktive for nyligt", "directory.recently_active": "Aktive for nyligt",
"disabled_account_banner.account_settings": "Kontoindstillinger", "disabled_account_banner.account_settings": "Kontoindstillinger",
"disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.", "disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.",
"dismissable_banner.community_timeline": "Disse er de seneste offentlige indlæg fra personer med konti hostes af {domain}.", "dismissable_banner.community_timeline": "Disse er de seneste offentlige indlæg fra personer med konti hostet af {domain}.",
"dismissable_banner.dismiss": "Afvis", "dismissable_banner.dismiss": "Afvis",
"dismissable_banner.explore_links": "Der tales lige nu om disse nyhedshistorier af folk på denne og andre servere i det decentraliserede netværk.", "dismissable_banner.explore_links": "Der tales lige nu om disse nyhedshistorier af folk på denne og andre servere i det decentraliserede netværk.",
"dismissable_banner.explore_statuses": "Disse indlæg fra diverse sociale netværk vinder fodfæste i dag. Nyere indlæg med flere boosts og favoritter rangeres højere.", "dismissable_banner.explore_statuses": "Disse indlæg fra diverse sociale netværk vinder fodfæste i dag. Nyere indlæg med flere boosts og favoritter rangeres højere.",
@ -281,7 +282,7 @@
"footer.get_app": "Hent appen", "footer.get_app": "Hent appen",
"footer.invite": "Invitér personer", "footer.invite": "Invitér personer",
"footer.keyboard_shortcuts": "Tastaturgenveje", "footer.keyboard_shortcuts": "Tastaturgenveje",
"footer.privacy_policy": "Fortrolighedspolitik", "footer.privacy_policy": "Privatlivspolitik",
"footer.source_code": "Vis kildekode", "footer.source_code": "Vis kildekode",
"footer.status": "Status", "footer.status": "Status",
"generic.saved": "Gemt", "generic.saved": "Gemt",
@ -300,14 +301,18 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
"hashtag.follow": "Følg hashtag", "hashtag.follow": "Følg hashtag",
"hashtag.unfollow": "Stop med at følge hashtag", "hashtag.unfollow": "Stop med at følge hashtag",
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
"home.actions.go_to_explore": "Se, hvad som trender", "home.actions.go_to_explore": "Se, hvad som trender",
"home.actions.go_to_suggestions": "Find nogle personer at følge", "home.actions.go_to_suggestions": "Find nogle personer at følge",
"home.column_settings.basic": "Grundlæggende", "home.column_settings.basic": "Grundlæggende",
"home.column_settings.show_reblogs": "Vis boosts", "home.column_settings.show_reblogs": "Vis boosts",
"home.column_settings.show_replies": "Vis svar", "home.column_settings.show_replies": "Vis svar",
"home.explore_prompt.body": "Hjemmefeedet vil indeholde en blanding af indlæg fra de hashtags og personer, du følger samt de indlæg, de booster. Føles synes for stille, kan du prøve:", "home.explore_prompt.body": "Dit hjemmefeed vil have en blanding af indlæg fra de hashtags, du har valgt at følge, de personer, du har valgt at følge, og de indlæg, de booster. Hvis her virker for stille, kan du prøve:",
"home.explore_prompt.title": "Dette er din hjemmebase i Mastodon.", "home.explore_prompt.title": "Dette er din hjemmebase i Mastodon.",
"home.hide_announcements": "Skjul bekendtgørelser", "home.hide_announcements": "Skjul bekendtgørelser",
"home.pending_critical_update.body": "Opdater din Mastodon-server snarest muligt!",
"home.pending_critical_update.link": "Se opdateringer",
"home.pending_critical_update.title": "Kritisk sikkerhedsopdatering tilgængelig!",
"home.show_announcements": "Vis bekendtgørelser", "home.show_announcements": "Vis bekendtgørelser",
"interaction_modal.description.favourite": "Med en konto på Mastodon kan dette indlæg gøres til favorit for at lade forfatteren vide, at det værdsættes og gemmes til senere.", "interaction_modal.description.favourite": "Med en konto på Mastodon kan dette indlæg gøres til favorit for at lade forfatteren vide, at det værdsættes og gemmes til senere.",
"interaction_modal.description.follow": "Med en konto på Mastodon kan du følge {name} for at modtage vedkommendes indlæg i dit hjemmefeed.", "interaction_modal.description.follow": "Med en konto på Mastodon kan du følge {name} for at modtage vedkommendes indlæg i dit hjemmefeed.",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Lister", "navigation_bar.lists": "Lister",
"navigation_bar.logout": "Log af", "navigation_bar.logout": "Log af",
"navigation_bar.mutes": "Skjulte brugere (mutede)", "navigation_bar.mutes": "Skjulte brugere (mutede)",
"navigation_bar.opened_in_classic_interface": "Indlæg, konti og visse andre sider åbnes som standard i den klassiske webgrænseflade.",
"navigation_bar.personal": "Personlig", "navigation_bar.personal": "Personlig",
"navigation_bar.pins": "Fastgjorte indlæg", "navigation_bar.pins": "Fastgjorte indlæg",
"navigation_bar.preferences": "Præferencer", "navigation_bar.preferences": "Præferencer",
@ -504,7 +510,7 @@
"poll.votes": "{votes, plural, one {# stemme} other {# stemmer}}", "poll.votes": "{votes, plural, one {# stemme} other {# stemmer}}",
"poll_button.add_poll": "Tilføj en afstemning", "poll_button.add_poll": "Tilføj en afstemning",
"poll_button.remove_poll": "Fjern afstemning", "poll_button.remove_poll": "Fjern afstemning",
"privacy.change": "Justér indlægsfortrolighed", "privacy.change": "Tilpas indlægsfortrolighed",
"privacy.direct.long": "Kun synlig for nævnte brugere", "privacy.direct.long": "Kun synlig for nævnte brugere",
"privacy.direct.short": "Kun omtalte personer", "privacy.direct.short": "Kun omtalte personer",
"privacy.private.long": "Kun synlig for følgere", "privacy.private.long": "Kun synlig for følgere",
@ -514,7 +520,7 @@
"privacy.unlisted.long": "Synlig for alle, men med fravalgt visning i opdagelsesfunktioner", "privacy.unlisted.long": "Synlig for alle, men med fravalgt visning i opdagelsesfunktioner",
"privacy.unlisted.short": "Diskret", "privacy.unlisted.short": "Diskret",
"privacy_policy.last_updated": "Senest opdateret {date}", "privacy_policy.last_updated": "Senest opdateret {date}",
"privacy_policy.title": "Fortrolighedspolitik", "privacy_policy.title": "Privatlivspolitik",
"refresh": "Genindlæs", "refresh": "Genindlæs",
"regeneration_indicator.label": "Indlæser…", "regeneration_indicator.label": "Indlæser…",
"regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!", "regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Afbryd", "reply_indicator.cancel": "Afbryd",
"report.block": "Blokér", "report.block": "Blokér",
"report.block_explanation": "Du vil ikke se vedkommendes indlæg. Vedkommende vil ikke kunne se dine indlæg eller følge dig. Vedkommende vil kunne se, at de er blokeret.", "report.block_explanation": "Du vil ikke se vedkommendes indlæg. Vedkommende vil ikke kunne se dine indlæg eller følge dig. Vedkommende vil kunne se, at de er blokeret.",
"report.categories.legal": "Juridisk",
"report.categories.other": "Andre", "report.categories.other": "Andre",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "Indhold overtræder en eller flere serverregler", "report.categories.violation": "Indhold overtræder en eller flere serverregler",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Åbn URL i Mastodon", "search.quick_action.open_url": "Åbn URL i Mastodon",
"search.quick_action.status_search": "Indlæg matchende {x}", "search.quick_action.status_search": "Indlæg matchende {x}",
"search.search_or_paste": "Søg efter eller angiv URL", "search.search_or_paste": "Søg efter eller angiv URL",
"search_popout.full_text_search_disabled_message": "Utilgængelig på {domain}.",
"search_popout.language_code": "ISO-sprogkode",
"search_popout.options": "Søgevalg",
"search_popout.quick_actions": "Hurtige handlinger", "search_popout.quick_actions": "Hurtige handlinger",
"search_popout.recent": "Seneste søgninger", "search_popout.recent": "Seneste søgninger",
"search_popout.specific_date": "bestemt dato",
"search_popout.user": "bruger",
"search_results.accounts": "Profiler", "search_results.accounts": "Profiler",
"search_results.all": "Alle", "search_results.all": "Alle",
"search_results.hashtags": "Hashtags", "search_results.hashtags": "Hashtags",
"search_results.nothing_found": "Ingen resultater for disse søgeord", "search_results.nothing_found": "Ingen resultater for disse søgeord",
"search_results.see_all": "Vis alle",
"search_results.statuses": "Indlæg", "search_results.statuses": "Indlæg",
"search_results.statuses_fts_disabled": "Søgning på indlæg efter deres indhold ikke aktiveret på denne Mastodon-server.",
"search_results.title": "Søg efter {q}", "search_results.title": "Søg efter {q}",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
"server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)", "server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
"server_banner.active_users": "aktive brugere", "server_banner.active_users": "aktive brugere",
"server_banner.administered_by": "Håndteres af:", "server_banner.administered_by": "Håndteres af:",
@ -637,7 +648,7 @@
"status.pin": "Fastgør til profil", "status.pin": "Fastgør til profil",
"status.pinned": "Fastgjort indlæg", "status.pinned": "Fastgjort indlæg",
"status.read_more": "Læs mere", "status.read_more": "Læs mere",
"status.reblog": "Boost", "status.reblog": "Fremhæv",
"status.reblog_private": "Boost med oprindelig synlighed", "status.reblog_private": "Boost med oprindelig synlighed",
"status.reblogged_by": "{name} fremhævede", "status.reblogged_by": "{name} fremhævede",
"status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.", "status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.",
@ -664,8 +675,6 @@
"subscribed_languages.lead": "Kun indlæg på udvalgte sprog vil fremgå på dine hjemme- og listetidslinjer efter ændringen. Vælg ingen for at modtage indlæg på alle sprog.", "subscribed_languages.lead": "Kun indlæg på udvalgte sprog vil fremgå på dine hjemme- og listetidslinjer efter ændringen. Vælg ingen for at modtage indlæg på alle sprog.",
"subscribed_languages.save": "Gem ændringer", "subscribed_languages.save": "Gem ændringer",
"subscribed_languages.target": "Skift abonnementssprog for {target}", "subscribed_languages.target": "Skift abonnementssprog for {target}",
"suggestions.dismiss": "Afvis forslag",
"suggestions.header": "Du er måske interesseret i…",
"tabs_bar.home": "Hjem", "tabs_bar.home": "Hjem",
"tabs_bar.notifications": "Notifikationer", "tabs_bar.notifications": "Notifikationer",
"time_remaining.days": "{number, plural, one {# dag} other {# dage}} tilbage", "time_remaining.days": "{number, plural, one {# dag} other {# dage}} tilbage",

View File

@ -41,7 +41,7 @@
"account.go_to_profile": "Profil aufrufen", "account.go_to_profile": "Profil aufrufen",
"account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden", "account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden",
"account.in_memoriam": "Zum Andenken.", "account.in_memoriam": "Zum Andenken.",
"account.joined_short": "Registriert", "account.joined_short": "Beigetreten",
"account.languages": "Genutzte Sprachen überarbeiten", "account.languages": "Genutzte Sprachen überarbeiten",
"account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt", "account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt",
"account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.", "account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.",
@ -71,8 +71,8 @@
"account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben", "account.unmute_notifications_short": "Stummschaltung der Benachrichtigungen aufheben",
"account.unmute_short": "Stummschaltung aufheben", "account.unmute_short": "Stummschaltung aufheben",
"account_note.placeholder": "Notiz durch Klicken hinzufügen", "account_note.placeholder": "Notiz durch Klicken hinzufügen",
"admin.dashboard.daily_retention": "Verweildauer der Nutzer*innen pro Tag nach der Registrierung", "admin.dashboard.daily_retention": "Verweildauer der Benutzer*innen pro Tag nach der Registrierung",
"admin.dashboard.monthly_retention": "Verweildauer der Nutzer*innen pro Monat nach der Registrierung", "admin.dashboard.monthly_retention": "Verweildauer der Benutzer*innen pro Monat nach der Registrierung",
"admin.dashboard.retention.average": "Durchschnitt", "admin.dashboard.retention.average": "Durchschnitt",
"admin.dashboard.retention.cohort": "Monat der Registrierung", "admin.dashboard.retention.cohort": "Monat der Registrierung",
"admin.dashboard.retention.cohort_size": "Neue Konten", "admin.dashboard.retention.cohort_size": "Neue Konten",
@ -88,7 +88,7 @@
"attachments_list.unprocessed": "(ausstehend)", "attachments_list.unprocessed": "(ausstehend)",
"audio.hide": "Audio ausblenden", "audio.hide": "Audio ausblenden",
"autosuggest_hashtag.per_week": "{count} pro Woche", "autosuggest_hashtag.per_week": "{count} pro Woche",
"boost_modal.combo": "Mit {combo} wird dieses Fenster beim nächsten Mal nicht mehr angezeigt", "boost_modal.combo": "Drücke {combo}, um das beim nächsten Mal zu überspringen",
"bundle_column_error.copy_stacktrace": "Fehlerbericht kopieren", "bundle_column_error.copy_stacktrace": "Fehlerbericht kopieren",
"bundle_column_error.error.body": "Die angeforderte Seite konnte nicht dargestellt werden. Dies könnte auf einen Fehler in unserem Code oder auf ein Browser-Kompatibilitätsproblem zurückzuführen sein.", "bundle_column_error.error.body": "Die angeforderte Seite konnte nicht dargestellt werden. Dies könnte auf einen Fehler in unserem Code oder auf ein Browser-Kompatibilitätsproblem zurückzuführen sein.",
"bundle_column_error.error.title": "Oh nein!", "bundle_column_error.error.title": "Oh nein!",
@ -119,7 +119,7 @@
"column.home": "Startseite", "column.home": "Startseite",
"column.lists": "Listen", "column.lists": "Listen",
"column.mutes": "Stummgeschaltete Profile", "column.mutes": "Stummgeschaltete Profile",
"column.notifications": "Mitteilungen", "column.notifications": "Benachrichtigungen",
"column.pins": "Angeheftete Beiträge", "column.pins": "Angeheftete Beiträge",
"column.public": "Föderierte Timeline", "column.public": "Föderierte Timeline",
"column_back_button.label": "Zurück", "column_back_button.label": "Zurück",
@ -137,6 +137,7 @@
"compose.language.search": "Sprachen suchen …", "compose.language.search": "Sprachen suchen …",
"compose.published.body": "Beitrag veröffentlicht.", "compose.published.body": "Beitrag veröffentlicht.",
"compose.published.open": "Öffnen", "compose.published.open": "Öffnen",
"compose.saved.body": "Beitrag gespeichert.",
"compose_form.direct_message_warning_learn_more": "Mehr erfahren", "compose_form.direct_message_warning_learn_more": "Mehr erfahren",
"compose_form.encryption_warning": "Beiträge auf Mastodon sind nicht Ende-zu-Ende-verschlüsselt. Teile keine sensiblen Informationen über Mastodon.", "compose_form.encryption_warning": "Beiträge auf Mastodon sind nicht Ende-zu-Ende-verschlüsselt. Teile keine sensiblen Informationen über Mastodon.",
"compose_form.hashtag_warning": "Dieser Beitrag wird unter keinem Hashtag sichtbar sein, weil er nicht öffentlich ist. Nur öffentliche Beiträge können nach Hashtags durchsucht werden.", "compose_form.hashtag_warning": "Dieser Beitrag wird unter keinem Hashtag sichtbar sein, weil er nicht öffentlich ist. Nur öffentliche Beiträge können nach Hashtags durchsucht werden.",
@ -166,7 +167,7 @@
"confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen", "confirmations.cancel_follow_request.confirm": "Anfrage zurückziehen",
"confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?", "confirmations.cancel_follow_request.message": "Möchtest du deine Anfrage, {name} zu folgen, wirklich zurückziehen?",
"confirmations.delete.confirm": "Löschen", "confirmations.delete.confirm": "Löschen",
"confirmations.delete.message": "Bist du dir sicher, dass du diesen Beitrag löschen möchtest?", "confirmations.delete.message": "Möchtest du diesen Beitrag wirklich löschen?",
"confirmations.delete_list.confirm": "Löschen", "confirmations.delete_list.confirm": "Löschen",
"confirmations.delete_list.message": "Möchtest du diese Liste endgültig löschen?", "confirmations.delete_list.message": "Möchtest du diese Liste endgültig löschen?",
"confirmations.discard_edit_media.confirm": "Verwerfen", "confirmations.discard_edit_media.confirm": "Verwerfen",
@ -179,13 +180,13 @@
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
"confirmations.mute.confirm": "Stummschalten", "confirmations.mute.confirm": "Stummschalten",
"confirmations.mute.explanation": "Dies wird Beiträge von dieser Person und Beiträge, die diese Person erwähnen, ausblenden, aber es wird der Person trotzdem erlauben, deine Beiträge zu sehen und dir zu folgen.", "confirmations.mute.explanation": "Dies wird Beiträge von dieser Person und Beiträge, die diese Person erwähnen, ausblenden, aber es wird der Person trotzdem erlauben, deine Beiträge zu sehen und dir zu folgen.",
"confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", "confirmations.mute.message": "Möchtest du {name} wirklich stummschalten?",
"confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.confirm": "Löschen und neu erstellen",
"confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.", "confirmations.redraft.message": "Möchtest du diesen Beitrag wirklich löschen und neu verfassen? Favoriten und geteilte Beiträge gehen verloren, und Antworten auf den ursprünglichen Beitrag verlieren den Zusammenhang.",
"confirmations.reply.confirm": "Antworten", "confirmations.reply.confirm": "Antworten",
"confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?", "confirmations.reply.message": "Wenn du jetzt darauf antwortest, wird der andere Beitrag, an dem du gerade geschrieben hast, verworfen. Möchtest du wirklich fortfahren?",
"confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.confirm": "Entfolgen",
"confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", "confirmations.unfollow.message": "Möchtest du {name} wirklich entfolgen?",
"conversation.delete": "Unterhaltung löschen", "conversation.delete": "Unterhaltung löschen",
"conversation.mark_as_read": "Als gelesen markieren", "conversation.mark_as_read": "Als gelesen markieren",
"conversation.open": "Unterhaltung anzeigen", "conversation.open": "Unterhaltung anzeigen",
@ -194,15 +195,15 @@
"copypaste.copy_to_clipboard": "In die Zwischenablage kopieren", "copypaste.copy_to_clipboard": "In die Zwischenablage kopieren",
"directory.federated": "Aus bekanntem Fediverse", "directory.federated": "Aus bekanntem Fediverse",
"directory.local": "Nur von der Domain {domain}", "directory.local": "Nur von der Domain {domain}",
"directory.new_arrivals": "Neue Profile", "directory.new_arrivals": "Neue Benutzer*innen",
"directory.recently_active": "Kürzlich aktiv", "directory.recently_active": "Kürzlich aktiv",
"disabled_account_banner.account_settings": "Kontoeinstellungen", "disabled_account_banner.account_settings": "Kontoeinstellungen",
"disabled_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert.", "disabled_account_banner.text": "Dein Konto {disabledAccount} ist derzeit deaktiviert.",
"dismissable_banner.community_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen, deren Konten von {domain} verwaltet werden.", "dismissable_banner.community_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen, deren Konten von {domain} verwaltet werden.",
"dismissable_banner.dismiss": "Ablehnen", "dismissable_banner.dismiss": "Ablehnen",
"dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Profilen veröffentlicht wurden, werden höher eingestuft.", "dismissable_banner.explore_links": "Diese Nachrichten werden heute am häufigsten im sozialen Netzwerk geteilt. Neuere Nachrichten, die von vielen verschiedenen Konten veröffentlicht wurden, haben höhere Priorität.",
"dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.", "dismissable_banner.explore_statuses": "Diese Beiträge stammen aus dem gesamten sozialen Netzwerk und gewinnen derzeit an Reichweite. Neuere Beiträge, die häufiger geteilt und favorisiert wurden, werden höher eingestuft.",
"dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Profilen verwendet werden, werden höher eingestuft.", "dismissable_banner.explore_tags": "Das sind Hashtags, die derzeit an Reichweite gewinnen. Hashtags, die von vielen verschiedenen Konten verwendet werden, haben höhere Priorität.",
"dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.", "dismissable_banner.public_timeline": "Das sind die neuesten öffentlichen Beiträge von Profilen im sozialen Netzwerk, denen Leute auf {domain} folgen.",
"embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.", "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.",
"embed.preview": "Vorschau:", "embed.preview": "Vorschau:",
@ -227,19 +228,19 @@
"empty_column.blocks": "Du hast bisher keine Profile blockiert.", "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.bookmarked_statuses": "Du hast bisher keine Beiträge als Lesezeichen abgelegt. Sobald du einen Beitrag als Lesezeichen speicherst, wird er hier erscheinen.",
"empty_column.community": "Die lokale Timeline ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!", "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 angezeigt.", "empty_column.direct": "Du hast noch keine privaten Erwähnungen. Sobald du eine sendest oder erhältst, wird sie hier erscheinen.",
"empty_column.domain_blocks": "Du hast noch keine Domains blockiert.", "empty_column.domain_blocks": "Du hast noch keine Domains blockiert.",
"empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!", "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!",
"empty_column.favourited_statuses": "Du hast noch keine Beiträge favorisiert. Sobald du einen favorisierst, wird er hier erscheinen.", "empty_column.favourited_statuses": "Du hast noch keine Beiträge favorisiert. Sobald du einen favorisierst, wird er hier erscheinen.",
"empty_column.favourites": "Diesen Beitrag hat bisher noch niemand favorisiert. Sobald es jemand tut, wird das Profil hier angezeigt.", "empty_column.favourites": "Diesen Beitrag hat bisher noch niemand favorisiert. Sobald es jemand tut, wird das Profil hier erscheinen.",
"empty_column.follow_requests": "Es liegen derzeit keine Follower-Anfragen vor. Sobald du eine erhältst, wird sie hier angezeigt.", "empty_column.follow_requests": "Es liegen derzeit keine Follower-Anfragen vor. Sobald du eine erhältst, wird sie hier erscheinen.",
"empty_column.followed_tags": "Du folgst noch keinen Hashtags. Wenn du dies tust, werden sie hier erscheinen.", "empty_column.followed_tags": "Du folgst noch keinen Hashtags. Wenn du dies tust, werden sie hier erscheinen.",
"empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.",
"empty_column.home": "Die Timeline deiner Startseite ist leer! Folge mehr Leuten, um sie zu füllen.", "empty_column.home": "Die Timeline deiner Startseite ist leer! Folge mehr Leuten, um sie zu füllen.",
"empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen, werden sie hier erscheinen.", "empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen, werden sie hier erscheinen.",
"empty_column.lists": "Du hast noch keine Listen. Sobald du eine anlegst, wird sie hier erscheinen.", "empty_column.lists": "Du hast noch keine Listen. Sobald du eine anlegst, wird sie hier erscheinen.",
"empty_column.mutes": "Du hast keine Profile stummgeschaltet.", "empty_column.mutes": "Du hast keine Profile stummgeschaltet.",
"empty_column.notifications": "Du hast noch keine Mitteilungen. Sobald du mit anderen Personen interagierst, wirst du hier darüber benachrichtigt.", "empty_column.notifications": "Du hast noch keine Benachrichtigungen. Sobald andere Personen mit dir interagieren, wirst du hier darüber informiert.",
"empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Timeline aufzufüllen", "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Timeline aufzufüllen",
"error.unexpected_crash.explanation": "Wegen eines Fehlers in unserem Code oder aufgrund einer Browser-Inkompatibilität kann diese Seite nicht korrekt angezeigt werden.", "error.unexpected_crash.explanation": "Wegen eines Fehlers in unserem Code oder aufgrund einer Browser-Inkompatibilität kann diese Seite nicht korrekt angezeigt werden.",
"error.unexpected_crash.explanation_addons": "Diese Seite konnte nicht korrekt angezeigt werden. Dieser Fehler wird wahrscheinlich durch ein Browser-Add-on oder automatische Übersetzungswerkzeuge verursacht.", "error.unexpected_crash.explanation_addons": "Diese Seite konnte nicht korrekt angezeigt werden. Dieser Fehler wird wahrscheinlich durch ein Browser-Add-on oder automatische Übersetzungswerkzeuge verursacht.",
@ -300,14 +301,18 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}} heute", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}} heute",
"hashtag.follow": "Hashtag folgen", "hashtag.follow": "Hashtag folgen",
"hashtag.unfollow": "Hashtag entfolgen", "hashtag.unfollow": "Hashtag entfolgen",
"hashtags.and_other": "… und {count, plural, one{# weiterer} other {# weitere}}",
"home.actions.go_to_explore": "Trends ansehen", "home.actions.go_to_explore": "Trends ansehen",
"home.actions.go_to_suggestions": "Profile zum Folgen finden", "home.actions.go_to_suggestions": "Profile zum Folgen finden",
"home.column_settings.basic": "Einfach", "home.column_settings.basic": "Allgemein",
"home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen",
"home.column_settings.show_replies": "Antworten anzeigen", "home.column_settings.show_replies": "Antworten anzeigen",
"home.explore_prompt.body": "Deine Startseite wird eine Mischung aus Beiträgen mit Hashtags und den Profilen, denen du folgst sowie den Beiträgen, die sie teilen, enthalten. Sollte es sich zu still anfühlen:", "home.explore_prompt.body": "Deine Startseite wird eine Mischung aus Beiträgen mit Hashtags und den Profilen, denen du folgst sowie den Beiträgen, die sie teilen, enthalten. Sollte es sich zu still anfühlen:",
"home.explore_prompt.title": "Das ist dein Zuhause bei Mastodon.", "home.explore_prompt.title": "Das ist dein Zuhause bei Mastodon.",
"home.hide_announcements": "Ankündigungen ausblenden", "home.hide_announcements": "Ankündigungen ausblenden",
"home.pending_critical_update.body": "Bitte aktualisiere deinen Mastodon-Server so schnell wie möglich!",
"home.pending_critical_update.link": "Updates ansehen",
"home.pending_critical_update.title": "Kritisches Sicherheitsupdate verfügbar!",
"home.show_announcements": "Ankündigungen anzeigen", "home.show_announcements": "Ankündigungen anzeigen",
"interaction_modal.description.favourite": "Mit einem Mastodon-Konto kannst du diesen Beitrag favorisieren, um deine Wertschätzung auszudrücken, und ihn für einen späteren Zeitpunkt speichern.", "interaction_modal.description.favourite": "Mit einem Mastodon-Konto kannst du diesen Beitrag favorisieren, um deine Wertschätzung auszudrücken, und ihn für einen späteren Zeitpunkt speichern.",
"interaction_modal.description.follow": "Mit einem Mastodon-Konto kannst du {name} folgen, um die Beiträge auf deiner Startseite zu sehen.", "interaction_modal.description.follow": "Mit einem Mastodon-Konto kannst du {name} folgen, um die Beiträge auf deiner Startseite zu sehen.",
@ -378,8 +383,8 @@
"lists.new.create": "Neue Liste erstellen", "lists.new.create": "Neue Liste erstellen",
"lists.new.title_placeholder": "Titel der neuen Liste", "lists.new.title_placeholder": "Titel der neuen Liste",
"lists.replies_policy.followed": "Alle folgenden Profile", "lists.replies_policy.followed": "Alle folgenden Profile",
"lists.replies_policy.list": "Mitglieder der Liste", "lists.replies_policy.list": "Mitglieder*innen der Liste",
"lists.replies_policy.none": "Niemandem", "lists.replies_policy.none": "Niemanden",
"lists.replies_policy.title": "Antworten anzeigen für:", "lists.replies_policy.title": "Antworten anzeigen für:",
"lists.search": "Suche nach Leuten, denen du folgst", "lists.search": "Suche nach Leuten, denen du folgst",
"lists.subheading": "Deine Listen", "lists.subheading": "Deine Listen",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Listen", "navigation_bar.lists": "Listen",
"navigation_bar.logout": "Abmelden", "navigation_bar.logout": "Abmelden",
"navigation_bar.mutes": "Stummgeschaltete Profile", "navigation_bar.mutes": "Stummgeschaltete Profile",
"navigation_bar.opened_in_classic_interface": "Beiträge, Konten und andere bestimmte Seiten werden standardmäßig im klassischen Webinterface geöffnet.",
"navigation_bar.personal": "Persönlich", "navigation_bar.personal": "Persönlich",
"navigation_bar.pins": "Angeheftete Beiträge", "navigation_bar.pins": "Angeheftete Beiträge",
"navigation_bar.preferences": "Einstellungen", "navigation_bar.preferences": "Einstellungen",
@ -425,10 +431,10 @@
"notification.own_poll": "Deine Umfrage ist beendet", "notification.own_poll": "Deine Umfrage ist beendet",
"notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet", "notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet",
"notification.reblog": "{name} teilte deinen Beitrag", "notification.reblog": "{name} teilte deinen Beitrag",
"notification.status": "{name} veröffentlichte gerade", "notification.status": "{name} hat gerade etwas gepostet",
"notification.update": "{name} bearbeitete einen Beitrag", "notification.update": "{name} bearbeitete einen Beitrag",
"notifications.clear": "Mitteilungen löschen", "notifications.clear": "Benachrichtigungen löschen",
"notifications.clear_confirmation": "Möchtest du diese Mitteilungen für immer löschen?", "notifications.clear_confirmation": "Möchtest du diese Benachrichtigung für immer löschen?",
"notifications.column_settings.admin.report": "Neue Meldungen:", "notifications.column_settings.admin.report": "Neue Meldungen:",
"notifications.column_settings.admin.sign_up": "Neue Registrierungen:", "notifications.column_settings.admin.sign_up": "Neue Registrierungen:",
"notifications.column_settings.alert": "Desktop-Benachrichtigungen", "notifications.column_settings.alert": "Desktop-Benachrichtigungen",
@ -442,22 +448,22 @@
"notifications.column_settings.poll": "Umfrageergebnisse:", "notifications.column_settings.poll": "Umfrageergebnisse:",
"notifications.column_settings.push": "Push-Benachrichtigungen", "notifications.column_settings.push": "Push-Benachrichtigungen",
"notifications.column_settings.reblog": "Geteilte Beiträge:", "notifications.column_settings.reblog": "Geteilte Beiträge:",
"notifications.column_settings.show": "In diesem Feed anzeigen", "notifications.column_settings.show": "In dieser Spalte anzeigen",
"notifications.column_settings.sound": "Ton abspielen", "notifications.column_settings.sound": "Ton abspielen",
"notifications.column_settings.status": "Neue Beiträge:", "notifications.column_settings.status": "Neue Beiträge:",
"notifications.column_settings.unread_notifications.category": "Ungelesene Benachrichtigungen", "notifications.column_settings.unread_notifications.category": "Ungelesene Benachrichtigungen",
"notifications.column_settings.unread_notifications.highlight": "Ungelesene Mitteilungen markieren", "notifications.column_settings.unread_notifications.highlight": "Ungelesene Benachrichtigungen hervorheben",
"notifications.column_settings.update": "Überarbeitete Beiträge:", "notifications.column_settings.update": "Überarbeitete Beiträge:",
"notifications.filter.all": "Alles", "notifications.filter.all": "Alles",
"notifications.filter.boosts": "Geteilte Beiträge", "notifications.filter.boosts": "Geteilte Beiträge",
"notifications.filter.favourites": "Favoriten", "notifications.filter.favourites": "Favoriten",
"notifications.filter.follows": "Neue Follower", "notifications.filter.follows": "Folgt",
"notifications.filter.mentions": "Erwähnungen", "notifications.filter.mentions": "Erwähnungen",
"notifications.filter.polls": "Umfrageergebnisse", "notifications.filter.polls": "Umfrageergebnisse",
"notifications.filter.statuses": "Neue Beiträge von Personen, denen du folgst", "notifications.filter.statuses": "Neue Beiträge von Personen, denen du folgst",
"notifications.grant_permission": "Berechtigung erteilen.", "notifications.grant_permission": "Berechtigung erteilen.",
"notifications.group": "{count} Benachrichtigungen", "notifications.group": "{count} Benachrichtigungen",
"notifications.mark_as_read": "Alles als gelesen markieren", "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren",
"notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.", "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.",
"notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde", "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde",
"notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.", "notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.",
@ -470,7 +476,7 @@
"onboarding.actions.go_to_home": "Bring mich zu meiner Startseite", "onboarding.actions.go_to_home": "Bring mich zu meiner Startseite",
"onboarding.compose.template": "Hallo #Mastodon!", "onboarding.compose.template": "Hallo #Mastodon!",
"onboarding.follows.empty": "Bedauerlicherweise können aktuell keine Ergebnisse angezeigt werden. Du kannst die Suche verwenden oder den Reiter „Entdecken“ auswählen, um neue Leute zum Folgen zu finden oder du versuchst es später erneut.", "onboarding.follows.empty": "Bedauerlicherweise können aktuell keine Ergebnisse angezeigt werden. Du kannst die Suche verwenden oder den Reiter „Entdecken“ auswählen, um neue Leute zum Folgen zu finden oder du versuchst es später erneut.",
"onboarding.follows.lead": "Deine Startseite ist der primäre Anlaufpunkt, um Mastodon zu erleben. Je mehr Profilen du folgst, umso aktiver und interessanter wird sie. Damit du direkt loslegen kannst, gibt es hier ein paar Empfehlungen:", "onboarding.follows.lead": "Deine Startseite ist der primäre Anlaufpunkt, um Mastodon zu erleben. Je mehr Profilen du folgst, umso aktiver und interessanter wird sie. Damit du direkt loslegen kannst, gibt es hier ein paar Vorschläge:",
"onboarding.follows.title": "Personalisiere deine Startseite", "onboarding.follows.title": "Personalisiere deine Startseite",
"onboarding.share.lead": "Lass die Leute wissen, wie sie dich auf Mastodon finden können!", "onboarding.share.lead": "Lass die Leute wissen, wie sie dich auf Mastodon finden können!",
"onboarding.share.message": "Ich bin {username} auf #Mastodon! Folge mir auf {url}", "onboarding.share.message": "Ich bin {username} auf #Mastodon! Folge mir auf {url}",
@ -483,7 +489,7 @@
"onboarding.steps.follow_people.title": "Personalisiere deine Startseite", "onboarding.steps.follow_people.title": "Personalisiere deine Startseite",
"onboarding.steps.publish_status.body": "Begrüße die Welt mit Text, Fotos, Videos oder Umfragen {emoji}", "onboarding.steps.publish_status.body": "Begrüße die Welt mit Text, Fotos, Videos oder Umfragen {emoji}",
"onboarding.steps.publish_status.title": "Erstelle deinen ersten Beitrag", "onboarding.steps.publish_status.title": "Erstelle deinen ersten Beitrag",
"onboarding.steps.setup_profile.body": "Mit einem ausgefüllten Profil interagieren andere eher mit dir.", "onboarding.steps.setup_profile.body": "Mit einem vollständigen Profil interagieren andere eher mit dir.",
"onboarding.steps.setup_profile.title": "Personalisiere dein Profil", "onboarding.steps.setup_profile.title": "Personalisiere dein Profil",
"onboarding.steps.share_profile.body": "Lass deine Freund*innen wissen, wie sie dich auf Mastodon finden können", "onboarding.steps.share_profile.body": "Lass deine Freund*innen wissen, wie sie dich auf Mastodon finden können",
"onboarding.steps.share_profile.title": "Teile dein Mastodon-Profil", "onboarding.steps.share_profile.title": "Teile dein Mastodon-Profil",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Abbrechen", "reply_indicator.cancel": "Abbrechen",
"report.block": "Blockieren", "report.block": "Blockieren",
"report.block_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das blockierte Konto wird deine Beiträge nicht mehr sehen oder dir folgen können. Die Person könnte mitbekommen, dass du sie blockiert hast.", "report.block_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das blockierte Konto wird deine Beiträge nicht mehr sehen oder dir folgen können. Die Person könnte mitbekommen, dass du sie blockiert hast.",
"report.categories.legal": "Rechtlich",
"report.categories.other": "Andere", "report.categories.other": "Andere",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "Der Inhalt verletzt eine oder mehrere Serverregeln", "report.categories.violation": "Der Inhalt verletzt eine oder mehrere Serverregeln",
@ -554,8 +561,8 @@
"report.reasons.other": "Es ist etwas anderes", "report.reasons.other": "Es ist etwas anderes",
"report.reasons.other_description": "Der Vorfall passt zu keiner dieser Kategorien", "report.reasons.other_description": "Der Vorfall passt zu keiner dieser Kategorien",
"report.reasons.spam": "Das ist Spam", "report.reasons.spam": "Das ist Spam",
"report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten", "report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder sich wiederholende Antworten",
"report.reasons.violation": "Es verstößt gegen Serverregeln", "report.reasons.violation": "Das verstößt gegen Serverregeln",
"report.reasons.violation_description": "Du bist dir sicher, dass eine bestimmte Regel gebrochen wurde", "report.reasons.violation_description": "Du bist dir sicher, dass eine bestimmte Regel gebrochen wurde",
"report.rules.subtitle": "Wähle alle zutreffenden Inhalte aus", "report.rules.subtitle": "Wähle alle zutreffenden Inhalte aus",
"report.rules.title": "Welche Regeln werden verletzt?", "report.rules.title": "Welche Regeln werden verletzt?",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "URL in Mastodon öffnen", "search.quick_action.open_url": "URL in Mastodon öffnen",
"search.quick_action.status_search": "Beiträge passend zu {x}", "search.quick_action.status_search": "Beiträge passend zu {x}",
"search.search_or_paste": "Suchen oder URL einfügen", "search.search_or_paste": "Suchen oder URL einfügen",
"search_popout.full_text_search_disabled_message": "Auf {domain} nicht verfügbar.",
"search_popout.language_code": "ISO-Sprachcode",
"search_popout.options": "Suchoptionen",
"search_popout.quick_actions": "Schnellaktionen", "search_popout.quick_actions": "Schnellaktionen",
"search_popout.recent": "Frühere Suchanfragen", "search_popout.recent": "Frühere Suchanfragen",
"search_popout.specific_date": "genaues Datum",
"search_popout.user": "Profil",
"search_results.accounts": "Profile", "search_results.accounts": "Profile",
"search_results.all": "Alles", "search_results.all": "Alles",
"search_results.hashtags": "Hashtags", "search_results.hashtags": "Hashtags",
"search_results.nothing_found": "Nichts zu diesen Suchbegriffen gefunden", "search_results.nothing_found": "Nichts zu diesen Suchbegriffen gefunden",
"search_results.see_all": "Alle ansehen",
"search_results.statuses": "Beiträge", "search_results.statuses": "Beiträge",
"search_results.statuses_fts_disabled": "Die Suche nach Beitragsinhalten ist auf diesem Mastodon-Server deaktiviert.",
"search_results.title": "Suchergebnisse für {q}", "search_results.title": "Suchergebnisse für {q}",
"search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}",
"server_banner.about_active_users": "Personen, die diesen Server in den vergangenen 30 Tagen verwendet haben (monatlich aktive Nutzer*innen)", "server_banner.about_active_users": "Personen, die diesen Server in den vergangenen 30 Tagen verwendet haben (monatlich aktive Nutzer*innen)",
"server_banner.active_users": "aktive Profile", "server_banner.active_users": "aktive Profile",
"server_banner.administered_by": "Verwaltet von:", "server_banner.administered_by": "Verwaltet von:",
@ -640,7 +651,7 @@
"status.reblog": "Teilen", "status.reblog": "Teilen",
"status.reblog_private": "Mit der ursprünglichen Zielgruppe teilen", "status.reblog_private": "Mit der ursprünglichen Zielgruppe teilen",
"status.reblogged_by": "{name} teilte", "status.reblogged_by": "{name} teilte",
"status.reblogs.empty": "Diesen Beitrag hat bisher noch niemand geteilt. Sobald es jemand tut, wird das Profil hier angezeigt.", "status.reblogs.empty": "Diesen Beitrag hat bisher noch niemand geteilt. Sobald es jemand tut, wird das Profil hier erscheinen.",
"status.redraft": "Löschen und neu erstellen", "status.redraft": "Löschen und neu erstellen",
"status.remove_bookmark": "Lesezeichen entfernen", "status.remove_bookmark": "Lesezeichen entfernen",
"status.replied_to": "Antwortete {name}", "status.replied_to": "Antwortete {name}",
@ -664,10 +675,8 @@
"subscribed_languages.lead": "Nach der Änderung werden nur noch Beiträge in den ausgewählten Sprachen in den Timelines deiner Startseite und deiner Listen angezeigt. Wähle keine Sprache aus, um alle Beiträge zu sehen.", "subscribed_languages.lead": "Nach der Änderung werden nur noch Beiträge in den ausgewählten Sprachen in den Timelines deiner Startseite und deiner Listen angezeigt. Wähle keine Sprache aus, um alle Beiträge zu sehen.",
"subscribed_languages.save": "Änderungen speichern", "subscribed_languages.save": "Änderungen speichern",
"subscribed_languages.target": "Abonnierte Sprachen für {target} ändern", "subscribed_languages.target": "Abonnierte Sprachen für {target} ändern",
"suggestions.dismiss": "Vorschlag ablehnen",
"suggestions.header": "Du bist möglicherweise interessiert an …",
"tabs_bar.home": "Startseite", "tabs_bar.home": "Startseite",
"tabs_bar.notifications": "Mitteilungen", "tabs_bar.notifications": "Benachrichtigungen",
"time_remaining.days": "noch {number, plural, one {# Tag} other {# Tage}}", "time_remaining.days": "noch {number, plural, one {# Tag} other {# Tage}}",
"time_remaining.hours": "noch {number, plural, one {# Stunde} other {# Stunden}}", "time_remaining.hours": "noch {number, plural, one {# Stunde} other {# Stunden}}",
"time_remaining.minutes": "noch {number, plural, one {# Minute} other {# Minuten}}", "time_remaining.minutes": "noch {number, plural, one {# Minute} other {# Minuten}}",

View File

@ -531,9 +531,7 @@
"search_results.hashtags": "Ετικέτες", "search_results.hashtags": "Ετικέτες",
"search_results.nothing_found": "Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης", "search_results.nothing_found": "Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης",
"search_results.statuses": "Αναρτήσεις", "search_results.statuses": "Αναρτήσεις",
"search_results.statuses_fts_disabled": "Η αναζήτηση αναρτήσεων βάσει του περιεχόμενού τους δεν είναι ενεργοποιημένη σε αυτό τον διακομιστή Mastodon.",
"search_results.title": "Αναζήτηση για {q}", "search_results.title": "Αναζήτηση για {q}",
"search_results.total": "{count, number} {count, plural, one {αποτέλεσμα} other {αποτελέσματα}}",
"server_banner.about_active_users": "Άτομα που χρησιμοποιούν αυτόν τον διακομιστή κατά τις τελευταίες 30 ημέρες (Μηνιαία Ενεργοί Χρήστες)", "server_banner.about_active_users": "Άτομα που χρησιμοποιούν αυτόν τον διακομιστή κατά τις τελευταίες 30 ημέρες (Μηνιαία Ενεργοί Χρήστες)",
"server_banner.active_users": "ενεργοί χρήστες", "server_banner.active_users": "ενεργοί χρήστες",
"server_banner.administered_by": "Διαχειριστής:", "server_banner.administered_by": "Διαχειριστής:",
@ -599,8 +597,6 @@
"subscribed_languages.lead": "Μόνο αναρτήσεις σε επιλεγμένες γλώσσες θα εμφανίζονται στην αρχική σου και θα παραθέτονται χρονοδιαγράμματα μετά την αλλαγή. Επέλεξε καμία για να λαμβάνεις αναρτήσεις σε όλες τις γλώσσες.", "subscribed_languages.lead": "Μόνο αναρτήσεις σε επιλεγμένες γλώσσες θα εμφανίζονται στην αρχική σου και θα παραθέτονται χρονοδιαγράμματα μετά την αλλαγή. Επέλεξε καμία για να λαμβάνεις αναρτήσεις σε όλες τις γλώσσες.",
"subscribed_languages.save": "Αποθήκευση αλλαγών", "subscribed_languages.save": "Αποθήκευση αλλαγών",
"subscribed_languages.target": "Αλλαγή εγγεγραμμένων γλωσσών για {target}", "subscribed_languages.target": "Αλλαγή εγγεγραμμένων γλωσσών για {target}",
"suggestions.dismiss": "Απόρριψη πρότασης",
"suggestions.header": "Ίσως να ενδιαφέρεσαι για…",
"tabs_bar.home": "Αρχική", "tabs_bar.home": "Αρχική",
"tabs_bar.notifications": "Ειδοποιήσεις", "tabs_bar.notifications": "Ειδοποιήσεις",
"time_remaining.days": "απομένουν {number, plural, one {# ημέρα} other {# ημέρες}}", "time_remaining.days": "απομένουν {number, plural, one {# ημέρα} other {# ημέρες}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Search languages...", "compose.language.search": "Search languages...",
"compose.published.body": "Post published.", "compose.published.body": "Post published.",
"compose.published.open": "Open", "compose.published.open": "Open",
"compose.saved.body": "Post saved.",
"compose_form.direct_message_warning_learn_more": "Learn more", "compose_form.direct_message_warning_learn_more": "Learn more",
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is not public. Only public posts can be searched by hashtag.", "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is not public. Only public posts can be searched by hashtag.",
@ -296,8 +297,11 @@
"hashtag.column_settings.tag_mode.none": "None of these", "hashtag.column_settings.tag_mode.none": "None of these",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} Following} other {{counter} Following}}", "hashtag.counter_by_accounts": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} post} other {{counter} posts}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} post} other {{counter} posts}} today",
"hashtag.follow": "Follow hashtag", "hashtag.follow": "Follow hashtag",
"hashtag.unfollow": "Unfollow hashtag", "hashtag.unfollow": "Unfollow hashtag",
"hashtags.and_other": "…and {count, plural, one {}other {# more}}",
"home.actions.go_to_explore": "See what's trending", "home.actions.go_to_explore": "See what's trending",
"home.actions.go_to_suggestions": "Find people to follow", "home.actions.go_to_suggestions": "Find people to follow",
"home.column_settings.basic": "Basic", "home.column_settings.basic": "Basic",
@ -306,6 +310,9 @@
"home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:", "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:",
"home.explore_prompt.title": "This is your home base within Mastodon.", "home.explore_prompt.title": "This is your home base within Mastodon.",
"home.hide_announcements": "Hide announcements", "home.hide_announcements": "Hide announcements",
"home.pending_critical_update.body": "Please update your Mastodon server as soon as possible!",
"home.pending_critical_update.link": "See updates",
"home.pending_critical_update.title": "Critical security update available!",
"home.show_announcements": "Show announcements", "home.show_announcements": "Show announcements",
"interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.", "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.",
"interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.", "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.",
@ -407,6 +414,7 @@
"navigation_bar.lists": "Lists", "navigation_bar.lists": "Lists",
"navigation_bar.logout": "Logout", "navigation_bar.logout": "Logout",
"navigation_bar.mutes": "Muted users", "navigation_bar.mutes": "Muted users",
"navigation_bar.opened_in_classic_interface": "Posts, accounts, and other specific pages are opened by default in the classic web interface.",
"navigation_bar.personal": "Personal", "navigation_bar.personal": "Personal",
"navigation_bar.pins": "Pinned posts", "navigation_bar.pins": "Pinned posts",
"navigation_bar.preferences": "Preferences", "navigation_bar.preferences": "Preferences",
@ -530,6 +538,7 @@
"reply_indicator.cancel": "Cancel", "reply_indicator.cancel": "Cancel",
"report.block": "Block", "report.block": "Block",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.legal": "Legal",
"report.categories.other": "Other", "report.categories.other": "Other",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "Content violates one or more server rules", "report.categories.violation": "Content violates one or more server rules",
@ -581,16 +590,19 @@
"search.quick_action.open_url": "Open URL in Mastodon", "search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}", "search.quick_action.status_search": "Posts matching {x}",
"search.search_or_paste": "Search or paste URL", "search.search_or_paste": "Search or paste URL",
"search_popout.language_code": "ISO language code",
"search_popout.options": "Search options",
"search_popout.quick_actions": "Quick actions", "search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches", "search_popout.recent": "Recent searches",
"search_popout.specific_date": "specific date",
"search_popout.user": "user",
"search_results.accounts": "Profiles", "search_results.accounts": "Profiles",
"search_results.all": "All", "search_results.all": "All",
"search_results.hashtags": "Hashtags", "search_results.hashtags": "Hashtags",
"search_results.nothing_found": "Could not find anything for these search terms", "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.see_all": "See all",
"search_results.statuses": "Posts", "search_results.statuses": "Posts",
"search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
"search_results.title": "Search for {q}", "search_results.title": "Search for {q}",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)", "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
"server_banner.active_users": "active users", "server_banner.active_users": "active users",
"server_banner.administered_by": "Administered by:", "server_banner.administered_by": "Administered by:",
@ -662,8 +674,6 @@
"subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.", "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
"subscribed_languages.save": "Save changes", "subscribed_languages.save": "Save changes",
"subscribed_languages.target": "Change subscribed languages for {target}", "subscribed_languages.target": "Change subscribed languages for {target}",
"suggestions.dismiss": "Dismiss suggestion",
"suggestions.header": "You might be interested in…",
"tabs_bar.home": "Home", "tabs_bar.home": "Home",
"tabs_bar.notifications": "Notifications", "tabs_bar.notifications": "Notifications",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left", "time_remaining.days": "{number, plural, one {# day} other {# days}} left",

View File

@ -590,6 +590,7 @@
"search.quick_action.open_url": "Open URL in Mastodon", "search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}", "search.quick_action.status_search": "Posts matching {x}",
"search.search_or_paste": "Search or paste URL", "search.search_or_paste": "Search or paste URL",
"search_popout.full_text_search_disabled_message": "Not available on {domain}.",
"search_popout.language_code": "ISO language code", "search_popout.language_code": "ISO language code",
"search_popout.options": "Search options", "search_popout.options": "Search options",
"search_popout.quick_actions": "Quick actions", "search_popout.quick_actions": "Quick actions",
@ -600,10 +601,9 @@
"search_results.all": "All", "search_results.all": "All",
"search_results.hashtags": "Hashtags", "search_results.hashtags": "Hashtags",
"search_results.nothing_found": "Could not find anything for these search terms", "search_results.nothing_found": "Could not find anything for these search terms",
"search_results.see_all": "See all",
"search_results.statuses": "Posts", "search_results.statuses": "Posts",
"search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
"search_results.title": "Search for {q}", "search_results.title": "Search for {q}",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)", "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
"server_banner.active_users": "active users", "server_banner.active_users": "active users",
"server_banner.administered_by": "Administered by:", "server_banner.administered_by": "Administered by:",
@ -675,8 +675,6 @@
"subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.", "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
"subscribed_languages.save": "Save changes", "subscribed_languages.save": "Save changes",
"subscribed_languages.target": "Change subscribed languages for {target}", "subscribed_languages.target": "Change subscribed languages for {target}",
"suggestions.dismiss": "Dismiss suggestion",
"suggestions.header": "You might be interested in…",
"tabs_bar.home": "Home", "tabs_bar.home": "Home",
"tabs_bar.notifications": "Notifications", "tabs_bar.notifications": "Notifications",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left", "time_remaining.days": "{number, plural, one {# day} other {# days}} left",

View File

@ -553,9 +553,7 @@
"search_results.hashtags": "Kradvortoj", "search_results.hashtags": "Kradvortoj",
"search_results.nothing_found": "Povis trovi nenion por ĉi tiuj serĉaj terminoj", "search_results.nothing_found": "Povis trovi nenion por ĉi tiuj serĉaj terminoj",
"search_results.statuses": "Afiŝoj", "search_results.statuses": "Afiŝoj",
"search_results.statuses_fts_disabled": "Serĉi afiŝojn laŭ enhavo ne estas ebligita en ĉi tiu Mastodon-servilo.",
"search_results.title": "Serĉ-rezultoj por {q}", "search_results.title": "Serĉ-rezultoj por {q}",
"search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
"server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)", "server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)",
"server_banner.active_users": "aktivaj uzantoj", "server_banner.active_users": "aktivaj uzantoj",
"server_banner.administered_by": "Administrata de:", "server_banner.administered_by": "Administrata de:",
@ -624,8 +622,6 @@
"subscribed_languages.lead": "Nur afiŝoj en elektitaj lingvoj aperos en viaj hejma kaj lista templinioj post la ŝanĝo. Elektu nenion por ricevi afiŝojn en ĉiuj lingvoj.", "subscribed_languages.lead": "Nur afiŝoj en elektitaj lingvoj aperos en viaj hejma kaj lista templinioj post la ŝanĝo. Elektu nenion por ricevi afiŝojn en ĉiuj lingvoj.",
"subscribed_languages.save": "Konservi ŝanĝojn", "subscribed_languages.save": "Konservi ŝanĝojn",
"subscribed_languages.target": "Ŝanĝu abonitajn lingvojn por {target}", "subscribed_languages.target": "Ŝanĝu abonitajn lingvojn por {target}",
"suggestions.dismiss": "Forigi la proponon",
"suggestions.header": "Vi povus interesiĝi pri…",
"tabs_bar.home": "Hejmo", "tabs_bar.home": "Hejmo",
"tabs_bar.notifications": "Sciigoj", "tabs_bar.notifications": "Sciigoj",
"time_remaining.days": "{number, plural, one {# tago} other {# tagoj}} restas", "time_remaining.days": "{number, plural, one {# tago} other {# tagoj}} restas",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Buscar idiomas…", "compose.language.search": "Buscar idiomas…",
"compose.published.body": "Mensaje publicado.", "compose.published.body": "Mensaje publicado.",
"compose.published.open": "Abrir", "compose.published.open": "Abrir",
"compose.saved.body": "Mensaje guardado.",
"compose_form.direct_message_warning_learn_more": "Aprendé más", "compose_form.direct_message_warning_learn_more": "Aprendé más",
"compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No compartas ninguna información sensible al usar Mastodon.", "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No compartas ninguna información sensible al usar Mastodon.",
"compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.", "compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.",
@ -300,6 +301,7 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}} hoy", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}} hoy",
"hashtag.follow": "Seguir etiqueta", "hashtag.follow": "Seguir etiqueta",
"hashtag.unfollow": "Dejar de seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"home.actions.go_to_explore": "Mirá qué está en tendencia", "home.actions.go_to_explore": "Mirá qué está en tendencia",
"home.actions.go_to_suggestions": "Encontrá cuentas para seguir", "home.actions.go_to_suggestions": "Encontrá cuentas para seguir",
"home.column_settings.basic": "Básico", "home.column_settings.basic": "Básico",
@ -308,6 +310,9 @@
"home.explore_prompt.body": "Tu línea temporal principal tendrá una mezcla de mensajes de etiquetas que hayás decidido seguir, cuentas que hayás seguido y mensajes a los que éstas adhieran. Si está muy tranquilo por acá, quizás quieras:", "home.explore_prompt.body": "Tu línea temporal principal tendrá una mezcla de mensajes de etiquetas que hayás decidido seguir, cuentas que hayás seguido y mensajes a los que éstas adhieran. Si está muy tranquilo por acá, quizás quieras:",
"home.explore_prompt.title": "Este es tu inicio en Mastodon.", "home.explore_prompt.title": "Este es tu inicio en Mastodon.",
"home.hide_announcements": "Ocultar anuncios", "home.hide_announcements": "Ocultar anuncios",
"home.pending_critical_update.body": "Por favor, ¡actualizá tu servidor de Mastodon lo antes posible!",
"home.pending_critical_update.link": "Ver actualizaciones",
"home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!",
"home.show_announcements": "Mostrar anuncios", "home.show_announcements": "Mostrar anuncios",
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, podés marcar este mensaje como favorito para que el autor sepa que lo apreciás y lo guardás para más adelante.", "interaction_modal.description.favourite": "Con una cuenta en Mastodon, podés marcar este mensaje como favorito para que el autor sepa que lo apreciás y lo guardás para más adelante.",
"interaction_modal.description.follow": "Con una cuenta en Mastodon, podés seguir a {name} para recibir sus mensajes en tu línea temporal principal.", "interaction_modal.description.follow": "Con una cuenta en Mastodon, podés seguir a {name} para recibir sus mensajes en tu línea temporal principal.",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Listas", "navigation_bar.lists": "Listas",
"navigation_bar.logout": "Cerrar sesión", "navigation_bar.logout": "Cerrar sesión",
"navigation_bar.mutes": "Usuarios silenciados", "navigation_bar.mutes": "Usuarios silenciados",
"navigation_bar.opened_in_classic_interface": "Los mensajes, las cuentas y otras páginas específicas se abren predeterminadamente en la interface web clásica.",
"navigation_bar.personal": "Personal", "navigation_bar.personal": "Personal",
"navigation_bar.pins": "Mensajes fijados", "navigation_bar.pins": "Mensajes fijados",
"navigation_bar.preferences": "Configuración", "navigation_bar.preferences": "Configuración",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Cancelar", "reply_indicator.cancel": "Cancelar",
"report.block": "Bloquear", "report.block": "Bloquear",
"report.block_explanation": "No verás sus mensajes. No podrán ver tus mensajes ni seguirte. Se van a dar cuentra de que están bloqueados.", "report.block_explanation": "No verás sus mensajes. No podrán ver tus mensajes ni seguirte. Se van a dar cuentra de que están bloqueados.",
"report.categories.legal": "Legales",
"report.categories.other": "Otra", "report.categories.other": "Otra",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "El contenido viola una o más reglas del servidor", "report.categories.violation": "El contenido viola una o más reglas del servidor",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Abrir enlace en Mastodon", "search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Mensajes que coinciden con {x}", "search.quick_action.status_search": "Mensajes que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar dirección web", "search.search_or_paste": "Buscar o pegar dirección web",
"search_popout.full_text_search_disabled_message": "No disponible en {domain}.",
"search_popout.language_code": "Código ISO de idioma",
"search_popout.options": "Opciones de búsqueda",
"search_popout.quick_actions": "Acciones rápidas", "search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes", "search_popout.recent": "Búsquedas recientes",
"search_popout.specific_date": "fecha específica",
"search_popout.user": "usuario",
"search_results.accounts": "Perfiles", "search_results.accounts": "Perfiles",
"search_results.all": "Todos", "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas", "search_results.hashtags": "Etiquetas",
"search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda", "search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda",
"search_results.see_all": "Ver todo",
"search_results.statuses": "Mensajes", "search_results.statuses": "Mensajes",
"search_results.statuses_fts_disabled": "No se pueden buscar mensajes por contenido en este servidor de Mastodon.",
"search_results.title": "Buscar {q}", "search_results.title": "Buscar {q}",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
"server_banner.about_active_users": "Personas usando este servidor durante los últimos 30 días (Usuarios Activos Mensuales)", "server_banner.about_active_users": "Personas usando este servidor durante los últimos 30 días (Usuarios Activos Mensuales)",
"server_banner.active_users": "usuarios activos", "server_banner.active_users": "usuarios activos",
"server_banner.administered_by": "Administrado por:", "server_banner.administered_by": "Administrado por:",
@ -664,8 +675,6 @@
"subscribed_languages.lead": "Después del cambio, sólo los mensajes en los idiomas seleccionados aparecerán en tu línea temporal Principal y en las líneas de tiempo de lista. No seleccionés ningún idioma para poder recibir mensajes en todos los idiomas.", "subscribed_languages.lead": "Después del cambio, sólo los mensajes en los idiomas seleccionados aparecerán en tu línea temporal Principal y en las líneas de tiempo de lista. No seleccionés ningún idioma para poder recibir mensajes en todos los idiomas.",
"subscribed_languages.save": "Guardar cambios", "subscribed_languages.save": "Guardar cambios",
"subscribed_languages.target": "Cambiar idiomas suscritos para {target}", "subscribed_languages.target": "Cambiar idiomas suscritos para {target}",
"suggestions.dismiss": "Descartar sugerencia",
"suggestions.header": "Es posible que te interese…",
"tabs_bar.home": "Principal", "tabs_bar.home": "Principal",
"tabs_bar.notifications": "Notificaciones", "tabs_bar.notifications": "Notificaciones",
"time_remaining.days": "{number, plural,one {queda # día} other {quedan # días}}", "time_remaining.days": "{number, plural,one {queda # día} other {quedan # días}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Buscar idiomas...", "compose.language.search": "Buscar idiomas...",
"compose.published.body": "Publicado.", "compose.published.body": "Publicado.",
"compose.published.open": "Abrir", "compose.published.open": "Abrir",
"compose.saved.body": "Publicación guardada.",
"compose_form.direct_message_warning_learn_more": "Aprender mas", "compose_form.direct_message_warning_learn_more": "Aprender mas",
"compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.", "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
"compose_form.hashtag_warning": "Este toot no será listado bajo ningún hashtag dado que no es público. Solo toots públicos pueden ser buscados por hashtag.", "compose_form.hashtag_warning": "Este toot no será listado bajo ningún hashtag dado que no es público. Solo toots públicos pueden ser buscados por hashtag.",
@ -181,7 +182,7 @@
"confirmations.mute.explanation": "Esto esconderá las publicaciones de ellos y en las que los has mencionado, pero les permitirá ver tus mensajes y seguirte.", "confirmations.mute.explanation": "Esto esconderá las publicaciones de ellos y en las que los has mencionado, pero les permitirá ver tus mensajes y seguirte.",
"confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?",
"confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "¿Estás seguro de querer borrar esta publicación y reescribirla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán sin contexto.", "confirmations.redraft.message": "¿Estás seguro que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.",
"confirmations.reply.confirm": "Responder", "confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
"confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.confirm": "Dejar de seguir",
@ -201,7 +202,7 @@
"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.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", "dismissable_banner.dismiss": "Descartar",
"dismissable_banner.explore_links": "Estas noticias están siendo discutidas por personas en este y otros servidores de la red descentralizada en este momento.", "dismissable_banner.explore_links": "Estas noticias están siendo discutidas por personas en este y otros servidores de la red descentralizada en este momento.",
"dismissable_banner.explore_statuses": "Estas son las publicaciones que están ganando popularidad en la web social hoy. Las publicaciones recientes con más impulsos y favoritos obtienen más exposición.", "dismissable_banner.explore_statuses": "Estas son las publicaciones que están en tendencia en la red ahora. Las publicaciones recientes con más impulsos y favoritos se muestran más arriba.",
"dismissable_banner.explore_tags": "Se trata de hashtags que están ganando adeptos en las redes sociales hoy en día. Los hashtags que son utilizados por más personas diferentes se clasifican mejor.", "dismissable_banner.explore_tags": "Se trata de hashtags que están ganando adeptos en las redes sociales hoy en día. Los hashtags que son utilizados por más personas diferentes se clasifican mejor.",
"dismissable_banner.public_timeline": "Estos son los toots públicos más recientes de personas en la web social a las que sigue la gente en {domain}.", "dismissable_banner.public_timeline": "Estos son los toots públicos más recientes de personas en la web social a las que sigue la gente en {domain}.",
"embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
@ -230,8 +231,8 @@
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.", "empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.", "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
"empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!", "empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!",
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando marques una publicación como favorita, se mostrarán aquí.", "empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando le des favorito a una publicación se mostrarán acá.",
"empty_column.favourites": "Todavía nadie marcó esta publicación como favorita. Cuando alguien lo haga, se mostrarán aquí.", "empty_column.favourites": "Todavía nadie marcó como favorito esta publicación. Cuando alguien lo haga, se mostrará aquí.",
"empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.", "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
"empty_column.followed_tags": "No estás siguiendo ningún hashtag todavía. Cuando lo hagas, aparecerá aquí.", "empty_column.followed_tags": "No estás siguiendo ningún hashtag todavía. Cuando lo hagas, aparecerá aquí.",
"empty_column.hashtag": "No hay nada en este hashtag aún.", "empty_column.hashtag": "No hay nada en este hashtag aún.",
@ -300,26 +301,30 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
"hashtag.follow": "Seguir etiqueta", "hashtag.follow": "Seguir etiqueta",
"hashtag.unfollow": "Dejar de seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"home.actions.go_to_explore": "Ver tendencias", "home.actions.go_to_explore": "Ver tendencias",
"home.actions.go_to_suggestions": "Encuentra gente a la que seguir", "home.actions.go_to_suggestions": "Encuentra gente a la que seguir",
"home.column_settings.basic": "Básico", "home.column_settings.basic": "Básico",
"home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_reblogs": "Mostrar retoots",
"home.column_settings.show_replies": "Mostrar respuestas", "home.column_settings.show_replies": "Mostrar respuestas",
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, la gente que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:", "home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de los hashtags que has escogido seguir, las personas que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:",
"home.explore_prompt.title": "Este es tu punto de partida en Mastodon.", "home.explore_prompt.title": "Este es tu punto de partida en Mastodon.",
"home.hide_announcements": "Ocultar anuncios", "home.hide_announcements": "Ocultar anuncios",
"home.pending_critical_update.body": "¡Por favor actualiza tu servidor Mastodon lo antes posible!",
"home.pending_critical_update.link": "Ver actualizaciones",
"home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!",
"home.show_announcements": "Mostrar anuncios", "home.show_announcements": "Mostrar anuncios",
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.", "interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
"interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu fuente de inicio.", "interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu fuente de inicio.",
"interaction_modal.description.reblog": "Con una cuenta en Mastodon, puedes impulsar esta publicación para compartirla con tus propios seguidores.", "interaction_modal.description.reblog": "Con una cuenta en Mastodon, puedes impulsar esta publicación para compartirla con tus propios seguidores.",
"interaction_modal.description.reply": "Con una cuenta en Mastodon, puedes responder a esta publicación.", "interaction_modal.description.reply": "Con una cuenta en Mastodon, puedes responder a esta publicación.",
"interaction_modal.login.action": "Ir a Inicio", "interaction_modal.login.action": "Ir a Inicio",
"interaction_modal.login.prompt": "Dominio de tu servidor, por ejemplo mastodon.social", "interaction_modal.login.prompt": "Dominio de tu servidor, por ejemplo: mastodon.social",
"interaction_modal.no_account_yet": "¿Aún no tienes cuenta en Mastodon?", "interaction_modal.no_account_yet": "¿Aún no tienes cuenta en Mastodon?",
"interaction_modal.on_another_server": "En un servidor diferente", "interaction_modal.on_another_server": "En un servidor diferente",
"interaction_modal.on_this_server": "En este servidor", "interaction_modal.on_this_server": "En este servidor",
"interaction_modal.sign_in": "No estás registrado en este servidor. ¿Dónde tienes tu cuenta?", "interaction_modal.sign_in": "No estás registrado en este servidor. ¿Dónde tienes tu cuenta?",
"interaction_modal.sign_in_hint": "Pista: Ese es el sitio donde te registraste. Si no lo recuerdas, busca el correo electrónico de bienvenida en tu bandeja de entrada. También puedes introducir tu nombre de usuario completo (por ejemplo @Mastodon@mastodon.social)", "interaction_modal.sign_in_hint": "Pista: Ese es el sitio donde te registraste. Si no lo recuerdas, busca el correo electrónico de bienvenida en tu bandeja de entrada. También puedes introducir tu nombre de usuario completo (por ejemplo: @Mastodon@mastodon.social)",
"interaction_modal.title.favourite": "Marcar como favorita la publicación de {name}", "interaction_modal.title.favourite": "Marcar como favorita la publicación de {name}",
"interaction_modal.title.follow": "Seguir a {name}", "interaction_modal.title.follow": "Seguir a {name}",
"interaction_modal.title.reblog": "Impulsar la publicación de {name}", "interaction_modal.title.reblog": "Impulsar la publicación de {name}",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Listas", "navigation_bar.lists": "Listas",
"navigation_bar.logout": "Cerrar sesión", "navigation_bar.logout": "Cerrar sesión",
"navigation_bar.mutes": "Usuarios silenciados", "navigation_bar.mutes": "Usuarios silenciados",
"navigation_bar.opened_in_classic_interface": "Publicaciones, cuentas y otras páginas específicas se abren por defecto en la interfaz web clásica.",
"navigation_bar.personal": "Personal", "navigation_bar.personal": "Personal",
"navigation_bar.pins": "Toots fijados", "navigation_bar.pins": "Toots fijados",
"navigation_bar.preferences": "Preferencias", "navigation_bar.preferences": "Preferencias",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Cancelar", "reply_indicator.cancel": "Cancelar",
"report.block": "Bloquear", "report.block": "Bloquear",
"report.block_explanation": "No veras sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.", "report.block_explanation": "No veras sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.",
"report.categories.legal": "Legal",
"report.categories.other": "Otro", "report.categories.other": "Otro",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "El contenido viola una o más reglas del servidor", "report.categories.violation": "El contenido viola una o más reglas del servidor",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Abrir enlace en Mastodon", "search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Publicaciones que coinciden con {x}", "search.quick_action.status_search": "Publicaciones que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar URL", "search.search_or_paste": "Buscar o pegar URL",
"search_popout.full_text_search_disabled_message": "No disponible en {domain}.",
"search_popout.language_code": "Código de idioma ISO",
"search_popout.options": "Opciones de búsqueda",
"search_popout.quick_actions": "Acciones rápidas", "search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes", "search_popout.recent": "Búsquedas recientes",
"search_popout.specific_date": "fecha específica",
"search_popout.user": "usuario",
"search_results.accounts": "Perfiles", "search_results.accounts": "Perfiles",
"search_results.all": "Todos", "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas", "search_results.hashtags": "Etiquetas",
"search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda", "search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda",
"search_results.see_all": "Ver todos",
"search_results.statuses": "Publicaciones", "search_results.statuses": "Publicaciones",
"search_results.statuses_fts_disabled": "La búsqueda de publicaciones por su contenido no está disponible en este servidor de Mastodon.",
"search_results.title": "Buscar {q}", "search_results.title": "Buscar {q}",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
"server_banner.about_active_users": "Personas utilizando este servidor durante los últimos 30 días (Usuarios Activos Mensuales)", "server_banner.about_active_users": "Personas utilizando este servidor durante los últimos 30 días (Usuarios Activos Mensuales)",
"server_banner.active_users": "usuarios activos", "server_banner.active_users": "usuarios activos",
"server_banner.administered_by": "Administrado por:", "server_banner.administered_by": "Administrado por:",
@ -664,8 +675,6 @@
"subscribed_languages.lead": "Solo las publicaciones en los idiomas seleccionados aparecerán en tu inicio y enlistará las líneas de tiempo después del cambio. Selecciona ninguno para recibir publicaciones en todos los idiomas.", "subscribed_languages.lead": "Solo las publicaciones en los idiomas seleccionados aparecerán en tu inicio y enlistará las líneas de tiempo después del cambio. Selecciona ninguno para recibir publicaciones en todos los idiomas.",
"subscribed_languages.save": "Guardar cambios", "subscribed_languages.save": "Guardar cambios",
"subscribed_languages.target": "Cambiar idiomas suscritos para {target}", "subscribed_languages.target": "Cambiar idiomas suscritos para {target}",
"suggestions.dismiss": "Descartar sugerencia",
"suggestions.header": "Es posible que te interese…",
"tabs_bar.home": "Inicio", "tabs_bar.home": "Inicio",
"tabs_bar.notifications": "Notificaciones", "tabs_bar.notifications": "Notificaciones",
"time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}", "time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Buscar idiomas...", "compose.language.search": "Buscar idiomas...",
"compose.published.body": "Publicado.", "compose.published.body": "Publicado.",
"compose.published.open": "Abrir", "compose.published.open": "Abrir",
"compose.saved.body": "Publicación guardada.",
"compose_form.direct_message_warning_learn_more": "Aprender más", "compose_form.direct_message_warning_learn_more": "Aprender más",
"compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.", "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
"compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ninguna etiqueta, ya que no es pública. Solo las publicaciones públicas pueden ser buscadas por etiqueta.", "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ninguna etiqueta, ya que no es pública. Solo las publicaciones públicas pueden ser buscadas por etiqueta.",
@ -215,7 +216,7 @@
"emoji_button.nature": "Naturaleza", "emoji_button.nature": "Naturaleza",
"emoji_button.not_found": "No hay emojis!! ¯\\_(ツ)_/¯", "emoji_button.not_found": "No hay emojis!! ¯\\_(ツ)_/¯",
"emoji_button.objects": "Objetos", "emoji_button.objects": "Objetos",
"emoji_button.people": "Gente", "emoji_button.people": "Personas",
"emoji_button.recent": "Usados frecuentemente", "emoji_button.recent": "Usados frecuentemente",
"emoji_button.search": "Buscar...", "emoji_button.search": "Buscar...",
"emoji_button.search_results": "Resultados de búsqueda", "emoji_button.search_results": "Resultados de búsqueda",
@ -279,7 +280,7 @@
"footer.about": "Acerca de", "footer.about": "Acerca de",
"footer.directory": "Directorio de perfiles", "footer.directory": "Directorio de perfiles",
"footer.get_app": "Obtener la aplicación", "footer.get_app": "Obtener la aplicación",
"footer.invite": "Invitar gente", "footer.invite": "Invitar personas",
"footer.keyboard_shortcuts": "Atajos de teclado", "footer.keyboard_shortcuts": "Atajos de teclado",
"footer.privacy_policy": "Política de privacidad", "footer.privacy_policy": "Política de privacidad",
"footer.source_code": "Ver código fuente", "footer.source_code": "Ver código fuente",
@ -300,14 +301,18 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}} hoy",
"hashtag.follow": "Seguir etiqueta", "hashtag.follow": "Seguir etiqueta",
"hashtag.unfollow": "Dejar de seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta",
"hashtags.and_other": "…y {count, plural, other {# más}}",
"home.actions.go_to_explore": "Ver tendencias", "home.actions.go_to_explore": "Ver tendencias",
"home.actions.go_to_suggestions": "Encuentra gente a la que seguir", "home.actions.go_to_suggestions": "Encuentra personas a las que seguir",
"home.column_settings.basic": "Básico", "home.column_settings.basic": "Básico",
"home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respuestas", "home.column_settings.show_replies": "Mostrar respuestas",
"home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, la gente que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:", "home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, las personas que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:",
"home.explore_prompt.title": "Este es tu punto de partida en Mastodon.", "home.explore_prompt.title": "Este es tu punto de partida en Mastodon.",
"home.hide_announcements": "Ocultar anuncios", "home.hide_announcements": "Ocultar anuncios",
"home.pending_critical_update.body": "Por favor, ¡actualiza tu servidor Mastodon lo antes posible!",
"home.pending_critical_update.link": "Ver actualizaciones",
"home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!",
"home.show_announcements": "Mostrar anuncios", "home.show_announcements": "Mostrar anuncios",
"interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.", "interaction_modal.description.favourite": "Con una cuenta en Mastodon, puedes marcar como favorita esta publicación para que el autor sepa que te gusta, y guardala para más adelante.",
"interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu línea temporal de inicio.", "interaction_modal.description.follow": "Con una cuenta en Mastodon, puedes seguir {name} para recibir sus publicaciones en tu línea temporal de inicio.",
@ -381,7 +386,7 @@
"lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.list": "Miembros de la lista",
"lists.replies_policy.none": "Nadie", "lists.replies_policy.none": "Nadie",
"lists.replies_policy.title": "Mostrar respuestas a:", "lists.replies_policy.title": "Mostrar respuestas a:",
"lists.search": "Buscar entre la gente a la que sigues", "lists.search": "Buscar entre las personas a las que sigues",
"lists.subheading": "Tus listas", "lists.subheading": "Tus listas",
"load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}",
"loading_indicator.label": "Cargando…", "loading_indicator.label": "Cargando…",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Listas", "navigation_bar.lists": "Listas",
"navigation_bar.logout": "Cerrar sesión", "navigation_bar.logout": "Cerrar sesión",
"navigation_bar.mutes": "Usuarios silenciados", "navigation_bar.mutes": "Usuarios silenciados",
"navigation_bar.opened_in_classic_interface": "Publicaciones, cuentas y otras páginas específicas se abren por defecto en la interfaz web clásica.",
"navigation_bar.personal": "Personal", "navigation_bar.personal": "Personal",
"navigation_bar.pins": "Publicaciones fijadas", "navigation_bar.pins": "Publicaciones fijadas",
"navigation_bar.preferences": "Preferencias", "navigation_bar.preferences": "Preferencias",
@ -454,7 +460,7 @@
"notifications.filter.follows": "Seguidores", "notifications.filter.follows": "Seguidores",
"notifications.filter.mentions": "Menciones", "notifications.filter.mentions": "Menciones",
"notifications.filter.polls": "Resultados de la votación", "notifications.filter.polls": "Resultados de la votación",
"notifications.filter.statuses": "Actualizaciones de gente a la que sigues", "notifications.filter.statuses": "Actualizaciones de personas a las que sigues",
"notifications.grant_permission": "Conceder permiso.", "notifications.grant_permission": "Conceder permiso.",
"notifications.group": "{count} notificaciones", "notifications.group": "{count} notificaciones",
"notifications.mark_as_read": "Marcar todas las notificaciones como leídas", "notifications.mark_as_read": "Marcar todas las notificaciones como leídas",
@ -469,17 +475,17 @@
"onboarding.actions.go_to_explore": "Llévame a tendencias", "onboarding.actions.go_to_explore": "Llévame a tendencias",
"onboarding.actions.go_to_home": "Ir a mi inicio", "onboarding.actions.go_to_home": "Ir a mi inicio",
"onboarding.compose.template": "¡Hola #Mastodon!", "onboarding.compose.template": "¡Hola #Mastodon!",
"onboarding.follows.empty": "Desafortunadamente, no se pueden mostrar resultados en este momento. Puedes intentar usar la búsqueda o navegar por la página de exploración para encontrar gente a la que seguir, o inténtalo de nuevo más tarde.", "onboarding.follows.empty": "Desafortunadamente, no se pueden mostrar resultados en este momento. Puedes intentar usar la búsqueda o navegar por la página de exploración para encontrar personas a las que seguir, o inténtalo de nuevo más tarde.",
"onboarding.follows.lead": "Tu línea de inicio es la forma principal de experimentar Mastodon. Cuanta más gente sigas, más activa e interesante será. Para empezar, aquí hay algunas sugerencias:", "onboarding.follows.lead": "Tu línea de inicio es la forma principal de experimentar Mastodon. Cuanta más personas sigas, más activa e interesante será. Para empezar, aquí hay algunas sugerencias:",
"onboarding.follows.title": "Personaliza tu línea de inicio", "onboarding.follows.title": "Personaliza tu línea de inicio",
"onboarding.share.lead": Dile a la gente cómo te pueden encontrar en Mastodon!", "onboarding.share.lead": Cuéntale a otras personas cómo te pueden encontrar en Mastodon!",
"onboarding.share.message": "¡Soy {username} en #Mastodon! Ven a seguirme en {url}", "onboarding.share.message": "¡Soy {username} en #Mastodon! Ven a seguirme en {url}",
"onboarding.share.next_steps": "Posibles siguientes pasos:", "onboarding.share.next_steps": "Posibles siguientes pasos:",
"onboarding.share.title": "Comparte tu perfil", "onboarding.share.title": "Comparte tu perfil",
"onboarding.start.lead": "Ahora eres parte de Mastodon, una plataforma única y descentralizada de redes sociales donde tú —no un algoritmo— personalizarás tu propia experiencia. Vamos a introducirte en esta nueva frontera social:", "onboarding.start.lead": "Ahora eres parte de Mastodon, una plataforma única y descentralizada de redes sociales donde tú —no un algoritmo— personalizarás tu propia experiencia. Vamos a introducirte en esta nueva frontera social:",
"onboarding.start.skip": "¿No necesitas ayuda para empezar?", "onboarding.start.skip": "¿No necesitas ayuda para empezar?",
"onboarding.start.title": "¡Lo has logrado!", "onboarding.start.title": "¡Lo has logrado!",
"onboarding.steps.follow_people.body": "Seguir gente interesante es de lo que trata Mastodon.", "onboarding.steps.follow_people.body": "Seguir personas interesante es de lo que trata Mastodon.",
"onboarding.steps.follow_people.title": "Personaliza tu línea de inicio", "onboarding.steps.follow_people.title": "Personaliza tu línea de inicio",
"onboarding.steps.publish_status.body": "Di hola al mundo con texto, fotos, vídeos o encuestas {emoji}", "onboarding.steps.publish_status.body": "Di hola al mundo con texto, fotos, vídeos o encuestas {emoji}",
"onboarding.steps.publish_status.title": "Escribe tu primera publicación", "onboarding.steps.publish_status.title": "Escribe tu primera publicación",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Cancelar", "reply_indicator.cancel": "Cancelar",
"report.block": "Bloquear", "report.block": "Bloquear",
"report.block_explanation": "No verás sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.", "report.block_explanation": "No verás sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.",
"report.categories.legal": "Legal",
"report.categories.other": "Otros", "report.categories.other": "Otros",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "El contenido viola una o más reglas del servidor", "report.categories.violation": "El contenido viola una o más reglas del servidor",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Abrir enlace en Mastodon", "search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Publicaciones que coinciden con {x}", "search.quick_action.status_search": "Publicaciones que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar URL", "search.search_or_paste": "Buscar o pegar URL",
"search_popout.full_text_search_disabled_message": "No disponible en {domain}.",
"search_popout.language_code": "Código de idioma ISO",
"search_popout.options": "Opciones de búsqueda",
"search_popout.quick_actions": "Acciones rápidas", "search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes", "search_popout.recent": "Búsquedas recientes",
"search_popout.specific_date": "fecha específica",
"search_popout.user": "usuario",
"search_results.accounts": "Perfiles", "search_results.accounts": "Perfiles",
"search_results.all": "Todos", "search_results.all": "Todos",
"search_results.hashtags": "Etiquetas", "search_results.hashtags": "Etiquetas",
"search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda", "search_results.nothing_found": "No se pudo encontrar nada para estos términos de búsqueda",
"search_results.see_all": "Ver todos",
"search_results.statuses": "Publicaciones", "search_results.statuses": "Publicaciones",
"search_results.statuses_fts_disabled": "Buscar publicaciones por su contenido no está disponible en este servidor de Mastodon.",
"search_results.title": "Buscar {q}", "search_results.title": "Buscar {q}",
"search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
"server_banner.about_active_users": "Usuarios activos en el servidor durante los últimos 30 días (Usuarios Activos Mensuales)", "server_banner.about_active_users": "Usuarios activos en el servidor durante los últimos 30 días (Usuarios Activos Mensuales)",
"server_banner.active_users": "usuarios activos", "server_banner.active_users": "usuarios activos",
"server_banner.administered_by": "Administrado por:", "server_banner.administered_by": "Administrado por:",
@ -664,8 +675,6 @@
"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": "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.save": "Guardar cambios", "subscribed_languages.save": "Guardar cambios",
"subscribed_languages.target": "Cambiar idiomas suscritos para {target}", "subscribed_languages.target": "Cambiar idiomas suscritos para {target}",
"suggestions.dismiss": "Descartar sugerencia",
"suggestions.header": "Es posible que te interese…",
"tabs_bar.home": "Inicio", "tabs_bar.home": "Inicio",
"tabs_bar.notifications": "Notificaciones", "tabs_bar.notifications": "Notificaciones",
"time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}", "time_remaining.days": "{number, plural, one {# día restante} other {# días restantes}}",

View File

@ -137,6 +137,7 @@
"compose.language.search": "Otsi keeli...", "compose.language.search": "Otsi keeli...",
"compose.published.body": "Postitus avaldatud.", "compose.published.body": "Postitus avaldatud.",
"compose.published.open": "Ava", "compose.published.open": "Ava",
"compose.saved.body": "Postitus salvestatud.",
"compose_form.direct_message_warning_learn_more": "Vaata täpsemalt", "compose_form.direct_message_warning_learn_more": "Vaata täpsemalt",
"compose_form.encryption_warning": "Postitused Mastodonis ei ole otsast-otsani krüpteeritud. Ära jaga mingeid delikaatseid andmeid Mastodoni kaudu.", "compose_form.encryption_warning": "Postitused Mastodonis ei ole otsast-otsani krüpteeritud. Ära jaga mingeid delikaatseid andmeid Mastodoni kaudu.",
"compose_form.hashtag_warning": "See postitus ei ilmu ühegi märksõna all, kuna pole avalik. Vaid avalikud postitused on märksõnade kaudu leitavad.", "compose_form.hashtag_warning": "See postitus ei ilmu ühegi märksõna all, kuna pole avalik. Vaid avalikud postitused on märksõnade kaudu leitavad.",
@ -300,6 +301,7 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} postitust} other {{counter} postitust}} täna", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} postitust} other {{counter} postitust}} täna",
"hashtag.follow": "Jälgi silti", "hashtag.follow": "Jälgi silti",
"hashtag.unfollow": "Lõpeta sildi jälgimine", "hashtag.unfollow": "Lõpeta sildi jälgimine",
"hashtags.and_other": "…ja {count, plural, one {}other {# veel}}",
"home.actions.go_to_explore": "Vaata, mis on populaarne", "home.actions.go_to_explore": "Vaata, mis on populaarne",
"home.actions.go_to_suggestions": "Leia inimesi, keda jälgida", "home.actions.go_to_suggestions": "Leia inimesi, keda jälgida",
"home.column_settings.basic": "Peamine", "home.column_settings.basic": "Peamine",
@ -308,6 +310,9 @@
"home.explore_prompt.body": "Sinu koduvoos on koos jälgimiseks valitud siltidega postitused, sinu jälgitavate inimeste postitused ja postitused, mida nad jagavad. Kui see tundub liiga vaikne, võid sa soovida:", "home.explore_prompt.body": "Sinu koduvoos on koos jälgimiseks valitud siltidega postitused, sinu jälgitavate inimeste postitused ja postitused, mida nad jagavad. Kui see tundub liiga vaikne, võid sa soovida:",
"home.explore_prompt.title": "See on sinu kodubaas Mastodonis.", "home.explore_prompt.title": "See on sinu kodubaas Mastodonis.",
"home.hide_announcements": "Peida teadaanded", "home.hide_announcements": "Peida teadaanded",
"home.pending_critical_update.body": "Palun uuenda oma Mastodoni server nii ruttu kui võimalik!",
"home.pending_critical_update.link": "Vaata uuendusi",
"home.pending_critical_update.title": "Saadaval kriitiline turvauuendus!",
"home.show_announcements": "Kuva teadaandeid", "home.show_announcements": "Kuva teadaandeid",
"interaction_modal.description.favourite": "Mastodoni kontoga saad postituse lemmikuks märkida, et autor teaks, et sa hindad seda, ja jätta see hiljemaks alles.", "interaction_modal.description.favourite": "Mastodoni kontoga saad postituse lemmikuks märkida, et autor teaks, et sa hindad seda, ja jätta see hiljemaks alles.",
"interaction_modal.description.follow": "Mastodoni kontoga saad jälgida kasutajat {name}, et tema postitusi oma koduvoos näha.", "interaction_modal.description.follow": "Mastodoni kontoga saad jälgida kasutajat {name}, et tema postitusi oma koduvoos näha.",
@ -409,6 +414,7 @@
"navigation_bar.lists": "Nimekirjad", "navigation_bar.lists": "Nimekirjad",
"navigation_bar.logout": "Logi välja", "navigation_bar.logout": "Logi välja",
"navigation_bar.mutes": "Vaigistatud kasutajad", "navigation_bar.mutes": "Vaigistatud kasutajad",
"navigation_bar.opened_in_classic_interface": "Postitused, kontod ja teised spetsiaalsed lehed avatakse vaikimisi klassikalises veebiliideses.",
"navigation_bar.personal": "Isiklik", "navigation_bar.personal": "Isiklik",
"navigation_bar.pins": "Kinnitatud postitused", "navigation_bar.pins": "Kinnitatud postitused",
"navigation_bar.preferences": "Eelistused", "navigation_bar.preferences": "Eelistused",
@ -532,6 +538,7 @@
"reply_indicator.cancel": "Tühista", "reply_indicator.cancel": "Tühista",
"report.block": "Blokeeri", "report.block": "Blokeeri",
"report.block_explanation": "Sa ei näe tema postitusi. Tema ei saa näha sinu postitusi ega sind jälgida. Talle on näha, et ta on blokeeritud.", "report.block_explanation": "Sa ei näe tema postitusi. Tema ei saa näha sinu postitusi ega sind jälgida. Talle on näha, et ta on blokeeritud.",
"report.categories.legal": "Juriidiline",
"report.categories.other": "Muud", "report.categories.other": "Muud",
"report.categories.spam": "Rämpspost", "report.categories.spam": "Rämpspost",
"report.categories.violation": "Sisu, mis rikub ühte või enamat serveri reeglit", "report.categories.violation": "Sisu, mis rikub ühte või enamat serveri reeglit",
@ -583,16 +590,20 @@
"search.quick_action.open_url": "Ava URL Mastodonis", "search.quick_action.open_url": "Ava URL Mastodonis",
"search.quick_action.status_search": "Sobivad postitused {x}", "search.quick_action.status_search": "Sobivad postitused {x}",
"search.search_or_paste": "Otsi või kleebi URL", "search.search_or_paste": "Otsi või kleebi URL",
"search_popout.full_text_search_disabled_message": "Pole saadaval kohas {domain}.",
"search_popout.language_code": "Keele ISO-kood",
"search_popout.options": "Otsimisvalikud",
"search_popout.quick_actions": "Kiirtegevused", "search_popout.quick_actions": "Kiirtegevused",
"search_popout.recent": "Viimatised otsingud", "search_popout.recent": "Viimatised otsingud",
"search_popout.specific_date": "kindel päev",
"search_popout.user": "kasutaja",
"search_results.accounts": "Profiilid", "search_results.accounts": "Profiilid",
"search_results.all": "Kõik", "search_results.all": "Kõik",
"search_results.hashtags": "Sildid", "search_results.hashtags": "Sildid",
"search_results.nothing_found": "Otsisõnadele vastavat sisu ei leitud", "search_results.nothing_found": "Otsisõnadele vastavat sisu ei leitud",
"search_results.see_all": "Vaata kõiki",
"search_results.statuses": "Postitused", "search_results.statuses": "Postitused",
"search_results.statuses_fts_disabled": "Postituste otsimine nende sisu järgi ei ole sellel Mastodoni serveril sisse lülitatud.",
"search_results.title": "{q} otsing", "search_results.title": "{q} otsing",
"search_results.total": "{count, number} {count, plural, one {tulemus} other {tulemust}}",
"server_banner.about_active_users": "Inimesed, kes kasutavad seda serverit viimase 30 päeva jooksul (kuu aktiivsed kasutajad)", "server_banner.about_active_users": "Inimesed, kes kasutavad seda serverit viimase 30 päeva jooksul (kuu aktiivsed kasutajad)",
"server_banner.active_users": "aktiivsed kasutajad", "server_banner.active_users": "aktiivsed kasutajad",
"server_banner.administered_by": "Administraator:", "server_banner.administered_by": "Administraator:",
@ -664,8 +675,6 @@
"subscribed_languages.lead": "Pärast muudatust näed koduvaates ja loetelude ajajoontel postitusi valitud keeltes. Ära vali midagi, kui tahad näha postitusi kõikides keeltes.", "subscribed_languages.lead": "Pärast muudatust näed koduvaates ja loetelude ajajoontel postitusi valitud keeltes. Ära vali midagi, kui tahad näha postitusi kõikides keeltes.",
"subscribed_languages.save": "Salvesta muudatused", "subscribed_languages.save": "Salvesta muudatused",
"subscribed_languages.target": "Muuda tellitud keeli {target} jaoks", "subscribed_languages.target": "Muuda tellitud keeli {target} jaoks",
"suggestions.dismiss": "Eira soovitust",
"suggestions.header": "Sind võib huvitada…",
"tabs_bar.home": "Kodu", "tabs_bar.home": "Kodu",
"tabs_bar.notifications": "Teated", "tabs_bar.notifications": "Teated",
"time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud", "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud",

View File

@ -57,7 +57,7 @@
"account.posts": "Bidalketa", "account.posts": "Bidalketa",
"account.posts_with_replies": "Bidalketak eta erantzunak", "account.posts_with_replies": "Bidalketak eta erantzunak",
"account.report": "Salatu @{name}", "account.report": "Salatu @{name}",
"account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko", "account.requested": "Onarpenaren zain. Egin klik jarraipen-eskaera ezeztatzeko",
"account.requested_follow": "{name}-(e)k zu jarraitzeko eskaera egin du", "account.requested_follow": "{name}-(e)k zu jarraitzeko eskaera egin du",
"account.share": "@{name}(e)ren profila elkarbanatu", "account.share": "@{name}(e)ren profila elkarbanatu",
"account.show_reblogs": "Erakutsi @{name}(r)en bultzadak", "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak",
@ -96,7 +96,7 @@
"bundle_column_error.network.title": "Sareko errorea", "bundle_column_error.network.title": "Sareko errorea",
"bundle_column_error.retry": "Saiatu berriro", "bundle_column_error.retry": "Saiatu berriro",
"bundle_column_error.return": "Itzuli hasierako orrira", "bundle_column_error.return": "Itzuli hasierako orrira",
"bundle_column_error.routing.body": "Eskatutako orria ezin izan da aurkitu. Ziur zaude helbide-barrako URLa zuzena dela?", "bundle_column_error.routing.body": "Eskatutako orria ezin izan da aurkitu. Ziur helbide-barrako URLa zuzena dela?",
"bundle_column_error.routing.title": "404", "bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Itxi", "bundle_modal_error.close": "Itxi",
"bundle_modal_error.message": "Zerbait okerra gertatu da osagai hau kargatzean.", "bundle_modal_error.message": "Zerbait okerra gertatu da osagai hau kargatzean.",
@ -104,7 +104,7 @@
"closed_registrations.other_server_instructions": "Mastodon deszentralizatua denez, beste kontu bat sortu dezakezu beste zerbitzari batean eta honekin komunikatu.", "closed_registrations.other_server_instructions": "Mastodon deszentralizatua denez, beste kontu bat sortu dezakezu beste zerbitzari batean eta honekin komunikatu.",
"closed_registrations_modal.description": "Une honetan ezin da konturik sortu {domain} zerbitzarian, baina kontuan izan Mastodon erabiltzeko ez duzula zertan konturik izan zehazki {domain} zerbitzarian.", "closed_registrations_modal.description": "Une honetan ezin da konturik sortu {domain} zerbitzarian, baina kontuan izan Mastodon erabiltzeko ez duzula zertan konturik izan zehazki {domain} zerbitzarian.",
"closed_registrations_modal.find_another_server": "Aurkitu beste zerbitzari bat", "closed_registrations_modal.find_another_server": "Aurkitu beste zerbitzari bat",
"closed_registrations_modal.preamble": "Mastodon deszentralizatua da, ondorioz kontua edonon sortuta ere zerbitzari honetako jendea jarraitu eta haiekin komunikatzeko aukera izango duzu. Zure zerbitzaria ere sortu dezakezu!", "closed_registrations_modal.preamble": "Mastodon deszentralizatua da, ondorioz kontua edonon sortuta ere zerbitzari honetako jendeari jarraitu eta haiekin komunikatzeko aukera izango duzu. Zure zerbitzaria ere sortu dezakezu!",
"closed_registrations_modal.title": "Mastodonen kontua sortzea", "closed_registrations_modal.title": "Mastodonen kontua sortzea",
"column.about": "Honi buruz", "column.about": "Honi buruz",
"column.blocks": "Blokeatutako erabiltzaileak", "column.blocks": "Blokeatutako erabiltzaileak",
@ -115,7 +115,7 @@
"column.domain_blocks": "Ezkutatutako domeinuak", "column.domain_blocks": "Ezkutatutako domeinuak",
"column.favourites": "Gogokoak", "column.favourites": "Gogokoak",
"column.firehose": "Zuzeneko jarioak", "column.firehose": "Zuzeneko jarioak",
"column.follow_requests": "Jarraitzeko eskariak", "column.follow_requests": "Jarraitzeko eskaerak",
"column.home": "Hasiera", "column.home": "Hasiera",
"column.lists": "Zerrendak", "column.lists": "Zerrendak",
"column.mutes": "Mutututako erabiltzaileak", "column.mutes": "Mutututako erabiltzaileak",
@ -137,6 +137,7 @@
"compose.language.search": "Bilatu hizkuntzak...", "compose.language.search": "Bilatu hizkuntzak...",
"compose.published.body": "Argitalpena argitaratuta.", "compose.published.body": "Argitalpena argitaratuta.",
"compose.published.open": "Ireki", "compose.published.open": "Ireki",
"compose.saved.body": "Argitalpena gorde da.",
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago", "compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
"compose_form.encryption_warning": "Mastodoneko bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.", "compose_form.encryption_warning": "Mastodoneko bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
"compose_form.hashtag_warning": "Tut hau ez da inolako traolatan zerrendatuko, ez baita publikoa. Tut publikoak soilik traolen bitartez bila daitezke.", "compose_form.hashtag_warning": "Tut hau ez da inolako traolatan zerrendatuko, ez baita publikoa. Tut publikoak soilik traolen bitartez bila daitezke.",
@ -164,7 +165,7 @@
"confirmations.block.confirm": "Blokeatu", "confirmations.block.confirm": "Blokeatu",
"confirmations.block.message": "Ziur {name} blokeatu nahi duzula?", "confirmations.block.message": "Ziur {name} blokeatu nahi duzula?",
"confirmations.cancel_follow_request.confirm": "Baztertu eskaera", "confirmations.cancel_follow_request.confirm": "Baztertu eskaera",
"confirmations.cancel_follow_request.message": "Ziur zaude {name} jarraitzeko eskaera bertan behera utzi nahi duzula?", "confirmations.cancel_follow_request.message": "Ziur {name} jarraitzeko eskaera bertan behera utzi nahi duzula?",
"confirmations.delete.confirm": "Ezabatu", "confirmations.delete.confirm": "Ezabatu",
"confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?", "confirmations.delete.message": "Ziur bidalketa hau ezabatu nahi duzula?",
"confirmations.delete_list.confirm": "Ezabatu", "confirmations.delete_list.confirm": "Ezabatu",
@ -181,7 +182,7 @@
"confirmations.mute.explanation": "Honek horko bidalketak eta aipamena egiten dietenak ezkutatuko ditu, baina beraiek zure bidalketak ikusi ahal izango dituzte eta zuri jarraitu.", "confirmations.mute.explanation": "Honek horko bidalketak eta aipamena egiten dietenak ezkutatuko ditu, baina beraiek zure bidalketak ikusi ahal izango dituzte eta zuri jarraitu.",
"confirmations.mute.message": "Ziur {name} mututu nahi duzula?", "confirmations.mute.message": "Ziur {name} mututu nahi duzula?",
"confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.confirm": "Ezabatu eta berridatzi",
"confirmations.redraft.message": "Ziur zaude argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.", "confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.",
"confirmations.reply.confirm": "Erantzun", "confirmations.reply.confirm": "Erantzun",
"confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?",
"confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.confirm": "Utzi jarraitzeari",
@ -201,6 +202,7 @@
"dismissable_banner.community_timeline": "Hauek dira {domain} zerbitzarian ostatatutako kontuen bidalketa publiko berrienak.", "dismissable_banner.community_timeline": "Hauek dira {domain} zerbitzarian ostatatutako kontuen bidalketa publiko berrienak.",
"dismissable_banner.dismiss": "Baztertu", "dismissable_banner.dismiss": "Baztertu",
"dismissable_banner.explore_links": "Albiste hauei buruz hitz egiten ari da jendea orain zerbitzari honetan eta sare deszentralizatuko besteetan.", "dismissable_banner.explore_links": "Albiste hauei buruz hitz egiten ari da jendea orain zerbitzari honetan eta sare deszentralizatuko besteetan.",
"dismissable_banner.explore_statuses": "Hauek dira gaur egun lekua hartzen ari diren sare sozial osoaren argitalpenak. Bultzada eta gogoko gehien dituzten argitalpen berrienek sailkapen altuagoa dute.",
"dismissable_banner.explore_tags": "Traola hauek daude bogan orain zerbitzari honetan eta sare deszentralizatuko besteetan.", "dismissable_banner.explore_tags": "Traola hauek daude bogan orain zerbitzari honetan eta sare deszentralizatuko besteetan.",
"dismissable_banner.public_timeline": "Hauek dira {domain}-(e)ko jendeak web sozialean jarraitzen dituen jendearen azkeneko argitalpen publikoak.", "dismissable_banner.public_timeline": "Hauek dira {domain}-(e)ko jendeak web sozialean jarraitzen dituen jendearen azkeneko argitalpen publikoak.",
"embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.", "embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.",
@ -229,7 +231,9 @@
"empty_column.direct": "Ez duzu aipamen pribaturik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.", "empty_column.direct": "Ez duzu aipamen pribaturik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.",
"empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.", "empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
"empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!", "empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!",
"empty_column.follow_requests": "Ez duzu jarraitzeko eskaririk oraindik. Baten bat jasotzen duzunean, hemen agertuko da.", "empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogoko bat duzunean, hemen agertuko da.",
"empty_column.favourites": "Inork ez du oraindik bidalketa hau gogokoetara gehitu. Norbaitek egiten duenean, hemen agertuko dira.",
"empty_column.follow_requests": "Ez duzu jarraitzeko eskaerarik oraindik. Baten bat jasotzen duzunean, hemen agertuko da.",
"empty_column.followed_tags": "Oraindik ez duzu traolik jarraitzen. Egiterakoan, hemen agertuko dira.", "empty_column.followed_tags": "Oraindik ez duzu traolik jarraitzen. Egiterakoan, hemen agertuko dira.",
"empty_column.hashtag": "Ez dago ezer traola honetan oraindik.", "empty_column.hashtag": "Ez dago ezer traola honetan oraindik.",
"empty_column.home": "Zure hasierako denbora-lerroa hutsik dago! Ikusi {public} edo erabili bilaketa lehen urratsak eman eta beste batzuk aurkitzeko.", "empty_column.home": "Zure hasierako denbora-lerroa hutsik dago! Ikusi {public} edo erabili bilaketa lehen urratsak eman eta beste batzuk aurkitzeko.",
@ -237,7 +241,7 @@
"empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.", "empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.",
"empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.", "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.",
"empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.", "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.",
"empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko", "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileei hau betetzen joateko",
"error.unexpected_crash.explanation": "Gure kodean arazoren bat dela eta, edo nabigatzailearekin bateragarritasun arazoren bat dela eta, orri hau ezin izan da ongi bistaratu.", "error.unexpected_crash.explanation": "Gure kodean arazoren bat dela eta, edo nabigatzailearekin bateragarritasun arazoren bat dela eta, orri hau ezin izan da ongi bistaratu.",
"error.unexpected_crash.explanation_addons": "Ezin izan da orria behar bezala bistaratu. Errore honen jatorria nabigatzailearen gehigarri batean edo itzulpen automatikoko tresnetan dago ziur aski.", "error.unexpected_crash.explanation_addons": "Ezin izan da orria behar bezala bistaratu. Errore honen jatorria nabigatzailearen gehigarri batean edo itzulpen automatikoko tresnetan dago ziur aski.",
"error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.", "error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
@ -271,7 +275,7 @@
"firehose.remote": "Beste zerbitzariak", "firehose.remote": "Beste zerbitzariak",
"follow_request.authorize": "Baimendu", "follow_request.authorize": "Baimendu",
"follow_request.reject": "Ukatu", "follow_request.reject": "Ukatu",
"follow_requests.unlocked_explanation": "Zure kontua blokeatuta ez badago ere, {domain} domeinuko arduradunek uste dute kontu hauetako jarraipen eskariak agian eskuz begiratu nahiko dituzula.", "follow_requests.unlocked_explanation": "Zure kontua blokeatuta ez badago ere, {domain} domeinuko arduradunek uste dute kontu hauetako jarraipen eskaerak agian eskuz begiratu nahiko dituzula.",
"followed_tags": "Jarraitutako traolak", "followed_tags": "Jarraitutako traolak",
"footer.about": "Honi buruz", "footer.about": "Honi buruz",
"footer.directory": "Profil-direktorioa", "footer.directory": "Profil-direktorioa",
@ -295,16 +299,22 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} parte-hartzaile} other {{counter} parte-hartzaile}}", "hashtag.counter_by_accounts": "{count, plural, one {{counter} parte-hartzaile} other {{counter} parte-hartzaile}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}} gaur", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}} gaur",
"hashtag.follow": "Jarraitu traola", "hashtag.follow": "Jarraitu traolari",
"hashtag.unfollow": "Utzi traola jarraitzeari", "hashtag.unfollow": "Utzi traola jarraitzeari",
"hashtags.and_other": "…eta {count, plural, one {}other {# gehiago}}",
"home.actions.go_to_explore": "Ikusi zer dagoen pil-pilean", "home.actions.go_to_explore": "Ikusi zer dagoen pil-pilean",
"home.actions.go_to_suggestions": "Aurkitu jendea jarraitzeko", "home.actions.go_to_suggestions": "Aurkitu jendea jarraitzeko",
"home.column_settings.basic": "Oinarrizkoa", "home.column_settings.basic": "Oinarrizkoa",
"home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_reblogs": "Erakutsi bultzadak",
"home.column_settings.show_replies": "Erakutsi erantzunak", "home.column_settings.show_replies": "Erakutsi erantzunak",
"home.explore_prompt.body": "Zure hasierako jarioak jarraitzeko aukeratu dituzun traolen, jarraitzeko aukeratu duzun jendearen eta beraiek bultzatutako argitalpenen nahasketa bat edukiko du. Nahiko isila dirudi oraintxe, beraz, zergatik ez:",
"home.explore_prompt.title": "Hau zure hasiera da Mastodonen.", "home.explore_prompt.title": "Hau zure hasiera da Mastodonen.",
"home.hide_announcements": "Ezkutatu iragarpenak", "home.hide_announcements": "Ezkutatu iragarpenak",
"home.pending_critical_update.body": "Eguneratu zure Mastodoneko zerbitzaria leheinbailehen!",
"home.pending_critical_update.link": "Ikusi eguneraketak",
"home.pending_critical_update.title": "Segurtasun eguneraketa kritikoa eskuragarri!",
"home.show_announcements": "Erakutsi iragarpenak", "home.show_announcements": "Erakutsi iragarpenak",
"interaction_modal.description.favourite": "Mastodon kontu batekin bidalketa hau gogoko egin dezakezu, egileari eskertzeko eta gerorako gordetzeko.",
"interaction_modal.description.follow": "Mastodon kontu batekin {name} jarraitu dezakezu bere bidalketak zure hasierako denbora lerroan jasotzeko.", "interaction_modal.description.follow": "Mastodon kontu batekin {name} jarraitu dezakezu bere bidalketak zure hasierako denbora lerroan jasotzeko.",
"interaction_modal.description.reblog": "Mastodon kontu batekin bidalketa hau bultzatu dezakezu, zure jarraitzaileekin partekatzeko.", "interaction_modal.description.reblog": "Mastodon kontu batekin bidalketa hau bultzatu dezakezu, zure jarraitzaileekin partekatzeko.",
"interaction_modal.description.reply": "Mastodon kontu batekin bidalketa honi erantzun diezaiokezu.", "interaction_modal.description.reply": "Mastodon kontu batekin bidalketa honi erantzun diezaiokezu.",
@ -315,7 +325,8 @@
"interaction_modal.on_this_server": "Zerbitzari honetan", "interaction_modal.on_this_server": "Zerbitzari honetan",
"interaction_modal.sign_in": "Ez duzu saioa hasita zerbitzari honetan. Non dago zure kontua ostatatua?", "interaction_modal.sign_in": "Ez duzu saioa hasita zerbitzari honetan. Non dago zure kontua ostatatua?",
"interaction_modal.sign_in_hint": "Aholkua: Izena eman duzun zerbitzaria da. Ez baduzu gogoratzen, begiratu ongietorri-mezua zure sarrera-ontzian. Baita ere, zure erabiltzaile-izen osoa sar dezakezu! (adib. @Mastodon@mastodon.social)", "interaction_modal.sign_in_hint": "Aholkua: Izena eman duzun zerbitzaria da. Ez baduzu gogoratzen, begiratu ongietorri-mezua zure sarrera-ontzian. Baita ere, zure erabiltzaile-izen osoa sar dezakezu! (adib. @Mastodon@mastodon.social)",
"interaction_modal.title.follow": "Jarraitu {name}", "interaction_modal.title.favourite": "Egin gogoko {name}(r)en bidalketa",
"interaction_modal.title.follow": "Jarraitu {name}(r)i",
"interaction_modal.title.reblog": "Bultzatu {name}(r)en bidalketa", "interaction_modal.title.reblog": "Bultzatu {name}(r)en bidalketa",
"interaction_modal.title.reply": "Erantzun {name}(r)en bidalketari", "interaction_modal.title.reply": "Erantzun {name}(r)en bidalketari",
"intervals.full.days": "{number, plural, one {egun #} other {# egun}}", "intervals.full.days": "{number, plural, one {egun #} other {# egun}}",
@ -330,6 +341,8 @@
"keyboard_shortcuts.direct": "aipamen pribatuen zutabea irekitzeko", "keyboard_shortcuts.direct": "aipamen pribatuen zutabea irekitzeko",
"keyboard_shortcuts.down": "zerrendan behera mugitzea", "keyboard_shortcuts.down": "zerrendan behera mugitzea",
"keyboard_shortcuts.enter": "Ireki bidalketa", "keyboard_shortcuts.enter": "Ireki bidalketa",
"keyboard_shortcuts.favourite": "Egin gogoko bidalketa",
"keyboard_shortcuts.favourites": "Ireki gogokoen zerrenda",
"keyboard_shortcuts.federated": "federatutako denbora-lerroa irekitzeko", "keyboard_shortcuts.federated": "federatutako denbora-lerroa irekitzeko",
"keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.heading": "Keyboard Shortcuts",
"keyboard_shortcuts.home": "hasierako denbora-lerroa irekitzeko", "keyboard_shortcuts.home": "hasierako denbora-lerroa irekitzeko",
@ -344,7 +357,7 @@
"keyboard_shortcuts.pinned": "Ireki finkatutako bidalketen zerrenda", "keyboard_shortcuts.pinned": "Ireki finkatutako bidalketen zerrenda",
"keyboard_shortcuts.profile": "egilearen profila irekitzeko", "keyboard_shortcuts.profile": "egilearen profila irekitzeko",
"keyboard_shortcuts.reply": "Erantzun bidalketari", "keyboard_shortcuts.reply": "Erantzun bidalketari",
"keyboard_shortcuts.requests": "jarraitzeko eskarien zerrenda irekitzeko", "keyboard_shortcuts.requests": "Jarraitzeko eskaeren zerrenda irekia",
"keyboard_shortcuts.search": "bilaketan fokua jartzea", "keyboard_shortcuts.search": "bilaketan fokua jartzea",
"keyboard_shortcuts.spoilers": "CW eremua erakutsi/ezkutatzeko", "keyboard_shortcuts.spoilers": "CW eremua erakutsi/ezkutatzeko",
"keyboard_shortcuts.start": "\"Menua\" zutabea irekitzeko", "keyboard_shortcuts.start": "\"Menua\" zutabea irekitzeko",
@ -393,13 +406,15 @@
"navigation_bar.domain_blocks": "Ezkutatutako domeinuak", "navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
"navigation_bar.edit_profile": "Aldatu profila", "navigation_bar.edit_profile": "Aldatu profila",
"navigation_bar.explore": "Arakatu", "navigation_bar.explore": "Arakatu",
"navigation_bar.favourites": "Gogokoak",
"navigation_bar.filters": "Mutututako hitzak", "navigation_bar.filters": "Mutututako hitzak",
"navigation_bar.follow_requests": "Jarraitzeko eskariak", "navigation_bar.follow_requests": "Jarraitzeko eskaerak",
"navigation_bar.followed_tags": "Jarraitutako traolak", "navigation_bar.followed_tags": "Jarraitutako traolak",
"navigation_bar.follows_and_followers": "Jarraitutakoak eta jarraitzaileak", "navigation_bar.follows_and_followers": "Jarraitutakoak eta jarraitzaileak",
"navigation_bar.lists": "Zerrendak", "navigation_bar.lists": "Zerrendak",
"navigation_bar.logout": "Amaitu saioa", "navigation_bar.logout": "Amaitu saioa",
"navigation_bar.mutes": "Mutututako erabiltzaileak", "navigation_bar.mutes": "Mutututako erabiltzaileak",
"navigation_bar.opened_in_classic_interface": "Argitalpenak, kontuak eta beste orri jakin batzuk lehenespenez irekitzen dira web-interfaze klasikoan.",
"navigation_bar.personal": "Pertsonala", "navigation_bar.personal": "Pertsonala",
"navigation_bar.pins": "Finkatutako bidalketak", "navigation_bar.pins": "Finkatutako bidalketak",
"navigation_bar.preferences": "Hobespenak", "navigation_bar.preferences": "Hobespenak",
@ -409,7 +424,8 @@
"not_signed_in_indicator.not_signed_in": "Baliabide honetara sarbidea izateko saioa hasi behar duzu.", "not_signed_in_indicator.not_signed_in": "Baliabide honetara sarbidea izateko saioa hasi behar duzu.",
"notification.admin.report": "{name} erabiltzaileak {target} salatu du", "notification.admin.report": "{name} erabiltzaileak {target} salatu du",
"notification.admin.sign_up": "{name} erabiltzailea erregistratu da", "notification.admin.sign_up": "{name} erabiltzailea erregistratu da",
"notification.follow": "{name}(e)k jarraitzen zaitu", "notification.favourite": "{name}(e)k zure bidalketa gogoko du",
"notification.follow": "{name}(e)k jarraitzen dizu",
"notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du", "notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du",
"notification.mention": "{name}(e)k aipatu zaitu", "notification.mention": "{name}(e)k aipatu zaitu",
"notification.own_poll": "Zure inkesta amaitu da", "notification.own_poll": "Zure inkesta amaitu da",
@ -422,6 +438,7 @@
"notifications.column_settings.admin.report": "Txosten berriak:", "notifications.column_settings.admin.report": "Txosten berriak:",
"notifications.column_settings.admin.sign_up": "Izen-emate berriak:", "notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak", "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
"notifications.column_settings.favourite": "Gogokoak:",
"notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak", "notifications.column_settings.filter_bar.advanced": "Erakutsi kategoria guztiak",
"notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra", "notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra",
"notifications.column_settings.filter_bar.show_bar": "Erakutsi iragazki-barra", "notifications.column_settings.filter_bar.show_bar": "Erakutsi iragazki-barra",
@ -439,6 +456,7 @@
"notifications.column_settings.update": "Edizioak:", "notifications.column_settings.update": "Edizioak:",
"notifications.filter.all": "Denak", "notifications.filter.all": "Denak",
"notifications.filter.boosts": "Bultzadak", "notifications.filter.boosts": "Bultzadak",
"notifications.filter.favourites": "Gogokoak",
"notifications.filter.follows": "Jarraipenak", "notifications.filter.follows": "Jarraipenak",
"notifications.filter.mentions": "Aipamenak", "notifications.filter.mentions": "Aipamenak",
"notifications.filter.polls": "Inkestaren emaitza", "notifications.filter.polls": "Inkestaren emaitza",
@ -458,7 +476,7 @@
"onboarding.actions.go_to_home": "Joan hasierara", "onboarding.actions.go_to_home": "Joan hasierara",
"onboarding.compose.template": "Kaixo #Mastodon!", "onboarding.compose.template": "Kaixo #Mastodon!",
"onboarding.follows.empty": "Zoritxarrez, ezin da emaitzik erakutsi orain. Bilaketa erabil dezakezu edo Arakatu orrian jendea bilatu jarraitzeko, edo saiatu geroago.", "onboarding.follows.empty": "Zoritxarrez, ezin da emaitzik erakutsi orain. Bilaketa erabil dezakezu edo Arakatu orrian jendea bilatu jarraitzeko, edo saiatu geroago.",
"onboarding.follows.lead": "Hasierako orria zuk pertsonalizatzen duzu. Gero eta jende gehiago jarraitu, orduan eta aktibo eta interesgarriago izango da. Profil hauek egokiak izan daitezke hasteko, beti ere, geroago jarraitzeari utz diezazkiekezu!", "onboarding.follows.lead": "Hasierako orria zuk pertsonalizatzen duzu. Gero eta jende gehiagori jarraitu, orduan eta aktibo eta interesgarriago izango da. Profil hauek egokiak izan daitezke hasteko, beti ere, geroago jarraitzeari utz diezazkiekezu!",
"onboarding.follows.title": "Mastodonen pil-pilean", "onboarding.follows.title": "Mastodonen pil-pilean",
"onboarding.share.lead": "Esan jendeari nola aurki zaitzaketen Mastodonen!", "onboarding.share.lead": "Esan jendeari nola aurki zaitzaketen Mastodonen!",
"onboarding.share.message": "{username} naiz #Mastodon-en! Jarrai nazazu hemen: {url}", "onboarding.share.message": "{username} naiz #Mastodon-en! Jarrai nazazu hemen: {url}",
@ -520,6 +538,7 @@
"reply_indicator.cancel": "Utzi", "reply_indicator.cancel": "Utzi",
"report.block": "Blokeatu", "report.block": "Blokeatu",
"report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.", "report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.",
"report.categories.legal": "Juridikoa",
"report.categories.other": "Bestelakoak", "report.categories.other": "Bestelakoak",
"report.categories.spam": "Spam", "report.categories.spam": "Spam",
"report.categories.violation": "Edukiak zerbitzariko arau bat edo gehiago urratzen ditu", "report.categories.violation": "Edukiak zerbitzariko arau bat edo gehiago urratzen ditu",
@ -532,7 +551,7 @@
"report.forward": "Birbidali hona: {target}", "report.forward": "Birbidali hona: {target}",
"report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?", "report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?",
"report.mute": "Mututu", "report.mute": "Mututu",
"report.mute_explanation": "Ez dituzu bere bidalketak ikusiko. Zu jarraitu eta zure bidalketak ikusteko aukera izango dute eta ezingo dute jakin mututu dituzula.", "report.mute_explanation": "Ez dituzu bere bidalketak ikusiko. Zuri jarraitu eta zure bidalketak ikusteko aukera izango dute eta ezingo dute jakin mututu dituzula.",
"report.next": "Hurrengoa", "report.next": "Hurrengoa",
"report.placeholder": "Iruzkin gehigarriak", "report.placeholder": "Iruzkin gehigarriak",
"report.reasons.dislike": "Ez dut gustukoa", "report.reasons.dislike": "Ez dut gustukoa",
@ -571,16 +590,20 @@
"search.quick_action.open_url": "Ireki URLa Mastodonen", "search.quick_action.open_url": "Ireki URLa Mastodonen",
"search.quick_action.status_search": "{x}-(r)ekin bat datozen argitalpenak", "search.quick_action.status_search": "{x}-(r)ekin bat datozen argitalpenak",
"search.search_or_paste": "Bilatu edo itsatsi URLa", "search.search_or_paste": "Bilatu edo itsatsi URLa",
"search_popout.full_text_search_disabled_message": "{domain}-en ez dago eskuragarri.",
"search_popout.language_code": "ISO hizkuntza-kodea",
"search_popout.options": "Bilaketaren aukerak",
"search_popout.quick_actions": "Ekintza azkarrak", "search_popout.quick_actions": "Ekintza azkarrak",
"search_popout.recent": "Duela gutxiko bilaketak", "search_popout.recent": "Duela gutxiko bilaketak",
"search_popout.specific_date": "data jakin bat",
"search_popout.user": "erabiltzailea",
"search_results.accounts": "Profilak", "search_results.accounts": "Profilak",
"search_results.all": "Guztiak", "search_results.all": "Guztiak",
"search_results.hashtags": "Traolak", "search_results.hashtags": "Traolak",
"search_results.nothing_found": "Ez da emaitzarik aurkitu bilaketa-termino horientzat", "search_results.nothing_found": "Ez da emaitzarik aurkitu bilaketa-termino horientzat",
"search_results.see_all": "Ikusi guztiak",
"search_results.statuses": "Bidalketak", "search_results.statuses": "Bidalketak",
"search_results.statuses_fts_disabled": "Mastodon zerbitzari honek ez du bidalketen edukiaren bilaketa gaitu.",
"search_results.title": "Bilatu {q}", "search_results.title": "Bilatu {q}",
"search_results.total": "{count, number} {count, plural, one {emaitza} other {emaitza}}",
"server_banner.about_active_users": "Azken 30 egunetan zerbitzari hau erabili duen jendea (hilabeteko erabiltzaile aktiboak)", "server_banner.about_active_users": "Azken 30 egunetan zerbitzari hau erabili duen jendea (hilabeteko erabiltzaile aktiboak)",
"server_banner.active_users": "erabiltzaile aktibo", "server_banner.active_users": "erabiltzaile aktibo",
"server_banner.administered_by": "Administratzailea(k):", "server_banner.administered_by": "Administratzailea(k):",
@ -590,6 +613,7 @@
"sign_in_banner.create_account": "Sortu kontua", "sign_in_banner.create_account": "Sortu kontua",
"sign_in_banner.sign_in": "Hasi saioa", "sign_in_banner.sign_in": "Hasi saioa",
"sign_in_banner.sso_redirect": "Hasi saioa edo izena eman", "sign_in_banner.sso_redirect": "Hasi saioa edo izena eman",
"sign_in_banner.text": "Hasi saioa profilak edo traolak jarraitzeko, bidalketak gogokoetara gehitzeko, partekatzeko edo erantzuteko. Zure kontutik ere komunika zaitezke beste zerbitzari ezberdin vatean.",
"status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea", "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
"status.admin_domain": "{domain}-(r)en moderazio-interfazea ireki", "status.admin_domain": "{domain}-(r)en moderazio-interfazea ireki",
"status.admin_status": "Ireki bidalketa hau moderazio interfazean", "status.admin_status": "Ireki bidalketa hau moderazio interfazean",
@ -606,6 +630,7 @@
"status.edited": "Editatua {date}", "status.edited": "Editatua {date}",
"status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua", "status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
"status.embed": "Txertatu", "status.embed": "Txertatu",
"status.favourite": "Gogokoa",
"status.filter": "Iragazi bidalketa hau", "status.filter": "Iragazi bidalketa hau",
"status.filtered": "Iragazita", "status.filtered": "Iragazita",
"status.hide": "Tuta ezkutatu", "status.hide": "Tuta ezkutatu",
@ -650,8 +675,6 @@
"subscribed_languages.lead": "Hautatutako hizkuntzetako bidalketak soilik agertuko dira zure denbora-lerroetan aldaketaren ondoren. Ez baduzu bat ere aukeratzen hizkuntza guztietako bidalketak jasoko dituzu.", "subscribed_languages.lead": "Hautatutako hizkuntzetako bidalketak soilik agertuko dira zure denbora-lerroetan aldaketaren ondoren. Ez baduzu bat ere aukeratzen hizkuntza guztietako bidalketak jasoko dituzu.",
"subscribed_languages.save": "Gorde aldaketak", "subscribed_languages.save": "Gorde aldaketak",
"subscribed_languages.target": "Aldatu {target}(e)n harpidetutako hizkuntzak", "subscribed_languages.target": "Aldatu {target}(e)n harpidetutako hizkuntzak",
"suggestions.dismiss": "Errefusatu proposamena",
"suggestions.header": "Hau interesatu dakizuke…",
"tabs_bar.home": "Hasiera", "tabs_bar.home": "Hasiera",
"tabs_bar.notifications": "Jakinarazpenak", "tabs_bar.notifications": "Jakinarazpenak",
"time_remaining.days": "{number, plural, one {egun #} other {# egun}} amaitzeko", "time_remaining.days": "{number, plural, one {egun #} other {# egun}} amaitzeko",

Some files were not shown because too many files have changed in this diff Show More