Browse Source

Merge branch 'main' into glitch-soc/merge-upstream

Conflicts:
- `.env.production.sample`:
  Upstream added new configuration options, uncommented by default.
  Commented them.
- `Gemfile.lock`:
  Upstream updated dependencies textually close to glitch-soc-specific
  dependencies.
  Updated those upstream dependencies.
master
Claire 1 month ago
parent
commit
e855df149b
  1. 335
      .circleci/config.yml
  2. 5
      .codeclimate.yml
  3. 10
      .env.production.sample
  4. 4
      Gemfile
  5. 18
      Gemfile.lock
  6. 9
      app/controllers/api/v1/accounts_controller.rb
  7. 15
      app/javascript/mastodon/features/notifications/components/column_settings.js
  8. 9
      app/javascript/mastodon/locales/af.json
  9. 25
      app/javascript/mastodon/locales/ar.json
  10. 9
      app/javascript/mastodon/locales/ast.json
  11. 9
      app/javascript/mastodon/locales/bg.json
  12. 43
      app/javascript/mastodon/locales/bn.json
  13. 65
      app/javascript/mastodon/locales/br.json
  14. 11
      app/javascript/mastodon/locales/ca.json
  15. 9
      app/javascript/mastodon/locales/co.json
  16. 15
      app/javascript/mastodon/locales/cs.json
  17. 17
      app/javascript/mastodon/locales/cy.json
  18. 11
      app/javascript/mastodon/locales/da.json
  19. 19
      app/javascript/mastodon/locales/de.json
  20. 60
      app/javascript/mastodon/locales/defaultMessages.json
  21. 9
      app/javascript/mastodon/locales/el.json
  22. 9
      app/javascript/mastodon/locales/en.json
  23. 39
      app/javascript/mastodon/locales/eo.json
  24. 9
      app/javascript/mastodon/locales/es-AR.json
  25. 11
      app/javascript/mastodon/locales/es-MX.json
  26. 25
      app/javascript/mastodon/locales/es.json
  27. 9
      app/javascript/mastodon/locales/et.json
  28. 9
      app/javascript/mastodon/locales/eu.json
  29. 423
      app/javascript/mastodon/locales/fa.json
  30. 225
      app/javascript/mastodon/locales/fi.json
  31. 65
      app/javascript/mastodon/locales/fr.json
  32. 9
      app/javascript/mastodon/locales/ga.json
  33. 19
      app/javascript/mastodon/locales/gd.json
  34. 11
      app/javascript/mastodon/locales/gl.json
  35. 41
      app/javascript/mastodon/locales/he.json
  36. 9
      app/javascript/mastodon/locales/hi.json
  37. 9
      app/javascript/mastodon/locales/hr.json
  38. 21
      app/javascript/mastodon/locales/hu.json
  39. 111
      app/javascript/mastodon/locales/hy.json
  40. 29
      app/javascript/mastodon/locales/id.json
  41. 9
      app/javascript/mastodon/locales/io.json
  42. 75
      app/javascript/mastodon/locales/is.json
  43. 11
      app/javascript/mastodon/locales/it.json
  44. 9
      app/javascript/mastodon/locales/ja.json
  45. 9
      app/javascript/mastodon/locales/ka.json
  46. 39
      app/javascript/mastodon/locales/kab.json
  47. 9
      app/javascript/mastodon/locales/kk.json
  48. 484
      app/javascript/mastodon/locales/kmr.json
  49. 9
      app/javascript/mastodon/locales/kn.json
  50. 85
      app/javascript/mastodon/locales/ko.json
  51. 9
      app/javascript/mastodon/locales/ku.json
  52. 9
      app/javascript/mastodon/locales/kw.json
  53. 9
      app/javascript/mastodon/locales/lt.json
  54. 755
      app/javascript/mastodon/locales/lv.json
  55. 9
      app/javascript/mastodon/locales/mk.json
  56. 11
      app/javascript/mastodon/locales/ml.json
  57. 9
      app/javascript/mastodon/locales/mr.json
  58. 487
      app/javascript/mastodon/locales/ms.json
  59. 11
      app/javascript/mastodon/locales/nl.json
  60. 49
      app/javascript/mastodon/locales/nn.json
  61. 55
      app/javascript/mastodon/locales/no.json
  62. 9
      app/javascript/mastodon/locales/oc.json
  63. 9
      app/javascript/mastodon/locales/pa.json
  64. 11
      app/javascript/mastodon/locales/pl.json
  65. 401
      app/javascript/mastodon/locales/pt-BR.json
  66. 11
      app/javascript/mastodon/locales/pt-PT.json
  67. 451
      app/javascript/mastodon/locales/ro.json
  68. 55
      app/javascript/mastodon/locales/ru.json
  69. 9
      app/javascript/mastodon/locales/sa.json
  70. 11
      app/javascript/mastodon/locales/sc.json
  71. 113
      app/javascript/mastodon/locales/si.json
  72. 105
      app/javascript/mastodon/locales/sk.json
  73. 11
      app/javascript/mastodon/locales/sl.json
  74. 9
      app/javascript/mastodon/locales/sq.json
  75. 9
      app/javascript/mastodon/locales/sr-Latn.json
  76. 39
      app/javascript/mastodon/locales/sr.json
  77. 15
      app/javascript/mastodon/locales/sv.json
  78. 9
      app/javascript/mastodon/locales/szl.json
  79. 9
      app/javascript/mastodon/locales/ta.json
  80. 9
      app/javascript/mastodon/locales/tai.json
  81. 9
      app/javascript/mastodon/locales/te.json
  82. 25
      app/javascript/mastodon/locales/th.json
  83. 103
      app/javascript/mastodon/locales/tr.json
  84. 9
      app/javascript/mastodon/locales/tt.json
  85. 9
      app/javascript/mastodon/locales/ug.json
  86. 17
      app/javascript/mastodon/locales/uk.json
  87. 175
      app/javascript/mastodon/locales/ur.json
  88. 45
      app/javascript/mastodon/locales/vi.json
  89. 2
      app/javascript/mastodon/locales/whitelist_kmr.json
  90. 9
      app/javascript/mastodon/locales/zgh.json
  91. 15
      app/javascript/mastodon/locales/zh-CN.json
  92. 25
      app/javascript/mastodon/locales/zh-HK.json
  93. 97
      app/javascript/mastodon/locales/zh-TW.json
  94. 8
      app/javascript/styles/mastodon/admin.scss
  95. 4
      app/javascript/styles/mastodon/dashboard.scss
  96. 4
      app/models/concerns/account_interactions.rb
  97. 12
      app/models/form/account_batch.rb
  98. 29
      app/services/activitypub/fetch_remote_status_service.rb
  99. 5
      app/services/fetch_oembed_service.rb
  100. 25
      app/services/remove_from_followers_service.rb

