Compare commits

..

1 commit

Author SHA1 Message Date
nightpool
8eadd119a3
Don't count a delivery as successful if the response is not tracked by Stoplight 2022-12-14 15:01:22 -05:00
404 changed files with 1764 additions and 5865 deletions

View file

@ -1,8 +1,8 @@
version: 2.1
orbs:
ruby: circleci/ruby@2.0.0
node: circleci/node@5.0.3
ruby: circleci/ruby@1.4.1
node: circleci/node@5.0.1
executors:
default:
@ -19,11 +19,11 @@ executors:
DB_USER: root
DISABLE_SIMPLECOV: true
RAILS_ENV: test
- image: cimg/postgres:14.5
- image: cimg/postgres:14.0
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: cimg/redis:7.0
- image: cimg/redis:6.2
commands:
install-system-dependencies:
@ -45,7 +45,7 @@ commands:
bundle config without 'development production'
name: Set bundler settings
- ruby/install-deps:
bundler-version: '2.3.26'
bundler-version: '2.3.8'
key: ruby<< parameters.ruby-version >>-gems-v1
wait-db:
steps:
@ -221,5 +221,5 @@ workflows:
pkg-manager: yarn
requires:
- build
version: '16.18'
version: lts
yarn-run: test:jest

View file

@ -9,7 +9,7 @@ FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
# The value is a comma-separated list of allowed domains
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"
# [Choice] Node.js version: lts/*, 18, 16, 14
# [Choice] Node.js version: lts/*, 16, 14, 12, 10
ARG NODE_VERSION="lts/*"
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"

View file

@ -2,7 +2,7 @@
"name": "Mastodon",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/mastodon",
"workspaceFolder": "/workspaces/mastodon",
// Set *default* container specific settings.json values on container create.
"settings": {},
@ -20,7 +20,7 @@
"forwardPorts": [3000, 4000],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": ".devcontainer/post-create.sh",
"postCreateCommand": "bundle install --path vendor/bundle && yarn install && git checkout -- Gemfile.lock && ./bin/rails db:setup",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"

View file

@ -11,9 +11,9 @@ services:
# Use -bullseye variants on local arm64/Apple Silicon.
VARIANT: '3.0-bullseye'
# Optional Node.js version to install
NODE_VERSION: '16'
NODE_VERSION: '14'
volumes:
- ..:/mastodon:cached
- ..:/workspaces/mastodon:cached
environment:
RAILS_ENV: development
NODE_ENV: development

View file

@ -1,21 +0,0 @@
#!/bin/bash
set -e # Fail the whole script on first error
# Fetch Ruby gem dependencies
bundle install --path vendor/bundle --with='development test'
# Fetch Javascript dependencies
yarn install
# Make Gemfile.lock pristine again
git checkout -- Gemfile.lock
# [re]create, migrate, and seed the test database
RAILS_ENV=test ./bin/rails db:setup
# Precompile assets for development
RAILS_ENV=development ./bin/rails assets:precompile
# Precompile assets for test
RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile

View file

@ -54,7 +54,7 @@ VAPID_PUBLIC_KEY=
# Sending mail
# ------------
SMTP_SERVER=
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=

View file

@ -1,10 +1,6 @@
module.exports = {
root: true,
extends: [
'eslint:recommended',
],
env: {
browser: true,
node: true,
@ -68,8 +64,8 @@ module.exports = {
eqeqeq: 'error',
indent: ['warn', 2],
'jsx-quotes': ['error', 'prefer-single'],
'no-case-declarations': 'off',
'no-catch-shadow': 'error',
'no-cond-assign': 'error',
'no-console': [
'warn',
{
@ -79,16 +75,18 @@ module.exports = {
],
},
],
'no-empty': 'off',
'no-fallthrough': 'error',
'no-irregular-whitespace': 'error',
'no-mixed-spaces-and-tabs': 'warn',
'no-nested-ternary': 'warn',
'no-prototype-builtins': 'off',
'no-restricted-properties': [
'error',
{ property: 'substring', message: 'Use .slice instead of .substring.' },
{ property: 'substr', message: 'Use .slice instead of .substr.' },
],
'no-self-assign': 'off',
'no-trailing-spaces': 'warn',
'no-undef': 'error',
'no-unreachable': 'error',
'no-unused-expressions': 'error',
'no-unused-vars': [
'error',
@ -98,7 +96,6 @@ module.exports = {
ignoreRestSiblings: true,
},
],
'no-useless-escape': 'off',
'object-curly-spacing': ['error', 'always'],
'padded-blocks': [
'error',
@ -108,6 +105,7 @@ module.exports = {
],
quotes: ['error', 'single'],
semi: 'error',
strict: 'off',
'valid-typeof': 'error',
'react/jsx-boolean-value': 'error',

View file

@ -18,7 +18,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: hadolint/hadolint-action@v3.0.0
- uses: docker/setup-qemu-action@v2
- uses: docker/setup-buildx-action@v2
- uses: docker/login-action@v2

View file

@ -1,62 +0,0 @@
name: 'CodeQL'
on:
push:
branches: ['main']
pull_request:
# The branches below must be a subset of the branches above
branches: ['main']
schedule:
- cron: '22 6 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['javascript', 'ruby']
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: '/language:${{matrix.language}}'

2
.nvmrc
View file

@ -1 +1 @@
16
14

View file

@ -1,18 +1,12 @@
require:
- rubocop-rails
- rubocop-rspec
- rubocop-performance
AllCops:
TargetRubyVersion: 2.7
DisplayCopNames: true
DisplayStyleGuide: true
ExtraDetails: true
UseCache: true
CacheRootDirectory: tmp
NewCops: enable
NewCops: disable
Exclude:
- db/schema.rb
- 'spec/**/*'
- 'db/**/*'
- 'app/views/**/*'
- 'config/**/*'
- 'bin/*'
@ -73,57 +67,15 @@ Lint/UselessAccessModifier:
- class_methods
Metrics/AbcSize:
Max: 34 # RuboCop default 17
Max: 115
Exclude:
- 'lib/**/*cli*.rb'
- db/*migrate/**/*
- lib/paperclip/color_extractor.rb
- app/workers/scheduler/follow_recommendations_scheduler.rb
- app/services/activitypub/fetch*_service.rb
- lib/paperclip/**/*
CountRepeatedAttributes: false
AllowedMethods:
- update_media_attachments!
- account_link_to
- attempt_oembed
- build_crutches
- calculate_scores
- cc
- dump_actor!
- filter_from_home?
- hydrate
- import_bookmarks!
- import_relationships!
- initialize
- link_to_mention
- log_target
- matches_time_window?
- parse_metadata
- perform_statuses_search!
- privatize_media_attachments!
- process_update
- publish_media_attachments!
- remotable_attachment
- render_initial_state
- render_with_cache
- searchable_by
- self.cached_filters_for
- set_fetchable_attributes!
- signed_request_actor
- statuses_to_delete
- update_poll!
- 'lib/mastodon/*_cli.rb'
Metrics/BlockLength:
Max: 55
Exclude:
- 'lib/tasks/**/*'
- 'lib/mastodon/*_cli.rb'
CountComments: false
CountAsOne: [array, heredoc]
AllowedMethods:
- task
- namespace
- class_methods
- included
Metrics/BlockNesting:
Max: 3
@ -133,144 +85,34 @@ Metrics/BlockNesting:
Metrics/ClassLength:
CountComments: false
Max: 500
CountAsOne: [array, heredoc]
Exclude:
- 'lib/mastodon/*_cli.rb'
Metrics/CyclomaticComplexity:
Max: 12
Max: 25
Exclude:
- lib/mastodon/*cli*.rb
- db/*migrate/**/*
AllowedMethods:
- attempt_oembed
- blocked?
- build_crutches
- calculate_scores
- cc
- discover_endpoint!
- filter_from_home?
- hydrate
- klass
- link_to_mention
- log_target
- matches_time_window?
- patch_for_forwarding!
- preprocess_attributes!
- process_update
- remotable_attachment
- scan_text!
- self.cached_filters_for
- set_fetchable_attributes!
- setup_redis_env_url
- update_media_attachments!
- 'lib/mastodon/*_cli.rb'
Layout/LineLength:
Max: 140 # RuboCop default 120
AllowHeredoc: true
AllowURI: true
IgnoreCopDirectives: true
AllowedPatterns:
# Allow comments to be long lines
- !ruby/regexp / \# .*$/
- !ruby/regexp /^\# .*$/
Exclude:
- lib/**/*cli*.rb
- db/*migrate/**/*
- db/seeds/**/*
Enabled: false
Metrics/MethodLength:
CountComments: false
CountAsOne: [array, heredoc]
Max: 25 # RuboCop default 10
Max: 65
Exclude:
- 'lib/mastodon/*_cli.rb'
AllowedMethods:
- account_link_to
- attempt_oembed
- body_with_limit
- build_crutches
- cached_filters_for
- calculate_scores
- check_webfinger!
- clean_feeds!
- collection_items
- collection_presenter
- copy_account_notes!
- deduplicate_accounts!
- deduplicate_conversations!
- deduplicate_local_accounts!
- deduplicate_statuses!
- deduplicate_tags!
- deduplicate_users!
- discover_endpoint!
- extract_extra_uris_with_indices
- extract_hashtags_with_indices
- extract_mentions_or_lists_with_indices
- filter_from_home?
- from_elasticsearch
- handle_explicit_update!
- handle_mark_as_sensitive!
- hsl_to_rgb
- import_bookmarks!
- import_domain_blocks!
- import_relationships!
- ldap_options
- matches_time_window?
- outbox_presenter
- pam_get_user
- parallelize_with_progress
- parse_and_transform
- patch_for_forwarding!
- populate_home
- post_process_style
- preload_cache_collection_target_statuses
- privatize_media_attachments!
- provides_callback_for
- publish_media_attachments!
- relevant_account_timestamp
- remotable_attachment
- rgb_to_hsl
- rss_status_content_format
- set_fetchable_attributes!
- setup_redis_env_url
- signed_request_actor
- to_preview_card_attributes
- upgrade_storage_filesystem
- upgrade_storage_s3
- user_settings_params
- hydrate
- cc
- self_destruct
Metrics/ModuleLength:
CountComments: false
Max: 200
CountAsOne: [array, heredoc]
Metrics/ParameterLists:
Max: 5 # RuboCop default 5
CountKeywordArgs: true # RuboCop default true
MaxOptionalParameters: 3 # RuboCop default 3
Exclude:
- app/models/concerns/account_interactions.rb
- app/services/activitypub/fetch_remote_account_service.rb
- app/services/activitypub/fetch_remote_actor_service.rb
Max: 5
CountKeywordArgs: true
Metrics/PerceivedComplexity:
Max: 16 # RuboCop default 8
AllowedMethods:
- attempt_oembed
- build_crutches
- calculate_scores
- deduplicate_users!
- discover_endpoint!
- filter_from_home?
- hydrate
- patch_for_forwarding!
- process_update
- remove_orphans
- update_media_attachments!
Max: 25
Naming/MemoizedInstanceVariableName:
Enabled: false
@ -425,6 +267,9 @@ Style/PercentLiteralDelimiters:
Style/PerlBackrefs:
AutoCorrect: false
Style/RedundantAssignment:
Enabled: false
Style/RedundantFetchBlock:
Enabled: true
@ -447,7 +292,7 @@ Style/RegexpLiteral:
Enabled: false
Style/RescueStandardError:
Enabled: true
Enabled: false
Style/SignalException:
Enabled: false
@ -466,14 +311,3 @@ Style/TrailingCommaInHashLiteral:
Style/UnpackFirst:
Enabled: false
RSpec/ScatteredSetup:
Enabled: false
RSpec/ImplicitExpect:
Enabled: false
RSpec/NamedSubject:
Enabled: false
RSpec/DescribeClass:
Enabled: false
RSpec/LetSetup:
Enabled: false

22
Aptfile
View file

@ -1,4 +1,26 @@
ffmpeg
libicu[0-9][0-9]
libicu-dev
libidn12
libidn-dev
libpq-dev
libxdamage1
libxfixes3
zlib1g-dev
libcairo2
libcroco3
libdatrie1
libgdk-pixbuf2.0-0
libgraphite2-3
libharfbuzz0b
libpango-1.0-0
libpangocairo-1.0-0
libpangoft2-1.0-0
libpixman-1-0
librsvg2-2
libthai-data
libthai0
libvpx[5-9]
libxcb-render0
libxcb-shm0
libxrender1

View file

@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: https://contributor-covenant.org
[version]: https://contributor-covenant.org/version/1/4/
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View file

@ -15,8 +15,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
WORKDIR /opt/mastodon
COPY Gemfile* package.json yarn.lock /opt/mastodon/
# hadolint ignore=DL3008
RUN apt-get update && \
RUN apt update && \
apt-get install -y --no-install-recommends build-essential \
ca-certificates \
git \
@ -51,12 +50,10 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ENV DEBIAN_FRONTEND="noninteractive" \
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
# Ignoreing these here since we don't want to pin any versions and the Debian image removes apt-get content after use
# hadolint ignore=DL3008,DL3009
RUN apt-get update && \
echo "Etc/UTC" > /etc/localtime && \
groupadd -g "${GID}" mastodon && \
useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
useradd -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
apt-get -y --no-install-recommends install whois \
wget \
procps \

17
Gemfile
View file

@ -19,7 +19,7 @@ gem 'pghero', '~> 2.8'
gem 'dotenv-rails', '~> 2.8'
gem 'aws-sdk-s3', '~> 1.117', require: false
gem 'fog-core', '<= 2.4.0'
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'kt-paperclip', '~> 7.1'
gem 'blurhash', '~> 0.1'
@ -67,7 +67,7 @@ gem 'ox', '~> 2.14'
gem 'parslet'
gem 'posix-spawn'
gem 'public_suffix', '~> 5.0'
gem 'pundit', '~> 2.3'
gem 'pundit', '~> 2.2'
gem 'premailer-rails'
gem 'rack-attack', '~> 6.6'
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
@ -79,7 +79,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 2.1'
gem 'ruby-progressbar', '~> 1.11'
gem 'sanitize', '~> 6.0'
gem 'scenic', '~> 1.7'
gem 'scenic', '~> 1.6'
gem 'sidekiq', '~> 6.5'
gem 'sidekiq-scheduler', '~> 4.0'
gem 'sidekiq-unique-jobs', '~> 7.1'
@ -107,10 +107,6 @@ group :development, :test do
gem 'pry-byebug', '~> 3.10'
gem 'pry-rails', '~> 0.3'
gem 'rspec-rails', '~> 5.1'
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false
gem 'rubocop', require: false
end
group :production, :test do
@ -121,14 +117,13 @@ group :test do
gem 'capybara', '~> 3.38'
gem 'climate_control', '~> 0.2'
gem 'faker', '~> 3.0'
gem 'json-schema', '~> 3.0'
gem 'microformats', '~> 4.4'
gem 'rack-test', '~> 2.0'
gem 'rails-controller-testing', '~> 1.0'
gem 'rspec_junit_formatter', '~> 0.6'
gem 'rspec-sidekiq', '~> 3.1'
gem 'simplecov', '~> 0.21', require: false
gem 'webmock', '~> 3.18'
gem 'rspec_junit_formatter', '~> 0.6'
gem 'rack-test', '~> 2.0'
end
group :development do
@ -140,6 +135,8 @@ group :development do
gem 'letter_opener', '~> 1.8'
gem 'letter_opener_web', '~> 2.0'
gem 'memory_profiler'
gem 'rubocop', '~> 1.30', require: false
gem 'rubocop-rails', '~> 2.15', require: false
gem 'brakeman', '~> 5.4', require: false
gem 'bundler-audit', '~> 0.9', require: false

View file

@ -226,7 +226,7 @@ GEM
erubi (1.11.0)
et-orbi (1.2.7)
tzinfo
excon (0.95.0)
excon (0.76.0)
fabrication (2.30.0)
faker (3.0.0)
i18n (>= 1.8.11, < 2)
@ -271,7 +271,7 @@ GEM
fog-core (>= 1.45, <= 2.1.0)
fog-json (>= 1.0)
ipaddress (>= 0.8)
formatador (0.3.0)
formatador (0.2.5)
fugit (1.7.1)
et-orbi (~> 1, >= 1.2.7)
raabro (~> 1.4)
@ -299,7 +299,7 @@ GEM
hiredis (0.6.3)
hkdf (0.3.0)
htmlentities (4.3.4)
http (5.1.1)
http (5.1.0)
addressable (~> 2.8)
http-cookie (~> 1.0)
http-form_data (~> 2.2)
@ -344,8 +344,6 @@ GEM
json-ld-preloaded (3.2.2)
json-ld (~> 3.2)
rdf (~> 3.2)
json-schema (3.0.0)
addressable (>= 2.8)
jsonapi-renderer (0.2.2)
jwt (2.4.1)
kaminari (1.2.2)
@ -486,7 +484,7 @@ GEM
public_suffix (5.0.1)
puma (5.6.5)
nio4r (~> 2.0)
pundit (2.3.0)
pundit (2.2.0)
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.6.1)
@ -587,27 +585,21 @@ GEM
rspec-support (3.11.1)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.39.0)
json (~> 2.3)
rubocop (1.30.1)
parallel (~> 1.10)
parser (>= 3.1.2.1)
parser (>= 3.1.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.23.0, < 2.0)
rubocop-ast (>= 1.18.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.23.0)
rubocop-ast (1.18.0)
parser (>= 3.1.1.0)
rubocop-performance (1.15.1)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
rubocop-rails (2.17.2)
rubocop-rails (2.15.0)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop-rspec (2.15.0)
rubocop (~> 1.33)
rubocop (>= 1.7.0, < 2.0)
ruby-progressbar (1.11.0)
ruby-saml (1.13.0)
nokogiri (>= 1.10.5)
@ -620,7 +612,7 @@ GEM
sanitize (6.0.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
scenic (1.7.0)
scenic (1.6.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
semantic_range (3.0.0)
@ -785,7 +777,7 @@ DEPENDENCIES
faker (~> 3.0)
fast_blank (~> 1.0)
fastimage
fog-core (<= 2.4.0)
fog-core (<= 2.1.0)
fog-openstack (~> 0.3)
fuubar (~> 2.5)
gitlab-omniauth-openid-connect (~> 0.10.0)
@ -799,7 +791,6 @@ DEPENDENCIES
idn-ruby
json-ld
json-ld-preloaded (~> 3.2)
json-schema (~> 3.0)
kaminari (~> 1.2)
kt-paperclip (~> 7.1)
letter_opener (~> 1.8)
@ -831,7 +822,7 @@ DEPENDENCIES
pry-rails (~> 0.3)
public_suffix (~> 5.0)
puma (~> 5.6)
pundit (~> 2.3)
pundit (~> 2.2)
rack (~> 2.2.4)
rack-attack (~> 6.6)
rack-cors (~> 1.1)
@ -849,13 +840,11 @@ DEPENDENCIES
rspec-rails (~> 5.1)
rspec-sidekiq (~> 3.1)
rspec_junit_formatter (~> 0.6)
rubocop
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop (~> 1.30)
rubocop-rails (~> 2.15)
ruby-progressbar (~> 1.11)
sanitize (~> 6.0)
scenic (~> 1.7)
scenic (~> 1.6)
sidekiq (~> 6.5)
sidekiq-bulk (~> 0.2.0)
sidekiq-scheduler (~> 4.0)
@ -877,9 +866,3 @@ DEPENDENCIES
webpacker (~> 5.4)
webpush!
xorcist (~> 1.1)
RUBY VERSION
ruby 3.0.4p208
BUNDLED WITH
2.2.33

View file

@ -73,7 +73,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
- **PostgreSQL** 9.5+
- **Redis** 4+
- **Ruby** 2.7+
- **Node.js** 16+
- **Node.js** 14+
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.

View file

@ -55,8 +55,12 @@ module Admin
def update
authorize :domain_block, :update?
if @domain_block.update(update_params)
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
@domain_block.update(update_params)
severity_changed = @domain_block.severity_changed?
if @domain_block.save
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
log_action :update, @domain_block
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
else

View file

@ -3,7 +3,7 @@
module Admin
class RelaysController < BaseController
before_action :set_relay, except: [:index, :new, :create]
before_action :warn_signatures_not_enabled!, only: [:new, :create, :enable]
before_action :require_signatures_enabled!, only: [:new, :create, :enable]
def index
authorize :relay, :update?
@ -56,8 +56,8 @@ module Admin
params.require(:relay).permit(:inbox_url)
end
def warn_signatures_not_enabled!
flash.now[:error] = I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
def require_signatures_enabled!
redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
end
end
end

View file

@ -16,26 +16,6 @@ class Api::BaseController < ApplicationController
protect_from_forgery with: :null_session
content_security_policy do |p|
# Set every directive that does not have a fallback
p.default_src :none
p.frame_ancestors :none
p.form_action :none
# Disable every directive with a fallback to cut on response size
p.base_uri false
p.font_src false
p.img_src false
p.style_src false
p.media_src false
p.frame_src false
p.manifest_src false
p.connect_src false
p.script_src false
p.child_src false
p.worker_src false
end
rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
render json: { error: e.to_s }, status: 422
end

View file

@ -40,8 +40,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
def update
authorize @domain_block, :update?
@domain_block.update!(domain_block_params)
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
@domain_block.update(domain_block_params)
severity_changed = @domain_block.severity_changed?
@domain_block.save!
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
log_action :update, @domain_block
render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
end

View file

@ -31,7 +31,7 @@ class Api::V1::NotificationsController < Api::BaseController
private
def load_notifications
notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_paginated_by_id(
notifications = browserable_account_notifications.includes(from_account: :account_stat).to_a_paginated_by_id(
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)

View file

@ -10,8 +10,6 @@ class Auth::PasswordsController < Devise::PasswordsController
super do |resource|
if resource.errors.empty?
resource.session_activations.destroy_all
resource.revoke_access!
end
end
end

View file

@ -56,8 +56,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
end
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up) do |user_params|
user_params.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password)
devise_parameter_sanitizer.permit(:sign_up) do |u|
u.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password)
end
end

View file

@ -58,7 +58,7 @@ module RateLimitHeaders
end
def api_throttle_data
most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_key, value| value[:limit] - value[:count] }
most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] - v[:count] }
request.env['rack.attack.throttle_data'][most_limited_type]
end

