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

Conflicts:
- `package.json`:
  Upstream removed a dependency that was textually close to a glitch-soc-only
  dependency.
  Removed the dependency as upstream did, while keeping the glitch-soc-only
  dependency.
local
Claire 1 year ago
commit ce12934f5b
  1. 10
      .devcontainer/post-create.sh
  2. 17
      .github/workflows/check-i18n.yml
  3. 9
      .github/workflows/lint-js.yml
  4. 2
      .nvmrc
  5. 2
      .prettierignore
  6. 14
      CHANGELOG.md
  7. 3
      Dockerfile
  8. 6
      Gemfile
  9. 26
      Gemfile.lock
  10. 2
      app/controllers/backups_controller.rb
  11. 9
      app/controllers/settings/two_factor_authentication/otp_authentication_controller.rb
  12. 2
      app/javascript/mastodon/actions/markers.js
  13. 5
      app/javascript/mastodon/base_polyfills.js
  14. 4
      app/javascript/mastodon/components/admin/ReportReasonSelector.jsx
  15. 2
      app/javascript/mastodon/components/autosuggest_input.jsx
  16. 2
      app/javascript/mastodon/components/autosuggest_textarea.jsx
  17. 2
      app/javascript/mastodon/components/column_back_button_slim.jsx
  18. 2
      app/javascript/mastodon/components/dropdown_menu.jsx
  19. 4
      app/javascript/mastodon/components/gifv.jsx
  20. 4
      app/javascript/mastodon/components/icon_button.jsx
  21. 4
      app/javascript/mastodon/components/intersection_observer_article.jsx
  22. 2
      app/javascript/mastodon/components/picture_in_picture_placeholder.jsx
  23. 2
      app/javascript/mastodon/components/poll.jsx
  24. 4
      app/javascript/mastodon/components/status.jsx
  25. 6
      app/javascript/mastodon/components/status_content.jsx
  26. 2
      app/javascript/mastodon/containers/media_container.jsx
  27. 2
      app/javascript/mastodon/features/about/index.jsx
  28. 8
      app/javascript/mastodon/features/audio/index.jsx
  29. 2
      app/javascript/mastodon/features/compose/components/language_dropdown.jsx
  30. 2
      app/javascript/mastodon/features/compose/components/poll_form.jsx
  31. 2
      app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx
  32. 2
      app/javascript/mastodon/features/compose/components/search.jsx
  33. 2
      app/javascript/mastodon/features/compose/components/upload.jsx
  34. 2
      app/javascript/mastodon/features/direct_timeline/components/conversation.jsx
  35. 4
      app/javascript/mastodon/features/direct_timeline/components/conversations_list.jsx
  36. 2
      app/javascript/mastodon/features/direct_timeline/index.jsx
  37. 4
      app/javascript/mastodon/features/emoji/emoji.js
  38. 4
      app/javascript/mastodon/features/filters/select_filter.jsx
  39. 2
      app/javascript/mastodon/features/getting_started/components/announcements.jsx
  40. 2
      app/javascript/mastodon/features/list_editor/components/search.jsx
  41. 2
      app/javascript/mastodon/features/list_editor/index.jsx
  42. 4
      app/javascript/mastodon/features/list_timeline/index.jsx
  43. 2
      app/javascript/mastodon/features/notifications/components/clear_column_button.jsx
  44. 2
      app/javascript/mastodon/features/notifications/components/grant_permission_button.jsx
  45. 18
      app/javascript/mastodon/features/notifications/components/notification.jsx
  46. 2
      app/javascript/mastodon/features/report/components/option.jsx
  47. 2
      app/javascript/mastodon/features/status/index.jsx
  48. 2
      app/javascript/mastodon/features/ui/components/actions_modal.jsx
  49. 4
      app/javascript/mastodon/features/ui/components/media_modal.jsx
  50. 2
      app/javascript/mastodon/features/ui/components/modal_root.jsx
  51. 6
      app/javascript/mastodon/features/video/index.jsx
  52. 2
      app/javascript/mastodon/initial_state.js
  53. 1
      app/javascript/mastodon/load_polyfills.js
  54. 14
      app/javascript/mastodon/locales/ast.json
  55. 18
      app/javascript/mastodon/locales/be.json
  56. 16
      app/javascript/mastodon/locales/ca.json
  57. 94
      app/javascript/mastodon/locales/ckb.json
  58. 30
      app/javascript/mastodon/locales/cs.json
  59. 16
      app/javascript/mastodon/locales/da.json
  60. 16
      app/javascript/mastodon/locales/de.json
  61. 16
      app/javascript/mastodon/locales/el.json
  62. 18
      app/javascript/mastodon/locales/eo.json
  63. 16
      app/javascript/mastodon/locales/es-AR.json
  64. 16
      app/javascript/mastodon/locales/es-MX.json
  65. 28
      app/javascript/mastodon/locales/es.json
  66. 18
      app/javascript/mastodon/locales/et.json
  67. 16
      app/javascript/mastodon/locales/eu.json
  68. 38
      app/javascript/mastodon/locales/fa.json
  69. 24
      app/javascript/mastodon/locales/fi.json
  70. 16
      app/javascript/mastodon/locales/fo.json
  71. 16
      app/javascript/mastodon/locales/fy.json
  72. 16
      app/javascript/mastodon/locales/gl.json
  73. 16
      app/javascript/mastodon/locales/he.json
  74. 16
      app/javascript/mastodon/locales/hi.json
  75. 16
      app/javascript/mastodon/locales/hu.json
  76. 16
      app/javascript/mastodon/locales/is.json
  77. 16
      app/javascript/mastodon/locales/it.json
  78. 16
      app/javascript/mastodon/locales/ja.json
  79. 16
      app/javascript/mastodon/locales/ko.json
  80. 16
      app/javascript/mastodon/locales/lv.json
  81. 34
      app/javascript/mastodon/locales/my.json
  82. 22
      app/javascript/mastodon/locales/nl.json
  83. 16
      app/javascript/mastodon/locales/pl.json
  84. 16
      app/javascript/mastodon/locales/pt-BR.json
  85. 16
      app/javascript/mastodon/locales/pt-PT.json
  86. 16
      app/javascript/mastodon/locales/sq.json
  87. 18
      app/javascript/mastodon/locales/th.json
  88. 20
      app/javascript/mastodon/locales/tr.json
  89. 16
      app/javascript/mastodon/locales/uk.json
  90. 16
      app/javascript/mastodon/locales/vi.json
  91. 42
      app/javascript/mastodon/locales/zh-CN.json
  92. 16
      app/javascript/mastodon/locales/zh-TW.json
  93. 9
      app/javascript/packs/public.jsx
  94. 8
      app/javascript/styles/mastodon/accounts.scss
  95. 6
      app/javascript/styles/mastodon/admin.scss
  96. 26
      app/javascript/styles/mastodon/components.scss
  97. 2
      app/javascript/styles/mastodon/rich_text.scss
  98. 12
      app/javascript/styles/mastodon/rtl.scss
  99. 4
      app/javascript/styles/mastodon/tables.scss
  100. 1
      app/services/notify_service.rb
  101. Some files were not shown because too many files have changed in this diff Show More

@ -3,14 +3,16 @@
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
bundle config path 'vendor/bundle'
bundle config with 'development test'
bundle install
# Make Gemfile.lock pristine again
git checkout -- Gemfile.lock
# Fetch Javascript dependencies
yarn --frozen-lockfile
# [re]create, migrate, and seed the test database
RAILS_ENV=test ./bin/rails db:setup

@ -30,13 +30,28 @@ jobs:
ruby-version: .ruby-version
bundler-cache: true
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install all yarn packages
run: yarn --frozen-lockfile
- name: Check for missing strings in English JSON
run: |
yarn build:development
yarn manage:translations
git diff --exit-code
- name: Check locale file normalization
run: bundle exec i18n-tasks check-normalized
- name: Check for unused strings
run: bundle exec i18n-tasks unused
- name: Check for missing strings in English
- name: Check for missing strings in English YML
run: |
bundle exec i18n-tasks add-missing -l en
git diff --exit-code

@ -6,22 +6,28 @@ on:
paths:
- 'package.json'
- 'yarn.lock'
- 'tsconfig.json'
- '.nvmrc'
- '.prettier*'
- '.eslint*'
- '**/*.js'
- '**/*.jsx'
- '**/*.ts'
- '**/*.tsx'
- '.github/workflows/lint-js.yml'
pull_request:
paths:
- 'package.json'
- 'yarn.lock'
- 'tsconfig.json'
- '.nvmrc'
- '.prettier*'
- '.eslint*'
- '**/*.js'
- '**/*.jsx'
- '**/*.ts'
- '**/*.tsx'
- '.github/workflows/lint-js.yml'
jobs:
@ -43,3 +49,6 @@ jobs:
- name: ESLint
run: yarn test:lint:js
- name: Typecheck
run: yarn test:typecheck

@ -1 +1 @@
16.19
16.20

@ -70,6 +70,8 @@ app/javascript/styles/mastodon/reset.scss
# Ignore Javascript pending https://github.com/mastodon/mastodon/pull/23631
*.js
*.jsx
*.ts
*.tsx
# Ignore HTML till cleaned and included in CI
*.html

@ -2,6 +2,20 @@
All notable changes to this project will be documented in this file.
## [4.1.2] - 2023-04-04
### Fixed
- Fix crash in `tootctl` commands making use of parallelization when Elasticsearch is enabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24182), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24377))
- Fix crash in `db:setup` when Elasticsearch is enabled ([rrgeorge](https://github.com/mastodon/mastodon/pull/24302))
- Fix user archive takeout when using OpenStack Swift or S3 providers with no ACL support ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24200))
- Fix invalid/expired invites being processed on sign-up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24337))
### Security
- Update Ruby to 3.0.6 due to ReDoS vulnerabilities ([saizai](https://github.com/mastodon/mastodon/pull/24334))
- Fix unescaped user input in LDAP query ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24379))
## [4.1.1] - 2023-03-16
### Added

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

@ -5,7 +5,7 @@ ruby '>= 2.7.0', '< 3.3.0'
gem 'pkg-config', '~> 1.5'
gem 'puma', '~> 6.1'
gem 'puma', '~> 6.2'
gem 'rails', '~> 6.1.7'
gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.2'
@ -17,7 +17,7 @@ gem 'makara', '~> 0.5'
gem 'pghero'
gem 'dotenv-rails', '~> 2.8'
gem 'aws-sdk-s3', '~> 1.119', require: false
gem 'aws-sdk-s3', '~> 1.120', require: false
gem 'fog-core', '<= 2.4.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'kt-paperclip', '~> 7.1', github: 'kreeti/kt-paperclip', ref: '11abf222dc31bff71160a1d138b445214f434b2b'
@ -118,7 +118,7 @@ group :production, :test do
end
group :test do
gem 'capybara', '~> 3.38'
gem 'capybara', '~> 3.39'
gem 'climate_control'
gem 'faker', '~> 3.1'
gem 'json-schema', '~> 3.0'

@ -94,7 +94,7 @@ GEM
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.1)
addressable (2.8.2)
public_suffix (>= 2.0.2, < 6.0)
aes_key_wrap (1.1.0)
airbrussh (1.4.1)
@ -109,7 +109,7 @@ GEM
attr_required (1.0.1)
awrence (1.2.1)
aws-eventstream (1.2.0)
aws-partitions (1.735.0)
aws-partitions (1.739.0)
aws-sdk-core (3.171.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
@ -118,7 +118,7 @@ GEM
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.119.2)
aws-sdk-s3 (1.120.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
@ -166,7 +166,7 @@ GEM
sshkit (~> 1.3)
capistrano-yarn (2.0.2)
capistrano (~> 3.0)
capybara (3.38.0)
capybara (3.39.0)
addressable
matrix
mini_mime (>= 0.1.3)
@ -438,7 +438,7 @@ GEM
net-smtp (0.3.3)
net-protocol
net-ssh (7.0.1)
nio4r (2.5.8)
nio4r (2.5.9)
nokogiri (1.14.2)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
@ -481,7 +481,7 @@ GEM
orm_adapter (0.5.0)
ox (2.14.14)
parallel (1.22.1)
parser (3.2.1.1)
parser (3.2.2.0)
ast (~> 2.4.1)
parslet (2.0.0)
pastel (0.8.0)
@ -501,7 +501,7 @@ GEM
premailer (~> 1.7, >= 1.7.9)
private_address_check (0.5.0)
public_suffix (5.0.1)
puma (6.1.1)
puma (6.2.1)
nio4r (~> 2.0)
pundit (2.3.0)
activesupport (>= 3.0.0)
@ -603,17 +603,17 @@ GEM
rspec_chunked (0.6)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.48.1)
rubocop (1.49.0)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.2.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.26.0, < 2.0)
rubocop-ast (>= 1.28.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.27.0)
rubocop-ast (1.28.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.17.1)
rubocop (~> 1.41)
@ -771,7 +771,7 @@ DEPENDENCIES
active_model_serializers (~> 0.10)
addressable (~> 2.8)
annotate (~> 3.2)
aws-sdk-s3 (~> 1.119)
aws-sdk-s3 (~> 1.120)
better_errors (~> 2.9)
binding_of_caller (~> 1.0)
blurhash (~> 0.1)
@ -783,7 +783,7 @@ DEPENDENCIES
capistrano-rails (~> 1.6)
capistrano-rbenv (~> 2.2)
capistrano-yarn (~> 2.0)
capybara (~> 3.38)
capybara (~> 3.39)
charlock_holmes (~> 0.7.7)
chewy (~> 7.2)
climate_control
@ -847,7 +847,7 @@ DEPENDENCIES
premailer-rails
private_address_check (~> 0.5)
public_suffix (~> 5.0)
puma (~> 6.1)
puma (~> 6.2)
pundit (~> 2.3)
rack (~> 2.2.6)
rack-attack (~> 6.6)