335
.circleci/config.yml

@ -1,255 +1,152 @@
version: 2
version: 2.1
aliases:
- &defaults
orbs:
ruby: circleci/ruby@1.2.0
node: circleci/node@4.7.0
executors:
default:
parameters:
ruby-version:
type: string
docker:
- image: circleci/ruby:2.7-buster-node
environment: &ruby_environment
- image: cimg/ruby:<< parameters.ruby-version >>
environment:
BUNDLE_JOBS: 3
BUNDLE_RETRY: 3
BUNDLE_APP_CONFIG: ./.bundle/
BUNDLE_PATH: ./vendor/bundle/
CONTINUOUS_INTEGRATION: true
DB_HOST: localhost
DB_USER: root
RAILS_ENV: test
ALLOW_NOPAM: true
CONTINUOUS_INTEGRATION: true
DISABLE_SIMPLECOV: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
working_directory: ~/projects/mastodon/
- &attach_workspace
attach_workspace:
at: ~/projects/
- &persist_to_workspace
persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/
- &restore_ruby_dependencies
restore_cache:
keys:
- v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
- v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-
- v3-ruby-dependencies-
RAILS_ENV: test
- image: cimg/postgres:12.7
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: circleci/redis:5-alpine
- &install_steps
commands:
install-system-dependencies:
steps:
- checkout
- *attach_workspace
- restore_cache:
keys:
- v2-node-dependencies-{{ checksum "yarn.lock" }}
- v2-node-dependencies-
- run:
name: Install yarn dependencies
command: yarn install --frozen-lockfile
- save_cache:
key: v2-node-dependencies-{{ checksum "yarn.lock" }}
paths:
- ./node_modules/
- *persist_to_workspace
- &install_system_dependencies
run:
name: Install system dependencies
command: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
- &install_ruby_dependencies
steps:
- *attach_workspace
- *install_system_dependencies
- run:
name: Set Ruby version
command: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version
- *restore_ruby_dependencies
- run:
name: Set bundler settings
command: |
bundle config --local clean 'true'
bundle config --local deployment 'true'
bundle config --local with 'pam_authentication'
bundle config --local without 'development production'
bundle config --local frozen 'true'
bundle config --local path $BUNDLE_PATH
- run:
name: Install bundler dependencies
command: bundle check || (bundle install && bundle clean)
- save_cache:
key: v3-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
paths:
- ./.bundle/
- ./vendor/bundle/
- persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/.bundle/
- ./mastodon/vendor/bundle/
name: Install system dependencies
command: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
install-ruby-dependencies:
parameters:
ruby-version:
type: string
steps:
- run:
command: |
bundle config clean 'true'
bundle config frozen 'true'
bundle config without 'development production'
name: Set bundler settings
- ruby/install-deps:
bundler-version: '2.2.29'
key: ruby<< parameters.ruby-version >>-gems-v1
wait-db:
steps:
- run:
command: dockerize -wait tcp://localhost:5432 -wait tcp://localhost:6379 -timeout 1m
name: Wait for PostgreSQL and Redis
- &test_steps
parallelism: 4
steps:
- *attach_workspace
- *install_system_dependencies
- run:
name: Install FFMPEG
command: sudo apt-get install -y ffmpeg
- run:
name: Load database schema
command: ./bin/rails db:create db:schema:load db:seed
- run:
name: Run rspec in parallel
command: |
bundle exec rspec --profile 10 \
--format RspecJunitFormatter \
--out test_results/rspec.xml \
--format progress \
$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
- store_test_results:
path: test_results
jobs:
install:
<<: *defaults
<<: *install_steps
install-ruby2.7:
<<: *defaults
<<: *install_ruby_dependencies
install-ruby2.6:
<<: *defaults
docker:
- image: circleci/ruby:2.6-buster-node
environment: *ruby_environment
<<: *install_ruby_dependencies
install-ruby3.0:
<<: *defaults
docker:
- image: circleci/ruby:3.0-buster-node
environment: *ruby_environment
<<: *install_ruby_dependencies
build:
<<: *defaults
docker:
- image: cimg/ruby:2.7-node
environment:
RAILS_ENV: test
steps:
- *attach_workspace
- *install_system_dependencies
- checkout
- install-system-dependencies
- install-ruby-dependencies:
ruby-version: '2.7'
- node/install-packages:
cache-version: v1
pkg-manager: yarn
- run:
name: Precompile assets
command: ./bin/rails assets:precompile
name: Precompile assets
- persist_to_workspace:
root: ~/projects/
paths:
- ./mastodon/public/assets
- ./mastodon/public/packs-test/
- public/assets
- public/packs-test
root: .
test:
parameters:
ruby-version:
type: string
executor:
name: default
ruby-version: << parameters.ruby-version >>
environment:
ALLOW_NOPAM: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
parallelism: 4
steps:
- checkout
- install-system-dependencies
- run:
command: sudo apt-get install -y ffmpeg imagemagick libpam-dev
name: Install additional system dependencies
- run:
command: bundle config with 'pam_authentication'
name: Enable PAM authentication
- install-ruby-dependencies:
ruby-version: << parameters.ruby-version >>
- attach_workspace:
at: .
- wait-db
- run:
command: ./bin/rails db:create db:schema:load db:seed
name: Load database schema
- ruby/rspec-test
test-migrations:
<<: *defaults
docker:
- image: circleci/ruby:2.7-buster-node
environment: *ruby_environment
- image: circleci/postgres:12.2
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: circleci/redis:5-alpine
executor:
name: default
ruby-version: '2.7'
steps:
- *attach_workspace
- *install_system_dependencies
- checkout
- install-system-dependencies
- install-ruby-dependencies:
ruby-version: '2.7'
- wait-db
- run:
name: Create database
command: ./bin/rails db:create
name: Create database
- run:
name: Run migrations
command: ./bin/rails db:migrate
test-ruby2.7:
<<: *defaults
docker:
- image: circleci/ruby:2.7-buster-node
environment: *ruby_environment
- image: circleci/postgres:12.2
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: circleci/redis:5-alpine
<<: *test_steps
test-ruby2.6:
<<: *defaults
docker:
- image: circleci/ruby:2.6-buster-node
environment: *ruby_environment
- image: circleci/postgres:12.2
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: circleci/redis:5-alpine
<<: *test_steps
test-ruby3.0:
<<: *defaults
docker:
- image: circleci/ruby:3.0-buster-node
environment: *ruby_environment
- image: circleci/postgres:12.2
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: circleci/redis:5-alpine
<<: *test_steps
test-webui:
<<: *defaults
docker:
- image: circleci/node:14-buster
steps:
- *attach_workspace
- run:
name: Run jest
command: yarn test:jest
name: Run migrations
workflows:
version: 2
build-and-test:
jobs:
- install
- install-ruby2.7:
requires:
- install
- install-ruby2.6:
requires:
- install
- install-ruby2.7
- install-ruby3.0:
- build
- test:
matrix:
parameters:
ruby-version:
- '2.7'
- '3.0'
name: test-ruby<< matrix.ruby-version >>
requires:
- install
- install-ruby2.7
- build:
requires:
- install-ruby2.7
- test-migrations:
requires:
- install-ruby2.7
- test-ruby2.7:
requires:
- install-ruby2.7
- build
- test-ruby2.6:
- test-migrations:
requires:
- install-ruby2.6
- build
- test-ruby3.0:
- node/run:
cache-version: v1
name: test-webui
pkg-manager: yarn
requires:
- install-ruby3.0
- build
- test-webui:
requires:
- install
version: lts
yarn-run: test:jest