View file

@ -28,8 +28,8 @@ module SignatureVerification
end
class SignatureParamsTransformer < Parslet::Transform
rule(params: subtree(:param)) do
(param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value }
rule(params: subtree(:p)) do
(p.is_a?(Array) ? p : [p]).each_with_object({}) { |(key, val), h| h[key] = val }
end
rule(param: { key: simple(:key), value: simple(:val) }) do

View file

@ -63,7 +63,7 @@ class FollowerAccountsController < ApplicationController
id: account_followers_url(@account, page: params.fetch(:page, 1)),
type: :ordered,
size: @account.followers_count,
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.account) },
items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.account) },
part_of: account_followers_url(@account),
next: next_page_url,
prev: prev_page_url

View file

@ -66,7 +66,7 @@ class FollowingAccountsController < ApplicationController
id: account_following_index_url(@account, page: params.fetch(:page, 1)),
type: :ordered,
size: @account.following_count,
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.target_account) },
items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.target_account) },
part_of: account_following_index_url(@account),
next: next_page_url,
prev: prev_page_url

View file

@ -12,8 +12,8 @@ class MediaController < ApplicationController
before_action :check_playable, only: :player
before_action :allow_iframing, only: :player
content_security_policy only: :player do |policy|
policy.frame_ancestors(false)
content_security_policy only: :player do |p|
p.frame_ancestors(false)
end
def show

View file

@ -17,8 +17,8 @@ class StatusesController < ApplicationController
skip_around_action :set_locale, if: -> { request.format == :json }
skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
content_security_policy only: :embed do |policy|
policy.frame_ancestors(false)
content_security_policy only: :embed do |p|
p.frame_ancestors(false)
end
def show

View file

@ -65,7 +65,7 @@ class TagsController < ApplicationController
id: tag_url(@tag),
type: :ordered,
size: @tag.statuses.count,
items: @statuses.map { |status| ActivityPub::TagManager.instance.uri_for(status) }
items: @statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) }
)
end
end

View file

@ -23,28 +23,19 @@ module FormattingHelper
before_html = begin
if status.spoiler_text?
tag.p do
tag.strong do
I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
end
status.spoiler_text
end + tag.hr
"<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />"
else
''
end
end
end.html_safe # rubocop:disable Rails/OutputSafety
after_html = begin
if status.preloadable_poll
tag.p do
safe_join(
status.preloadable_poll.options.map do |o|
tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
end,
tag.br
)
end
"<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>"
else
''
end
end
end.html_safe # rubocop:disable Rails/OutputSafety
prerender_custom_emojis(
safe_join([before_html, html, after_html]),

View file

@ -190,15 +190,12 @@ module LanguagesHelper
ISO_639_3 = {
ast: ['Asturian', 'Asturianu'].freeze,
ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
cnr: ['Montenegrin', 'crnogorski'].freeze,
jbo: ['Lojban', 'la .lojban.'].freeze,
kab: ['Kabyle', 'Taqbaylit'].freeze,
kmr: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze,
ldn: ['Láadan', 'Láadan'].freeze,
lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze,
sco: ['Scots', 'Scots'].freeze,
sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
smj: ['Lule Sami', 'Julevsámegiella'].freeze,
tok: ['Toki Pona', 'toki pona'].freeze,
zba: ['Balaibalan', 'باليبلن'].freeze,
zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,

View file

@ -21,7 +21,7 @@ module StatusesHelper
def media_summary(status)
attachments = { image: 0, video: 0, audio: 0 }
status.ordered_media_attachments.each do |media|
status.media_attachments.each do |media|
if media.video?
attachments[:video] += 1
elsif media.audio?

View file

@ -1,2 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon" style="color:#fff" /></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -7,5 +7,5 @@
<stop stop-color="#6364FF"/>
<stop offset="1" stop-color="#563ACC"/>
</linearGradient>
</defs></symbol><use xlink:href="#logo-symbol-wordmark"/>
</defs></symbol><use xlink:href="#logo-symbol-wordmark" style="color:#fff"/>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -14,24 +14,24 @@ export function submitAccountNote(id, value) {
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

@ -91,7 +91,7 @@ export function fetchAccount(id) {
dispatch(fetchAccountFail(id, error));
});
};
}
};
export const lookupAccount = acct => (dispatch, getState) => {
dispatch(lookupAccountRequest(acct));
@ -126,13 +126,13 @@ export function fetchAccountRequest(id) {
type: ACCOUNT_FETCH_REQUEST,
id,
};
}
};
export function fetchAccountSuccess() {
return {
type: ACCOUNT_FETCH_SUCCESS,
};
}
};
export function fetchAccountFail(id, error) {
return {
@ -141,7 +141,7 @@ export function fetchAccountFail(id, error) {
error,
skipAlert: true,
};
}
};
export function followAccount(id, options = { reblogs: true }) {
return (dispatch, getState) => {
@ -156,7 +156,7 @@ export function followAccount(id, options = { reblogs: true }) {
dispatch(followAccountFail(error, locked));
});
};
}
};
export function unfollowAccount(id) {
return (dispatch, getState) => {
@ -168,7 +168,7 @@ export function unfollowAccount(id) {
dispatch(unfollowAccountFail(error));
});
};
}
};
export function followAccountRequest(id, locked) {
return {
@ -177,7 +177,7 @@ export function followAccountRequest(id, locked) {
locked,
skipLoading: true,
};
}
};
export function followAccountSuccess(relationship, alreadyFollowing) {
return {
@ -186,7 +186,7 @@ export function followAccountSuccess(relationship, alreadyFollowing) {
alreadyFollowing,
skipLoading: true,
};
}
};
export function followAccountFail(error, locked) {
return {
@ -195,7 +195,7 @@ export function followAccountFail(error, locked) {
locked,
skipLoading: true,
};
}
};
export function unfollowAccountRequest(id) {
return {
@ -203,7 +203,7 @@ export function unfollowAccountRequest(id) {
id,
skipLoading: true,
};
}
};
export function unfollowAccountSuccess(relationship, statuses) {
return {
@ -212,7 +212,7 @@ export function unfollowAccountSuccess(relationship, statuses) {
statuses,
skipLoading: true,
};
}
};
export function unfollowAccountFail(error) {
return {
@ -220,7 +220,7 @@ export function unfollowAccountFail(error) {
error,
skipLoading: true,
};
}
};
export function blockAccount(id) {
return (dispatch, getState) => {
@ -233,7 +233,7 @@ export function blockAccount(id) {
dispatch(blockAccountFail(id, error));
});
};
}
};
export function unblockAccount(id) {
return (dispatch, getState) => {
@ -245,14 +245,14 @@ export function unblockAccount(id) {
dispatch(unblockAccountFail(id, error));
});
};
}
};
export function blockAccountRequest(id) {
return {
type: ACCOUNT_BLOCK_REQUEST,
id,
};
}
};
export function blockAccountSuccess(relationship, statuses) {
return {
@ -260,35 +260,35 @@ export function blockAccountSuccess(relationship, statuses) {
relationship,
statuses,
};
}
};
export function blockAccountFail(error) {
return {
type: ACCOUNT_BLOCK_FAIL,
error,
};
}
};
export function unblockAccountRequest(id) {
return {
type: ACCOUNT_UNBLOCK_REQUEST,
id,
};
}
};
export function unblockAccountSuccess(relationship) {
return {
type: ACCOUNT_UNBLOCK_SUCCESS,
relationship,
};
}
};
export function unblockAccountFail(error) {
return {
type: ACCOUNT_UNBLOCK_FAIL,
error,
};
}
};
export function muteAccount(id, notifications, duration=0) {
@ -302,7 +302,7 @@ export function muteAccount(id, notifications, duration=0) {
dispatch(muteAccountFail(id, error));
});
};
}
};
export function unmuteAccount(id) {
return (dispatch, getState) => {
@ -314,14 +314,14 @@ export function unmuteAccount(id) {
dispatch(unmuteAccountFail(id, error));
});
};
}
};
export function muteAccountRequest(id) {
return {
type: ACCOUNT_MUTE_REQUEST,
id,
};
}
};
export function muteAccountSuccess(relationship, statuses) {
return {
@ -329,35 +329,35 @@ export function muteAccountSuccess(relationship, statuses) {
relationship,
statuses,
};
}
};
export function muteAccountFail(error) {
return {
type: ACCOUNT_MUTE_FAIL,
error,
};
}
};
export function unmuteAccountRequest(id) {
return {
type: ACCOUNT_UNMUTE_REQUEST,
id,
};
}
};
export function unmuteAccountSuccess(relationship) {
return {
type: ACCOUNT_UNMUTE_SUCCESS,
relationship,
};
}
};
export function unmuteAccountFail(error) {
return {
type: ACCOUNT_UNMUTE_FAIL,
error,
};
}
};
export function fetchFollowers(id) {
@ -374,14 +374,14 @@ export function fetchFollowers(id) {
dispatch(fetchFollowersFail(id, error));
});
};
}
};
export function fetchFollowersRequest(id) {
return {
type: FOLLOWERS_FETCH_REQUEST,
id,
};
}
};
export function fetchFollowersSuccess(id, accounts, next) {
return {
@ -390,7 +390,7 @@ export function fetchFollowersSuccess(id, accounts, next) {
accounts,
next,
};
}
};
export function fetchFollowersFail(id, error) {
return {
@ -399,7 +399,7 @@ export function fetchFollowersFail(id, error) {
error,
skipNotFound: true,
};
}
};
export function expandFollowers(id) {
return (dispatch, getState) => {
@ -421,14 +421,14 @@ export function expandFollowers(id) {
dispatch(expandFollowersFail(id, error));
});
};
}
};
export function expandFollowersRequest(id) {
return {
type: FOLLOWERS_EXPAND_REQUEST,
id,
};
}
};
export function expandFollowersSuccess(id, accounts, next) {
return {
@ -437,7 +437,7 @@ export function expandFollowersSuccess(id, accounts, next) {
accounts,
next,
};
}
};
export function expandFollowersFail(id, error) {
return {
@ -445,7 +445,7 @@ export function expandFollowersFail(id, error) {
id,
error,
};
}
};
export function fetchFollowing(id) {
return (dispatch, getState) => {
@ -461,14 +461,14 @@ export function fetchFollowing(id) {
dispatch(fetchFollowingFail(id, error));
});
};
}
};
export function fetchFollowingRequest(id) {
return {
type: FOLLOWING_FETCH_REQUEST,
id,
};
}
};
export function fetchFollowingSuccess(id, accounts, next) {
return {
@ -477,7 +477,7 @@ export function fetchFollowingSuccess(id, accounts, next) {
accounts,
next,
};
}
};
export function fetchFollowingFail(id, error) {
return {
@ -486,7 +486,7 @@ export function fetchFollowingFail(id, error) {
error,
skipNotFound: true,
};
}
};
export function expandFollowing(id) {
return (dispatch, getState) => {
@ -508,14 +508,14 @@ export function expandFollowing(id) {
dispatch(expandFollowingFail(id, error));
});
};
}
};
export function expandFollowingRequest(id) {
return {
type: FOLLOWING_EXPAND_REQUEST,
id,
};
}
};
export function expandFollowingSuccess(id, accounts, next) {
return {
@ -524,7 +524,7 @@ export function expandFollowingSuccess(id, accounts, next) {
accounts,
next,
};
}
};
export function expandFollowingFail(id, error) {
return {
@ -532,7 +532,7 @@ export function expandFollowingFail(id, error) {
id,
error,
};
}
};
export function fetchRelationships(accountIds) {
return (dispatch, getState) => {
@ -553,7 +553,7 @@ export function fetchRelationships(accountIds) {
dispatch(fetchRelationshipsFail(error));
});
};
}
};
export function fetchRelationshipsRequest(ids) {
return {
@ -561,7 +561,7 @@ export function fetchRelationshipsRequest(ids) {
ids,
skipLoading: true,
};
}
};
export function fetchRelationshipsSuccess(relationships) {
return {
@ -569,7 +569,7 @@ export function fetchRelationshipsSuccess(relationships) {
relationships,
skipLoading: true,
};
}
};
export function fetchRelationshipsFail(error) {
return {
@ -578,7 +578,7 @@ export function fetchRelationshipsFail(error) {
skipLoading: true,
skipNotFound: true,
};
}
};
export function fetchFollowRequests() {
return (dispatch, getState) => {
@ -590,13 +590,13 @@ export function fetchFollowRequests() {
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(fetchFollowRequestsFail(error)));
};
}
};
export function fetchFollowRequestsRequest() {
return {
type: FOLLOW_REQUESTS_FETCH_REQUEST,
};
}
};
export function fetchFollowRequestsSuccess(accounts, next) {
return {
@ -604,14 +604,14 @@ export function fetchFollowRequestsSuccess(accounts, next) {
accounts,
next,
};
}
};
export function fetchFollowRequestsFail(error) {
return {
type: FOLLOW_REQUESTS_FETCH_FAIL,
error,
};
}
};
export function expandFollowRequests() {
return (dispatch, getState) => {
@ -629,13 +629,13 @@ export function expandFollowRequests() {
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(expandFollowRequestsFail(error)));
};
}
};
export function expandFollowRequestsRequest() {
return {
type: FOLLOW_REQUESTS_EXPAND_REQUEST,
};
}
};
export function expandFollowRequestsSuccess(accounts, next) {
return {
@ -643,14 +643,14 @@ export function expandFollowRequestsSuccess(accounts, next) {
accounts,
next,
};
}
};
export function expandFollowRequestsFail(error) {
return {
type: FOLLOW_REQUESTS_EXPAND_FAIL,
error,
};
}
};
export function authorizeFollowRequest(id) {
return (dispatch, getState) => {
@ -661,21 +661,21 @@ export function authorizeFollowRequest(id) {
.then(() => dispatch(authorizeFollowRequestSuccess(id)))
.catch(error => dispatch(authorizeFollowRequestFail(id, error)));
};
}
};
export function authorizeFollowRequestRequest(id) {
return {
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
id,
};
}
};
export function authorizeFollowRequestSuccess(id) {
return {
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
id,
};
}
};
export function authorizeFollowRequestFail(id, error) {
return {
@ -683,7 +683,7 @@ export function authorizeFollowRequestFail(id, error) {
id,
error,
};
}
};
export function rejectFollowRequest(id) {
@ -695,21 +695,21 @@ export function rejectFollowRequest(id) {
.then(() => dispatch(rejectFollowRequestSuccess(id)))
.catch(error => dispatch(rejectFollowRequestFail(id, error)));
};
}
};
export function rejectFollowRequestRequest(id) {
return {
type: FOLLOW_REQUEST_REJECT_REQUEST,
id,
};
}
};
export function rejectFollowRequestSuccess(id) {
return {
type: FOLLOW_REQUEST_REJECT_SUCCESS,
id,
};
}
};
export function rejectFollowRequestFail(id, error) {
return {
@ -717,7 +717,7 @@ export function rejectFollowRequestFail(id, error) {
id,
error,
};
}
};
export function pinAccount(id) {
return (dispatch, getState) => {
@ -729,7 +729,7 @@ export function pinAccount(id) {
dispatch(pinAccountFail(error));
});
};
}
};
export function unpinAccount(id) {
return (dispatch, getState) => {
@ -741,49 +741,49 @@ export function unpinAccount(id) {
dispatch(unpinAccountFail(error));
});
};
}
};
export function pinAccountRequest(id) {
return {
type: ACCOUNT_PIN_REQUEST,
id,
};
}
};
export function pinAccountSuccess(relationship) {
return {
type: ACCOUNT_PIN_SUCCESS,
relationship,
};
}
};
export function pinAccountFail(error) {
return {
type: ACCOUNT_PIN_FAIL,
error,
};
}
};
export function unpinAccountRequest(id) {
return {
type: ACCOUNT_UNPIN_REQUEST,
id,
};
}
};
export function unpinAccountSuccess(relationship) {
return {
type: ACCOUNT_UNPIN_SUCCESS,
relationship,
};
}
};
export function unpinAccountFail(error) {
return {
type: ACCOUNT_UNPIN_FAIL,
error,
};
}
};
export const revealAccount = id => ({
type: ACCOUNT_REVEAL,

View file

@ -17,13 +17,13 @@ export function dismissAlert(alert) {
type: ALERT_DISMISS,
alert,
};
}
};
export function clearAlert() {
return {
type: ALERT_CLEAR,
};
}
};
export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
return {
@ -32,7 +32,7 @@ export function showAlert(title = messages.unexpectedTitle, message = messages.u
message,
message_values,
};
}
};
export function showAlertForError(error, skipNotFound = false) {
if (error.response) {

View file

@ -102,7 +102,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
dispatch(addReactionRequest(announcementId, name, alreadyAdded));
}
api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
}).catch(err => {
if (!alreadyAdded) {
@ -136,7 +136,7 @@ export const addReactionFail = (announcementId, name, error) => ({
export const removeReaction = (announcementId, name) => (dispatch, getState) => {
dispatch(removeReactionRequest(announcementId, name));
api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
dispatch(removeReactionSuccess(announcementId, name));
}).catch(err => {
dispatch(removeReactionFail(announcementId, name, err));

View file

@ -24,13 +24,13 @@ export function fetchBlocks() {
dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(fetchBlocksFail(error)));
};
}
};
export function fetchBlocksRequest() {
return {
type: BLOCKS_FETCH_REQUEST,
};
}
};
export function fetchBlocksSuccess(accounts, next) {
return {
@ -38,14 +38,14 @@ export function fetchBlocksSuccess(accounts, next) {
accounts,
next,
};
}
};
export function fetchBlocksFail(error) {
return {
type: BLOCKS_FETCH_FAIL,
error,
};
}
};
export function expandBlocks() {
return (dispatch, getState) => {
@ -64,13 +64,13 @@ export function expandBlocks() {
dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(expandBlocksFail(error)));
};
}
};
export function expandBlocksRequest() {
return {
type: BLOCKS_EXPAND_REQUEST,
};
}
};
export function expandBlocksSuccess(accounts, next) {
return {
@ -78,14 +78,14 @@ export function expandBlocksSuccess(accounts, next) {
accounts,
next,
};
}
};
export function expandBlocksFail(error) {
return {
type: BLOCKS_EXPAND_FAIL,
error,
};
}
};
export function initBlockModal(account) {
return dispatch => {

View file

@ -25,13 +25,13 @@ export function fetchBookmarkedStatuses() {
dispatch(fetchBookmarkedStatusesFail(error));
});
};
}
};
export function fetchBookmarkedStatusesRequest() {
return {
type: BOOKMARKED_STATUSES_FETCH_REQUEST,
};
}
};
export function fetchBookmarkedStatusesSuccess(statuses, next) {
return {
@ -39,14 +39,14 @@ export function fetchBookmarkedStatusesSuccess(statuses, next) {
statuses,
next,
};
}
};
export function fetchBookmarkedStatusesFail(error) {
return {
type: BOOKMARKED_STATUSES_FETCH_FAIL,
error,
};
}
};
export function expandBookmarkedStatuses() {
return (dispatch, getState) => {
@ -66,13 +66,13 @@ export function expandBookmarkedStatuses() {
dispatch(expandBookmarkedStatusesFail(error));
});
};
}
};
export function expandBookmarkedStatusesRequest() {
return {
type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
};
}
};
export function expandBookmarkedStatusesSuccess(statuses, next) {
return {
@ -80,11 +80,11 @@ export function expandBookmarkedStatusesSuccess(statuses, next) {
statuses,
next,
};
}
};
export function expandBookmarkedStatusesFail(error) {
return {
type: BOOKMARKED_STATUSES_EXPAND_FAIL,
error,
};
}
};