@ -13,7 +13,7 @@ class BackupsController < ApplicationController
when :s3
redirect_to @backup.dump.expiring_url(10)
when :fog
if Paperclip::Attachment.default_options.dig(:storage, :fog_credentials, :openstack_temp_url_key).present?
if Paperclip::Attachment.default_options.dig(:fog_credentials, :openstack_temp_url_key).present?
redirect_to @backup.dump.expiring_url(Time.now.utc + 10)
else
redirect_to full_asset_url(@backup.dump.url)

@ -22,18 +22,9 @@ module Settings
private
def confirmation_params
params.require(:form_two_factor_confirmation).permit(:otp_attempt)
end
def verify_otp_not_enabled
redirect_to settings_two_factor_authentication_methods_path if current_user.otp_enabled?
end
def acceptable_code?
current_user.validate_and_consume_otp!(confirmation_params[:otp_attempt]) ||
current_user.invalidate_otp_backup_code!(confirmation_params[:otp_attempt])
end
end
end
end

@ -55,7 +55,7 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => {
client.open('POST', '/api/v1/markers', false);
client.setRequestHeader('Content-Type', 'application/json');
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
client.SUBMIT(JSON.stringify(params));
client.send(JSON.stringify(params));
} catch (e) {
// Do not make the BeforeUnload handler error out
}

@ -1,16 +1,11 @@
import 'intl';
import 'intl/locale-data/jsonp/en';
import 'es6-symbol/implement';
import includes from 'array-includes';
import assign from 'object-assign';
import values from 'object.values';
import { decode as decodeBase64 } from './utils/base64';
import promiseFinally from 'promise.prototype.finally';
if (!Array.prototype.includes) {
includes.shim();
}
if (!Object.assign) {
Object.assign = assign;
}