5
.codeclimate.yml

@ -35,4 +35,7 @@ plugins:
enabled: true
exclude_patterns:
- spec/
- vendor/asset
- vendor/asset/
- app/javascript/mastodon/locales/**/*.json
- config/locales/**/*.yml

10
.env.production.sample

@ -4,6 +4,12 @@
# not demonstrate all available configuration options. Please look at
# https://docs.joinmastodon.org/admin/config/ for the full documentation.
# Note that this file accepts slightly different syntax depending on whether
# you are using `docker-compose` or not. In particular, if you use
# `docker-compose`, the value of each declared variable will be taken verbatim,
# including surrounding quotes.
# See: https://github.com/mastodon/mastodon/issues/16895
# Federation
# ----------
# This identifies your server and cannot be changed safely later
@ -55,7 +61,9 @@ DB_PORT=5432
#ES_ENABLED=true
#ES_HOST=localhost
#ES_PORT=9200
# Authentication for ES (optional)
#ES_USER=elastic
#ES_PASS=password
# Secrets
# -------

4
Gemfile

@ -65,7 +65,6 @@ gem 'nsa', '~> 0.2'
gem 'oj', '~> 3.13'
gem 'ox', '~> 2.14'
gem 'parslet'
gem 'parallel', '~> 1.21'
gem 'posix-spawn'
gem 'pundit', '~> 2.1'
gem 'premailer-rails'
@ -73,7 +72,7 @@ gem 'rack-attack', '~> 6.5'
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
gem 'rails-i18n', '~> 6.0'
gem 'rails-settings-cached', '~> 0.6'
gem 'redis', '~> 4.4', require: ['redis', 'redis/connection/hiredis']
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 2.1'
gem 'ruby-progressbar', '~> 1.11'
@ -123,7 +122,6 @@ group :test do
gem 'rspec-sidekiq', '~> 3.1'
gem 'simplecov', '~> 0.21', require: false
gem 'webmock', '~> 3.14'
gem 'parallel_tests', '~> 3.7'
gem 'rspec_junit_formatter', '~> 0.4'
end

18
Gemfile.lock

@ -316,7 +316,7 @@ GEM
activerecord
kaminari-core (= 1.2.1)
kaminari-core (1.2.1)
kt-paperclip (7.0.0)
kt-paperclip (7.0.1)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
marcel (~> 1.0.1)
@ -356,7 +356,7 @@ GEM
nokogiri (~> 1.10)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2020.0512)
mime-types-data (3.2021.0901)
mini_mime (1.1.2)
mini_portile2 (2.6.1)
minitest (5.14.4)
@ -395,8 +395,6 @@ GEM
orm_adapter (0.5.0)
ox (2.14.5)
parallel (1.21.0)
parallel_tests (3.7.3)
parallel
parser (3.0.2.0)
ast (~> 2.4.1)
parslet (2.0.0)
@ -424,7 +422,7 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.6)
puma (5.5.1)
puma (5.5.2)
nio4r (~> 2.0)
pundit (2.1.1)
activesupport (>= 3.0.0)
@ -482,7 +480,7 @@ GEM
rdf-normalize (0.4.0)
rdf (~> 3.1)
redcarpet (3.5.1)
redis (4.4.0)
redis (4.5.1)
redis-namespace (1.8.1)
redis (>= 3.0.4)
regexp_parser (2.1.1)
@ -531,7 +529,7 @@ GEM
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.12.0)
parser (>= 3.0.1.1)
rubocop-rails (2.12.3)
rubocop-rails (2.12.4)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0)
@ -623,7 +621,7 @@ GEM
unf (~> 0.1.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
tzinfo-data (1.2021.3)
tzinfo-data (1.2021.4)
tzinfo (>= 1.0.0)
unf (0.1.4)
unf_ext
@ -737,8 +735,6 @@ DEPENDENCIES
omniauth-rails_csrf_protection (~> 0.1)
omniauth-saml (~> 1.10)
ox (~> 2.14)
parallel (~> 1.21)
parallel_tests (~> 3.7)
parslet
pg (~> 1.2)
pghero (~> 2.8)
@ -759,7 +755,7 @@ DEPENDENCIES
rails-settings-cached (~> 0.6)
rdf-normalize (~> 0.4)
redcarpet (~> 3.5)
redis (~> 4.4)
redis (~> 4.5)
redis-namespace (~> 1.8)
rqrcode (~> 2.1)
rspec-rails (~> 5.0)

9
app/controllers/api/v1/accounts_controller.rb

@ -1,8 +1,8 @@
# frozen_string_literal: true
class Api::V1::AccountsController < Api::BaseController
before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :block, :unblock, :mute, :unmute]
before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow]
before_action -> { authorize_if_got_token! :read, :'read:accounts' }, except: [:create, :follow, :unfollow, :remove_from_followers, :block, :unblock, :mute, :unmute]
before_action -> { doorkeeper_authorize! :follow, :'write:follows' }, only: [:follow, :unfollow, :remove_from_followers]
before_action -> { doorkeeper_authorize! :follow, :'write:mutes' }, only: [:mute, :unmute]
before_action -> { doorkeeper_authorize! :follow, :'write:blocks' }, only: [:block, :unblock]
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create]
@ -53,6 +53,11 @@ class Api::V1::AccountsController < Api::BaseController
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
end
def remove_from_followers
RemoveFromFollowersService.new.call(current_user.account, @account)
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
end
def unblock
UnblockService.new.call(current_user.account, @account)
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships

15
app/javascript/mastodon/features/notifications/components/column_settings.js