View file

@ -15,7 +15,7 @@ export function addColumn(id, params) {
dispatch(saveSettings());
};
}
};
export function removeColumn(uuid) {
return dispatch => {
@ -26,7 +26,7 @@ export function removeColumn(uuid) {
dispatch(saveSettings());
};
}
};
export function moveColumn(uuid, direction) {
return dispatch => {
@ -38,7 +38,7 @@ export function moveColumn(uuid, direction) {
dispatch(saveSettings());
};
}
};
export function changeColumnParams(uuid, path, value) {
return dispatch => {

View file

@ -94,14 +94,14 @@ export function setComposeToStatus(status, text, spoiler_text) {
text,
spoiler_text,
};
}
};
export function changeCompose(text) {
return {
type: COMPOSE_CHANGE,
text: text,
};
}
};
export function replyCompose(status, routerHistory) {
return (dispatch, getState) => {
@ -112,19 +112,19 @@ export function replyCompose(status, routerHistory) {
ensureComposeIsVisible(getState, routerHistory);
};
}
};
export function cancelReplyCompose() {
return {
type: COMPOSE_REPLY_CANCEL,
};
}
};
export function resetCompose() {
return {
type: COMPOSE_RESET,
};
}
};
export function mentionCompose(account, routerHistory) {
return (dispatch, getState) => {
@ -135,7 +135,7 @@ export function mentionCompose(account, routerHistory) {
ensureComposeIsVisible(getState, routerHistory);
};
}
};
export function directCompose(account, routerHistory) {
return (dispatch, getState) => {
@ -146,7 +146,7 @@ export function directCompose(account, routerHistory) {
ensureComposeIsVisible(getState, routerHistory);
};
}
};
export function submitCompose(routerHistory) {
return function (dispatch, getState) {
@ -211,27 +211,27 @@ export function submitCompose(routerHistory) {
dispatch(submitComposeFail(error));
});
};
}
};
export function submitComposeRequest() {
return {
type: COMPOSE_SUBMIT_REQUEST,
};
}
};
export function submitComposeSuccess(status) {
return {
type: COMPOSE_SUBMIT_SUCCESS,
status: status,
};
}
};
export function submitComposeFail(error) {
return {
type: COMPOSE_SUBMIT_FAIL,
error: error,
};
}
};
export function uploadCompose(files) {
return function (dispatch, getState) {
@ -294,9 +294,9 @@ export function uploadCompose(files) {
}
});
}).catch(error => dispatch(uploadComposeFail(error)));
}
};
};
}
};
export const uploadComposeProcessing = () => ({
type: COMPOSE_UPLOAD_PROCESSING,
@ -354,14 +354,14 @@ export function initMediaEditModal(id) {
dispatch(openModal('FOCAL_POINT', { id }));
};
}
};
export function onChangeMediaDescription(description) {
return {
type: COMPOSE_CHANGE_MEDIA_DESCRIPTION,
description,
};
}
};
export function onChangeMediaFocus(focusX, focusY) {
return {
@ -369,7 +369,7 @@ export function onChangeMediaFocus(focusX, focusY) {
focusX,
focusY,
};
}
};
export function changeUploadCompose(id, params) {
return (dispatch, getState) => {
@ -381,14 +381,14 @@ export function changeUploadCompose(id, params) {
dispatch(changeUploadComposeFail(id, error));
});
};
}
};
export function changeUploadComposeRequest() {
return {
type: COMPOSE_UPLOAD_CHANGE_REQUEST,
skipLoading: true,
};
}
};
export function changeUploadComposeSuccess(media) {
return {
@ -396,7 +396,7 @@ export function changeUploadComposeSuccess(media) {
media: media,
skipLoading: true,
};
}
};
export function changeUploadComposeFail(error) {
return {
@ -404,14 +404,14 @@ export function changeUploadComposeFail(error) {
error: error,
skipLoading: true,
};
}
};
export function uploadComposeRequest() {
return {
type: COMPOSE_UPLOAD_REQUEST,
skipLoading: true,
};
}
};
export function uploadComposeProgress(loaded, total) {
return {
@ -419,7 +419,7 @@ export function uploadComposeProgress(loaded, total) {
loaded: loaded,
total: total,
};
}
};
export function uploadComposeSuccess(media, file) {
return {
@ -428,7 +428,7 @@ export function uploadComposeSuccess(media, file) {
file: file,
skipLoading: true,
};
}
};
export function uploadComposeFail(error) {
return {
@ -436,14 +436,14 @@ export function uploadComposeFail(error) {
error: error,
skipLoading: true,
};
}
};
export function undoUploadCompose(media_id) {
return {
type: COMPOSE_UPLOAD_UNDO,
media_id: media_id,
};
}
};
export function clearComposeSuggestions() {
if (fetchComposeSuggestionsAccountsController) {
@ -452,7 +452,7 @@ export function clearComposeSuggestions() {
return {
type: COMPOSE_SUGGESTIONS_CLEAR,
};
}
};
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
if (fetchComposeSuggestionsAccountsController) {
@ -530,7 +530,7 @@ export function fetchComposeSuggestions(token) {
break;
}
};
}
};
export function readyComposeSuggestionsEmojis(token, emojis) {
return {
@ -538,7 +538,7 @@ export function readyComposeSuggestionsEmojis(token, emojis) {
token,
emojis,
};
}
};
export function readyComposeSuggestionsAccounts(token, accounts) {
return {
@ -546,7 +546,7 @@ export function readyComposeSuggestionsAccounts(token, accounts) {
token,
accounts,
};
}
};
export const readyComposeSuggestionsTags = (token, tags) => ({
type: COMPOSE_SUGGESTIONS_READY,
@ -591,7 +591,7 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
});
}
};
}
};
export function updateSuggestionTags(token) {
return {
@ -652,19 +652,19 @@ export function mountCompose() {
return {
type: COMPOSE_MOUNT,
};
}
};
export function unmountCompose() {
return {
type: COMPOSE_UNMOUNT,
};
}
};
export function changeComposeSensitivity() {
return {
type: COMPOSE_SENSITIVITY_CHANGE,
};
}
};
export const changeComposeLanguage = language => ({
type: COMPOSE_LANGUAGE_CHANGE,
@ -675,21 +675,21 @@ export function changeComposeSpoilerness() {
return {
type: COMPOSE_SPOILERNESS_CHANGE,
};
}
};
export function changeComposeSpoilerText(text) {
return {
type: COMPOSE_SPOILER_TEXT_CHANGE,
text,
};
}
};
export function changeComposeVisibility(value) {
return {
type: COMPOSE_VISIBILITY_CHANGE,
value,
};
}
};
export function insertEmojiCompose(position, emoji, needsSpace) {
return {
@ -698,33 +698,33 @@ export function insertEmojiCompose(position, emoji, needsSpace) {
emoji,
needsSpace,
};
}
};
export function changeComposing(value) {
return {
type: COMPOSE_COMPOSING_CHANGE,
value,
};
}
};
export function addPoll() {
return {
type: COMPOSE_POLL_ADD,
};
}
};
export function removePoll() {
return {
type: COMPOSE_POLL_REMOVE,
};
}
};
export function addPollOption(title) {
return {
type: COMPOSE_POLL_OPTION_ADD,
title,
};
}
};
export function changePollOption(index, title) {
return {
@ -732,14 +732,14 @@ export function changePollOption(index, title) {
index,
title,
};
}
};
export function removePollOption(index) {
return {
type: COMPOSE_POLL_OPTION_REMOVE,
index,
};
}
};
export function changePollSettings(expiresIn, isMultiple) {
return {
@ -747,4 +747,4 @@ export function changePollSettings(expiresIn, isMultiple) {
expiresIn,
isMultiple,
};
}
};

View file

@ -14,14 +14,14 @@ export function fetchCustomEmojis() {
dispatch(fetchCustomEmojisFail(error));
});
};
}
};
export function fetchCustomEmojisRequest() {
return {
type: CUSTOM_EMOJIS_FETCH_REQUEST,
skipLoading: true,
};
}
};
export function fetchCustomEmojisSuccess(custom_emojis) {
return {
@ -29,7 +29,7 @@ export function fetchCustomEmojisSuccess(custom_emojis) {
custom_emojis,
skipLoading: true,
};
}
};
export function fetchCustomEmojisFail(error) {
return {
@ -37,4 +37,4 @@ export function fetchCustomEmojisFail(error) {
error,
skipLoading: true,
};
}
};

View file

@ -29,14 +29,14 @@ export function blockDomain(domain) {
dispatch(blockDomainFail(domain, err));
});
};
}
};
export function blockDomainRequest(domain) {
return {
type: DOMAIN_BLOCK_REQUEST,
domain,
};
}
};
export function blockDomainSuccess(domain, accounts) {
return {
@ -44,7 +44,7 @@ export function blockDomainSuccess(domain, accounts) {
domain,
accounts,
};
}
};
export function blockDomainFail(domain, error) {
return {
@ -52,7 +52,7 @@ export function blockDomainFail(domain, error) {
domain,
error,
};
}
};
export function unblockDomain(domain) {
return (dispatch, getState) => {
@ -66,14 +66,14 @@ export function unblockDomain(domain) {
dispatch(unblockDomainFail(domain, err));
});
};
}
};
export function unblockDomainRequest(domain) {
return {
type: DOMAIN_UNBLOCK_REQUEST,
domain,
};
}
};
export function unblockDomainSuccess(domain, accounts) {
return {
@ -81,7 +81,7 @@ export function unblockDomainSuccess(domain, accounts) {
domain,
accounts,
};
}
};
export function unblockDomainFail(domain, error) {
return {
@ -89,7 +89,7 @@ export function unblockDomainFail(domain, error) {
domain,
error,
};
}
};
export function fetchDomainBlocks() {
return (dispatch, getState) => {
@ -102,13 +102,13 @@ export function fetchDomainBlocks() {
dispatch(fetchDomainBlocksFail(err));
});
};
}
};
export function fetchDomainBlocksRequest() {
return {
type: DOMAIN_BLOCKS_FETCH_REQUEST,
};
}
};
export function fetchDomainBlocksSuccess(domains, next) {
return {
@ -116,14 +116,14 @@ export function fetchDomainBlocksSuccess(domains, next) {
domains,
next,
};
}
};
export function fetchDomainBlocksFail(error) {
return {
type: DOMAIN_BLOCKS_FETCH_FAIL,
error,
};
}
};
export function expandDomainBlocks() {
return (dispatch, getState) => {
@ -142,13 +142,13 @@ export function expandDomainBlocks() {
dispatch(expandDomainBlocksFail(err));
});
};
}
};
export function expandDomainBlocksRequest() {
return {
type: DOMAIN_BLOCKS_EXPAND_REQUEST,
};
}
};
export function expandDomainBlocksSuccess(domains, next) {
return {
@ -156,11 +156,11 @@ export function expandDomainBlocksSuccess(domains, next) {
domains,
next,
};
}
};
export function expandDomainBlocksFail(error) {
return {
type: DOMAIN_BLOCKS_EXPAND_FAIL,
error,
};
}
};