@ -33,7 +33,7 @@ class Category extends React.PureComponent {
const { id, text, disabled, selected, children } = this.props;
return (
<div tabIndex='0' role='button' className={classNames('report-reason-selector__category', { selected, disabled })} onClick={this.handleClick}>
<div tabIndex={0} role='button' className={classNames('report-reason-selector__category', { selected, disabled })} onClick={this.handleClick}>
{selected && <input type='hidden' name='report[category]' value={id} />}
<div className='report-reason-selector__category__label'>
@ -74,7 +74,7 @@ class Rule extends React.PureComponent {
const { id, text, disabled, selected } = this.props;
return (
<div tabIndex='0' role='button' className={classNames('report-reason-selector__rule', { selected, disabled })} onClick={this.handleClick}>
<div tabIndex={0} role='button' className={classNames('report-reason-selector__rule', { selected, disabled })} onClick={this.handleClick}>
<span className={classNames('poll__input', { checkbox: true, active: selected, disabled })} />
{selected && <input type='hidden' name='report[rule_ids][]' value={id} />}
{text}

@ -180,7 +180,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
}
return (
<div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
<div role='button' tabIndex={0} key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
{inner}
</div>
);

@ -186,7 +186,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
}
return (
<div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
<div role='button' tabIndex={0} key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
{inner}
</div>
);

@ -8,7 +8,7 @@ export default class ColumnBackButtonSlim extends ColumnBackButton {
render () {
return (
<div className='column-back-button--slim'>
<div role='button' tabIndex='0' onClick={this.handleClick} className='column-back-button column-back-button--slim-button'>
<div role='button' tabIndex={0} onClick={this.handleClick} className='column-back-button column-back-button--slim-button'>
<Icon id='chevron-left' className='column-back-button__icon' fixedWidth />
<FormattedMessage id='column_back_button.label' defaultMessage='Back' />
</div>

@ -119,7 +119,7 @@ class DropdownMenu extends React.PureComponent {
return (
<li className='dropdown-menu__item' key={`${text}-${i}`}>
<a href={href} target={target} data-method={method} rel='noopener noreferrer' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
<a href={href} target={target} data-method={method} rel='noopener noreferrer' role='button' tabIndex={0} ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
{text}
</a>
</li>

@ -46,7 +46,7 @@ export default class GIFV extends React.PureComponent {
width={width}
height={height}
role='button'
tabIndex='0'
tabIndex={0}
aria-label={alt}
title={alt}
lang={lang}
@ -57,7 +57,7 @@ export default class GIFV extends React.PureComponent {
<video
src={src}
role='button'
tabIndex='0'
tabIndex={0}
aria-label={alt}
title={alt}
lang={lang}

@ -23,7 +23,7 @@ export default class IconButton extends React.PureComponent {
inverted: PropTypes.bool,
animate: PropTypes.bool,
overlay: PropTypes.bool,
tabIndex: PropTypes.string,
tabIndex: PropTypes.number,
counter: PropTypes.number,
obfuscateCount: PropTypes.bool,
href: PropTypes.string,
@ -36,7 +36,7 @@ export default class IconButton extends React.PureComponent {
disabled: false,
animate: false,
overlay: false,
tabIndex: '0',
tabIndex: 0,
ariaHidden: false,
};

@ -113,7 +113,7 @@ export default class IntersectionObserverArticle extends React.Component {
aria-setsize={listLength}
style={{ height: `${this.height || cachedHeight}px`, opacity: 0, overflow: 'hidden' }}
data-id={id}
tabIndex='0'
tabIndex={0}
>
{children && React.cloneElement(children, { hidden: true })}
</article>
@ -121,7 +121,7 @@ export default class IntersectionObserverArticle extends React.Component {
}
return (
<article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex='0'>
<article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex={0}>
{children && React.cloneElement(children, { hidden: false })}
</article>
);

@ -58,7 +58,7 @@ class PictureInPicturePlaceholder extends React.PureComponent {
const { height } = this.state;
return (
<div ref={this.setRef} className='picture-in-picture-placeholder' style={{ height }} role='button' tabIndex='0' onClick={this.handleClick}>
<div ref={this.setRef} className='picture-in-picture-placeholder' style={{ height }} role='button' tabIndex={0} onClick={this.handleClick}>
<Icon id='window-restore' />
<FormattedMessage id='picture_in_picture.restore' defaultMessage='Put it back' />
</div>

@ -154,7 +154,7 @@ class Poll extends ImmutablePureComponent {
{!showResults && (
<span
className={classNames('poll__input', { checkbox: poll.get('multiple'), active })}
tabIndex='0'
tabIndex={0}
role={poll.get('multiple') ? 'checkbox' : 'radio'}
onKeyPress={this.handleOptionKeyPress}
aria-checked={active}

@ -337,7 +337,7 @@ class Status extends ImmutablePureComponent {
if (hidden) {
return (
<HotKeys handlers={handlers}>
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex='0'>
<div ref={this.handleRef} className={classNames('status__wrapper', { focusable: !this.props.muted })} tabIndex={0}>
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
<span>{status.get('content')}</span>
</div>
@ -354,7 +354,7 @@ class Status extends ImmutablePureComponent {
return (
<HotKeys handlers={minHandlers}>
<div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}>
<div className='status__wrapper status__wrapper--filtered focusable' tabIndex={0} ref={this.handleRef}>
<FormattedMessage id='status.filtered' defaultMessage='Filtered' />: {matchedFilters.join(', ')}.
{' '}
<button className='status__wrapper--filtered__button' onClick={this.handleUnfilterClick}>

@ -268,7 +268,7 @@ class StatusContent extends React.PureComponent {
}
return (
<div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<div className={classNames} ref={this.setRef} tabIndex={0} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}>
<span dangerouslySetInnerHTML={spoilerContent} className='translate' lang={lang} />
{' '}
@ -286,7 +286,7 @@ class StatusContent extends React.PureComponent {
} else if (this.props.onClick) {
return (
<>
<div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<div className={classNames} ref={this.setRef} tabIndex={0} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<div className='status__content__text status__content__text--visible translate' lang={lang} dangerouslySetInnerHTML={content} />
{poll}
@ -298,7 +298,7 @@ class StatusContent extends React.PureComponent {
);
} else {
return (
<div className={classNames} ref={this.setRef} tabIndex='0' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<div className={classNames} ref={this.setRef} tabIndex={0} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
<div className='status__content__text status__content__text--visible translate' lang={lang} dangerouslySetInnerHTML={content} />
{poll}

@ -54,7 +54,7 @@ export default class MediaContainer extends PureComponent {
handleCloseMedia = () => {
document.body.classList.remove('with-modals--active');
document.documentElement.style.marginRight = 0;
document.documentElement.style.marginRight = '0';
this.setState({
media: null,

@ -67,7 +67,7 @@ class Section extends React.PureComponent {
return (
<div className={classNames('about__section', { active: !collapsed })}>
<div className='about__section__title' role='button' tabIndex='0' onClick={this.handleClick}>
<div className='about__section__title' role='button' tabIndex={0} onClick={this.handleClick}>
<Icon id={collapsed ? 'chevron-right' : 'chevron-down'} fixedWidth /> {title}
</div>

@ -470,7 +470,7 @@ class Audio extends React.PureComponent {
}
return (
<div className={classNames('audio-player', { editable, inactive: !revealed })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} tabIndex='0' onKeyDown={this.handleKeyDown}>
<div className={classNames('audio-player', { editable, inactive: !revealed })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} tabIndex={0} onKeyDown={this.handleKeyDown}>
<Blurhash
hash={blurhash}
@ -493,7 +493,7 @@ class Audio extends React.PureComponent {
<canvas
role='button'
tabIndex='0'
tabIndex={0}
className='audio-player__canvas'
width={this.state.width}
height={this.state.height}
@ -526,7 +526,7 @@ class Audio extends React.PureComponent {
<span
className={classNames('video-player__seek__handle', { active: dragging })}
tabIndex='0'
tabIndex={0}
style={{ left: `${progress}%`, backgroundColor: this._getAccentColor() }}
onKeyDown={this.handleAudioKeyDown}
/>
@ -543,7 +543,7 @@ class Audio extends React.PureComponent {
<span
className='video-player__volume__handle'
tabIndex='0'
tabIndex={0}
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
/>
</div>

@ -209,7 +209,7 @@ class LanguageDropdownMenu extends React.PureComponent {
const { value } = this.props;
return (
<div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
<div key={lang[0]} role='option' tabIndex={0} data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
<span className='language-dropdown__dropdown__results__item__native-name' lang={lang[0]}>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span>
</div>
);

@ -82,7 +82,7 @@ class OptionIntl extends React.PureComponent {
onClick={this.handleToggleMultiple}
onKeyPress={this.handleCheckboxKeypress}
role='button'
tabIndex='0'
tabIndex={0}
title={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}
aria-label={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}
/>

@ -115,7 +115,7 @@ class PrivacyDropdownMenu extends React.PureComponent {
return (
<div style={{ ...style }} role='listbox' ref={this.setRef}>
{items.map(item => (
<div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>
<div role='option' tabIndex={0} key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>
<div className='privacy-dropdown__option__icon'>
<Icon id={item.icon} fixedWidth />
</div>

@ -287,7 +287,7 @@ class Search extends React.PureComponent {
onBlur={this.handleBlur}
/>
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
<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>

@ -42,7 +42,7 @@ export default class Upload extends ImmutablePureComponent {
const y = ((focusY / -2) + .5) * 100;
return (
<div className='compose-form__upload' tabIndex='0' role='button'>
<div className='compose-form__upload' tabIndex={0} role='button'>
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
{({ scale }) => (
<div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>

@ -144,7 +144,7 @@ class Conversation extends ImmutablePureComponent {
return (
<HotKeys handlers={handlers}>
<div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex='0'>
<div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex={0}>
<div className='conversation__avatar' onClick={this.handleClick} role='presentation'>
<AvatarComposite accounts={accounts} size={48} />
</div>

@ -55,10 +55,10 @@ export default class ConversationsList extends ImmutablePureComponent {
}, 300, { leading: true });
render () {
const { conversations, onLoadMore, ...other } = this.props;
const { conversations, isLoading, onLoadMore, ...other } = this.props;
return (
<ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} ref={this.setRef}>
<ScrollableList {...other} isLoading={isLoading} showLoading={isLoading && conversations.isEmpty()} onLoadMore={onLoadMore && this.handleLoadOlder} ref={this.setRef}>
{conversations.map(item => (
<ConversationContainer
key={item.get('id')}

@ -89,8 +89,10 @@ class DirectTimeline extends React.PureComponent {
trackScroll={!pinned}
scrollKey={`direct_timeline-${columnId}`}
timelineId='direct'
bindToDocument={!multiColumn}
onLoadMore={this.handleLoadMore}
prepend={<div className='follow_requests-unlocked_explanation'><span><FormattedMessage id='compose_form.encryption_warning' defaultMessage='Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a></span></div>}
alwaysPrepend
emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any private mentions yet. When you send or receive one, it will show up here." />}
/>

@ -50,7 +50,7 @@ const emojifyTextNode = (node, customEmojis) => {
if (shortname in customEmojis) {
const filename = autoPlayGif ? customEmojis[shortname].url : customEmojis[shortname].static_url;
replacement = document.createElement('img');
replacement.setAttribute('draggable', false);
replacement.setAttribute('draggable', 'false');
replacement.setAttribute('class', 'emojione custom-emoji');
replacement.setAttribute('alt', shortname);
replacement.setAttribute('title', shortname);
@ -65,7 +65,7 @@ const emojifyTextNode = (node, customEmojis) => {
const { filename, shortCode } = unicodeMapping[match];
const title = shortCode ? `:${shortCode}:` : '';
replacement = document.createElement('img');
replacement.setAttribute('draggable', false);
replacement.setAttribute('draggable', 'false');
replacement.setAttribute('class', 'emojione');
replacement.setAttribute('alt', match);
replacement.setAttribute('title', title);

@ -65,7 +65,7 @@ class SelectFilter extends React.PureComponent {
}
return (
<div key={filter[0]} role='button' tabIndex='0' data-index={filter[0]} className='language-dropdown__dropdown__results__item' onClick={this.handleItemClick} onKeyDown={this.handleKeyDown}>
<div key={filter[0]} role='button' tabIndex={0} data-index={filter[0]} className='language-dropdown__dropdown__results__item' onClick={this.handleItemClick} onKeyDown={this.handleKeyDown}>
<span className='language-dropdown__dropdown__results__item__native-name'>{filter[1]}</span> {warning}
</div>
);
@ -73,7 +73,7 @@ class SelectFilter extends React.PureComponent {
renderCreateNew (name) {
return (
<div key='add-new-filter' role='button' tabIndex='0' className='language-dropdown__dropdown__results__item' onClick={this.handleNewFilterClick} onKeyDown={this.handleKeyDown}>
<div key='add-new-filter' role='button' tabIndex={0} className='language-dropdown__dropdown__results__item' onClick={this.handleNewFilterClick} onKeyDown={this.handleKeyDown}>
<Icon id='plus' fixedWidth /> <FormattedMessage id='filter_modal.select_filter.prompt_new' defaultMessage='New category: {name}' values={{ name }} />
</div>
);

@ -418,7 +418,7 @@ class Announcements extends ImmutablePureComponent {
<img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
<div className='announcements__container'>
<ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
<ReactSwipeableViews animateHeight animateTransitions={!reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
{announcements.map((announcement, idx) => (
<Announcement
key={announcement.get('id')}

@ -63,7 +63,7 @@ class Search extends React.PureComponent {
/>
</label>
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
<div role='button' tabIndex={0} className='search__icon' onClick={this.handleClear}>
<Icon id='search' className={classNames({ active: !hasValue })} />
<Icon id='times-circle' aria-label={intl.formatMessage(messages.search)} className={classNames({ active: hasValue })} />
</div>

@ -60,7 +60,7 @@ class ListEditor extends ImmutablePureComponent {
{accountIds.map(accountId => <Account key={accountId} accountId={accountId} added />)}
</div>
{showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}
{showSearch && <div role='button' tabIndex={-1} className='drawer__backdrop' onClick={onClear} />}
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
{({ x }) => (

@ -176,11 +176,11 @@ class ListTimeline extends React.PureComponent {
multiColumn={multiColumn}
>
<div className='column-settings__row column-header__links'>
<button type='button' className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleEditClick}>
<button type='button' className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.handleEditClick}>
<Icon id='pencil' /> <FormattedMessage id='lists.edit' defaultMessage='Edit list' />
</button>
<button type='button' className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleDeleteClick}>
<button type='button' className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.handleDeleteClick}>
<Icon id='trash' /> <FormattedMessage id='lists.delete' defaultMessage='Delete list' />
</button>
</div>

@ -11,7 +11,7 @@ export default class ClearColumnButton extends React.PureComponent {
render () {
return (
<button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>
<button className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>
);
}

@ -10,7 +10,7 @@ export default class GrantPermissionButton extends React.PureComponent {
render () {
return (
<button className='text-btn column-header__permission-btn' tabIndex='0' onClick={this.props.onClick}>
<button className='text-btn column-header__permission-btn' tabIndex={0} onClick={this.props.onClick}>
<FormattedMessage id='notifications.grant_permission' defaultMessage='Grant permission.' />
</button>
);

@ -123,7 +123,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-follow focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>
<div className={classNames('notification notification-follow focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='user-plus' fixedWidth />
@ -145,7 +145,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='user' fixedWidth />
@ -185,7 +185,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-favourite focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className={classNames('notification notification-favourite focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='star' className='star-icon' fixedWidth />
@ -217,7 +217,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-reblog focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className={classNames('notification notification-reblog focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='retweet' fixedWidth />
@ -253,7 +253,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-status focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.status, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className={classNames('notification notification-status focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.status, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='home' fixedWidth />
@ -290,7 +290,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-update focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.update, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className={classNames('notification notification-update focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.update, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='pencil' fixedWidth />
@ -329,7 +329,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-poll focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>
<div className={classNames('notification notification-poll focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='tasks' fixedWidth />
@ -366,7 +366,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminSignUp, { name: account.get('acct') }), notification.get('created_at'))}>
<div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminSignUp, { name: account.get('acct') }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='user-plus' fixedWidth />
@ -396,7 +396,7 @@ class Notification extends ImmutablePureComponent {
return (
<HotKeys handlers={this.getHandlers()}>
<div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminReport, { name: account.get('acct'), target: notification.getIn(['report', 'target_account', 'acct']) }), notification.get('created_at'))}>
<div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminReport, { name: account.get('acct'), target: notification.getIn(['report', 'target_account', 'acct']) }), notification.get('created_at'))}>
<div className='notification__message'>
<div className='notification__favourite-icon-wrapper'>
<Icon id='flag' fixedWidth />

@ -40,7 +40,7 @@ export default class Option extends React.PureComponent {
<span
className={classNames('poll__input', { active: checked, checkbox: multiple })}
tabIndex='0'
tabIndex={0}
role='radio'
onKeyPress={this.handleKeyPress}
aria-checked={checked}

@ -630,7 +630,7 @@ class Status extends ImmutablePureComponent {
{ancestors}
<HotKeys handlers={handlers}>
<div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>
<div className={classNames('focusable', 'detailed-status__wrapper', `detailed-status__wrapper-${status.get('visibility')}`)} tabIndex={0} aria-label={textForScreenReader(intl, status, false)}>
<DetailedStatus
key={`details-${status.get('id')}`}
status={status}

@ -23,7 +23,7 @@ export default class ActionsModal extends ImmutablePureComponent {
return (
<li key={`${text}-${i}`}>
<a href={href} target='_blank' rel='noopener noreferrer' onClick={this.props.onClick} data-index={i} className={classNames({ active })}>
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex='-1' inverted />}
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex={-1} inverted />}
<div>
<div className={classNames({ 'actions-modal__item-label': !!meta })}>{text}</div>
<div>{meta}</div>

@ -138,8 +138,8 @@ class MediaModal extends ImmutablePureComponent {
const index = this.getIndex();
const leftNav = media.size > 1 && <button tabIndex='0' className='media-modal__nav media-modal__nav--left' onClick={this.handlePrevClick} aria-label={intl.formatMessage(messages.previous)}><Icon id='chevron-left' fixedWidth /></button>;
const rightNav = media.size > 1 && <button tabIndex='0' className='media-modal__nav media-modal__nav--right' onClick={this.handleNextClick} aria-label={intl.formatMessage(messages.next)}><Icon id='chevron-right' fixedWidth /></button>;
const leftNav = media.size > 1 && <button tabIndex={0} className='media-modal__nav media-modal__nav--left' onClick={this.handlePrevClick} aria-label={intl.formatMessage(messages.previous)}><Icon id='chevron-left' fixedWidth /></button>;
const rightNav = media.size > 1 && <button tabIndex={0} className='media-modal__nav media-modal__nav--right' onClick={this.handleNextClick} aria-label={intl.formatMessage(messages.next)}><Icon id='chevron-right' fixedWidth /></button>;
const content = media.map((image) => {
const width = image.getIn(['meta', 'original', 'width']) || null;

@ -73,7 +73,7 @@ export default class ModalRoot extends React.PureComponent {
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
} else {
document.body.classList.remove('with-modals--active');
document.documentElement.style.marginRight = 0;
document.documentElement.style.marginRight = '0';
}
}

@ -582,7 +582,7 @@ class Video extends React.PureComponent {
poster={preview}
preload={preload}
role='button'
tabIndex='0'
tabIndex={0}
aria-label={alt}
title={alt}
lang={lang}
@ -611,7 +611,7 @@ class Video extends React.PureComponent {
<span
className={classNames('video-player__seek__handle', { active: dragging })}
tabIndex='0'
tabIndex={0}
style={{ left: `${progress}%` }}
onKeyDown={this.handleVideoKeyDown}
/>
@ -627,7 +627,7 @@ class Video extends React.PureComponent {
<span
className={classNames('video-player__volume__handle')}
tabIndex='0'
tabIndex={0}
style={{ left: `${volume * 100}%` }}
/>
</div>

@ -55,7 +55,7 @@
* @property {boolean=} delete_modal
* @property {boolean=} disable_swiping
* @property {string=} disabled_account_id
* @property {boolean} display_media
* @property {string} display_media
* @property {string} domain
* @property {boolean=} expand_spoilers
* @property {boolean} limited_federation_mode

@ -12,7 +12,6 @@ function importExtraPolyfills() {
function loadPolyfills() {
const needsBasePolyfills = !(
Array.prototype.includes &&
HTMLCanvasElement.prototype.toBlob &&
window.Intl &&
Object.assign &&

@ -20,7 +20,7 @@
"account.blocked": "Blocked",
"account.browse_more_on_origin_server": "Restolar más nel perfil orixinal",
"account.cancel_follow_request": "Withdraw follow request",
"account.direct": "Privately mention @{name}",
"account.direct": "Mentar a @{name} per privao",
"account.disable_notifications": "Dexar d'avisame cuando @{name} espublice artículos",
"account.domain_blocked": "Domain blocked",
"account.edit_profile": "Editar el perfil",
@ -102,7 +102,7 @@
"column.blocks": "Perfiles bloquiaos",
"column.bookmarks": "Marcadores",
"column.community": "Llinia de tiempu llocal",
"column.direct": "Private mentions",
"column.direct": "Menciones privaes",
"column.directory": "Browse profiles",
"column.domain_blocks": "Dominios bloquiaos",
"column.favourites": "Favoritos",
@ -216,7 +216,7 @@
"empty_column.blocks": "Entá nun bloquiesti a nengún perfil.",
"empty_column.bookmarked_statuses": "Entá nun tienes nengún artículu en Marcadores. Cuando amiestes dalgún, apaez equí.",
"empty_column.community": "La llinia de tiempu llocal ta balera. ¡Espubliza daqué públicamente pa comenzar l'alderique!",
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
"empty_column.direct": "Entá nun tienes nenguna mención privada. Cuando unvies o recibas dalguna, apaez equí.",
"empty_column.domain_blocks": "Entá nun hai nengún dominiu bloquiáu.",
"empty_column.explore_statuses": "Agora nun hai nada en tendencia. ¡Volvi equí dempués!",
"empty_column.favourited_statuses": "Entá nun marquesti nengún artículu como favoritu. Cuando marques dalgún, apaez equí.",
@ -314,7 +314,7 @@
"keyboard_shortcuts.column": "Enfocar una columna",
"keyboard_shortcuts.compose": "Enfocar l'área de composición",
"keyboard_shortcuts.description": "Descripción",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.direct": "p'abrir la columna de les menciones privaes",
"keyboard_shortcuts.down": "Baxar na llista",
"keyboard_shortcuts.enter": "Abrir un artículu",
"keyboard_shortcuts.favourite": "Marcar un artículu como favoritu",
@ -376,7 +376,7 @@
"navigation_bar.bookmarks": "Marcadores",
"navigation_bar.community_timeline": "Llinia de tiempu llocal",
"navigation_bar.compose": "Compose new post",
"navigation_bar.direct": "Private mentions",
"navigation_bar.direct": "Menciones privaes",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Dominios bloquiaos",
"navigation_bar.edit_profile": "Editar el perfil",
@ -559,8 +559,8 @@
"status.copy": "Copiar l'enllaz al artículu",
"status.delete": "Desaniciar",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Privately mention @{name}",
"status.direct_indicator": "Private mention",
"status.direct": "Mentar a @{name} per privao",
"status.direct_indicator": "Mención privada",
"status.edit": "Edit",
"status.edited": "Editóse'l {date}",
"status.edited_x_times": "Editóse {count, plural, one {{count} vegada} other {{count} vegaes}}",

@ -522,17 +522,17 @@
"report_notification.categories.spam": "Спам",
"report_notification.categories.violation": "Парушэнне правілаў",
"report_notification.open": "Адкрыць скаргу",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Гісторыя пошуку пустая",
"search.placeholder": "Пошук",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Супадзенне профіляў {x}",
"search.quick_action.go_to_account": "Перайсці да профілю {x}",
"search.quick_action.go_to_hashtag": "Перайсці да хэштэгу {x}",
"search.quick_action.open_url": "Адкрыць спасылку ў Mastodon",
"search.quick_action.status_search": "Супадзенне паведамленняў {x}",
"search.search_or_paste": "Увядзіце спасылку або пошукавы запыт",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "Хуткія дзеянні",
"search_popout.recent": "Нядаўнія запыты",
"search_results.accounts": "Профілі",
"search_results.all": "Усё",
"search_results.hashtags": "Хэштэгі",
"search_results.nothing_found": "Па дадзенаму запыту нічога не знойдзена",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Brossa",
"report_notification.categories.violation": "Violació de norma",
"report_notification.open": "Obre un informe",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "No hi ha cerques recents",
"search.placeholder": "Cerca",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfils coincidents {x}",
"search.quick_action.go_to_account": "Anar al perfil {x}",
"search.quick_action.go_to_hashtag": "Anar a la etiqueta {x}",
"search.quick_action.open_url": "Obrir URL a Mastodon",
"search.quick_action.status_search": "Tuts coincidents {x}",
"search.search_or_paste": "Cerca o escriu l'URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Accions ràpides",
"search_popout.recent": "Cerques recents",
"search_results.accounts": "Perfils",
"search_results.all": "Tots",
"search_results.hashtags": "Etiquetes",

@ -20,7 +20,7 @@
"account.blocked": "بلۆککرا",
"account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
"account.cancel_follow_request": "داواکاری فۆڵۆو بکشێنەوە",
"account.direct": "Privately mention @{name}",
"account.direct": "بە شێوەیەکی تایبەت باسی @{name} بکە",
"account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
"account.domain_blocked": "دۆمەین قەپاتکرا",
"account.edit_profile": "دەستکاری پرۆفایل",
@ -29,14 +29,14 @@
"account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
"account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
"account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
"account.follow": "شوێنکەوتن",
"account.follow": "بەدواداچوون",
"account.followers": "شوێنکەوتووان",
"account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
"account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
"account.following": "دواکەوتن",
"account.following": "بەدوادا",
"account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
"account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
"account.follows_you": "شوێنکەوتووەکانت",
"account.follows_you": "شوێنت دەکەوێت",
"account.go_to_profile": "بڕۆ بۆ پڕۆفایلی",
"account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
"account.joined_short": "بەشداری کردووە",
@ -50,7 +50,7 @@
"account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
"account.muted": "بێ دەنگ",
"account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە",
"account.posts": "توتس",
"account.posts": "نووسراوەکان",
"account.posts_with_replies": "توتس و وەڵامەکان",
"account.report": "گوزارشت @{name}",
"account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
@ -102,7 +102,7 @@
"column.blocks": "بەکارهێنەرە بلۆککراوەکان",
"column.bookmarks": "نیشانەکان",
"column.community": "هێڵی کاتی ناوخۆیی",
"column.direct": "Private mentions",
"column.direct": "ئاماژەی تایبەت",
"column.directory": "گەڕان لە پرۆفایلەکان",
"column.domain_blocks": "دۆمەینە داخراوەکان",
"column.favourites": "دڵخوازترینەکان",
@ -216,7 +216,7 @@
"empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
"empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
"empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
"empty_column.direct": "تا ئێستا هیچ نامەیەکی ڕاستەوخۆت نییە. کاتێک یەکێکیان دەنێری یان وەریدەگریت، لێرە دەردەکەوێت.",
"empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
"empty_column.explore_statuses": "لە ئێستادا هیچ شتێک ترێند نییە. دواتر سەیری بکە!",
"empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
@ -299,12 +299,12 @@
"interaction_modal.description.reply": "بە هەژمارێک لەسەر ماستدۆن، ئەتوانیت وەڵامی ئەم بڵاوکراوەیە بدەیتەوە.",
"interaction_modal.on_another_server": "لەسەر ڕاژەیەکی جیا",
"interaction_modal.on_this_server": "لەسەر ئەم ڕاژەیە",
"interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
"interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
"interaction_modal.title.favourite": "Favourite {name}'s post",
"interaction_modal.title.follow": "Follow {name}",
"interaction_modal.title.reblog": "Boost {name}'s post",
"interaction_modal.title.reply": "Reply to {name}'s post",
"interaction_modal.other_server_instructions": "ئەم URLە کۆپی بکە و بیخە ناو بواری گەڕانی ئەپی دڵخوازت لە ماستۆدۆن یان ڕووکاری وێبی سێرڤەری ماستۆدۆنەکەت.",
"interaction_modal.preamble": "بەو پێیەی ماستۆدۆن لامەرکەزییە، دەتوانیت ئەکاونتی ئێستات بەکاربهێنیت کە لەلایەن سێرڤەرێکی تری ماستۆدۆن یان پلاتفۆرمی گونجاوەوە هۆست کراوە ئەگەر ئەکاونتێکت لەسەر ئەم ئەکاونتە نەبێت.",
"interaction_modal.title.favourite": "پۆستی {name}ی دڵخواز",
"interaction_modal.title.follow": "دوای {name} بکەوە",
"interaction_modal.title.reblog": "پۆستی {name} زیاد بکە",
"interaction_modal.title.reply": "وەڵامی پۆستەکەی {name} بدەرەوە",
"intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
"intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
"intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
@ -314,7 +314,7 @@
"keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
"keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
"keyboard_shortcuts.description": "وهسف",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی ئاماژەی تایبەت",
"keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
"keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
"keyboard_shortcuts.favourite": "بۆ دڵخواز",
@ -348,7 +348,7 @@
"lightbox.next": "داهاتوو",
"lightbox.previous": "پێشوو",
"limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
"limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
"limited_account_hint.title": "ئەم پرۆفایلە لەلایەن بەڕێوەبەرانی {domain} شاراوەتەوە.",
"lists.account.add": "زیادکردن بۆ لیست",
"lists.account.remove": "لابردن لە لیست",
"lists.delete": "سڕینەوەی لیست",
@ -367,16 +367,16 @@
"media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
"missing_indicator.label": "نەدۆزرایەوە",
"missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
"moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.",
"moved_to_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە چونکە تۆ چوویتە {movedToAccount}.",
"mute_modal.duration": "ماوە",
"mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
"mute_modal.indefinite": "نادیار",
"navigation_bar.about": "About",
"navigation_bar.about": "دەربارە",
"navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
"navigation_bar.bookmarks": "نیشانکراوەکان",
"navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
"navigation_bar.compose": "نووسینی توتی نوێ",
"navigation_bar.direct": "Private mentions",
"navigation_bar.direct": "ئاماژەی تایبەت",
"navigation_bar.discover": "دۆزینەوە",
"navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
"navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
@ -384,7 +384,7 @@
"navigation_bar.favourites": "دڵخوازەکان",
"navigation_bar.filters": "وشە کپەکان",
"navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
"navigation_bar.followed_tags": "Followed hashtags",
"navigation_bar.followed_tags": "هاشتاگی بەدوادا هات",
"navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
"navigation_bar.lists": "لیستەکان",
"navigation_bar.logout": "دەرچوون",
@ -393,10 +393,10 @@
"navigation_bar.pins": "توتی چەسپاو",
"navigation_bar.preferences": "پەسەندەکان",
"navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
"navigation_bar.search": "Search",
"navigation_bar.search": "گەڕان",
"navigation_bar.security": "ئاسایش",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
"notification.admin.report": "{name} reported {target}",
"not_signed_in_indicator.not_signed_in": "پێویستە بچیتە ژوورەوە بۆ دەستگەیشتن بەم سەرچاوەیە.",
"notification.admin.report": "{name} ڕاپۆرت کراوە {target}",
"notification.admin.sign_up": "{name} تۆمارکرا",
"notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
"notification.follow": "{name} دوای تۆ کەوت",
@ -409,7 +409,7 @@
"notification.update": "{name} پۆستێکی دەستکاریکرد",
"notifications.clear": "ئاگانامەکان بسڕیەوە",
"notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
"notifications.column_settings.admin.report": "New reports:",
"notifications.column_settings.admin.report": "ڕاپۆرتە نوێیەکان:",
"notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:",
"notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
"notifications.column_settings.favourite": "دڵخوازترین:",
@ -463,8 +463,8 @@
"privacy.public.short": "گشتی",
"privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە",
"privacy.unlisted.short": "لە لیست نەکراو",
"privacy_policy.last_updated": "Last updated {date}",
"privacy_policy.title": "Privacy Policy",
"privacy_policy.last_updated": "دوایین نوێکردنەوە {date}",
"privacy_policy.title": "سیاسەتی تایبەتێتی",
"refresh": "نوێکردنەوە",
"regeneration_indicator.label": "بارکردن…",
"regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
@ -518,29 +518,29 @@
"report.unfollow": "بەدوادانەچوو@{name}",
"report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.",
"report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached",
"report_notification.categories.other": "Other",
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Rule violation",
"report_notification.open": "Open report",
"search.no_recent_searches": "No recent searches",
"report_notification.categories.other": "هی تر",
"report_notification.categories.spam": "سپام",
"report_notification.categories.violation": "پێشێلکردنی یاسا",
"report_notification.open": "ڕاپۆرتەکان بکەوە",
"search.no_recent_searches": "گەڕانەکانی ئەم دواییە",
"search.placeholder": "گەڕان",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.search_or_paste": "Search or paste URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search.quick_action.account_search": "پڕۆفایلی هاوتا لەگەڵ {x}",
"search.quick_action.go_to_account": "بڕۆ بۆ پڕۆفایلی{x}",
"search.quick_action.go_to_hashtag": "بڕۆ بۆ هاشتاگی {x}",
"search.quick_action.open_url": "بەستەرەکان لەناو ماستۆدۆن بکەوە",
"search.quick_action.status_search": "پڕۆفایلی هاوتا لەگەڵ {x}",
"search.search_or_paste": "گەڕان یان لێدانی URL",
"search_popout.quick_actions": "کرداری خێرا",
"search_popout.recent": "گەڕانەکانی ئەم دواییە",
"search_results.accounts": "پرۆفایلەکان",
"search_results.all": "هەموو",
"search_results.hashtags": "هەشتاگ",
"search_results.nothing_found": "Could not find anything for these search terms",
"search_results.nothing_found": "هیچ بۆ ئەم زاراوە گەڕانانە نەدۆزراوەتەوە",
"search_results.statuses": "توتەکان",
"search_results.statuses_fts_disabled": "گەڕانی توتەکان بە ناوەڕۆکیان لەسەر ئەم ڕاژەی ماستۆدۆن چالاک نەکراوە.",
"search_results.title": "Search for {q}",
"search_results.title": "گەڕان بەدوای {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.about_active_users": "ئەو کەسانەی لە ماوەی ٣٠ ڕۆژی ڕابردوودا ئەم سێرڤەرە بەکاردەهێنن (بەکارهێنەرانی چالاک مانگانە)",
"server_banner.active_users": "بەکارهێنەرانی چالاک",
"server_banner.administered_by": "بەڕێوەبردن لەلایەن:",
"server_banner.introduction": "{domain} بەشێکە لەو تۆڕە کۆمەڵایەتییە لامەرکەزییەی کە لەلایەن {mastodon}ەوە بەهێز دەکرێت.",
@ -548,9 +548,9 @@
"server_banner.server_stats": "دۆخی ڕاژەکار:",
"sign_in_banner.create_account": "هەژمار دروستبکە",
"sign_in_banner.sign_in": "بچۆ ژوورەوە",
"sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.",
"sign_in_banner.text": "چوونەژوورەوە بۆ فۆڵۆوکردنی پڕۆفایلی یان هاشتاگەکان، دڵخوازەکان، شەیرکردن و وەڵامدانەوەی پۆستەکان. هەروەها دەتوانیت لە ئەکاونتەکەتەوە لەسەر سێرڤەرێکی جیاواز کارلێک بکەیت.",
"status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
"status.admin_domain": "Open moderation interface for {domain}",
"status.admin_domain": "ڕووکاری مامناوەندی بکەرەوە بۆ {domain}",
"status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
"status.block": "@{name} ئاستەنگ بکە",
"status.bookmark": "نیشانه",
@ -559,8 +559,8 @@
"status.copy": "ڕوونووسی بەستەر بۆ توت",
"status.delete": "سڕینەوە",
"status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
"status.direct": "Privately mention @{name}",
"status.direct_indicator": "Private mention",
"status.direct": "بە شێوەیەکی تایبەت باسی @{name} بکە",
"status.direct_indicator": "ئاماژەی تایبەت",
"status.edit": "دەستکاری",
"status.edited": "بەشداری {date}",
"status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
@ -568,7 +568,7 @@
"status.favourite": "دڵخواز",
"status.filter": "ئەم پۆستە فلتەر بکە",
"status.filtered": "پاڵاوتن",
"status.hide": "Hide post",
"status.hide": "شاردنەوەی پۆست",
"status.history.created": "{name} دروستکراوە لە{date}",
"status.history.edited": "{name} دروستکاریکراوە لە{date}",
"status.load_more": "زیاتر بار بکە",

@ -20,7 +20,7 @@
"account.blocked": "Blokovaný",
"account.browse_more_on_origin_server": "Více na původním profilu",
"account.cancel_follow_request": "Zrušit žádost o sledování",
"account.direct": "Privately mention @{name}",
"account.direct": "Soukromě zmínit @{name}",
"account.disable_notifications": "Přestat mě upozorňovat, když @{name} zveřejní příspěvek",
"account.domain_blocked": "Doména blokována",
"account.edit_profile": "Upravit profil",
@ -102,7 +102,7 @@
"column.blocks": "Blokovaní uživatelé",
"column.bookmarks": "Záložky",
"column.community": "Místní časová osa",
"column.direct": "Private mentions",
"column.direct": "Soukromé zmínky",
"column.directory": "Prozkoumat profily",
"column.domain_blocks": "Blokované domény",
"column.favourites": "Oblíbené",
@ -163,7 +163,7 @@
"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čí blokovat 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.edit.confirm": "Upravit",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
"confirmations.logout.confirm": "Odhlásit se",
"confirmations.logout.message": "Opravdu se chcete odhlásit?",
"confirmations.mute.confirm": "Skrýt",
@ -216,7 +216,7 @@
"empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.",
"empty_column.bookmarked_statuses": "Zatím v záložkách nemáte žádné příspěvky. Až si do nich nějaký přidáte, zobrazí se zde.",
"empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
"empty_column.direct": "Zatím nemáte žádné soukromé zmínky. Až nějakou pošlete nebo dostanete, zobrazí se zde.",
"empty_column.domain_blocks": "Ještě nemáte žádné zablokované domény.",
"empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!",
"empty_column.favourited_statuses": "Zatím nemáte žádné oblíbené příspěvky. Až si nějaký oblíbíte, zobrazí se zde.",
@ -376,7 +376,7 @@
"navigation_bar.bookmarks": "Záložky",
"navigation_bar.community_timeline": "Místní časová osa",
"navigation_bar.compose": "Vytvořit nový příspěvek",
"navigation_bar.direct": "Private mentions",
"navigation_bar.direct": "Soukromé zmínky",
"navigation_bar.discover": "Objevit",
"navigation_bar.domain_blocks": "Blokované domény",
"navigation_bar.edit_profile": "Upravit profil",
@ -522,17 +522,17 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Porušení pravidla",
"report_notification.open": "Otevřít hlášení",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Žádná nedávná vyhledávání",
"search.placeholder": "Hledat",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profily odpovídající {x}",
"search.quick_action.go_to_account": "Přejít na profil {x}",
"search.quick_action.go_to_hashtag": "Přejít na hashtag {x}",
"search.quick_action.open_url": "Otevřít URL v Mastodonu",
"search.quick_action.status_search": "Příspěvky odpovídající {x}",
"search.search_or_paste": "Hledat nebo vložit URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "Rychlé akce",
"search_popout.recent": "Nedávná vyhledávání",
"search_results.accounts": "Profily",
"search_results.all": "Vše",
"search_results.hashtags": "Hashtagy",
"search_results.nothing_found": "Pro tyto hledané výrazy nebylo nic nenalezeno",
@ -560,7 +560,7 @@
"status.delete": "Smazat",
"status.detailed_status": "Podrobné zobrazení konverzace",
"status.direct": "Privately mention @{name}",
"status.direct_indicator": "Private mention",
"status.direct_indicator": "Soukromá zmínka",
"status.edit": "Upravit",
"status.edited": "Upraveno {date}",
"status.edited_x_times": "Upraveno {count, plural, one {{count}krát} few {{count}krát} many {{count}krát} other {{count}krát}}",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Regelovertrædelse",
"report_notification.open": "Åbn anmeldelse",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Ingen seneste søgninger",
"search.placeholder": "Søg",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profiler matchende {x}",
"search.quick_action.go_to_account": "Gå til profilen {x}",
"search.quick_action.go_to_hashtag": "Gå til hashtagget {x}",
"search.quick_action.open_url": "Åbn URL i Mastodon",
"search.quick_action.status_search": "Indlæg matchende {x}",
"search.search_or_paste": "Søg efter eller angiv URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Hurtige handlinger",
"search_popout.recent": "Seneste søgninger",
"search_results.accounts": "Profiler",
"search_results.all": "Alle",
"search_results.hashtags": "Hashtags",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Regelverstoß",
"report_notification.open": "Meldung öffnen",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Keine kürzlichen Suchanfragen",
"search.placeholder": "Suche",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profile passend zu {x}",
"search.quick_action.go_to_account": "Profil {x} aufrufen",
"search.quick_action.go_to_hashtag": "Hashtag {x} aufrufen",
"search.quick_action.open_url": "URL in Mastodon öffnen",
"search.quick_action.status_search": "Beiträge passend zu {x}",
"search.search_or_paste": "Suchen oder URL einfügen",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Schnellaktionen",
"search_popout.recent": "Kürzliche Suchanfragen",
"search_results.accounts": "Profile",
"search_results.all": "Alles",
"search_results.hashtags": "Hashtags",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Ανεπιθύμητα",
"report_notification.categories.violation": "Παραβίαση κανόνα",
"report_notification.open": "Ανοικτό",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Καμμία πρόσφατη αναζήτηση",
"search.placeholder": "Αναζήτηση",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Προφίλ που ταιριάζουν με {x}",
"search.quick_action.go_to_account": "Μετάβαση στο προφίλ {x}",
"search.quick_action.go_to_hashtag": "Μετάβαση στην ετικέτα {x}",
"search.quick_action.open_url": "Άνοιγμα διεύθυνσης URL στο Mastodon",
"search.quick_action.status_search": "Αναρτήσεις που ταιριάζουν με {x}",
"search.search_or_paste": "Αναζήτηση ή εισαγωγή URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Γρήγορες ενέργειες",
"search_popout.recent": "Πρόσφατες αναζητήσεις",
"search_results.accounts": "Προφίλ",
"search_results.all": "Όλα",
"search_results.hashtags": "Ετικέτες",

@ -522,17 +522,17 @@
"report_notification.categories.spam": "Trudmesaĝo",
"report_notification.categories.violation": "Malobservo de la regulo",
"report_notification.open": "Malfermi la raporton",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Neniuj lastaj serĉoj",
"search.placeholder": "Serĉi",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profiloj kiuj kongruas kun {x}",
"search.quick_action.go_to_account": "Iri al profilo {x}",
"search.quick_action.go_to_hashtag": "Iri al kradvorto {x}",
"search.quick_action.open_url": "Malfermi URL en Mastodono",
"search.quick_action.status_search": "Afiŝoj kiuj kongruas kun {x}",
"search.search_or_paste": "Serĉu aŭ algluu URL-on",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "Rapidaj agoj",
"search_popout.recent": "Lastaj serĉoj",
"search_results.accounts": "Profiloj",
"search_results.all": "Ĉiuj",
"search_results.hashtags": "Kradvortoj",
"search_results.nothing_found": "Povis trovi nenion por ĉi tiuj serĉaj terminoj",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Violación de regla",
"report_notification.open": "Abrir denuncia",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Sin búsquedas recientes",
"search.placeholder": "Buscar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfiles que coinciden con {x}",
"search.quick_action.go_to_account": "Ir al perfil de {x}",
"search.quick_action.go_to_hashtag": "Ir a la etiqueta {x}",
"search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Mensajes que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar dirección web",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes",
"search_results.accounts": "Perfiles",
"search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Infracción de regla",
"report_notification.open": "Abrir denuncia",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Sin búsquedas recientes",
"search.placeholder": "Buscar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfiles que coinciden con {x}",
"search.quick_action.go_to_account": "Ir al perfil {x}",
"search.quick_action.go_to_hashtag": "Ir a la etiqueta {x}",
"search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Publicaciones que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes",
"search_results.accounts": "Perfiles",
"search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",

@ -59,13 +59,13 @@
"account.show_reblogs": "Mostrar impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
"account.unblock": "Desbloquear a @{name}",
"account.unblock_domain": "Mostrar {domain}",
"account.unblock_domain": "Desbloquear dominio {domain}",
"account.unblock_short": "Desbloquear",
"account.unendorse": "No destacar en el perfil",
"account.unfollow": "Dejar de seguir",
"account.unmute": "Dejar de silenciar a @{name}",
"account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
"account.unmute_short": "Desilenciar",
"account.unmute_short": "Dejar de silenciar",
"account_note.placeholder": "Clic para añadir nota",
"admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro",
"admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro",
@ -76,7 +76,7 @@
"alert.rate_limited.title": "Tráfico limitado",
"alert.unexpected.message": "Hubo un error inesperado.",
"alert.unexpected.title": "¡Ups!",
"announcement.announcement": "Comunicación",
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "(sin procesar)",
"audio.hide": "Ocultar audio",
"autosuggest_hashtag.per_week": "{count} por semana",
@ -140,12 +140,12 @@
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.publish_loud": "¡{publish}!",
"compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
"compose_form.sensitive.marked": "{count, plural, one {Material marcado como sensible} other {Material marcado como sensible}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Material no marcado como sensible} other {Material no marcado como sensible}}",
"compose_form.spoiler.marked": "Texto oculto tras la advertencia",
"compose_form.spoiler.marked": "Quitar advertencia de contenido",
"compose_form.spoiler.unmarked": "Añadir advertencia de contenido",
"compose_form.spoiler_placeholder": "Escribe aquí tu advertencia",
"confirmation_modal.cancel": "Cancelar",
@ -160,7 +160,7 @@
"confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
"confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Tienes cambios sin guardar en la descripción o vista previa del archivo audiovisual, ¿descartarlos de todos modos?",
"confirmations.domain_block.confirm": "Ocultar dominio entero",
"confirmations.domain_block.confirm": "Bloquear dominio entero",
"confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
"confirmations.edit.confirm": "Editar",
"confirmations.edit.message": "Editar ahora reemplazará el mensaje que está escribiendo. ¿Está seguro que quiere proceder?",
@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Infracción de regla",
"report_notification.open": "Abrir informe",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Sin búsquedas recientes",
"search.placeholder": "Buscar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfiles que coinciden con {x}",
"search.quick_action.go_to_account": "Ir al perfil {x}",
"search.quick_action.go_to_hashtag": "Ir a la etiqueta {x}",
"search.quick_action.open_url": "Abrir enlace en Mastodon",
"search.quick_action.status_search": "Publicaciones que coinciden con {x}",
"search.search_or_paste": "Buscar o pegar URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Acciones rápidas",
"search_popout.recent": "Búsquedas recientes",
"search_results.accounts": "Perfiles",
"search_results.all": "Todos",
"search_results.hashtags": "Etiquetas",

@ -224,7 +224,7 @@
"empty_column.follow_recommendations": "Tundub, et sinu jaoks ei ole võimalik soovitusi luua. Proovi kasutada otsingut, et leida tuttavaid inimesi, või sirvi populaarseid silte.",
"empty_column.follow_requests": "Pole hetkel ühtegi jälgimistaotlust. Kui saad mõne, näed neid siin.",
"empty_column.followed_tags": "Sa ei jälgi veel ühtegi märksõna. Kui jälgid, ilmuvad need siia.",
"empty_column.hashtag": "Seda sildi all ei ole ühtegi postitust.",
"empty_column.hashtag": "Selle sildi all ei ole ühtegi postitust.",
"empty_column.home": "Su koduajajoon on tühi. Jälgi rohkemaid inimesi, et seda täita {suggestions}",
"empty_column.home.suggestions": "Vaata mõndasid soovitusi",
"empty_column.list": "Siin loetelus pole veel midagi. Kui loetelu liikmed teevad uusi postitusi, näed neid siin.",
@ -522,16 +522,16 @@
"report_notification.categories.spam": "Rämpspost",
"report_notification.categories.violation": "Reeglite rikkumine",
"report_notification.open": "Ava teavitus",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Pole viimatisi otsinguid",
"search.placeholder": "Otsi",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Sobivaid profiile {x}",
"search.quick_action.go_to_account": "Mine profiili {x}",
"search.quick_action.go_to_hashtag": "Ava silt {x}",
"search.quick_action.open_url": "Ava URL Mastodonis",
"search.quick_action.status_search": "Sobivad postitused {x}",
"search.search_or_paste": "Otsi või kleebi URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Kiirtegevused",
"search_popout.recent": "Viimatised otsingud",
"search_results.accounts": "Profiilid",
"search_results.all": "Kõik",
"search_results.hashtags": "Sildid",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Arau haustea",
"report_notification.open": "Ireki salaketa",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Duela gutxiko bilaketarik ez",
"search.placeholder": "Bilatu",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "{x}-(r)ekin bat datozen profilak",
"search.quick_action.go_to_account": "Joan {x} profilera",
"search.quick_action.go_to_hashtag": "Joan {x} traolara",
"search.quick_action.open_url": "Ireki URLa Mastodonen",
"search.quick_action.status_search": "{x}-(r)ekin bat datozen argitalpenak",
"search.search_or_paste": "Bilatu edo itsatsi URLa",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Ekintza azkarrak",
"search_popout.recent": "Duela gutxiko bilaketak",
"search_results.accounts": "Profilak",
"search_results.all": "Guztiak",
"search_results.hashtags": "Traolak",

@ -20,7 +20,7 @@
"account.blocked": "مسدود",
"account.browse_more_on_origin_server": "مرور بیشتر روی نمایهٔ اصلی",
"account.cancel_follow_request": "رد کردن درخواست پیگیری",
"account.direct": "Privately mention @{name}",
"account.direct": "خصوصی از @{name} نام ببرید",
"account.disable_notifications": "آگاه کردن من هنگام فرستههای @{name} را متوقّف کن",
"account.domain_blocked": "دامنه مسدود شد",
"account.edit_profile": "ویرایش نمایه",
@ -102,7 +102,7 @@
"column.blocks": "کاربران مسدود شده",
"column.bookmarks": "نشانکها",
"column.community": "خط زمانی محلّی",
"column.direct": "Private mentions",
"column.direct": "خصوصی نام ببرید",
"column.directory": "مرور نمایهها",
"column.domain_blocks": "دامنههای مسدود شده",
"column.favourites": "پسندیدهها",
@ -163,7 +163,7 @@
"confirmations.domain_block.confirm": "مسدود کردن تمام دامنه",
"confirmations.domain_block.message": "آیا جدی جدی میخواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدود کردن یا خموشاندن چند حساب خاص کافی است و توصیه میشود. پس از این کار شما هیچ محتوایی را از این دامنه در خط زمانی عمومی یا آگاهیهایتان نخواهید دید. پیگیرانتان از این دامنه هم برداشته خواهند شد.",
"confirmations.edit.confirm": "ویرایش",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.edit.message": "در صورت ویرایش، پیامی که در حال نوشتنش بودید از بین خواهد رفت. میخواهید ادامه دهید؟",
"confirmations.logout.confirm": "خروج از حساب",
"confirmations.logout.message": "مطمئنید میخواهید خارج شوید؟",
"confirmations.mute.confirm": "خموش",
@ -216,14 +216,14 @@
"empty_column.blocks": "هنوز کسی را مسدود نکردهاید.",
"empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانهگذاری شدهای ندارید. هنگامی که فرستهای را نشانهگذاری کنید، اینجا نشان داده خواهد شد.",
"empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!",
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
"empty_column.direct": "هنوز هیچ اشاره خصوصیای ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید اینجا نشان داده خواهد شد.",
"empty_column.domain_blocks": "هنوز هیچ دامنهای مسدود نشده است.",
"empty_column.explore_statuses": "الآن چیزی پرطرفدار نیست. بعداً دوباره بررسی کنید!",
"empty_column.favourited_statuses": "شما هنوز هیچ فرستهای را نپسندیدهاید. هنگامی که فرستهای را بپسندید، اینجا نشان داده خواهد شد.",
"empty_column.favourites": "هنوز هیچ کسی این فرسته را نپسندیده است. هنگامی که کسی آن را بپسندد، اینجا نشان داده خواهد شد.",
"empty_column.follow_recommendations": "به نظر نمیتوان هیچ پیشنهادی برایتان ایجاد کرد. میتوانید برای یافتن افرادی که ممکن است بشناسید از جستوجو یا کاوش برچسبهای داغ استفاده کنید.",
"empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیریای ندارید. هنگامی که چنین درخواستی بگیرید، اینجا نشان داده خواهد شد.",
"empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.",
"empty_column.followed_tags": "شما هیچ برچسبی را پینگرفتید. هنگامی که برچسبی را پیگیری کنید اینجا نمایان میشوند.",
"empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.",
"empty_column.home": "خط زمانی خانگیتان خالی است! برای پر کردنش، افراد بیشتری را پی بگیرید. {suggestions}",
"empty_column.home.suggestions": "چند پیشنهاد را ببینید",
@ -314,7 +314,7 @@
"keyboard_shortcuts.column": "برای تمرکز روی یک فرسته در یکی از ستونها",
"keyboard_shortcuts.compose": "تمرکز روی محیط نوشتن",
"keyboard_shortcuts.description": "توضیح",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.direct": "باز کردن ستون اشارههای خصوصی",
"keyboard_shortcuts.down": "پایین بردن در سیاهه",
"keyboard_shortcuts.enter": "گشودن فرسته",
"keyboard_shortcuts.favourite": "پسندیدن فرسته",
@ -376,7 +376,7 @@
"navigation_bar.bookmarks": "نشانکها",
"navigation_bar.community_timeline": "خط زمانی محلّی",
"navigation_bar.compose": "نوشتن فرستهٔ تازه",
"navigation_bar.direct": "Private mentions",
"navigation_bar.direct": "اشارههای خصوصی",
"navigation_bar.discover": "گشت و گذار",
"navigation_bar.domain_blocks": "دامنههای مسدود شده",
"navigation_bar.edit_profile": "ویرایش نمایه",
@ -522,17 +522,17 @@
"report_notification.categories.spam": "هرزنامه",
"report_notification.categories.violation": "تخطّی از قانون",
"report_notification.open": "گشودن گزارش",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "جستوجوی اخیری نیست",
"search.placeholder": "جستوجو",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "نمایههای جور با {x}",
"search.quick_action.go_to_account": "برو به نمایه {x}",
"search.quick_action.go_to_hashtag": "برو به برچسب {x}",
"search.quick_action.open_url": "باز کردن پیوند در ماستودون",
"search.quick_action.status_search": "فرستههای جور با {x}",
"search.search_or_paste": "جستوجو یا جایگذاری نشانی",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "کنشهای سریع",
"search_popout.recent": "جستوجوهای اخیر",
"search_results.accounts": "نمایهها",
"search_results.all": "همه",
"search_results.hashtags": "برچسبها",
"search_results.nothing_found": "چیزی برای این عبارت جستوجو یافت نشد",
@ -548,7 +548,7 @@
"server_banner.server_stats": "آمار کارساز:",
"sign_in_banner.create_account": "ایجاد حساب",
"sign_in_banner.sign_in": "ورود",
"sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.",
"sign_in_banner.text": "برای پیگیری نمایهها یا برچسبها، پسندیدن، همرسانی و یا پاسخ به فرستهها وارد شوید. همچنین میتوانید این کارها را با حسابتان در کارسازی دیگر انجام دهید.",
"status.admin_account": "گشودن واسط مدیریت برای @{name}",
"status.admin_domain": "گشودن واسط مدیریت برای {domain}",
"status.admin_status": "گشودن این فرسته در واسط مدیریت",
@ -559,8 +559,8 @@
"status.copy": "رونوشت از پیوند فرسته",
"status.delete": "حذف",
"status.detailed_status": "نمایش کامل گفتگو",
"status.direct": "Privately mention @{name}",
"status.direct_indicator": "Private mention",
"status.direct": "خصوصی به @{name} اشاره کنید",
"status.direct_indicator": "اشاره خصوصی",
"status.edit": "ویرایش",
"status.edited": "ویرایش شده در {date}",
"status.edited_x_times": "{count, plural, one {{count} مرتبه} other {{count} مرتبه}} ویرایش شد",

@ -153,14 +153,14 @@
"confirmations.block.confirm": "Estä",
"confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?",
"confirmations.cancel_follow_request.confirm": "Peruuta pyyntö",
"confirmations.cancel_follow_request.message": "Haluatko varmasti peruuttaa pyyntösi seurata käyttäjää {name}?",
"confirmations.cancel_follow_request.message": "Haluatko varmasti peruuttaa pyyntösi seurata profiilia {name}?",
"confirmations.delete.confirm": "Poista",
"confirmations.delete.message": "Haluatko varmasti poistaa tämän viestin?",
"confirmations.delete_list.confirm": "Poista",
"confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan kokonaan?",
"confirmations.discard_edit_media.confirm": "Hylkää",
"confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun, hylätäänkö ne silti?",
"confirmations.domain_block.confirm": "Estä koko palvelu",
"confirmations.domain_block.confirm": "Estä koko verkkotunnus",
"confirmations.domain_block.message": "Haluatko aivan varmasti estää palvelun {domain} täysin? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimenpide. Et näe kyseisen sisältöä kyseiseltä verkkoalueelta missään julkisissa aikajanoissa tai ilmoituksissa. Tälle verkkoalueelle kuuluvat seuraajasi poistetaan.",
"confirmations.edit.confirm": "Muokkaa",
"confirmations.edit.message": "Muokkaaminen nyt korvaa viestin, jota paraikaa työstät. Haluatko varmasti jatkaa?",
@ -168,13 +168,13 @@
"confirmations.logout.message": "Haluatko varmasti kirjautua ulos?",
"confirmations.mute.confirm": "Mykistä",
"confirmations.mute.explanation": "Tämä toiminto piilottaa heidän julkaisunsa sinulta – mukaan lukien ne, joissa heidät mainitaan – sallien heidän yhä nähdä julkaisusi ja seurata sinua.",
"confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?",
"confirmations.mute.message": "Haluatko varmasti mykistää profiilin {name}?",
"confirmations.redraft.confirm": "Poista & palauta muokattavaksi",
"confirmations.redraft.message": "Oletko varma että haluat poistaa tämän julkaisun ja tehdä siitä uuden luonnoksen? Suosikit ja tehostukset menetään, alkuperäisen julkaisusi vastaukset jäävät orvoiksi.",
"confirmations.reply.confirm": "Vastaa",
"confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?",
"confirmations.unfollow.confirm": "Lopeta seuraaminen",
"confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?",
"confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta profiilia {name}?",
"conversation.delete": "Poista keskustelu",
"conversation.mark_as_read": "Merkitse luetuksi",
"conversation.open": "Näytä keskustelu",
@ -522,16 +522,16 @@
"report_notification.categories.spam": "Roskaposti",
"report_notification.categories.violation": "Sääntöjen rikkominen",
"report_notification.open": "Avaa ilmoitus",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Edellisiä hakuja ei ole",
"search.placeholder": "Hae",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profiilit, jotka vastaavat \"{x}\"",
"search.quick_action.go_to_account": "Avaa profiili {x}",
"search.quick_action.go_to_hashtag": "Avaa aihetunniste {x}",
"search.quick_action.open_url": "Avaa URL-osoite Mastodonissa",
"search.quick_action.status_search": "Julkaisut, jotka vastaavat \"{x}\"",
"search.search_or_paste": "Etsi tai kirjoita URL-osoite",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Pikatoiminnot",
"search_popout.recent": "Edelliset haut",
"search_results.accounts": "Profiilit",
"search_results.all": "Kaikki",
"search_results.hashtags": "Aihetunnisteet",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Ruskpostur",
"report_notification.categories.violation": "Brotin regla",
"report_notification.open": "Opna melding",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Ongar nýggjar leitingar",
"search.placeholder": "Leita",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Vangar, ið samsvara {x}",
"search.quick_action.go_to_account": "Far til vanga {x}",
"search.quick_action.go_to_hashtag": "Far til frámerki {x}",
"search.quick_action.open_url": "Lat URL upp í Mastodon",
"search.quick_action.status_search": "Postar, ið samsvara {x}",
"search.search_or_paste": "Leita ella set URL inn",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Skjótar atgerðir",
"search_popout.recent": "Nýggjar leitingar",
"search_results.accounts": "Vangar",
"search_results.all": "Alt",
"search_results.hashtags": "Frámerki",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Skeinde regels",
"report_notification.open": "Rapport iepenje",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Gjin resinte sykopdrachten",
"search.placeholder": "Sykje",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Accounts dy’t oerienkomme mei {x}",
"search.quick_action.go_to_account": "Gean nei account {x}",
"search.quick_action.go_to_hashtag": "Gean nei hashtag {x}",
"search.quick_action.open_url": "URL yn Mastodon iepenje",
"search.quick_action.status_search": "Berjochten dy’t oerienkomme mei {x}",
"search.search_or_paste": "Sykje of fier URL yn",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Flugge aksjes",
"search_popout.recent": "Resinte sykopdrachten",
"search_results.accounts": "Profilen",
"search_results.all": "Alles",
"search_results.hashtags": "Hashtags",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Faltou ás regras",
"report_notification.open": "Abrir a denuncia",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Non hai buscas recentes",
"search.placeholder": "Procurar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfís coincidentes {x}",
"search.quick_action.go_to_account": "Ir ao perfil {x}",
"search.quick_action.go_to_hashtag": "Ir ao cancelo {x}",
"search.quick_action.open_url": "Abrir URL en Mastodon",
"search.quick_action.status_search": "Publicacións coincidentes {x}",
"search.search_or_paste": "Busca ou insire URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Accións rápidas",
"search_popout.recent": "Buscas recentes",
"search_results.accounts": "Perfís",
"search_results.all": "Todo",
"search_results.hashtags": "Cancelos",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "ספאם (דואר זבל)",
"report_notification.categories.violation": "הפרת כלל",
"report_notification.open": "פתח דו\"ח",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "לא נמצאו חיפושים אחרונים",
"search.placeholder": "חיפוש",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "פרופילים המכילים {x}",
"search.quick_action.go_to_account": "לצפיה בפרופיל {x}",
"search.quick_action.go_to_hashtag": "לצפיה בתגית {x}",
"search.quick_action.open_url": "לפתיחת {x} במסטודון",
"search.quick_action.status_search": "הודעות המכילות {x}",
"search.search_or_paste": "חפש או הזן קישור",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "פעולות זריזות",
"search_popout.recent": "חיפושים אחרונים",
"search_results.accounts": "פרופילים",
"search_results.all": "כל התוצאות",
"search_results.hashtags": "תגיות",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Rule violation",
"report_notification.open": "Open report",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "ई हिज नह",
"search.placeholder": "ख",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "इल मि {x}",
"search.quick_action.go_to_account": "इल पर ज {x}",
"search.quick_action.go_to_hashtag": "शटग पर ज {x}",
"search.quick_action.open_url": "URL मन म",
"search.quick_action.status_search": "ट मि {x}",
"search.search_or_paste": "Search or paste URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "वरित कि",
"search_popout.recent": "ि",
"search_results.accounts": "पइल",
"search_results.all": "All",
"search_results.hashtags": "Hashtags",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Kéretlen üzenet",
"report_notification.categories.violation": "Szabálysértés",
"report_notification.open": "Bejelentés megnyitása",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Nincsenek keresési előzmények",
"search.placeholder": "Keresés",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profilok a következő keresésre: {x}",
"search.quick_action.go_to_account": "Ugrás a következő profilhoz: {x}",
"search.quick_action.go_to_hashtag": "Ugrás a következő hashtaghez: {x}",
"search.quick_action.open_url": "Webcím megnyitása a Mastodonon",
"search.quick_action.status_search": "Bejegyzések a következő keresésre: {x}",
"search.search_or_paste": "Keresés vagy webcím beillesztése",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Gyors műveletek",
"search_popout.recent": "Legutóbbi keresések",
"search_results.accounts": "Profilok",
"search_results.all": "Összes",
"search_results.hashtags": "#Címkék",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Ruslpóstur",
"report_notification.categories.violation": "Brot á reglum",
"report_notification.open": "Opin kæra",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Engar nýlegar leitir",
"search.placeholder": "Leita",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Notandasnið sem samsvara {x}",
"search.quick_action.go_to_account": "Fara á notandasnið {x}",
"search.quick_action.go_to_hashtag": "Fara á myllumerkið {x}",
"search.quick_action.open_url": "Opna slóð í Mastodon",
"search.quick_action.status_search": "Færslur sem samsvara {x}",
"search.search_or_paste": "Leita eða líma slóð",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Flýtiaðgerðir",
"search_popout.recent": "Nýlegar leitir",
"search_results.accounts": "Notendasnið",
"search_results.all": "Allt",
"search_results.hashtags": "Myllumerki",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Violazione delle regole",
"report_notification.open": "Apri segnalazione",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Nessuna ricerca recente",
"search.placeholder": "Cerca",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profili corrispondenti a {x}",
"search.quick_action.go_to_account": "Vai al profilo {x}",
"search.quick_action.go_to_hashtag": "Vai all'hashtag {x}",
"search.quick_action.open_url": "Apri URL in Mastodon",
"search.quick_action.status_search": "Post corrispondenti a {x}",
"search.search_or_paste": "Cerca o incolla URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Azioni rapide",
"search_popout.recent": "Ricerche recenti",
"search_results.accounts": "Profili",
"search_results.all": "Tutto",
"search_results.hashtags": "Hashtag",

@ -526,16 +526,16 @@
"report_notification.categories.spam": "スパム",
"report_notification.categories.violation": "ルール違反",
"report_notification.open": "通報を開く",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "検索履歴はありません",
"search.placeholder": "検索",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "{x} に該当するプロフィール",
"search.quick_action.go_to_account": "{x} のプロフィールを見る",
"search.quick_action.go_to_hashtag": "{x} に該当するハッシュタグ",
"search.quick_action.open_url": "MastodonでURLを開く",
"search.quick_action.status_search": "{x} に該当する投稿",
"search.search_or_paste": "検索またはURLを入力",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "クイック操作",
"search_popout.recent": "最近の検索",
"search_results.accounts": "ユーザー",
"search_results.all": "すべて",
"search_results.hashtags": "ハッシュタグ",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "스팸",
"report_notification.categories.violation": "규칙 위반",
"report_notification.open": "신고 열기",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "최근 검색 기록이 없습니다",
"search.placeholder": "검색",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "{x}에 맞는 프로필",
"search.quick_action.go_to_account": "{x} 프로필로 이동",
"search.quick_action.go_to_hashtag": "{x} 해시태그로 이동",
"search.quick_action.open_url": "마스토돈에서 URL 열기",
"search.quick_action.status_search": "{x}에 맞는 게시물",
"search.search_or_paste": "검색하거나 URL 붙여넣기",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "빠른 작업",
"search_popout.recent": "최근 검색",
"search_results.accounts": "프로필",
"search_results.all": "전부",
"search_results.hashtags": "해시태그",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spams",
"report_notification.categories.violation": "Noteikumu pārkāpums",
"report_notification.open": "Atvērt sūdzību",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Nav nesen veiktu meklējumu",
"search.placeholder": "Meklēšana",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profili atbilst {x}",
"search.quick_action.go_to_account": "Doties uz profilu {x}",
"search.quick_action.go_to_hashtag": "Doties uz tēmturi {x}",
"search.quick_action.open_url": "Atvērt URL Mastodonā",
"search.quick_action.status_search": "Ziņas atbilst {x}",
"search.search_or_paste": "Meklē vai iekopē URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Ātrās darbības",
"search_popout.recent": "Nesen meklētais",
"search_results.accounts": "Profili",
"search_results.all": "Visi",
"search_results.hashtags": "Tēmturi",

@ -20,7 +20,7 @@
"account.blocked": "ဘလသည",
"account.browse_more_on_origin_server": "မရငပရက။",
"account.cancel_follow_request": "ဖပယက",
"account.direct": "Privately mention @{name}",
"account.direct": "@{name}မနမည",
"account.disable_notifications": "@{name} ပတငသညအခ ကက အသရပ။",
"account.domain_blocked": "ဒပငသည\n",
"account.edit_profile": "ကတမဆငမည",
@ -102,7 +102,7 @@
"column.blocks": "ဘလအက",
"column.bookmarks": "မတမ",
"column.community": "ဒသတ အခဇယ",
"column.direct": "Private mentions",
"column.direct": "သန",
"column.directory": "ပရကမည\n",
"column.domain_blocks": " ဒကမည",
"column.favourites": "အကက",
@ -216,7 +216,7 @@
"empty_column.blocks": "ပအကမရ",
"empty_column.bookmarked_statuses": "သင မရ။ တစက အမအသကက ၎ငက ဤနမည။",
"empty_column.community": "ဒသတက အလသည။ အမရနအတက တစ။",
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
"empty_column.direct": "သငသနက မရ။ ပမဟ လကအခ၊ ၎ငသည ဤနမည",
"empty_column.domain_blocks": "သငမရ",
"empty_column.explore_statuses": "အခဆယပန မရ။ နကစစရန။",
"empty_column.favourited_statuses": "သင အကက မရ။ တစက သငသကက ၎ငက ဤနမည။",
@ -314,7 +314,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.description": "ဖက",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.direct": "သနကကကရန",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "to open status",
"keyboard_shortcuts.favourite": "to favourite",
@ -376,7 +376,7 @@
"navigation_bar.bookmarks": "မသည",
"navigation_bar.community_timeline": "ဒသစ",
"navigation_bar.compose": "ပအသစ",
"navigation_bar.direct": "Private mentions",
"navigation_bar.direct": "သနက",
"navigation_bar.discover": "ရ",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "ကတမဆငမည",
@ -522,17 +522,17 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "စညကမကက",
"report_notification.open": "အစရငက",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "လတတလမရ",
"search.placeholder": "ရရန",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "{x} ကက ပရ",
"search.quick_action.go_to_account": "ပရ {x} သမည",
"search.quick_action.go_to_hashtag": "hashtag {x}မည",
"search.quick_action.open_url": "Mastodon URL ကမည",
"search.quick_action.status_search": "{x} ကက",
"search.search_or_paste": "URL ရကထညမဟ",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "အမ",
"search_popout.recent": "လတတလ",
"search_results.accounts": "က",
"search_results.all": "အ",
"search_results.hashtags": "ဟကတက",
"search_results.nothing_found": "ရအရမရ",
@ -559,8 +559,8 @@
"status.copy": "Copy link to status",
"status.delete": "ဖကရန",
"status.detailed_status": "အသစကက",
"status.direct": "Privately mention @{name}",
"status.direct_indicator": "Private mention",
"status.direct": "@{name} ကသနမည\n",
"status.direct_indicator": "သန",
"status.edit": "ပဆငရန",
"status.edited": "{date} ကဆင",
"status.edited_x_times": "{count, plural, one {{count} time} other {{count} times}} ပဆငသည",
@ -646,7 +646,7 @@
"upload_modal.description_placeholder": "သကသညဝဍဎနဆက ဇလပငထက အဓက ဂဃနဏဖတသည",
"upload_modal.detect_text": "ပက",
"upload_modal.edit_media": "မကဆငရန",
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
"upload_modal.hint": " အမတမကသည focal point ကရန Preview ပ စကကမဟ",
"upload_modal.preparing_ocr": "OCR ပဆငသည…",
"upload_modal.preview_label": "({ratio}) အစမကရန",
"upload_progress.label": "တငသည...",

@ -55,7 +55,7 @@
"account.report": "@{name} rapporteren",
"account.requested": "Wachten op goedkeuring. Klik om het volgverzoek te annuleren",
"account.requested_follow": "{name} wil je graag volgen",
"account.share": "Profiel van @{name} delen",
"account.share": "Account van @{name} delen",
"account.show_reblogs": "Boosts van @{name} tonen",
"account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
"account.unblock": "@{name} deblokkeren",
@ -487,7 +487,7 @@
"report.categories.violation": "De inhoud overtreedt een of meerdere serverregels",
"report.category.subtitle": "Kies wat het beste overeenkomt",
"report.category.title": "Vertel ons wat er met dit {type} aan de hand is",
"report.category.title_account": "profiel",
"report.category.title_account": "account",
"report.category.title_status": "bericht",
"report.close": "Klaar",
"report.comment.title": "Zijn er nog andere dingen waarvan je denkt dat wij dat moeten weten?",
@ -522,17 +522,17 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Overtreden regel(s)",
"report_notification.open": "Rapportage openen",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Geen recente zoekopdrachten",
"search.placeholder": "Zoeken",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Accounts die overeenkomen met {x}",
"search.quick_action.go_to_account": "Ga naar account {x}",
"search.quick_action.go_to_hashtag": "Ga naar hashtag {x}",
"search.quick_action.open_url": "URL in Mastodon openen",
"search.quick_action.status_search": "Berichten die overeenkomen met {x}",
"search.search_or_paste": "Zoek of voer een URL in",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profielen",
"search_popout.quick_actions": "Snelle acties",
"search_popout.recent": "Recente zoekopdrachten",
"search_results.accounts": "Accounts",
"search_results.all": "Alles",
"search_results.hashtags": "Hashtags",
"search_results.nothing_found": "Deze zoektermen leveren geen resultaat op",

@ -527,16 +527,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Naruszenie zasad",
"report_notification.open": "Otwórz raport",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Brak ostatnich wyszukiwań",
"search.placeholder": "Szukaj",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profile pasujące do {x}",
"search.quick_action.go_to_account": "Przejdź do profilu {x}",
"search.quick_action.go_to_hashtag": "Przejdź do hasztaga {x}",
"search.quick_action.open_url": "Otwórz adres URL w Mastodonie",
"search.quick_action.status_search": "Wpisy pasujące do {x}",
"search.search_or_paste": "Wyszukaj lub wklej adres",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Szybkie akcje",
"search_popout.recent": "Ostatnie wyszukiwania",
"search_results.accounts": "Profile",
"search_results.all": "Wszystkie",
"search_results.hashtags": "Hasztagi",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Violação de regra",
"report_notification.open": "Abrir denúncia",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Nenhuma busca recente",
"search.placeholder": "Pesquisar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfis correspondentes a {x}",
"search.quick_action.go_to_account": "Ir para a página do perfil {x}",
"search.quick_action.go_to_hashtag": "Ir para a hashtag {x}",
"search.quick_action.open_url": "Abrir link no Mastodon",
"search.quick_action.status_search": "Publicações correspondentes a {x}",
"search.search_or_paste": "Buscar ou colar URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Ações rápidas",
"search_popout.recent": "Buscas Recentes",
"search_results.accounts": "Perfis",
"search_results.all": "Tudo",
"search_results.hashtags": "Hashtags",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Violação de regra",
"report_notification.open": "Abrir denúncia",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Nenhuma pesquisa recente",
"search.placeholder": "Pesquisar",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Perfis com correspondência a {x}",
"search.quick_action.go_to_account": "Ir para o perfil {x}",
"search.quick_action.go_to_hashtag": "Ir para a hashtag {x}",
"search.quick_action.open_url": "Abrir ligação no Mastodon",
"search.quick_action.status_search": "Publicações com correspondência a {x}",
"search.search_or_paste": "Pesquisar ou introduzir URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Ações rápidas",
"search_popout.recent": "Pesquisas recentes",
"search_results.accounts": "Perfis",
"search_results.all": "Tudo",
"search_results.hashtags": "Etiquetas",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "I padëshiruar",
"report_notification.categories.violation": "Cenim rregullash",
"report_notification.open": "Hape raportimin",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Pa kërkime së fundi",
"search.placeholder": "Kërkoni",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Profile me përputhje me {x}",
"search.quick_action.go_to_account": "Kalo te profili {x}",
"search.quick_action.go_to_hashtag": "Kalo te hashtag-u {x}",
"search.quick_action.open_url": "Hape URL-në në Mastodon",
"search.quick_action.status_search": "Postime me përputhje me {x}",
"search.search_or_paste": "Kërkoni, ose hidhni një URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Veprime të shpejta",
"search_popout.recent": "Kërkime së fundi",
"search_results.accounts": "Profile",
"search_results.all": "Krejt",
"search_results.hashtags": "Hashtag-ë",

@ -522,17 +522,17 @@
"report_notification.categories.spam": "สแปม",
"report_notification.categories.violation": "การละเมดกฎ",
"report_notification.open": "รายงานทเปด",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "ไมการคนหาลาส",
"search.placeholder": "คนหา",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "โปรไฟลตรงก {x}",
"search.quick_action.go_to_account": "ไปยงโปรไฟล {x}",
"search.quick_action.go_to_hashtag": "ไปยงแฮชแท {x}",
"search.quick_action.open_url": "เปด URL ใน Mastodon",
"search.quick_action.status_search": "โพสตตรงก {x}",
"search.search_or_paste": "คนหาหรอวาง URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_results.accounts": "Profiles",
"search_popout.quick_actions": "การกระทำดวน",
"search_popout.recent": "การคนหาลาส",
"search_results.accounts": "โปรไฟล",
"search_results.all": "ทงหมด",
"search_results.hashtags": "แฮชแทก",
"search_results.nothing_found": "ไมพบสงใดสำหรบคำคนหาเหลาน",

@ -72,8 +72,8 @@
"admin.dashboard.retention.average": "Ortalama",
"admin.dashboard.retention.cohort": "Kayıt ayı",
"admin.dashboard.retention.cohort_size": "Yeni kullanıcılar",
"alert.rate_limited.message": "Lütfen {retry_time, time, medium} süresinden sonra tekrar deneyin.",
"alert.rate_limited.title": "Oran sınırlıdır",
"alert.rate_limited.message": "Lütfen {retry_time, time, medium} saatinden sonra tekrar deneyin.",
"alert.rate_limited.title": "Aşırı istek gönderildi",
"alert.unexpected.message": "Beklenmedik bir hata oluştu.",
"alert.unexpected.title": "Hay aksi!",
"announcement.announcement": "Duyuru",
@ -522,16 +522,16 @@
"report_notification.categories.spam": "İstenmeyen",
"report_notification.categories.violation": "Kural ihlali",
"report_notification.open": "Bildirim aç",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Son arama yok",
"search.placeholder": "Ara",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Eşleşen profiller {x}",
"search.quick_action.go_to_account": "Profile git {x}",
"search.quick_action.go_to_hashtag": "Etikete git {x}",
"search.quick_action.open_url": "URL'yi Mastodon'da Aç",
"search.quick_action.status_search": "Eşleşen gönderiler {x}",
"search.search_or_paste": "Ara veya URL gir",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Hızlı eylemler",
"search_popout.recent": "Son aramalar",
"search_results.accounts": "Profiller",
"search_results.all": "Tümü",
"search_results.hashtags": "Etiketler",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Спам",
"report_notification.categories.violation": "Порушення правил",
"report_notification.open": "Відкрити скаргу",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Немає останніх пошуків",
"search.placeholder": "Пошук",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Збіг профілів {x}",
"search.quick_action.go_to_account": "Перейти до профілю {x}",
"search.quick_action.go_to_hashtag": "Перейти до хештегу {x}",
"search.quick_action.open_url": "Відкрити URL-адресу в Mastodon",
"search.quick_action.status_search": "Збіг дописів {x}",
"search.search_or_paste": "Введіть адресу або пошуковий запит",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Швидкі дії",
"search_popout.recent": "Нещодавні запити",
"search_results.accounts": "Профілі",
"search_results.all": "Усі",
"search_results.hashtags": "Хештеґи",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Vi phạm nội quy",
"report_notification.open": "Mở báo cáo",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "Không có tìm kiếm gần đây",
"search.placeholder": "Tìm kiếm",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "Người trùng khớp {x}",
"search.quick_action.go_to_account": "Xem trang {x}",
"search.quick_action.go_to_hashtag": "Xem hashtag {x}",
"search.quick_action.open_url": "Mở liên kết trong Mastodon",
"search.quick_action.status_search": "Tút trùng khớp {x}",
"search.search_or_paste": "Tìm kiếm hoặc nhập URL",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "Thao tác nhanh",
"search_popout.recent": "Tìm kiếm gần đây",
"search_results.accounts": "Mọi người",
"search_results.all": "Toàn bộ",
"search_results.hashtags": "Hashtags",

@ -37,7 +37,7 @@
"account.following_counter": "正在关注 {counter} 人",
"account.follows.empty": "此用户目前尚未关注任何人。",
"account.follows_you": "关注了你",
"account.go_to_profile": "转到个人资料界面",
"account.go_to_profile": "转到个人资料",
"account.hide_reblogs": "隐藏来自 @{name} 的转贴",
"account.joined_short": "加入于",
"account.languages": "更改订阅语言",
@ -53,7 +53,7 @@
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文和回复",
"account.report": "举报 @{name}",
"account.requested": "正在等待对方同意。点击取消发送关注请求",
"account.requested": "正在等待对方同意。点击取消发送关注请求",
"account.requested_follow": "{name} 已经向你发送了关注请求",
"account.share": "分享 @{name} 的个人资料页",
"account.show_reblogs": "显示来自 @{name} 的转嘟",
@ -202,7 +202,7 @@
"emoji_button.food": "食物和饮料",
"emoji_button.label": "插入表情符号",
"emoji_button.nature": "自然",
"emoji_button.not_found": "木有这个表情符号!(╯°□°)╯︵ ┻━┻",
"emoji_button.not_found": "未找到匹配的表情符号",
"emoji_button.objects": "物体",
"emoji_button.people": "人物",
"emoji_button.recent": "常用",
@ -246,18 +246,18 @@
"explore.trending_tags": "话题标签",
"filter_modal.added.context_mismatch_explanation": "此过滤器分类不适用访问过嘟文的环境中。如果你想要在环境中过滤嘟文,你必须编辑此过滤器。",
"filter_modal.added.context_mismatch_title": "环境不匹配!",
"filter_modal.added.expired_explanation": "此过滤器类已过期,你需要修改到期日期才能应用。",
"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_modal.added.settings_link": "设置页面",
"filter_modal.added.short_explanation": "此嘟文已添加到以下过滤器类:{title}。",
"filter_modal.added.short_explanation": "此嘟文已添加到以下过滤器类:{title}。",
"filter_modal.added.title": "过滤器已添加 !",
"filter_modal.select_filter.context_mismatch": "不适用于此环境",
"filter_modal.select_filter.context_mismatch": "不适用于这个情境",
"filter_modal.select_filter.expired": "已过期",
"filter_modal.select_filter.prompt_new": "新类:{name}",
"filter_modal.select_filter.prompt_new": "新类:{name}",
"filter_modal.select_filter.search": "搜索或创建",
"filter_modal.select_filter.subtitle": "使用一个已存在分类,或创建一个新类",
"filter_modal.select_filter.subtitle": "使用一个已存在分类,或创建一个新类",
"filter_modal.select_filter.title": "过滤此嘟文",
"filter_modal.title.status": "过滤一条嘟文",
"follow_recommendations.done": "完成",
@ -269,7 +269,7 @@
"followed_tags": "关注的话题标签",
"footer.about": "关于",
"footer.directory": "用户目录",
"footer.get_app": "获取应用程序",
"footer.get_app": "获取应用",
"footer.invite": "邀请",
"footer.keyboard_shortcuts": "快捷键列表",
"footer.privacy_policy": "隐私政策",
@ -363,8 +363,8 @@
"lists.search": "搜索你关注的人",
"lists.subheading": "你的列表",
"load_pending": "{count} 项",
"loading_indicator.label": "加载中…",
"media_gallery.toggle_visible": "隐藏图片",
"loading_indicator.label": "加载中…",
"media_gallery.toggle_visible": "{number, plural, other {隐藏图像}}",
"missing_indicator.label": "找不到内容",
"missing_indicator.sublabel": "无法找到此资源",
"moved_to_account_banner.text": "您的账号 {disabledAccount} 已停用,因为您已迁移到 {movedToAccount} 。",
@ -387,7 +387,7 @@
"navigation_bar.followed_tags": "关注的话题标签",
"navigation_bar.follows_and_followers": "关注管理",
"navigation_bar.lists": "列表",
"navigation_bar.logout": "登出",
"navigation_bar.logout": "退出登录",
"navigation_bar.mutes": "已隐藏的用户",
"navigation_bar.personal": "个人",
"navigation_bar.pins": "置顶嘟文",
@ -503,7 +503,7 @@
"report.reasons.other_description": "该问题不符合其他类别",
"report.reasons.spam": "它是垃圾信息",
"report.reasons.spam_description": "恶意链接,虚假互动和重复回复",
"report.reasons.violation": "违反服务器规则",
"report.reasons.violation": "违反服务器规则",
"report.reasons.violation_description": "你清楚它违反了特定的规则",
"report.rules.subtitle": "选择所有适用选项",
"report.rules.title": "哪些规则被违反了?",
@ -522,16 +522,16 @@
"report_notification.categories.spam": "骚扰",
"report_notification.categories.violation": "违反规则",
"report_notification.open": "打开举报",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "无最近搜索",
"search.placeholder": "搜索",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "匹配 {x} 的个人资料",
"search.quick_action.go_to_account": "转到 {x} 个人资料",
"search.quick_action.go_to_hashtag": "转到标签 {x}",
"search.quick_action.open_url": "在 Mastodon 中打开链接",
"search.quick_action.status_search": "匹配 {x} 的帖子",
"search.search_or_paste": "搜索或输入链接",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "快捷操作",
"search_popout.recent": "最近搜索",
"search_results.accounts": "个人资料",
"search_results.all": "全部",
"search_results.hashtags": "话题标签",

@ -522,16 +522,16 @@
"report_notification.categories.spam": "垃圾訊息",
"report_notification.categories.violation": "違反規則",
"report_notification.open": "開啟檢舉報告",
"search.no_recent_searches": "No recent searches",
"search.no_recent_searches": "尚無最近的搜尋紀錄",
"search.placeholder": "搜尋",
"search.quick_action.account_search": "Profiles matching {x}",
"search.quick_action.go_to_account": "Go to profile {x}",
"search.quick_action.go_to_hashtag": "Go to hashtag {x}",
"search.quick_action.open_url": "Open URL in Mastodon",
"search.quick_action.status_search": "Posts matching {x}",
"search.quick_action.account_search": "符合的個人檔案 {x}",
"search.quick_action.go_to_account": "前往個人檔案 {x}",
"search.quick_action.go_to_hashtag": "前往主題標籤 {x}",
"search.quick_action.open_url": "於 Mastodon 中開啟連結",
"search.quick_action.status_search": "符合的嘟文 {x}",
"search.search_or_paste": "搜尋或輸入網址",
"search_popout.quick_actions": "Quick actions",
"search_popout.recent": "Recent searches",
"search_popout.quick_actions": "快捷操作",
"search_popout.recent": "最近的搜尋紀錄",
"search_results.accounts": "個人檔案",
"search_results.all": "全部",
"search_results.hashtags": "主題標籤",

@ -100,11 +100,12 @@ function main() {
const datetime = new Date(content.getAttribute('datetime'));
const now = new Date();
content.title = dateTimeFormat.format(datetime);
const timeGiven = content.getAttribute('datetime').includes('T');
content.title = timeGiven ? dateTimeFormat.format(datetime) : dateFormat.format(datetime);
content.textContent = timeAgoString({
formatMessage: ({ id, defaultMessage }, values) => (new IntlMessageFormat(messages[id] || defaultMessage, locale)).format(values),
formatDate: (date, options) => (new Intl.DateTimeFormat(locale, options)).format(date),
}, datetime, now, now.getFullYear(), content.getAttribute('datetime').includes('T'));
}, datetime, now, now.getFullYear(), timeGiven);
});
const reactComponents = document.querySelectorAll('[data-component]');
@ -188,10 +189,10 @@ function main() {
if (sidebar.classList.contains('visible')) {
document.body.style.overflow = null;
toggleButton.setAttribute('aria-expanded', false);
toggleButton.setAttribute('aria-expanded', 'false');
} else {
document.body.style.overflow = 'hidden';
toggleButton.setAttribute('aria-expanded', true);
toggleButton.setAttribute('aria-expanded', 'true');
}
toggleButton.classList.toggle('active');

@ -36,10 +36,6 @@
@media screen and (max-width: 600px) {
height: 200px;
}
@media screen and (max-width: $no-gap-breakpoint) {
display: none;
}
}
&__bar {
@ -138,7 +134,7 @@
}
.older {
float: inline-start;
float: left;
padding-inline-start: 0;
.fa {
@ -148,7 +144,7 @@
}
.newer {
float: inline-end;
float: right;
padding-inline-end: 0;
.fa {

@ -651,7 +651,7 @@ body,
.button {
overflow: visible;
margin: 0 0 5px 5px;
float: inline-end;
float: right;
}
}
}
@ -799,7 +799,7 @@ a.name-tag,
.speech-bubble {
margin-bottom: 20px;
border-inset-inline-start: 4px solid $ui-highlight-color;
border-inline-start: 4px solid $ui-highlight-color;
&.positive {
border-left-color: $success-green;
@ -1678,7 +1678,7 @@ a.sparkline {
}
.section-skip-link {
float: inline-end;
float: right;
a {
color: $ui-highlight-color;

@ -826,7 +826,7 @@ body > [data-popper-placement] {
}
.reply-indicator__cancel {
float: inline-end;
float: right;
line-height: 24px;
}
@ -841,7 +841,7 @@ body > [data-popper-placement] {
}
.reply-indicator__display-avatar {
float: inline-start;
float: left;
margin-inline-end: 5px;
}
@ -1159,7 +1159,7 @@ body > [data-popper-placement] {
.notification__relative_time {
color: $dark-text-color;
float: inline-end;
float: right;
font-size: 14px;
padding-bottom: 1px;
}
@ -1507,7 +1507,7 @@ body > [data-popper-placement] {
position: relative;
& > div {
float: inline-start;
float: left;
position: relative;
box-sizing: border-box;
}
@ -1622,7 +1622,7 @@ a .account__avatar {
text-decoration: none;
overflow: hidden;
flex: 0 1 100%;
border-inset-inline-end: 1px solid lighten($ui-base-color, 8%);
border-inline-end: 1px solid lighten($ui-base-color, 8%);
padding: 10px 0;
border-bottom: 4px solid transparent;
@ -1662,7 +1662,7 @@ a .account__avatar {
}
.account-authorize__avatar {
float: inline-start;
float: left;
margin-inline-end: 10px;
}
@ -2642,7 +2642,7 @@ $ui-header-height: 55px;
.navigation-panel {
margin: 0;
background: $ui-base-color;
border-inset-inline-start: 1px solid lighten($ui-base-color, 8%);
border-inline-start: 1px solid lighten($ui-base-color, 8%);
height: 100vh;
}
@ -2941,7 +2941,6 @@ $ui-header-height: 55px;
width: 85%;
height: 100%;
pointer-events: none;
user-drag: none;
user-select: none;
}
@ -3879,7 +3878,7 @@ a.status-card.compact:hover {
}
.column-header__setting-arrows {
float: inline-end;
float: right;
.column-header__setting-btn {
padding: 5px;
@ -4340,6 +4339,7 @@ a.status-card.compact:hover {
.follow_requests-unlocked_explanation {
background: darken($ui-base-color, 4%);
contain: initial;
flex-grow: 0;
}
.error-column {
@ -5753,7 +5753,7 @@ a.status-card.compact:hover {
.report-modal__comment {
padding: 20px;
border-inset-inline-end: 1px solid $ui-secondary-color;
border-inline-end: 1px solid $ui-secondary-color;
max-width: 320px;
p {
@ -6044,7 +6044,7 @@ a.status-card.compact:hover {
color: $dark-text-color;
padding: 8px 18px;
cursor: default;
border-inset-inline-end: 1px solid lighten($ui-base-color, 8%);
border-inline-end: 1px solid lighten($ui-base-color, 8%);
display: flex;
flex-direction: column;
align-items: center;
@ -6109,7 +6109,7 @@ a.status-card.compact:hover {
border: 0;
box-sizing: border-box;
display: block;
float: inline-start;
float: left;
position: relative;
border-radius: 4px;
overflow: hidden;
@ -7930,7 +7930,7 @@ noscript {
inset-inline-start: 0;
width: 100%;
height: 100%;
border-inset-inline-start: 4px solid $highlight-text-color;
border-inline-start: 4px solid $highlight-text-color;
pointer-events: none;
}
}

@ -14,7 +14,7 @@
blockquote {
padding-inline-start: 10px;
border-inset-inline-start: 3px solid $darker-text-color;
border-inline-start: 3px solid $darker-text-color;
color: $darker-text-color;
white-space: normal;

@ -19,10 +19,22 @@ body.rtl {
direction: rtl;
}
.account__avatar-wrapper {
float: right;
}
.column-header__setting-arrows {
float: left;
}
.admin-wrapper {
direction: rtl;
}
.react-swipeable-view-container > * {
direction: rtl;
}
.simple_form .label_input__append {
&::after {
background-image: linear-gradient(

@ -91,12 +91,12 @@
&:first-child {
border-radius: 4px 0 0;
border-inset-inline-start: 1px solid darken($ui-base-color, 8%);
border-inline-start: 1px solid darken($ui-base-color, 8%);
}
&:last-child {
border-radius: 0 4px 0 0;
border-inset-inline-end: 1px solid darken($ui-base-color, 8%);
border-inline-end: 1px solid darken($ui-base-color, 8%);
}
}
}

@ -6,6 +6,7 @@ class NotifyService < BaseService
NON_EMAIL_TYPES = %i(
admin.report
admin.sign_up
update
).freeze
def call(recipient, type, activity)

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

Loading…
Cancel
Save