@ -26,11 +26,12 @@ export default class ColumnSettings extends React.PureComponent {
render () {
const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props;
const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;
const unreadMarkersShowStr = <FormattedMessage id='notifications.column_settings.unread_notifications.highlight' defaultMessage='Highlight unread notifications' />;
const filterBarShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show_bar' defaultMessage='Show filter bar' />;
const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;
const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;
const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;
const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;
const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;
const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;
const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');
const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;
@ -57,11 +58,11 @@ export default class ColumnSettings extends React.PureComponent {
<div role='group' aria-labelledby='notifications-unread-markers'>
<span id='notifications-unread-markers' className='column-settings__section'>
<FormattedMessage id='notifications.column_settings.unread_markers.category' defaultMessage='Unread notification markers' />
<FormattedMessage id='notifications.column_settings.unread_notifications.category' defaultMessage='Unread notifications' />
</span>
<div className='column-settings__row'>
<SettingToggle id='unread-notification-markers' prefix='notifications' settings={settings} settingPath={['showUnread']} onChange={onChange} label={filterShowStr} />
<SettingToggle id='unread-notification-markers' prefix='notifications' settings={settings} settingPath={['showUnread']} onChange={onChange} label={unreadMarkersShowStr} />
</div>
</div>
@ -71,7 +72,7 @@ export default class ColumnSettings extends React.PureComponent {
</span>
<div className='column-settings__row'>
<SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />
<SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterBarShowStr} />
<SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />
</div>
</div>

9
app/javascript/mastodon/locales/af.json

@ -47,11 +47,16 @@
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
"account_note.placeholder": "Click to add a note",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "An unexpected error occurred.",
"alert.unexpected.title": "Oops!",
"announcement.announcement": "Announcement",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Are you sure you want to delete this status?",
"confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Hide entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.logout.confirm": "Log out",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "Vote",
"poll.voted": "You voted for this answer",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Adjust status privacy",
@ -454,6 +462,7 @@
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "Analyzing picture…",
"upload_modal.apply": "Apply",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Choose image",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Detect text from picture",

25
app/javascript/mastodon/locales/ar.json

@ -8,7 +8,7 @@
"account.blocked": "محظور",
"account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي",
"account.cancel_follow_request": "إلغاء طلب المتابَعة",
"account.direct": "مراسلة @{name} بشكلة مباشر",
"account.direct": "مراسلة @{name} بشكل مباشر",
"account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
"account.domain_blocked": "اسم النِّطاق محظور",
"account.edit_profile": "تحرير الملف الشخصي",
@ -22,7 +22,7 @@
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
"account.follows_you": "يُتابِعُك",
"account.hide_reblogs": "إخفاء تعزيزات @{name}",
"account.joined": "Joined {date}",
"account.joined": "انضم في {date}",
"account.last_status": "آخر نشاط",
"account.link_verified_on": "تمَّ التَّحقق مِن مِلْكيّة هذا الرابط بتاريخ {date}",
"account.locked_info": "تمَّ تعيين حالة خصوصية هذا الحساب إلى مُقفَل. يُراجع المالك يدويًا من يمكنه متابعته.",
@ -47,11 +47,16 @@
"account.unmute": "إلغاء الكَتم عن @{name}",
"account.unmute_notifications": "إلغاء كَتم الإشعارات عن @{name}",
"account_note.placeholder": "اِنقُر لإضافة مُلاحظة",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "يُرجى إعادة المحاولة بعد {retry_time, time, medium}.",
"alert.rate_limited.title": "المُعَدَّل مَحدود",
"alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.",
"alert.unexpected.title": "المعذرة!",
"announcement.announcement": "إعلان",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} في الأسبوع",
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبِلَة",
"bundle_column_error.body": "لقد حدث خطأ ما أثناء تحميل هذا العنصر.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "هل أنتَ مُتأكدٌ أنك تُريدُ حَذفَ هذا المنشور؟",
"confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمةَ بشكلٍ دائم؟",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "حظر اِسم النِّطاق بشكلٍ كامل",
"confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.",
"confirmations.logout.confirm": "خروج",
@ -160,11 +167,11 @@
"empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
"empty_column.favourited_statuses": "ليس لديك أية تبويقات مفضلة بعد. عندما ستقوم بالإعجاب بواحد، سيظهر هنا.",
"empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا التبويق بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
"empty_column.follow_recommendations": "يبدو أنه لا يمكن إنشاء أي اقتراحات لك. يمكنك البحث عن أشخاص قد تعرفهم أو استكشاف الوسوم الرائجة.",
"empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.",
"empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
"empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.",
"empty_column.home.suggestions": "See some suggestions",
"empty_column.home.suggestions": "شاهد بعض الاقتراحات",
"empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر تبويقات.",
"empty_column.lists": "ليس عندك أية قائمة بعد. سوف تظهر قائمتك هنا إن قمت بإنشاء واحدة.",
"empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.",
@ -176,9 +183,9 @@
"error.unexpected_crash.next_steps_addons": "حاول تعطيلهم وإنعاش الصفحة. إن لم ينجح ذلك، يمكنك دائمًا استخدام ماستدون عبر متصفح آخر أو تطبيق أصلي.",
"errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
"errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
"follow_recommendations.done": "تم",
"follow_recommendations.heading": "تابع الأشخاص الذين ترغب في رؤية منشوراتهم! إليك بعض الاقتراحات.",
"follow_recommendations.lead": "ستظهر المنشورات من الأشخاص الذين تُتابعتهم بترتيب تسلسلي زمني على صفحتك الرئيسية. لا تخف إذا ارتكبت أي أخطاء، تستطيع إلغاء متابعة أي شخص في أي وقت تريد!",
"follow_request.authorize": "ترخيص",
"follow_request.reject": "رفض",
"follow_requests.unlocked_explanation": "على الرغم من أن حسابك غير مقفل، فإن موظفين الـ{domain} ظنوا أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.",
@ -315,7 +322,7 @@
"notifications.column_settings.show": "اعرِضها في عمود",
"notifications.column_settings.sound": "أصدر صوتا",
"notifications.column_settings.status": "تبويقات جديدة:",
"notifications.column_settings.unread_markers.category": "Unread notification markers",
"notifications.column_settings.unread_markers.category": "علامات إشعار غير مقروءة",
"notifications.filter.all": "الكل",
"notifications.filter.boosts": "الترقيات",
"notifications.filter.favourites": "المفضلة",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# صوت} other {# أصوات}}",
"poll.vote": "صَوّت",
"poll.voted": "لقد صوّتت على هذه الإجابة",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "إضافة استطلاع للرأي",
"poll_button.remove_poll": "إزالة استطلاع الرأي",
"privacy.change": "اضبط خصوصية المنشور",
@ -454,6 +462,7 @@
"upload_form.video_description": "وصف للمعاقين بصريا أو لِذي قِصر السمع",
"upload_modal.analyzing_picture": "جارٍ فحص الصورة…",
"upload_modal.apply": "طبّق",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "اختر صورة",
"upload_modal.description_placeholder": "نصٌّ حكيمٌ لهُ سِرٌّ قاطِعٌ وَذُو شَأنٍ عَظيمٍ مكتوبٌ على ثوبٍ أخضرَ ومُغلفٌ بجلدٍ أزرق",
"upload_modal.detect_text": "اكتشف النص مِن الصورة",

9
app/javascript/mastodon/locales/ast.json

@ -47,11 +47,16 @@
"account.unmute": "Unmute @{name}",
"account.unmute_notifications": "Unmute notifications from @{name}",
"account_note.placeholder": "Click to add a note",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "Asocedió un fallu inesperáu.",
"alert.unexpected.title": "¡Meca!",
"announcement.announcement": "Anunciu",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per selmana",
"boost_modal.combo": "Pues primir {combo} pa saltar esto la próxima vegada",
"bundle_column_error.body": "Asocedió daqué malo mentanto se cargaba esti componente.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "¿De xuru que quies desaniciar esti estáu?",
"confirmations.delete_list.confirm": "Desaniciar",
"confirmations.delete_list.message": "¿De xuru que quies desaniciar dafechu esta llista?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Anubrir tol dominiu",
"confirmations.domain_block.message": "¿De xuru xurísimu que quies bloquiar el dominiu {domain} enteru? Na mayoría de casos bloquiar o silenciar dalguna cuenta ye abondo y preferible. Nun vas ver el conteníu d'esi dominiu en nenguna llinia temporal pública o nos avisos, y van desanciase los tos siguidores d'esi dominiu.",
"confirmations.logout.confirm": "Zarrar sesión",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# votu} other {# votos}}",
"poll.vote": "Vote",
"poll.voted": "You voted for this answer",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Amestar una encuesta",
"poll_button.remove_poll": "Desaniciar la encuesta",
"privacy.change": "Adjust status privacy",
@ -454,6 +462,7 @@
"upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual",
"upload_modal.analyzing_picture": "Analizando la semeya…",
"upload_modal.apply": "Aplicar",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Choose image",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Deteutar el testu de la semeya",

9
app/javascript/mastodon/locales/bg.json

@ -47,11 +47,16 @@
"account.unmute": "Раззаглушаване на @{name}",
"account.unmute_notifications": "Раззаглушаване на известия от @{name}",
"account_note.placeholder": "Click to add a note",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Моля, опитайте отново след {retry_time, time, medium}.",
"alert.rate_limited.title": "Скоростта е ограничена",
"alert.unexpected.message": "Възникна неочаквана грешка.",
"alert.unexpected.title": "Опаа!",
"announcement.announcement": "Оповестяване",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} на седмица",
"boost_modal.combo": "Можете да натиснете {combo}, за да пропуснете това следващия път",
"bundle_column_error.body": "Нещо се обърка при зареждането на този компонент.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Are you sure you want to delete this status?",
"confirmations.delete_list.confirm": "Изтриване",
"confirmations.delete_list.message": "Сигурни ли сте, че искате да изтриете окончателно този списък?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Hide entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
"confirmations.logout.confirm": "Излизане",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# глас} other {# гласа}}",
"poll.vote": "Гласуване",
"poll.voted": "Вие гласувахте за този отговор",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Добавяне на анкета",
"poll_button.remove_poll": "Премахване на анкета",
"privacy.change": "Adjust status privacy",
@ -454,6 +462,7 @@
"upload_form.video_description": "Опишете за хора със загуба на слуха или зрително увреждане",
"upload_modal.analyzing_picture": "Анализ на снимка…",
"upload_modal.apply": "Прилагане",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Избор на изображение",
"upload_modal.description_placeholder": "Ах, чудна българска земьо, полюшвай цъфтящи жита",
"upload_modal.detect_text": "Откриване на текст от картина",

43
app/javascript/mastodon/locales/bn.json

@ -1,26 +1,26 @@
{
"account.account_note_header": "নোট",
"account.add_or_remove_from_list": "তালিকাতে যুক্ত বা অপসারণ করুন",
"account.account_note_header": "বিজ্ঞপ্তি",
"account.add_or_remove_from_list": "তালিকাতে যোগ বা অপসারণ করো",
"account.badges.bot": "বট",
"account.badges.group": "গ্রুপ",
"account.block": "@{name} কে ব্লক করুন",
"account.block_domain": "{domain} থেকে সব আড়াল করুন",
"account.badges.group": "দল",
"account.block": "@{name} কে ব্লক কর",
"account.block_domain": "{domain} থেকে সব লুকাও",
"account.blocked": "অবরুদ্ধ",
"account.browse_more_on_origin_server": "মূল প্রোফাইলটিতে আরও ব্রাউজ করুন",
"account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল করুন",
"account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল কর",
"account.direct": "@{name} কে সরাসরি বার্তা",
"account.disable_notifications": "Stop notifying me when @{name} posts",
"account.domain_blocked": "ডোমেন গোপন করুন",
"account.edit_profile": "প্রোফাইল পরিবর্তন করুন",
"account.enable_notifications": "Notify me when @{name} posts",
"account.endorse": "নিজের পাতায় দেখান",
"account.follow": "অনুসরণ করুন",
"account.follow": "অনুসরণ",
"account.followers": "অনুসরণকারী",
"account.followers.empty": "এই সদস্যকে এখনো কেউ অনুসরণ করে না।.",
"account.followers.empty": "এই ব্যক্তিকে এখনো কেউ অনুসরণ করে না।",
"account.followers_counter": "{count, plural,one {{counter} জন অনুসরণকারী } other {{counter} জন অনুসরণকারী}}",
"account.following_counter": "{count, plural,one {{counter} জনকে অনুসরণ} other {{counter} জনকে অনুসরণ}}",
"account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.",
"account.follows_you": "আপনাকে অনুসরণ করে",
"account.follows_you": "তোমাকে অনুসরণ করে",
"account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
"account.joined": "Joined {date}",
"account.last_status": "শেষ সক্রিয় ছিল",
@ -43,15 +43,20 @@
"account.unblock": "@{name} র কার্যকলাপ দেখুন",
"account.unblock_domain": "{domain} কে আবার দেখুন",
"account.unendorse": "আপনার নিজের পাতায় এটা দেখবেন না",
"account.unfollow": "অনুসরণ না করতে",
"account.unfollow": "অনুসরণ করো না",
"account.unmute": "@{name} র কার্যকলাপ আবার দেখুন",
"account.unmute_notifications": "@{name} র প্রজ্ঞাপন দেখুন",
"account_note.placeholder": "নোট যোগ করতে ক্লিক করুন",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
"alert.rate_limited.title": "হার সীমিত",
"alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
"alert.unexpected.title": "ওহো!",
"announcement.announcement": "ঘোষণা",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}",
"boost_modal.combo": "পরেরবার আপনি {combo} টিপলে এটি আর আসবে না",
"bundle_column_error.body": "এই অংশটি দেখতে যেয়ে কোনো সমস্যা হয়েছে।.",
@ -67,7 +72,7 @@
"column.directory": "প্রোফাইল ব্রাউজ করুন",
"column.domain_blocks": "লুকোনো ডোমেনগুলি",
"column.favourites": "পছন্দের গুলো",
"column.follow_requests": "অনুসরণের অনুমতি চেয়েছে যারা",
"column.follow_requests": "অনুসরণের অনুমতি অনুরোধকারী",
"column.home": "বাড়ি",
"column.lists": "তালিকাগুলো",
"column.mutes": "যাদের কার্যক্রম দেখা বন্ধ আছে",
@ -113,6 +118,8 @@
"confirmations.delete.message": "আপনি কি নিশ্চিত যে এই লেখাটি মুছে ফেলতে চান ?",
"confirmations.delete_list.confirm": "মুছে ফেলুন",
"confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "এই ডোমেন থেকে সব লুকান",
"confirmations.domain_block.message": "আপনি কি সত্যিই সত্যই নিশ্চিত যে আপনি পুরো {domain}'টি ব্লক করতে চান? বেশিরভাগ ক্ষেত্রে কয়েকটি লক্ষ্যযুক্ত ব্লক বা নীরবতা যথেষ্ট এবং পছন্দসই। আপনি কোনও পাবলিক টাইমলাইন বা আপনার বিজ্ঞপ্তিগুলিতে সেই ডোমেন থেকে সামগ্রী দেখতে পাবেন না। সেই ডোমেন থেকে আপনার অনুসরণকারীদের সরানো হবে।",
"confirmations.logout.confirm": "প্রস্থান",
@ -124,8 +131,8 @@
"confirmations.redraft.message": "আপনি কি নিশ্চিত এটি মুছে ফেলে এবং আবার সম্পাদন করতে চান ? এটাতে যা পছন্দিত, সমর্থন বা মতামত আছে সেগুলো নতুন লেখার সাথে যুক্ত থাকবে না।",
"confirmations.reply.confirm": "মতামত",
"confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?",
"confirmations.unfollow.confirm": "অনুসরণ করা বাতিল করতে",
"confirmations.unfollow.message": "আপনি কি নিশ্চিত {name} কে আর অনুসরণ করতে চান না ?",
"confirmations.unfollow.confirm": "অনুসরণ বন্ধ করো",
"confirmations.unfollow.message": "তুমি কি নিশ্চিত {name} কে আর অনুসরণ করতে চাও না?",
"conversation.delete": "কথোপকথন মুছে ফেলুন",
"conversation.mark_as_read": "পঠিত হিসেবে চিহ্নিত করুন",
"conversation.open": "কথপোকথন দেখান",
@ -161,7 +168,7 @@
"empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।",
"empty_column.favourites": "কেও এখনো এটাকে পছন্দের টুট হিসেবে চিহ্নিত করেনি। যদি করে, তখন তাদের এখানে পাওয়া যাবে।",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
"empty_column.follow_requests": "আপনার এখনো কোনো অনুসরণের আবেদন পাঠানো নেই। যদি পাঠায়, এখানে পাওয়া যাবে।",
"empty_column.follow_requests": "তোমার এখনো কোনো অনুসরণের আবেদন পাওনি। যদি কেউ পাঠায়, এখানে পাওয়া যাবে।",
"empty_column.hashtag": "এই হেসটাগে এখনো কিছু নেই।",
"empty_column.home": "আপনার বাড়ির সময়রেখা এখনো খালি! {public} এ ঘুরে আসুন অথবা অনুসন্ধান বেবহার করে শুরু করতে পারেন এবং অন্য ব্যবহারকারীদের সাথে সাক্ষাৎ করতে পারেন।",
"empty_column.home.suggestions": "See some suggestions",
@ -176,7 +183,7 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
"errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
"follow_recommendations.done": "Done",
"follow_recommendations.done": "সম্পন্ন",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
"follow_request.authorize": "অনুমতি দিন",
@ -256,7 +263,7 @@
"lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে",
"lists.replies_policy.followed": "Any followed user",
"lists.replies_policy.list": "Members of the list",
"lists.replies_policy.none": "No one",
"lists.replies_policy.none": "কেউ না",
"lists.replies_policy.title": "Show replies to:",
"lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন",
"lists.subheading": "আপনার তালিকা",
@ -265,7 +272,7 @@
"media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান",
"missing_indicator.label": "খুঁজে পাওয়া যায়নি",
"missing_indicator.sublabel": "জিনিসটা খুঁজে পাওয়া যায়নি",
"mute_modal.duration": "Duration",
"mute_modal.duration": "সময়কাল",
"mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?",
"mute_modal.indefinite": "Indefinite",
"navigation_bar.apps": "মোবাইলের আপ্প",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# ভোট} other {# ভোট}}",
"poll.vote": "ভোট",
"poll.voted": "আপনি এই উত্তরের পক্ষে ভোট দিয়েছেন",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "একটা নির্বাচন যোগ করতে",
"poll_button.remove_poll": "নির্বাচন বাদ দিতে",
"privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে",
@ -454,6 +462,7 @@
"upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন",
"upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
"upload_modal.apply": "প্রয়োগ করুন",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "ছবি নির্বাচন করুন",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন",

65
app/javascript/mastodon/locales/br.json

@ -9,10 +9,10 @@
"account.browse_more_on_origin_server": "Browse more on the original profile",
"account.cancel_follow_request": "Nullañ ar bedadenn heuliañ",
"account.direct": "Kas ur gemennadenn da @{name}",
"account.disable_notifications": "Stop notifying me when @{name} posts",
"account.disable_notifications": "Paouez d'am c'hemenn pa vez toudet gant @{name}",
"account.domain_blocked": "Domani berzet",
"account.edit_profile": "Aozañ ar profil",
"account.enable_notifications": "Notify me when @{name} posts",
"account.enable_notifications": "Ma c'hemenn pa vez toudet gant @{name}",
"account.endorse": "Lakaat war-wel war ar profil",
"account.follow": "Heuliañ",
"account.followers": "Heulier·ezed·ien",
@ -22,7 +22,7 @@
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
"account.follows_you": "Ho heul",
"account.hide_reblogs": "Kuzh toudoù rannet gant @{name}",
"account.joined": "Joined {date}",
"account.joined": "Amañ abaoe {date}",
"account.last_status": "Oberiantiz zivezhañ",
"account.link_verified_on": "Gwiriet eo bet perc'hennidigezh al liamm d'an deiziad-mañ : {date}",
"account.locked_info": "Prennet eo ar gon-mañ. Dibab a ra ar perc'henn ar re a c'hall heuliañ anezhi pe anezhañ.",
@ -47,11 +47,16 @@
"account.unmute": "Diguzhat @{name}",
"account.unmute_notifications": "Diguzhat kemennoù a @{name}",
"account_note.placeholder": "Klikit evit ouzhpenniñ un notenn",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
"alert.rate_limited.title": "Feur bevennet",
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
"alert.unexpected.title": "Hopala!",
"announcement.announcement": "Kemenn",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} bep sizhun",
"boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou",
"bundle_column_error.body": "Degouezhet ez eus bet ur fazi en ur gargañ an elfenn-mañ.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Ha sur oc'h e fell deoc'h dilemel an toud-mañ ?",
"confirmations.delete_list.confirm": "Dilemel",
"confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Berzañ an domani a-bezh",
"confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.",
"confirmations.logout.confirm": "Digevreañ",
@ -176,7 +183,7 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
"follow_recommendations.done": "Done",
"follow_recommendations.done": "Graet",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
"follow_request.authorize": "Aotren",
@ -255,18 +262,18 @@
"lists.new.create": "Ouzhpennañ ul listenn",
"lists.new.title_placeholder": "Titl nevez al listenn",
"lists.replies_policy.followed": "Any followed user",
"lists.replies_policy.list": "Members of the list",
"lists.replies_policy.none": "No one",
"lists.replies_policy.title": "Show replies to:",
"lists.search": "Search among people you follow",
"lists.replies_policy.list": "Izili ar roll",
"lists.replies_policy.none": "Den ebet",
"lists.replies_policy.title": "Diskouez ar respontoù:",
"lists.search": "Klask e-touez tud heuliet ganeoc'h",
"lists.subheading": "Ho listennoù",
"load_pending": "{count, plural, one {# new item} other {# new items}}",
"loading_indicator.label": "O kargañ...",
"media_gallery.toggle_visible": "Toggle visibility",
"missing_indicator.label": "Digavet",
"missing_indicator.sublabel": "This resource could not be found",
"mute_modal.duration": "Duration",
"mute_modal.hide_notifications": "Hide notifications from this user?",
"mute_modal.duration": "Padelezh",
"mute_modal.hide_notifications": "Kuzhat kemenadennoù eus an implijer-se ?",
"mute_modal.indefinite": "Indefinite",
"navigation_bar.apps": "Arloadoù pellgomz",
"navigation_bar.blocks": "Implijer·ezed·ien berzet",
@ -294,9 +301,9 @@
"notification.favourite": "{name} favourited your status",
"notification.follow": "heuliañ a ra {name} ac'hanoc'h",
"notification.follow_request": "{name} has requested to follow you",
"notification.mention": "{name} mentioned you",
"notification.own_poll": "Your poll has ended",
"notification.poll": "A poll you have voted in has ended",
"notification.mention": "{name} en/he deus meneget ac'hanoc'h",
"notification.own_poll": "Echu eo ho sontadeg",
"notification.poll": "Ur sontadeg ho deus mouezhet warnañ a zo echuet",
"notification.reblog": "{name} boosted your status",
"notification.status": "{name} just posted",
"notifications.clear": "Skarzhañ ar c'hemennoù",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "Mouezhiañ",
"poll.voted": "Mouezhiet ho peus evit ar respont-mañ",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Ouzhpennañ ur sontadeg",
"poll_button.remove_poll": "Dilemel ar sontadeg",
"privacy.change": "Kemmañ gwelidigezh ar statud",
@ -415,30 +423,30 @@
"status.show_less": "Diskouez nebeutoc'h",
"status.show_less_all": "Show less for all",
"status.show_more": "Diskouez muioc'h",
"status.show_more_all": "Show more for all",
"status.show_more_all": "Diskouez miuoc'h evit an holl",
"status.show_thread": "Diskouez ar gaozeadenn",
"status.uncached_media_warning": "Dihegerz",
"status.unmute_conversation": "Diguzhat ar gaozeadenn",
"status.unpin": "Dispilhennañ eus ar profil",
"suggestions.dismiss": "Dismiss suggestion",
"suggestions.header": "You might be interested in…",
"suggestions.header": "Marteze e vefec'h dedenet gant…",
"tabs_bar.federated_timeline": "Kevredet",
"tabs_bar.home": "Degemer",
"tabs_bar.local_timeline": "Lec'hel",
"tabs_bar.notifications": "Kemennoù",
"tabs_bar.search": "Klask",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
"time_remaining.days": "{number, plural,one {# devezh} other {# a zevezhioù}} a chom",
"time_remaining.hours": "{number, plural, one {# eurvezh} other{# eurvezh}} a chom",
"time_remaining.minutes": "{number, plural, one {# munut} other{# a vunutoù}} a chom",
"time_remaining.moments": "Moments remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
"time_remaining.seconds": "{number, plural, one {# eilenn} other{# eilenn}} a chom",
"timeline_hint.remote_resource_not_displayed": "{resource} eus servijerien all n'int ket diskouezet.",
"timeline_hint.resources.followers": "Heulier·ezed·ien",
"timeline_hint.resources.follows": "Heuliañ",
"timeline_hint.resources.statuses": "Toudoù koshoc'h",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
"trends.counter_by_accounts": "{count, plural, one {{counter} den} other {{counter} a zud}} a zo o komz",
"trends.trending_now": "Luskad ar mare",
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
"ui.beforeunload": "Kollet e vo ho prell ma kuitit Mastodon.",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
@ -446,14 +454,15 @@
"upload_button.label": "Ouzhpennañ ur media",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
"upload_form.audio_description": "Diskrivañ evit tud a zo kollet o c'hlev",
"upload_form.description": "Diskrivañ evit tud a zo kollet o gweled",
"upload_form.edit": "Aozañ",
"upload_form.thumbnail": "Kemmañ ar velvenn",
"upload_form.undo": "Dilemel",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_form.video_description": "Diskrivañ evit tud a zo kollet o gweled pe o c'hlev",
"upload_modal.analyzing_picture": "Analyzing picture…",
"upload_modal.apply": "Arloañ",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Dibab ur skeudenn",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Dinoiñ testenn diouzh ar skeudenn",
@ -468,8 +477,8 @@
"video.expand": "Expand video",
"video.fullscreen": "Skramm a-bezh",
"video.hide": "Kuzhat ar video",
"video.mute": "Mute sound",
"video.mute": "Paouez gant ar son",
"video.pause": "Pause",
"video.play": "Play",
"video.unmute": "Unmute sound"
"video.play": "Lenn",
"video.unmute": "Lakaat ar son en-dro"
}