View file

@ -11,4 +11,4 @@ export function useEmoji(emoji) {
dispatch(saveSettings());
};
}
};

View file

@ -25,14 +25,14 @@ export function fetchFavouritedStatuses() {
dispatch(fetchFavouritedStatusesFail(error));
});
};
}
};
export function fetchFavouritedStatusesRequest() {
return {
type: FAVOURITED_STATUSES_FETCH_REQUEST,
skipLoading: true,
};
}
};
export function fetchFavouritedStatusesSuccess(statuses, next) {
return {
@ -41,7 +41,7 @@ export function fetchFavouritedStatusesSuccess(statuses, next) {
next,
skipLoading: true,
};
}
};
export function fetchFavouritedStatusesFail(error) {
return {
@ -49,7 +49,7 @@ export function fetchFavouritedStatusesFail(error) {
error,
skipLoading: true,
};
}
};
export function expandFavouritedStatuses() {
return (dispatch, getState) => {
@ -69,13 +69,13 @@ export function expandFavouritedStatuses() {
dispatch(expandFavouritedStatusesFail(error));
});
};
}
};
export function expandFavouritedStatusesRequest() {
return {
type: FAVOURITED_STATUSES_EXPAND_REQUEST,
};
}
};
export function expandFavouritedStatusesSuccess(statuses, next) {
return {
@ -83,11 +83,11 @@ export function expandFavouritedStatusesSuccess(statuses, next) {
statuses,
next,
};
}
};
export function expandFavouritedStatusesFail(error) {
return {
type: FAVOURITED_STATUSES_EXPAND_FAIL,
error,
};
}
};

View file

@ -8,10 +8,10 @@ export function setHeight (key, id, height) {
id,
height,
};
}
};
export function clearHeight () {
return {
type: HEIGHT_CACHE_CLEAR,
};
}
};

View file

@ -54,7 +54,7 @@ export function reblog(status, visibility) {
dispatch(reblogFail(status, error));
});
};
}
};
export function unreblog(status) {
return (dispatch, getState) => {
@ -67,7 +67,7 @@ export function unreblog(status) {
dispatch(unreblogFail(status, error));
});
};
}
};
export function reblogRequest(status) {
return {
@ -75,7 +75,7 @@ export function reblogRequest(status) {
status: status,
skipLoading: true,
};
}
};
export function reblogSuccess(status) {
return {
@ -83,7 +83,7 @@ export function reblogSuccess(status) {
status: status,
skipLoading: true,
};
}
};
export function reblogFail(status, error) {
return {
@ -92,7 +92,7 @@ export function reblogFail(status, error) {
error: error,
skipLoading: true,
};
}
};
export function unreblogRequest(status) {
return {
@ -100,7 +100,7 @@ export function unreblogRequest(status) {
status: status,
skipLoading: true,
};
}
};
export function unreblogSuccess(status) {
return {
@ -108,7 +108,7 @@ export function unreblogSuccess(status) {
status: status,
skipLoading: true,
};
}
};
export function unreblogFail(status, error) {
return {
@ -117,7 +117,7 @@ export function unreblogFail(status, error) {
error: error,
skipLoading: true,
};
}
};
export function favourite(status) {
return function (dispatch, getState) {
@ -130,7 +130,7 @@ export function favourite(status) {
dispatch(favouriteFail(status, error));
});
};
}
};
export function unfavourite(status) {
return (dispatch, getState) => {
@ -143,7 +143,7 @@ export function unfavourite(status) {
dispatch(unfavouriteFail(status, error));
});
};
}
};
export function favouriteRequest(status) {
return {
@ -151,7 +151,7 @@ export function favouriteRequest(status) {
status: status,
skipLoading: true,
};
}
};
export function favouriteSuccess(status) {
return {
@ -159,7 +159,7 @@ export function favouriteSuccess(status) {
status: status,
skipLoading: true,
};
}
};
export function favouriteFail(status, error) {
return {
@ -168,7 +168,7 @@ export function favouriteFail(status, error) {
error: error,
skipLoading: true,
};
}
};
export function unfavouriteRequest(status) {
return {
@ -176,7 +176,7 @@ export function unfavouriteRequest(status) {
status: status,
skipLoading: true,
};
}
};
export function unfavouriteSuccess(status) {
return {
@ -184,7 +184,7 @@ export function unfavouriteSuccess(status) {
status: status,
skipLoading: true,
};
}
};
export function unfavouriteFail(status, error) {
return {
@ -193,7 +193,7 @@ export function unfavouriteFail(status, error) {
error: error,
skipLoading: true,
};
}
};
export function bookmark(status) {
return function (dispatch, getState) {
@ -206,7 +206,7 @@ export function bookmark(status) {
dispatch(bookmarkFail(status, error));
});
};
}
};
export function unbookmark(status) {
return (dispatch, getState) => {
@ -219,14 +219,14 @@ export function unbookmark(status) {
dispatch(unbookmarkFail(status, error));
});
};
}
};
export function bookmarkRequest(status) {
return {
type: BOOKMARK_REQUEST,
status: status,
};
}
};
export function bookmarkSuccess(status, response) {
return {
@ -234,7 +234,7 @@ export function bookmarkSuccess(status, response) {
status: status,
response: response,
};
}
};
export function bookmarkFail(status, error) {
return {
@ -242,14 +242,14 @@ export function bookmarkFail(status, error) {
status: status,
error: error,
};
}
};
export function unbookmarkRequest(status) {
return {
type: UNBOOKMARK_REQUEST,
status: status,
};
}
};
export function unbookmarkSuccess(status, response) {
return {
@ -257,7 +257,7 @@ export function unbookmarkSuccess(status, response) {
status: status,
response: response,
};
}
};
export function unbookmarkFail(status, error) {
return {
@ -265,7 +265,7 @@ export function unbookmarkFail(status, error) {
status: status,
error: error,
};
}
};
export function fetchReblogs(id) {
return (dispatch, getState) => {
@ -278,14 +278,14 @@ export function fetchReblogs(id) {
dispatch(fetchReblogsFail(id, error));
});
};
}
};
export function fetchReblogsRequest(id) {
return {
type: REBLOGS_FETCH_REQUEST,
id,
};
}
};
export function fetchReblogsSuccess(id, accounts) {
return {
@ -293,14 +293,14 @@ export function fetchReblogsSuccess(id, accounts) {
id,
accounts,
};
}
};
export function fetchReblogsFail(id, error) {
return {
type: REBLOGS_FETCH_FAIL,
error,
};
}
};
export function fetchFavourites(id) {
return (dispatch, getState) => {
@ -313,14 +313,14 @@ export function fetchFavourites(id) {
dispatch(fetchFavouritesFail(id, error));
});
};
}
};
export function fetchFavouritesRequest(id) {
return {
type: FAVOURITES_FETCH_REQUEST,
id,
};
}
};
export function fetchFavouritesSuccess(id, accounts) {
return {
@ -328,14 +328,14 @@ export function fetchFavouritesSuccess(id, accounts) {
id,
accounts,
};
}
};
export function fetchFavouritesFail(id, error) {
return {
type: FAVOURITES_FETCH_FAIL,
error,
};
}
};
export function pin(status) {
return (dispatch, getState) => {
@ -348,7 +348,7 @@ export function pin(status) {
dispatch(pinFail(status, error));
});
};
}
};
export function pinRequest(status) {
return {
@ -356,7 +356,7 @@ export function pinRequest(status) {
status,
skipLoading: true,
};
}
};
export function pinSuccess(status) {
return {
@ -364,7 +364,7 @@ export function pinSuccess(status) {
status,
skipLoading: true,
};
}
};
export function pinFail(status, error) {
return {
@ -373,7 +373,7 @@ export function pinFail(status, error) {
error,
skipLoading: true,
};
}
};
export function unpin (status) {
return (dispatch, getState) => {
@ -386,7 +386,7 @@ export function unpin (status) {
dispatch(unpinFail(status, error));
});
};
}
};
export function unpinRequest(status) {
return {
@ -394,7 +394,7 @@ export function unpinRequest(status) {
status,
skipLoading: true,
};
}
};
export function unpinSuccess(status) {
return {
@ -402,7 +402,7 @@ export function unpinSuccess(status) {
status,
skipLoading: true,
};
}
};
export function unpinFail(status, error) {
return {
@ -411,4 +411,4 @@ export function unpinFail(status, error) {
error,
skipLoading: true,
};
}
};

View file

@ -101,7 +101,7 @@ export function submitMarkersSuccess({ home, notifications }) {
home: (home || {}).last_read_id,
notifications: (notifications || {}).last_read_id,
};
}
};
export function submitMarkers(params = {}) {
const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
@ -111,7 +111,7 @@ export function submitMarkers(params = {}) {
}
return result;
}
};
export const fetchMarkers = () => (dispatch, getState) => {
const params = { timeline: ['notifications'] };
@ -130,7 +130,7 @@ export function fetchMarkersRequest() {
type: MARKERS_FETCH_REQUEST,
skipLoading: true,
};
}
};
export function fetchMarkersSuccess(markers) {
return {
@ -138,7 +138,7 @@ export function fetchMarkersSuccess(markers) {
markers,
skipLoading: true,
};
}
};
export function fetchMarkersFail(error) {
return {
@ -147,4 +147,4 @@ export function fetchMarkersFail(error) {
skipLoading: true,
skipAlert: true,
};
}
};

View file

@ -7,7 +7,7 @@ export function openModal(type, props) {
modalType: type,
modalProps: props,
};
}
};
export function closeModal(type, options = { ignoreFocus: false }) {
return {
@ -15,4 +15,4 @@ export function closeModal(type, options = { ignoreFocus: false }) {
modalType: type,
ignoreFocus: options.ignoreFocus,
};
}
};

View file

@ -26,13 +26,13 @@ export function fetchMutes() {
dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(fetchMutesFail(error)));
};
}
};
export function fetchMutesRequest() {
return {
type: MUTES_FETCH_REQUEST,
};
}
};
export function fetchMutesSuccess(accounts, next) {
return {
@ -40,14 +40,14 @@ export function fetchMutesSuccess(accounts, next) {
accounts,
next,
};
}
};
export function fetchMutesFail(error) {
return {
type: MUTES_FETCH_FAIL,
error,
};
}
};
export function expandMutes() {
return (dispatch, getState) => {
@ -66,13 +66,13 @@ export function expandMutes() {
dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(expandMutesFail(error)));
};
}
};
export function expandMutesRequest() {
return {
type: MUTES_EXPAND_REQUEST,
};
}
};
export function expandMutesSuccess(accounts, next) {
return {
@ -80,14 +80,14 @@ export function expandMutesSuccess(accounts, next) {
accounts,
next,
};
}
};
export function expandMutesFail(error) {
return {
type: MUTES_EXPAND_FAIL,
error,
};
}
};
export function initMuteModal(account) {
return dispatch => {

View file

@ -118,7 +118,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
});
}
};
}
};
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
@ -197,14 +197,14 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) {
done();
});
};
}
};
export function expandNotificationsRequest(isLoadingMore) {
return {
type: NOTIFICATIONS_EXPAND_REQUEST,
skipLoading: !isLoadingMore,
};
}
};
export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
return {
@ -215,7 +215,7 @@ export function expandNotificationsSuccess(notifications, next, isLoadingMore, i
usePendingItems,
skipLoading: !isLoadingMore,
};
}
};
export function expandNotificationsFail(error, isLoadingMore) {
return {
@ -224,7 +224,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
skipLoading: !isLoadingMore,
skipAlert: !isLoadingMore || error.name === 'AbortError',
};
}
};
export function clearNotifications() {
return (dispatch, getState) => {
@ -234,14 +234,14 @@ export function clearNotifications() {
api(getState).post('/api/v1/notifications/clear');
};
}
};
export function scrollTopNotifications(top) {
return {
type: NOTIFICATIONS_SCROLL_TOP,
top,
};
}
};
export function setFilter (filterType) {
return dispatch => {
@ -253,7 +253,7 @@ export function setFilter (filterType) {
dispatch(expandNotifications({ forceLoad: true }));
dispatch(saveSettings());
};
}
};
export const mountNotifications = () => ({
type: NOTIFICATIONS_MOUNT,
@ -291,7 +291,7 @@ export function requestBrowserPermission(callback = noOp) {
callback(permission);
});
};
}
};
export function setBrowserSupport (value) {
return {

View file

@ -18,13 +18,13 @@ export function fetchPinnedStatuses() {
dispatch(fetchPinnedStatusesFail(error));
});
};
}
};
export function fetchPinnedStatusesRequest() {
return {
type: PINNED_STATUSES_FETCH_REQUEST,
};
}
};
export function fetchPinnedStatusesSuccess(statuses, next) {
return {
@ -32,11 +32,11 @@ export function fetchPinnedStatusesSuccess(statuses, next) {
statuses,
next,
};
}
};
export function fetchPinnedStatusesFail(error) {
return {
type: PINNED_STATUSES_FETCH_FAIL,
error,
};
}
};

View file

@ -19,13 +19,13 @@ export function changeSearch(value) {
type: SEARCH_CHANGE,
value,
};
}
};
export function clearSearch() {
return {
type: SEARCH_CLEAR,
};
}
};
export function submitSearch() {
return (dispatch, getState) => {
@ -60,13 +60,13 @@ export function submitSearch() {
dispatch(fetchSearchFail(error));
});
};
}
};
export function fetchSearchRequest() {
return {
type: SEARCH_FETCH_REQUEST,
};
}
};
export function fetchSearchSuccess(results, searchTerm) {
return {
@ -74,14 +74,14 @@ export function fetchSearchSuccess(results, searchTerm) {
results,
searchTerm,
};
}
};
export function fetchSearchFail(error) {
return {
type: SEARCH_FETCH_FAIL,
error,
};
}
};
export const expandSearch = type => (dispatch, getState) => {
const value = getState().getIn(['search', 'value']);

View file

@ -15,7 +15,7 @@ export function changeSetting(path, value) {
dispatch(saveSettings());
};
}
};
const debouncedSave = debounce((dispatch, getState) => {
if (getState().getIn(['settings', 'saved'])) {
@ -31,4 +31,4 @@ const debouncedSave = debounce((dispatch, getState) => {
export function saveSettings() {
return (dispatch, getState) => debouncedSave(dispatch, getState);
}
};

View file

@ -45,7 +45,7 @@ export function fetchStatusRequest(id, skipLoading) {
id,
skipLoading,
};
}
};
export function fetchStatus(id, forceFetch = false) {
return (dispatch, getState) => {
@ -66,14 +66,14 @@ export function fetchStatus(id, forceFetch = false) {
dispatch(fetchStatusFail(id, error, skipLoading));
});
};
}
};
export function fetchStatusSuccess(skipLoading) {
return {
type: STATUS_FETCH_SUCCESS,
skipLoading,
};
}
};
export function fetchStatusFail(id, error, skipLoading) {
return {
@ -83,7 +83,7 @@ export function fetchStatusFail(id, error, skipLoading) {
skipLoading,
skipAlert: true,
};
}
};
export function redraft(status, raw_text) {
return {
@ -91,7 +91,7 @@ export function redraft(status, raw_text) {
status,
raw_text,
};
}
};
export const editStatus = (id, routerHistory) => (dispatch, getState) => {
let status = getState().getIn(['statuses', id]);
@ -147,21 +147,21 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
dispatch(deleteStatusFail(id, error));
});
};
}
};
export function deleteStatusRequest(id) {
return {
type: STATUS_DELETE_REQUEST,
id: id,
};
}
};
export function deleteStatusSuccess(id) {
return {
type: STATUS_DELETE_SUCCESS,
id: id,
};
}
};
export function deleteStatusFail(id, error) {
return {
@ -169,7 +169,7 @@ export function deleteStatusFail(id, error) {
id: id,
error: error,
};
}
};
export const updateStatus = status => dispatch =>
dispatch(importFetchedStatus(status));
@ -190,14 +190,14 @@ export function fetchContext(id) {
dispatch(fetchContextFail(id, error));
});
};
}
};
export function fetchContextRequest(id) {
return {
type: CONTEXT_FETCH_REQUEST,
id,
};
}
};
export function fetchContextSuccess(id, ancestors, descendants) {
return {
@ -207,7 +207,7 @@ export function fetchContextSuccess(id, ancestors, descendants) {
descendants,
statuses: ancestors.concat(descendants),
};
}
};
export function fetchContextFail(id, error) {
return {
@ -216,7 +216,7 @@ export function fetchContextFail(id, error) {
error,
skipAlert: true,
};
}
};
export function muteStatus(id) {
return (dispatch, getState) => {
@ -228,21 +228,21 @@ export function muteStatus(id) {
dispatch(muteStatusFail(id, error));
});
};
}
};
export function muteStatusRequest(id) {
return {
type: STATUS_MUTE_REQUEST,
id,
};
}
};
export function muteStatusSuccess(id) {
return {
type: STATUS_MUTE_SUCCESS,
id,
};
}
};
export function muteStatusFail(id, error) {
return {
@ -250,7 +250,7 @@ export function muteStatusFail(id, error) {
id,
error,
};
}
};
export function unmuteStatus(id) {
return (dispatch, getState) => {
@ -262,21 +262,21 @@ export function unmuteStatus(id) {
dispatch(unmuteStatusFail(id, error));
});
};
}
};
export function unmuteStatusRequest(id) {
return {
type: STATUS_UNMUTE_REQUEST,
id,
};
}
};
export function unmuteStatusSuccess(id) {
return {
type: STATUS_UNMUTE_SUCCESS,
id,
};
}
};
export function unmuteStatusFail(id, error) {
return {
@ -284,7 +284,7 @@ export function unmuteStatusFail(id, error) {
id,
error,
};
}
};
export function hideStatus(ids) {
if (!Array.isArray(ids)) {
@ -295,7 +295,7 @@ export function hideStatus(ids) {
type: STATUS_HIDE,
ids,
};
}
};
export function revealStatus(ids) {
if (!Array.isArray(ids)) {
@ -306,7 +306,7 @@ export function revealStatus(ids) {
type: STATUS_REVEAL,
ids,
};
}
};
export function toggleStatusCollapse(id, isCollapsed) {
return {
@ -314,7 +314,7 @@ export function toggleStatusCollapse(id, isCollapsed) {
id,
isCollapsed,
};
}
};
export const translateStatus = id => (dispatch, getState) => {
dispatch(translateStatusRequest(id));

View file

@ -21,4 +21,4 @@ export function hydrateStore(rawState) {
dispatch(hydrateCompose());
dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
};
}
};

