Compare commits
82 commits
dependabot
...
main
Author | SHA1 | Date | |
---|---|---|---|
|
c4a429ed47 | ||
|
fbe2c95ff1 | ||
|
a0af356df6 | ||
|
dac312a11a | ||
|
de21695162 | ||
|
628b350516 | ||
|
919747322f | ||
|
c04b762b9c | ||
|
ef09016f35 | ||
|
fcaeae7761 | ||
|
6a1d41635b | ||
|
c1de673060 | ||
|
2bad619d17 | ||
|
06b68490d1 | ||
|
2889c68610 | ||
|
3c70f0a9c9 | ||
|
f847f67410 | ||
|
d13702ac06 | ||
|
10370d316a | ||
|
2c7df002fa | ||
|
70415714f1 | ||
|
7a3c6bb888 | ||
|
c761e7a5ef | ||
|
b4fe2d1004 | ||
|
c649f4d386 | ||
|
bf1c7e2122 | ||
|
7fbc17afa2 | ||
|
99d2693071 | ||
|
2644a28cb3 | ||
|
2d12948220 | ||
|
ebf1d74e40 | ||
|
8556a649d5 | ||
|
1e49be3328 | ||
|
fb1d9789db | ||
|
8a56587d62 | ||
|
726c7dea31 | ||
|
ff414a5489 | ||
|
9f63c428e1 | ||
|
3656a6b9cc | ||
|
cedf138313 | ||
|
1b5d207131 | ||
|
d412147d02 | ||
|
8f8c0fe88c | ||
|
7972e5981c | ||
|
1e95fa3df5 | ||
|
059d64a59e | ||
|
673c54f114 | ||
|
bbc49f15e0 | ||
|
725f21662f | ||
|
38596e49d4 | ||
|
623d3d2e32 | ||
|
19f78ea8fa | ||
|
1f5740e65c | ||
|
3d3429243f | ||
|
22e36271c5 | ||
|
72a8af8088 | ||
|
08c0e43b6f | ||
|
c50e9d078a | ||
|
f0cebaee00 | ||
|
baecdf2882 | ||
|
58200132d0 | ||
|
3a59ffde8d | ||
|
903e5a3f45 | ||
|
4114a7088a | ||
|
04c611daa1 | ||
|
63b379c2d9 | ||
|
596923da4a | ||
|
a0813806d6 | ||
|
c3388f4ab1 | ||
|
52540771b0 | ||
|
441cac758f | ||
|
7b68e6409b | ||
|
e8cc63105f | ||
|
e5d15a5b56 | ||
|
bae6ef315e | ||
|
5fb1c3e934 | ||
|
fe9eab51d1 | ||
|
6cdbc345f4 | ||
|
f239d31f23 | ||
|
5917b46c05 | ||
|
1f762f4271 | ||
|
78ef635980 |
404 changed files with 5925 additions and 1780 deletions
|
@ -1,8 +1,8 @@
|
|||
version: 2.1
|
||||
|
||||
orbs:
|
||||
ruby: circleci/ruby@1.4.1
|
||||
node: circleci/node@5.0.1
|
||||
ruby: circleci/ruby@2.0.0
|
||||
node: circleci/node@5.0.3
|
||||
|
||||
executors:
|
||||
default:
|
||||
|
@ -19,11 +19,11 @@ executors:
|
|||
DB_USER: root
|
||||
DISABLE_SIMPLECOV: true
|
||||
RAILS_ENV: test
|
||||
- image: cimg/postgres:14.0
|
||||
- image: cimg/postgres:14.5
|
||||
environment:
|
||||
POSTGRES_USER: root
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
- image: cimg/redis:6.2
|
||||
- image: cimg/redis:7.0
|
||||
|
||||
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.8'
|
||||
bundler-version: '2.3.26'
|
||||
key: ruby<< parameters.ruby-version >>-gems-v1
|
||||
wait-db:
|
||||
steps:
|
||||
|
@ -221,5 +221,5 @@ workflows:
|
|||
pkg-manager: yarn
|
||||
requires:
|
||||
- build
|
||||
version: lts
|
||||
version: '16.18'
|
||||
yarn-run: test:jest
|
||||
|
|
|
@ -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/*, 16, 14, 12, 10
|
||||
# [Choice] Node.js version: lts/*, 18, 16, 14
|
||||
ARG NODE_VERSION="lts/*"
|
||||
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"name": "Mastodon",
|
||||
"dockerComposeFile": "docker-compose.yml",
|
||||
"service": "app",
|
||||
"workspaceFolder": "/workspaces/mastodon",
|
||||
"workspaceFolder": "/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": "bundle install --path vendor/bundle && yarn install && git checkout -- Gemfile.lock && ./bin/rails db:setup",
|
||||
"postCreateCommand": ".devcontainer/post-create.sh",
|
||||
|
||||
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||
"remoteUser": "vscode"
|
||||
|
|
|
@ -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: '14'
|
||||
NODE_VERSION: '16'
|
||||
volumes:
|
||||
- ..:/workspaces/mastodon:cached
|
||||
- ..:/mastodon:cached
|
||||
environment:
|
||||
RAILS_ENV: development
|
||||
NODE_ENV: development
|
||||
|
|
21
.devcontainer/post-create.sh
Executable file
21
.devcontainer/post-create.sh
Executable file
|
@ -0,0 +1,21 @@
|
|||
#!/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
|
|
@ -54,7 +54,7 @@ VAPID_PUBLIC_KEY=
|
|||
|
||||
# Sending mail
|
||||
# ------------
|
||||
SMTP_SERVER=smtp.mailgun.org
|
||||
SMTP_SERVER=
|
||||
SMTP_PORT=587
|
||||
SMTP_LOGIN=
|
||||
SMTP_PASSWORD=
|
||||
|
|
16
.eslintrc.js
16
.eslintrc.js
|
@ -1,6 +1,10 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
],
|
||||
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
|
@ -64,8 +68,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',
|
||||
{
|
||||
|
@ -75,18 +79,16 @@ module.exports = {
|
|||
],
|
||||
},
|
||||
],
|
||||
'no-fallthrough': 'error',
|
||||
'no-irregular-whitespace': 'error',
|
||||
'no-mixed-spaces-and-tabs': 'warn',
|
||||
'no-empty': 'off',
|
||||
'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',
|
||||
|
@ -96,6 +98,7 @@ module.exports = {
|
|||
ignoreRestSiblings: true,
|
||||
},
|
||||
],
|
||||
'no-useless-escape': 'off',
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
'padded-blocks': [
|
||||
'error',
|
||||
|
@ -105,7 +108,6 @@ module.exports = {
|
|||
],
|
||||
quotes: ['error', 'single'],
|
||||
semi: 'error',
|
||||
strict: 'off',
|
||||
'valid-typeof': 'error',
|
||||
|
||||
'react/jsx-boolean-value': 'error',
|
||||
|
|
1
.github/workflows/build-image.yml
vendored
1
.github/workflows/build-image.yml
vendored
|
@ -18,6 +18,7 @@ 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
|
||||
|
|
62
.github/workflows/codeql.yml
vendored
Normal file
62
.github/workflows/codeql.yml
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
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
2
.nvmrc
|
@ -1 +1 @@
|
|||
14
|
||||
16
|
||||
|
|
200
.rubocop.yml
200
.rubocop.yml
|
@ -1,12 +1,18 @@
|
|||
require:
|
||||
- rubocop-rails
|
||||
- rubocop-rspec
|
||||
- rubocop-performance
|
||||
|
||||
AllCops:
|
||||
TargetRubyVersion: 2.7
|
||||
NewCops: disable
|
||||
DisplayCopNames: true
|
||||
DisplayStyleGuide: true
|
||||
ExtraDetails: true
|
||||
UseCache: true
|
||||
CacheRootDirectory: tmp
|
||||
NewCops: enable
|
||||
Exclude:
|
||||
- 'spec/**/*'
|
||||
- 'db/**/*'
|
||||
- db/schema.rb
|
||||
- 'app/views/**/*'
|
||||
- 'config/**/*'
|
||||
- 'bin/*'
|
||||
|
@ -67,15 +73,57 @@ Lint/UselessAccessModifier:
|
|||
- class_methods
|
||||
|
||||
Metrics/AbcSize:
|
||||
Max: 115
|
||||
Max: 34 # RuboCop default 17
|
||||
Exclude:
|
||||
- 'lib/mastodon/*_cli.rb'
|
||||
- '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!
|
||||
|
||||
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
|
||||
|
@ -85,34 +133,144 @@ Metrics/BlockNesting:
|
|||
Metrics/ClassLength:
|
||||
CountComments: false
|
||||
Max: 500
|
||||
CountAsOne: [array, heredoc]
|
||||
Exclude:
|
||||
- 'lib/mastodon/*_cli.rb'
|
||||
|
||||
Metrics/CyclomaticComplexity:
|
||||
Max: 25
|
||||
Max: 12
|
||||
Exclude:
|
||||
- 'lib/mastodon/*_cli.rb'
|
||||
- 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!
|
||||
|
||||
Layout/LineLength:
|
||||
Max: 140 # RuboCop default 120
|
||||
AllowHeredoc: true
|
||||
AllowURI: true
|
||||
Enabled: false
|
||||
IgnoreCopDirectives: true
|
||||
AllowedPatterns:
|
||||
# Allow comments to be long lines
|
||||
- !ruby/regexp / \# .*$/
|
||||
- !ruby/regexp /^\# .*$/
|
||||
Exclude:
|
||||
- lib/**/*cli*.rb
|
||||
- db/*migrate/**/*
|
||||
- db/seeds/**/*
|
||||
|
||||
Metrics/MethodLength:
|
||||
CountComments: false
|
||||
Max: 65
|
||||
CountAsOne: [array, heredoc]
|
||||
Max: 25 # RuboCop default 10
|
||||
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
|
||||
CountKeywordArgs: true
|
||||
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
|
||||
|
||||
Metrics/PerceivedComplexity:
|
||||
Max: 25
|
||||
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!
|
||||
|
||||
Naming/MemoizedInstanceVariableName:
|
||||
Enabled: false
|
||||
|
@ -267,9 +425,6 @@ Style/PercentLiteralDelimiters:
|
|||
Style/PerlBackrefs:
|
||||
AutoCorrect: false
|
||||
|
||||
Style/RedundantAssignment:
|
||||
Enabled: false
|
||||
|
||||
Style/RedundantFetchBlock:
|
||||
Enabled: true
|
||||
|
||||
|
@ -292,7 +447,7 @@ Style/RegexpLiteral:
|
|||
Enabled: false
|
||||
|
||||
Style/RescueStandardError:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
Style/SignalException:
|
||||
Enabled: false
|
||||
|
@ -311,3 +466,14 @@ 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
22
Aptfile
|
@ -1,26 +1,4 @@
|
|||
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
|
||||
|
|
|
@ -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 [http://contributor-covenant.org/version/1/4][version]
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
[homepage]: https://contributor-covenant.org
|
||||
[version]: https://contributor-covenant.org/version/1/4/
|
||||
|
|
|
@ -15,7 +15,8 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|||
WORKDIR /opt/mastodon
|
||||
COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
||||
|
||||
RUN apt update && \
|
||||
# hadolint ignore=DL3008
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends build-essential \
|
||||
ca-certificates \
|
||||
git \
|
||||
|
@ -50,10 +51,12 @@ 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 -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
|
||||
useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
|
||||
apt-get -y --no-install-recommends install whois \
|
||||
wget \
|
||||
procps \
|
||||
|
|
17
Gemfile
17
Gemfile
|
@ -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.1.0'
|
||||
gem 'fog-core', '<= 2.4.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.2'
|
||||
gem 'pundit', '~> 2.3'
|
||||
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.6'
|
||||
gem 'scenic', '~> 1.7'
|
||||
gem 'sidekiq', '~> 6.5'
|
||||
gem 'sidekiq-scheduler', '~> 4.0'
|
||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||
|
@ -107,6 +107,10 @@ 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
|
||||
|
@ -117,13 +121,14 @@ 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
|
||||
|
@ -135,8 +140,6 @@ 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
|
||||
|
||||
|
|
49
Gemfile.lock
49
Gemfile.lock
|
@ -226,7 +226,7 @@ GEM
|
|||
erubi (1.11.0)
|
||||
et-orbi (1.2.7)
|
||||
tzinfo
|
||||
excon (0.76.0)
|
||||
excon (0.95.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.2.5)
|
||||
formatador (0.3.0)
|
||||
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.0)
|
||||
http (5.1.1)
|
||||
addressable (~> 2.8)
|
||||
http-cookie (~> 1.0)
|
||||
http-form_data (~> 2.2)
|
||||
|
@ -344,6 +344,8 @@ 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)
|
||||
|
@ -484,7 +486,7 @@ GEM
|
|||
public_suffix (5.0.1)
|
||||
puma (5.6.5)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.2.0)
|
||||
pundit (2.3.0)
|
||||
activesupport (>= 3.0.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.6.1)
|
||||
|
@ -585,21 +587,27 @@ GEM
|
|||
rspec-support (3.11.1)
|
||||
rspec_junit_formatter (0.6.0)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.30.1)
|
||||
rubocop (1.39.0)
|
||||
json (~> 2.3)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
parser (>= 3.1.2.1)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.18.0, < 2.0)
|
||||
rubocop-ast (>= 1.23.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.18.0)
|
||||
rubocop-ast (1.23.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-rails (2.15.0)
|
||||
rubocop-performance (1.15.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.17.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
rubocop-rspec (2.15.0)
|
||||
rubocop (~> 1.33)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby-saml (1.13.0)
|
||||
nokogiri (>= 1.10.5)
|
||||
|
@ -612,7 +620,7 @@ GEM
|
|||
sanitize (6.0.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
scenic (1.6.0)
|
||||
scenic (1.7.0)
|
||||
activerecord (>= 4.0.0)
|
||||
railties (>= 4.0.0)
|
||||
semantic_range (3.0.0)
|
||||
|
@ -777,7 +785,7 @@ DEPENDENCIES
|
|||
faker (~> 3.0)
|
||||
fast_blank (~> 1.0)
|
||||
fastimage
|
||||
fog-core (<= 2.1.0)
|
||||
fog-core (<= 2.4.0)
|
||||
fog-openstack (~> 0.3)
|
||||
fuubar (~> 2.5)
|
||||
gitlab-omniauth-openid-connect (~> 0.10.0)
|
||||
|
@ -791,6 +799,7 @@ 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)
|
||||
|
@ -822,7 +831,7 @@ DEPENDENCIES
|
|||
pry-rails (~> 0.3)
|
||||
public_suffix (~> 5.0)
|
||||
puma (~> 5.6)
|
||||
pundit (~> 2.2)
|
||||
pundit (~> 2.3)
|
||||
rack (~> 2.2.4)
|
||||
rack-attack (~> 6.6)
|
||||
rack-cors (~> 1.1)
|
||||
|
@ -840,11 +849,13 @@ DEPENDENCIES
|
|||
rspec-rails (~> 5.1)
|
||||
rspec-sidekiq (~> 3.1)
|
||||
rspec_junit_formatter (~> 0.6)
|
||||
rubocop (~> 1.30)
|
||||
rubocop-rails (~> 2.15)
|
||||
rubocop
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
ruby-progressbar (~> 1.11)
|
||||
sanitize (~> 6.0)
|
||||
scenic (~> 1.6)
|
||||
scenic (~> 1.7)
|
||||
sidekiq (~> 6.5)
|
||||
sidekiq-bulk (~> 0.2.0)
|
||||
sidekiq-scheduler (~> 4.0)
|
||||
|
@ -866,3 +877,9 @@ DEPENDENCIES
|
|||
webpacker (~> 5.4)
|
||||
webpush!
|
||||
xorcist (~> 1.1)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.0.4p208
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.33
|
||||
|
|
|
@ -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** 14+
|
||||
- **Node.js** 16+
|
||||
|
||||
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.
|
||||
|
||||
|
|
|
@ -55,12 +55,8 @@ module Admin
|
|||
def update
|
||||
authorize :domain_block, :update?
|
||||
|
||||
@domain_block.update(update_params)
|
||||
|
||||
severity_changed = @domain_block.severity_changed?
|
||||
|
||||
if @domain_block.save
|
||||
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
|
||||
if @domain_block.update(update_params)
|
||||
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
|
||||
log_action :update, @domain_block
|
||||
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
|
||||
else
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
module Admin
|
||||
class RelaysController < BaseController
|
||||
before_action :set_relay, except: [:index, :new, :create]
|
||||
before_action :require_signatures_enabled!, only: [:new, :create, :enable]
|
||||
before_action :warn_signatures_not_enabled!, only: [:new, :create, :enable]
|
||||
|
||||
def index
|
||||
authorize :relay, :update?
|
||||
|
@ -56,8 +56,8 @@ module Admin
|
|||
params.require(:relay).permit(:inbox_url)
|
||||
end
|
||||
|
||||
def require_signatures_enabled!
|
||||
redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
|
||||
def warn_signatures_not_enabled!
|
||||
flash.now[:error] = I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,6 +16,26 @@ 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
|
||||
|
|
|
@ -40,10 +40,8 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
|||
|
||||
def update
|
||||
authorize @domain_block, :update?
|
||||
@domain_block.update(domain_block_params)
|
||||
severity_changed = @domain_block.severity_changed?
|
||||
@domain_block.save!
|
||||
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
|
||||
@domain_block.update!(domain_block_params)
|
||||
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
|
||||
log_action :update, @domain_block
|
||||
render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
|
||||
end
|
||||
|
|
|
@ -31,7 +31,7 @@ class Api::V1::NotificationsController < Api::BaseController
|
|||
private
|
||||
|
||||
def load_notifications
|
||||
notifications = browserable_account_notifications.includes(from_account: :account_stat).to_a_paginated_by_id(
|
||||
notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_paginated_by_id(
|
||||
limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
|
||||
params_slice(:max_id, :since_id, :min_id)
|
||||
)
|
||||
|
|
|
@ -10,6 +10,8 @@ class Auth::PasswordsController < Devise::PasswordsController
|
|||
super do |resource|
|
||||
if resource.errors.empty?
|
||||
resource.session_activations.destroy_all
|
||||
|
||||
resource.revoke_access!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -56,8 +56,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
end
|
||||
|
||||
def configure_sign_up_params
|
||||
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)
|
||||
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)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ module RateLimitHeaders
|
|||
end
|
||||
|
||||
def api_throttle_data
|
||||
most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] - v[:count] }
|
||||
most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_key, value| value[:limit] - value[:count] }
|
||||
request.env['rack.attack.throttle_data'][most_limited_type]
|
||||
end
|
||||
|
||||
|
|
|
@ -28,8 +28,8 @@ module SignatureVerification
|
|||
end
|
||||
|
||||
class SignatureParamsTransformer < Parslet::Transform
|
||||
rule(params: subtree(:p)) do
|
||||
(p.is_a?(Array) ? p : [p]).each_with_object({}) { |(key, val), h| h[key] = val }
|
||||
rule(params: subtree(:param)) do
|
||||
(param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value }
|
||||
end
|
||||
|
||||
rule(param: { key: simple(:key), value: simple(:val) }) do
|
||||
|
|
|
@ -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 { |f| ActivityPub::TagManager.instance.uri_for(f.account) },
|
||||
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.account) },
|
||||
part_of: account_followers_url(@account),
|
||||
next: next_page_url,
|
||||
prev: prev_page_url
|
||||
|
|
|
@ -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 { |f| ActivityPub::TagManager.instance.uri_for(f.target_account) },
|
||||
items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.target_account) },
|
||||
part_of: account_following_index_url(@account),
|
||||
next: next_page_url,
|
||||
prev: prev_page_url
|
||||
|
|
|
@ -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 |p|
|
||||
p.frame_ancestors(false)
|
||||
content_security_policy only: :player do |policy|
|
||||
policy.frame_ancestors(false)
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -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 |p|
|
||||
p.frame_ancestors(false)
|
||||
content_security_policy only: :embed do |policy|
|
||||
policy.frame_ancestors(false)
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -65,7 +65,7 @@ class TagsController < ApplicationController
|
|||
id: tag_url(@tag),
|
||||
type: :ordered,
|
||||
size: @tag.statuses.count,
|
||||
items: @statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) }
|
||||
items: @statuses.map { |status| ActivityPub::TagManager.instance.uri_for(status) }
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -23,19 +23,28 @@ module FormattingHelper
|
|||
|
||||
before_html = begin
|
||||
if status.spoiler_text?
|
||||
"<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
|
||||
''
|
||||
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
|
||||
end
|
||||
end.html_safe # rubocop:disable Rails/OutputSafety
|
||||
end
|
||||
|
||||
after_html = begin
|
||||
if status.preloadable_poll
|
||||
"<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>"
|
||||
else
|
||||
''
|
||||
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
|
||||
end
|
||||
end.html_safe # rubocop:disable Rails/OutputSafety
|
||||
end
|
||||
|
||||
prerender_custom_emojis(
|
||||
safe_join([before_html, html, after_html]),
|
||||
|
|
|
@ -190,12 +190,15 @@ 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,
|
||||
|
|
|
@ -21,7 +21,7 @@ module StatusesHelper
|
|||
def media_summary(status)
|
||||
attachments = { image: 0, video: 0, audio: 0 }
|
||||
|
||||
status.media_attachments.each do |media|
|
||||
status.ordered_media_attachments.each do |media|
|
||||
if media.video?
|
||||
attachments[:video] += 1
|
||||
elsif media.audio?
|
||||
|
|
|
@ -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" style="color:#fff" /></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"/></svg>
|
||||
|
||||
|
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
@ -7,5 +7,5 @@
|
|||
<stop stop-color="#6364FF"/>
|
||||
<stop offset="1" stop-color="#563ACC"/>
|
||||
</linearGradient>
|
||||
</defs></symbol><use xlink:href="#logo-symbol-wordmark" style="color:#fff"/>
|
||||
</defs></symbol><use xlink:href="#logo-symbol-wordmark"/>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -102,7 +102,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
|
|||
dispatch(addReactionRequest(announcementId, name, alreadyAdded));
|
||||
}
|
||||
|
||||
api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
|
||||
api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(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/${name}`).then(() => {
|
||||
api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
|
||||
dispatch(removeReactionSuccess(announcementId, name));
|
||||
}).catch(err => {
|
||||
dispatch(removeReactionFail(announcementId, name, err));
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -11,4 +11,4 @@ export function useEmoji(emoji) {
|
|||
|
||||
dispatch(saveSettings());
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -8,10 +8,10 @@ export function setHeight (key, id, height) {
|
|||
id,
|
||||
height,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export function clearHeight () {
|
||||
return {
|
||||
type: HEIGHT_CACHE_CLEAR,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 => {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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']);
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -21,4 +21,4 @@ export function hydrateStore(rawState) {
|
|||
dispatch(hydrateCompose());
|
||||
dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -9,4 +9,4 @@ export function start() {
|
|||
} catch (e) {
|
||||
// If called twice
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -8,4 +8,4 @@ export default function compareId (id1, id2) {
|
|||
} else {
|
||||
return id1.length > id2.length ? 1 : -1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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'>
|
||||
|
|
|
@ -246,12 +246,13 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
|
||||
menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
|
||||
|
||||
if (publicStatus) {
|
||||
if (isRemote) {
|
||||
menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
|
||||
}
|
||||
if (publicStatus && 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.copy), action: this.handleCopy });
|
||||
|
||||
if (publicStatus) {
|
||||
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,9 @@ export const store = configureStore();
|
|||
const hydrateAction = hydrateStore(initialState);
|
||||
|
||||
store.dispatch(hydrateAction);
|
||||
store.dispatch(fetchCustomEmojis());
|
||||
if (initialState.meta.me) {
|
||||
store.dispatch(fetchCustomEmojis());
|
||||
}
|
||||
|
||||
const createIdentityContext = state => ({
|
||||
signedIn: !!state.meta.me,
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
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>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -14,6 +14,7 @@ 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';
|
||||
|
||||
|
@ -311,6 +312,8 @@ 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}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
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);
|
|
@ -104,6 +104,7 @@ 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}
|
||||
|
|
|
@ -72,4 +72,4 @@ class ClosedRegistrationsModal extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ 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';
|
||||
|
@ -61,14 +60,14 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
onChangeSpoilerText: PropTypes.func.isRequired,
|
||||
onPaste: PropTypes.func.isRequired,
|
||||
onPickEmoji: PropTypes.func.isRequired,
|
||||
showSearch: PropTypes.bool,
|
||||
autoFocus: PropTypes.bool,
|
||||
anyMedia: PropTypes.bool,
|
||||
isInReply: PropTypes.bool,
|
||||
singleColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
showSearch: false,
|
||||
autoFocus: false,
|
||||
};
|
||||
|
||||
handleChange = (e) => {
|
||||
|
@ -154,7 +153,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 !== prevProps.focusDate) {
|
||||
if (this.props.focusDate && this.props.focusDate !== prevProps.focusDate) {
|
||||
let selectionEnd, selectionStart;
|
||||
|
||||
if (this.props.preselectDate !== prevProps.preselectDate && this.props.isInReply) {
|
||||
|
@ -180,7 +179,7 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
} else if (this.props.spoiler !== prevProps.spoiler) {
|
||||
if (this.props.spoiler) {
|
||||
this.spoilerText.input.focus();
|
||||
} else {
|
||||
} else if (prevProps.spoiler) {
|
||||
this.autosuggestTextarea.textarea.focus();
|
||||
}
|
||||
}
|
||||
|
@ -207,7 +206,7 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
}
|
||||
|
||||
render () {
|
||||
const { intl, onPaste, showSearch } = this.props;
|
||||
const { intl, onPaste, autoFocus } = this.props;
|
||||
const disabled = this.props.isSubmitting;
|
||||
|
||||
let publishText = '';
|
||||
|
@ -257,7 +256,7 @@ class ComposeForm extends ImmutablePureComponent {
|
|||
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
|
||||
onSuggestionSelected={this.onSuggestionSelected}
|
||||
onPaste={onPaste}
|
||||
autoFocus={!showSearch && !isMobile(window.innerWidth)}
|
||||
autoFocus={autoFocus}
|
||||
>
|
||||
<EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />
|
||||
|
||||
|
|
|
@ -165,6 +165,7 @@ 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>
|
||||
|
|
|
@ -123,27 +123,24 @@ class Search extends React.PureComponent {
|
|||
|
||||
return (
|
||||
<div className='search'>
|
||||
<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>
|
||||
<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}
|
||||
/>
|
||||
|
||||
<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}>
|
||||
<Overlay show={expanded && !hasValue} placement='bottom' target={this} container={this}>
|
||||
<SearchPopout />
|
||||
</Overlay>
|
||||
</div>
|
||||
|
|
|
@ -24,7 +24,6 @@ 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,
|
||||
});
|
||||
|
|
|
@ -18,6 +18,7 @@ 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' },
|
||||
|
@ -115,7 +116,7 @@ class Compose extends React.PureComponent {
|
|||
<div className='drawer__inner' onFocus={this.onFocus}>
|
||||
<NavigationContainer onClose={this.onBlur} />
|
||||
|
||||
<ComposeFormContainer />
|
||||
<ComposeFormContainer autoFocus={!isMobile(window.innerWidth)} />
|
||||
|
||||
<div className='drawer__inner__mastodon'>
|
||||
<img alt='' draggable='false' src={mascot || elephantUIPlane} />
|
||||
|
|
|
@ -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');
|
||||
};
|
||||
}
|
||||
|
|
|
@ -24,16 +24,6 @@ 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 {
|
||||
|
@ -78,12 +68,22 @@ class Explore extends React.PureComponent {
|
|||
{isSearching ? (
|
||||
<SearchResults />
|
||||
) : (
|
||||
<React.Fragment>
|
||||
<>
|
||||
<div className='account__section-headline'>
|
||||
<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>}
|
||||
<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>
|
||||
)}
|
||||
</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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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} 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} active={following} 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>
|
||||
);
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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.handleLayouteChange);
|
||||
this.mediaQuery.removeListener(this.handleLayoutChange);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -89,4 +89,4 @@ class DisabledAccountBanner extends React.PureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 with hearing loss' />;
|
||||
descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people who are hard of hearing' />;
|
||||
} else if (media.get('type') === 'video') {
|
||||
descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people with hearing loss or visual impairment' />;
|
||||
descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people who are deaf, hard of hearing, blind or have low vision' />;
|
||||
} else {
|
||||
descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for the visually impaired' />;
|
||||
descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for people who are blind or have low vision' />;
|
||||
}
|
||||
|
||||
let ocrMessage = '';
|
||||
|
|
|
@ -91,4 +91,4 @@ class LinkFooter extends React.PureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ export class WrappedRoute extends React.Component {
|
|||
return {
|
||||
hasError: true,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
state = {
|
||||
hasError: false,
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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} منشور}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
@ -257,7 +262,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 cuenta nun tea bloquiada, ye posible que'l personal del dominiu {domain} quiera revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
|
||||
"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.",
|
||||
"footer.about": "Tocante a",
|
||||
"footer.directory": "Direutoriu de perfiles",
|
||||
"footer.get_app": "Consiguir l'aplicación",
|
||||
|
@ -617,13 +622,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": "Descripción pa persones con perda auditiva",
|
||||
"upload_form.description": "Descripción pa persones con discapacidá visual",
|
||||
"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.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": "Descripción pa persones con perda auditiva o discapacidá visual",
|
||||
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
|
||||
"upload_modal.analyzing_picture": "Analizando la semeya…",
|
||||
"upload_modal.apply": "Aplicar",
|
||||
"upload_modal.applying": "Aplicando…",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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} допісу}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася",
|
||||
|
|
|
@ -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,17 +51,18 @@
|
|||
"account.muted": "Заглушено",
|
||||
"account.open_original_page": "Отваряне на оригиналната страница",
|
||||
"account.posts": "Публикации",
|
||||
"account.posts_with_replies": "С отговори",
|
||||
"account.posts_with_replies": "Публикации и отговори",
|
||||
"account.report": "Докладване на @{name}",
|
||||
"account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване",
|
||||
"account.share": "Изпращане на профила на @{name}",
|
||||
"account.requested_follow": "{name} поиска да ви последва",
|
||||
"account.share": "Споделяне на профила на @{name}",
|
||||
"account.show_reblogs": "Показване на споделяния от @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
|
||||
"account.unblock": "Отблокиране на @{name}",
|
||||
"account.unblock_domain": "Отблокиране на домейн {domain}",
|
||||
"account.unblock_short": "Отблокирване",
|
||||
"account.unendorse": "Не включвайте в профила",
|
||||
"account.unfollow": "Не следвай",
|
||||
"account.unfollow": "Без следване",
|
||||
"account.unmute": "Без заглушаване на @{name}",
|
||||
"account.unmute_notifications": "Без заглушаване на известия от @{name}",
|
||||
"account.unmute_short": "Без заглушаване",
|
||||
|
@ -142,11 +143,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": "Блокиране",
|
||||
|
@ -178,13 +179,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": "Тези публикации от този и други сървъри в децентрализираната мрежа набират популярност сега на този сървър.",
|
||||
|
@ -194,7 +195,7 @@
|
|||
"embed.preview": "Ето как ще изглежда:",
|
||||
"emoji_button.activity": "Дейност",
|
||||
"emoji_button.clear": "Изчистване",
|
||||
"emoji_button.custom": "Персонализирани",
|
||||
"emoji_button.custom": "Персонализирано",
|
||||
"emoji_button.flags": "Знамена",
|
||||
"emoji_button.food": "Храна и напитки",
|
||||
"emoji_button.label": "Вмъкване на емоджи",
|
||||
|
@ -207,9 +208,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": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
|
||||
|
@ -221,7 +222,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": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
|
||||
|
@ -260,7 +265,7 @@
|
|||
"follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.",
|
||||
"footer.about": "Относно",
|
||||
"footer.directory": "Директория на профилите",
|
||||
"footer.get_app": "Изтегли приложението",
|
||||
"footer.get_app": "Вземане на приложението",
|
||||
"footer.invite": "Поканване на хора",
|
||||
"footer.keyboard_shortcuts": "Клавишни комбинации",
|
||||
"footer.privacy_policy": "Политика за поверителност",
|
||||
|
@ -284,7 +289,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": "На различен сървър",
|
||||
|
@ -311,10 +316,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": "Отваряне на профила ви",
|
||||
|
@ -339,7 +344,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": "Промяна на списъка",
|
||||
|
@ -381,13 +386,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} ви спомена",
|
||||
|
@ -416,7 +421,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": "Любими",
|
||||
|
@ -436,7 +441,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": "Гласувахте за този отговор",
|
||||
|
@ -451,21 +456,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": "Отказ",
|
||||
|
@ -505,7 +510,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": "Спам",
|
||||
|
@ -524,7 +529,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 дни (дейните месечно потребители)",
|
||||
|
@ -537,7 +542,7 @@
|
|||
"sign_in_banner.sign_in": "Вход",
|
||||
"sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, любимо, споделяне и отговаряне на публикации или взаимодействие от акаунта ви на друг сървър.",
|
||||
"status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
|
||||
"status.admin_status": "Open this status in the moderation interface",
|
||||
"status.admin_status": "Отваряне на тази публикация в интерфейс на модериране",
|
||||
"status.block": "Блокиране на @{name}",
|
||||
"status.bookmark": "Отмятане",
|
||||
"status.cancel_reblog_private": "Отсподеляне",
|
||||
|
@ -587,20 +592,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} от други сървъри не се показват.",
|
||||
|
@ -619,12 +624,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": "Избор на образ",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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} টুট}}",
|
||||
|
@ -70,7 +71,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": "New users",
|
||||
"admin.dashboard.retention.cohort_size": "নতুন ব্যবহারকারী",
|
||||
"alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
|
||||
"alert.rate_limited.title": "হার সীমিত",
|
||||
"alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
|
||||
|
@ -123,7 +124,7 @@
|
|||
"community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
|
||||
"community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
|
||||
"community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
|
||||
"compose.language.change": "Change language",
|
||||
"compose.language.change": "ভাষা পরিবর্তন করুন",
|
||||
"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.",
|
||||
|
@ -137,7 +138,7 @@
|
|||
"compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
|
||||
"compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
|
||||
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
|
||||
"compose_form.publish": "Publish",
|
||||
"compose_form.publish": "প্রকাশ করুন",
|
||||
"compose_form.publish_form": "Publish",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "Save changes",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
@ -269,7 +274,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": "এগুলো সব",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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ù}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -104,7 +105,7 @@
|
|||
"column.direct": "Missatges directes",
|
||||
"column.directory": "Navega pels perfils",
|
||||
"column.domain_blocks": "Dominis blocats",
|
||||
"column.favourites": "Preferits",
|
||||
"column.favourites": "Favorits",
|
||||
"column.follow_requests": "Peticions de seguir-te",
|
||||
"column.home": "Inici",
|
||||
"column.lists": "Llistes",
|
||||
|
@ -126,8 +127,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": "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.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.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?",
|
||||
|
@ -137,11 +138,11 @@
|
|||
"compose_form.poll.remove_option": "Elimina aquesta opció",
|
||||
"compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
|
||||
"compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
|
||||
"compose_form.publish": "Publica",
|
||||
"compose_form.publish": "Tut",
|
||||
"compose_form.publish_form": "Publica",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.publish_loud": "Tut!",
|
||||
"compose_form.save_changes": "Desa els canvis",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Marca el contingut com a sensible} other {Marca el contingut com a sensible}}",
|
||||
"compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia 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",
|
||||
|
@ -187,10 +188,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": "Aquestes publicacions d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
|
||||
"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_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 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.",
|
||||
"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.",
|
||||
"embed.preview": "Aquest aspecte tindrà:",
|
||||
"emoji_button.activity": "Activitat",
|
||||
"emoji_button.clear": "Neteja",
|
||||
|
@ -213,17 +214,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 teniu missatges directes. Quan n'envieu o en rebeu, sortiran aquí.",
|
||||
"empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis un, sortirà 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 publicació. Quan ho facis, apareixerà aquí.",
|
||||
"empty_column.favourited_statuses": "Encara no has afavorit cap tut. 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 noves publicacions, apareixeran aquí.",
|
||||
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, 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í.",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
@ -251,7 +256,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 una publicació",
|
||||
"filter_modal.title.status": "Filtra un tut",
|
||||
"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!",
|
||||
|
@ -286,12 +291,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 aquesta publicació.",
|
||||
"interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquest tut.",
|
||||
"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 la publicació de {name}",
|
||||
"interaction_modal.title.favourite": "Marca el tut 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}",
|
||||
|
@ -300,7 +305,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 la publicació",
|
||||
"keyboard_shortcuts.boost": "Impulsa el tut",
|
||||
"keyboard_shortcuts.column": "Centra la columna",
|
||||
"keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
|
||||
"keyboard_shortcuts.description": "Descripció",
|
||||
|
@ -319,10 +324,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 el contingut",
|
||||
"keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
|
||||
"keyboard_shortcuts.open_media": "Obre mèdia",
|
||||
"keyboard_shortcuts.pinned": "Obre la llista de tuts fixats",
|
||||
"keyboard_shortcuts.profile": "Obre el perfil de l'autor",
|
||||
"keyboard_shortcuts.reply": "Respon a la publicació",
|
||||
"keyboard_shortcuts.reply": "Respon al tut",
|
||||
"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",
|
||||
|
@ -401,7 +406,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": "Preferits:",
|
||||
"notifications.column_settings.favourite": "Favorits:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
|
||||
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
|
||||
"notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
|
||||
|
@ -477,7 +482,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": "publicació",
|
||||
"report.category.title_status": "tut",
|
||||
"report.close": "Fet",
|
||||
"report.comment.title": "Hi ha res més que creguis que hauríem de saber?",
|
||||
"report.forward": "Reenvia a {target}",
|
||||
|
@ -497,7 +502,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 publicació que doni suport a aquest informe?",
|
||||
"report.statuses.title": "Hi ha cap tut 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:",
|
||||
|
@ -506,7 +511,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} publicació adjunta} other {{count} publicacions adjuntes}}",
|
||||
"report_notification.attached_statuses": "{count, plural, one {{count} tut} other {{count} tuts}} adjunts",
|
||||
"report_notification.categories.other": "Altres",
|
||||
"report_notification.categories.spam": "Brossa",
|
||||
"report_notification.categories.violation": "Violació de norma",
|
||||
|
@ -514,17 +519,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 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.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.hashtag": "etiqueta",
|
||||
"search_popout.tips.status": "publicació",
|
||||
"search_popout.tips.status": "tut",
|
||||
"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": "Publicacions",
|
||||
"search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
|
||||
"search_results.statuses": "Tuts",
|
||||
"search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
|
||||
"search_results.title": "Cerca de {q}",
|
||||
"search_results.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)",
|
||||
|
@ -537,12 +542,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": "Obre aquesta publicació a la interfície de moderació",
|
||||
"status.admin_status": "Obrir aquest tut 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 aquesta publicació",
|
||||
"status.copy": "Copia l'enllaç a la publicació",
|
||||
"status.cannot_reblog": "No es pot impulsar aquest tut",
|
||||
"status.copy": "Copia l'enllaç al tut",
|
||||
"status.delete": "Elimina",
|
||||
"status.detailed_status": "Vista detallada de la conversa",
|
||||
"status.direct": "Missatge directe a @{name}",
|
||||
|
@ -550,10 +555,10 @@
|
|||
"status.edited": "Editat {date}",
|
||||
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
|
||||
"status.embed": "Incrusta",
|
||||
"status.favourite": "Preferit",
|
||||
"status.filter": "Filtra aquesta publicació",
|
||||
"status.favourite": "Favorit",
|
||||
"status.filter": "Filtra aquest tut",
|
||||
"status.filtered": "Filtrada",
|
||||
"status.hide": "Amaga la publicació",
|
||||
"status.hide": "Amaga el tut",
|
||||
"status.history.created": "creat per {name} {date}",
|
||||
"status.history.edited": "editat per {name} {date}",
|
||||
"status.load_more": "Carrega'n més",
|
||||
|
@ -562,9 +567,9 @@
|
|||
"status.more": "Més",
|
||||
"status.mute": "Silencia @{name}",
|
||||
"status.mute_conversation": "Silencia la conversa",
|
||||
"status.open": "Amplia la publicació",
|
||||
"status.open": "Amplia el tut",
|
||||
"status.pin": "Fixa en el perfil",
|
||||
"status.pinned": "Publicació fixada",
|
||||
"status.pinned": "Tut fixat",
|
||||
"status.read_more": "Més informació",
|
||||
"status.reblog": "Impulsa",
|
||||
"status.reblog_private": "Impulsa amb la visibilitat original",
|
||||
|
@ -589,7 +594,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 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.lead": "Només els tuts en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre tuts en totes les llengües.",
|
||||
"subscribed_languages.save": "Desa els canvis",
|
||||
"subscribed_languages.target": "Canvia les llengües subscrites per a {target}",
|
||||
"suggestions.dismiss": "Ignora el suggeriment",
|
||||
|
@ -610,27 +615,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": "Descripció per a persones amb discapacitat auditiva",
|
||||
"upload_form.description": "Descripció per a persones amb discapacitat visual",
|
||||
"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.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": "Descripció per a persones amb discapacitat auditiva o amb discapacitat visual",
|
||||
"upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició",
|
||||
"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": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
|
||||
"upload_modal.description_placeholder": "Setze jutges d'un jutjat mengen fetge d'un penjat",
|
||||
"upload_modal.detect_text": "Detecta el text de la imatge",
|
||||
"upload_modal.edit_media": "Edita el contingut",
|
||||
"upload_modal.edit_media": "Edita el Mèdia",
|
||||
"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})",
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
"about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.",
|
||||
"about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.",
|
||||
"about.domain_blocks.silenced.title": "سنووردار",
|
||||
"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.explanation": "هیچ داتایەک لەم سێرڤەرەوە پرۆسێس ناکرێت، هەڵناگیرێت یان ئاڵوگۆڕ ناکرێت، ئەمەش وا دەکات هیچ کارلێکێک یان پەیوەندییەک لەگەڵ بەکارهێنەران لەم سێرڤەرەوە مەحاڵ بێت.",
|
||||
"about.domain_blocks.suspended.title": "هەڵپەسێردراوە",
|
||||
"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",
|
||||
"about.not_available": "ئەم زانیاریانە لەسەر ئەم سێرڤەرە بەردەست نەکراون.",
|
||||
"about.powered_by": "سۆشیال میدیای لامەرکەزی کە لەلایەن {mastodon} ەوە بەهێز دەکرێت",
|
||||
"about.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": "Withdraw follow request",
|
||||
"account.cancel_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": "Last post on {date}",
|
||||
"account.featured_tags.last_status_never": "No posts",
|
||||
"account.featured_tags.title": "{name}'s featured hashtags",
|
||||
"account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
|
||||
"account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
|
||||
"account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
|
||||
"account.follow": "شوێنکەوتن",
|
||||
"account.followers": "شوێنکەوتووان",
|
||||
"account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
|
||||
|
@ -37,23 +37,24 @@
|
|||
"account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
|
||||
"account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
|
||||
"account.follows_you": "شوێنکەوتووەکانت",
|
||||
"account.go_to_profile": "Go to profile",
|
||||
"account.go_to_profile": "بڕۆ بۆ پڕۆفایلی",
|
||||
"account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
|
||||
"account.joined_short": "Joined",
|
||||
"account.languages": "Change subscribed languages",
|
||||
"account.joined_short": "بەشداری کردووە",
|
||||
"account.languages": "گۆڕینی زمانە بەشداربووەکان",
|
||||
"account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
|
||||
"account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
|
||||
"account.media": "میدیا",
|
||||
"account.mention": "ئاماژە @{name}",
|
||||
"account.moved_to": "{name} has indicated that their new account is now:",
|
||||
"account.moved_to": "{name} ئاماژەی بەوە کردووە کە ئەکاونتە نوێیەکەیان ئێستا:",
|
||||
"account.mute": "بێدەنگکردن @{name}",
|
||||
"account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
|
||||
"account.muted": "بێ دەنگ",
|
||||
"account.open_original_page": "Open original page",
|
||||
"account.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}}",
|
||||
|
@ -77,27 +78,27 @@
|
|||
"alert.unexpected.title": "تەححح!",
|
||||
"announcement.announcement": "بانگەواز",
|
||||
"attachments_list.unprocessed": "(unprocessed)",
|
||||
"audio.hide": "Hide audio",
|
||||
"audio.hide": "شاردنەوەی دەنگ",
|
||||
"autosuggest_hashtag.per_week": "{count} هەرهەفتە",
|
||||
"boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
|
||||
"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.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە",
|
||||
"bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.",
|
||||
"bundle_column_error.error.title": "ئای نا!",
|
||||
"bundle_column_error.network.body": "لە کاتی هەوڵدان بۆ بارکردنی ئەم لاپەڕەیە هەڵەیەک ڕوویدا. ئەمەش دەتوانێت بەهۆی کێشەیەکی کاتی هێڵی ئینتەرنێتەکەت یان ئەم سێرڤەرە بێت.",
|
||||
"bundle_column_error.network.title": "هەڵەی تۆڕ",
|
||||
"bundle_column_error.retry": "دووبارە هەوڵبدە",
|
||||
"bundle_column_error.return": "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_column_error.return": "بگەڕێرەوە ماڵەوە",
|
||||
"bundle_column_error.routing.body": "پەیجی داواکراو ناتوانرێت بدۆزرێتەوە. ئایا دڵنیای کە URL ی ناو ناونیشانەکان ڕاستە?",
|
||||
"bundle_column_error.routing.title": "٤٠٤",
|
||||
"bundle_modal_error.close": "داخستن",
|
||||
"bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
|
||||
"bundle_modal_error.retry": "دووبارە تاقی بکەوە",
|
||||
"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",
|
||||
"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": "دەربارە",
|
||||
"column.blocks": "بەکارهێنەرە بلۆککراوەکان",
|
||||
"column.bookmarks": "نیشانەکان",
|
||||
"column.community": "هێڵی کاتی ناوخۆیی",
|
||||
|
@ -123,8 +124,8 @@
|
|||
"community.column_settings.local_only": "تەنها خۆماڵی",
|
||||
"community.column_settings.media_only": "تەنها میدیا",
|
||||
"community.column_settings.remote_only": "تەنها بۆ دوور",
|
||||
"compose.language.change": "Change language",
|
||||
"compose.language.search": "Search languages...",
|
||||
"compose.language.change": "گۆڕینی زمان",
|
||||
"compose.language.search": "گەڕان بە زمانەکان...",
|
||||
"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": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
|
||||
|
@ -137,8 +138,8 @@
|
|||
"compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
|
||||
"compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
|
||||
"compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
|
||||
"compose_form.publish": "Publish",
|
||||
"compose_form.publish_form": "Publish",
|
||||
"compose_form.publish": "بڵاوی بکەوە",
|
||||
"compose_form.publish_form": "بڵاوی بکەوە",
|
||||
"compose_form.publish_loud": "{publish}!",
|
||||
"compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
|
||||
"compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
|
||||
|
@ -151,8 +152,8 @@
|
|||
"confirmations.block.block_and_report": "بلۆک & گوزارشت",
|
||||
"confirmations.block.confirm": "بلۆک",
|
||||
"confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
|
||||
"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.cancel_follow_request.confirm": "داواکاری کشانەوە",
|
||||
"confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟",
|
||||
"confirmations.delete.confirm": "سڕینەوە",
|
||||
"confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
|
||||
"confirmations.delete_list.confirm": "سڕینەوە",
|
||||
|
@ -176,20 +177,20 @@
|
|||
"conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
|
||||
"conversation.open": "نیشاندان گفتوگۆ",
|
||||
"conversation.with": "لەگەڵ{names}",
|
||||
"copypaste.copied": "Copied",
|
||||
"copypaste.copy": "Copy",
|
||||
"copypaste.copied": "کۆپی کراوە",
|
||||
"copypaste.copy": "ڕوونووس",
|
||||
"directory.federated": "لە ڕاژەکانی ناسراو",
|
||||
"directory.local": "تەنها لە {domain}",
|
||||
"directory.new_arrivals": "تازە گەیشتنەکان",
|
||||
"directory.recently_active": "بەم دواییانە چالاکە",
|
||||
"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.",
|
||||
"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": "ئەمانە دوایین پۆستە گشتیەکانن لە کەسانی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی کە ئەم سێرڤەرە دەزانێت.",
|
||||
"embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
|
||||
"embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
|
||||
"emoji_button.activity": "چالاکی",
|
||||
|
@ -235,12 +236,16 @@
|
|||
"errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
|
||||
"errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
|
||||
"explore.search_results": "ئەنجامەکانی گەڕان",
|
||||
"explore.suggested_follows": "For you",
|
||||
"explore.title": "گەڕان",
|
||||
"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}.",
|
||||
"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.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}.",
|
||||
|
@ -528,14 +533,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": "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.",
|
||||
"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": "چوونەژوورەوە بۆ فۆڵۆوکردنی پڕۆفایلی یان هاشتاگەکان، دڵخوازکردن، هاوبەشکردن و وەڵامدانەوەی پۆستەکان، یان کارلێککردن لە ئەکاونتەکەتەوە لەسەر سێرڤەرێکی جیاواز.",
|
||||
"status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
|
||||
"status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
|
||||
"status.block": "@{name} ئاستەنگ بکە",
|
||||
|
@ -551,9 +556,9 @@
|
|||
"status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
|
||||
"status.embed": "نیشتەجێ بکە",
|
||||
"status.favourite": "دڵخواز",
|
||||
"status.filter": "Filter this post",
|
||||
"status.filter": "ئەم پۆستە فلتەر بکە",
|
||||
"status.filtered": "پاڵاوتن",
|
||||
"status.hide": "Hide toot",
|
||||
"status.hide": "شاردنەوەی توت",
|
||||
"status.history.created": "{name} دروستکراوە لە{date}",
|
||||
"status.history.edited": "{name} دروستکاریکراوە لە{date}",
|
||||
"status.load_more": "زیاتر بار بکە",
|
||||
|
@ -572,26 +577,26 @@
|
|||
"status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
|
||||
"status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
|
||||
"status.remove_bookmark": "لابردنی نیشانه",
|
||||
"status.replied_to": "Replied to {name}",
|
||||
"status.replied_to": "لە وەڵامدا بۆ {name}",
|
||||
"status.reply": "وەڵام",
|
||||
"status.replyAll": "بە نووسراوە وەڵام بدەوە",
|
||||
"status.report": "گوزارشت @{name}",
|
||||
"status.sensitive_warning": "ناوەڕۆکی هەستیار",
|
||||
"status.share": "هاوبەشی بکە",
|
||||
"status.show_filter_reason": "Show anyway",
|
||||
"status.show_filter_reason": "بە هەر حاڵ نیشان بدە",
|
||||
"status.show_less": "کەمتر نیشان بدە",
|
||||
"status.show_less_all": "هەمووی بچووک بکەوە",
|
||||
"status.show_more": "زیاتر نیشان بدە",
|
||||
"status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
|
||||
"status.show_original": "Show original",
|
||||
"status.translate": "Translate",
|
||||
"status.translated_from_with": "Translated from {lang} using {provider}",
|
||||
"status.show_original": "پیشاندانی شێوهی ڕاستهقینه",
|
||||
"status.translate": "وەریبگێرە",
|
||||
"status.translated_from_with": "لە {lang} وەرگێڕدراوە بە بەکارهێنانی {provider}",
|
||||
"status.uncached_media_warning": "بەردەست نیە",
|
||||
"status.unmute_conversation": "گفتوگۆی بێدەنگ",
|
||||
"status.unpin": "لە سەرەوە لایبە",
|
||||
"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}",
|
||||
"subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.",
|
||||
"subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان",
|
||||
"subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}",
|
||||
"suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
|
||||
"suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
|
||||
"tabs_bar.federated_timeline": "گشتی",
|
||||
|
@ -635,7 +640,7 @@
|
|||
"upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…",
|
||||
"upload_modal.preview_label": "پێشبینین ({ratio})",
|
||||
"upload_progress.label": "بار دەکرێت...",
|
||||
"upload_progress.processing": "Processing…",
|
||||
"upload_progress.processing": "جێبەجێکردن...",
|
||||
"video.close": "داخستنی ڤیدیۆ",
|
||||
"video.download": "داگرتنی فایل",
|
||||
"video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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ů}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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.",
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
"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}}}",
|
||||
|
@ -235,7 +236,11 @@
|
|||
"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
Loading…
Reference in a new issue