11
app/javascript/mastodon/locales/ca.json

@ -46,12 +46,17 @@
"account.unfollow": "Deixa de seguir",
"account.unmute": "Treure silenci de @{name}",
"account.unmute_notifications": "Activar notificacions de @{name}",
"account_note.placeholder": "Sense comentaris",
"account_note.placeholder": "Fes clic per afegir una nota",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Si us plau torna-ho a provar després de {retry_time, time, medium}.",
"alert.rate_limited.title": "Límit de freqüència",
"alert.unexpected.message": "S'ha produït un error inesperat.",
"alert.unexpected.title": "Vaja!",
"announcement.announcement": "Anunci",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per setmana",
"boost_modal.combo": "Pots prémer {combo} per saltar-te això el proper cop",
"bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Estàs segur que vols suprimir aquest tut?",
"confirmations.delete_list.confirm": "Suprimeix",
"confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Amaga tot el domini",
"confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
"confirmations.logout.confirm": "Tancar sessió",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# vot} other {# vots}}",
"poll.vote": "Vota",
"poll.voted": "Vas votar per aquesta resposta",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Afegeix una enquesta",
"poll_button.remove_poll": "Elimina l'enquesta",
"privacy.change": "Ajusta l'estat de privacitat",
@ -454,6 +462,7 @@
"upload_form.video_description": "Descriu per a les persones amb pèrdua auditiva o deficiència visual",
"upload_modal.analyzing_picture": "Analitzant imatge…",
"upload_modal.apply": "Aplica",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Tria imatge",
"upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
"upload_modal.detect_text": "Detecta el text de l'imatge",