View file

@ -21,14 +21,14 @@ export function fetchSuggestions(withRelationships = false) {
}
}).catch(error => dispatch(fetchSuggestionsFail(error)));
};
}
};
export function fetchSuggestionsRequest() {
return {
type: SUGGESTIONS_FETCH_REQUEST,
skipLoading: true,
};
}
};
export function fetchSuggestionsSuccess(suggestions) {
return {
@ -36,7 +36,7 @@ export function fetchSuggestionsSuccess(suggestions) {
suggestions,
skipLoading: true,
};
}
};
export function fetchSuggestionsFail(error) {
return {
@ -45,7 +45,7 @@ export function fetchSuggestionsFail(error) {
skipLoading: true,
skipAlert: true,
};
}
};
export const dismissSuggestion = accountId => (dispatch, getState) => {
dispatch({

View file

@ -51,7 +51,7 @@ export function updateTimeline(timeline, status, accept) {
dispatch(submitMarkers());
}
};
}
};
export function deleteFromTimelines(id) {
return (dispatch, getState) => {
@ -67,13 +67,13 @@ export function deleteFromTimelines(id) {
reblogOf,
});
};
}
};
export function clearTimeline(timeline) {
return (dispatch) => {
dispatch({ type: TIMELINE_CLEAR, timeline });
};
}
};
const noOp = () => {};
@ -122,7 +122,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
done();
});
};
}
};
export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
return (dispatch, getState) => {
@ -168,7 +168,7 @@ export function expandTimelineRequest(timeline, isLoadingMore) {
timeline,
skipLoading: !isLoadingMore,
};
}
};
export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) {
return {
@ -181,7 +181,7 @@ export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadi
usePendingItems,
skipLoading: !isLoadingMore,
};
}
};
export function expandTimelineFail(timeline, error, isLoadingMore) {
return {
@ -191,7 +191,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) {
skipLoading: !isLoadingMore,
skipNotFound: timeline.startsWith('account:'),
};
}
};
export function scrollTopTimeline(timeline, top) {
return {
@ -199,7 +199,7 @@ export function scrollTopTimeline(timeline, top) {
timeline,
top,
};
}
};
export function connectTimeline(timeline) {
return {
@ -207,7 +207,7 @@ export function connectTimeline(timeline) {
timeline,
usePendingItems: preferPendingItems,
};
}
};
export const disconnectTimeline = timeline => ({
type: TIMELINE_DISCONNECT,

View file

@ -9,4 +9,4 @@ export function start() {
} catch (e) {
// If called twice
}
}
};

View file

@ -8,4 +8,4 @@ export default function compareId (id1, id2) {
} else {
return id1.length > id2.length ? 1 : -1;
}
}
};

View file