9
app/javascript/mastodon/locales/co.json

@ -47,11 +47,16 @@
"account.unmute": "Ùn piattà più @{name}",
"account.unmute_notifications": "Ùn piattà più nutificazione da @{name}",
"account_note.placeholder": "Senza cummentariu",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Pruvate ancu dop'à {retry_time, time, medium}.",
"alert.rate_limited.title": "Ghjettu limitatu",
"alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
"alert.unexpected.title": "Uups!",
"announcement.announcement": "Annunziu",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per settimana",
"boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
"bundle_column_error.body": "C'hè statu un prublemu caricandu st'elementu.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Site sicuru·a che vulete sguassà stu statutu?",
"confirmations.delete_list.confirm": "Toglie",
"confirmations.delete_list.message": "Site sicuru·a che vulete toglie sta lista?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Piattà tuttu u duminiu",
"confirmations.domain_block.message": "Site veramente sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.",
"confirmations.logout.confirm": "Scunnettassi",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# votu} other {# voti}}",
"poll.vote": "Vutà",
"poll.voted": "Avete vutatu per sta risposta",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Aghjunghje",
"poll_button.remove_poll": "Toglie u scandagliu",
"privacy.change": "Mudificà a cunfidenzialità di u statutu",
@ -454,6 +462,7 @@
"upload_form.video_description": "Discrizzione per i ciochi o cechi",
"upload_modal.analyzing_picture": "Analisi di u ritrattu…",
"upload_modal.apply": "Affettà",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Cambià ritrattu",
"upload_modal.description_placeholder": "Chì tempi brevi ziu, quandu solfeghji",
"upload_modal.detect_text": "Ditettà testu da u ritrattu",

15
app/javascript/mastodon/locales/cs.json

@ -17,7 +17,7 @@
"account.follow": "Sledovat",
"account.followers": "Sledující",
"account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
"account.followers_counter": "{count, plural, one {{counter} sledující} few {{counter} sledující} many {{counter} sledujících} other {{counter} sledujících}}",
"account.followers_counter": "{count, plural, one {{counter} Sledující} few {{counter} Sledující} many {{counter} Sledujících} other {{counter} Sledujících}}",
"account.following_counter": "{count, plural, one {{counter} Sledovaný} few {{counter} Sledovaní} many {{counter} Sledovaných} other {{counter} Sledovaných}}",
"account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
"account.follows_you": "Sleduje vás",
@ -47,11 +47,16 @@
"account.unmute": "Zrušit skrytí @{name}",
"account.unmute_notifications": "Zrušit skrytí oznámení od @{name}",
"account_note.placeholder": "Klikněte pro přidání poznámky",
"admin.dashboard.retention": "Retention",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users",
"alert.rate_limited.message": "Zkuste to prosím znovu za {retry_time, time, medium}.",
"alert.rate_limited.title": "Rychlost omezena",
"alert.rate_limited.title": "Spojení omezena",
"alert.unexpected.message": "Objevila se neočekávaná chyba.",
"alert.unexpected.title": "Jejda!",
"announcement.announcement": "Oznámení",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} za týden",
"boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
"bundle_column_error.body": "Při načítání této komponenty se něco pokazilo.",
@ -113,6 +118,8 @@
"confirmations.delete.message": "Opravdu chcete smazat tento příspěvek?",
"confirmations.delete_list.confirm": "Smazat",
"confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
"confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Blokovat celou doménu",
"confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
"confirmations.logout.confirm": "Odhlásit",
@ -142,7 +149,7 @@
"emoji_button.food": "Jídla a nápoje",
"emoji_button.label": "Vložit emoji",
"emoji_button.nature": "Příroda",
"emoji_button.not_found": "Žádné emoji! (╯°□°)╯︵ ┻━┻",
"emoji_button.not_found": "Nenalezeny žádné odpovídající emoji",
"emoji_button.objects": "Předměty",
"emoji_button.people": "Lidé",
"emoji_button.recent": "Často používané",
@ -339,6 +346,7 @@
"poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasů} other {# hlasů}}",
"poll.vote": "Hlasovat",
"poll.voted": "Pro tuto odpověď jste hlasovali",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "Přidat anketu",
"poll_button.remove_poll": "Odstranit anketu",
"privacy.change": "Změnit soukromí příspěvku",
@ -454,6 +462,7 @@
"upload_form.video_description": "Popis pro sluchově či zrakově postižené",
"upload_modal.analyzing_picture": "Analyzuji obrázek…",
"upload_modal.apply": "Použít",
"upload_modal.applying": "Applying…",
"upload_modal.choose_image": "Vybrat obrázek",
"upload_modal.description_placeholder": "Příliš žluťoučký kůň úpěl ďábelské ódy",
"upload_modal.detect_text": "Detekovat text z obrázku",