@ -137,7 +137,7 @@ export default class Retention extends React.PureComponent {
break;
default:
title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />;
}
};
return (
<div className='retention'>

View file

@ -246,13 +246,12 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
if (publicStatus && isRemote) {
menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
}
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
if (publicStatus) {
if (isRemote) {
menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
}
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
}

View file

@ -23,9 +23,7 @@ export const store = configureStore();
const hydrateAction = hydrateStore(initialState);
store.dispatch(hydrateAction);
if (initialState.meta.me) {
store.dispatch(fetchCustomEmojis());
}
store.dispatch(fetchCustomEmojis());
const createIdentityContext = state => ({
signedIn: !!state.meta.me,

View file

@ -1,37 +0,0 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Icon from 'mastodon/components/icon';
export default class FollowRequestNote extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.map.isRequired,
};
render () {
const { account, onAuthorize, onReject } = this.props;
return (
<div className='follow-request-banner'>
<div className='follow-request-banner__message'>
<FormattedMessage id='account.requested_follow' defaultMessage='{name} has requested to follow you' values={{ name: <bdi><strong dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi> }} />
</div>
<div className='follow-request-banner__action'>
<button type='button' className='button button-tertiary button--confirmation' onClick={onAuthorize}>
<Icon id='check' fixedWidth />
<FormattedMessage id='follow_request.authorize' defaultMessage='Authorize' />
</button>
<button type='button' className='button button-tertiary button--destructive' onClick={onReject}>
<Icon id='times' fixedWidth />
<FormattedMessage id='follow_request.reject' defaultMessage='Reject' />
</button>
</div>
</div>
);
}
}

View file

@ -14,7 +14,6 @@ import ShortNumber from 'mastodon/components/short_number';
import { NavLink } from 'react-router-dom';
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
import AccountNoteContainer from '../containers/account_note_container';
import FollowRequestNoteContainer from '../containers/follow_request_note_container';
import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';
import { Helmet } from 'react-helmet';
@ -312,8 +311,6 @@ class Header extends ImmutablePureComponent {
return (
<div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
{!(suspended || hidden || account.get('moved')) && account.getIn(['relationship', 'requested_by']) && <FollowRequestNoteContainer account={account} />}
<div className='account__header__image'>
<div className='account__header__info'>
{!suspended && info}

View file

@ -1,15 +0,0 @@
import { connect } from 'react-redux';
import FollowRequestNote from '../components/follow_request_note';
import { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';
const mapDispatchToProps = (dispatch, { account }) => ({
onAuthorize () {
dispatch(authorizeFollowRequest(account.get('id')));
},
onReject () {
dispatch(rejectFollowRequest(account.get('id')));
},
});
export default connect(null, mapDispatchToProps)(FollowRequestNote);

View file

@ -104,7 +104,6 @@ export default class MediaItem extends ImmutablePureComponent {
<video
className='media-gallery__item-gifv-thumbnail'
aria-label={attachment.get('description')}
title={attachment.get('description')}
role='application'
src={attachment.get('url')}
onMouseEnter={this.handleMouseEnter}

View file

@ -72,4 +72,4 @@ class ClosedRegistrationsModal extends ImmutablePureComponent {
);
}
}
};

View file

@ -16,6 +16,7 @@ import PollFormContainer from '../containers/poll_form_container';
import UploadFormContainer from '../containers/upload_form_container';
import WarningContainer from '../containers/warning_container';
import LanguageDropdown from '../containers/language_dropdown_container';
import { isMobile } from '../../../is_mobile';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { length } from 'stringz';
import { countableText } from '../util/counter';
@ -60,14 +61,14 @@ class ComposeForm extends ImmutablePureComponent {
onChangeSpoilerText: PropTypes.func.isRequired,
onPaste: PropTypes.func.isRequired,
onPickEmoji: PropTypes.func.isRequired,
autoFocus: PropTypes.bool,
showSearch: PropTypes.bool,
anyMedia: PropTypes.bool,
isInReply: PropTypes.bool,
singleColumn: PropTypes.bool,
};
static defaultProps = {
autoFocus: false,
showSearch: false,
};
handleChange = (e) => {
@ -153,7 +154,7 @@ class ComposeForm extends ImmutablePureComponent {
// - Replying to zero or one users, places the cursor at the end of the textbox.
// - Replying to more than one user, selects any usernames past the first;
// this provides a convenient shortcut to drop everyone else from the conversation.
if (this.props.focusDate && this.props.focusDate !== prevProps.focusDate) {
if (this.props.focusDate !== prevProps.focusDate) {
let selectionEnd, selectionStart;
if (this.props.preselectDate !== prevProps.preselectDate && this.props.isInReply) {
@ -179,7 +180,7 @@ class ComposeForm extends ImmutablePureComponent {
} else if (this.props.spoiler !== prevProps.spoiler) {
if (this.props.spoiler) {
this.spoilerText.input.focus();
} else if (prevProps.spoiler) {
} else {
this.autosuggestTextarea.textarea.focus();
}
}
@ -206,7 +207,7 @@ class ComposeForm extends ImmutablePureComponent {
}
render () {
const { intl, onPaste, autoFocus } = this.props;
const { intl, onPaste, showSearch } = this.props;
const disabled = this.props.isSubmitting;
let publishText = '';
@ -256,7 +257,7 @@ class ComposeForm extends ImmutablePureComponent {
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
onSuggestionSelected={this.onSuggestionSelected}
onPaste={onPaste}
autoFocus={autoFocus}
autoFocus={!showSearch && !isMobile(window.innerWidth)}
>
<EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />

View file

@ -165,7 +165,6 @@ class PollForm extends ImmutablePureComponent {
<option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>
<option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>
<option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>
<option value={43200}>{intl.formatMessage(messages.hours, { number: 12 })}</option>
<option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>
<option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>
<option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>

View file

@ -123,24 +123,27 @@ class Search extends React.PureComponent {
return (
<div className='search'>
<input
ref={this.setRef}
className='search__input'
type='text'
placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
aria-label={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
value={value}
onChange={this.handleChange}
onKeyUp={this.handleKeyUp}
onFocus={this.handleFocus}
onBlur={this.handleBlur}
/>
<label>
<span style={{ display: 'none' }}>{intl.formatMessage(messages.placeholder)}</span>
<input
ref={this.setRef}
className='search__input'
type='text'
placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
value={value}
onChange={this.handleChange}
onKeyUp={this.handleKeyUp}
onFocus={this.handleFocus}
onBlur={this.handleBlur}
/>
</label>
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
<Icon id='search' className={hasValue ? '' : 'active'} />
<Icon id='times-circle' className={hasValue ? 'active' : ''} aria-label={intl.formatMessage(messages.placeholder)} />
</div>
<Overlay show={expanded && !hasValue} placement='bottom' target={this} container={this}>
<Overlay show={expanded && !hasValue} placement='bottom' target={this}>
<SearchPopout />
</Overlay>
</div>

View file

@ -24,6 +24,7 @@ const mapStateToProps = state => ({
isEditing: state.getIn(['compose', 'id']) !== null,
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
isUploading: state.getIn(['compose', 'is_uploading']),
showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
});

View file

@ -18,7 +18,6 @@ import Icon from 'mastodon/components/icon';
import { logOut } from 'mastodon/utils/log_out';
import Column from 'mastodon/components/column';
import { Helmet } from 'react-helmet';
import { isMobile } from '../../is_mobile';
const messages = defineMessages({
start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@ -116,7 +115,7 @@ class Compose extends React.PureComponent {
<div className='drawer__inner' onFocus={this.onFocus}>
<NavigationContainer onClose={this.onBlur} />
<ComposeFormContainer autoFocus={!isMobile(window.innerWidth)} />
<ComposeFormContainer />
<div className='drawer__inner__mastodon'>
<img alt='' draggable='false' src={mascot || elephantUIPlane} />

View file

@ -6,4 +6,4 @@ export function countableText(inputText) {
return inputText
.replace(urlRegex, urlPlaceholder)
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
}
};

View file

@ -24,6 +24,16 @@ const mapStateToProps = state => ({
isSearching: state.getIn(['search', 'submitted']) || !showTrends,
});
// Fix strange bug on Safari where <span> (rendered by FormattedMessage) disappears
// after clicking around Explore top bar (issue #20885).
// Removing width=100% from <a> also fixes it, as well as replacing <span> with <div>
// We're choosing to wrap span with div to keep the changes local only to this tool bar.
const WrapFormattedMessage = ({ children, ...props }) => <div><FormattedMessage {...props}>{children}</FormattedMessage></div>;
WrapFormattedMessage.propTypes = {
children: PropTypes.any,
};
export default @connect(mapStateToProps)
@injectIntl
class Explore extends React.PureComponent {
@ -68,22 +78,12 @@ class Explore extends React.PureComponent {
{isSearching ? (
<SearchResults />
) : (
<>
<React.Fragment>
<div className='account__section-headline'>
<NavLink exact to='/explore'>
<FormattedMessage tagName='div' id='explore.trending_statuses' defaultMessage='Posts' />
</NavLink>
<NavLink exact to='/explore/tags'>
<FormattedMessage tagName='div' id='explore.trending_tags' defaultMessage='Hashtags' />
</NavLink>
<NavLink exact to='/explore/links'>
<FormattedMessage tagName='div' id='explore.trending_links' defaultMessage='News' />
</NavLink>
{signedIn && (
<NavLink exact to='/explore/suggestions'>
<FormattedMessage tagName='div' id='explore.suggested_follows' defaultMessage='For you' />
</NavLink>
)}
<NavLink exact to='/explore'><WrapFormattedMessage id='explore.trending_statuses' defaultMessage='Posts' /></NavLink>
<NavLink exact to='/explore/tags'><WrapFormattedMessage id='explore.trending_tags' defaultMessage='Hashtags' /></NavLink>
<NavLink exact to='/explore/links'><WrapFormattedMessage id='explore.trending_links' defaultMessage='News' /></NavLink>
{signedIn && <NavLink exact to='/explore/suggestions'><WrapFormattedMessage id='explore.suggested_follows' defaultMessage='For you' /></NavLink>}
</div>
<Switch>
@ -97,7 +97,7 @@ class Explore extends React.PureComponent {
<title>{intl.formatMessage(messages.title)}</title>
<meta name='robots' content={isSearching ? 'noindex' : 'all'} />
</Helmet>
</>
</React.Fragment>
)}
</div>
</Column>

View file

@ -38,7 +38,7 @@ class ColumnSettings extends React.PureComponent {
} else {
return tags;
}
}
};
onSelect = mode => value => {
const oldValue = this.tags(mode);
@ -98,7 +98,7 @@ class ColumnSettings extends React.PureComponent {
default:
return '';
}
}
};
render () {
const { settings, onChange } = this.props;

View file

@ -194,7 +194,7 @@ class HashtagTimeline extends React.PureComponent {
const following = tag.get('following');
followButton = (
<button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} active={following} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
<button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
</button>
);

View file

@ -126,7 +126,7 @@ class ListTimeline extends React.PureComponent {
onConfirm: () => {
dispatch(deleteList(id));
if (columnId) {
if (!!columnId) {
dispatch(removeColumn(columnId));
} else {
this.context.router.history.push('/lists');

View file

@ -97,7 +97,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
if (this.mediaQuery.removeEventListener) {
this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
} else {
this.mediaQuery.removeListener(this.handleLayoutChange);
this.mediaQuery.removeListener(this.handleLayouteChange);
}
}
}

View file

@ -89,4 +89,4 @@ class DisabledAccountBanner extends React.PureComponent {
);
}
}
};

View file

@ -291,11 +291,11 @@ class FocalPointModal extends ImmutablePureComponent {
let descriptionLabel = null;
if (media.get('type') === 'audio') {
descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people who are hard of hearing' />;
descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people with hearing loss' />;
} else if (media.get('type') === 'video') {
descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people who are deaf, hard of hearing, blind or have low vision' />;
descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people with hearing loss or visual impairment' />;
} else {
descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for people who are blind or have low vision' />;
descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for the visually impaired' />;
}
let ocrMessage = '';

View file

@ -91,4 +91,4 @@ class LinkFooter extends React.PureComponent {
);
}
}
};

View file

@ -46,7 +46,7 @@ export class WrappedRoute extends React.Component {
return {
hasError: true,
};
}
};
state = {
hasError: false,

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Plasings en antwoorde",
"account.report": "Rapporteer @{name}",
"account.requested": "Wag op goedkeuring. Klik om volgversoek te kanselleer",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Deel @{name} se profiel",
"account.show_reblogs": "Wys aangestuurde plasings van @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Plaas} other {{counter} Plasings}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Soekresultate",
"explore.suggested_follows": "For you",
"explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Publicacions y respuestas",
"account.report": "Denunciar a @{name}",
"account.requested": "Esperando l'aprebación",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Compartir lo perfil de @{name}",
"account.show_reblogs": "Amostrar retutz de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copiar lo seguimiento de pila en o portafuellas",
"errors.unexpected_crash.report_issue": "Informar d'un problema/error",
"explore.search_results": "Resultaus de busqueda",
"explore.suggested_follows": "For you",
"explore.title": "Explorar",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no s'aplica a lo contexto en o qual ha accediu a esta publlicación. Si quiers que la publicación sía filtrada tamién en este contexto, habrás d'editar lo filtro.",
"filter_modal.added.context_mismatch_title": "Lo contexto no coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducau, amenesterá cambiar la calendata de caducidat pa que s'aplique.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "المنشورات والرُدود",
"account.report": "الإبلاغ عن @{name}",
"account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "شارِك الملف التعريفي لـ @{name}",
"account.show_reblogs": "عرض مشاركات @{name}",
"account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
"errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
"explore.search_results": "نتائج البحث",
"explore.suggested_follows": "For you",
"explore.title": "استكشف",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.",
"filter_modal.added.context_mismatch_title": "عدم تطابق السياق!",
"filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Artículos ya rempuestes",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Share @{name}'s profile",
"account.show_reblogs": "Amosar los artículos compartíos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Resultaos de la busca",
"explore.suggested_follows": "Pa ti",
"explore.title": "Esploración",
"explore.trending_links": "Noticies",
"explore.trending_statuses": "Artículos",
"explore.trending_tags": "Etiquetes",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esti artículu. Si tamién quies que se peñere l'artículu nesti contestu, tienes d'editar la peñera.",
"filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@ -262,7 +257,7 @@
"follow_recommendations.lead": "Los artículos de los perfiles que sigas van apaecer n'orde cronolóxicu nel to feed d'aniciu. ¡Nun tengas mieu d'enquivocate, pues dexar de siguilos con facilidá en cualesquier momentu!",
"follow_request.authorize": "Autorizar",
"follow_request.reject": "Refugar",
"follow_requests.unlocked_explanation": "Magar que la to cuenta nun seya privada, el personal del dominiu «{domain}» pensó qu'a lo meyor quies revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
"follow_requests.unlocked_explanation": "Magar que la cuenta nun tea bloquiada, ye posible que'l personal del dominiu {domain} quiera revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
"footer.about": "Tocante a",
"footer.directory": "Direutoriu de perfiles",
"footer.get_app": "Consiguir l'aplicación",
@ -622,13 +617,13 @@
"upload_button.label": "Add images, a video or an audio file",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.",
"upload_form.audio_description": "Describe for people who are hard of hearing",
"upload_form.description": "Describe for people who are blind or have low vision",
"upload_form.audio_description": "Descripción pa persones con perda auditiva",
"upload_form.description": "Descripción pa persones con discapacidá visual",
"upload_form.description_missing": "Nun s'amestó la descripción",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Desaniciar",
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
"upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual",
"upload_modal.analyzing_picture": "Analizando la semeya…",
"upload_modal.apply": "Aplicar",
"upload_modal.applying": "Aplicando…",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Допісы і адказы",
"account.report": "Паскардзіцца на @{name}",
"account.requested": "Чакаецца ўхваленне. Націсніце, каб скасаваць запыт на падпіску",
"account.requested_follow": "{name} адправіў запыт на падпіску",
"account.share": "Абагуліць профіль @{name}",
"account.show_reblogs": "Паказаць падштурхоўванні ад @{name}",
"account.statuses_counter": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Дадаць дыягнастычны стэк у буфер абмену",
"errors.unexpected_crash.report_issue": "Паведаміць аб праблеме",
"explore.search_results": "Вынікі пошуку",
"explore.suggested_follows": "Для вас",
"explore.title": "Агляд",
"explore.trending_links": "Навіны",
"explore.trending_statuses": "Допісы",
"explore.trending_tags": "Хэштэгі",
"filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім вы адкрылі гэты пост. Калі вы хочаце, каб паведамленне таксама было адфільтравана ў гэтым кантэксце, вам трэба будзе адрэдагаваць фільтр",
"filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!",
"filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася",

View file

@ -12,7 +12,7 @@
"about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}",
"about.rules": "Правила на сървъра",
"account.account_note_header": "Бележка",
"account.add_or_remove_from_list": "Добавяне или премахване от списъци",
"account.add_or_remove_from_list": "Добави или премахни от списъците",
"account.badges.bot": "Бот",
"account.badges.group": "Група",
"account.block": "Блокиране на @{name}",
@ -40,7 +40,7 @@
"account.go_to_profile": "Към профила",
"account.hide_reblogs": "Скриване на споделяния от @{name}",
"account.joined_short": "Дата на присъединяване",
"account.languages": "Смяна на езиците на абонамент",
"account.languages": "Смяна на показваните езици",
"account.link_verified_on": "Собствеността върху тази връзка е проверена на {date}",
"account.locked_info": "Състоянието за поверителността на акаунта е зададено заключено. Собственикът преглежда ръчно от кого може да се следва.",
"account.media": "Мултимедия",
@ -51,18 +51,17 @@
"account.muted": "Заглушено",
"account.open_original_page": "Отваряне на оригиналната страница",
"account.posts": "Публикации",
"account.posts_with_replies": "Публикации и отговори",
"account.posts_with_replies": "С отговори",
"account.report": "Докладване на @{name}",
"account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване",
"account.requested_follow": "{name} поиска да ви последва",
"account.share": "Споделяне на профила на @{name}",
"account.share": "Изпращане на профила на @{name}",
"account.show_reblogs": "Показване на споделяния от @{name}",
"account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
"account.unblock": "Отблокиране на @{name}",
"account.unblock_domain": "Отблокиране на домейн {domain}",
"account.unblock_short": "Отблокирване",
"account.unendorse": "Не включвайте в профила",
"account.unfollow": "Без следване",
"account.unfollow": "Не следвай",
"account.unmute": "Без заглушаване на @{name}",
"account.unmute_notifications": "Без заглушаване на известия от @{name}",
"account.unmute_short": "Без заглушаване",
@ -143,11 +142,11 @@
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Запазване на промените",
"compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
"compose_form.sensitive.marked": "{count, plural, one {мултимедия е означена като деликатна} other {мултимедии са означени като деликатни}}",
"compose_form.sensitive.marked": "{count, plural, one {Мултимедията е маркирана като деликатна} other {Мултимедиите са маркирани като деликатни}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}",
"compose_form.spoiler.marked": "Премахване на предупреждението за съдържание",
"compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание",
"compose_form.spoiler_placeholder": "Тук напишете предупреждението си",
"compose_form.spoiler_placeholder": "Напишете предупреждение",
"confirmation_modal.cancel": "Отказ",
"confirmations.block.block_and_report": "Блокиране и докладване",
"confirmations.block.confirm": "Блокиране",
@ -179,13 +178,13 @@
"conversation.with": "С {names}",
"copypaste.copied": "Копирано",
"copypaste.copy": "Копиране",
"directory.federated": "От позната федивселена",
"directory.federated": "От познатата федивселена",
"directory.local": "Само от {domain}",
"directory.new_arrivals": "Новодошли",
"directory.recently_active": "Наскоро дейни",
"disabled_account_banner.account_settings": "Настройки на акаунта",
"disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.",
"dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.",
"dismissable_banner.community_timeline": "Ето най-скорошните публични публикации, създадени от акаунти в {domain}.",
"dismissable_banner.dismiss": "Отхвърляне",
"dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.",
"dismissable_banner.explore_statuses": "Тези публикации от този и други сървъри в децентрализираната мрежа набират популярност сега на този сървър.",
@ -195,7 +194,7 @@
"embed.preview": "Ето как ще изглежда:",
"emoji_button.activity": "Дейност",
"emoji_button.clear": "Изчистване",
"emoji_button.custom": "Персонализирано",
"emoji_button.custom": "Персонализирани",
"emoji_button.flags": "Знамена",
"emoji_button.food": "Храна и напитки",
"emoji_button.label": "Вмъкване на емоджи",
@ -208,9 +207,9 @@
"emoji_button.search_results": "Резултати от търсене",
"emoji_button.symbols": "Символи",
"emoji_button.travel": "Пътуване и места",
"empty_column.account_suspended": "Спрян акаунт",
"empty_column.account_suspended": "Профилът е спрян",
"empty_column.account_timeline": "Тук няма публикации!",
"empty_column.account_unavailable": "Недостъпен профил",
"empty_column.account_unavailable": "Няма достъп до профила",
"empty_column.blocks": "Още не сте блокирали никакви потребители.",
"empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.",
"empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
@ -222,7 +221,7 @@
"empty_column.follow_recommendations": "Изглежда, че няма генерирани предложения за вас. Можете да опитате да търсите за хора, които знаете или да разгледате популярните тагове.",
"empty_column.follow_requests": "Все още нямате заявки за последване. Когато получите такава, тя ще се покаже тук.",
"empty_column.hashtag": "Още няма нищо в този хаштаг.",
"empty_column.home": "Вашата начална часова ос е празна! Последвайте повече хора, за да я запълните. {suggestions}",
"empty_column.home": "Вашият личен инфопоток е празен! Последвайте повече хора, за да го запълните. {suggestions}",
"empty_column.home.suggestions": "Преглед на някои предложения",
"empty_column.list": "Още няма нищо в този списък. Когато членовете на списъка публикуват нови публикации, то те ще се появят тук.",
"empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Копиране на stacktrace-а в клипборда",
"errors.unexpected_crash.report_issue": "Сигнал за проблем",
"explore.search_results": "Резултати от търсенето",
"explore.suggested_follows": "За вас",
"explore.title": "Разглеждане",
"explore.trending_links": "Новини",
"explore.trending_statuses": "Публикации",
"explore.trending_tags": "Хаштагове",
"filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.",
"filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!",
"filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
@ -265,7 +260,7 @@
"follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.",
"footer.about": "Относно",
"footer.directory": "Директория на профилите",
"footer.get_app": "Вземане на приложението",
"footer.get_app": "Изтегли приложението",
"footer.invite": "Поканване на хора",
"footer.keyboard_shortcuts": "Клавишни комбинации",
"footer.privacy_policy": "Политика за поверителност",
@ -289,7 +284,7 @@
"home.hide_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.reply": "Ако имате профил в Mastodon, можете да добавите отговор към тази публикация.",
"interaction_modal.on_another_server": "На различен сървър",
@ -316,10 +311,10 @@
"keyboard_shortcuts.favourites": "Отваряне на списъка с любими",
"keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток",
"keyboard_shortcuts.heading": "Клавишни съчетания",
"keyboard_shortcuts.home": "Отваряне на началната часова ос",
"keyboard_shortcuts.home": "Отваряне на личния инфопоток",
"keyboard_shortcuts.hotkey": "Бърз клавиш",
"keyboard_shortcuts.legend": "Показване на тази легенда",
"keyboard_shortcuts.local": "Отваряне на местна часова ос",
"keyboard_shortcuts.local": "Отваряне на локалния инфопоток",
"keyboard_shortcuts.mention": "Споменаване на автор",
"keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители",
"keyboard_shortcuts.my_profile": "Отваряне на профила ви",
@ -344,7 +339,7 @@
"lightbox.previous": "Назад",
"limited_account_hint.action": "Покажи профила въпреки това",
"limited_account_hint.title": "Този профил е бил скрит от модераторита на {domain}.",
"lists.account.add": "Добавяне в списък",
"lists.account.add": "Добавяне към списък",
"lists.account.remove": "Премахване от списък",
"lists.delete": "Изтриване на списък",
"lists.edit": "Промяна на списъка",
@ -386,13 +381,13 @@
"navigation_bar.personal": "Лично",
"navigation_bar.pins": "Закачени публикации",
"navigation_bar.preferences": "Предпочитания",
"navigation_bar.public_timeline": "Федеративна хронология",
"navigation_bar.public_timeline": "Федериран инфопоток",
"navigation_bar.search": "Търсене",
"navigation_bar.security": "Сигурност",
"not_signed_in_indicator.not_signed_in": "Трябва да влезете за достъп до този ресурс.",
"notification.admin.report": "{name} докладва {target}",
"notification.admin.sign_up": "{name} се регистрира",
"notification.favourite": "{name} сложи в любими ваша публикация",
"notification.favourite": "{name} хареса ваша публикация",
"notification.follow": "{name} ви последва",
"notification.follow_request": "{name} поиска да ви последва",
"notification.mention": "{name} ви спомена",
@ -421,7 +416,7 @@
"notifications.column_settings.status": "Нови публикации:",
"notifications.column_settings.unread_notifications.category": "Непрочетени известия",
"notifications.column_settings.unread_notifications.highlight": "Изтъкване на непрочетените известия",
"notifications.column_settings.update": "Промени:",
"notifications.column_settings.update": "Редакции:",
"notifications.filter.all": "Всичко",
"notifications.filter.boosts": "Споделяния",
"notifications.filter.favourites": "Любими",
@ -441,7 +436,7 @@
"picture_in_picture.restore": "Връщане обратно",
"poll.closed": "Затворено",
"poll.refresh": "Опресняване",
"poll.total_people": "{count, plural, one {# човек} other {# души}}",
"poll.total_people": "{count, plural, one {# човек} other {# човека}}",
"poll.total_votes": "{count, plural, one {# глас} other {# гласа}}",
"poll.vote": "Гласуване",
"poll.voted": "Гласувахте за този отговор",
@ -456,21 +451,21 @@
"privacy.public.long": "Видимо за всички",
"privacy.public.short": "Публично",
"privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване",
"privacy.unlisted.short": "Несписъчно",
"privacy.unlisted.short": "Скрито",
"privacy_policy.last_updated": "Последно осъвременяване на {date}",
"privacy_policy.title": "Политика за поверителност",
"refresh": "Опресняване",
"regeneration_indicator.label": "Зареждане…",
"regeneration_indicator.sublabel": "Подготовка на началния ви инфоканал!",
"regeneration_indicator.sublabel": "Вашият основен инфопоток се подготвя!",
"relative_time.days": "{number} д.",
"relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}",
"relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}",
"relative_time.full.just_now": "току-що",
"relative_time.full.minutes": "преди {number, plural, one {# минута} other {# минути}}",
"relative_time.full.seconds": "преди {number, plural, one {# секунда} other {# секунди}}",
"relative_time.hours": "{number}ч.",
"relative_time.hours": "{number} ч.",
"relative_time.just_now": "сега",
"relative_time.minutes": "{number}м.",
"relative_time.minutes": "{number} мин.",
"relative_time.seconds": "{number}с.",
"relative_time.today": "днес",
"reply_indicator.cancel": "Отказ",
@ -510,7 +505,7 @@
"report.thanks.title": "Не искате ли да виждате това?",
"report.thanks.title_actionable": "Благодарности за докладването, ще го прегледаме.",
"report.unfollow": "Стоп на следването на @{name}",
"report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в началния си инфопоток, то спрете да го следвате.",
"report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в основния си инфопоток, то спрете да го следвате.",
"report_notification.attached_statuses": "прикачено {count, plural, one {{count} публикация} other {{count} публикации}}",
"report_notification.categories.other": "Друго",
"report_notification.categories.spam": "Спам",
@ -529,7 +524,7 @@
"search_results.hashtags": "Хаштагове",
"search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене",
"search_results.statuses": "Публикации",
"search_results.statuses_fts_disabled": "Търсенето на публикации по съдържанието им не е включено в този сървър на Mastodon.",
"search_results.statuses_fts_disabled": "Търсенето на публикации по тяхното съдържание не е активирано за този Mastodon сървър.",
"search_results.title": "Търсене за {q}",
"search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}",
"server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)",
@ -542,7 +537,7 @@
"sign_in_banner.sign_in": "Вход",
"sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, любимо, споделяне и отговаряне на публикации или взаимодействие от акаунта ви на друг сървър.",
"status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
"status.admin_status": "Отваряне на тази публикация в интерфейс на модериране",
"status.admin_status": "Open this status in the moderation interface",
"status.block": "Блокиране на @{name}",
"status.bookmark": "Отмятане",
"status.cancel_reblog_private": "Отсподеляне",
@ -592,20 +587,20 @@
"status.translate": "Превод",
"status.translated_from_with": "Преведено от {lang}, използвайки {provider}",
"status.uncached_media_warning": "Не е налично",
"status.unmute_conversation": "Без заглушаването на разговора",
"status.unmute_conversation": "Раззаглушаване на разговор",
"status.unpin": "Разкачане от профила",
"subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.",
"subscribed_languages.save": "Запазване на промените",
"subscribed_languages.target": "Смяна на езика за {target}",
"suggestions.dismiss": "Отхвърляне на предложение",
"suggestions.header": "Може да имате интерес от…",
"suggestions.header": "Може да се интересувате от…",
"tabs_bar.federated_timeline": "Федерална",
"tabs_bar.home": "Начало",
"tabs_bar.local_timeline": "Местни",
"tabs_bar.notifications": "Известия",
"time_remaining.days": "{number, plural, one {остава # ден} other {остават # дни}}",
"time_remaining.hours": "{number, plural, one {остава # час} other {остават # часа}}",
"time_remaining.minutes": "{number, plural, one {остава # минута} other {остават # минути}}",
"time_remaining.days": "{number, plural, one {# ден} other {# дни}} остава",
"time_remaining.hours": "{number, plural, one {# час} other {# часа}} остава",
"time_remaining.minutes": "{number, plural, one {# минута} other {# минути}} остава",
"time_remaining.moments": "Оставащи моменти",
"time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} остава",
"timeline_hint.remote_resource_not_displayed": "{resource} от други сървъри не се показват.",
@ -624,12 +619,12 @@
"upload_error.poll": "Качването на файлове не е позволено с анкети.",
"upload_form.audio_description": "Опишете за хора със загубен слух",
"upload_form.description": "Опишете за хора със зрително увреждане",
"upload_form.description_missing": "Няма добавен опис",
"upload_form.description_missing": "Няма добавено описание",
"upload_form.edit": "Редактиране",
"upload_form.thumbnail": "Промяна на миниобраза",
"upload_form.undo": "Изтриване",
"upload_form.video_description": "Опишете за хора със загубен слух или зрително увреждане",
"upload_modal.analyzing_picture": "Снимков анализ…",
"upload_modal.analyzing_picture": "Анализ на снимка…",
"upload_modal.apply": "Прилагане",
"upload_modal.applying": "Прилагане…",
"upload_modal.choose_image": "Избор на образ",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "টুট এবং মতামত",
"account.report": "@{name} কে রিপোর্ট করুন",
"account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
"account.requested_follow": "{name} আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে",
"account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
"account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
"account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}",
@ -71,7 +70,7 @@
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "নতুন ব্যবহারকারী",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
"alert.rate_limited.title": "হার সীমিত",
"alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
@ -124,7 +123,7 @@
"community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
"community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
"community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
"compose.language.change": "ভাষা পরিবর্তন করুন",
"compose.language.change": "Change language",
"compose.language.search": "Search languages...",
"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.",
@ -138,7 +137,7 @@
"compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
"compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.publish": "প্রকাশ করুন",
"compose_form.publish": "Publish",
"compose_form.publish_form": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
"errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
"explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore",
"explore.trending_links": "সংবাদ",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@ -274,7 +269,7 @@
"getting_started.heading": "শুরু করা",
"hashtag.column_header.tag_mode.all": "এবং {additional}",
"hashtag.column_header.tag_mode.any": "অথবা {additional}",
"hashtag.column_header.tag_mode.none": "{additional} বাদ দিয়ে",
"hashtag.column_header.tag_mode.none": "বাদ দিয়ে {additional}",
"hashtag.column_settings.select.no_options_message": "কোনটা পাওয়া যায় নি",
"hashtag.column_settings.select.placeholder": "হ্যাশট্যাগের ভেতরে ঢুকুন…",
"hashtag.column_settings.tag_mode.all": "এগুলো সব",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Toudoù ha respontoù",
"account.report": "Disklêriañ @{name}",
"account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Skignañ profil @{name}",
"account.show_reblogs": "Diskouez skignadennoù @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toud} two {{counter} Doud} other {{counter} a Doudoù}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
"explore.search_results": "Disoc'hoù an enklask",
"explore.suggested_follows": "For you",
"explore.title": "Furchal",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Posts and replies",
"account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Share @{name}'s profile",
"account.show_reblogs": "Show boosts from @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Tuts i respostes",
"account.report": "Informa sobre @{name}",
"account.requested": "S'espera l'aprovació. Clica per a cancel·lar la petició de seguiment",
"account.requested_follow": "{name} ha demanat de seguir-te",
"account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}",
@ -105,7 +104,7 @@
"column.direct": "Missatges directes",
"column.directory": "Navega pels perfils",
"column.domain_blocks": "Dominis blocats",
"column.favourites": "Favorits",
"column.favourites": "Preferits",
"column.follow_requests": "Peticions de seguir-te",
"column.home": "Inici",
"column.lists": "Llistes",
@ -127,8 +126,8 @@
"compose.language.change": "Canvia d'idioma",
"compose.language.search": "Cerca idiomes...",
"compose_form.direct_message_warning_learn_more": "Més informació",
"compose_form.encryption_warning": "Els tuts a Mastodon no estant xifrats punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
"compose_form.hashtag_warning": "Aquest tut no es mostrarà en cap etiqueta, ja que no està llistat. Només els tuts públics es poden cercar per etiqueta.",
"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": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.",
"compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.",
"compose_form.lock_disclaimer.lock": "blocat",
"compose_form.placeholder": "Què et passa pel cap?",
@ -138,11 +137,11 @@
"compose_form.poll.remove_option": "Elimina aquesta opció",
"compose_form.poll.switch_to_multiple": "Canvia lenquesta per a permetre diverses opcions",
"compose_form.poll.switch_to_single": "Canvia lenquesta per a permetre una única opció",
"compose_form.publish": "Tut",
"compose_form.publish": "Publica",
"compose_form.publish_form": "Publica",
"compose_form.publish_loud": "Tut!",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Desa els canvis",
"compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
"compose_form.sensitive.hide": "{count, plural, one {Marca el contingut com a sensible} other {Marca el contingut com a sensible}}",
"compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}",
"compose_form.spoiler.marked": "Elimina l'avís de contingut",
@ -188,10 +187,10 @@
"dismissable_banner.community_timeline": "Aquestes són les publicacions més recents d'usuaris amb el compte a {domain}.",
"dismissable_banner.dismiss": "Ometre",
"dismissable_banner.explore_links": "Gent d'aquest i d'altres servidors de la xarxa descentralitzada estan comentant ara mateix aquestes notícies.",
"dismissable_banner.explore_statuses": "Aquests tuts d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
"dismissable_banner.explore_statuses": "Aquestes publicacions d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
"dismissable_banner.explore_tags": "Aquestes etiquetes estan guanyant ara mateix l'atenció dels usuaris d'aquest i altres servidors de la xarxa descentralitzada.",
"dismissable_banner.public_timeline": "Aquestes són els tuts públics més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.",
"embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
"dismissable_banner.public_timeline": "Aquestes són les publicacions públiques més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.",
"embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.",
"embed.preview": "Aquest aspecte tindrà:",
"emoji_button.activity": "Activitat",
"emoji_button.clear": "Neteja",
@ -214,17 +213,17 @@
"empty_column.blocks": "Encara no has blocat cap usuari.",
"empty_column.bookmarked_statuses": "Encara no has marcat cap publicació com a preferida. Quan en marquis una, apareixerà aquí.",
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
"empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis un, sortirà aquí.",
"empty_column.direct": "Encara no teniu missatges directes. Quan n'envieu o en rebeu, sortiran aquí.",
"empty_column.domain_blocks": "Encara no hi ha dominis blocats.",
"empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
"empty_column.favourited_statuses": "Encara no has afavorit cap tut. Quan ho facis, apareixerà aquí.",
"empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.",
"empty_column.favourites": "Encara no ha marcat ningú aquesta publicació com a preferida. Quan ho faci algú apareixerà aquí.",
"empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per trobar persones que vulguis conèixer o explorar les etiquetes en tendència.",
"empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
"empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
"empty_column.home.suggestions": "Mostra alguns suggeriments",
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, apareixeran aquí.",
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin noves publicacions, apareixeran aquí.",
"empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
"empty_column.mutes": "Encara no has silenciat cap usuari.",
"empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copia stacktrace al porta-retalls",
"errors.unexpected_crash.report_issue": "Informa d'un problema",
"explore.search_results": "Resultats de la cerca",
"explore.suggested_follows": "Per a tu",
"explore.title": "Explora",
"explore.trending_links": "Notícies",
"explore.trending_statuses": "Tuts",
"explore.trending_tags": "Etiquetes",
"filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquesta publicació. Si també vols que la publicació es filtri en aquest context, hauràs d'editar el filtre.",
"filter_modal.added.context_mismatch_title": "El context no coincideix!",
"filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.",
@ -256,7 +251,7 @@
"filter_modal.select_filter.search": "Cerca o crea",
"filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
"filter_modal.select_filter.title": "Filtra aquesta publicació",
"filter_modal.title.status": "Filtra un tut",
"filter_modal.title.status": "Filtra una publicació",
"follow_recommendations.done": "Fet",
"follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.",
"follow_recommendations.lead": "Les publicacions dels usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps d'Inici. No tinguis por de cometre errors, pots deixar de seguir-los en qualsevol moment!",
@ -291,12 +286,12 @@
"interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquesta publicació, que l'autor sàpiga que t'ha agradat i desar-la per a més endavant.",
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre les seves publicacions en la teva línia de temps d'Inici.",
"interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquesta publicació per a compartir-la amb els teus seguidors.",
"interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquest tut.",
"interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquesta publicació.",
"interaction_modal.on_another_server": "En un servidor diferent",
"interaction_modal.on_this_server": "En aquest servidor",
"interaction_modal.other_server_instructions": "Copia i enganxa aquesta URL en el camp de cerca de la teva aplicació Mastodon preferida o en l'interfície web del teu servidor Mastodon.",
"interaction_modal.preamble": "Com que Mastodon és descentralitzat, pots fer servir el teu compte existent en un altre servidor Mastodon o plataforma compatible si no tens compte en aquest.",
"interaction_modal.title.favourite": "Marca el tut de {name}",
"interaction_modal.title.favourite": "Marca la publicació de {name}",
"interaction_modal.title.follow": "Segueix {name}",
"interaction_modal.title.reblog": "Impulsa la publicació de {name}",
"interaction_modal.title.reply": "Respon a la publicació de {name}",
@ -305,7 +300,7 @@
"intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
"keyboard_shortcuts.back": "Vés enrere",
"keyboard_shortcuts.blocked": "Obre la llista d'usuaris blocats",
"keyboard_shortcuts.boost": "Impulsa el tut",
"keyboard_shortcuts.boost": "Impulsa la publicació",
"keyboard_shortcuts.column": "Centra la columna",
"keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
"keyboard_shortcuts.description": "Descripció",
@ -324,10 +319,10 @@
"keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
"keyboard_shortcuts.my_profile": "Obre el teu perfil",
"keyboard_shortcuts.notifications": "Obre la columna de notificacions",
"keyboard_shortcuts.open_media": "Obre mèdia",
"keyboard_shortcuts.pinned": "Obre la llista de tuts fixats",
"keyboard_shortcuts.open_media": "Obre el contingut",
"keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
"keyboard_shortcuts.profile": "Obre el perfil de l'autor",
"keyboard_shortcuts.reply": "Respon al tut",
"keyboard_shortcuts.reply": "Respon a la publicació",
"keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
"keyboard_shortcuts.search": "Centra la barra de cerca",
"keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
@ -406,7 +401,7 @@
"notifications.column_settings.admin.report": "Nous informes:",
"notifications.column_settings.admin.sign_up": "Nous registres:",
"notifications.column_settings.alert": "Notificacions d'escriptori",
"notifications.column_settings.favourite": "Favorits:",
"notifications.column_settings.favourite": "Preferits:",
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
"notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
@ -482,7 +477,7 @@
"report.category.subtitle": "Tria la millor coincidència",
"report.category.title": "Explica'ns què passa amb això ({type})",
"report.category.title_account": "perfil",
"report.category.title_status": "tut",
"report.category.title_status": "publicació",
"report.close": "Fet",
"report.comment.title": "Hi ha res més que creguis que hauríem de saber?",
"report.forward": "Reenvia a {target}",
@ -502,7 +497,7 @@
"report.rules.subtitle": "Selecciona totes les aplicables",
"report.rules.title": "Quines regles s'han violat?",
"report.statuses.subtitle": "Selecciona totes les aplicables",
"report.statuses.title": "Hi ha cap tut que doni suport a aquest informe?",
"report.statuses.title": "Hi ha cap publicació que doni suport a aquest informe?",
"report.submit": "Envia",
"report.target": "Es reporta {target}",
"report.thanks.take_action": "Aquestes són les teves opcions per a controlar el que veus a Mastodon:",
@ -511,7 +506,7 @@
"report.thanks.title_actionable": "Gràcies per informar, ho investigarem.",
"report.unfollow": "Deixa de seguir @{name}",
"report.unfollow_explanation": "Segueixes aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici deixa de seguir-lo.",
"report_notification.attached_statuses": "{count, plural, one {{count} tut} other {{count} tuts}} adjunts",
"report_notification.attached_statuses": "{count, plural, one {{count} publicació adjunta} other {{count} publicacions adjuntes}}",
"report_notification.categories.other": "Altres",
"report_notification.categories.spam": "Brossa",
"report_notification.categories.violation": "Violació de norma",
@ -519,17 +514,17 @@
"search.placeholder": "Cerca",
"search.search_or_paste": "Cerca o escriu l'URL",
"search_popout.search_format": "Format de cerca avançada",
"search_popout.tips.full_text": "Text simple recupera tuts que has escrit, els marcats com a favorits, els impulsats o en els que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
"search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
"search_popout.tips.hashtag": "etiqueta",
"search_popout.tips.status": "tut",
"search_popout.tips.status": "publicació",
"search_popout.tips.text": "El text simple recupera coincidències amb els usuaris, els noms d'usuari i les etiquetes",
"search_popout.tips.user": "usuari",
"search_results.accounts": "Gent",
"search_results.all": "Tots",
"search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
"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.statuses": "Publicacions",
"search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
"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)",
@ -542,12 +537,12 @@
"sign_in_banner.sign_in": "Inicia sessió",
"sign_in_banner.text": "Inicia la sessió per seguir perfils o etiquetes, afavorir, compartir i respondre a publicacions o interactuar des del teu compte en un servidor diferent.",
"status.admin_account": "Obre la interfície de moderació per a @{name}",
"status.admin_status": "Obrir aquest tut a la interfície de moderació",
"status.admin_status": "Obre aquesta publicació a la interfície de moderació",
"status.block": "Bloca @{name}",
"status.bookmark": "Marca",
"status.cancel_reblog_private": "Desfés l'impuls",
"status.cannot_reblog": "No es pot impulsar aquest tut",
"status.copy": "Copia l'enllaç al tut",
"status.cannot_reblog": "No es pot impulsar aquesta publicació",
"status.copy": "Copia l'enllaç a la publicació",
"status.delete": "Elimina",
"status.detailed_status": "Vista detallada de la conversa",
"status.direct": "Missatge directe a @{name}",
@ -555,10 +550,10 @@
"status.edited": "Editat {date}",
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
"status.embed": "Incrusta",
"status.favourite": "Favorit",
"status.filter": "Filtra aquest tut",
"status.favourite": "Preferit",
"status.filter": "Filtra aquesta publicació",
"status.filtered": "Filtrada",
"status.hide": "Amaga el tut",
"status.hide": "Amaga la publicació",
"status.history.created": "creat per {name} {date}",
"status.history.edited": "editat per {name} {date}",
"status.load_more": "Carrega'n més",
@ -567,9 +562,9 @@
"status.more": "Més",
"status.mute": "Silencia @{name}",
"status.mute_conversation": "Silencia la conversa",
"status.open": "Amplia el tut",
"status.open": "Amplia la publicació",
"status.pin": "Fixa en el perfil",
"status.pinned": "Tut fixat",
"status.pinned": "Publicació fixada",
"status.read_more": "Més informació",
"status.reblog": "Impulsa",
"status.reblog_private": "Impulsa amb la visibilitat original",
@ -594,7 +589,7 @@
"status.uncached_media_warning": "No està disponible",
"status.unmute_conversation": "Deixa de silenciar la conversa",
"status.unpin": "Desfixa del perfil",
"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 les publicacions 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 publicacions en totes les llengües.",
"subscribed_languages.save": "Desa els canvis",
"subscribed_languages.target": "Canvia les llengües subscrites per a {target}",
"suggestions.dismiss": "Ignora el suggeriment",
@ -615,27 +610,27 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} en {days, plural, one {el passat dia} other {els passats {days} dies}}",
"trends.trending_now": "És tendència",
"ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
"units.short.billion": "{count} B",
"units.short.million": "{count} M",
"units.short.thousand": "{count} K",
"upload_area.title": "Arrossega i deixa anar per a carregar",
"upload_button.label": "Afegeix imatges, un vídeo o un fitxer d'àudio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
"upload_error.poll": "No es permet carregar fitxers a les enquestes.",
"upload_form.audio_description": "Descriu-ho per a persones amb problemes d'audició",
"upload_form.description": "Descriu-ho per a persones amb problemes de visió",
"upload_form.audio_description": "Descripció per a persones amb discapacitat auditiva",
"upload_form.description": "Descripció per a persones amb discapacitat visual",
"upload_form.description_missing": "No s'hi ha afegit cap descripció",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Elimina",
"upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició",
"upload_form.video_description": "Descripció per a persones amb discapacitat auditiva o amb discapacitat visual",
"upload_modal.analyzing_picture": "S'analitza la imatge…",
"upload_modal.apply": "Aplica",
"upload_modal.applying": "S'aplica…",
"upload_modal.choose_image": "Tria la imatge",
"upload_modal.description_placeholder": "Setze jutges d'un jutjat mengen fetge d'un penjat",
"upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons dhidrogen, coi!",
"upload_modal.detect_text": "Detecta el text de la imatge",
"upload_modal.edit_media": "Edita el Mèdia",
"upload_modal.edit_media": "Edita el contingut",
"upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per a triar el punt focal que sempre serà visible en totes les miniatures.",
"upload_modal.preparing_ocr": "Es prepara l'OCR…",
"upload_modal.preview_label": "Previsualitza ({ratio})",

View file

@ -6,11 +6,11 @@
"about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.",
"about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.",
"about.domain_blocks.silenced.title": "سنووردار",
"about.domain_blocks.suspended.explanation": "هیچ داتایەک لەم سێرڤەرەوە پرۆسێس ناکرێت، هەڵناگیرێت یان ئاڵوگۆڕ ناکرێت، ئەمەش وا دەکات هیچ کارلێکێک یان پەیوەندییەک لەگەڵ بەکارهێنەران لەم سێرڤەرەوە مەحاڵ بێت.",
"about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
"about.domain_blocks.suspended.title": "هەڵپەسێردراوە",
"about.not_available": "ئەم زانیاریانە لەسەر ئەم سێرڤەرە بەردەست نەکراون.",
"about.powered_by": "سۆشیال میدیای لامەرکەزی کە لەلایەن {mastodon} ەوە بەهێز دەکرێت",
"about.rules": "یاساکانی سێرڤەر",
"about.not_available": "This information has not been made available on this server.",
"about.powered_by": "Decentralized social media powered by {mastodon}",
"about.rules": "Server rules",
"account.account_note_header": "تێبینی ",
"account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
"account.badges.bot": "بوت",
@ -19,16 +19,16 @@
"account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
"account.blocked": "بلۆککرا",
"account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
"account.cancel_follow_request": "داواکاری فۆڵۆو بکشێنەوە",
"account.cancel_follow_request": "Withdraw follow request",
"account.direct": "پەیامی تایبەت بە @{name}",
"account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
"account.domain_blocked": "دۆمەین قەپاتکرا",
"account.edit_profile": "دەستکاری پرۆفایل",
"account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
"account.endorse": "ناساندن لە پرۆفایل",
"account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
"account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
"account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
"account.featured_tags.last_status_at": "Last post on {date}",
"account.featured_tags.last_status_never": "No posts",
"account.featured_tags.title": "{name}'s featured hashtags",
"account.follow": "شوێنکەوتن",
"account.followers": "شوێنکەوتووان",
"account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
@ -37,24 +37,23 @@
"account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
"account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
"account.follows_you": "شوێنکەوتووەکانت",
"account.go_to_profile": "بڕۆ بۆ پڕۆفایلی",
"account.go_to_profile": "Go to profile",
"account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
"account.joined_short": "بەشداری کردووە",
"account.languages": "گۆڕینی زمانە بەشداربووەکان",
"account.joined_short": "Joined",
"account.languages": "Change subscribed languages",
"account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
"account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
"account.media": "میدیا",
"account.mention": "ئاماژە @{name}",
"account.moved_to": "{name} ئاماژەی بەوە کردووە کە ئەکاونتە نوێیەکەیان ئێستا:",
"account.moved_to": "{name} has indicated that their new account is now:",
"account.mute": "بێدەنگکردن @{name}",
"account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
"account.muted": "بێ دەنگ",
"account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە",
"account.open_original_page": "Open original page",
"account.posts": "توتس",
"account.posts_with_replies": "توتس و وەڵامەکان",
"account.report": "گوزارشت @{name}",
"account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "پرۆفایلی @{name} هاوبەش بکە",
"account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
@ -78,27 +77,27 @@
"alert.unexpected.title": "تەححح!",
"announcement.announcement": "بانگەواز",
"attachments_list.unprocessed": "(unprocessed)",
"audio.hide": "شاردنەوەی دەنگ",
"audio.hide": "Hide audio",
"autosuggest_hashtag.per_week": "{count} هەرهەفتە",
"boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
"bundle_column_error.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە",
"bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.",
"bundle_column_error.error.title": "ئای نا!",
"bundle_column_error.network.body": "لە کاتی هەوڵدان بۆ بارکردنی ئەم لاپەڕەیە هەڵەیەک ڕوویدا. ئەمەش دەتوانێت بەهۆی کێشەیەکی کاتی هێڵی ئینتەرنێتەکەت یان ئەم سێرڤەرە بێت.",
"bundle_column_error.network.title": "هەڵەی تۆڕ",
"bundle_column_error.copy_stacktrace": "Copy error report",
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
"bundle_column_error.error.title": "Oh, no!",
"bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.",
"bundle_column_error.network.title": "Network error",
"bundle_column_error.retry": "دووبارە هەوڵبدە",
"bundle_column_error.return": "بگەڕێرەوە ماڵەوە",
"bundle_column_error.routing.body": "پەیجی داواکراو ناتوانرێت بدۆزرێتەوە. ئایا دڵنیای کە URL ی ناو ناونیشانەکان ڕاستە?",
"bundle_column_error.routing.title": "٤٠٤",
"bundle_column_error.return": "Go back home",
"bundle_column_error.routing.body": "The requested page could not be found. Are you sure the URL in the address bar is correct?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "داخستن",
"bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
"bundle_modal_error.retry": "دووبارە تاقی بکەوە",
"closed_registrations.other_server_instructions": "بەو پێیەی ماستۆدۆن لامەرکەزییە، دەتوانیت ئەکاونتێک لەسەر سێرڤەرێکی تر دروست بکەیت و هێشتا کارلێک لەگەڵ ئەم سێرڤەرەدا بکەیت.",
"closed_registrations_modal.description": "دروستکردنی ئەکاونت لەسەر {domain} لە ئێستادا ناتوانرێت، بەڵام تکایە ئەوەت لەبەرچاو بێت کە پێویستت بە ئەکاونتێک نییە بە تایبەتی لەسەر {domain} بۆ بەکارهێنانی ماستۆدۆن.",
"closed_registrations_modal.find_another_server": "سێرڤەرێکی تر بدۆزەرەوە",
"closed_registrations_modal.preamble": "ماستۆدۆن لامەرکەزییە، بۆیە گرنگ نییە لە کوێ ئەکاونتەکەت دروست بکەیت، دەتوانیت فۆڵۆوی هەر کەسێک بکەیت و کارلێک لەگەڵیدا بکەیت لەسەر ئەم سێرڤەرە. تەنانەت دەتوانیت خۆت میوانداری بکەیت!",
"closed_registrations_modal.title": "ناو تۆمارکردن لە ماستۆدۆن",
"column.about": "دەربارە",
"closed_registrations.other_server_instructions": "Since Mastodon is decentralized, you can create an account on another server and still interact with this one.",
"closed_registrations_modal.description": "Creating an account on {domain} is currently not possible, but please keep in mind that you do not need an account specifically on {domain} to use Mastodon.",
"closed_registrations_modal.find_another_server": "Find another server",
"closed_registrations_modal.preamble": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!",
"closed_registrations_modal.title": "Signing up on Mastodon",
"column.about": "About",
"column.blocks": "بەکارهێنەرە بلۆککراوەکان",
"column.bookmarks": "نیشانەکان",
"column.community": "هێڵی کاتی ناوخۆیی",
@ -124,8 +123,8 @@
"community.column_settings.local_only": "تەنها خۆماڵی",
"community.column_settings.media_only": "تەنها میدیا",
"community.column_settings.remote_only": "تەنها بۆ دوور",
"compose.language.change": "گۆڕینی زمان",
"compose.language.search": "گەڕان بە زمانەکان...",
"compose.language.change": "Change language",
"compose.language.search": "Search languages...",
"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.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
@ -138,8 +137,8 @@
"compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
"compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
"compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
"compose_form.publish": "بڵاوی بکەوە",
"compose_form.publish_form": "بڵاوی بکەوە",
"compose_form.publish": "Publish",
"compose_form.publish_form": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
"compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
@ -152,8 +151,8 @@
"confirmations.block.block_and_report": "بلۆک & گوزارشت",
"confirmations.block.confirm": "بلۆک",
"confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
"confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە",
"confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟",
"confirmations.cancel_follow_request.confirm": "Withdraw request",
"confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
"confirmations.delete.confirm": "سڕینەوە",
"confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
"confirmations.delete_list.confirm": "سڕینەوە",
@ -177,20 +176,20 @@
"conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
"conversation.open": "نیشاندان گفتوگۆ",
"conversation.with": "لەگەڵ{names}",
"copypaste.copied": "کۆپی کراوە",
"copypaste.copy": "ڕوونووس",
"copypaste.copied": "Copied",
"copypaste.copy": "Copy",
"directory.federated": "لە ڕاژەکانی ناسراو",
"directory.local": "تەنها لە {domain}",
"directory.new_arrivals": "تازە گەیشتنەکان",
"directory.recently_active": "بەم دواییانە چالاکە",
"disabled_account_banner.account_settings": "ڕێکخستنەکانی هەژمارە",
"disabled_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە.",
"dismissable_banner.community_timeline": "ئەمانە دوایین پۆستی گشتی ئەو کەسانەن کە ئەکاونتەکانیان لەلایەن {domain}ەوە هۆست کراوە.",
"dismissable_banner.dismiss": "بەلاوە نان",
"dismissable_banner.explore_links": "ئەم هەواڵانە لە ئێستادا لەلایەن کەسانێکەوە لەسەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی باس دەکرێن.",
"dismissable_banner.explore_statuses": "ئەم پۆستانەی ئەم سێرڤەرە و سێرڤەرەکانی تری ناو تۆڕی لامەرکەزی لە ئێستادا خەریکە کێشکردن لەسەر ئەم سێرڤەرە بەدەست دەهێنن.",
"dismissable_banner.explore_tags": "ئەم هاشتاگانە لە ئێستادا لە نێو خەڵکی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزیدا جێگەی خۆیان دەگرن.",
"dismissable_banner.public_timeline": "ئەمانە دوایین پۆستە گشتیەکانن لە کەسانی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی کە ئەم سێرڤەرە دەزانێت.",
"disabled_account_banner.account_settings": "Account settings",
"disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.",
"dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.",
"dismissable_banner.dismiss": "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_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server 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.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.",
"embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
"embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
"emoji_button.activity": "چالاکی",
@ -236,16 +235,12 @@
"errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
"errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
"explore.search_results": "ئەنجامەکانی گەڕان",
"explore.suggested_follows": "For you",
"explore.title": "گەڕان",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "ئەم پۆلە فلتەرە ئەو چوارچێوەیە ناگرێتەوە کە تۆ تێیدا دەستت بەم پۆستە کردووە. ئەگەر بتەوێت پۆستەکە لەم چوارچێوەیەشدا فلتەر بکرێت، دەبێت دەستکاری فلتەرەکە بکەیت.",
"filter_modal.added.context_mismatch_title": "ناتەبایی دەقی نووسراو!",
"filter_modal.added.expired_explanation": "ئەم پۆلە فلتەرە بەسەرچووە، پێویستە بەرواری بەسەرچوونی بگۆڕیت بۆ ئەوەی جێبەجێی بکات.",
"filter_modal.added.expired_title": "فلتەری بەسەرچووە!",
"filter_modal.added.review_and_configure": "بۆ پێداچوونەوە و ڕێکخستنی زیاتری ئەم پۆلە فلتەرە، بچۆ بۆ {settings_link}.",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
"filter_modal.added.expired_title": "Expired filter!",
"filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.",
"filter_modal.added.review_and_configure_title": "Filter settings",
"filter_modal.added.settings_link": "settings page",
"filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
@ -533,14 +528,14 @@
"search_results.title": "Search for {q}",
"search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
"server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
"server_banner.active_users": "بەکارهێنەرانی چالاک",
"server_banner.administered_by": "بەڕێوەبردن لەلایەن:",
"server_banner.introduction": "{domain} بەشێکە لەو تۆڕە کۆمەڵایەتییە لامەرکەزییەی کە لەلایەن {mastodon}ەوە بەهێز دەکرێت.",
"server_banner.learn_more": "زیاتر فێربه",
"server_banner.server_stats": "دۆخی ڕاژەکار:",
"sign_in_banner.create_account": "هەژمار دروستبکە",
"sign_in_banner.sign_in": "بچۆ ژوورەوە",
"sign_in_banner.text": "چوونەژوورەوە بۆ فۆڵۆوکردنی پڕۆفایلی یان هاشتاگەکان، دڵخوازکردن، هاوبەشکردن و وەڵامدانەوەی پۆستەکان، یان کارلێککردن لە ئەکاونتەکەتەوە لەسەر سێرڤەرێکی جیاواز.",
"server_banner.active_users": "active users",
"server_banner.administered_by": "Administered by:",
"server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
"server_banner.learn_more": "Learn more",
"server_banner.server_stats": "Server stats:",
"sign_in_banner.create_account": "Create account",
"sign_in_banner.sign_in": "Sign in",
"sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
"status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
"status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
"status.block": "@{name} ئاستەنگ بکە",
@ -556,9 +551,9 @@
"status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
"status.embed": "نیشتەجێ بکە",
"status.favourite": "دڵخواز",
"status.filter": "ئەم پۆستە فلتەر بکە",
"status.filter": "Filter this post",
"status.filtered": "پاڵاوتن",
"status.hide": "شاردنەوەی توت",
"status.hide": "Hide toot",
"status.history.created": "{name} دروستکراوە لە{date}",
"status.history.edited": "{name} دروستکاریکراوە لە{date}",
"status.load_more": "زیاتر بار بکە",
@ -577,26 +572,26 @@
"status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
"status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
"status.remove_bookmark": "لابردنی نیشانه",
"status.replied_to": "لە وەڵامدا بۆ {name}",
"status.replied_to": "Replied to {name}",
"status.reply": "وەڵام",
"status.replyAll": "بە نووسراوە وەڵام بدەوە",
"status.report": "گوزارشت @{name}",
"status.sensitive_warning": "ناوەڕۆکی هەستیار",
"status.share": "هاوبەشی بکە",
"status.show_filter_reason": "بە هەر حاڵ نیشان بدە",
"status.show_filter_reason": "Show anyway",
"status.show_less": "کەمتر نیشان بدە",
"status.show_less_all": "هەمووی بچووک بکەوە",
"status.show_more": "زیاتر نیشان بدە",
"status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
"status.show_original": "پیشاندانی شێوه‌ی ڕاسته‌قینه‌",
"status.translate": "وەریبگێرە",
"status.translated_from_with": "لە {lang} وەرگێڕدراوە بە بەکارهێنانی {provider}",
"status.show_original": "Show original",
"status.translate": "Translate",
"status.translated_from_with": "Translated from {lang} using {provider}",
"status.uncached_media_warning": "بەردەست نیە",
"status.unmute_conversation": "گفتوگۆی بێدەنگ",
"status.unpin": "لە سەرەوە لایبە",
"subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.",
"subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان",
"subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}",
"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.target": "Change subscribed languages for {target}",
"suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
"suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
"tabs_bar.federated_timeline": "گشتی",
@ -640,7 +635,7 @@
"upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…",
"upload_modal.preview_label": "پێشبینین ({ratio})",
"upload_progress.label": "بار دەکرێت...",
"upload_progress.processing": "جێبەجێکردن...",
"upload_progress.processing": "Processing…",
"video.close": "داخستنی ڤیدیۆ",
"video.download": "داگرتنی فایل",
"video.exit_fullscreen": "دەرچوون لە پڕ شاشە",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Statuti è risposte",
"account.report": "Palisà @{name}",
"account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Sparte u prufile di @{name}",
"account.show_reblogs": "Vede spartere da @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
"errors.unexpected_crash.report_issue": "Palisà prublemu",
"explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Příspěvky a odpovědi",
"account.report": "Nahlásit @{name}",
"account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
"account.requested_follow": "{name} tě požádal o sledování",
"account.share": "Sdílet profil @{name}",
"account.show_reblogs": "Zobrazit boosty od @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
"errors.unexpected_crash.report_issue": "Nahlásit problém",
"explore.search_results": "Výsledky hledání",
"explore.suggested_follows": "Pro vás",
"explore.title": "Objevit",
"explore.trending_links": "Zprávy",
"explore.trending_statuses": "Příspěvky",
"explore.trending_tags": "Hashtagy",
"filter_modal.added.context_mismatch_explanation": "Tato kategorie filtrů se nevztahuje na kontext, ve kterém jste tento příspěvek otevřeli. Pokud chcete, aby byl příspěvek filtrován i v tomto kontextu, budete muset filtr upravit.",
"filter_modal.added.context_mismatch_title": "Kontext se neshoduje!",
"filter_modal.added.expired_explanation": "Tato kategorie filtrů vypršela, budete muset změnit datum vypršení platnosti, aby mohla být použita.",

View file

@ -54,7 +54,6 @@
"account.posts_with_replies": "Postiadau ac atebion",
"account.report": "Adrodd @{name}",
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn",
"account.share": "Rhannwch broffil @{name}",
"account.show_reblogs": "Dangos hybiau gan @{name}",
"account.statuses_counter": "{count, plural, one {Postiad: {counter}} other {Postiad: {counter}}}",
@ -236,11 +235,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
"errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
"explore.search_results": "Canlyniadau chwilio",
"explore.suggested_follows": "I chi",
"explore.title": "Archwilio",
"explore.trending_links": "Newyddion",
"explore.trending_statuses": "Postiadau",
"explore.trending_tags": "Hashnodau",
"filter_modal.added.context_mismatch_explanation": "Nid yw'r categori hidlo hwn yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
"filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!",
"filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.",

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