about summary refs log tree commit diff
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2023-03-31 21:30:27 +0200
committerClaire <claire.github-309c@sitedethib.com>2023-03-31 21:30:27 +0200
commit01d6f7529faef97c0209ef11bbca2e856961bbab (patch)
tree513ac21302befa1a08fc4968dcd4dca6b0e06360
parentcbdb25ab0343603165fc89fd28b07c9ca0f2ae6d (diff)
parentc6c03b49b255c4fe2183b94288a712ad7a66e2c2 (diff)
Merge branch 'main' into glitch-soc/merge-upstream
Conflicts:
- `README.md`:
  Upstream added a link to the roadmap, but we have a completely different README.
  Kept ours.
- `app/models/media_attachment.rb`:
  Upstream upped media attachment limits.
  Updated the default according to upstream's.
- `db/migrate/20180831171112_create_bookmarks.rb`:
  Upstream changed the migration compatibility level.
  Did so too.
- `config/initializers/content_security_policy.rb`:
  Upstream refactored this file but we have a different version.
  Kept our version.
- `app/controllers/settings/preferences_controller.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  The file does not directly references individual settings anymore.
  Applied upstream changes.
- `app/lib/user_settings_decorator.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  The file got removed entirely.
  Removed it as well.
- `app/models/user.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  References to individual settings have been removed from the file.
  Removed them as well.
- `app/views/settings/preferences/appearance/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `app/views/settings/preferences/notifications/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `app/views/settings/preferences/other/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `config/settings.yml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  In particular, upstream removed user-specific and unused settings.
  Did the same in glitch-soc.
- `spec/controllers/application_controller_spec.rb`:
  Conflicts due to glitch-soc's theming system.
  Mostly kept our version, as upstream messed up the tests.
-rw-r--r--.codeclimate.yml39
-rw-r--r--.devcontainer/devcontainer.json1
-rw-r--r--.devcontainer/docker-compose.yml12
-rwxr-xr-x.devcontainer/post-create.sh3
-rw-r--r--.github/workflows/lint-haml.yml4
-rw-r--r--.github/workflows/test-migrations-one-step.yml6
-rw-r--r--.github/workflows/test-migrations-two-step.yml6
-rw-r--r--.github/workflows/test-ruby.yml7
-rwxr-xr-x.husky/pre-commit4
-rw-r--r--.rubocop.yml88
-rw-r--r--.rubocop_todo.yml230
-rw-r--r--.ruby-version2
-rw-r--r--.yarnclean3
-rw-r--r--Dockerfile2
-rw-r--r--Gemfile4
-rw-r--r--Gemfile.lock18
-rw-r--r--app/controllers/api/v1/accounts/credentials_controller.rb12
-rw-r--r--app/controllers/api/v1/streaming_controller.rb2
-rw-r--r--app/controllers/backups_controller.rb6
-rw-r--r--app/controllers/concerns/account_controller_concern.rb3
-rw-r--r--app/controllers/media_proxy_controller.rb2
-rw-r--r--app/controllers/settings/preferences_controller.rb43
-rw-r--r--app/controllers/statuses_controller.rb5
-rw-r--r--app/javascript/mastodon/actions/compose.js73
-rw-r--r--app/javascript/mastodon/components/account.jsx53
-rw-r--r--app/javascript/mastodon/components/status.jsx7
-rw-r--r--app/javascript/mastodon/components/status_action_bar.jsx2
-rw-r--r--app/javascript/mastodon/features/account/components/header.jsx2
-rw-r--r--app/javascript/mastodon/features/direct_timeline/index.jsx4
-rw-r--r--app/javascript/mastodon/features/explore/index.jsx4
-rw-r--r--app/javascript/mastodon/features/getting_started/index.jsx2
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.jsx2
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.jsx10
-rw-r--r--app/javascript/mastodon/features/status/index.jsx2
-rw-r--r--app/javascript/mastodon/features/ui/components/navigation_panel.jsx2
-rw-r--r--app/javascript/mastodon/locales/af.json1
-rw-r--r--app/javascript/mastodon/locales/an.json1
-rw-r--r--app/javascript/mastodon/locales/ar.json1
-rw-r--r--app/javascript/mastodon/locales/ast.json1
-rw-r--r--app/javascript/mastodon/locales/be.json3
-rw-r--r--app/javascript/mastodon/locales/bg.json1
-rw-r--r--app/javascript/mastodon/locales/bn.json1
-rw-r--r--app/javascript/mastodon/locales/br.json1
-rw-r--r--app/javascript/mastodon/locales/bs.json1
-rw-r--r--app/javascript/mastodon/locales/ca.json1
-rw-r--r--app/javascript/mastodon/locales/ckb.json1
-rw-r--r--app/javascript/mastodon/locales/co.json1
-rw-r--r--app/javascript/mastodon/locales/cs.json1
-rw-r--r--app/javascript/mastodon/locales/csb.json1
-rw-r--r--app/javascript/mastodon/locales/cy.json1
-rw-r--r--app/javascript/mastodon/locales/da.json1
-rw-r--r--app/javascript/mastodon/locales/de.json1
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json20
-rw-r--r--app/javascript/mastodon/locales/el.json1
-rw-r--r--app/javascript/mastodon/locales/en-GB.json1
-rw-r--r--app/javascript/mastodon/locales/en.json13
-rw-r--r--app/javascript/mastodon/locales/eo.json1
-rw-r--r--app/javascript/mastodon/locales/es-AR.json1
-rw-r--r--app/javascript/mastodon/locales/es-MX.json1
-rw-r--r--app/javascript/mastodon/locales/es.json1
-rw-r--r--app/javascript/mastodon/locales/et.json3
-rw-r--r--app/javascript/mastodon/locales/eu.json1
-rw-r--r--app/javascript/mastodon/locales/fa.json1
-rw-r--r--app/javascript/mastodon/locales/fi.json85
-rw-r--r--app/javascript/mastodon/locales/fo.json1
-rw-r--r--app/javascript/mastodon/locales/fr-QC.json1
-rw-r--r--app/javascript/mastodon/locales/fr.json1
-rw-r--r--app/javascript/mastodon/locales/fy.json1
-rw-r--r--app/javascript/mastodon/locales/ga.json1
-rw-r--r--app/javascript/mastodon/locales/gd.json1
-rw-r--r--app/javascript/mastodon/locales/gl.json1
-rw-r--r--app/javascript/mastodon/locales/he.json7
-rw-r--r--app/javascript/mastodon/locales/hi.json1
-rw-r--r--app/javascript/mastodon/locales/hr.json1
-rw-r--r--app/javascript/mastodon/locales/hu.json279
-rw-r--r--app/javascript/mastodon/locales/hy.json1
-rw-r--r--app/javascript/mastodon/locales/id.json1
-rw-r--r--app/javascript/mastodon/locales/ig.json1
-rw-r--r--app/javascript/mastodon/locales/io.json1
-rw-r--r--app/javascript/mastodon/locales/is.json1
-rw-r--r--app/javascript/mastodon/locales/it.json1
-rw-r--r--app/javascript/mastodon/locales/ja.json1
-rw-r--r--app/javascript/mastodon/locales/ka.json1
-rw-r--r--app/javascript/mastodon/locales/kab.json1
-rw-r--r--app/javascript/mastodon/locales/kk.json1
-rw-r--r--app/javascript/mastodon/locales/kn.json1
-rw-r--r--app/javascript/mastodon/locales/ko.json3
-rw-r--r--app/javascript/mastodon/locales/ku.json1
-rw-r--r--app/javascript/mastodon/locales/kw.json1
-rw-r--r--app/javascript/mastodon/locales/la.json1
-rw-r--r--app/javascript/mastodon/locales/lt.json1
-rw-r--r--app/javascript/mastodon/locales/lv.json1
-rw-r--r--app/javascript/mastodon/locales/mk.json1
-rw-r--r--app/javascript/mastodon/locales/ml.json1
-rw-r--r--app/javascript/mastodon/locales/mr.json3
-rw-r--r--app/javascript/mastodon/locales/ms.json1
-rw-r--r--app/javascript/mastodon/locales/my.json11
-rw-r--r--app/javascript/mastodon/locales/nl.json1
-rw-r--r--app/javascript/mastodon/locales/nn.json1
-rw-r--r--app/javascript/mastodon/locales/no.json1
-rw-r--r--app/javascript/mastodon/locales/oc.json1
-rw-r--r--app/javascript/mastodon/locales/pa.json1
-rw-r--r--app/javascript/mastodon/locales/pl.json1
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json1
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json1
-rw-r--r--app/javascript/mastodon/locales/ro.json1
-rw-r--r--app/javascript/mastodon/locales/ru.json3
-rw-r--r--app/javascript/mastodon/locales/sa.json1
-rw-r--r--app/javascript/mastodon/locales/sc.json1
-rw-r--r--app/javascript/mastodon/locales/sco.json1
-rw-r--r--app/javascript/mastodon/locales/si.json1
-rw-r--r--app/javascript/mastodon/locales/sk.json3
-rw-r--r--app/javascript/mastodon/locales/sl.json1
-rw-r--r--app/javascript/mastodon/locales/sq.json1
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json3
-rw-r--r--app/javascript/mastodon/locales/sr.json19
-rw-r--r--app/javascript/mastodon/locales/sv.json1
-rw-r--r--app/javascript/mastodon/locales/szl.json1
-rw-r--r--app/javascript/mastodon/locales/ta.json1
-rw-r--r--app/javascript/mastodon/locales/tai.json1
-rw-r--r--app/javascript/mastodon/locales/te.json1
-rw-r--r--app/javascript/mastodon/locales/th.json5
-rw-r--r--app/javascript/mastodon/locales/tr.json1
-rw-r--r--app/javascript/mastodon/locales/tt.json1
-rw-r--r--app/javascript/mastodon/locales/ug.json1
-rw-r--r--app/javascript/mastodon/locales/uk.json1
-rw-r--r--app/javascript/mastodon/locales/ur.json1
-rw-r--r--app/javascript/mastodon/locales/uz.json1
-rw-r--r--app/javascript/mastodon/locales/vi.json3
-rw-r--r--app/javascript/mastodon/locales/zgh.json1
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json1
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json1
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json1
-rw-r--r--app/javascript/mastodon/performance.js1
-rw-r--r--app/javascript/mastodon/utils/resize_image.js189
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss10
-rw-r--r--app/javascript/styles/mastodon/about.scss4
-rw-r--r--app/javascript/styles/mastodon/accounts.scss16
-rw-r--r--app/javascript/styles/mastodon/admin.scss83
-rw-r--r--app/javascript/styles/mastodon/basics.scss2
-rw-r--r--app/javascript/styles/mastodon/components.scss408
-rw-r--r--app/javascript/styles/mastodon/containers.scss6
-rw-r--r--app/javascript/styles/mastodon/emoji_picker.scss10
-rw-r--r--app/javascript/styles/mastodon/forms.scss34
-rw-r--r--app/javascript/styles/mastodon/modal.scss2
-rw-r--r--app/javascript/styles/mastodon/polls.scss2
-rw-r--r--app/javascript/styles/mastodon/rich_text.scss6
-rw-r--r--app/javascript/styles/mastodon/rtl.scss305
-rw-r--r--app/javascript/styles/mastodon/statuses.scss8
-rw-r--r--app/javascript/styles/mastodon/tables.scss22
-rw-r--r--app/javascript/styles/mastodon/widgets.scss16
-rw-r--r--app/lib/admin/metrics/retention.rb56
-rw-r--r--app/lib/user_settings_decorator.rb180
-rw-r--r--app/lib/user_settings_serializer.rb19
-rw-r--r--app/models/account.rb2
-rw-r--r--app/models/account_stat.rb2
-rw-r--r--app/models/admin/action_log.rb2
-rw-r--r--app/models/backup.rb2
-rw-r--r--app/models/concerns/attachmentable.rb2
-rw-r--r--app/models/concerns/has_user_settings.rb141
-rw-r--r--app/models/custom_filter.rb2
-rw-r--r--app/models/email_domain_block.rb2
-rw-r--r--app/models/media_attachment.rb10
-rw-r--r--app/models/preview_card.rb4
-rw-r--r--app/models/report.rb2
-rw-r--r--app/models/status_edit.rb2
-rw-r--r--app/models/user.rb67
-rw-r--r--app/models/user_settings.rb99
-rw-r--r--app/models/user_settings/dsl.rb37
-rw-r--r--app/models/user_settings/glue.rb23
-rw-r--r--app/models/user_settings/namespace.rb21
-rw-r--r--app/models/user_settings/setting.rb49
-rw-r--r--app/serializers/rest/admin/webhook_event_serializer.rb2
-rw-r--r--app/services/notify_service.rb13
-rw-r--r--app/services/update_status_service.rb4
-rw-r--r--app/views/kaminari/_gap.html.haml9
-rw-r--r--app/views/settings/login_activities/_login_activity.html.haml2
-rw-r--r--app/views/settings/preferences/appearance/show.html.haml71
-rw-r--r--app/views/settings/preferences/notifications/show.html.haml40
-rw-r--r--app/views/settings/preferences/other/show.html.haml35
-rw-r--r--app/workers/poll_expiration_notify_worker.rb2
-rw-r--r--app/workers/scheduler/indexing_scheduler.rb16
-rw-r--r--config/initializers/inflections.rb1
-rw-r--r--config/initializers/paperclip.rb1
-rw-r--r--config/locales/activerecord.fi.yml4
-rw-r--r--config/locales/an.yml1
-rw-r--r--config/locales/ar.yml1
-rw-r--r--config/locales/ast.yml1
-rw-r--r--config/locales/be.yml10
-rw-r--r--config/locales/bg.yml9
-rw-r--r--config/locales/br.yml1
-rw-r--r--config/locales/ca.yml9
-rw-r--r--config/locales/ckb.yml1
-rw-r--r--config/locales/co.yml1
-rw-r--r--config/locales/cs.yml1
-rw-r--r--config/locales/cy.yml9
-rw-r--r--config/locales/da.yml9
-rw-r--r--config/locales/de.yml8
-rw-r--r--config/locales/devise.fi.yml38
-rw-r--r--config/locales/devise.hu.yml104
-rw-r--r--config/locales/devise.zh-TW.yml6
-rw-r--r--config/locales/doorkeeper.fi.yml22
-rw-r--r--config/locales/doorkeeper.gl.yml6
-rw-r--r--config/locales/doorkeeper.ko.yml16
-rw-r--r--config/locales/doorkeeper.th.yml2
-rw-r--r--config/locales/el.yml661
-rw-r--r--config/locales/en-GB.yml120
-rw-r--r--config/locales/eo.yml1
-rw-r--r--config/locales/es-AR.yml9
-rw-r--r--config/locales/es-MX.yml9
-rw-r--r--config/locales/es.yml8
-rw-r--r--config/locales/et.yml11
-rw-r--r--config/locales/eu.yml9
-rw-r--r--config/locales/fa.yml1
-rw-r--r--config/locales/fi.yml27
-rw-r--r--config/locales/fo.yml11
-rw-r--r--config/locales/fr-QC.yml1
-rw-r--r--config/locales/fr.yml7
-rw-r--r--config/locales/fy.yml9
-rw-r--r--config/locales/gd.yml5
-rw-r--r--config/locales/gl.yml13
-rw-r--r--config/locales/he.yml9
-rw-r--r--config/locales/hi.yml9
-rw-r--r--config/locales/hu.yml9
-rw-r--r--config/locales/hy.yml1
-rw-r--r--config/locales/id.yml1
-rw-r--r--config/locales/io.yml1
-rw-r--r--config/locales/is.yml9
-rw-r--r--config/locales/it.yml9
-rw-r--r--config/locales/ja.yml9
-rw-r--r--config/locales/kk.yml1
-rw-r--r--config/locales/ko.yml27
-rw-r--r--config/locales/ku.yml1
-rw-r--r--config/locales/lt.yml1
-rw-r--r--config/locales/lv.yml9
-rw-r--r--config/locales/my.yml360
-rw-r--r--config/locales/nl.yml9
-rw-r--r--config/locales/nn.yml1
-rw-r--r--config/locales/no.yml1
-rw-r--r--config/locales/oc.yml1
-rw-r--r--config/locales/pl.yml7
-rw-r--r--config/locales/pt-BR.yml20
-rw-r--r--config/locales/pt-PT.yml9
-rw-r--r--config/locales/ro.yml1
-rw-r--r--config/locales/ru.yml2
-rw-r--r--config/locales/sc.yml1
-rw-r--r--config/locales/sco.yml1
-rw-r--r--config/locales/si.yml1
-rw-r--r--config/locales/simple_form.fi.yml4
-rw-r--r--config/locales/simple_form.my.yml51
-rw-r--r--config/locales/simple_form.pt-BR.yml2
-rw-r--r--config/locales/simple_form.th.yml2
-rw-r--r--config/locales/simple_form.zh-TW.yml4
-rw-r--r--config/locales/sk.yml13
-rw-r--r--config/locales/sl.yml9
-rw-r--r--config/locales/sq.yml9
-rw-r--r--config/locales/sr-Latn.yml8
-rw-r--r--config/locales/sr.yml9
-rw-r--r--config/locales/sv.yml8
-rw-r--r--config/locales/th.yml9
-rw-r--r--config/locales/tr.yml9
-rw-r--r--config/locales/uk.yml9
-rw-r--r--config/locales/vi.yml7
-rw-r--r--config/locales/zh-CN.yml9
-rw-r--r--config/locales/zh-HK.yml1
-rw-r--r--config/locales/zh-TW.yml15
-rw-r--r--config/settings.yml40
-rw-r--r--db/migrate/20170918125918_ids_to_bigints.rb26
-rw-r--r--db/migrate/20170927215609_add_description_to_media_attachments.rb2
-rw-r--r--db/migrate/20170928082043_create_email_domain_blocks.rb2
-rw-r--r--db/migrate/20171005102658_create_account_moderation_notes.rb2
-rw-r--r--db/migrate/20171005171936_add_disabled_to_custom_emojis.rb2
-rw-r--r--db/migrate/20171006142024_add_uri_to_custom_emojis.rb2
-rw-r--r--db/migrate/20171010023049_add_foreign_key_to_account_moderation_notes.rb2
-rw-r--r--db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb2
-rw-r--r--db/migrate/20171020084748_add_visible_in_picker_to_custom_emoji.rb2
-rw-r--r--db/migrate/20171028221157_add_reblogs_to_follows.rb2
-rw-r--r--db/migrate/20171107143332_add_memorial_to_accounts.rb2
-rw-r--r--db/migrate/20171107143624_add_disabled_to_users.rb2
-rw-r--r--db/migrate/20171109012327_add_moderator_to_accounts.rb2
-rw-r--r--db/migrate/20171114080328_add_index_domain_to_email_domain_blocks.rb2
-rw-r--r--db/migrate/20171114231651_create_lists.rb2
-rw-r--r--db/migrate/20171116161857_create_list_accounts.rb2
-rw-r--r--db/migrate/20171118012443_add_moved_to_account_id_to_accounts.rb2
-rw-r--r--db/migrate/20171119172437_create_admin_action_logs.rb2
-rw-r--r--db/migrate/20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb2
-rw-r--r--db/migrate/20171125024930_create_invites.rb2
-rw-r--r--db/migrate/20171125031751_add_invite_id_to_users.rb2
-rw-r--r--db/migrate/20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb2
-rw-r--r--db/migrate/20171125190735_remove_old_reblog_index_on_statuses.rb2
-rw-r--r--db/migrate/20171129172043_add_index_on_stream_entries.rb2
-rw-r--r--db/migrate/20171130000000_add_embed_url_to_preview_cards.rb2
-rw-r--r--db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb2
-rw-r--r--db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb2
-rw-r--r--db/migrate/20171226094803_more_faster_index_on_notifications.rb2
-rw-r--r--db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb2
-rw-r--r--db/migrate/20180109143959_add_remember_token_to_users.rb2
-rw-r--r--db/migrate/20180204034416_create_identities.rb6
-rw-r--r--db/migrate/20180206000000_change_user_id_nonnullable.rb2
-rw-r--r--db/migrate/20180211015820_create_backups.rb2
-rw-r--r--db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb2
-rw-r--r--db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb2
-rw-r--r--db/migrate/20180402031200_add_assigned_account_id_to_reports.rb2
-rw-r--r--db/migrate/20180402040909_create_report_notes.rb2
-rw-r--r--db/migrate/20180410204633_add_fields_to_accounts.rb2
-rw-r--r--db/migrate/20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb4
-rw-r--r--db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb2
-rw-r--r--db/migrate/20180528141303_fix_accounts_unique_index.rb25
-rw-r--r--db/migrate/20180831171112_create_bookmarks.rb2
-rw-r--r--db/migrate/20181024224956_migrate_account_conversations.rb18
-rw-r--r--db/migrate/20191031163205_change_list_account_follow_nullable.rb2
-rw-r--r--db/migrate/20200622213645_media_attachment_ids_to_timestamp_ids.rb2
-rw-r--r--db/migrate/20200917192924_add_notify_to_follows.rb2
-rw-r--r--db/migrate/20210306164523_account_ids_to_timestamp_ids.rb2
-rw-r--r--db/migrate/20230215074327_add_settings_to_users.rb7
-rw-r--r--db/migrate/20230215074423_move_user_settings.rb84
-rw-r--r--db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb1
-rw-r--r--db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb4
-rw-r--r--db/schema.rb3
-rw-r--r--db/seeds.rb6
-rw-r--r--dist/nginx.conf2
-rw-r--r--lib/mastodon/migration_warning.rb55
-rw-r--r--lib/tasks/tests.rake10
-rw-r--r--package.json29
-rw-r--r--spec/controllers/api/v1/accounts/credentials_controller_spec.rb1
-rw-r--r--spec/controllers/application_controller_spec.rb3
-rw-r--r--spec/controllers/settings/preferences/notifications_controller_spec.rb14
-rw-r--r--spec/controllers/settings/preferences/other_controller_spec.rb14
-rw-r--r--spec/controllers/settings/profiles_controller_spec.rb8
-rw-r--r--spec/lib/settings/extend_spec.rb16
-rw-r--r--spec/lib/settings/scoped_settings_spec.rb35
-rw-r--r--spec/lib/user_settings_decorator_spec.rb84
-rw-r--r--spec/models/user_settings/namespace_spec.rb25
-rw-r--r--spec/models/user_settings/setting_spec.rb106
-rw-r--r--spec/models/user_settings_spec.rb110
-rw-r--r--spec/models/user_spec.rb14
-rw-r--r--spec/services/notify_service_spec.rb7
-rw-r--r--spec/services/report_service_spec.rb3
-rw-r--r--spec/services/update_status_service_spec.rb9
-rw-r--r--spec/workers/poll_expiration_notify_worker_spec.rb61
-rw-r--r--yarn.lock782
341 files changed, 4049 insertions, 2750 deletions
diff --git a/.codeclimate.yml b/.codeclimate.yml
deleted file mode 100644
index 00469df00..000000000
--- a/.codeclimate.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-version: '2'
-checks:
-  argument-count:
-    enabled: false
-  complex-logic:
-    enabled: false
-  file-lines:
-    enabled: false
-  method-complexity:
-    enabled: false
-  method-count:
-    enabled: false
-  method-lines:
-    enabled: false
-  nested-control-flow:
-    enabled: false
-  return-statements:
-    enabled: false
-  similar-code:
-    enabled: false
-  identical-code:
-    enabled: false
-plugins:
-  brakeman:
-    enabled: true
-  bundler-audit:
-    enabled: false
-  eslint:
-    enabled: false
-  rubocop:
-    enabled: false
-  sass-lint:
-    enabled: false
-exclude_patterns:
-  - spec/
-  - vendor/asset/
-
-  - app/javascript/mastodon/locales/**/*.json
-  - config/locales/**/*.yml
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index d628fd1bd..17208a84e 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -15,6 +15,7 @@
   "forwardPorts": [3000, 4000],
 
   // Use 'postCreateCommand' to run commands after the container is created.
+  "onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
   "postCreateCommand": ".devcontainer/post-create.sh",
   "waitFor": "postCreateCommand",
 
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 1b1756eca..73fe22f3a 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -10,7 +10,7 @@ services:
     environment:
       RAILS_ENV: development
       NODE_ENV: development
-
+      BIND: 0.0.0.0
       REDIS_HOST: redis
       REDIS_PORT: '6379'
       DB_HOST: db
@@ -23,6 +23,10 @@ services:
       LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
     # Overrides default command so things don't shut down after the process ends.
     command: sleep infinity
+    ports:
+      - '127.0.0.1:3000:3000'
+      - '127.0.0.1:4000:4000'
+      - '127.0.0.1:80:3000'
     networks:
       - external_network
       - internal_network
@@ -66,15 +70,19 @@ services:
         hard: -1
 
   libretranslate:
-    image: libretranslate/libretranslate:v1.2.9
+    image: libretranslate/libretranslate:v1.3.10
     restart: unless-stopped
+    volumes:
+      - lt-data:/home/libretranslate/.local
     networks:
+      - external_network
       - internal_network
 
 volumes:
   postgres-data:
   redis-data:
   es-data:
+  lt-data:
 
 networks:
   external_network:
diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh
index 02f488f12..7c3852e7e 100755
--- a/.devcontainer/post-create.sh
+++ b/.devcontainer/post-create.sh
@@ -14,6 +14,9 @@ git checkout -- Gemfile.lock
 # [re]create, migrate, and seed the test database
 RAILS_ENV=test ./bin/rails db:setup
 
+# [re]create, migrate, and seed the development database
+RAILS_ENV=development ./bin/rails db:setup
+
 # Precompile assets for development
 RAILS_ENV=development ./bin/rails assets:precompile
 
diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml
index a2b22a659..2ddbca781 100644
--- a/.github/workflows/lint-haml.yml
+++ b/.github/workflows/lint-haml.yml
@@ -30,7 +30,9 @@ jobs:
         uses: actions/checkout@v3
 
       - name: Install native Ruby dependencies
-        run: sudo apt-get install -y libicu-dev libidn11-dev
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libicu-dev libidn11-dev
 
       - name: Set up Ruby
         uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/test-migrations-one-step.yml b/.github/workflows/test-migrations-one-step.yml
index a3594e553..d7e424a8c 100644
--- a/.github/workflows/test-migrations-one-step.yml
+++ b/.github/workflows/test-migrations-one-step.yml
@@ -16,7 +16,7 @@ jobs:
       - id: skip_check
         uses: fkirc/skip-duplicate-actions@v5
         with:
-          paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-one-step.yml"]'
+          paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-one-step.yml", "lib/tasks/tests.rake"]'
 
   test:
     runs-on: ubuntu-latest
@@ -64,7 +64,9 @@ jobs:
       - uses: actions/checkout@v3
 
       - name: Install native Ruby dependencies
-        run: sudo apt-get install -y libicu-dev libidn11-dev
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libicu-dev libidn11-dev
 
       - name: Set up bundler cache
         uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/test-migrations-two-step.yml b/.github/workflows/test-migrations-two-step.yml
index f357bc9f6..25bf5ba87 100644
--- a/.github/workflows/test-migrations-two-step.yml
+++ b/.github/workflows/test-migrations-two-step.yml
@@ -16,7 +16,7 @@ jobs:
       - id: skip_check
         uses: fkirc/skip-duplicate-actions@v5
         with:
-          paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-two-step.yml"]'
+          paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-two-step.yml", "lib/tasks/tests.rake"]'
 
   test:
     runs-on: ubuntu-latest
@@ -63,7 +63,9 @@ jobs:
       - uses: actions/checkout@v3
 
       - name: Install native Ruby dependencies
-        run: sudo apt-get install -y libicu-dev libidn11-dev
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libicu-dev libidn11-dev
 
       - name: Set up bundler cache
         uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index 1be3e08e9..d1aa8468a 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -32,7 +32,9 @@ jobs:
           node-version-file: '.nvmrc'
 
       - name: Install native Ruby dependencies
-        run: sudo apt-get install -y libicu-dev libidn11-dev
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libicu-dev libidn11-dev
 
       - name: Set up bundler cache
         uses: ruby/setup-ruby@v1
@@ -119,6 +121,9 @@ jobs:
           path: './public'
           name: ${{ github.sha }}
 
+      - name: Update package index
+        run: sudo apt-get update
+
       - name: Install native Ruby dependencies
         run: sudo apt-get install -y libicu-dev libidn11-dev
 
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 000000000..d2ae35e84
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+yarn lint-staged
diff --git a/.rubocop.yml b/.rubocop.yml
index 1033db92d..e6a0c2d14 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,5 +1,7 @@
+# Can be removed once all rules are addressed or moved to this file as documented overrides
 inherit_from: .rubocop_todo.yml
 
+# Used for merging with exclude lists with .rubocop_todo.yml
 inherit_mode:
   merge:
     - Exclude
@@ -11,13 +13,13 @@ require:
   - rubocop-capybara
 
 AllCops:
-  TargetRubyVersion: 2.7
+  TargetRubyVersion: 2.7 # Set to minimum supported version of CI
   DisplayCopNames: true
   DisplayStyleGuide: true
   ExtraDetails: true
   UseCache: true
   CacheRootDirectory: tmp
-  NewCops: enable
+  NewCops: enable # Opt-in to newly added rules
   Exclude:
     - db/schema.rb
     - 'bin/*'
@@ -25,12 +27,16 @@ AllCops:
     - 'node_modules/**/*'
     - 'Vagrantfile'
     - 'vendor/**/*'
-    - 'lib/json_ld/*'
+    - 'lib/json_ld/*' # Generated files
     - 'lib/templates/**/*'
 
+# Reason: Prefer Hashes without extreme indentation
+# https://docs.rubocop.org/rubocop/cops_layout.html#layoutfirsthashelementindentation
 Layout/FirstHashElementIndentation:
   EnforcedStyle: consistent
 
+# Reason: Currently disabled in .rubocop_todo.yml
+# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
 Layout/LineLength:
   AllowedPatterns:
     # Allow comments to be long lines
@@ -41,20 +47,50 @@ Layout/LineLength:
     - db/*migrate/**/*
     - db/seeds/**/*
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
 Lint/UselessAccessModifier:
   ContextCreatingMethods:
     - class_methods
 
+# Reason: Currently disabled in .rubocop_todo.yml
+# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
 Metrics/AbcSize:
   Exclude:
     - 'lib/**/*cli*.rb'
     - db/*migrate/**/*
 
+# Reason: Some functions cannot be broken up, but others may be refactor candidates
+# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocklength
 Metrics/BlockLength:
-  CountAsOne: [array, heredoc]
+  CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
   Exclude:
     - 'lib/mastodon/*_cli.rb'
+    - 'lib/tasks/*.rake'
+    - 'app/models/concerns/account_associations.rb'
+    - 'app/models/concerns/account_interactions.rb'
+    - 'app/models/concerns/ldap_authenticable.rb'
+    - 'app/models/concerns/omniauthable.rb'
+    - 'app/models/concerns/pam_authenticable.rb'
+    - 'app/models/concerns/remotable.rb'
+    - 'app/services/suspend_account_service.rb'
+    - 'app/services/unsuspend_account_service.rb'
+    - 'app/views/accounts/show.rss.ruby'
+    - 'app/views/tags/show.rss.ruby'
+    - 'config/environments/development.rb'
+    - 'config/environments/production.rb'
+    - 'config/initializers/devise.rb'
+    - 'config/initializers/doorkeeper.rb'
+    - 'config/initializers/omniauth.rb'
+    - 'config/initializers/simple_form.rb'
+    - 'config/navigation.rb'
+    - 'config/routes.rb'
+    - 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb'
+    - 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb'
+    - 'lib/paperclip/gif_transcoder.rb'
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
 Metrics/BlockNesting:
   Exclude:
     - 'lib/mastodon/*_cli.rb'
@@ -103,22 +139,32 @@ Metrics/ClassLength:
     - 'app/services/update_status_service.rb'
     - 'lib/paperclip/color_extractor.rb'
 
+# Reason: Currently disabled in .rubocop_todo.yml
+# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
 Metrics/CyclomaticComplexity:
   Exclude:
     - lib/mastodon/*cli*.rb
     - db/*migrate/**/*
 
+# Reason: Currently disabled in .rubocop_todo.yml
+# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmethodlength
 Metrics/MethodLength:
   CountAsOne: [array, heredoc]
   Exclude:
     - 'lib/mastodon/*_cli.rb'
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
 Metrics/ModuleLength:
   CountAsOne: [array, heredoc]
 
+# Reason: Prevailing style uses numeric status codes, matches RSpec/Rails/HttpStatus
+# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railshttpstatus
 Rails/HttpStatus:
   EnforcedStyle: numeric
 
+# Reason: Allowed only in the `tootctl` CLI application code
+# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit
 Rails/Exit:
   Exclude:
     - 'lib/mastodon/*_cli.rb'
@@ -146,9 +192,18 @@ RSpec/FilePath:
     - 'spec/controllers/concerns/signature_verification_spec.rb'
     - 'spec/controllers/concerns/user_tracking_concern_spec.rb'
 
+# Reason:
+# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject
+RSpec/NamedSubject:
+  EnforcedStyle: named_only
+
+# Reason: Prevailing style choice
+# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnottonot
 RSpec/NotToNot:
   EnforcedStyle: to_not
 
+# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
+# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
 RSpec/Rails/HttpStatus:
   EnforcedStyle: numeric
 
@@ -162,26 +217,45 @@ Style/ClassAndModuleChildren:
 Style/Documentation:
   Enabled: false
 
+# Reason: Enforce modern Ruby style
+# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
 Style/HashSyntax:
   EnforcedStyle: ruby19_no_mixed_keys
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
 Style/NumericLiterals:
   AllowedPatterns:
     - \d{4}_\d{2}_\d{2}_\d{6} # For DB migration date version number readability
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_style.html#stylepercentliteraldelimiters
 Style/PercentLiteralDelimiters:
   PreferredDelimiters:
     '%i': '()'
     '%w': '()'
 
+# Reason: Prefer less indentation in conditional assignments
+# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantbegin
+Style/RedundantBegin:
+  Enabled: false
+
+# Reason: Overridden to reduce implicit StandardError rescues
+# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
 Style/RescueStandardError:
   EnforcedStyle: implicit
 
+# Reason: Originally disabled for CodeClimate, and no config consensus has been found
+# https://docs.rubocop.org/rubocop/cops_style.html#stylesymbolarray
+Style/SymbolArray:
+  Enabled: false
+
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainarrayliteral
 Style/TrailingCommaInArrayLiteral:
   EnforcedStyleForMultiline: 'comma'
 
+# Reason:
+# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainhashliteral
 Style/TrailingCommaInHashLiteral:
   EnforcedStyleForMultiline: 'comma'
-
-Style/SymbolArray:
-  Enabled: false
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 64a6b6b33..2e4801a55 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -117,7 +117,6 @@ Lint/ConstantDefinitionInBlock:
     - 'spec/lib/activitypub/adapter_spec.rb'
     - 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
     - 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
-    - 'spec/lib/settings/extend_spec.rb'
     - 'spec/models/concerns/remotable_spec.rb'
 
 # Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
@@ -233,11 +232,6 @@ Lint/Void:
 Metrics/AbcSize:
   Max: 150
 
-# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
-# AllowedMethods: refine
-Metrics/BlockLength:
-  Max: 544
-
 # Configuration parameters: CountBlocks, Max.
 Metrics/BlockNesting:
   Exclude:
@@ -259,6 +253,7 @@ Metrics/ModuleLength:
     - 'app/helpers/jsonld_helper.rb'
     - 'app/helpers/statuses_helper.rb'
     - 'app/models/concerns/account_interactions.rb'
+    - 'app/models/concerns/has_user_settings.rb'
 
 # Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
 Metrics/ParameterLists:
@@ -730,7 +725,6 @@ RSpec/LeakyConstantDeclaration:
     - 'spec/lib/activitypub/adapter_spec.rb'
     - 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
     - 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
-    - 'spec/lib/settings/extend_spec.rb'
     - 'spec/models/concerns/remotable_spec.rb'
 
 RSpec/LetSetup:
@@ -880,204 +874,6 @@ RSpec/MultipleSubjects:
     - 'spec/controllers/follower_accounts_controller_spec.rb'
     - 'spec/controllers/following_accounts_controller_spec.rb'
 
-# Configuration parameters: EnforcedStyle, IgnoreSharedExamples.
-# SupportedStyles: always, named_only
-RSpec/NamedSubject:
-  Exclude:
-    - 'spec/controllers/admin/account_moderation_notes_controller_spec.rb'
-    - 'spec/controllers/admin/accounts_controller_spec.rb'
-    - 'spec/controllers/admin/confirmations_controller_spec.rb'
-    - 'spec/controllers/admin/custom_emojis_controller_spec.rb'
-    - 'spec/controllers/admin/domain_blocks_controller_spec.rb'
-    - 'spec/controllers/admin/instances_controller_spec.rb'
-    - 'spec/controllers/admin/invites_controller_spec.rb'
-    - 'spec/controllers/admin/report_notes_controller_spec.rb'
-    - 'spec/controllers/api/v1/accounts/notes_controller_spec.rb'
-    - 'spec/controllers/api/v1/accounts/pins_controller_spec.rb'
-    - 'spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb'
-    - 'spec/controllers/auth/passwords_controller_spec.rb'
-    - 'spec/controllers/auth/registrations_controller_spec.rb'
-    - 'spec/controllers/home_controller_spec.rb'
-    - 'spec/controllers/invites_controller_spec.rb'
-    - 'spec/controllers/oauth/authorizations_controller_spec.rb'
-    - 'spec/controllers/oauth/authorized_applications_controller_spec.rb'
-    - 'spec/controllers/relationships_controller_spec.rb'
-    - 'spec/controllers/settings/featured_tags_controller_spec.rb'
-    - 'spec/controllers/settings/migrations_controller_spec.rb'
-    - 'spec/controllers/settings/sessions_controller_spec.rb'
-    - 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb'
-    - 'spec/controllers/well_known/webfinger_controller_spec.rb'
-    - 'spec/features/log_in_spec.rb'
-    - 'spec/features/profile_spec.rb'
-    - 'spec/lib/activitypub/activity/accept_spec.rb'
-    - 'spec/lib/activitypub/activity/add_spec.rb'
-    - 'spec/lib/activitypub/activity/announce_spec.rb'
-    - 'spec/lib/activitypub/activity/block_spec.rb'
-    - 'spec/lib/activitypub/activity/create_spec.rb'
-    - 'spec/lib/activitypub/activity/delete_spec.rb'
-    - 'spec/lib/activitypub/activity/flag_spec.rb'
-    - 'spec/lib/activitypub/activity/follow_spec.rb'
-    - 'spec/lib/activitypub/activity/like_spec.rb'
-    - 'spec/lib/activitypub/activity/move_spec.rb'
-    - 'spec/lib/activitypub/activity/reject_spec.rb'
-    - 'spec/lib/activitypub/activity/remove_spec.rb'
-    - 'spec/lib/activitypub/activity/undo_spec.rb'
-    - 'spec/lib/activitypub/activity/update_spec.rb'
-    - 'spec/lib/activitypub/adapter_spec.rb'
-    - 'spec/lib/activitypub/dereferencer_spec.rb'
-    - 'spec/lib/activitypub/linked_data_signature_spec.rb'
-    - 'spec/lib/activitypub/tag_manager_spec.rb'
-    - 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
-    - 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
-    - 'spec/lib/delivery_failure_tracker_spec.rb'
-    - 'spec/lib/emoji_formatter_spec.rb'
-    - 'spec/lib/entity_cache_spec.rb'
-    - 'spec/lib/fast_ip_map_spec.rb'
-    - 'spec/lib/feed_manager_spec.rb'
-    - 'spec/lib/hashtag_normalizer_spec.rb'
-    - 'spec/lib/html_aware_formatter_spec.rb'
-    - 'spec/lib/link_details_extractor_spec.rb'
-    - 'spec/lib/ostatus/tag_manager_spec.rb'
-    - 'spec/lib/plain_text_formatter_spec.rb'
-    - 'spec/lib/request_pool_spec.rb'
-    - 'spec/lib/request_spec.rb'
-    - 'spec/lib/sanitize_config_spec.rb'
-    - 'spec/lib/status_finder_spec.rb'
-    - 'spec/lib/status_reach_finder_spec.rb'
-    - 'spec/lib/suspicious_sign_in_detector_spec.rb'
-    - 'spec/lib/text_formatter_spec.rb'
-    - 'spec/lib/vacuum/access_tokens_vacuum_spec.rb'
-    - 'spec/lib/vacuum/backups_vacuum_spec.rb'
-    - 'spec/lib/vacuum/feeds_vacuum_spec.rb'
-    - 'spec/lib/vacuum/media_attachments_vacuum_spec.rb'
-    - 'spec/lib/vacuum/preview_cards_vacuum_spec.rb'
-    - 'spec/lib/vacuum/statuses_vacuum_spec.rb'
-    - 'spec/lib/vacuum/system_keys_vacuum_spec.rb'
-    - 'spec/models/account/field_spec.rb'
-    - 'spec/models/account_migration_spec.rb'
-    - 'spec/models/account_spec.rb'
-    - 'spec/models/account_statuses_cleanup_policy_spec.rb'
-    - 'spec/models/account_statuses_filter_spec.rb'
-    - 'spec/models/admin/account_action_spec.rb'
-    - 'spec/models/canonical_email_block_spec.rb'
-    - 'spec/models/concerns/account_interactions_spec.rb'
-    - 'spec/models/custom_emoji_filter_spec.rb'
-    - 'spec/models/custom_emoji_spec.rb'
-    - 'spec/models/follow_spec.rb'
-    - 'spec/models/home_feed_spec.rb'
-    - 'spec/models/media_attachment_spec.rb'
-    - 'spec/models/notification_spec.rb'
-    - 'spec/models/public_feed_spec.rb'
-    - 'spec/models/relationship_filter_spec.rb'
-    - 'spec/models/remote_follow_spec.rb'
-    - 'spec/models/report_spec.rb'
-    - 'spec/models/session_activation_spec.rb'
-    - 'spec/models/setting_spec.rb'
-    - 'spec/models/status_spec.rb'
-    - 'spec/models/tag_spec.rb'
-    - 'spec/models/trends/statuses_spec.rb'
-    - 'spec/models/trends/tags_spec.rb'
-    - 'spec/models/user_role_spec.rb'
-    - 'spec/models/user_spec.rb'
-    - 'spec/models/web/push_subscription_spec.rb'
-    - 'spec/policies/account_moderation_note_policy_spec.rb'
-    - 'spec/policies/account_policy_spec.rb'
-    - 'spec/policies/backup_policy_spec.rb'
-    - 'spec/policies/custom_emoji_policy_spec.rb'
-    - 'spec/policies/domain_block_policy_spec.rb'
-    - 'spec/policies/email_domain_block_policy_spec.rb'
-    - 'spec/policies/instance_policy_spec.rb'
-    - 'spec/policies/invite_policy_spec.rb'
-    - 'spec/policies/relay_policy_spec.rb'
-    - 'spec/policies/report_note_policy_spec.rb'
-    - 'spec/policies/report_policy_spec.rb'
-    - 'spec/policies/settings_policy_spec.rb'
-    - 'spec/policies/status_policy_spec.rb'
-    - 'spec/policies/tag_policy_spec.rb'
-    - 'spec/policies/user_policy_spec.rb'
-    - 'spec/presenters/familiar_followers_presenter_spec.rb'
-    - 'spec/serializers/activitypub/note_serializer_spec.rb'
-    - 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
-    - 'spec/serializers/rest/account_serializer_spec.rb'
-    - 'spec/services/account_search_service_spec.rb'
-    - 'spec/services/account_statuses_cleanup_service_spec.rb'
-    - 'spec/services/activitypub/fetch_remote_account_service_spec.rb'
-    - 'spec/services/activitypub/fetch_remote_actor_service_spec.rb'
-    - 'spec/services/activitypub/fetch_remote_status_service_spec.rb'
-    - 'spec/services/activitypub/fetch_replies_service_spec.rb'
-    - 'spec/services/activitypub/process_account_service_spec.rb'
-    - 'spec/services/activitypub/process_collection_service_spec.rb'
-    - 'spec/services/activitypub/process_status_update_service_spec.rb'
-    - 'spec/services/after_block_domain_from_account_service_spec.rb'
-    - 'spec/services/after_block_service_spec.rb'
-    - 'spec/services/app_sign_up_service_spec.rb'
-    - 'spec/services/authorize_follow_service_spec.rb'
-    - 'spec/services/batched_remove_status_service_spec.rb'
-    - 'spec/services/block_domain_service_spec.rb'
-    - 'spec/services/block_service_spec.rb'
-    - 'spec/services/bootstrap_timeline_service_spec.rb'
-    - 'spec/services/clear_domain_media_service_spec.rb'
-    - 'spec/services/delete_account_service_spec.rb'
-    - 'spec/services/fan_out_on_write_service_spec.rb'
-    - 'spec/services/favourite_service_spec.rb'
-    - 'spec/services/fetch_link_card_service_spec.rb'
-    - 'spec/services/fetch_oembed_service_spec.rb'
-    - 'spec/services/fetch_remote_status_service_spec.rb'
-    - 'spec/services/fetch_resource_service_spec.rb'
-    - 'spec/services/follow_service_spec.rb'
-    - 'spec/services/import_service_spec.rb'
-    - 'spec/services/mute_service_spec.rb'
-    - 'spec/services/notify_service_spec.rb'
-    - 'spec/services/post_status_service_spec.rb'
-    - 'spec/services/precompute_feed_service_spec.rb'
-    - 'spec/services/process_mentions_service_spec.rb'
-    - 'spec/services/purge_domain_service_spec.rb'
-    - 'spec/services/reblog_service_spec.rb'
-    - 'spec/services/reject_follow_service_spec.rb'
-    - 'spec/services/remove_from_followers_service_spec.rb'
-    - 'spec/services/remove_status_service_spec.rb'
-    - 'spec/services/report_service_spec.rb'
-    - 'spec/services/resolve_account_service_spec.rb'
-    - 'spec/services/resolve_url_service_spec.rb'
-    - 'spec/services/search_service_spec.rb'
-    - 'spec/services/suspend_account_service_spec.rb'
-    - 'spec/services/unallow_domain_service_spec.rb'
-    - 'spec/services/unblock_domain_service_spec.rb'
-    - 'spec/services/unblock_service_spec.rb'
-    - 'spec/services/unfollow_service_spec.rb'
-    - 'spec/services/unsuspend_account_service_spec.rb'
-    - 'spec/services/update_account_service_spec.rb'
-    - 'spec/services/update_status_service_spec.rb'
-    - 'spec/services/verify_link_service_spec.rb'
-    - 'spec/validators/blacklisted_email_validator_spec.rb'
-    - 'spec/validators/email_mx_validator_spec.rb'
-    - 'spec/validators/note_length_validator_spec.rb'
-    - 'spec/validators/reaction_validator_spec.rb'
-    - 'spec/validators/status_length_validator_spec.rb'
-    - 'spec/validators/status_pin_validator_spec.rb'
-    - 'spec/validators/unique_username_validator_spec.rb'
-    - 'spec/workers/activitypub/delivery_worker_spec.rb'
-    - 'spec/workers/activitypub/distribute_poll_update_worker_spec.rb'
-    - 'spec/workers/activitypub/distribution_worker_spec.rb'
-    - 'spec/workers/activitypub/fetch_replies_worker_spec.rb'
-    - 'spec/workers/activitypub/move_distribution_worker_spec.rb'
-    - 'spec/workers/activitypub/processing_worker_spec.rb'
-    - 'spec/workers/activitypub/status_update_distribution_worker_spec.rb'
-    - 'spec/workers/activitypub/update_distribution_worker_spec.rb'
-    - 'spec/workers/admin/domain_purge_worker_spec.rb'
-    - 'spec/workers/domain_block_worker_spec.rb'
-    - 'spec/workers/domain_clear_media_worker_spec.rb'
-    - 'spec/workers/feed_insert_worker_spec.rb'
-    - 'spec/workers/move_worker_spec.rb'
-    - 'spec/workers/publish_scheduled_announcement_worker_spec.rb'
-    - 'spec/workers/publish_scheduled_status_worker_spec.rb'
-    - 'spec/workers/refollow_worker_spec.rb'
-    - 'spec/workers/regeneration_worker_spec.rb'
-    - 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb'
-    - 'spec/workers/scheduler/user_cleanup_scheduler_spec.rb'
-    - 'spec/workers/unfollow_follow_worker_spec.rb'
-    - 'spec/workers/web/push_notification_worker_spec.rb'
-
 # Configuration parameters: AllowedGroups.
 RSpec/NestedGroups:
   Max: 6
@@ -1476,7 +1272,6 @@ Rails/CompactBlank:
     - 'app/helpers/statuses_helper.rb'
     - 'app/models/concerns/attachmentable.rb'
     - 'app/models/poll.rb'
-    - 'app/models/user.rb'
     - 'app/services/import_service.rb'
     - 'config/initializers/paperclip.rb'
 
@@ -1527,7 +1322,6 @@ Rails/FilePath:
     - 'app/validators/reaction_validator.rb'
     - 'config/environments/test.rb'
     - 'db/migrate/20170716191202_add_hide_notifications_to_mute.rb'
-    - 'db/migrate/20170918125918_ids_to_bigints.rb'
     - 'db/migrate/20171005171936_add_disabled_to_custom_emojis.rb'
     - 'db/migrate/20171028221157_add_reblogs_to_follows.rb'
     - 'db/migrate/20171107143332_add_memorial_to_accounts.rb'
@@ -1637,18 +1431,6 @@ Rails/I18nLocaleTexts:
     - 'lib/tasks/mastodon.rake'
     - 'spec/helpers/flashes_helper_spec.rb'
 
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Rails/IgnoredColumnsAssignment:
-  Exclude:
-    - 'app/models/account.rb'
-    - 'app/models/account_stat.rb'
-    - 'app/models/admin/action_log.rb'
-    - 'app/models/custom_filter.rb'
-    - 'app/models/email_domain_block.rb'
-    - 'app/models/report.rb'
-    - 'app/models/status_edit.rb'
-    - 'app/models/user.rb'
-
 # Configuration parameters: IgnoreScopes, Include.
 # Include: app/models/**/*.rb
 Rails/InverseOf:
@@ -2425,11 +2207,6 @@ Style/HashTransformValues:
     - 'app/serializers/rest/web_push_subscription_serializer.rb'
     - 'app/services/import_service.rb'
 
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Style/IdenticalConditionalBranches:
-  Exclude:
-    - 'config/initializers/content_security_policy.rb'
-
 # This cop supports safe autocorrection (--autocorrect).
 Style/IfUnlessModifier:
   Exclude:
@@ -2530,11 +2307,6 @@ Style/PreferredHashMethods:
     - 'config/initializers/paperclip.rb'
 
 # This cop supports safe autocorrection (--autocorrect).
-Style/RedundantBegin:
-  Exclude:
-    - 'config/initializers/simple_form.rb'
-
-# This cop supports safe autocorrection (--autocorrect).
 Style/RedundantConstantBase:
   Exclude:
     - 'config/environments/production.rb'
diff --git a/.ruby-version b/.ruby-version
index e4604e3af..be94e6f53 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-3.2.1
+3.2.2
diff --git a/.yarnclean b/.yarnclean
index 0cc2b50d7..21eb734a6 100644
--- a/.yarnclean
+++ b/.yarnclean
@@ -44,3 +44,6 @@ Gruntfile.js
 # for specific ignore
 !.svgo.yml
 !sass-lint/**/*.yml
+
+# breaks lint-staged or generally anything using https://github.com/eemeli/yaml/issues/384
+!**/yaml/dist/**/doc
diff --git a/Dockerfile b/Dockerfile
index 169d3af4f..dca547c6d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@
 # This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
 ARG NODE_VERSION="16.19-bullseye-slim"
 
-FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.1-slim as ruby
+FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim as ruby
 FROM node:${NODE_VERSION} as build
 
 COPY --link --from=ruby /opt/ruby /opt/ruby
diff --git a/Gemfile b/Gemfile
index 8cb99a9ef..46f3e0106 100644
--- a/Gemfile
+++ b/Gemfile
@@ -87,10 +87,10 @@ gem 'simple-navigation', '~> 4.4'
 gem 'simple_form', '~> 5.2'
 gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
 gem 'stoplight', '~> 3.0.1'
-gem 'strong_migrations', '~> 0.7'
+gem 'strong_migrations', '~> 0.8'
 gem 'tty-prompt', '~> 0.23', require: false
 gem 'twitter-text', '~> 3.1.0'
-gem 'tzinfo-data', '~> 1.2022'
+gem 'tzinfo-data', '~> 1.2023'
 gem 'webpacker', '~> 5.4'
 gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
 gem 'webauthn', '~> 3.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 5f02f7030..129b677cf 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -109,16 +109,16 @@ GEM
     attr_required (1.0.1)
     awrence (1.2.1)
     aws-eventstream (1.2.0)
-    aws-partitions (1.711.0)
-    aws-sdk-core (3.170.0)
+    aws-partitions (1.735.0)
+    aws-sdk-core (3.171.0)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.62.0)
+    aws-sdk-kms (1.63.0)
       aws-sdk-core (~> 3, >= 3.165.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.119.1)
+    aws-sdk-s3 (1.119.2)
       aws-sdk-core (~> 3, >= 3.165.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.4)
@@ -685,8 +685,8 @@ GEM
     statsd-ruby (1.5.0)
     stoplight (3.0.1)
       redlock (~> 1.0)
-    strong_migrations (0.7.9)
-      activerecord (>= 5)
+    strong_migrations (0.8.0)
+      activerecord (>= 5.2)
     swd (1.3.0)
       activesupport (>= 3)
       attr_required (>= 0.0.5)
@@ -719,7 +719,7 @@ GEM
       unf (~> 0.1.0)
     tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
-    tzinfo-data (1.2022.7)
+    tzinfo-data (1.2023.2)
       tzinfo (>= 1.0.0)
     unf (0.1.4)
       unf_ext
@@ -885,11 +885,11 @@ DEPENDENCIES
   sprockets-rails (~> 3.4)
   stackprof
   stoplight (~> 3.0.1)
-  strong_migrations (~> 0.7)
+  strong_migrations (~> 0.8)
   thor (~> 1.2)
   tty-prompt (~> 0.23)
   twitter-text (~> 3.1.0)
-  tzinfo-data (~> 1.2022)
+  tzinfo-data (~> 1.2023)
   webauthn (~> 3.0)
   webmock (~> 3.18)
   webpacker (~> 5.4)
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index 94b707771..7c7d70fd3 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -13,7 +13,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
   def update
     @account = current_account
     UpdateAccountService.new.call(@account, account_params, raise_error: true)
-    UserSettingsDecorator.new(current_user).update(user_settings_params) if user_settings_params
+    current_user.update(user_params) if user_params
     ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
     render json: @account, serializer: REST::CredentialAccountSerializer
   end
@@ -34,15 +34,17 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
     )
   end
 
-  def user_settings_params
+  def user_params
     return nil if params[:source].blank?
 
     source_params = params.require(:source)
 
     {
-      'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
-      'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
-      'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
+      settings_attributes: {
+        default_privacy: source_params.fetch(:privacy, @account.user.setting_default_privacy),
+        default_sensitive: source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
+        default_language: source_params.fetch(:language, @account.user.setting_default_language),
+      },
     }
   end
 end
diff --git a/app/controllers/api/v1/streaming_controller.rb b/app/controllers/api/v1/streaming_controller.rb
index b23a60170..0cdd00d62 100644
--- a/app/controllers/api/v1/streaming_controller.rb
+++ b/app/controllers/api/v1/streaming_controller.rb
@@ -5,7 +5,7 @@ class Api::V1::StreamingController < Api::BaseController
     if Rails.configuration.x.streaming_api_base_url == request.host
       not_found
     else
-      redirect_to streaming_api_url, status: 301
+      redirect_to streaming_api_url, status: 301, allow_other_host: true
     end
   end
 
diff --git a/app/controllers/backups_controller.rb b/app/controllers/backups_controller.rb
index 2f4b400b8..0687b62c5 100644
--- a/app/controllers/backups_controller.rb
+++ b/app/controllers/backups_controller.rb
@@ -13,7 +13,11 @@ class BackupsController < ApplicationController
     when :s3
       redirect_to @backup.dump.expiring_url(10)
     when :fog
-      redirect_to @backup.dump.expiring_url(Time.now.utc + 10)
+      if Paperclip::Attachment.default_options.dig(:storage, :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)
+      end
     when :filesystem
       redirect_to full_asset_url(@backup.dump.url)
     end
diff --git a/app/controllers/concerns/account_controller_concern.rb b/app/controllers/concerns/account_controller_concern.rb
index 2f7d84df0..e9cff22ca 100644
--- a/app/controllers/concerns/account_controller_concern.rb
+++ b/app/controllers/concerns/account_controller_concern.rb
@@ -10,7 +10,8 @@ module AccountControllerConcern
 
   included do
     before_action :set_instance_presenter
-    before_action :set_link_headers, if: -> { request.format.nil? || request.format == :html }
+
+    after_action :set_link_headers, if: -> { request.format.nil? || request.format == :html }
   end
 
   private
diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb
index 3b228722f..f29b69a24 100644
--- a/app/controllers/media_proxy_controller.rb
+++ b/app/controllers/media_proxy_controller.rb
@@ -23,7 +23,7 @@ class MediaProxyController < ApplicationController
       redownload! if @media_attachment.needs_redownload? && !reject_media?
     end
 
-    redirect_to full_asset_url(@media_attachment.file.url(version))
+    redirect_to full_asset_url(@media_attachment.file.url(version)), allow_other_host: true
   end
 
   private
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index 4c1336436..281deb64d 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -4,8 +4,6 @@ class Settings::PreferencesController < Settings::BaseController
   def show; end
 
   def update
-    user_settings.update(user_settings_params.to_h)
-
     if current_user.update(user_params)
       I18n.locale = current_user.locale
       redirect_to after_update_redirect_path, notice: I18n.t('generic.changes_saved_msg')
@@ -20,46 +18,7 @@ class Settings::PreferencesController < Settings::BaseController
     settings_preferences_path
   end
 
-  def user_settings
-    UserSettingsDecorator.new(current_user)
-  end
-
   def user_params
-    params.require(:user).permit(
-      :locale,
-      chosen_languages: []
-    )
-  end
-
-  def user_settings_params
-    params.require(:user).permit(
-      :setting_default_privacy,
-      :setting_default_sensitive,
-      :setting_default_language,
-      :setting_unfollow_modal,
-      :setting_boost_modal,
-      :setting_favourite_modal,
-      :setting_delete_modal,
-      :setting_auto_play_gif,
-      :setting_display_media,
-      :setting_expand_spoilers,
-      :setting_reduce_motion,
-      :setting_disable_swiping,
-      :setting_system_font_ui,
-      :setting_system_emoji_font,
-      :setting_noindex,
-      :setting_hide_followers_count,
-      :setting_aggregate_reblogs,
-      :setting_show_application,
-      :setting_advanced_layout,
-      :setting_default_content_type,
-      :setting_use_blurhash,
-      :setting_use_pending_items,
-      :setting_trends,
-      :setting_crop_images,
-      :setting_always_send_emails,
-      notification_emails: %i(follow follow_request reblog favourite mention report pending_account trending_tag trending_link trending_status appeal),
-      interactions: %i(must_be_follower must_be_following must_be_following_dm)
-    )
+    params.require(:user).permit(:locale, chosen_languages: [], settings_attributes: UserSettings.keys)
   end
 end
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index e5221df3a..15c081264 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -9,11 +9,12 @@ class StatusesController < ApplicationController
   before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? }
   before_action :set_status
   before_action :set_instance_presenter
-  before_action :set_link_headers
   before_action :redirect_to_original, only: :show
   before_action :set_cache_headers
   before_action :set_body_classes, only: :embed
 
+  after_action :set_link_headers
+
   skip_around_action :set_locale, if: -> { request.format == :json }
   skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
 
@@ -71,6 +72,6 @@ class StatusesController < ApplicationController
   end
 
   def redirect_to_original
-    redirect_to ActivityPub::TagManager.instance.url_for(@status.reblog) if @status.reblog?
+    redirect_to(ActivityPub::TagManager.instance.url_for(@status.reblog), allow_other_host: true) if @status.reblog?
   end
 end
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index ef08edbf8..e1db44359 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -4,7 +4,6 @@ import { defineMessages } from 'react-intl';
 import api from 'mastodon/api';
 import { search as emojiSearch } from 'mastodon/features/emoji/emoji_mart_search_light';
 import { tagHistory } from 'mastodon/settings';
-import resizeImage from 'mastodon/utils/resize_image';
 import { showAlert, showAlertForError } from './alerts';
 import { useEmoji } from './emojis';
 import { importFetchedAccounts, importFetchedStatus } from './importer';
@@ -276,46 +275,42 @@ export function uploadCompose(files) {
 
     dispatch(uploadComposeRequest());
 
-    for (const [i, f] of Array.from(files).entries()) {
+    for (const [i, file] of Array.from(files).entries()) {
       if (media.size + i > 3) break;
 
-      resizeImage(f).then(file => {
-        const data = new FormData();
-        data.append('file', file);
-        // Account for disparity in size of original image and resized data
-        total += file.size - f.size;
-
-        return api(getState).post('/api/v2/media', data, {
-          onUploadProgress: function({ loaded }){
-            progress[i] = loaded;
-            dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
-          },
-        }).then(({ status, data }) => {
-          // If server-side processing of the media attachment has not completed yet,
-          // poll the server until it is, before showing the media attachment as uploaded
-
-          if (status === 200) {
-            dispatch(uploadComposeSuccess(data, f));
-          } else if (status === 202) {
-            dispatch(uploadComposeProcessing());
-
-            let tryCount = 1;
-
-            const poll = () => {
-              api(getState).get(`/api/v1/media/${data.id}`).then(response => {
-                if (response.status === 200) {
-                  dispatch(uploadComposeSuccess(response.data, f));
-                } else if (response.status === 206) {
-                  const retryAfter = (Math.log2(tryCount) || 1) * 1000;
-                  tryCount += 1;
-                  setTimeout(() => poll(), retryAfter);
-                }
-              }).catch(error => dispatch(uploadComposeFail(error)));
-            };
-
-            poll();
-          }
-        });
+      const data = new FormData();
+      data.append('file', file);
+
+      api(getState).post('/api/v2/media', data, {
+        onUploadProgress: function({ loaded }){
+          progress[i] = loaded;
+          dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
+        },
+      }).then(({ status, data }) => {
+        // If server-side processing of the media attachment has not completed yet,
+        // poll the server until it is, before showing the media attachment as uploaded
+
+        if (status === 200) {
+          dispatch(uploadComposeSuccess(data, file));
+        } else if (status === 202) {
+          dispatch(uploadComposeProcessing());
+
+          let tryCount = 1;
+
+          const poll = () => {
+            api(getState).get(`/api/v1/media/${data.id}`).then(response => {
+              if (response.status === 200) {
+                dispatch(uploadComposeSuccess(response.data, file));
+              } else if (response.status === 206) {
+                const retryAfter = (Math.log2(tryCount) || 1) * 1000;
+                tryCount += 1;
+                setTimeout(() => poll(), retryAfter);
+              }
+            }).catch(error => dispatch(uploadComposeFail(error)));
+          };
+
+          poll();
+        }
       }).catch(error => dispatch(uploadComposeFail(error)));
     }
   };
diff --git a/app/javascript/mastodon/components/account.jsx b/app/javascript/mastodon/components/account.jsx
index 7aaa668fe..0ee0e4551 100644
--- a/app/javascript/mastodon/components/account.jsx
+++ b/app/javascript/mastodon/components/account.jsx
@@ -10,6 +10,9 @@ import { me } from '../initial_state';
 import RelativeTimestamp from './relative_timestamp';
 import Skeleton from 'mastodon/components/skeleton';
 import { Link } from 'react-router-dom';
+import { counterRenderer } from 'mastodon/components/common_counter';
+import ShortNumber from 'mastodon/components/short_number';
+import Icon from 'mastodon/components/icon';
 
 const messages = defineMessages({
   follow: { id: 'account.follow', defaultMessage: 'Follow' },
@@ -23,6 +26,26 @@ const messages = defineMessages({
   block: { id: 'account.block', defaultMessage: 'Block @{name}' },
 });
 
+class VerifiedBadge extends React.PureComponent {
+
+  static propTypes = {
+    link: PropTypes.string.isRequired,
+    verifiedAt: PropTypes.string.isRequired,
+  };
+
+  render () {
+    const { link } = this.props;
+
+    return (
+      <span className='verified-badge'>
+        <Icon id='check' className='verified-badge__mark' />
+        <span dangerouslySetInnerHTML={{ __html: link }} />
+      </span>
+    );
+  }
+
+}
+
 class Account extends ImmutablePureComponent {
 
   static propTypes = {
@@ -77,7 +100,11 @@ class Account extends ImmutablePureComponent {
           <div className='account__wrapper'>
             <div className='account__display-name'>
               <div className='account__avatar-wrapper'><Skeleton width={36} height={36} /></div>
-              <DisplayName />
+
+              <div>
+                <DisplayName />
+                <Skeleton width='7ch' />
+              </div>
             </div>
           </div>
         </div>
@@ -131,18 +158,32 @@ class Account extends ImmutablePureComponent {
       }
     }
 
-    let mute_expires_at;
+    let muteTimeRemaining;
+
     if (account.get('mute_expires_at')) {
-      mute_expires_at =  <div><RelativeTimestamp timestamp={account.get('mute_expires_at')} futureDate /></div>;
+      muteTimeRemaining = <>· <RelativeTimestamp timestamp={account.get('mute_expires_at')} futureDate /></>;
+    }
+
+    let verification;
+
+    const firstVerifiedField = account.get('fields').find(item => !!item.get('verified_at'));
+
+    if (firstVerifiedField) {
+      verification = <>· <VerifiedBadge link={firstVerifiedField.get('value')} verifiedAt={firstVerifiedField.get('verified_at')} /></>;
     }
 
     return (
       <div className='account'>
         <div className='account__wrapper'>
           <Link key={account.get('id')} className='account__display-name' title={account.get('acct')} to={`/@${account.get('acct')}`}>
-            <div className='account__avatar-wrapper'><Avatar account={account} size={size} /></div>
-            {mute_expires_at}
-            <DisplayName account={account} />
+            <div className='account__avatar-wrapper'>
+              <Avatar account={account} size={size} />
+            </div>
+
+            <div>
+              <DisplayName account={account} />
+              <ShortNumber value={account.get('followers_count')} renderer={counterRenderer('followers')} /> {verification} {muteTimeRemaining}
+            </div>
           </Link>
 
           <div className='account__relationship'>
diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx
index 2d200a55b..281e69874 100644
--- a/app/javascript/mastodon/components/status.jsx
+++ b/app/javascript/mastodon/components/status.jsx
@@ -386,6 +386,13 @@ class Status extends ImmutablePureComponent {
 
       account = status.get('account');
       status  = status.get('reblog');
+    } else if (status.get('visibility') === 'direct') {
+      prepend = (
+        <div className='status__prepend'>
+          <div className='status__prepend-icon-wrapper'><Icon id='at' className='status__prepend-icon' fixedWidth /></div>
+          <FormattedMessage id='status.direct_indicator' defaultMessage='Private mention' />
+        </div>
+      );
     } else if (showThread && status.get('in_reply_to_id') && status.get('in_reply_to_account_id') === status.getIn(['account', 'id'])) {
       const display_name_html = { __html: status.getIn(['account', 'display_name_html']) };
 
diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx
index 08e37e089..7b4031b68 100644
--- a/app/javascript/mastodon/components/status_action_bar.jsx
+++ b/app/javascript/mastodon/components/status_action_bar.jsx
@@ -14,7 +14,7 @@ const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
   redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
   edit: { id: 'status.edit', defaultMessage: 'Edit' },
-  direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
+  direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
   mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
   block: { id: 'account.block', defaultMessage: 'Block @{name}' },
diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx
index be6b17896..72eb7e6b6 100644
--- a/app/javascript/mastodon/features/account/components/header.jsx
+++ b/app/javascript/mastodon/features/account/components/header.jsx
@@ -28,7 +28,7 @@ const messages = defineMessages({
   linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' },
   account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' },
   mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
-  direct: { id: 'account.direct', defaultMessage: 'Direct message @{name}' },
+  direct: { id: 'account.direct', defaultMessage: 'Privately mention @{name}' },
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
   block: { id: 'account.block', defaultMessage: 'Block @{name}' },
   mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
diff --git a/app/javascript/mastodon/features/direct_timeline/index.jsx b/app/javascript/mastodon/features/direct_timeline/index.jsx
index e2667d8e9..5d4a7c49a 100644
--- a/app/javascript/mastodon/features/direct_timeline/index.jsx
+++ b/app/javascript/mastodon/features/direct_timeline/index.jsx
@@ -11,7 +11,7 @@ import ColumnHeader from 'mastodon/components/column_header';
 import ConversationsListContainer from './containers/conversations_list_container';
 
 const messages = defineMessages({
-  title: { id: 'column.direct', defaultMessage: 'Direct messages' },
+  title: { id: 'column.direct', defaultMessage: 'Private mentions' },
 });
 
 class DirectTimeline extends React.PureComponent {
@@ -91,7 +91,7 @@ class DirectTimeline extends React.PureComponent {
           timelineId='direct'
           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>}
-          emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />}
+          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." />}
         />
 
         <Helmet>
diff --git a/app/javascript/mastodon/features/explore/index.jsx b/app/javascript/mastodon/features/explore/index.jsx
index 569b8612c..939550d83 100644
--- a/app/javascript/mastodon/features/explore/index.jsx
+++ b/app/javascript/mastodon/features/explore/index.jsx
@@ -88,7 +88,9 @@ class Explore extends React.PureComponent {
                 <Route path='/explore/tags' component={Tags} />
                 <Route path='/explore/links' component={Links} />
                 <Route path='/explore/suggestions' component={Suggestions} />
-                <Route exact path={['/explore', '/explore/posts', '/search']} component={Statuses} componentParams={{ multiColumn }} />
+                <Route exact path={['/explore', '/explore/posts', '/search']}>
+                  <Statuses multiColumn={multiColumn} />
+                </Route>
               </Switch>
 
               <Helmet>
diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx
index ee8a009ee..29659acc7 100644
--- a/app/javascript/mastodon/features/getting_started/index.jsx
+++ b/app/javascript/mastodon/features/getting_started/index.jsx
@@ -23,7 +23,7 @@ const messages = defineMessages({
   settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
   community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
   explore: { id: 'navigation_bar.explore', defaultMessage: 'Explore' },
-  direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },
+  direct: { id: 'navigation_bar.direct', defaultMessage: 'Private mentions' },
   bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
   preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
   follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx
index 5cbe4984c..0c74c4cc4 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.jsx
+++ b/app/javascript/mastodon/features/status/components/action_bar.jsx
@@ -13,7 +13,7 @@ const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
   redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },
   edit: { id: 'status.edit', defaultMessage: 'Edit' },
-  direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },
+  direct: { id: 'status.direct', defaultMessage: 'Privately mention @{name}' },
   mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
   reply: { id: 'status.reply', defaultMessage: 'Reply' },
   reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx
index 8a2194450..e4e572026 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.jsx
+++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx
@@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name';
 import StatusContent from '../../../components/status_content';
 import MediaGallery from '../../../components/media_gallery';
 import { Link } from 'react-router-dom';
-import { injectIntl, defineMessages, FormattedDate } from 'react-intl';
+import { injectIntl, defineMessages, FormattedDate, FormattedMessage } from 'react-intl';
 import Card from './card';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Video from '../../video';
@@ -262,7 +262,13 @@ class DetailedStatus extends ImmutablePureComponent {
 
     return (
       <div style={outerStyle}>
-        <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })}>
+        <div ref={this.setRef} className={classNames('detailed-status', { compact })}>
+          {status.get('visibility') === 'direct' && (
+            <div className='status__prepend'>
+              <div className='status__prepend-icon-wrapper'><Icon id='at' className='status__prepend-icon' fixedWidth /></div>
+              <FormattedMessage id='status.direct_indicator' defaultMessage='Private mention' />
+            </div>
+          )}
           <a href={`/@${status.getIn(['account', 'acct'])}`} onClick={this.handleAccountClick} className='detailed-status__display-name'>
             <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={46} /></div>
             <DisplayName account={status.get('account')} localDomain={this.props.domain} />
diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx
index 358ad14c4..1d7cb685f 100644
--- a/app/javascript/mastodon/features/status/index.jsx
+++ b/app/javascript/mastodon/features/status/index.jsx
@@ -630,7 +630,7 @@ class Status extends ImmutablePureComponent {
             {ancestors}
 
             <HotKeys handlers={handlers}>
-              <div className={classNames('focusable', 'detailed-status__wrapper')} 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}
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
index 90a3fcdf7..ee1a83cc6 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
@@ -18,7 +18,7 @@ const messages = defineMessages({
   explore: { id: 'explore.title', defaultMessage: 'Explore' },
   local: { id: 'tabs_bar.local_timeline', defaultMessage: 'Local' },
   federated: { id: 'tabs_bar.federated_timeline', defaultMessage: 'Federated' },
-  direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },
+  direct: { id: 'navigation_bar.direct', defaultMessage: 'Private mentions' },
   favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
   bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },
   lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index c04cae948..59dbdfa63 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json
index 9f66c8d13..e1414a8f5 100644
--- a/app/javascript/mastodon/locales/an.json
+++ b/app/javascript/mastodon/locales/an.json
@@ -558,6 +558,7 @@
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensache directo a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editau {date}",
   "status.edited_x_times": "Editau {count, plural, one {{count} vez} other {{count} veces}}",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index d7d3baf4e..4aec5838d 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -558,6 +558,7 @@
   "status.delete": "احذف",
   "status.detailed_status": "تفاصيل المحادثة",
   "status.direct": "رسالة خاصة إلى @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "تعديل",
   "status.edited": "عُدّل في {date}",
   "status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 2881911a6..9e356881a 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -558,6 +558,7 @@
   "status.delete": "Desaniciar",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Unviar un mensaxe direutu a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Editóse'l {date}",
   "status.edited_x_times": "Editóse {count, plural, one {{count} vegada} other {{count} vegaes}}",
diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json
index 05c328f6a..ce51ee507 100644
--- a/app/javascript/mastodon/locales/be.json
+++ b/app/javascript/mastodon/locales/be.json
@@ -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": "Ігнараваць",
@@ -558,6 +558,7 @@
   "status.delete": "Выдаліць",
   "status.detailed_status": "Дэтальны агляд размовы",
   "status.direct": "Асабістае паведамленне @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Рэдагаваць",
   "status.edited": "Адрэдагавана {date}",
   "status.edited_x_times": "Рэдагавана {count, plural, one {{count} раз} few {{count} разы} many {{count} разоў} other {{count} разу}}",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 248fd1ccb..6b6bd1011 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -558,6 +558,7 @@
   "status.delete": "Изтриване",
   "status.detailed_status": "Подробен изглед на разговора",
   "status.direct": "Директно съобщение до @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Редактиране",
   "status.edited": "Редактирано на {date}",
   "status.edited_x_times": "Редактирано {count, plural,one {{count} път} other {{count} пъти}}",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 7da6f78dc..8dbac2d58 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -558,6 +558,7 @@
   "status.delete": "মুছে ফেলতে",
   "status.detailed_status": "বিস্তারিত কথোপকথনের হিসেবে দেখতে",
   "status.direct": "@{name} কে সরাসরি লেখা পাঠাতে",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 5cc331af4..0884047ac 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -558,6 +558,7 @@
   "status.delete": "Dilemel",
   "status.detailed_status": "Gwel kaozeadenn munudek",
   "status.direct": "Kas ur c'hannad eeun da @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Kemmañ",
   "status.edited": "Aozet {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/bs.json b/app/javascript/mastodon/locales/bs.json
index d67f73c00..e4dda7c77 100644
--- a/app/javascript/mastodon/locales/bs.json
+++ b/app/javascript/mastodon/locales/bs.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index ebfafcbd3..a65a41111 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -558,6 +558,7 @@
   "status.delete": "Elimina",
   "status.detailed_status": "Vista detallada de la conversa",
   "status.direct": "Missatge directe a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edita",
   "status.edited": "Editat {date}",
   "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index 7623b5b99..095e73688 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -558,6 +558,7 @@
   "status.delete": "سڕینەوە",
   "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
   "status.direct": "پەیامی ڕاستەوخۆ @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "دەستکاری",
   "status.edited": "بەشداری {date}",
   "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 2ede2311e..dfa8bcd33 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -558,6 +558,7 @@
   "status.delete": "Toglie",
   "status.detailed_status": "Vista in ditagliu di a cunversazione",
   "status.direct": "Mandà un missaghju @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 97bc50c86..392312650 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -558,6 +558,7 @@
   "status.delete": "Smazat",
   "status.detailed_status": "Podrobné zobrazení konverzace",
   "status.direct": "Poslat @{name} přímou zprávu",
+  "status.direct_indicator": "Private mention",
   "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}}",
diff --git a/app/javascript/mastodon/locales/csb.json b/app/javascript/mastodon/locales/csb.json
index 03c5af685..b5078462f 100644
--- a/app/javascript/mastodon/locales/csb.json
+++ b/app/javascript/mastodon/locales/csb.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 21c0cd2be..ace8185d9 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -558,6 +558,7 @@
   "status.delete": "Dileu",
   "status.detailed_status": "Golwg manwl o'r sgwrs",
   "status.direct": "Neges breifat @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Golygu",
   "status.edited": "Golygwyd {date}",
   "status.edited_x_times": "Golygwyd {count, plural, one {waith} two {waith} other {{count} gwaith}}",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 6caa763f0..97fb90a8f 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -558,6 +558,7 @@
   "status.delete": "Slet",
   "status.detailed_status": "Detaljeret samtalevisning",
   "status.direct": "Direkte besked til @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Redigér",
   "status.edited": "Redigeret {date}",
   "status.edited_x_times": "Redigeret {count, plural, one {{count} gang} other {{count} gange}}",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index dfc478ae5..24cec0228 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -558,6 +558,7 @@
   "status.delete": "Beitrag löschen",
   "status.detailed_status": "Detaillierte Ansicht der Unterhaltung",
   "status.direct": "Direktnachricht an @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Beitrag bearbeiten",
   "status.edited": "Bearbeitet {date}",
   "status.edited_x_times": "{count, plural, one {{count} mal} other {{count} mal}} bearbeitet",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 536566945..d8f40aa51 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -560,7 +560,7 @@
         "id": "status.edit"
       },
       {
-        "defaultMessage": "Direct message @{name}",
+        "defaultMessage": "Privately mention @{name}",
         "id": "status.direct"
       },
       {
@@ -762,6 +762,10 @@
         "id": "status.reblogged_by"
       },
       {
+        "defaultMessage": "Private mention",
+        "id": "status.direct_indicator"
+      },
+      {
         "defaultMessage": "Replied to {name}",
         "id": "status.replied_to"
       }
@@ -1109,7 +1113,7 @@
         "id": "account.mention"
       },
       {
-        "defaultMessage": "Direct message @{name}",
+        "defaultMessage": "Privately mention @{name}",
         "id": "account.direct"
       },
       {
@@ -1627,7 +1631,7 @@
         "id": "privacy.private.long"
       },
       {
-        "defaultMessage": "Mentioned people only",
+        "defaultMessage": "Private mention",
         "id": "privacy.direct.short"
       },
       {
@@ -1925,7 +1929,7 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Direct messages",
+        "defaultMessage": "Private mentions",
         "id": "column.direct"
       },
       {
@@ -1937,7 +1941,7 @@
         "id": "compose_form.direct_message_warning_learn_more"
       },
       {
-        "defaultMessage": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+        "defaultMessage": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
         "id": "empty_column.direct"
       }
     ],
@@ -2432,7 +2436,7 @@
         "id": "navigation_bar.explore"
       },
       {
-        "defaultMessage": "Direct messages",
+        "defaultMessage": "Private mentions",
         "id": "navigation_bar.direct"
       },
       {
@@ -3550,7 +3554,7 @@
         "id": "status.edit"
       },
       {
-        "defaultMessage": "Direct message @{name}",
+        "defaultMessage": "Privately mention @{name}",
         "id": "status.direct"
       },
       {
@@ -4199,7 +4203,7 @@
         "id": "tabs_bar.federated_timeline"
       },
       {
-        "defaultMessage": "Direct messages",
+        "defaultMessage": "Private mentions",
         "id": "navigation_bar.direct"
       },
       {
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 0813a9857..e972494ad 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -558,6 +558,7 @@
   "status.delete": "Διαγραφή",
   "status.detailed_status": "Προβολή λεπτομερειών συζήτησης",
   "status.direct": "Προσωπικό μήνυμα προς @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Επεξεργασία",
   "status.edited": "Επεξεργάστηκε στις {date}",
   "status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 974c6dd84..359cc0388 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 3a515d4d7..a83c0f37d 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -20,7 +20,7 @@
   "account.blocked": "Blocked",
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Withdraw follow request",
-  "account.direct": "Direct message @{name}",
+  "account.direct": "Privately mention @{name}",
   "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain blocked",
   "account.edit_profile": "Edit profile",
@@ -102,7 +102,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.direct": "Direct messages",
+  "column.direct": "Private mentions",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -220,7 +220,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no blocked domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
@@ -318,7 +318,7 @@
   "keyboard_shortcuts.column": "Focus column",
   "keyboard_shortcuts.compose": "Focus compose textarea",
   "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.direct": "to open private mentions column",
   "keyboard_shortcuts.down": "Move down in the list",
   "keyboard_shortcuts.enter": "Open post",
   "keyboard_shortcuts.favourite": "Favourite post",
@@ -380,7 +380,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new post",
-  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.direct": "Private mentions",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Blocked domains",
   "navigation_bar.edit_profile": "Edit profile",
@@ -562,7 +562,8 @@
   "status.copy": "Copy link to post",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
+  "status.direct": "Privately mention @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 93b668d35..29ecea294 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -558,6 +558,7 @@
   "status.delete": "Forigi",
   "status.detailed_status": "Detala konversacia vido",
   "status.direct": "Rekte mesaĝi @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Redakti",
   "status.edited": "Redaktita {date}",
   "status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 93238efbc..f9d6b21d9 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -558,6 +558,7 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo para @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado {date}",
   "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index 56e891611..d10dfa9b3 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -558,6 +558,7 @@
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Enviar mensaje a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado {date}",
   "status.edited_x_times": "Editado {count, plural, one {{count} time} other {{count} veces}}",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 61e831526..ffdecda88 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -558,6 +558,7 @@
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado {date}",
   "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 9b8c83563..e8874a556 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -491,7 +491,7 @@
   "report.category.title_status": "postitusega",
   "report.close": "Valmis",
   "report.comment.title": "Kas arvad, et on veel midagi, mida me peaks teadma?",
-  "report.forward": "Edasta kasutajale {target}",
+  "report.forward": "Edasta ka {target} domeeni",
   "report.forward_hint": "See kasutaja on teisest serverist. Kas saadan anonümiseeritud koopia sellest teatest sinna ka?",
   "report.mute": "Vaigista",
   "report.mute_explanation": "Sa ei näe tema postitusi. Ta võib ikka sind jälgida ja su postitusi näha. Ta ei saa teada, et ta on vaigistatud.",
@@ -558,6 +558,7 @@
   "status.delete": "Kustuta",
   "status.detailed_status": "Detailne vestluskuva",
   "status.direct": "Saada otsesõnum @{name}'ile",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Muuda",
   "status.edited": "{date} muudetud",
   "status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index e5f2116bc..bf3f3e0e3 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -558,6 +558,7 @@
   "status.delete": "Ezabatu",
   "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
   "status.direct": "Mezu zuzena @{name}(r)i",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editatu",
   "status.edited": "Editatua {date}",
   "status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index acb7525b2..a3eca3103 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -558,6 +558,7 @@
   "status.delete": "حذف",
   "status.detailed_status": "نمایش کامل گفتگو",
   "status.direct": "پیام مستقیم به ‎@{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "ویرایش",
   "status.edited": "ویرایش شده در {date}",
   "status.edited_x_times": "{count, plural, one {{count} مرتبه} other {{count} مرتبه}} ویرایش شد",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 8cff515bd..3d9506513 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -1,6 +1,6 @@
 {
   "about.blocks": "Moderoidut palvelimet",
-  "about.contact": "Yhteystiedot:",
+  "about.contact": "Ota yhteyttä:",
   "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.",
   "about.domain_blocks.no_reason_available": "Syytä ei ole ilmoitettu",
   "about.domain_blocks.preamble": "Yleisesti Mastodonin avulla voidaan tarkastella minkä tahansa muun fediverse-palvelinten sisältöä ja vuorovaikuttaa eri palvelinten käyttäjien kanssa. Nämä ovat tälle palvelimelle määritetyt poikkeukset.",
@@ -9,7 +9,7 @@
   "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.",
   "about.domain_blocks.suspended.title": "Jäädytetty",
   "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.",
-  "about.powered_by": "Hajautettu sosiaalinen media, tarjoaa {mastodon}",
+  "about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}",
   "about.rules": "Palvelimen säännöt",
   "account.account_note_header": "Muistiinpano",
   "account.add_or_remove_from_list": "Lisää tai poista listoilta",
@@ -21,8 +21,8 @@
   "account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
   "account.cancel_follow_request": "Peruuta seurantapyyntö",
   "account.direct": "Yksityisviesti käyttäjälle @{name}",
-  "account.disable_notifications": "Lopeta @{name}:n julkaisuista ilmoittaminen",
-  "account.domain_blocked": "Verkko-osoite estetty",
+  "account.disable_notifications": "Lopeta ilmoittamasta minulle, kun @{name} julkaisee",
+  "account.domain_blocked": "Palvelu estetty",
   "account.edit_profile": "Muokkaa profiilia",
   "account.enable_notifications": "Ilmoita kun käyttäjä @{name} julkaisee viestin",
   "account.endorse": "Suosittele profiilissasi",
@@ -50,7 +50,7 @@
   "account.mute_notifications": "Mykistä käyttäjän @{name} ilmoitukset",
   "account.muted": "Mykistetty",
   "account.open_original_page": "Avaa alkuperäinen sivu",
-  "account.posts": "Viestit",
+  "account.posts": "Julkaisut",
   "account.posts_with_replies": "Viestit ja vastaukset",
   "account.report": "Ilmoita käyttäjästä @{name}",
   "account.requested": "Odottaa hyväksyntää. Peruuta seuraamispyyntö klikkaamalla",
@@ -58,7 +58,7 @@
   "account.share": "Jaa käyttäjän @{name} profiili",
   "account.show_reblogs": "Näytä tehostukset käyttäjältä @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} viesti} other {{counter} viestiä}}",
-  "account.unblock": "Salli @{name}",
+  "account.unblock": "Poista esto: @{name}",
   "account.unblock_domain": "Salli palvelu {domain}",
   "account.unblock_short": "Poista esto",
   "account.unendorse": "Poista suosittelu profiilistasi",
@@ -104,7 +104,7 @@
   "column.community": "Paikallinen aikajana",
   "column.direct": "Yksityisviestit",
   "column.directory": "Selaa profiileja",
-  "column.domain_blocks": "Estetytr verkkotunnukset",
+  "column.domain_blocks": "Estetyt palvelut",
   "column.favourites": "Suosikit",
   "column.follow_requests": "Seuraamispyynnöt",
   "column.home": "Koti",
@@ -149,7 +149,7 @@
   "compose_form.spoiler.unmarked": "Lisää sisältövaroitus",
   "compose_form.spoiler_placeholder": "Kirjoita varoituksesi tähän",
   "confirmation_modal.cancel": "Peruuta",
-  "confirmations.block.block_and_report": "Estä ja raportoi",
+  "confirmations.block.block_and_report": "Estä ja ilmianna",
   "confirmations.block.confirm": "Estä",
   "confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?",
   "confirmations.cancel_follow_request.confirm": "Peruuta pyyntö",
@@ -163,7 +163,7 @@
   "confirmations.domain_block.confirm": "Estä koko palvelu",
   "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": "Tässä tilanteessa muokkaus korvaa tällä hetkellä työstämäsi viestin. Haluatko varmasti jatkaa?",
+  "confirmations.edit.message": "Muokkaaminen nyt korvaa viestin, jota paraikaa työstät. Haluatko varmasti jatkaa?",
   "confirmations.logout.confirm": "Kirjaudu ulos",
   "confirmations.logout.message": "Haluatko varmasti kirjautua ulos?",
   "confirmations.mute.confirm": "Mykistä",
@@ -210,15 +210,15 @@
   "emoji_button.search_results": "Hakutulokset",
   "emoji_button.symbols": "Symbolit",
   "emoji_button.travel": "Matkailu ja paikat",
-  "empty_column.account_suspended": "Tilin käyttäminen jäädytetty",
+  "empty_column.account_suspended": "Tili jäädytetty",
   "empty_column.account_timeline": "Ei viestejä täällä.",
   "empty_column.account_unavailable": "Profiilia ei löydy",
-  "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.",
+  "empty_column.blocks": "Et ole estänyt käyttäjiä.",
   "empty_column.bookmarked_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
   "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!",
   "empty_column.direct": "Sinulla ei ole vielä yksityisviestejä. Kun lähetät tai vastaanotat sellaisen, se näkyy tässä.",
   "empty_column.domain_blocks": "Palveluita ei ole vielä estetty.",
-  "empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!",
+  "empty_column.explore_statuses": "Mikään ei trendaa nyt. Tarkista myöhemmin uudelleen!",
   "empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
   "empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä viestiä suosikkeihinsa. Kun joku tekee niin, näkyy kyseinen henkilö tässä.",
   "empty_column.follow_recommendations": "Näyttää siltä, että sinulle ei voi luoda ehdotuksia. Voit yrittää etsiä ihmisiä, jotka saatat tuntea tai tutkia trendaavia aihetunnisteita.",
@@ -230,8 +230,8 @@
   "empty_column.list": "Tässä luettelossa ei ole vielä mitään. Kun tämän luettelon jäsenet julkaisevat uusia viestejä, ne näkyvät täällä.",
   "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.",
   "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
-  "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun muut ihmiset ovat vuorovaikutuksessa kanssasi, näet sen täällä.",
-  "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti tai manuaalisesti seuraa muiden palvelimien käyttäjiä niin saat sisältöä",
+  "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.",
+  "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä",
   "error.unexpected_crash.explanation": "Sivua ei voi näyttää oikein, johtuen bugista tai ongelmasta selaimen yhteensopivuudessa.",
   "error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.",
   "error.unexpected_crash.next_steps": "Kokeile sivun päivitystä. Jos se ei auta, voi Mastodonin käyttö silti olla mahdollista eri selaimella tai natiivilla sovelluksella.",
@@ -242,7 +242,7 @@
   "explore.suggested_follows": "Sinulle",
   "explore.title": "Selaa",
   "explore.trending_links": "Uutiset",
-  "explore.trending_statuses": "Viestit",
+  "explore.trending_statuses": "Julkaisut",
   "explore.trending_tags": "Aihetunnisteet",
   "filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske asiayhteyttä, jossa olet käyttänyt tätä viestiä. Jos haluat, että viesti suodatetaan myös tässä yhteydessä, sinun on muokattava suodatinta.",
   "filter_modal.added.context_mismatch_title": "Asiayhteys ei täsmää!",
@@ -265,7 +265,7 @@
   "follow_recommendations.lead": "Seuraamiesi julkaisut näkyvät aikajärjestyksessä kotisyötteessä. Älä pelkää seurata vahingossa, voit lopettaa seuraamisen yhtä helposti!",
   "follow_request.authorize": "Valtuuta",
   "follow_request.reject": "Hylkää",
-  "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelun {domain} ylläpito on arvioinut, että voi olla halukas tarkistamaan nämä seurauspyynnöt erikseen.",
+  "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, on palvelun {domain} ylläpito arvioinut, että saatat olla halukas tarkistamaan nämä seurauspyynnöt erikseen.",
   "followed_tags": "Seuratut aihetunnisteet",
   "footer.about": "Tietoja",
   "footer.directory": "Profiilihakemisto",
@@ -316,7 +316,7 @@
   "keyboard_shortcuts.description": "Kuvaus",
   "keyboard_shortcuts.direct": "avataksesi yksityisviestisarakkeen",
   "keyboard_shortcuts.down": "Siirry listassa alaspäin",
-  "keyboard_shortcuts.enter": "Avaa viesti",
+  "keyboard_shortcuts.enter": "Avaa julkaisu",
   "keyboard_shortcuts.favourite": "Lisää suosikkeihin",
   "keyboard_shortcuts.favourites": "Avaa lista suosikeista",
   "keyboard_shortcuts.federated": "Avaa yleinen aikajana",
@@ -328,7 +328,7 @@
   "keyboard_shortcuts.mention": "Mainitse julkaisija",
   "keyboard_shortcuts.muted": "Avaa lista mykistetyistä käyttäjistä",
   "keyboard_shortcuts.my_profile": "Avaa profiilisi",
-  "keyboard_shortcuts.notifications": "Avaa ilmoitukset-sarake",
+  "keyboard_shortcuts.notifications": "Avaa ilmoitukset-valikko",
   "keyboard_shortcuts.open_media": "Avaa media",
   "keyboard_shortcuts.pinned": "Avaa lista kiinnitetyistä viesteistä",
   "keyboard_shortcuts.profile": "Avaa kirjoittajan profiili",
@@ -336,10 +336,10 @@
   "keyboard_shortcuts.requests": "Avaa lista seurauspyynnöistä",
   "keyboard_shortcuts.search": "siirry hakukenttään",
   "keyboard_shortcuts.spoilers": "Näytä/piilota sisältövaroituskenttä",
-  "keyboard_shortcuts.start": "avaa \"Aloitus\"-sarake",
+  "keyboard_shortcuts.start": "avaa \"Aloitus\"",
   "keyboard_shortcuts.toggle_hidden": "näytä/piilota sisältövaroituksella merkitty teksti",
   "keyboard_shortcuts.toggle_sensitivity": "näytä/piilota media",
-  "keyboard_shortcuts.toot": "Aloita uusi viesti",
+  "keyboard_shortcuts.toot": "Luo uusi julkaisu",
   "keyboard_shortcuts.unfocus": "Poistu teksti-/hakukentästä",
   "keyboard_shortcuts.up": "Siirry listassa ylöspäin",
   "lightbox.close": "Sulje",
@@ -375,7 +375,7 @@
   "navigation_bar.blocks": "Estetyt käyttäjät",
   "navigation_bar.bookmarks": "Kirjanmerkit",
   "navigation_bar.community_timeline": "Paikallinen aikajana",
-  "navigation_bar.compose": "Luo uusi viesti",
+  "navigation_bar.compose": "Julkaise",
   "navigation_bar.direct": "Yksityisviestit",
   "navigation_bar.discover": "Löydä uutta",
   "navigation_bar.domain_blocks": "Estetyt palvelut",
@@ -395,10 +395,10 @@
   "navigation_bar.public_timeline": "Yleinen aikajana",
   "navigation_bar.search": "Haku",
   "navigation_bar.security": "Turvallisuus",
-  "not_signed_in_indicator.not_signed_in": "Sinun täytyy kirjautua sisään päästäksesi käsiksi tähän resurssiin.",
-  "notification.admin.report": "{name} ilmoitti {target}",
+  "not_signed_in_indicator.not_signed_in": "Sinun tulee kirjautua sisään nähdäksesi tämän.",
+  "notification.admin.report": "{name} teki ilmoituksen käytäjästä {target}",
   "notification.admin.sign_up": "{name} rekisteröityi",
-  "notification.favourite": "{name} tykkäsi viestistäsi",
+  "notification.favourite": "{name} tykkäsi julkaisustasi",
   "notification.follow": "{name} seurasi sinua",
   "notification.follow_request": "{name} haluaa seurata sinua",
   "notification.mention": "{name} mainitsi sinut",
@@ -409,7 +409,7 @@
   "notification.update": "{name} muokkasi viestiä",
   "notifications.clear": "Tyhjennä ilmoitukset",
   "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
-  "notifications.column_settings.admin.report": "Uudet raportit:",
+  "notifications.column_settings.admin.report": "Uudet ilmoitukset:",
   "notifications.column_settings.admin.sign_up": "Uudet kirjautumiset:",
   "notifications.column_settings.alert": "Työpöytäilmoitukset",
   "notifications.column_settings.favourite": "Tykkäykset:",
@@ -424,7 +424,7 @@
   "notifications.column_settings.reblog": "Tehostukset:",
   "notifications.column_settings.show": "Näytä sarakkeessa",
   "notifications.column_settings.sound": "Äänimerkki",
-  "notifications.column_settings.status": "Uudet viestit:",
+  "notifications.column_settings.status": "Uudet julkaisut:",
   "notifications.column_settings.unread_notifications.category": "Lukemattomat ilmoitukset",
   "notifications.column_settings.unread_notifications.highlight": "Korosta lukemattomat ilmoitukset",
   "notifications.column_settings.update": "Muokkaukset:",
@@ -474,32 +474,32 @@
   "relative_time.full.just_now": "juuri nyt",
   "relative_time.full.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} sitten",
   "relative_time.full.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} sitten",
-  "relative_time.hours": "{number} tuntia",
+  "relative_time.hours": "{number} t",
   "relative_time.just_now": "nyt",
   "relative_time.minutes": "{number} min",
-  "relative_time.seconds": "{number} sek",
+  "relative_time.seconds": "{number} s",
   "relative_time.today": "tänään",
   "reply_indicator.cancel": "Peruuta",
   "report.block": "Estä",
-  "report.block_explanation": "Et näe heidän viestejään, eivätkä he voi nähdä viestejäsi tai seurata sinua. He näkevät, että heidät on estetty.",
-  "report.categories.other": "Muu",
+  "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkevät, että olet estänyt hänet.",
+  "report.categories.other": "muu",
   "report.categories.spam": "Roskaposti",
   "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen sääntöä",
-  "report.category.subtitle": "Valitse paras vastaavuus",
-  "report.category.title": "Kerro meille miksi tämä {type} pitää raportoida",
+  "report.category.subtitle": "Valitse se, mikä sopii parhaiten",
+  "report.category.title": "Kerro meille, miksi ilmiannat tämän: {type} ",
   "report.category.title_account": "profiili",
-  "report.category.title_status": "viesti",
+  "report.category.title_status": "julkaisu",
   "report.close": "Valmis",
-  "report.comment.title": "Pitäisikö meidän tietää jotain muuta?",
+  "report.comment.title": "Olisiko jotain muuta, mitä meidän pitäisi tietää?",
   "report.forward": "Välitä kohteeseen {target}",
   "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?",
   "report.mute": "Mykistä",
-  "report.mute_explanation": "Et näe heidän viestejään. He voivat silti seurata sinua ja nähdä viestisi eivätkä tiedä, että heidät on mykistetty.",
+  "report.mute_explanation": "Et näe hänen viestejään. Hän voi silti seurata sinua ja nähdä viestisi. Hän ei tiedä, että on mykistetty.",
   "report.next": "Seuraava",
   "report.placeholder": "Lisäkommentit",
   "report.reasons.dislike": "En pidä siitä",
   "report.reasons.dislike_description": "Et halua nähdä sitä",
-  "report.reasons.other": "Se on jotain muuta",
+  "report.reasons.other": "Jotain muuta",
   "report.reasons.other_description": "Ongelma ei sovi muihin kategorioihin",
   "report.reasons.spam": "Se on roskapostia",
   "report.reasons.spam_description": "Haitalliset linkit, väärennetyt sitoutumiset tai toistuvat vastaukset",
@@ -507,27 +507,27 @@
   "report.reasons.violation_description": "Tiedät, että se rikkoo tiettyjä sääntöjä",
   "report.rules.subtitle": "Valitse kaikki jotka sopivat",
   "report.rules.title": "Mitä sääntöjä rikotaan?",
-  "report.statuses.subtitle": "Valitse kaikki jotka sopivat",
+  "report.statuses.subtitle": "Valitse kaikki sopivat",
   "report.statuses.title": "Onko olemassa yhtään viestiä, jotka tukevat tätä raporttia?",
   "report.submit": "Lähetä",
   "report.target": "Raportoidaan {target}",
   "report.thanks.take_action": "Tässä on vaihtoehtosi hallita näkemääsi Mastodonissa:",
   "report.thanks.take_action_actionable": "Sillä välin kun tarkistamme tätä, voit ryhtyä toimenpiteisiin käyttäjää @{name} vastaan:",
   "report.thanks.title": "Etkö halua nähdä tätä?",
-  "report.thanks.title_actionable": "Kiitos raportista, tutkimme asiaa.",
+  "report.thanks.title_actionable": "Kiitos ilmoituksesta, tarkistamme asian.",
   "report.unfollow": "Lopeta käyttäjän @{name} seuraaminen",
   "report.unfollow_explanation": "Seuraat tätä tiliä. Jotta et enää näe tilin viestejä, lopeta tilin seuraaminen.",
   "report_notification.attached_statuses": "{count, plural, one {{count} viesti} other {{count} viestiä}} liitteenä",
   "report_notification.categories.other": "Muu",
   "report_notification.categories.spam": "Roskaposti",
   "report_notification.categories.violation": "Sääntöjen rikkominen",
-  "report_notification.open": "Avaa raportti",
+  "report_notification.open": "Avaa ilmoitus",
   "search.placeholder": "Hae",
   "search.search_or_paste": "Etsi tai kirjoita URL-osoite",
   "search_popout.search_format": "Tarkennettu haku",
   "search_popout.tips.full_text": "Tekstihaku listaa tilapäivitykset, jotka olet kirjoittanut, lisännyt suosikkeihisi, tehostanut tai joissa sinut mainitaan, sekä tekstin sisältävät käyttäjänimet, nimimerkit ja aihetunnisteet.",
   "search_popout.tips.hashtag": "aihetunnisteet",
-  "search_popout.tips.status": "viesti",
+  "search_popout.tips.status": "julkaisu",
   "search_popout.tips.text": "Tekstihaku listaa hakua vastaavat nimimerkit, käyttäjänimet ja aihetunnisteet",
   "search_popout.tips.user": "käyttäjä",
   "search_results.accounts": "Ihmiset",
@@ -558,6 +558,7 @@
   "status.delete": "Poista",
   "status.detailed_status": "Yksityiskohtainen keskustelunäkymä",
   "status.direct": "Yksityisviesti käyttäjälle @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Muokkaa",
   "status.edited": "Muokattu {date}",
   "status.edited_x_times": "Muokattu {count, plural, one {{count} kerran} other {{count} kertaa}}",
@@ -576,7 +577,7 @@
   "status.mute_conversation": "Mykistä keskustelu",
   "status.open": "Laajenna julkaisu",
   "status.pin": "Kiinnitä profiiliin",
-  "status.pinned": "Kiinnitetty viesti",
+  "status.pinned": "Kiinnitetty julkaisu",
   "status.read_more": "Näytä enemmän",
   "status.reblog": "Tehosta",
   "status.reblog_private": "Tehosta alkuperäiselle yleisölle",
@@ -597,7 +598,7 @@
   "status.show_more_all": "Näytä lisää kaikista",
   "status.show_original": "Näytä alkuperäinen",
   "status.translate": "Käännä",
-  "status.translated_from_with": "Käännetty kielestä {lang} käyttäen palvelua {provider}",
+  "status.translated_from_with": "Käännetty kielestä {lang} käyttäen {provider}",
   "status.uncached_media_warning": "Ei saatavilla",
   "status.unmute_conversation": "Poista keskustelun mykistys",
   "status.unpin": "Irrota profiilista",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index db2247c4b..778b0e028 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -558,6 +558,7 @@
   "status.delete": "Strika",
   "status.detailed_status": "Útgreinað samrøðusýni",
   "status.direct": "Beinleiðis boð @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Rætta",
   "status.edited": "Rættað {date}",
   "status.edited_x_times": "Rættað {count, plural, one {{count} ferð} other {{count} ferð}}",
diff --git a/app/javascript/mastodon/locales/fr-QC.json b/app/javascript/mastodon/locales/fr-QC.json
index fe7055d57..e14b816bb 100644
--- a/app/javascript/mastodon/locales/fr-QC.json
+++ b/app/javascript/mastodon/locales/fr-QC.json
@@ -558,6 +558,7 @@
   "status.delete": "Supprimer",
   "status.detailed_status": "Vue détaillée de la conversation",
   "status.direct": "Envoyer un message direct à @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Modifier",
   "status.edited": "Modifiée le {date}",
   "status.edited_x_times": "Modifiée {count, plural, one {{count} fois} other {{count} fois}}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 2c38ad496..8f2a886fb 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -558,6 +558,7 @@
   "status.delete": "Supprimer",
   "status.detailed_status": "Vue détaillée de la conversation",
   "status.direct": "Envoyer un message direct à @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Éditer",
   "status.edited": "Édité le {date}",
   "status.edited_x_times": "Edité {count, plural, one {{count} fois} other {{count} fois}}",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
index 4ac165471..f806494b7 100644
--- a/app/javascript/mastodon/locales/fy.json
+++ b/app/javascript/mastodon/locales/fy.json
@@ -558,6 +558,7 @@
   "status.delete": "Fuortsmite",
   "status.detailed_status": "Detaillearre petearoersjoch",
   "status.direct": "@{name} in direkt berjocht stjoere",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Bewurkje",
   "status.edited": "Bewurke op {date}",
   "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 12769ba13..8fc21a5a2 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -558,6 +558,7 @@
   "status.delete": "Scrios",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Seol teachtaireacht dhíreach chuig @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Cuir in eagar",
   "status.edited": "Curtha in eagar in {date}",
   "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index f5eb5c140..e4ae57952 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -558,6 +558,7 @@
   "status.delete": "Sguab às",
   "status.detailed_status": "Mion-shealladh a’ chòmhraidh",
   "status.direct": "Cuir teachdaireachd dhìreach gu @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Deasaich",
   "status.edited": "Air a dheasachadh {date}",
   "status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index dc5bd31d6..b1ce477a6 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -558,6 +558,7 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
   "status.direct": "Mensaxe directa a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado {date}",
   "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index f5e6230b8..a827e4378 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -153,7 +153,7 @@
   "confirmations.block.confirm": "לחסום",
   "confirmations.block.message": "האם את/ה בטוח/ה שברצונך למחוק את \"{name}\"?",
   "confirmations.cancel_follow_request.confirm": "ויתור על בקשה",
-  "confirmations.cancel_follow_request.message": "האם באמת לוותר על בקשת המעקב אחרי {name}?",
+  "confirmations.cancel_follow_request.message": "לבטל את בקשת המעקב אחרי {name}?",
   "confirmations.delete.confirm": "למחוק",
   "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?",
   "confirmations.delete_list.confirm": "למחוק",
@@ -163,7 +163,7 @@
   "confirmations.domain_block.confirm": "חסמו לגמרי את שם המתחם (דומיין)",
   "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו",
   "confirmations.edit.confirm": "עריכה",
-  "confirmations.edit.message": "עריכת תגובה קודמת תדרוס את ההודעה שכבר התחלת לכתוב. האם את.ה בטוח.ה שברצונך להמשיך?",
+  "confirmations.edit.message": "עריכה תדרוס את ההודעה שכבר התחלת לכתוב. האם להמשיך?",
   "confirmations.logout.confirm": "התנתקות",
   "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
   "confirmations.mute.confirm": "להשתיק",
@@ -172,7 +172,7 @@
   "confirmations.redraft.confirm": "מחיקה ועריכה מחדש",
   "confirmations.redraft.message": "בטוחה שאת רוצה למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות להודעה המקורית ישארו יתומות.",
   "confirmations.reply.confirm": "תגובה",
-  "confirmations.reply.message": "תגובה עכשיו תדרוס את ההודעה שכבר התחלתים לכתוב. האם אתם בטוחים שברצונכם להמשיך?",
+  "confirmations.reply.message": "תגובה עכשיו תמחק את ההודעה שכבר התחלת לכתוב. להמשיך?",
   "confirmations.unfollow.confirm": "הפסקת מעקב",
   "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
   "conversation.delete": "מחיקת שיחה",
@@ -558,6 +558,7 @@
   "status.delete": "מחיקה",
   "status.detailed_status": "תצוגת שיחה מפורטת",
   "status.direct": "הודעה ישירה ל@{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "עריכה",
   "status.edited": "נערך ב{date}",
   "status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 8b0569860..8e311c945 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 2ee74d460..196d43e60 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -558,6 +558,7 @@
   "status.delete": "Obriši",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Uredi",
   "status.edited": "Uređeno {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 4447aa2d1..c69b58e43 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -34,7 +34,7 @@
   "account.followers.empty": "Ezt a felhasználót még senki sem követi.",
   "account.followers_counter": "{count, plural, one {{counter} Követő} other {{counter} Követő}}",
   "account.following": "Követve",
-  "account.following_counter": "{count, plural, one {{counter} Követett} other {{counter} Követett}}",
+  "account.following_counter": "{count, plural, one {{counter} követett} other {{counter} követett}}",
   "account.follows.empty": "Ez a felhasználó még senkit sem követ.",
   "account.follows_you": "Követ téged",
   "account.go_to_profile": "Ugrás a profilhoz",
@@ -53,8 +53,8 @@
   "account.posts": "Bejegyzések",
   "account.posts_with_replies": "Bejegyzések és válaszok",
   "account.report": "@{name} jelentése",
-  "account.requested": "Jóváhagysára vár. Kattints a követési kérés visszavonásához",
-  "account.requested_follow": "{name} kérte, hogy követhessen téged",
+  "account.requested": "Jóváhagysára vár. Kattintás a követési kérés törléséhez",
+  "account.requested_follow": "{name} kérte, hogy követhessen",
   "account.share": "@{name} profiljának megosztása",
   "account.show_reblogs": "@{name} megtolásainak mutatása",
   "account.statuses_counter": "{count, plural, one {{counter} Bejegyzés} other {{counter} Bejegyzés}}",
@@ -66,7 +66,7 @@
   "account.unmute": "@{name} némításának feloldása",
   "account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
   "account.unmute_short": "Némitás feloldása",
-  "account_note.placeholder": "Kattints jegyzet hozzáadásához",
+  "account_note.placeholder": "Kattintás jegyzet hozzáadásához",
   "admin.dashboard.daily_retention": "Napi regisztráció utáni felhasználómegtartási arány",
   "admin.dashboard.monthly_retention": "Havi regisztráció utáni felhasználómegtartási arány",
   "admin.dashboard.retention.average": "Átlag",
@@ -96,7 +96,7 @@
   "closed_registrations.other_server_instructions": "Mivel a Mastdon decentralizált, létrehozhatsz egy fiókot egy másik kiszolgálón és mégis kapcsolódhatsz ehhez.",
   "closed_registrations_modal.description": "Fiók létrehozása a {domain} kiszolgálón jelenleg nem lehetséges, de jó, ha tudod, hogy nem szükséges fiókkal rendelkezni pont a {domain} kiszolgálón, hogy használhasd a Mastodont.",
   "closed_registrations_modal.find_another_server": "Másik kiszolgáló keresése",
-  "closed_registrations_modal.preamble": "A Mastodon decentralizált, így teljesen mindegy, hol hozod létre a fiókodat, követhetsz és kapcsolódhatsz bárkivel ezen a kiszolgálón is. Saját magad is üzemeltethetsz kiszolgálót!",
+  "closed_registrations_modal.preamble": "A Mastodon nem központosított, így teljesen mindegy, hol történik a fiók létrehozása, követhető bárki és kapcsolatba lehet lépni bárkivel ezen a kiszolgálón is. Saját magunk is üzemeltethetünk kiszolgálót!",
   "closed_registrations_modal.title": "Regisztráció a Mastodonra",
   "column.about": "Névjegy",
   "column.blocks": "Letiltott felhasználók",
@@ -131,7 +131,7 @@
   "compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel nem nyilvános. Csak a nyilvános bejegyzések kereshetők hashtaggel.",
   "compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.",
   "compose_form.lock_disclaimer.lock": "lezárva",
-  "compose_form.placeholder": "Mi jár a fejedben?",
+  "compose_form.placeholder": "Mire gondolunk éppen?",
   "compose_form.poll.add_option": "Lehetőség hozzáadása",
   "compose_form.poll.duration": "Szavazás időtartama",
   "compose_form.poll.option_placeholder": "{number}. lehetőség",
@@ -145,25 +145,25 @@
   "compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}",
   "compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}",
-  "compose_form.spoiler.marked": "Tartalmi figyelmeztetés törlése",
+  "compose_form.spoiler.marked": "Tartalmi figyelmeztetés eltávolítása",
   "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása",
-  "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést",
-  "confirmation_modal.cancel": "Mégse",
+  "compose_form.spoiler_placeholder": "A figyelmeztetés beírása ide",
+  "confirmation_modal.cancel": "Mégsem",
   "confirmations.block.block_and_report": "Letiltás és jelentés",
   "confirmations.block.confirm": "Letiltás",
   "confirmations.block.message": "Biztos, hogy letiltod: {name}?",
   "confirmations.cancel_follow_request.confirm": "Kérés visszavonása",
-  "confirmations.cancel_follow_request.message": "Biztos, hogy visszavonod a(z) {name} felhasználóra vonatkozó követési kérésedet?",
+  "confirmations.cancel_follow_request.message": "Biztosan visszavonásra kerüljön {name} felhasználóra vonatkozó követési kérés?",
   "confirmations.delete.confirm": "Törlés",
   "confirmations.delete.message": "Biztos, hogy törölni szeretnéd ezt a bejegyzést?",
   "confirmations.delete_list.confirm": "Törlés",
   "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?",
   "confirmations.discard_edit_media.confirm": "Elvetés",
-  "confirmations.discard_edit_media.message": "Elmentetlen változtatásaid vannak a média leírásában vagy előnézetében. Eldobjuk őket?",
-  "confirmations.domain_block.confirm": "Teljes domain elrejtése",
+  "confirmations.discard_edit_media.message": "Elmentetlen változtatások vannak a média leírásában vagy előnézetében. Elvetésre kerüljenek?",
+  "confirmations.domain_block.confirm": "Teljes tartomány tiltása",
   "confirmations.domain_block.message": "Biztos, hogy le szeretnéd tiltani a teljes {domain} domaint? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő, és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se az idővonalakon, se az értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.",
   "confirmations.edit.confirm": "Szerkesztés",
-  "confirmations.edit.message": "Ha most szerkeszted, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?",
+  "confirmations.edit.message": "A szerkesztés felülírja a most összeállítás alatt álló üzenetet. Folytatás?",
   "confirmations.logout.confirm": "Kijelentkezés",
   "confirmations.logout.message": "Biztos, hogy kijelentkezel?",
   "confirmations.mute.confirm": "Némítás",
@@ -178,21 +178,21 @@
   "conversation.delete": "Beszélgetés törlése",
   "conversation.mark_as_read": "Megjelölés olvasottként",
   "conversation.open": "Beszélgetés megtekintése",
-  "conversation.with": "{names}-el/al",
+  "conversation.with": "{names} is",
   "copypaste.copied": "Másolva",
   "copypaste.copy": "Másolás",
   "directory.federated": "Az ismert fediverzumból",
-  "directory.local": "Csak innen: {domain}",
+  "directory.local": "Csak {domain} tartományból",
   "directory.new_arrivals": "Új csatlakozók",
   "directory.recently_active": "Nemrég aktív",
   "disabled_account_banner.account_settings": "Fiókbeállítások",
-  "disabled_account_banner.text": "A(z) {disabledAccount} fiókod jelenleg le van tiltva.",
-  "dismissable_banner.community_timeline": "Ezek a legfrissebb nyilvános bejegyzések, amelyeket a(z) {domain} kiszolgáló fiókjait használó emberek tették közzé.",
-  "dismissable_banner.dismiss": "Eltüntetés",
-  "dismissable_banner.explore_links": "Jelenleg ezekről a hírekről beszélgetnek az ezen és a decentralizált hálózat többi kiszolgálóján lévő emberek.",
-  "dismissable_banner.explore_statuses": "Jelenleg ezek a bejegyzések hódítanak teret ezen és a decentralizált hálózat egyéb kiszolgálóin.",
-  "dismissable_banner.explore_tags": "Jelenleg ezek a hashtagek hódítanak teret ezen és a decentralizált hálózat többi kiszolgálóján lévő emberek körében.",
-  "dismissable_banner.public_timeline": "Ezek a legfrissebb bejegyzések azoktól, akik a decentralizált hálózat más kiszolgálóin vannak, és ez a kiszolgáló tud róluk.",
+  "disabled_account_banner.text": "{disabledAccount} fiók jelenleg letilzásra került.",
+  "dismissable_banner.community_timeline": "Ezek a legfrissebb nyilvános bejegyzések, amelyeket {domain} tartományban levő kiszolgáló fiókjait használó emberek tettek közzé.",
+  "dismissable_banner.dismiss": "Elvetés",
+  "dismissable_banner.explore_links": "Jelenleg ezekről a hírekről beszélgetnek az ezen és a központosítás nélküli hálózat többi kiszolgálóján lévő emberek.",
+  "dismissable_banner.explore_statuses": "Jelenleg ezek a bejegyzések hódítanak teret ezen és a központosítás nélküli hálózat egyéb kiszolgálóin.",
+  "dismissable_banner.explore_tags": "Jelenleg ezek a #címke elemek hódítanak teret ezen és a központosítás nélküli hálózat többi kiszolgálóján lévő emberek körében.",
+  "dismissable_banner.public_timeline": "Ezek a legfrissebb bejegyzések azoktól, akik a központosítás nélküli hálózat más kiszolgálóin vannak és ez a kiszolgáló tud róluk.",
   "embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.",
   "embed.preview": "Így fog kinézni:",
   "emoji_button.activity": "Tevékenység",
@@ -210,67 +210,67 @@
   "emoji_button.search_results": "Keresési találatok",
   "emoji_button.symbols": "Szimbólumok",
   "emoji_button.travel": "Utazás és Helyek",
-  "empty_column.account_suspended": "Fiók felfüggesztve",
+  "empty_column.account_suspended": "A fiók felfüggesztésre került",
   "empty_column.account_timeline": "Itt nincs bejegyzés!",
   "empty_column.account_unavailable": "A profil nem érhető el",
-  "empty_column.blocks": "Még senkit sem tiltottál le.",
+  "empty_column.blocks": "Még senki sem került letiltásra.",
   "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.",
   "empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!",
-  "empty_column.direct": "Még nincs egy közvetlen üzeneted sem. Ha küldesz vagy kapsz egyet, itt fog megjelenni.",
-  "empty_column.domain_blocks": "Még nem rejtettél el egyetlen domaint sem.",
+  "empty_column.direct": "Még nincs egy közvetlen üzenet sem. Küldéskor vagy fogadáskor itt fog megjelenni.",
+  "empty_column.domain_blocks": "Még nem lett letiltva egyetlen tartomány sem.",
   "empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!",
   "empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.",
   "empty_column.favourites": "Még senki sem jelölte ezt a bejegyzést kedvencnek. Ha valaki mégis megteszi, itt fogjuk mutatni.",
   "empty_column.follow_recommendations": "Úgy tűnik, neked nem tudunk javaslatokat adni. Próbáld a keresést használni olyanok megtalálására, akiket ismerhetsz, vagy fedezd fel a felkapott hastageket.",
-  "empty_column.follow_requests": "Még nincs egy követési kérésed sem. Ha kapsz egyet, itt fogjuk feltüntetni.",
-  "empty_column.followed_tags": "Még egy hashtaget sem követtél be. Itt fognak megjelenni, ahogy bekövetsz egyet.",
-  "empty_column.hashtag": "Jelenleg nem található semmi ezzel a hashtaggel.",
-  "empty_column.home": "A saját idővonalad üres! Látogasd meg a {public} oldalt vagy használd a keresőt, hogy megismerj másokat.",
+  "empty_column.follow_requests": "Még nincs egy követési kérés sem. Fogadáskor itt jelenik meg.",
+  "empty_column.followed_tags": "Még egy #címke sincs követve. Ezek ekkor itt jelennek meg.",
+  "empty_column.hashtag": "Jelenleg nem található semmi ezzel a #címkével.",
+  "empty_column.home": "A saját idővonal üres! További emberek követése a kitöltéshez. {suggestions}",
   "empty_column.home.suggestions": "Nézzünk pár javaslatot",
   "empty_column.list": "A lista jelenleg üres. Ha a listatagok bejegyzést tesznek közzé, itt fog megjelenni.",
-  "empty_column.lists": "Még nem hoztál létre listát. Ha csinálsz egyet, itt látszik majd.",
-  "empty_column.mutes": "Még egy felhasználót sem némítottál le.",
-  "empty_column.notifications": "Jelenleg nincsenek értesítéseid. Lépj kapcsolatba másokkal, hogy elindítsd a beszélgetést.",
-  "empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más kiszolgálón levő felhasználókat, hogy megtöltsd.",
+  "empty_column.lists": "Még nincs egyetlen lista sem. A létrehozáskor itt jelenik meg.",
+  "empty_column.mutes": "Még nincs egyetlen némított felhasználót sem.",
+  "empty_column.notifications": "Jelenleg nincsenek értesítések. Más emberekkel kapcsolatba lépés után ez itt lesz látható.",
+  "empty_column.public": "Jelenleg itt nincs semmi! Írjunk valamit nyilvánosan vagy kövessünk más kiszolgálón levő felhasználókat a megjelenéshez.",
   "error.unexpected_crash.explanation": "Egy hiba vagy böngésző inkompatibilitás miatt ez az oldal nem jeleníthető meg rendesen.",
-  "error.unexpected_crash.explanation_addons": "Ezt az oldalt nem lehet helyesen megjeleníteni. Ezt a hibát valószínűleg egy böngésző beépülő vagy egy automatikus fordító okozza.",
-  "error.unexpected_crash.next_steps": "Próbáld frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
-  "error.unexpected_crash.next_steps_addons": "Próbáld letiltani őket és frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
+  "error.unexpected_crash.explanation_addons": "Ezt az oldalt nem lehet helyesen megjeleníteni. Ezt a hibát valószínűleg egy böngésző kiegészítő vagy egy automatikus fordító okozza.",
+  "error.unexpected_crash.next_steps": "Próbáljuk meg frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használható a Mastodon.",
+  "error.unexpected_crash.next_steps_addons": "Próbáljuk meg letiltani őket és frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy alkalmazáson keresztül még mindig használható a Mastodon.",
   "errors.unexpected_crash.copy_stacktrace": "Veremkiíratás vágólapra másolása",
   "errors.unexpected_crash.report_issue": "Probléma jelentése",
   "explore.search_results": "Keresési találatok",
-  "explore.suggested_follows": "Neked",
+  "explore.suggested_follows": "Nekem",
   "explore.title": "Felfedezés",
   "explore.trending_links": "Hírek",
   "explore.trending_statuses": "Bejegyzések",
-  "explore.trending_tags": "Hashtagek",
-  "filter_modal.added.context_mismatch_explanation": "Ez a szűrőkategória nem érvényes abban a környezetben, amelyből elérted ezt a bejegyzést. Ha ebben a környezetben is szűrni szeretnéd a bejegyzést, akkor szerkesztened kell a szűrőt.",
+  "explore.trending_tags": "#Címkék",
+  "filter_modal.added.context_mismatch_explanation": "Ez a szűrőkategória nem érvényes abban a környezetben, amelyből ez a bejegyzés elérésre kerül. Ha ebben a környezetben is szűrni szeretnénk a bejegyzést, akkor szerkeszteni kell a szűrőt.",
   "filter_modal.added.context_mismatch_title": "Környezeti eltérés.",
-  "filter_modal.added.expired_explanation": "Ez a szűrőkategória elévült, a használatához módosítanod kell az elévülési dátumot.",
-  "filter_modal.added.expired_title": "Elévült szűrő.",
-  "filter_modal.added.review_and_configure": "A szűrőkategória felülvizsgálatához és további beállításához ugorjon a {settings_link} oldalra.",
+  "filter_modal.added.expired_explanation": "Ez a szűrőkategória elévült, a használatához módosítani kell a lejárati dátumot.",
+  "filter_modal.added.expired_title": "A szűrő lejárt!",
+  "filter_modal.added.review_and_configure": "A szűrőkategória felülvizsgálatához és további beállításához ugorás {settings_link} oldalra.",
   "filter_modal.added.review_and_configure_title": "Szűrőbeállítások",
   "filter_modal.added.settings_link": "beállítások oldal",
   "filter_modal.added.short_explanation": "A következő bejegyzés hozzá lett adva a következő szűrőkategóriához: {title}.",
-  "filter_modal.added.title": "Szűrő hozzáadva.",
+  "filter_modal.added.title": "A szűrő hozzáadásra került.",
   "filter_modal.select_filter.context_mismatch": "nem érvényes erre a környezetre",
-  "filter_modal.select_filter.expired": "elévült",
+  "filter_modal.select_filter.expired": "lejárt",
   "filter_modal.select_filter.prompt_new": "Új kategória: {name}",
   "filter_modal.select_filter.search": "Keresés vagy létrehozás",
-  "filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat",
+  "filter_modal.select_filter.subtitle": "Létező kategória használata vagy új létrehozása",
   "filter_modal.select_filter.title": "E bejegyzés szűrése",
   "filter_modal.title.status": "Egy bejegyzés szűrése",
   "follow_recommendations.done": "Kész",
   "follow_recommendations.heading": "Kövesd azokat, akiknek a bejegyzéseit látni szeretnéd! Itt van néhány javaslat.",
   "follow_recommendations.lead": "Az általad követettek bejegyzései a saját idővonaladon fognak megjelenni időrendi sorrendben. Ne félj attól, hogy hibázol! A követést bármikor, ugyanilyen könnyen visszavonhatod!",
-  "follow_request.authorize": "Engedélyezés",
+  "follow_request.authorize": "Hitelesítés",
   "follow_request.reject": "Elutasítás",
   "follow_requests.unlocked_explanation": "Bár a fiókod nincs zárolva, a(z) {domain} csapata úgy gondolta, hogy talán kézzel szeretnéd ellenőrizni a fiók követési kéréseit.",
-  "followed_tags": "Követett hashtagek",
+  "followed_tags": "Követett #címkék",
   "footer.about": "Névjegy",
-  "footer.directory": "Profilok",
-  "footer.get_app": "Töltsd le az appot",
-  "footer.invite": "Mások meghívása",
+  "footer.directory": "Profiltár",
+  "footer.get_app": "Alkalmazás beszerzése",
+  "footer.invite": "Emberek meghívása",
   "footer.keyboard_shortcuts": "Billentyűparancsok",
   "footer.privacy_policy": "Adatvédelmi szabályzat",
   "footer.source_code": "Forráskód megtekintése",
@@ -281,11 +281,11 @@
   "hashtag.column_header.tag_mode.any": "vagy {additional}",
   "hashtag.column_header.tag_mode.none": "{additional} nélkül",
   "hashtag.column_settings.select.no_options_message": "Nincs javaslat",
-  "hashtag.column_settings.select.placeholder": "Addj meg hashtageket…",
+  "hashtag.column_settings.select.placeholder": "#Címkék megadása…",
   "hashtag.column_settings.tag_mode.all": "Mindegyik",
   "hashtag.column_settings.tag_mode.any": "Bármelyik",
   "hashtag.column_settings.tag_mode.none": "Egyik sem",
-  "hashtag.column_settings.tag_toggle": "Új címkék felvétele ehhez az oszlophoz",
+  "hashtag.column_settings.tag_toggle": "További címkék felvétele ehhez az oszlophoz",
   "hashtag.follow": "Hashtag követése",
   "hashtag.unfollow": "Hashtag követésének megszüntetése",
   "home.column_settings.basic": "Alapvető",
@@ -293,14 +293,14 @@
   "home.column_settings.show_replies": "Válaszok megjelenítése",
   "home.hide_announcements": "Közlemények elrejtése",
   "home.show_announcements": "Közlemények megjelenítése",
-  "interaction_modal.description.favourite": "Egy Mastodon fiókkal kedvencnek jelölheted ezt a bejegyzést, tudatva a szerzővel, hogy értékeled és elteszed későbbre.",
-  "interaction_modal.description.follow": "Egy Mastodon fiókkal bekövetheted {name} fiókot, hogy lásd a bejegyzéseit a saját hírfolyamodban.",
-  "interaction_modal.description.reblog": "Egy Mastodon fiókkal megtolhatod ezt a bejegyzést, hogy megoszd a saját követőiddel.",
-  "interaction_modal.description.reply": "Egy Mastodon fiókkal válaszolhatsz erre a bejegyzésre.",
+  "interaction_modal.description.favourite": "Egy Mastodon fiókkal kedvencnek jelölhető ez a bejegyzés, tudatva a szerzővel, hogy értékeljük és eltesszük későbbre.",
+  "interaction_modal.description.follow": "Egy Mastodon fiókkal bekövethető {name} fiók a bejegyzései megjelenítéséhez a saját hírfolyamban.",
+  "interaction_modal.description.reblog": "Egy Mastodon fiókkal megtolható ez a bejegyzés a saját követőkkel megosztáshoz.",
+  "interaction_modal.description.reply": "Egy Mastodon fiókkal válaszolhatunk erre a bejegyzésre.",
   "interaction_modal.on_another_server": "Másik kiszolgálón",
   "interaction_modal.on_this_server": "Ezen a kiszolgálón",
-  "interaction_modal.other_server_instructions": "Másold és illeszd be ezt a webcímet a kedvenc Mastodon alkalmazásod vagy a Mastodon-kiszolgálód webes felületének keresőmezőjébe.",
-  "interaction_modal.preamble": "Mivel a Mastodon decentralizált, használhatod egy másik Mastodon kiszolgálón, vagy kompatibilis szolgáltatáson lévő fiókodat, ha ezen a kiszolgálón nincs fiókod.",
+  "interaction_modal.other_server_instructions": "Másoljuk és illesszük be ezt a webcímet a kedvenc Mastodon alkalmazásd vagy a Mastodon kiszolgáló webes felületének keresőmezőjébe.",
+  "interaction_modal.preamble": "Mivel a Mastodon nem központosított, használható egy másik Mastodon kiszolgálón vagy kompatibilis szolgáltatáson lévő fiók, ha ezen a kiszolgálón nincs saját fiók.",
   "interaction_modal.title.favourite": "{name} bejegyzésének megjelölése kedvencként",
   "interaction_modal.title.follow": "{name} követése",
   "interaction_modal.title.reblog": "{name} bejegyzésének megtolása",
@@ -308,47 +308,47 @@
   "intervals.full.days": "{number, plural, one {# nap} other {# nap}}",
   "intervals.full.hours": "{number, plural, one {# óra} other {# óra}}",
   "intervals.full.minutes": "{number, plural, one {# perc} other {# perc}}",
-  "keyboard_shortcuts.back": "visszafelé navigálás",
-  "keyboard_shortcuts.blocked": "letiltott felhasználók listájának megnyitása",
+  "keyboard_shortcuts.back": "Navigálás vissza",
+  "keyboard_shortcuts.blocked": "Letiltott felhasználók listájának megnyitása",
   "keyboard_shortcuts.boost": "Bejegyzés megtolása",
   "keyboard_shortcuts.column": "Fókuszálás egy oszlopra",
-  "keyboard_shortcuts.compose": "fókuszálás a szerkesztési szövegdobozra",
+  "keyboard_shortcuts.compose": "Szerkesztési terület fókuszálása",
   "keyboard_shortcuts.description": "Leírás",
   "keyboard_shortcuts.direct": "közvetlen üzenetek megnyitása",
-  "keyboard_shortcuts.down": "lefele navigálás a listában",
+  "keyboard_shortcuts.down": "Mozgás lefelé a listában",
   "keyboard_shortcuts.enter": "Bejegyzés megnyitása",
   "keyboard_shortcuts.favourite": "Bejegyzés kedvencnek jelölése",
-  "keyboard_shortcuts.favourites": "kedvenc lista megnyitása",
+  "keyboard_shortcuts.favourites": "Kedvencek lista megnyitása",
   "keyboard_shortcuts.federated": "föderációs idővonal megnyitása",
   "keyboard_shortcuts.heading": "Billentyűparancsok",
-  "keyboard_shortcuts.home": "saját idővonal megnyitása",
+  "keyboard_shortcuts.home": "Saját idővonal megnyitása",
   "keyboard_shortcuts.hotkey": "Gyorsbillentyű",
   "keyboard_shortcuts.legend": "jelmagyarázat megjelenítése",
   "keyboard_shortcuts.local": "helyi idővonal megnyitása",
-  "keyboard_shortcuts.mention": "szerző megemlítése",
+  "keyboard_shortcuts.mention": "Szerző megemlítése",
   "keyboard_shortcuts.muted": "némított felhasználók listájának megnyitása",
-  "keyboard_shortcuts.my_profile": "profilod megnyitása",
-  "keyboard_shortcuts.notifications": "értesítések megnyitása",
-  "keyboard_shortcuts.open_media": "média megnyitása",
+  "keyboard_shortcuts.my_profile": "Saját profil megnyitása",
+  "keyboard_shortcuts.notifications": "Értesítések oszlop megnyitása",
+  "keyboard_shortcuts.open_media": "Média megnyitása",
   "keyboard_shortcuts.pinned": "Kitűzött bejegyzések listájának megnyitása",
-  "keyboard_shortcuts.profile": "szerző profiljának megnyitása",
+  "keyboard_shortcuts.profile": "Szerző profil megnyitása",
   "keyboard_shortcuts.reply": "Válasz bejegyzésre",
-  "keyboard_shortcuts.requests": "követési kérések listájának megnyitása",
-  "keyboard_shortcuts.search": "fókuszálás a keresőre",
+  "keyboard_shortcuts.requests": "Követési kérések lista megnyitása",
+  "keyboard_shortcuts.search": "Keresősáv fókuszálása",
   "keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése",
-  "keyboard_shortcuts.start": "\"Első lépések\" megnyitása",
-  "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése",
+  "keyboard_shortcuts.start": "\"Első lépések\" oszlop megnyitása",
+  "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel mögötti szöveg megjelenítése/elrejtése",
   "keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése",
   "keyboard_shortcuts.toot": "Új bejegyzés írása",
   "keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
-  "keyboard_shortcuts.up": "felfelé mozdítás a listában",
+  "keyboard_shortcuts.up": "Mozgás felfelé a listában",
   "lightbox.close": "Bezárás",
-  "lightbox.compress": "Képnézet összecsukása",
-  "lightbox.expand": "Képnézet kinagyítása",
+  "lightbox.compress": "Képnéző doboz összezárása",
+  "lightbox.expand": "Képnéző doboz kinyitása",
   "lightbox.next": "Következő",
   "lightbox.previous": "Előző",
-  "limited_account_hint.action": "Mindenképpen mutassa a profilt",
-  "limited_account_hint.title": "Ezt a profilt a(z) {domain} moderátorai elrejtették.",
+  "limited_account_hint.action": "Profil megjelenítése mindenképpen",
+  "limited_account_hint.title": "Ezt a profilt {domain} moderátorai elrejtették.",
   "lists.account.add": "Hozzáadás a listához",
   "lists.account.remove": "Eltávolítás a listából",
   "lists.delete": "Lista törlése",
@@ -359,17 +359,17 @@
   "lists.replies_policy.followed": "Bármely követett felhasználó",
   "lists.replies_policy.list": "A lista tagjai",
   "lists.replies_policy.none": "Senki",
-  "lists.replies_policy.title": "Nekik mutassuk a válaszokat:",
+  "lists.replies_policy.title": "Válaszok megjelenítése:",
   "lists.search": "Keresés a követett személyek között",
-  "lists.subheading": "Listáid",
+  "lists.subheading": "Saját listák",
   "load_pending": "{count, plural, one {# új elem} other {# új elem}}",
   "loading_indicator.label": "Betöltés...",
   "media_gallery.toggle_visible": "{number, plural, one {Kép elrejtése} other {Képek elrejtése}}",
   "missing_indicator.label": "Nincs találat",
   "missing_indicator.sublabel": "Ez az erőforrás nem található",
-  "moved_to_account_banner.text": "A(z) {disabledAccount} fiókod jelenleg le van tiltva, mert átköltöztél ide: {movedToAccount}.",
+  "moved_to_account_banner.text": "{disabledAccount} fiók jelenleg le van tiltva, mert más {movedToAccount} fiókba került át.",
   "mute_modal.duration": "Időtartam",
-  "mute_modal.hide_notifications": "Rejtsük el a felhasználótól származó értesítéseket?",
+  "mute_modal.hide_notifications": "Értesítések elrejtése ettől a felhasználótól?",
   "mute_modal.indefinite": "Határozatlan",
   "navigation_bar.about": "Névjegy",
   "navigation_bar.blocks": "Letiltott felhasználók",
@@ -378,13 +378,13 @@
   "navigation_bar.compose": "Új bejegyzés írása",
   "navigation_bar.direct": "Közvetlen üzenetek",
   "navigation_bar.discover": "Felfedezés",
-  "navigation_bar.domain_blocks": "Rejtett domainek",
+  "navigation_bar.domain_blocks": "Letiltott tartományok",
   "navigation_bar.edit_profile": "Profil szerkesztése",
   "navigation_bar.explore": "Felfedezés",
   "navigation_bar.favourites": "Kedvencek",
   "navigation_bar.filters": "Némított szavak",
   "navigation_bar.follow_requests": "Követési kérelmek",
-  "navigation_bar.followed_tags": "Követett hashtagek",
+  "navigation_bar.followed_tags": "Követett #címkék",
   "navigation_bar.follows_and_followers": "Követettek és követők",
   "navigation_bar.lists": "Listák",
   "navigation_bar.logout": "Kijelentkezés",
@@ -395,15 +395,15 @@
   "navigation_bar.public_timeline": "Föderációs idővonal",
   "navigation_bar.search": "Keresés",
   "navigation_bar.security": "Biztonság",
-  "not_signed_in_indicator.not_signed_in": "Az erőforrás eléréséhez be kell jelentkezned.",
+  "not_signed_in_indicator.not_signed_in": "Az erőforrás eléréséhez be kell jelentkezni.",
   "notification.admin.report": "{name} jelentette: {target}",
   "notification.admin.sign_up": "{name} regisztrált",
   "notification.favourite": "{name} kedvencnek jelölte a bejegyzésedet",
-  "notification.follow": "{name} követ téged",
-  "notification.follow_request": "{name} követni szeretne téged",
-  "notification.mention": "{name} megemlített",
-  "notification.own_poll": "A szavazásod véget ért",
-  "notification.poll": "Egy szavazás, melyben részt vettél, véget ért",
+  "notification.follow": "{name} követ engem",
+  "notification.follow_request": "{name} követni szeretne engem",
+  "notification.mention": "{name} megemlített engem",
+  "notification.own_poll": "A szavazás véget ért",
+  "notification.poll": "Egy általam részt vett szavazás véget ért",
   "notification.reblog": "{name} megtolta a bejegyzésedet",
   "notification.status": "{name} bejegyzést tett közzé",
   "notification.update": "{name} szerkesztett egy bejegyzést",
@@ -413,47 +413,47 @@
   "notifications.column_settings.admin.sign_up": "Új regisztrálók:",
   "notifications.column_settings.alert": "Asztali értesítések",
   "notifications.column_settings.favourite": "Kedvencek:",
-  "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése",
-  "notifications.column_settings.filter_bar.category": "Gyorskereső mező",
-  "notifications.column_settings.filter_bar.show_bar": "Szűrősáv mutatása",
+  "notifications.column_settings.filter_bar.advanced": "Összes kategória megjelenítése",
+  "notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv",
+  "notifications.column_settings.filter_bar.show_bar": "Szűrősáv megjelenítése",
   "notifications.column_settings.follow": "Új követők:",
   "notifications.column_settings.follow_request": "Új követési kérelmek:",
   "notifications.column_settings.mention": "Megemlítések:",
-  "notifications.column_settings.poll": "Szavazás eredménye:",
+  "notifications.column_settings.poll": "Szavazási eredmények:",
   "notifications.column_settings.push": "Push értesítések",
   "notifications.column_settings.reblog": "Megtolások:",
-  "notifications.column_settings.show": "Oszlopban mutatás",
+  "notifications.column_settings.show": "Megjelenítés oszlopban",
   "notifications.column_settings.sound": "Hang lejátszása",
   "notifications.column_settings.status": "Új bejegyzések:",
   "notifications.column_settings.unread_notifications.category": "Olvasatlan értesítések",
   "notifications.column_settings.unread_notifications.highlight": "Olvasatlan értesítések kiemelése",
   "notifications.column_settings.update": "Szerkesztések:",
-  "notifications.filter.all": "Mind",
+  "notifications.filter.all": "Összes",
   "notifications.filter.boosts": "Megtolások",
-  "notifications.filter.favourites": "Kedvencnek jelölések",
+  "notifications.filter.favourites": "Kedvencek",
   "notifications.filter.follows": "Követések",
   "notifications.filter.mentions": "Megemlítések",
   "notifications.filter.polls": "Szavazások eredményei",
   "notifications.filter.statuses": "Frissítések azoktól, akiket követsz",
   "notifications.grant_permission": "Engedély megadása.",
   "notifications.group": "{count} értesítés",
-  "notifications.mark_as_read": "Minden értesítés olvasottnak jelölése",
-  "notifications.permission_denied": "Nem tudjuk engedélyezni az asztali értesítéseket, mert az engedélyt megtagadták.",
-  "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetőek, mert az engedélyt megtagadták a böngészőben",
-  "notifications.permission_required": "Az asztali értesítések nem elérhetőek, mert a szükséges engedélyt nem adtad meg.",
+  "notifications.mark_as_read": "Összes értesítés megjelölése olvasottként",
+  "notifications.permission_denied": "Az asztali értesítések nem érhetők el a korábban elutasított böngésző engedély kérelem miatt",
+  "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetők a korábban elutasított böngésző engedély miatt",
+  "notifications.permission_required": "Az asztali értesítések nem érhetők, mivel a szükséges engedély nem lett megadva.",
   "notifications_permission_banner.enable": "Asztali értesítések engedélyezése",
-  "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.",
-  "notifications_permission_banner.title": "Soha ne mulassz el semmit",
-  "picture_in_picture.restore": "Visszarakás",
+  "notifications_permission_banner.how_to_control": "Bezárt Mastononnál értesések fogadásához engedélyezni kell az asztali értesítéseket. Pontosan lehet vezérelni, hogy milyen interakciókról érkezzen értesítés fenti {icon} gombon keresztül, ha már lorábban megtörtént az engedélyezés.",
+  "notifications_permission_banner.title": "Soha ne mulasszunk el semmit",
+  "picture_in_picture.restore": "Visszahelyezés",
   "poll.closed": "Lezárva",
   "poll.refresh": "Frissítés",
   "poll.total_people": "{count, plural, one {# személy} other {# személy}}",
   "poll.total_votes": "{count, plural, one {# szavazat} other {# szavazat}}",
   "poll.vote": "Szavazás",
-  "poll.voted": "Erre a válaszra szavaztál",
+  "poll.voted": "Megtörtént a szavazás erre a kérdésre",
   "poll.votes": "{votes, plural, one {# szavazat} other {# szavazat}}",
   "poll_button.add_poll": "Új szavazás",
-  "poll_button.remove_poll": "Szavazás törlése",
+  "poll_button.remove_poll": "Szavazás eltávolítása",
   "privacy.change": "Bejegyzés láthatóságának módosítása",
   "privacy.direct.long": "Csak a megemlített felhasználóknak látható",
   "privacy.direct.short": "Csak megemlítetteknek",
@@ -466,7 +466,7 @@
   "privacy_policy.last_updated": "Utoljára frissítve: {date}",
   "privacy_policy.title": "Adatvédelmi szabályzat",
   "refresh": "Frissítés",
-  "regeneration_indicator.label": "Töltődik…",
+  "regeneration_indicator.label": "A betöltés folyamatban van…",
   "regeneration_indicator.sublabel": "A saját idővonalad épp készül!",
   "relative_time.days": "{number}n",
   "relative_time.full.days": "{number, plural, one {# napja} other {# napja}}",
@@ -481,7 +481,7 @@
   "relative_time.today": "ma",
   "reply_indicator.cancel": "Mégsem",
   "report.block": "Letiltás",
-  "report.block_explanation": "Nem fogod látni a bejegyzéseit. Nem fogja tudni megnézni a bejegyzéseidet és nem fog tudni követni sem. Azt is meg fogja tudni mondani, hogy letiltottad.",
+  "report.block_explanation": "A bejegyzéseik nem áthatók. Nem nézheti meg a saját bejegyzéseimet és nem tudni követni sem. Azt is meg fogja tudni mondani, hogy letiltották.",
   "report.categories.other": "Egyéb",
   "report.categories.spam": "Kéretlen üzenet",
   "report.categories.violation": "A tartalom a kiszolgáló egy vagy több szabályát sérti",
@@ -492,11 +492,11 @@
   "report.close": "Kész",
   "report.comment.title": "Van valami, amiről tudnunk kellene?",
   "report.forward": "Továbbítás: {target}",
-  "report.forward_hint": "Ez a fiók egy másik kiszolgálóról van. Oda is elküldöd a jelentés egy anonimizált másolatát?",
+  "report.forward_hint": "Ez a fiók egy másik kiszolgálóról van. Oda is elküldésre kerüljön a jelentés egy anonimizált másolata?",
   "report.mute": "Némítás",
   "report.mute_explanation": "Nem fogod látni a bejegyzéseit. Továbbra is fog tudni követni, és látni fogja a bejegyzéseidet, és nem fogja tudni, hogy némítottad.",
   "report.next": "Következő",
-  "report.placeholder": "További megjegyzések",
+  "report.placeholder": "További hozzászólások",
   "report.reasons.dislike": "Nem tetszik",
   "report.reasons.dislike_description": "Ezt nem szeretném látni",
   "report.reasons.other": "Valami más",
@@ -512,7 +512,7 @@
   "report.submit": "Küldés",
   "report.target": "{target} jelentése",
   "report.thanks.take_action": "Itt vannak a beállítások, melyek szabályozzák, hogy mit látsz a Mastodonon:",
-  "report.thanks.take_action_actionable": "Míg átnézzük, a következőket teheted @{name} ellen:",
+  "report.thanks.take_action_actionable": "Míg átnézzük, a következőket lehet tenni @{name} ellen:",
   "report.thanks.title": "Nem akarod ezt látni?",
   "report.thanks.title_actionable": "Köszönjük, hogy jelentetted, megnézzük.",
   "report.unfollow": "@{name} követésének leállítása",
@@ -523,32 +523,32 @@
   "report_notification.categories.violation": "Szabálysértés",
   "report_notification.open": "Bejelentés megnyitása",
   "search.placeholder": "Keresés",
-  "search.search_or_paste": "Keresés vagy URL beillesztése",
-  "search_popout.search_format": "Speciális keresés",
+  "search.search_or_paste": "Keresés vagy webcím beillesztése",
+  "search_popout.search_format": "Bővített keresési forma",
   "search_popout.tips.full_text": "Egyszerű szöveg, mely általad írt, kedvencnek jelölt vagy megtolt bejegyzéseket, rólad szóló megemlítéseket, felhasználói neveket, megjelenített neveket, hashtageket ad majd vissza.",
-  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.hashtag": "#címke",
   "search_popout.tips.status": "bejegyzés",
-  "search_popout.tips.text": "Egyszerű szöveg. Illeszkedő megjelenített nevet, felhasználói nevet, hashtageket ad majd vissza",
+  "search_popout.tips.text": "Az egyszerű szöveg illeszkedő megjelenített nevet, felhasználónevet, #címkéket ad vissza",
   "search_popout.tips.user": "felhasználó",
   "search_results.accounts": "Emberek",
   "search_results.all": "Összes",
-  "search_results.hashtags": "Hashtagek",
+  "search_results.hashtags": "#Címkék",
   "search_results.nothing_found": "Nincs találat ezekre a keresési kifejezésekre",
   "search_results.statuses": "Bejegyzések",
   "search_results.statuses_fts_disabled": "Ezen a Mastodon szerveren nem engedélyezett a bejegyzések tartalom szerinti keresése.",
   "search_results.title": "Keresés erre: {q}",
   "search_results.total": "{count, number} {count, plural, one {találat} other {találat}}",
-  "server_banner.about_active_users": "Az elmúlt 30 napban ezt a kiszolgálót használók száma (Havi aktív felhasználók)",
+  "server_banner.about_active_users": "Az elmúlt 30 napban ezt a kiszolgálót használó emberek (Havi aktív felhasználók)",
   "server_banner.active_users": "aktív felhasználó",
   "server_banner.administered_by": "Adminisztrátor:",
-  "server_banner.introduction": "{domain} része egy decentralizált közösségi hálónak, melyet a {mastodon} hajt meg.",
-  "server_banner.learn_more": "Tudj meg többet",
-  "server_banner.server_stats": "Kiszolgálóstatisztika:",
+  "server_banner.introduction": "{domain} része egy központ nélküliközösségi hálónak, melyet a {mastodon} hajt meg.",
+  "server_banner.learn_more": "További információ",
+  "server_banner.server_stats": "Szerver statisztika:",
   "sign_in_banner.create_account": "Fiók létrehozása",
   "sign_in_banner.sign_in": "Bejelentkezés",
-  "sign_in_banner.text": "Jelentkezz be profilok vagy hashtagek követéséhez, kedvencnek jelöléséhez, bejegyzések megosztásához, megválaszolásához. A fiókodból más kiszolgálókon is kommunikálhatsz.",
+  "sign_in_banner.text": "Jelentkezzünk be profilok vagy hashtagek követéséhez, kedvencnek jelöléséhez, bejegyzések megosztásához, megválaszolásához. A fiókból más kiszolgálókon is kommunikálhatunk.",
   "status.admin_account": "Moderációs felület megnyitása @{name} fiókhoz",
-  "status.admin_domain": "A következő moderációs felületének megnyitása: @{domain}",
+  "status.admin_domain": "Moderációs felület megnyitása {domain} esetében",
   "status.admin_status": "Bejegyzés megnyitása a moderációs felületen",
   "status.block": "@{name} letiltása",
   "status.bookmark": "Könyvjelzőzés",
@@ -558,6 +558,7 @@
   "status.delete": "Törlés",
   "status.detailed_status": "Részletes beszélgetési nézet",
   "status.direct": "Közvetlen üzenet @{name} számára",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Szerkesztés",
   "status.edited": "Szerkesztve: {date}",
   "status.edited_x_times": "{count, plural, one {{count} alkalommal} other {{count} alkalommal}} szerkesztve",
@@ -595,19 +596,19 @@
   "status.show_less_all": "Kevesebbet mindenhol",
   "status.show_more": "Többet",
   "status.show_more_all": "Többet mindenhol",
-  "status.show_original": "Eredeti mutatása",
+  "status.show_original": "Eredeti megjelenítése",
   "status.translate": "Fordítás",
   "status.translated_from_with": "{lang} nyelvről fordítva {provider} szolgáltatással",
   "status.uncached_media_warning": "Nem érhető el",
   "status.unmute_conversation": "Beszélgetés némításának feloldása",
   "status.unpin": "Kitűzés eltávolítása a profilodról",
-  "subscribed_languages.lead": "A változtatás után csak a kiválasztott nyelvű bejegyzések fognak megjelenni a kezdőlapon és az idővonalakon. Ha egy sincs kiválasztva, akkor minden nyelven megjelennek a bejegyzések.",
+  "subscribed_languages.lead": "A változtatás után csak a kiválasztott nyelvű bejegyzések fognak megjelenni a kezdőoldalon és az idővonalakon. Ha egy sincs kiválasztva, akkor az összes nyelvű bejegyzések megjelennek.",
   "subscribed_languages.save": "Változások mentése",
-  "subscribed_languages.target": "Feliratkozott nyelvek módosítása a következőnél: {target}",
+  "subscribed_languages.target": "Feliratkozott nyelvek módosítása {target} esetében",
   "suggestions.dismiss": "Javaslat elvetése",
-  "suggestions.header": "Esetleg érdekelhet…",
-  "tabs_bar.federated_timeline": "Föderációs",
-  "tabs_bar.home": "Kezdőlap",
+  "suggestions.header": "Esetleg érdeklődésre tarthat számot…",
+  "tabs_bar.federated_timeline": "Összekapcsolt",
+  "tabs_bar.home": "Kezdőoldal",
   "tabs_bar.local_timeline": "Helyi",
   "tabs_bar.notifications": "Értesítések",
   "time_remaining.days": "{number, plural, one {# nap} other {# nap}} van hátra",
@@ -621,29 +622,29 @@
   "timeline_hint.resources.statuses": "Régi bejegyzések",
   "trends.counter_by_accounts": "{count, plural, one {{counter} ember} other {{counter} ember}} az elmúlt {days, plural,one {napban} other {{days} napban}}",
   "trends.trending_now": "Most felkapott",
-  "ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodont.",
+  "ui.beforeunload": "A vázlat elveszik a Mastodon elhagyásakor.",
   "units.short.billion": "{count}Mrd",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
-  "upload_area.title": "Húzd ide a feltöltéshez",
-  "upload_button.label": "Média hozzáadása",
-  "upload_error.limit": "Túllépted a fájlfeltöltési korlátot.",
+  "upload_area.title": "Húzás a feltöltéshez",
+  "upload_button.label": "Képek, videó vagy audió fájl hozzáadása",
+  "upload_error.limit": "A fájlfeltöltési korlát elérésre került.",
   "upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
-  "upload_form.audio_description": "Írja le a hallássérültek számára",
-  "upload_form.description": "Leírás látáskorlátozottak számára",
+  "upload_form.audio_description": "Leírás be a siket vagy hallássérült embereknek",
+  "upload_form.description": "Leírás be vak vagy gyengénlátó embereknek",
   "upload_form.description_missing": "Nincs leírás megadva",
   "upload_form.edit": "Szerkesztés",
-  "upload_form.thumbnail": "Előnézet megváltoztatása",
+  "upload_form.thumbnail": "Bélyegkép megváltoztatása",
   "upload_form.undo": "Törlés",
-  "upload_form.video_description": "Írja le a hallás- vagy látássérültek számára",
+  "upload_form.video_description": "Leírás be a siket, hallássérült, vak vagy gyengénlátó embereknek",
   "upload_modal.analyzing_picture": "Kép elemzése…",
-  "upload_modal.apply": "Alkalmaz",
+  "upload_modal.apply": "Alkalmazás",
   "upload_modal.applying": "Alkalmazás…",
   "upload_modal.choose_image": "Kép kiválasztása",
   "upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
   "upload_modal.detect_text": "Szöveg felismerése a képről",
   "upload_modal.edit_media": "Média szerkesztése",
-  "upload_modal.hint": "Kattints vagy húzd a kört az előnézetben arra a fókuszpontra, mely minden megjelenített bélyegképen látható kell, legyen.",
+  "upload_modal.hint": "Kattintás vagy kör húzása az előnézetben arra a fókuszpontra, mely minden megjelenített bélyegképen láthatónak kell lenni.",
   "upload_modal.preparing_ocr": "OCR előkészítése…",
   "upload_modal.preview_label": "Előnézet ({ratio})",
   "upload_progress.label": "Feltöltés...",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 87ecee646..35c94f829 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -558,6 +558,7 @@
   "status.delete": "Ջնջել",
   "status.detailed_status": "Շղթայի ընդլայնուած դիտում",
   "status.direct": "Նամակ գրել {name} -ին",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Խմբագրել",
   "status.edited": "Խմբագրուել է՝ {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 1f93219c8..038013448 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -558,6 +558,7 @@
   "status.delete": "Hapus",
   "status.detailed_status": "Tampilan detail percakapan",
   "status.direct": "Pesan langsung @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Diedit {date}",
   "status.edited_x_times": "Diedit {count, plural, other {{count} kali}}",
diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json
index 3d2cd7772..830f0a19d 100644
--- a/app/javascript/mastodon/locales/ig.json
+++ b/app/javascript/mastodon/locales/ig.json
@@ -558,6 +558,7 @@
   "status.delete": "Hichapụ",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index b6f61d23b..00ae025f8 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -558,6 +558,7 @@
   "status.delete": "Efacar",
   "status.detailed_status": "Detala konversvido",
   "status.direct": "Direta mesajigez @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Modifikez",
   "status.edited": "Modifikesis ye {date}",
   "status.edited_x_times": "Modifikesis {count, plural, one {{count} foyo} other {{count} foyi}}",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 3611b26ed..50e20aded 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -558,6 +558,7 @@
   "status.delete": "Eyða",
   "status.detailed_status": "Nákvæm spjallþráðasýn",
   "status.direct": "Bein skilaboð @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Breyta",
   "status.edited": "Breytt {date}",
   "status.edited_x_times": "Breytt {count, plural, one {{count} sinni} other {{count} sinnum}}",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index ce8f45fab..108cd73c8 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -558,6 +558,7 @@
   "status.delete": "Elimina",
   "status.detailed_status": "Vista conversazione dettagliata",
   "status.direct": "Messaggio diretto a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Modifica",
   "status.edited": "Modificato il {date}",
   "status.edited_x_times": "Modificato {count, plural, one {{count} volta} other {{count} volte}}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 172da89ce..7e56d3760 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -562,6 +562,7 @@
   "status.delete": "削除",
   "status.detailed_status": "詳細な会話ビュー",
   "status.direct": "@{name}さんにダイレクトメッセージ",
+  "status.direct_indicator": "Private mention",
   "status.edit": "編集",
   "status.edited": "{date}に編集",
   "status.edited_x_times": "{count}回編集",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 9ebdfc989..b6829f5de 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -558,6 +558,7 @@
   "status.delete": "წაშლა",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "პირდაპირი წერილი @{name}-ს",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index cf02895c5..439da7ce9 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -558,6 +558,7 @@
   "status.delete": "Kkes",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Izen usrid i @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Ẓreg",
   "status.edited": "Tettwaẓreg deg {date}",
   "status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 6a9195c4b..f360fa209 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -558,6 +558,7 @@
   "status.delete": "Өшіру",
   "status.detailed_status": "Толық пікірталас көрінісі",
   "status.direct": "Хат жіберу @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index f81a47fa9..b89b4a31d 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index babd3b1dd..edb96f116 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -71,7 +71,7 @@
   "admin.dashboard.monthly_retention": "가입 후 월별 사용자 유지율",
   "admin.dashboard.retention.average": "평균",
   "admin.dashboard.retention.cohort": "가입한 달",
-  "admin.dashboard.retention.cohort_size": "새로운 사용자",
+  "admin.dashboard.retention.cohort_size": "새 사용자",
   "alert.rate_limited.message": "{retry_time, time, medium}에 다시 시도해 주세요.",
   "alert.rate_limited.title": "빈도 제한됨",
   "alert.unexpected.message": "예상하지 못한 에러가 발생했습니다.",
@@ -558,6 +558,7 @@
   "status.delete": "삭제",
   "status.detailed_status": "대화 자세히 보기",
   "status.direct": "@{name}에게 다이렉트 메시지",
+  "status.direct_indicator": "Private mention",
   "status.edit": "수정",
   "status.edited": "{date}에 편집됨",
   "status.edited_x_times": "{count}번 수정됨",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index c927d9658..5fb8aff26 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -558,6 +558,7 @@
   "status.delete": "Jê bibe",
   "status.detailed_status": "Dîtina axaftina berfireh",
   "status.direct": "Peyama rasterast @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Serrast bike",
   "status.edited": "Di {date} de hate serrastkirin",
   "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 9a20c2ebf..c1f25017d 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -558,6 +558,7 @@
   "status.delete": "Dilea",
   "status.detailed_status": "Gwel kesklapp a-vanyl",
   "status.direct": "Messach didro dhe @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json
index 173ca7c61..84a8bc560 100644
--- a/app/javascript/mastodon/locales/la.json
+++ b/app/javascript/mastodon/locales/la.json
@@ -558,6 +558,7 @@
   "status.delete": "Oblitterare",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Recolere",
   "status.edited": "Recultum {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index fd4bbdd95..99e669c95 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 9a3e3219e..2f1f70f14 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -558,6 +558,7 @@
   "status.delete": "Dzēst",
   "status.detailed_status": "Detalizēts sarunas skats",
   "status.direct": "Privāta ziņa @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Rediģēt",
   "status.edited": "Rediģēts {date}",
   "status.edited_x_times": "Rediģēts {count, plural, one {{count} reizi} other {{count} reizes}}",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index a84cc9168..138d17b9d 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 5d29c55d0..6c4975de2 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -558,6 +558,7 @@
   "status.delete": "മായ്ക്കുക",
   "status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്‌ച",
   "status.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 680aea770..9388f4792 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -54,7 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "@{name} ची तक्रार करा",
   "account.requested": "Awaiting approval",
-  "account.requested_follow": "{name} has requested to follow you",
+  "account.requested_follow": "{name} ने आपल्याला फॉलो करण्याची रिक्वेस्ट केली आहे",
   "account.share": "@{name} चे प्रोफाइल शेअर करा",
   "account.show_reblogs": "{name}चे सर्व बुस्ट्स दाखवा",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 3a374884b..317efb4c4 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -558,6 +558,7 @@
   "status.delete": "Padam",
   "status.detailed_status": "Paparan perbualan terperinci",
   "status.direct": "Mesej terus @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Sunting",
   "status.edited": "Disunting {date}",
   "status.edited_x_times": "Disunting {count, plural, other {{count} kali}}",
diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json
index cf5b3406c..502e8ca97 100644
--- a/app/javascript/mastodon/locales/my.json
+++ b/app/javascript/mastodon/locales/my.json
@@ -194,7 +194,7 @@
   "dismissable_banner.explore_tags": "ဤ hashtag များသည် ယခုအချိန်တွင် ဗဟိုချုပ်ကိုင်မှုလျှော့ချထားသော ကွန်ရက်၏ အခြားဆာဗာများပေါ်ရှိ လူများကြားတွင် ဆွဲဆောင်မှုရှိလာပါသည်",
   "dismissable_banner.public_timeline": "ဗဟိုချုပ်ကိုင်မှုလျှော့ချထားသော ဤဆာဗာနှင့် အခြားဆာဗာတို့တွင် တင်ထားသည့် လတ်တလော အများမြင်ပို့စ်များဖြစ်သည်။",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
+  "embed.preview": "ဒါမျိုးမြင်ရမှာပါ။",
   "emoji_button.activity": "လုပ်ဆောင်ချက်",
   "emoji_button.clear": "ရှင်းလင်းမည်",
   "emoji_button.custom": "စိတ်ကြိုက်",
@@ -265,7 +265,7 @@
   "follow_recommendations.lead": "သင်စောင့်ကြည့်ထားသူများ၏ ပို့စ်များမှာ သင့်ပင်မစာမျက်နှာတွင် အချိန်နှင့်တပြေးညီ ပေါ်လာပါမည်။ မကြောက်ပါနှင့်။ အချိန်မရွေး စောင့်ကြည့်ခြင်းအား ရပ်တန့်နိုင်ပါသည်။",
   "follow_request.authorize": "လုပ်ပိုင်ခွင့်",
   "follow_request.reject": "ဖယ်ရှားပါ",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "follow_requests.unlocked_explanation": "သင့်အကောင့်ကို လော့ခ်ချမထားသော်လည်း၊ {domain} ဝန်ထမ်းများသည် ဤအကောင့်များမှ လိုက်နာရန်တောင်းဆိုမှုများကို ကိုယ်တိုင်ပြန်လည်စစ်ဆေးလိုမည်ဟု ထင်မြင်ယူဆပါသည်။",
   "followed_tags": "Hashtag ကို စောင့်ကြည့်ပါမည်",
   "footer.about": "အကြောင်း",
   "footer.directory": "ပရိုဖိုင်များလမ်းညွှန်",
@@ -414,7 +414,7 @@
   "notifications.column_settings.alert": "Desktop သတိပေးချက်များ",
   "notifications.column_settings.favourite": "ကြိုက်နှစ်သက်မှုများ",
   "notifications.column_settings.filter_bar.advanced": "ခေါင်းစဥ်အားလုံးများကိုဖော်ပြပါ",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.category": "အမြန်စစ်ထုတ်မှုဘား",
   "notifications.column_settings.filter_bar.show_bar": "စစ်ထုတ်မှုဘားကို ပြပါ",
   "notifications.column_settings.follow": "စောင့်ကြည့်သူအသစ်များ -",
   "notifications.column_settings.follow_request": "စောင့်ကြည့်ရန် တောင်းဆိုမှုအသစ်များ -",
@@ -442,7 +442,7 @@
   "notifications.permission_denied_alert": "ဘရောက်ဆာခွင့်ပြုချက်ကို ငြင်းပယ်ခဲ့သောကြောင့် ဒက်စ်တော့ အသိပေးချက်များကို ဖွင့်၍မရပါ",
   "notifications.permission_required": "လိုအပ်သောခွင့်ပြုချက်ကို မပေးထားသောကြောင့် ဒက်စ်တော့ အသိပေးချက်များကို မရရှိနိုင်ပါ။",
   "notifications_permission_banner.enable": "ဒက်စ်တော့ အသိပေးချက်များကို ဖွင့်ပါ",
-  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.how_to_control": "Mastodon မဖွင့်သည့်အခါ အကြောင်းကြားချက်များကို လက်ခံရယူရန်၊ ဒက်စ်တော့ အသိပေးချက်များကို ဖွင့်ပါ။ ၎င်းတို့ကို ဖွင့်ပြီးသည်နှင့် ၎င်းတို့ကို ဖွင့်ပြီးသည်နှင့် အထက် {icon} ခလုတ်မှ ဒက်စ်တော့ အသိပေးချက်များကို ထုတ်ပေးသည့် အပြန်အလှန်တုံ့ပြန်မှု အမျိုးအစားများကို သင် အတိအကျ ထိန်းချုပ်နိုင်သည်။",
   "notifications_permission_banner.title": "လက်လွတ်မခံပါနှင့်",
   "picture_in_picture.restore": "ပြန်ထားပါ",
   "poll.closed": "ပိတ်သွားပြီ",
@@ -528,7 +528,7 @@
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "ဟက်ရှ်တက်ခ်",
   "search_popout.tips.status": "ပို့စ်",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.text": "ရိုးရှင်းသော စာသားသည် ကိုက်ညီသည့် ဖော်ပြအမည်များ၊ အသုံးပြုသူအမည်များနှင့် hashtag များကို ပြန်ဖော်ပြပေးသည်။\n",
   "search_popout.tips.user": "အသုံးပြုသူ",
   "search_results.accounts": "လူပုဂ္ဂိုလ်",
   "search_results.all": "အားလုံး",
@@ -558,6 +558,7 @@
   "status.delete": "ဖျက်ရန်",
   "status.detailed_status": "အသေးစိတ်စကားပြောဆိုမှုမြင်ကွင်း",
   "status.direct": "@{name} ကို တိုက်ရိုက်စာပို့မည်",
+  "status.direct_indicator": "Private mention",
   "status.edit": "ပြင်ဆင်ရန်",
   "status.edited": "{date} ကို ပြင်ဆင်ပြီးပါပြီ",
   "status.edited_x_times": "{count, plural, one {{count} time} other {{count} times}} ပြင်ဆင်ခဲ့သည်",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index c2679ddef..359a1f200 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -558,6 +558,7 @@
   "status.delete": "Verwijderen",
   "status.detailed_status": "Uitgebreide gespreksweergave",
   "status.direct": "@{name} een direct bericht sturen",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Bewerken",
   "status.edited": "Bewerkt op {date}",
   "status.edited_x_times": "{count, plural, one {{count} keer} other {{count} keer}} bewerkt",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 76b1ebf2a..d3b74204a 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -558,6 +558,7 @@
   "status.delete": "Slett",
   "status.detailed_status": "Detaljert samtalevisning",
   "status.direct": "Send melding til @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Rediger",
   "status.edited": "Redigert {date}",
   "status.edited_x_times": "Redigert {count, plural, one {{count} gong} other {{count} gonger}}",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 372902e8b..5b0821946 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -558,6 +558,7 @@
   "status.delete": "Slett",
   "status.detailed_status": "Detaljert samtalevisning",
   "status.direct": "Send direktemelding til @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Rediger",
   "status.edited": "Redigert {date}",
   "status.edited_x_times": "Redigert {count, plural,one {{count} gang} other {{count} ganger}}",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index cde922c05..255d6f276 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -558,6 +558,7 @@
   "status.delete": "Escafar",
   "status.detailed_status": "Vista detalhada de la convèrsa",
   "status.direct": "Messatge per @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Modificar",
   "status.edited": "Modificat {date}",
   "status.edited_x_times": "Modificat {count, plural, un {{count} còp} other {{count} còps}}",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index b81bb1356..ee4d3a7f9 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 4dadec0c0..c72820c3e 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -563,6 +563,7 @@
   "status.delete": "Usuń",
   "status.detailed_status": "Szczegółowy widok konwersacji",
   "status.direct": "Wyślij wiadomość bezpośrednią do @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edytuj",
   "status.edited": "Edytowano {date}",
   "status.edited_x_times": "Edytowano {count, plural, one {{count} raz} other {{count} razy}}",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 249787438..8913f21e5 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -558,6 +558,7 @@
   "status.delete": "Excluir",
   "status.detailed_status": "Visão detalhada da conversa",
   "status.direct": "Enviar toot direto para @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado em {date}",
   "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index d72c5c700..99f9c156d 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -558,6 +558,7 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista pormenorizada da conversa",
   "status.direct": "Mensagem direta @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Editar",
   "status.edited": "Editado em {date}",
   "status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index c50a6a12b..0c331b425 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -558,6 +558,7 @@
   "status.delete": "Șterge",
   "status.detailed_status": "Conversația detaliată",
   "status.direct": "Mesaj direct către @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Modifică",
   "status.edited": "Modificat în data de {date}",
   "status.edited_x_times": "Modificată {count, plural, one {o dată} few {de {count} ori} other {de {count} de ori}}",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 93a39c380..8820a67e6 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -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": "Игнорировать",
@@ -558,6 +558,7 @@
   "status.delete": "Удалить",
   "status.detailed_status": "Подробный просмотр обсуждения",
   "status.direct": "Написать @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Изменить",
   "status.edited": "Последнее изменение: {date}",
   "status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index 13e5cbb57..15c6fc02e 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -558,6 +558,7 @@
   "status.delete": "मार्जय",
   "status.detailed_status": "विस्तृतसंभाषणदृश्यम्",
   "status.direct": "प्रत्यक्षसन्देशः @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "सम्पादय",
   "status.edited": "सम्पादितं {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} वारम्} other {{count} वारम्}}",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 38aa39f3f..b61ac537c 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -558,6 +558,7 @@
   "status.delete": "Cantzella",
   "status.detailed_status": "Visualizatzione de detàlliu de arresonada",
   "status.direct": "Messàgiu deretu a @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json
index 1abcac47e..f32d8d2e7 100644
--- a/app/javascript/mastodon/locales/sco.json
+++ b/app/javascript/mastodon/locales/sco.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailt conversation view",
   "status.direct": "Direck message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Editit {date}",
   "status.edited_x_times": "Editit {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index f13aca561..3e96be5fe 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -558,6 +558,7 @@
   "status.delete": "මකන්න",
   "status.detailed_status": "විස්තරාත්මක සංවාද දැක්ම",
   "status.direct": "@{name} සෘජු පණිවිඩයක්",
+  "status.direct_indicator": "Private mention",
   "status.edit": "සංස්කරණය",
   "status.edited": "සංශෝධිතයි {date}",
   "status.edited_x_times": "සංශෝධිතයි {count, plural, one {වාර {count}} other {වාර {count}}}",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index a2c35fae9..e2f558b9b 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -558,6 +558,7 @@
   "status.delete": "Zmazať",
   "status.detailed_status": "Podrobný náhľad celej konverzácie",
   "status.direct": "Priama správa pre @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Uprav",
   "status.edited": "Upravené {date}",
   "status.edited_x_times": "Upravený {count, plural, one {{count} krát} other {{count} krát}}",
@@ -597,7 +598,7 @@
   "status.show_more_all": "Všetkým ukáž viac",
   "status.show_original": "Ukáž pôvodný",
   "status.translate": "Preložiť",
-  "status.translated_from_with": "Translated from {lang} using {provider}",
+  "status.translated_from_with": "Preložené z {lang} pomocou {provider}",
   "status.uncached_media_warning": "Nedostupný/é",
   "status.unmute_conversation": "Prestaň si nevšímať konverzáciu",
   "status.unpin": "Odopni z profilu",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 331d9aa20..78502dd07 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -558,6 +558,7 @@
   "status.delete": "Izbriši",
   "status.detailed_status": "Podroben pogled pogovora",
   "status.direct": "Neposredno sporočilo @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Uredi",
   "status.edited": "Urejeno {date}",
   "status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 2c4c8cd89..7322b12ae 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -558,6 +558,7 @@
   "status.delete": "Fshije",
   "status.detailed_status": "Pamje e hollësishme bisede",
   "status.direct": "Mesazh i drejtpërdrejtë për @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Përpunojeni",
   "status.edited": "Përpunuar më {date}",
   "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 66dd80b90..904396610 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -540,7 +540,7 @@
   "search_results.total": "{count, number} {count, plural, one {rezultat} few {rezultata} other {rezultata}}",
   "server_banner.about_active_users": "Ljudi koji su koristili ovaj server u prethodnih 30 dana (mesečno aktivnih korisnika)",
   "server_banner.active_users": "aktivnih korisnika",
-  "server_banner.administered_by": "Administrirano od strane:",
+  "server_banner.administered_by": "Administrira:",
   "server_banner.introduction": "{domain} je deo decentralizovane društvene mreže koju pokreće {mastodon}.",
   "server_banner.learn_more": "Saznajte više",
   "server_banner.server_stats": "Statistike servera:",
@@ -558,6 +558,7 @@
   "status.delete": "Izbriši",
   "status.detailed_status": "Detaljan prikaz razgovora",
   "status.direct": "Pošalji poruku @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Uredi",
   "status.edited": "Uređeno {date}",
   "status.edited_x_times": "Uređeno {count, plural, one {{count} put} other {{count} puta}}",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 28d6126bb..665d561c6 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -155,7 +155,7 @@
   "confirmations.cancel_follow_request.confirm": "Повуци захтев",
   "confirmations.cancel_follow_request.message": "Да ли сте сигурни да желите да повучете захтев да пратите {name}?",
   "confirmations.delete.confirm": "Избриши",
-  "confirmations.delete.message": "Да ли сте сигурни да желите изришете ову објаву?",
+  "confirmations.delete.message": "Да ли сте сигурни да желите да избришете ову објаву?",
   "confirmations.delete_list.confirm": "Избриши",
   "confirmations.delete_list.message": "Да ли сте сигурни да желите да трајно избришете ову листу?",
   "confirmations.discard_edit_media.confirm": "Одбаци",
@@ -167,12 +167,12 @@
   "confirmations.logout.confirm": "Одјава",
   "confirmations.logout.message": "Да ли сте сигурни да желите да се одјавите?",
   "confirmations.mute.confirm": "Игнориши",
-  "confirmations.mute.explanation": "Ово ће сакрити објаве од корисника и објаве које га помињу, али ће му и даље бити дозвољено да види ваше објаве и да вас прати.",
+  "confirmations.mute.explanation": "Ово ће сакрити објаве корисника и објаве које га помињу, али ће му и даље бити дозвољено да види Ваше објаве и да Вас прати.",
   "confirmations.mute.message": "Да ли стварно желите да игноришете корисника {name}?",
   "confirmations.redraft.confirm": "Избриши и преправи",
   "confirmations.redraft.message": "Да ли сте сигурни да желите да избришете ову објаву и да је преправите? Подржавања и ознаке као омиљених ће бити изгубљени, а одговори ће остати без оригиналне објаве.",
   "confirmations.reply.confirm": "Одговори",
-  "confirmations.reply.message": "Одговарањем ћете обрисати поруку коју састављате. Да ли сигурни да желите да наставите?",
+  "confirmations.reply.message": "Одговарањем ћете обрисати поруку коју састављате. Да ли сте сигурни да желите да наставите?",
   "confirmations.unfollow.confirm": "Отпрати",
   "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?",
   "conversation.delete": "Избриши разговор",
@@ -181,7 +181,7 @@
   "conversation.with": "Са {names}",
   "copypaste.copied": "Копирано",
   "copypaste.copy": "Копирај",
-  "directory.federated": "Са знаног фидеверзума",
+  "directory.federated": "Са знаног федиверзума",
   "directory.local": "Само са {domain}",
   "directory.new_arrivals": "Новопридошли",
   "directory.recently_active": "Недавно активни",
@@ -337,7 +337,7 @@
   "keyboard_shortcuts.search": "Фокусирај траку претраге",
   "keyboard_shortcuts.spoilers": "Прикажи/сакриј поље текста упозорења о садржају (CW)",
   "keyboard_shortcuts.start": "Отвори колону „први кораци”",
-  "keyboard_shortcuts.toggle_hidden": "Прикажи/сакриј текст иза CW-а",
+  "keyboard_shortcuts.toggle_hidden": "Прикажи/сакриј текст иза упозорења",
   "keyboard_shortcuts.toggle_sensitivity": "Прикажи/сакриј мултимедију",
   "keyboard_shortcuts.toot": "Започни нову објаву",
   "keyboard_shortcuts.unfocus": "Уклони фокус са поља за унос текста/претраге",
@@ -366,7 +366,7 @@
   "loading_indicator.label": "Учитавање...",
   "media_gallery.toggle_visible": "{number, plural, one {Сакриј слику} few {Сакриј слике} other {Сакриј слике}}",
   "missing_indicator.label": "Није пронађено",
-  "missing_indicator.sublabel": "Овај ресурс није могуће пронаћи",
+  "missing_indicator.sublabel": "Овај ресурс није било могуће пронаћи",
   "moved_to_account_banner.text": "Ваш налог {disabledAccount} је тренутно онемогућен јер сте прешли на {movedToAccount}.",
   "mute_modal.duration": "Трајање",
   "mute_modal.hide_notifications": "Сакрити обавештења од овог корисника?",
@@ -525,10 +525,10 @@
   "search.placeholder": "Претрага",
   "search.search_or_paste": "Претражите или унесите адресу",
   "search_popout.search_format": "Напредни формат претраге",
-  "search_popout.tips.full_text": "Једноставан текст враћа објаве које сте написали, додали у омиљене, подржали или у којима сте били поменути, као и подударање корисничких имена, приказана имена и хеш ознаке.",
+  "search_popout.tips.full_text": "Једноставан текст враћа објаве које сте написали, додали у омиљене, подржали или у којима сте били поменути, као и одговарајућа корисничка имена, имена за приказ и хеш ознаке.",
   "search_popout.tips.hashtag": "хеш ознака",
   "search_popout.tips.status": "објава",
-  "search_popout.tips.text": "Једноставан текст враћа подударање имена за приказ, корисничка имена и хеш ознаке",
+  "search_popout.tips.text": "Једноставан текст враћа подударна имена за приказ, корисничка имена и хеш ознаке",
   "search_popout.tips.user": "корисник",
   "search_results.accounts": "Људи",
   "search_results.all": "Све",
@@ -540,7 +540,7 @@
   "search_results.total": "{count, number} {count, plural, one {резултат} few {резултата} other {резултата}}",
   "server_banner.about_active_users": "Људи који су користили овај сервер у претходних 30 дана (месечно активних корисника)",
   "server_banner.active_users": "активних корисника",
-  "server_banner.administered_by": "Администрирано од стране:",
+  "server_banner.administered_by": "Администрира:",
   "server_banner.introduction": "{domain} је део децентрализоване друштвене мреже коју покреће {mastodon}.",
   "server_banner.learn_more": "Сазнајте више",
   "server_banner.server_stats": "Статистике сервера:",
@@ -558,6 +558,7 @@
   "status.delete": "Избриши",
   "status.detailed_status": "Детаљан приказ разговора",
   "status.direct": "Пошаљи поруку @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Уреди",
   "status.edited": "Уређено {date}",
   "status.edited_x_times": "Уређено {count, plural, one {{count} пут} other {{count} пута}}",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index fe573949d..90462f026 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -558,6 +558,7 @@
   "status.delete": "Radera",
   "status.detailed_status": "Detaljerad samtalsvy",
   "status.direct": "Direktmeddela @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Redigera",
   "status.edited": "Ändrad {date}",
   "status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 587cae5b8..6ec6e8439 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index fa2ad1b1c..521b58fe5 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -558,6 +558,7 @@
   "status.delete": "நீக்கு",
   "status.detailed_status": "விரிவான உரையாடல் காட்சி",
   "status.direct": "நேரடி செய்தி @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 37f8add8f..4c32ffcb5 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 190db00a0..2a6f612d3 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -558,6 +558,7 @@
   "status.delete": "తొలగించు",
   "status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ",
   "status.direct": "@{name}కు నేరుగా సందేశం పంపు",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index bd4b2fc41..eb7de5aa5 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -67,8 +67,8 @@
   "account.unmute_notifications": "เลิกซ่อนการแจ้งเตือนจาก @{name}",
   "account.unmute_short": "เลิกซ่อน",
   "account_note.placeholder": "คลิกเพื่อเพิ่มหมายเหตุ",
-  "admin.dashboard.daily_retention": "อัตราการเก็บรักษาผู้ใช้ตามวันหลังจากลงทะเบียน",
-  "admin.dashboard.monthly_retention": "อัตราการเก็บรักษาผู้ใช้ตามเดือนหลังจากลงทะเบียน",
+  "admin.dashboard.daily_retention": "อัตราการเก็บรักษาผู้ใช้ตามวันหลังจากการลงทะเบียน",
+  "admin.dashboard.monthly_retention": "อัตราการเก็บรักษาผู้ใช้ตามเดือนหลังจากการลงทะเบียน",
   "admin.dashboard.retention.average": "ค่าเฉลี่ย",
   "admin.dashboard.retention.cohort": "เดือนที่ลงทะเบียน",
   "admin.dashboard.retention.cohort_size": "ผู้ใช้ใหม่",
@@ -558,6 +558,7 @@
   "status.delete": "ลบ",
   "status.detailed_status": "มุมมองการสนทนาโดยละเอียด",
   "status.direct": "ส่งข้อความโดยตรงถึง @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "แก้ไข",
   "status.edited": "แก้ไขเมื่อ {date}",
   "status.edited_x_times": "แก้ไข {count, plural, other {{count} ครั้ง}}",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index fd7546e1d..7e406f5f8 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -558,6 +558,7 @@
   "status.delete": "Sil",
   "status.detailed_status": "Ayrıntılı sohbet görünümü",
   "status.direct": "@{name} adlı kişiye direkt mesaj",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Düzenle",
   "status.edited": "{date} tarihinde düzenlenmiş",
   "status.edited_x_times": "{count, plural, one {{count} kez} other {{count} kez}} düzenlendi",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index beffae95c..8307a455c 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -558,6 +558,7 @@
   "status.delete": "Бетерү",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Үзгәртү",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index b81bb1356..ee4d3a7f9 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index cbdfef527..9cc83b39d 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -558,6 +558,7 @@
   "status.delete": "Видалити",
   "status.detailed_status": "Детальний вигляд бесіди",
   "status.direct": "Пряме повідомлення до @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Редагувати",
   "status.edited": "Відредаговано {date}",
   "status.edited_x_times": "Відредаговано {count, plural, one {{count} раз} few {{count} рази} many {{counter} разів} other {{counter} разів}}",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index bbe7fbd23..ad21ef963 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json
index 6dcc0e3d8..9c8675208 100644
--- a/app/javascript/mastodon/locales/uz.json
+++ b/app/javascript/mastodon/locales/uz.json
@@ -558,6 +558,7 @@
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index a108a6619..ad7518d98 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -272,7 +272,7 @@
   "footer.get_app": "Ứng dụng",
   "footer.invite": "Mời bạn bè",
   "footer.keyboard_shortcuts": "Phím tắt",
-  "footer.privacy_policy": "Chính sách bảo mật",
+  "footer.privacy_policy": "Bảo mật",
   "footer.source_code": "Mã nguồn",
   "footer.status": "Trạng thái",
   "generic.saved": "Đã lưu",
@@ -558,6 +558,7 @@
   "status.delete": "Xóa",
   "status.detailed_status": "Xem chi tiết thêm",
   "status.direct": "Nhắn riêng @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Sửa",
   "status.edited": "Đã sửa {date}",
   "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index f5ca66b3a..700a6d6ab 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -558,6 +558,7 @@
   "status.delete": "ⴽⴽⵙ",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ ⵉ @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 3d0290e5d..75554c9ea 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -558,6 +558,7 @@
   "status.delete": "删除",
   "status.detailed_status": "详细的对话视图",
   "status.direct": "私信 @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "编辑",
   "status.edited": "编辑于 {date}",
   "status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 86c14b180..db272a35a 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -558,6 +558,7 @@
   "status.delete": "刪除",
   "status.detailed_status": "詳細對話內容",
   "status.direct": "私訊 @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "編輯",
   "status.edited": "編輯於 {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} 次} other {{count} 次}}",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 6c6871699..1a73ed6f2 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -558,6 +558,7 @@
   "status.delete": "刪除",
   "status.detailed_status": "詳細的對話內容",
   "status.direct": "發送私訊給 @{name}",
+  "status.direct_indicator": "Private mention",
   "status.edit": "編輯",
   "status.edited": "編輯於 {date}",
   "status.edited_x_times": "已編輯 {count, plural, one {{count} 次} other {{count} 次}}",
diff --git a/app/javascript/mastodon/performance.js b/app/javascript/mastodon/performance.js
index 450a90626..2b7e1bda8 100644
--- a/app/javascript/mastodon/performance.js
+++ b/app/javascript/mastodon/performance.js
@@ -12,6 +12,7 @@ if (process.env.NODE_ENV === 'development') {
     // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1331135
     performance.setResourceTimingBufferSize(Infinity);
   }
+  // eslint-disable-next-line import/no-extraneous-dependencies
   marky = require('marky');
   // allows us to easily do e.g. ReactPerf.printWasted() while debugging
   //window.ReactPerf = require('react-addons-perf');
diff --git a/app/javascript/mastodon/utils/resize_image.js b/app/javascript/mastodon/utils/resize_image.js
deleted file mode 100644
index fb8c3c11e..000000000
--- a/app/javascript/mastodon/utils/resize_image.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import EXIF from 'exif-js';
-
-const MAX_IMAGE_PIXELS = 2073600; // 1920x1080px
-
-const _browser_quirks = {};
-
-// Some browsers will automatically draw images respecting their EXIF orientation
-// while others won't, and the safest way to detect that is to examine how it
-// is done on a known image.
-// See https://github.com/w3c/csswg-drafts/issues/4666
-// and https://github.com/blueimp/JavaScript-Load-Image/commit/1e4df707821a0afcc11ea0720ee403b8759f3881
-const dropOrientationIfNeeded = (orientation) => new Promise(resolve => {
-  switch (_browser_quirks['image-orientation-automatic']) {
-  case true:
-    resolve(1);
-    break;
-  case false:
-    resolve(orientation);
-    break;
-  default:
-    // black 2x1 JPEG, with the following meta information set:
-    // - EXIF Orientation: 6 (Rotated 90° CCW)
-    const testImageURL =
-      'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +
-      'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +
-      'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +
-      'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +
-      'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +
-      'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';
-    const img = new Image();
-    img.onload = () => {
-      const automatic = (img.width === 1 && img.height === 2);
-      _browser_quirks['image-orientation-automatic'] = automatic;
-      resolve(automatic ? 1 : orientation);
-    };
-    img.onerror = () => {
-      _browser_quirks['image-orientation-automatic'] = false;
-      resolve(orientation);
-    };
-    img.src = testImageURL;
-  }
-});
-
-// Some browsers don't allow reading from a canvas and instead return all-white
-// or randomized data. Use a pre-defined image to check if reading the canvas
-// works.
-const checkCanvasReliability = () => new Promise((resolve, reject) => {
-  switch(_browser_quirks['canvas-read-unreliable']) {
-  case true:
-    reject('Canvas reading unreliable');
-    break;
-  case false:
-    resolve();
-    break;
-  default:
-    // 2×2 GIF with white, red, green and blue pixels
-    const testImageURL =
-      'data:image/gif;base64,R0lGODdhAgACAKEDAAAA//8AAAD/AP///ywAAAAAAgACAAACA1wEBQA7';
-    const refData =
-      [255, 255, 255, 255,  255, 0, 0, 255,  0, 255, 0, 255,  0, 0, 255, 255];
-    const img = new Image();
-    img.onload = () => {
-      const canvas  = document.createElement('canvas');
-      const context = canvas.getContext('2d');
-      context.drawImage(img, 0, 0, 2, 2);
-      const imageData = context.getImageData(0, 0, 2, 2);
-      if (imageData.data.every((x, i) => refData[i] === x)) {
-        _browser_quirks['canvas-read-unreliable'] = false;
-        resolve();
-      } else {
-        _browser_quirks['canvas-read-unreliable'] = true;
-        reject('Canvas reading unreliable');
-      }
-    };
-    img.onerror = () => {
-      _browser_quirks['canvas-read-unreliable'] = true;
-      reject('Failed to load test image');
-    };
-    img.src = testImageURL;
-  }
-});
-
-const getImageUrl = inputFile => new Promise((resolve, reject) => {
-  if (window.URL && URL.createObjectURL) {
-    try {
-      resolve(URL.createObjectURL(inputFile));
-    } catch (error) {
-      reject(error);
-    }
-    return;
-  }
-
-  const reader = new FileReader();
-  reader.onerror = (...args) => reject(...args);
-  reader.onload  = ({ target }) => resolve(target.result);
-
-  reader.readAsDataURL(inputFile);
-});
-
-const loadImage = inputFile => new Promise((resolve, reject) => {
-  getImageUrl(inputFile).then(url => {
-    const img = new Image();
-
-    img.onerror = (...args) => reject(...args);
-    img.onload  = () => resolve(img);
-
-    img.src = url;
-  }).catch(reject);
-});
-
-const getOrientation = (img, type = 'image/png') => new Promise(resolve => {
-  if (!['image/jpeg', 'image/webp'].includes(type)) {
-    resolve(1);
-    return;
-  }
-
-  EXIF.getData(img, () => {
-    const orientation = EXIF.getTag(img, 'Orientation');
-    if (orientation !== 1) {
-      dropOrientationIfNeeded(orientation).then(resolve).catch(() => resolve(orientation));
-    } else {
-      resolve(orientation);
-    }
-  });
-});
-
-const processImage = (img, { width, height, orientation, type = 'image/png' }) => new Promise(resolve => {
-  const canvas  = document.createElement('canvas');
-
-  if (4 < orientation && orientation < 9) {
-    canvas.width  = height;
-    canvas.height = width;
-  } else {
-    canvas.width  = width;
-    canvas.height = height;
-  }
-
-  const context = canvas.getContext('2d');
-
-  switch (orientation) {
-  case 2: context.transform(-1, 0, 0, 1, width, 0); break;
-  case 3: context.transform(-1, 0, 0, -1, width, height); break;
-  case 4: context.transform(1, 0, 0, -1, 0, height); break;
-  case 5: context.transform(0, 1, 1, 0, 0, 0); break;
-  case 6: context.transform(0, 1, -1, 0, height, 0); break;
-  case 7: context.transform(0, -1, -1, 0, height, width); break;
-  case 8: context.transform(0, -1, 1, 0, 0, width); break;
-  }
-
-  context.drawImage(img, 0, 0, width, height);
-
-  canvas.toBlob(resolve, type);
-});
-
-const resizeImage = (img, type = 'image/png') => new Promise((resolve, reject) => {
-  const { width, height } = img;
-
-  const newWidth  = Math.round(Math.sqrt(MAX_IMAGE_PIXELS * (width / height)));
-  const newHeight = Math.round(Math.sqrt(MAX_IMAGE_PIXELS * (height / width)));
-
-  checkCanvasReliability()
-    .then(getOrientation(img, type))
-    .then(orientation => processImage(img, {
-      width: newWidth,
-      height: newHeight,
-      orientation,
-      type,
-    }))
-    .then(resolve)
-    .catch(reject);
-});
-
-export default inputFile => new Promise((resolve) => {
-  if (!inputFile.type.match(/image.*/) || inputFile.type === 'image/gif') {
-    resolve(inputFile);
-    return;
-  }
-
-  loadImage(inputFile).then(img => {
-    if (img.width * img.height < MAX_IMAGE_PIXELS) {
-      resolve(inputFile);
-      return;
-    }
-
-    resizeImage(img, inputFile.type)
-      .then(resolve)
-      .catch(() => resolve(inputFile));
-  }).catch(() => resolve(inputFile));
-});
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 58f161f81..7498477ca 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -264,7 +264,7 @@ html {
 
 // Change the background colors of statuses
 .focusable:focus {
-  background: $ui-base-color;
+  background: lighten($white, 4%);
 }
 
 .detailed-status,
@@ -697,3 +697,11 @@ html {
     url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
     no-repeat right 8px center / auto 16px;
 }
+
+.status__wrapper-direct {
+  background-color: rgba($ui-highlight-color, 0.1);
+
+  &:focus {
+    background-color: rgba($ui-highlight-color, 0.15);
+  }
+}
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index 0183c43d5..0f02563b4 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -28,14 +28,14 @@ $fluid-breakpoint: $maximum-width + 20px;
     position: relative;
     border-bottom: 1px solid lighten($ui-base-color, 8%);
     padding: 1em 1.75em;
-    padding-left: 3em;
+    padding-inline-start: 3em;
     font-weight: 500;
     counter-increment: list-counter;
 
     &::before {
       content: counter(list-counter);
       position: absolute;
-      left: 0;
+      inset-inline-start: 0;
       top: 50%;
       transform: translateY(-50%);
       background: $highlight-text-color;
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index c007eb4b5..af0d8b5ed 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -73,8 +73,8 @@
     }
 
     .display-name {
-      margin-left: 15px;
-      text-align: left;
+      margin-inline-start: 15px;
+      text-align: start;
 
       i[data-hidden] {
         display: none;
@@ -138,22 +138,22 @@
   }
 
   .older {
-    float: left;
-    padding-left: 0;
+    float: inline-start;
+    padding-inline-start: 0;
 
     .fa {
       display: inline-block;
-      margin-right: 5px;
+      margin-inline-end: 5px;
     }
   }
 
   .newer {
-    float: right;
-    padding-right: 0;
+    float: inline-end;
+    padding-inline-end: 0;
 
     .fa {
       display: inline-block;
-      margin-left: 5px;
+      margin-inline-start: 5px;
     }
   }
 
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 240c90735..1c74de256 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -117,7 +117,7 @@ $content-width: 840px;
         text-overflow: ellipsis;
 
         i.fa {
-          margin-right: 5px;
+          margin-inline-end: 5px;
         }
 
         &:hover {
@@ -186,7 +186,10 @@ $content-width: 840px;
   }
 
   .content {
-    padding: 55px 15px 20px 25px;
+    padding-top: 55px;
+    padding-bottom: 20px;
+    padding-inline-start: 25px;
+    padding-inline-end: 15px;
 
     @media screen and (max-width: $no-columns-breakpoint) {
       max-width: none;
@@ -202,11 +205,12 @@ $content-width: 840px;
         flex-wrap: wrap;
         align-items: center;
         justify-content: space-between;
-        margin: -15px -15px 0 0;
+        margin-top: -15px;
+        margin-inline-end: -15px;
 
         & > * {
           margin-top: 15px;
-          margin-right: 15px;
+          margin-inline-end: 15px;
         }
       }
 
@@ -385,7 +389,7 @@ $content-width: 840px;
           z-index: 10;
           width: 100%;
           height: calc(100% - 56px);
-          left: 0;
+          inset-inline-start: 0;
           bottom: 0;
           overflow-y: auto;
           background: $ui-base-color;
@@ -470,10 +474,11 @@ body,
 .filters {
   display: flex;
   flex-wrap: wrap;
+  gap: 40px;
 
   .filter-subset {
     flex: 0 0 auto;
-    margin: 0 40px 20px 0;
+    margin-bottom: 20px;
 
     &:last-child {
       margin-bottom: 30px;
@@ -485,7 +490,7 @@ body,
 
       li {
         display: inline-block;
-        margin-right: 5px;
+        margin-inline-end: 5px;
       }
     }
 
@@ -588,7 +593,7 @@ body,
 
   .activity-stream {
     flex: 2 0 0;
-    margin-right: 20px;
+    margin-inline-end: 20px;
     max-width: calc(100% - 60px);
 
     .entry {
@@ -641,12 +646,12 @@ body,
   }
 
   .media-spoiler-toggle-buttons {
-    margin-left: auto;
+    margin-inline-start: auto;
 
     .button {
       overflow: visible;
       margin: 0 0 5px 5px;
-      float: right;
+      float: inline-end;
     }
   }
 }
@@ -667,7 +672,7 @@ body,
 
 .special-action-button,
 .back-link {
-  text-align: right;
+  text-align: end;
   flex: 1 1 auto;
 }
 
@@ -685,7 +690,7 @@ body,
   display: block;
   line-height: 20px;
   padding: 15px;
-  padding-left: 15px * 2 + 40px;
+  padding-inline-start: 15px * 2 + 40px;
   background: $ui-base-color;
   border-bottom: 1px solid darken($ui-base-color, 8%);
   position: relative;
@@ -712,7 +717,7 @@ body,
 
   &__avatar {
     position: absolute;
-    left: 15px;
+    inset-inline-start: 15px;
     top: 15px;
 
     .avatar {
@@ -780,7 +785,7 @@ a.name-tag,
   .avatar {
     display: block;
     margin: 0;
-    margin-right: 5px;
+    margin-inline-end: 5px;
     border-radius: 50%;
   }
 
@@ -794,7 +799,7 @@ a.name-tag,
 
 .speech-bubble {
   margin-bottom: 20px;
-  border-left: 4px solid $ui-highlight-color;
+  border-inset-inline-start: 4px solid $ui-highlight-color;
 
   &.positive {
     border-left-color: $success-green;
@@ -810,7 +815,7 @@ a.name-tag,
 
   &__bubble {
     padding: 16px;
-    padding-left: 14px;
+    padding-inline-start: 14px;
     font-size: 15px;
     line-height: 20px;
     border-radius: 4px 4px 4px 0;
@@ -824,7 +829,7 @@ a.name-tag,
 
   &__owner {
     padding: 8px;
-    padding-left: 12px;
+    padding-inline-start: 12px;
   }
 
   time {
@@ -848,7 +853,7 @@ a.name-tag,
       border: 0;
 
       &__avatar-wrapper {
-        margin-left: 0;
+        margin-inline-start: 0;
       }
     }
 
@@ -857,7 +862,7 @@ a.name-tag,
       font-weight: 500;
       color: $darker-text-color;
       text-transform: uppercase;
-      text-align: right;
+      text-align: end;
 
       a {
         color: inherit;
@@ -908,7 +913,7 @@ a.name-tag,
 
         &__icon {
           color: $dark-text-color;
-          margin-right: 4px;
+          margin-inline-end: 4px;
           font-weight: 500;
         }
       }
@@ -1106,7 +1111,7 @@ a.name-tag,
 
   > h4 {
     position: sticky;
-    left: 0;
+    inset-inline-start: 0;
   }
 
   &__table {
@@ -1118,7 +1123,7 @@ a.name-tag,
     &__date {
       white-space: nowrap;
       padding: 10px 0;
-      text-align: left;
+      text-align: start;
       min-width: 120px;
 
       &.retention__table__average {
@@ -1176,7 +1181,7 @@ a.name-tag,
 
     &__total {
       display: block;
-      margin-right: 10px;
+      margin-inline-end: 10px;
       font-weight: 500;
       font-size: 28px;
       color: $primary-text-color;
@@ -1278,7 +1283,7 @@ a.sparkline {
     }
 
     &__value {
-      text-align: right;
+      text-align: end;
       color: $darker-text-color;
       padding: 11px 10px;
     }
@@ -1289,7 +1294,7 @@ a.sparkline {
       height: 8px;
       border-radius: 50%;
       background: $ui-highlight-color;
-      margin-right: 10px;
+      margin-inline-end: 10px;
 
       @for $i from 0 through 10 {
         &--#{10 * $i} {
@@ -1325,7 +1330,7 @@ a.sparkline {
     }
 
     &__rules {
-      margin-left: 30px;
+      margin-inline-start: 30px;
     }
   }
 
@@ -1447,7 +1452,7 @@ a.sparkline {
       height: 21px;
       position: absolute;
       bottom: 0;
-      right: 15px;
+      inset-inline-end: 15px;
       background: linear-gradient(to left, $ui-base-color, transparent);
       pointer-events: none;
     }
@@ -1527,7 +1532,7 @@ a.sparkline {
     background: $ui-base-color;
     position: relative;
     padding: 15px;
-    padding-left: 15px * 2 + 40px;
+    padding-inline-start: 15px * 2 + 40px;
     border-bottom: 1px solid darken($ui-base-color, 8%);
 
     &:first-child {
@@ -1547,7 +1552,7 @@ a.sparkline {
 
     &__avatar {
       position: absolute;
-      left: 15px;
+      inset-inline-start: 15px;
       top: 15px;
       border-radius: 4px;
       width: 40px;
@@ -1563,7 +1568,7 @@ a.sparkline {
       .username {
         color: $primary-text-color;
         font-weight: 500;
-        margin-right: 5px;
+        margin-inline-end: 5px;
 
         a {
           color: inherit;
@@ -1578,7 +1583,7 @@ a.sparkline {
       }
 
       time {
-        margin-left: 5px;
+        margin-inline-start: 5px;
         vertical-align: baseline;
       }
     }
@@ -1613,8 +1618,8 @@ a.sparkline {
     &__actions {
       position: absolute;
       top: 15px;
-      right: 15px;
-      text-align: right;
+      inset-inline-end: 15px;
+      text-align: end;
     }
   }
 }
@@ -1637,7 +1642,7 @@ a.sparkline {
       flex: 0 0 auto;
       width: 200px;
       padding: 15px;
-      padding-right: 0;
+      padding-inline-end: 0;
 
       .button {
         display: block;
@@ -1673,7 +1678,7 @@ a.sparkline {
 }
 
 .section-skip-link {
-  float: right;
+  float: inline-end;
 
   a {
     color: $ui-highlight-color;
@@ -1723,7 +1728,7 @@ a.sparkline {
 
   &__rules {
     list-style: disc;
-    padding-left: 15px;
+    padding-inline-start: 15px;
     margin-bottom: 20px;
     color: $darker-text-color;
 
@@ -1812,7 +1817,7 @@ a.sparkline {
 
   li {
     counter-increment: step 1;
-    padding-left: 2.5rem;
+    padding-inline-start: 2.5rem;
     padding-bottom: 8px;
     position: relative;
     margin-bottom: 8px;
@@ -1822,7 +1827,7 @@ a.sparkline {
       content: counter(step);
       font-size: 0.625rem;
       font-weight: 500;
-      left: 0;
+      inset-inline-start: 0;
       display: flex;
       justify-content: center;
       align-items: center;
@@ -1841,7 +1846,7 @@ a.sparkline {
       background: $highlight-text-color;
       bottom: 0;
       top: calc(1.875rem + 1px);
-      left: 0.6875rem;
+      inset-inline-start: 0.6875rem;
     }
 
     &:last-child {
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 1d08b12e5..a344c7fa4 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -267,7 +267,7 @@ button {
   overflow: hidden;
   position: absolute;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   z-index: -1000;
 }
 
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 4f4f447b9..3ff786e62 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -309,7 +309,7 @@
   &__counter {
     display: inline-block;
     width: auto;
-    margin-left: 4px;
+    margin-inline-start: 4px;
     font-size: 12px;
     font-weight: 500;
   }
@@ -413,7 +413,7 @@ body > [data-popper-placement] {
       width: 18px;
       height: 18px;
       flex: 0 0 auto;
-      margin-right: 10px;
+      margin-inline-end: 10px;
       top: -1px;
       border-radius: 4px;
       vertical-align: middle;
@@ -465,7 +465,7 @@ body > [data-popper-placement] {
   .emoji-picker-dropdown {
     position: absolute;
     top: 0;
-    right: 0;
+    inset-inline-end: 0;
   }
 
   .compose-form__autosuggest-wrapper {
@@ -527,7 +527,7 @@ body > [data-popper-placement] {
     min-height: 100px;
     border-radius: 4px 4px 0 0;
     padding-bottom: 0;
-    padding-right: 10px + 22px;
+    padding-right: 10px + 22px; // Cannot use inline-end because of dir=auto
     resize: none;
     scrollbar-color: initial;
 
@@ -536,7 +536,7 @@ body > [data-popper-placement] {
     }
 
     @media screen and (max-width: 600px) {
-      height: 100px !important; // prevent auto-resize textarea
+      height: 100px !important; // Prevent auto-resize textarea
       resize: vertical;
     }
   }
@@ -605,7 +605,7 @@ body > [data-popper-placement] {
 
     &__uses {
       flex: 0 0 auto;
-      text-align: right;
+      text-align: end;
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
@@ -615,7 +615,7 @@ body > [data-popper-placement] {
   .autosuggest-account-icon,
   .autosuggest-emoji img {
     display: block;
-    margin-right: 8px;
+    margin-inline-end: 8px;
     width: 16px;
     height: 16px;
   }
@@ -677,8 +677,8 @@ body > [data-popper-placement] {
         position: absolute;
         z-index: 2;
         bottom: 0;
-        left: 0;
-        right: 0;
+        inset-inline-start: 0;
+        inset-inline-end: 0;
         box-sizing: border-box;
         background: linear-gradient(
           0deg,
@@ -737,7 +737,7 @@ body > [data-popper-placement] {
 
     .character-counter__wrapper {
       align-self: center;
-      margin-right: 4px;
+      margin-inline-end: 4px;
     }
   }
 
@@ -826,7 +826,7 @@ body > [data-popper-placement] {
 }
 
 .reply-indicator__cancel {
-  float: right;
+  float: inline-end;
   line-height: 24px;
 }
 
@@ -836,13 +836,13 @@ body > [data-popper-placement] {
   max-width: 100%;
   line-height: 24px;
   overflow: hidden;
-  padding-right: 25px;
+  padding-inline-end: 25px;
   text-decoration: none;
 }
 
 .reply-indicator__display-avatar {
-  float: left;
-  margin-right: 5px;
+  float: inline-start;
+  margin-inline-end: 5px;
 }
 
 .status__content--with-action {
@@ -1159,7 +1159,7 @@ body > [data-popper-placement] {
 
 .notification__relative_time {
   color: $dark-text-color;
-  float: right;
+  float: inline-end;
   font-size: 14px;
   padding-bottom: 1px;
 }
@@ -1244,7 +1244,7 @@ body > [data-popper-placement] {
 .status__prepend {
   padding: 16px;
   padding-bottom: 0;
-  display: flex;
+  display: inline-flex;
   gap: 10px;
   font-size: 15px;
   line-height: 22px;
@@ -1262,6 +1262,18 @@ body > [data-popper-placement] {
   }
 }
 
+.status__wrapper-direct {
+  background: mix($ui-base-color, $ui-highlight-color, 95%);
+
+  &:focus {
+    background: mix(lighten($ui-base-color, 4%), $ui-highlight-color, 95%);
+  }
+
+  .status__prepend {
+    color: $highlight-text-color;
+  }
+}
+
 .status__action-bar {
   display: flex;
   justify-content: space-between;
@@ -1315,6 +1327,11 @@ body > [data-popper-placement] {
   .audio-player {
     margin-top: 16px;
   }
+
+  .status__prepend {
+    padding: 0;
+    margin-bottom: 16px;
+  }
 }
 
 .detailed-status__meta {
@@ -1333,6 +1350,32 @@ body > [data-popper-placement] {
   padding: 10px 0;
 }
 
+.detailed-status__wrapper-direct {
+  .detailed-status,
+  .detailed-status__action-bar {
+    background: mix($ui-base-color, $ui-highlight-color, 95%);
+  }
+
+  &:focus {
+    .detailed-status,
+    .detailed-status__action-bar {
+      background: mix(lighten($ui-base-color, 4%), $ui-highlight-color, 95%);
+    }
+  }
+
+  .detailed-status__action-bar {
+    border-top-color: mix(
+      lighten($ui-base-color, 8%),
+      $ui-highlight-color,
+      95%
+    );
+  }
+
+  .status__prepend {
+    color: $highlight-text-color;
+  }
+}
+
 .detailed-status__link {
   color: inherit;
   text-decoration: none;
@@ -1344,7 +1387,7 @@ body > [data-popper-placement] {
   font-weight: 500;
   font-size: 12px;
   line-height: 17px;
-  margin-left: 6px;
+  margin-inline-start: 6px;
 }
 
 .reply-indicator__content {
@@ -1389,7 +1432,7 @@ body > [data-popper-placement] {
     border-bottom: 0;
 
     .account__avatar-wrapper {
-      margin-left: 0;
+      margin-inline-start: 0;
     }
   }
 
@@ -1403,10 +1446,12 @@ body > [data-popper-placement] {
     text-decoration: none;
     font-size: 14px;
 
-    &--with-note {
-      strong {
-        display: inline;
-      }
+    .display-name {
+      margin-bottom: 4px;
+    }
+
+    .display-name strong {
+      display: inline;
     }
   }
 
@@ -1450,7 +1495,7 @@ body > [data-popper-placement] {
   &-inline {
     display: inline-block;
     vertical-align: middle;
-    margin-right: 5px;
+    margin-inline-end: 5px;
   }
 
   &-composite {
@@ -1459,7 +1504,7 @@ body > [data-popper-placement] {
     position: relative;
 
     & > div {
-      float: left;
+      float: inline-start;
       position: relative;
       box-sizing: border-box;
     }
@@ -1473,7 +1518,7 @@ body > [data-popper-placement] {
       display: block;
       position: absolute;
       top: 50%;
-      left: 50%;
+      inset-inline-start: 50%;
       transform: translate(-50%, -50%);
       color: $primary-text-color;
       text-shadow: 1px 1px 2px $base-shadow-color;
@@ -1493,7 +1538,7 @@ a .account__avatar {
   &-overlay {
     position: absolute;
     bottom: 0;
-    right: 0;
+    inset-inline-end: 0;
     z-index: 1;
   }
 }
@@ -1550,15 +1595,15 @@ a .account__avatar {
 
   .dropdown--active {
     .dropdown__content.dropdown__right {
-      left: 6px;
-      right: initial;
+      inset-inline-start: 6px;
+      inset-inline-end: initial;
     }
 
     &::after {
       bottom: initial;
-      margin-left: 11px;
+      margin-inline-start: 11px;
       margin-top: -7px;
-      right: initial;
+      inset-inline-end: initial;
     }
   }
 }
@@ -1574,7 +1619,7 @@ a .account__avatar {
   text-decoration: none;
   overflow: hidden;
   flex: 0 1 100%;
-  border-right: 1px solid lighten($ui-base-color, 8%);
+  border-inset-inline-end: 1px solid lighten($ui-base-color, 8%);
   padding: 10px 0;
   border-bottom: 4px solid transparent;
 
@@ -1614,8 +1659,8 @@ a .account__avatar {
 }
 
 .account-authorize__avatar {
-  float: left;
-  margin-right: 10px;
+  float: inline-start;
+  margin-inline-end: 10px;
 }
 
 .status__display-name,
@@ -1629,7 +1674,7 @@ a .account__avatar {
 
 .status__display-name,
 .account__display-name {
-  strong {
+  .display-name strong {
     color: $primary-text-color;
   }
 }
@@ -1644,12 +1689,12 @@ a .account__avatar {
 .reply-indicator__display-name,
 .detailed-status__display-name,
 a.account__display-name {
-  &:hover strong {
+  &:hover .display-name strong {
     text-decoration: underline;
   }
 }
 
-.account__display-name strong {
+.account__display-name .display-name strong {
   display: block;
   overflow: hidden;
   text-overflow: ellipsis;
@@ -2087,7 +2132,7 @@ a.account__display-name {
   }
 
   &.right {
-    left: -9px;
+    inset-inline-start: -9px;
 
     &::before {
       transform: rotate(-90deg);
@@ -2099,7 +2144,7 @@ a.account__display-name {
   }
 
   &.left {
-    right: -9px;
+    inset-inline-end: -9px;
 
     &::before {
       transform: rotate(90deg);
@@ -2169,7 +2214,7 @@ a.account__display-name {
   vertical-align: top;
 
   .account__avatar {
-    margin-right: 5px;
+    margin-inline-end: 5px;
     border-radius: 50%;
   }
 
@@ -2182,8 +2227,8 @@ a.account__display-name {
   display: block;
   line-height: 18px;
   max-width: 311px;
-  right: 0;
-  text-align: left;
+  inset-inline-end: 0;
+  text-align: start;
   z-index: 9999;
 
   & > ul {
@@ -2197,12 +2242,12 @@ a.account__display-name {
   }
 
   &.dropdown__right {
-    right: 0;
+    inset-inline-end: 0;
   }
 
   &.dropdown__left {
     & > ul {
-      left: -98px;
+      inset-inline-start: -98px;
     }
   }
 
@@ -2421,23 +2466,23 @@ $ui-header-height: 55px;
   .drawer {
     flex: 0 0 auto;
     padding: 10px;
-    padding-left: 5px;
-    padding-right: 5px;
+    padding-inline-start: 5px;
+    padding-inline-end: 5px;
 
     &:first-child {
-      padding-left: 10px;
+      padding-inline-start: 10px;
     }
 
     &:last-child {
-      padding-right: 10px;
+      padding-inline-end: 10px;
     }
   }
 
   .columns-area > div {
     .column,
     .drawer {
-      padding-left: 5px;
-      padding-right: 5px;
+      padding-inline-start: 5px;
+      padding-inline-end: 5px;
     }
   }
 }
@@ -2484,7 +2529,7 @@ $ui-header-height: 55px;
   }
 
   span {
-    margin-left: 5px;
+    margin-inline-start: 5px;
     display: none;
   }
 }
@@ -2526,7 +2571,7 @@ $ui-header-height: 55px;
     line-height: 18px;
     font-size: 16px;
     padding: 15px;
-    padding-right: 30px;
+    padding-inline-end: 30px;
   }
 
   .search__icon .fa {
@@ -2594,7 +2639,7 @@ $ui-header-height: 55px;
     .navigation-panel {
       margin: 0;
       background: $ui-base-color;
-      border-left: 1px solid lighten($ui-base-color, 8%);
+      border-inset-inline-start: 1px solid lighten($ui-base-color, 8%);
       height: 100vh;
     }
 
@@ -2666,7 +2711,7 @@ $ui-header-height: 55px;
 
   &__badge {
     position: absolute;
-    left: 9px;
+    inset-inline-start: 9px;
     top: -13px;
     background: $ui-highlight-color;
     border: 2px solid lighten($ui-base-color, 8%);
@@ -2680,7 +2725,7 @@ $ui-header-height: 55px;
 
   &__issue-badge {
     position: absolute;
-    left: 11px;
+    inset-inline-start: 11px;
     bottom: 1px;
     display: block;
     background: $error-red;
@@ -2736,7 +2781,7 @@ $ui-header-height: 55px;
 
   &__background {
     position: absolute;
-    left: 0;
+    inset-inline-start: 0;
     bottom: 0;
     height: 220px;
     width: auto;
@@ -2862,7 +2907,7 @@ $ui-header-height: 55px;
 .drawer__inner {
   position: absolute;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   background: lighten($ui-base-color, 13%);
   box-sizing: border-box;
   padding: 0;
@@ -2905,7 +2950,7 @@ $ui-header-height: 55px;
 .pseudo-drawer {
   background: lighten($ui-base-color, 13%);
   font-size: 13px;
-  text-align: left;
+  text-align: start;
 }
 
 .drawer__header {
@@ -3008,7 +3053,7 @@ $ui-header-height: 55px;
 
 .column-back-button__icon {
   display: inline-block;
-  margin-right: 5px;
+  margin-inline-end: 5px;
 }
 
 .column-back-button--slim {
@@ -3021,7 +3066,7 @@ $ui-header-height: 55px;
   font-size: 16px;
   padding: 15px;
   position: absolute;
-  right: 0;
+  inset-inline-end: 0;
   top: -48px;
 }
 
@@ -3086,7 +3131,7 @@ $ui-header-height: 55px;
   margin-top: auto;
   margin-bottom: auto;
   line-height: 0;
-  left: 8px;
+  inset-inline-start: 8px;
   opacity: 0;
   transition: opacity 0.25s ease;
 }
@@ -3105,7 +3150,7 @@ $ui-header-height: 55px;
   margin-top: auto;
   margin-bottom: auto;
   line-height: 0;
-  right: 10px;
+  inset-inline-end: 10px;
   opacity: 1;
   transition: opacity 0.25s ease;
 }
@@ -3117,7 +3162,7 @@ $ui-header-height: 55px;
 .react-toggle-thumb {
   position: absolute;
   top: 1px;
-  left: 1px;
+  inset-inline-start: 1px;
   width: 22px;
   height: 22px;
   border: 1px solid $ui-base-color;
@@ -3129,7 +3174,7 @@ $ui-header-height: 55px;
 }
 
 .react-toggle--checked .react-toggle-thumb {
-  left: 27px;
+  inset-inline-start: 27px;
   border-color: $ui-highlight-color;
 }
 
@@ -3183,7 +3228,7 @@ $ui-header-height: 55px;
 
 .column-link__icon {
   display: inline-block;
-  margin-right: 5px;
+  margin-inline-end: 5px;
 }
 
 .column-link__badge {
@@ -3277,7 +3322,7 @@ $ui-header-height: 55px;
 
   thead {
     position: absolute;
-    left: -9999px;
+    inset-inline-start: -9999px;
   }
 
   td {
@@ -3381,9 +3426,9 @@ button.icon-button.active i.fa-retweet {
 
   &__actions {
     bottom: 0;
-    left: 0;
+    inset-inline-start: 0;
     position: absolute;
-    right: 0;
+    inset-inline-end: 0;
     top: 0;
     display: flex;
     justify-content: center;
@@ -3489,7 +3534,7 @@ a.status-card {
     position: absolute;
     transform-origin: 50% 50%;
     top: 50%;
-    left: 50%;
+    inset-inline-start: 50%;
     transform: translate(-50%, -50%);
   }
 }
@@ -3556,7 +3601,7 @@ a.status-card.compact:hover {
   object-fit: fill;
   position: absolute;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   z-index: 0;
   background: $base-overlay-background;
 
@@ -3671,8 +3716,8 @@ a.status-card.compact:hover {
       content: '';
       position: absolute;
       bottom: -13px;
-      left: 0;
-      right: 0;
+      inset-inline-start: 0;
+      inset-inline-end: 0;
       margin: 0 auto;
       width: 60%;
       pointer-events: none;
@@ -3707,11 +3752,12 @@ a.status-card.compact:hover {
   & > button {
     margin: 0;
     border: 0;
-    padding: 15px 0 15px 15px;
+    padding: 15px;
+    padding-inline-end: 0;
     color: inherit;
     background: transparent;
     font: inherit;
-    text-align: left;
+    text-align: start;
     text-overflow: ellipsis;
     overflow: hidden;
     white-space: nowrap;
@@ -3745,7 +3791,7 @@ a.status-card.compact:hover {
 }
 
 .column-header__links .text-btn {
-  margin-right: 10px;
+  margin-inline-end: 10px;
 }
 
 .column-header__button {
@@ -3828,18 +3874,18 @@ a.status-card.compact:hover {
 }
 
 .column-header__setting-arrows {
-  float: right;
+  float: inline-end;
 
   .column-header__setting-btn {
     padding: 5px;
 
     &:first-child {
-      padding-right: 7px;
+      padding-inline-end: 7px;
     }
 
     &:last-child {
-      padding-left: 7px;
-      margin-left: 5px;
+      padding-inline-start: 7px;
+      margin-inline-start: 5px;
     }
   }
 }
@@ -3866,7 +3912,7 @@ a.status-card.compact:hover {
 
 .column-header__icon {
   display: inline-block;
-  margin-right: 5px;
+  margin-inline-end: 5px;
 }
 
 .loading-indicator {
@@ -3877,7 +3923,7 @@ a.status-card.compact:hover {
   overflow: visible;
   position: absolute;
   top: 50%;
-  left: 50%;
+  inset-inline-start: 50%;
   transform: translate(-50%, -50%);
   display: flex;
   align-items: center;
@@ -4013,7 +4059,7 @@ a.status-card.compact:hover {
 
 .spoiler-button {
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   width: 100%;
   height: 100%;
   position: absolute;
@@ -4021,7 +4067,7 @@ a.status-card.compact:hover {
 
   &--minified {
     display: block;
-    left: 4px;
+    inset-inline-start: 4px;
     top: 4px;
     width: auto;
     height: auto;
@@ -4138,12 +4184,12 @@ a.status-card.compact:hover {
 
     &__placeholder {
       color: $dark-text-color;
-      padding-left: 2px;
+      padding-inline-start: 2px;
       font-size: 12px;
     }
 
     &__value-container {
-      padding-left: 6px;
+      padding-inline-start: 6px;
     }
 
     &__multi-value {
@@ -4240,7 +4286,7 @@ a.status-card.compact:hover {
   color: $darker-text-color;
   display: inline-block;
   margin-bottom: 14px;
-  margin-left: 8px;
+  margin-inline-start: 8px;
   vertical-align: middle;
 }
 
@@ -4425,7 +4471,7 @@ a.status-card.compact:hover {
 .emoji-picker-dropdown__modifiers {
   position: absolute;
   top: 60px;
-  right: 11px;
+  inset-inline-end: 11px;
   cursor: pointer;
 }
 
@@ -4433,7 +4479,7 @@ a.status-card.compact:hover {
   position: absolute;
   z-index: 4;
   top: -4px;
-  left: -8px;
+  inset-inline-start: -8px;
   background: $simple-background-color;
   border-radius: 4px;
   box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
@@ -4470,7 +4516,7 @@ a.status-card.compact:hover {
   display: flex;
   height: 100vh;
   justify-content: center;
-  left: 0;
+  inset-inline-start: 0;
   opacity: 0;
   position: fixed;
   top: 0;
@@ -4495,9 +4541,9 @@ a.status-card.compact:hover {
 .upload-area__background {
   position: absolute;
   top: 0;
-  right: 0;
+  inset-inline-end: 0;
   bottom: 0;
-  left: 0;
+  inset-inline-start: 0;
   z-index: -1;
   border-radius: 4px;
   background: $ui-base-color;
@@ -4525,7 +4571,7 @@ a.status-card.compact:hover {
 
   .fa {
     font-size: 34px;
-    margin-right: 10px;
+    margin-inline-end: 10px;
   }
 
   span {
@@ -4551,7 +4597,7 @@ a.status-card.compact:hover {
 
 .upload-progress__tracker {
   position: absolute;
-  left: 0;
+  inset-inline-start: 0;
   top: 0;
   height: 6px;
   background: $ui-highlight-color;
@@ -4560,7 +4606,10 @@ a.status-card.compact:hover {
 
 .emoji-button {
   display: block;
-  padding: 5px 5px 2px 2px;
+  padding-top: 5px;
+  padding-bottom: 2px;
+  padding-inline-start: 2px;
+  padding-inline-end: 5px;
   outline: 0;
   cursor: pointer;
 
@@ -4648,7 +4697,7 @@ a.status-card.compact:hover {
   display: flex;
   align-items: center;
   justify-content: center;
-  margin-right: 10px;
+  margin-inline-end: 10px;
 }
 
 .privacy-dropdown__option__content {
@@ -4714,11 +4763,11 @@ a.status-card.compact:hover {
     }
 
     .emoji-mart-search {
-      padding-right: 10px;
+      padding-inline-end: 10px;
     }
 
     .emoji-mart-search-icon {
-      right: 10px + 5px;
+      inset-inline-end: 10px + 5px;
     }
 
     .emoji-mart-scroll {
@@ -4771,7 +4820,7 @@ a.status-card.compact:hover {
 
   display: block;
   padding: 15px;
-  padding-right: 30px;
+  padding-inline-end: 30px;
   line-height: 18px;
   font-size: 16px;
 
@@ -4807,7 +4856,7 @@ a.status-card.compact:hover {
   .fa {
     position: absolute;
     top: 16px;
-    right: 10px;
+    inset-inline-end: 10px;
     z-index: 2;
     display: inline-block;
     opacity: 0;
@@ -4861,7 +4910,7 @@ a.status-card.compact:hover {
 
   .fa {
     display: inline-block;
-    margin-right: 5px;
+    margin-inline-end: 5px;
   }
 }
 
@@ -4880,7 +4929,7 @@ a.status-card.compact:hover {
 
     .fa {
       display: inline-block;
-      margin-right: 5px;
+      margin-inline-end: 5px;
     }
   }
 
@@ -4918,8 +4967,8 @@ a.status-card.compact:hover {
 .modal-root__overlay {
   position: fixed;
   top: 0;
-  left: 0;
-  right: 0;
+  inset-inline-start: 0;
+  inset-inline-end: 0;
   bottom: 0;
   background: rgba($base-overlay-background, 0.7);
   transition: background 0.5s;
@@ -4928,7 +4977,7 @@ a.status-card.compact:hover {
 .modal-root__container {
   position: fixed;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   width: 100%;
   height: 100%;
   box-sizing: border-box;
@@ -4981,16 +5030,16 @@ a.status-card.compact:hover {
 .media-modal__closer {
   position: absolute;
   top: 0;
-  left: 0;
-  right: 0;
+  inset-inline-start: 0;
+  inset-inline-end: 0;
   bottom: 0;
 }
 
 .media-modal__navigation {
   position: absolute;
   top: 0;
-  left: 0;
-  right: 0;
+  inset-inline-start: 0;
+  inset-inline-end: 0;
   bottom: 0;
   pointer-events: none;
   transition: opacity 0.3s linear;
@@ -5033,18 +5082,18 @@ a.status-card.compact:hover {
 }
 
 .media-modal__nav--left {
-  left: 0;
+  inset-inline-start: 0;
 }
 
 .media-modal__nav--right {
-  right: 0;
+  inset-inline-end: 0;
 }
 
 .media-modal__overlay {
   max-width: 600px;
   position: absolute;
-  left: 0;
-  right: 0;
+  inset-inline-start: 0;
+  inset-inline-end: 0;
   bottom: 0;
   margin: 0 auto;
 
@@ -5131,14 +5180,14 @@ a.status-card.compact:hover {
 
 .media-modal__close {
   position: absolute;
-  right: 8px;
+  inset-inline-end: 8px;
   top: 8px;
   z-index: 100;
 }
 
 .media-modal__zoom-button {
   position: absolute;
-  right: 64px;
+  inset-inline-end: 64px;
   top: 8px;
   z-index: 100;
   pointer-events: auto;
@@ -5172,7 +5221,7 @@ a.status-card.compact:hover {
   & > div {
     position: absolute;
     top: 0;
-    left: 0;
+    inset-inline-start: 0;
     width: 100%;
     height: 100%;
     box-sizing: border-box;
@@ -5268,7 +5317,7 @@ a.status-card.compact:hover {
   display: inline-block;
   max-width: 30px;
   max-height: auto;
-  margin-left: 10px;
+  margin-inline-start: 10px;
 }
 
 .boost-modal,
@@ -5323,9 +5372,9 @@ a.status-card.compact:hover {
 
   & > div {
     flex: 1 1 auto;
-    text-align: right;
+    text-align: end;
     color: $lighter-text-color;
-    padding-right: 10px;
+    padding-inline-end: 10px;
   }
 
   .button {
@@ -5528,7 +5577,7 @@ a.status-card.compact:hover {
     & > span {
       font-size: 17px;
       font-weight: 500;
-      margin-left: 10px;
+      margin-inline-start: 10px;
     }
   }
 
@@ -5552,11 +5601,11 @@ a.status-card.compact:hover {
   }
 
   .emoji-mart-search {
-    padding-right: 10px;
+    padding-inline-end: 10px;
   }
 
   .emoji-mart-search-icon {
-    right: 10px + 5px;
+    inset-inline-end: 10px + 5px;
   }
 }
 
@@ -5619,7 +5668,7 @@ a.status-card.compact:hover {
 
 .report-modal__comment {
   padding: 20px;
-  border-right: 1px solid $ui-secondary-color;
+  border-inset-inline-end: 1px solid $ui-secondary-color;
   max-width: 320px;
 
   p {
@@ -5717,7 +5766,7 @@ a.status-card.compact:hover {
         }
 
         button:first-child {
-          margin-right: 10px;
+          margin-inline-end: 10px;
         }
       }
     }
@@ -5781,7 +5830,7 @@ a.status-card.compact:hover {
     border: 1px solid darken($simple-background-color, 14%);
     border-radius: 4px;
     padding: 6px 10px;
-    padding-right: 30px;
+    padding-inline-end: 30px;
   }
 }
 
@@ -5805,7 +5854,7 @@ a.status-card.compact:hover {
     &__label {
       color: $inverted-text-color;
       margin: 0;
-      margin-left: 8px;
+      margin-inline-start: 8px;
     }
   }
 }
@@ -5816,7 +5865,7 @@ a.status-card.compact:hover {
   .report-modal__close {
     position: absolute;
     top: 10px;
-    right: 10px;
+    inset-inline-end: 10px;
   }
 }
 
@@ -5867,7 +5916,7 @@ a.status-card.compact:hover {
   height: 3px;
   position: fixed;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   z-index: 9999;
 }
 
@@ -5877,7 +5926,7 @@ a.status-card.compact:hover {
   color: $primary-text-color;
   background: rgba($base-overlay-background, 0.5);
   bottom: 6px;
-  left: 6px;
+  inset-inline-start: 6px;
   padding: 2px 6px;
   border-radius: 2px;
   font-size: 11px;
@@ -5910,7 +5959,7 @@ a.status-card.compact:hover {
     color: $dark-text-color;
     padding: 8px 18px;
     cursor: default;
-    border-right: 1px solid lighten($ui-base-color, 8%);
+    border-inset-inline-end: 1px solid lighten($ui-base-color, 8%);
     display: flex;
     flex-direction: column;
     align-items: center;
@@ -5925,7 +5974,7 @@ a.status-card.compact:hover {
   &__list {
     list-style: none;
     padding: 4px 0;
-    padding-left: 8px;
+    padding-inline-start: 8px;
     display: flex;
     flex-direction: column;
     justify-content: center;
@@ -5975,7 +6024,7 @@ a.status-card.compact:hover {
   border: 0;
   box-sizing: border-box;
   display: block;
-  float: left;
+  float: inline-start;
   position: relative;
   border-radius: 4px;
   overflow: hidden;
@@ -6013,7 +6062,7 @@ a.status-card.compact:hover {
   object-fit: cover;
   position: absolute;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   z-index: 0;
   background: $base-overlay-background;
 
@@ -6181,8 +6230,8 @@ a.status-card.compact:hover {
     position: absolute;
     z-index: 2;
     bottom: 0;
-    left: 0;
-    right: 0;
+    inset-inline-start: 0;
+    inset-inline-end: 0;
     box-sizing: border-box;
     background: linear-gradient(
       0deg,
@@ -6210,7 +6259,7 @@ a.status-card.compact:hover {
     display: none;
     position: absolute;
     top: 0;
-    left: 0;
+    inset-inline-start: 0;
     width: 100%;
     height: 100%;
     z-index: 4;
@@ -6326,7 +6375,7 @@ a.status-card.compact:hover {
     &.active {
       overflow: visible;
       width: 50px;
-      margin-right: 16px;
+      margin-inline-end: 16px;
     }
 
     &::before {
@@ -6337,7 +6386,7 @@ a.status-card.compact:hover {
       display: block;
       position: absolute;
       height: 4px;
-      left: 0;
+      inset-inline-start: 0;
       top: 50%;
       transform: translate(0, -50%);
     }
@@ -6347,7 +6396,7 @@ a.status-card.compact:hover {
       position: absolute;
       height: 4px;
       border-radius: 4px;
-      left: 0;
+      inset-inline-start: 0;
       top: 50%;
       transform: translate(0, -50%);
       background: lighten($ui-highlight-color, 8%);
@@ -6360,8 +6409,8 @@ a.status-card.compact:hover {
       width: 12px;
       height: 12px;
       top: 50%;
-      left: 0;
-      margin-left: -6px;
+      inset-inline-start: 0;
+      margin-inline-start: -6px;
       transform: translate(0, -50%);
       background: lighten($ui-highlight-color, 8%);
       box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
@@ -6432,7 +6481,7 @@ a.status-card.compact:hover {
       width: 12px;
       height: 12px;
       top: 10px;
-      margin-left: -6px;
+      margin-inline-start: -6px;
       background: lighten($ui-highlight-color, 8%);
       box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
 
@@ -6508,7 +6557,7 @@ a.status-card.compact:hover {
   &__icons {
     position: absolute;
     top: 50%;
-    left: 50%;
+    inset-inline-start: 50%;
     transform: translate(-50%, -50%);
     font-size: 24px;
   }
@@ -6551,7 +6600,7 @@ a.status-card.compact:hover {
         content: '';
         position: absolute;
         bottom: 0;
-        left: 50%;
+        inset-inline-start: 50%;
         width: 0;
         height: 0;
         transform: translateX(-50%);
@@ -6627,7 +6676,7 @@ a.status-card.compact:hover {
     width: 18px;
     height: 18px;
     flex: 0 0 auto;
-    margin-right: 10px;
+    margin-inline-end: 10px;
     top: -1px;
     border-radius: 50%;
     vertical-align: middle;
@@ -6704,10 +6753,10 @@ noscript {
 
   .navigation-bar {
     & > a:first-child {
-      will-change: margin-top, margin-left, margin-right, width;
+      will-change: margin-top, margin-inline-start, margin-inline-end, width;
       transition: margin-top $duration $delay,
-        margin-left $duration ($duration + $delay),
-        margin-right $duration ($duration + $delay);
+        margin-inline-start $duration ($duration + $delay),
+        margin-inline-end $duration ($duration + $delay);
     }
 
     & > .navigation-bar__profile-edit {
@@ -6889,7 +6938,7 @@ noscript {
   cursor: pointer;
   position: absolute;
   top: 0;
-  left: 0;
+  inset-inline-start: 0;
   width: 100%;
   height: 100%;
   background: rgba($base-overlay-background, 0.5);
@@ -7027,13 +7076,13 @@ noscript {
     width: 100%;
     height: 100%;
     top: 0;
-    left: 0;
+    inset-inline-start: 0;
   }
 
   &__preview {
     position: absolute;
     bottom: 10px;
-    right: 10px;
+    inset-inline-end: 10px;
     z-index: 2;
     cursor: move;
     transition: opacity 0.1s ease;
@@ -7110,7 +7159,7 @@ noscript {
   &__info {
     position: absolute;
     top: 10px;
-    left: 10px;
+    inset-inline-start: 10px;
   }
 
   &__image {
@@ -7153,7 +7202,7 @@ noscript {
     padding-top: 10px;
     gap: 8px;
     overflow: hidden;
-    margin-left: -2px; // aligns the pfp with content below
+    margin-inline-start: -2px; // aligns the pfp with content below
 
     &__buttons {
       display: flex;
@@ -7356,6 +7405,19 @@ noscript {
   }
 }
 
+.verified-badge {
+  display: inline-flex;
+  align-items: center;
+  color: $valid-value-color;
+  gap: 4px;
+
+  a {
+    color: inherit;
+    font-weight: 500;
+    text-decoration: none;
+  }
+}
+
 .trends {
   &__header {
     color: $dark-text-color;
@@ -7368,7 +7430,7 @@ noscript {
 
     .fa {
       display: inline-block;
-      margin-right: 5px;
+      margin-inline-end: 5px;
     }
   }
 
@@ -7418,7 +7480,7 @@ noscript {
       flex: 0 0 auto;
       font-size: 24px;
       font-weight: 500;
-      text-align: right;
+      text-align: end;
       color: $secondary-text-color;
       text-decoration: none;
     }
@@ -7523,7 +7585,7 @@ noscript {
   &__content {
     flex: 1 1 auto;
     padding: 10px 5px;
-    padding-right: 15px;
+    padding-inline-end: 15px;
     overflow: hidden;
 
     &__info {
@@ -7536,7 +7598,7 @@ noscript {
     &__relative-time {
       font-size: 15px;
       color: $darker-text-color;
-      padding-left: 15px;
+      padding-inline-start: 15px;
     }
 
     &__names {
@@ -7626,13 +7688,13 @@ noscript {
       display: block;
       font-weight: 500;
       margin-bottom: 10px;
-      padding-right: 18px;
+      padding-inline-end: 18px;
     }
 
     &__unread {
       position: absolute;
       top: 19px;
-      right: 19px;
+      inset-inline-end: 19px;
       display: block;
       background: $highlight-text-color;
       border-radius: 50%;
@@ -7646,7 +7708,7 @@ noscript {
     color: $darker-text-color;
     position: absolute;
     bottom: 3px;
-    right: 0;
+    inset-inline-end: 0;
   }
 }
 
@@ -7663,7 +7725,7 @@ noscript {
   flex-wrap: wrap;
   align-items: center;
   margin-top: 15px;
-  margin-left: -2px;
+  margin-inline-start: -2px;
   width: calc(100% - (90px - 33px));
 
   &__item {
@@ -7704,7 +7766,7 @@ noscript {
       font-size: 13px;
       font-weight: 500;
       text-align: center;
-      margin-left: 6px;
+      margin-inline-start: 6px;
       color: $darker-text-color;
     }
 
@@ -7783,10 +7845,10 @@ noscript {
       content: '';
       position: absolute;
       top: 0;
-      left: 0;
+      inset-inline-start: 0;
       width: 100%;
       height: 100%;
-      border-left: 4px solid $highlight-text-color;
+      border-inset-inline-start: 4px solid $highlight-text-color;
       pointer-events: none;
     }
   }
@@ -7795,7 +7857,7 @@ noscript {
 .picture-in-picture {
   position: fixed;
   bottom: 20px;
-  right: 20px;
+  inset-inline-end: 20px;
   width: 300px;
 
   &__footer {
@@ -7821,7 +7883,7 @@ noscript {
     }
 
     .account__avatar {
-      margin-right: 10px;
+      margin-inline-end: 10px;
     }
 
     .display-name {
@@ -7887,7 +7949,7 @@ noscript {
   &__close {
     position: absolute;
     top: 10px;
-    right: 10px;
+    inset-inline-end: 10px;
   }
 
   h2 {
@@ -7922,7 +7984,7 @@ noscript {
 
   .search .fa {
     top: 10px;
-    right: 10px;
+    inset-inline-end: 10px;
     color: $dark-text-color;
   }
 
@@ -8006,7 +8068,7 @@ noscript {
       object-fit: fill;
       position: absolute;
       top: 0;
-      left: 0;
+      inset-inline-start: 0;
       z-index: 0;
 
       &--hidden {
@@ -8092,7 +8154,7 @@ noscript {
   }
 
   .account__avatar-wrapper {
-    margin-left: 0;
+    margin-inline-start: 0;
   }
 
   .spacer {
@@ -8312,7 +8374,7 @@ noscript {
     &::before {
       content: counter(list-counter) '.';
       position: absolute;
-      left: 0;
+      inset-inline-start: 0;
     }
   }
 
@@ -8324,13 +8386,13 @@ noscript {
     width: 0.375em;
     height: 0.375em;
     top: 0.5em;
-    left: 0.25em;
+    inset-inline-start: 0.25em;
   }
 
   ul > li,
   ol > li {
     position: relative;
-    padding-left: 1.75em;
+    padding-inline-start: 1.75em;
   }
 
   & > ul > li p {
@@ -8463,7 +8525,7 @@ noscript {
   &__preview {
     position: absolute;
     top: 0;
-    left: 0;
+    inset-inline-start: 0;
     width: 100%;
     height: 100%;
     object-fit: cover;
@@ -8669,7 +8731,7 @@ noscript {
   }
 
   .account__avatar-wrapper {
-    margin-left: 0;
+    margin-inline-start: 0;
   }
 
   .account__relationship {
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index b49b93984..fb71ad034 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -18,7 +18,7 @@
 
     .logo {
       height: 42px;
-      margin-right: 10px;
+      margin-inline-end: 10px;
     }
 
     a {
@@ -73,7 +73,7 @@
   .avatar {
     width: 40px;
     height: 40px;
-    margin-right: 10px;
+    margin-inline-end: 10px;
 
     img {
       width: 100%;
@@ -101,6 +101,6 @@
     display: block;
     font-size: 32px;
     line-height: 40px;
-    margin-left: 10px;
+    margin-inline-start: 10px;
   }
 }
diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss
index 0d7a7df2e..c7247c3a5 100644
--- a/app/javascript/styles/mastodon/emoji_picker.scss
+++ b/app/javascript/styles/mastodon/emoji_picker.scss
@@ -71,7 +71,7 @@
 .emoji-mart-anchor-bar {
   position: absolute;
   bottom: -5px;
-  left: 0;
+  inset-inline-start: 0;
   width: 100%;
   height: 4px;
   background-color: $highlight-text-color;
@@ -106,7 +106,7 @@
 
 .emoji-mart-search {
   padding: 10px;
-  padding-right: 45px;
+  padding-inline-end: 45px;
   background: $simple-background-color;
   position: relative;
 
@@ -114,7 +114,7 @@
     font-size: 16px;
     font-weight: 400;
     padding: 7px 9px;
-    padding-right: 25px;
+    padding-inline-end: 25px;
     font-family: inherit;
     display: block;
     width: 100%;
@@ -142,7 +142,7 @@
 .emoji-mart-search-icon {
   position: absolute;
   top: 18px;
-  right: 45px + 5px;
+  inset-inline-end: 45px + 5px;
   z-index: 2;
   padding: 2px 5px 1px;
   border: 0;
@@ -177,7 +177,7 @@
     content: '';
     position: absolute;
     top: 0;
-    left: 0;
+    inset-inline-start: 0;
     width: 100%;
     height: 100%;
     background-color: rgba($ui-secondary-color, 0.7);
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index e4539deff..7d4bde5e9 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -54,12 +54,12 @@ code {
 
       .radio > label {
         position: relative;
-        padding-left: 28px;
+        padding-inline-start: 28px;
 
         input {
           position: absolute;
           top: -2px;
-          left: 0;
+          inset-inline-start: 0;
         }
       }
     }
@@ -79,7 +79,7 @@ code {
 
       .label_input,
       .hint {
-        padding-left: 28px;
+        padding-inline-start: 28px;
       }
 
       .label_input__wrapper {
@@ -89,7 +89,7 @@ code {
       label.checkbox {
         position: absolute;
         top: 2px;
-        left: 0;
+        inset-inline-start: 0;
       }
 
       label a {
@@ -159,7 +159,7 @@ code {
 
     li {
       list-style: disc;
-      margin-left: 18px;
+      margin-inline-start: 18px;
     }
   }
 
@@ -225,7 +225,7 @@ code {
 
     &.select .hint {
       margin-top: 6px;
-      margin-left: 150px;
+      margin-inline-start: 150px;
     }
   }
 
@@ -380,13 +380,13 @@ code {
         width: auto;
         position: relative;
         padding-top: 5px;
-        padding-left: 25px;
+        padding-inline-start: 25px;
         flex: 1 1 auto;
       }
 
       input[type='checkbox'] {
         position: absolute;
-        left: 0;
+        inset-inline-start: 0;
         top: 5px;
         margin: 0;
       }
@@ -517,10 +517,10 @@ code {
     font-weight: 500;
     outline: 0;
     margin-bottom: 10px;
-    margin-right: 10px;
+    margin-inline-end: 10px;
 
     &:last-child {
-      margin-right: 0;
+      margin-inline-end: 0;
     }
 
     &:active,
@@ -572,8 +572,8 @@ code {
       no-repeat right 8px center / auto 16px;
     border: 1px solid darken($ui-base-color, 14%);
     border-radius: 4px;
-    padding-left: 10px;
-    padding-right: 30px;
+    padding-inline-start: 10px;
+    padding-inline-end: 30px;
     height: 41px;
   }
 
@@ -588,7 +588,7 @@ code {
 
     &__append {
       position: absolute;
-      right: 3px;
+      inset-inline-end: 3px;
       top: 1px;
       padding: 10px;
       padding-bottom: 9px;
@@ -606,7 +606,7 @@ code {
         display: block;
         position: absolute;
         top: 0;
-        right: 0;
+        inset-inline-end: 0;
         bottom: 1px;
         width: 5px;
         background-image: linear-gradient(
@@ -780,7 +780,7 @@ code {
 
   li {
     display: inline-block;
-    margin-right: 10px;
+    margin-inline-end: 10px;
   }
 
   a {
@@ -939,7 +939,7 @@ code {
 
   .actions {
     padding: 30px 0;
-    padding-right: 20px;
+    padding-inline-end: 20px;
     flex: 0 0 auto;
   }
 }
@@ -992,7 +992,7 @@ code {
   border-radius: 4px;
   display: flex;
   align-items: center;
-  padding-right: 4px;
+  padding-inline-end: 4px;
   position: relative;
   top: 1px;
   transition: border-color 300ms linear;
diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss
index 6170877b2..29b1f162b 100644
--- a/app/javascript/styles/mastodon/modal.scss
+++ b/app/javascript/styles/mastodon/modal.scss
@@ -25,7 +25,7 @@
       height: 100%;
       position: absolute;
       bottom: 0;
-      left: 0;
+      inset-inline-start: 0;
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index b30932e04..bdb87d7cf 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -269,7 +269,7 @@
     border: 1px solid darken($simple-background-color, 14%);
     border-radius: 4px;
     padding: 6px 10px;
-    padding-right: 30px;
+    padding-inline-end: 30px;
   }
 
   .icon-button.disabled {
diff --git a/app/javascript/styles/mastodon/rich_text.scss b/app/javascript/styles/mastodon/rich_text.scss
index 35901984b..aa41e4ad3 100644
--- a/app/javascript/styles/mastodon/rich_text.scss
+++ b/app/javascript/styles/mastodon/rich_text.scss
@@ -13,8 +13,8 @@
   }
 
   blockquote {
-    padding-left: 10px;
-    border-left: 3px solid $darker-text-color;
+    padding-inline-start: 10px;
+    border-inset-inline-start: 3px solid $darker-text-color;
     color: $darker-text-color;
     white-space: normal;
 
@@ -40,7 +40,7 @@
 
   ul,
   ol {
-    margin-left: 2em;
+    margin-inline-start: 2em;
 
     p {
       margin: 0;
diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss
index e60087dab..726135c58 100644
--- a/app/javascript/styles/mastodon/rtl.scss
+++ b/app/javascript/styles/mastodon/rtl.scss
@@ -1,273 +1,30 @@
 body.rtl {
   direction: rtl;
 
-  .column-header > button {
-    text-align: right;
-    padding-left: 0;
-    padding-right: 15px;
-  }
-
-  .radio-button__input {
-    margin-right: 0;
-    margin-left: 10px;
-  }
-
-  .display-name,
-  .announcements__item {
-    text-align: right;
-  }
-
-  .announcements__item__range {
-    padding-right: 0;
-    padding-left: 18px;
-  }
-
   .reactions-bar {
-    margin-left: auto;
-    margin-right: -2px;
     direction: rtl;
   }
 
-  .reactions-bar__item__count {
-    margin-left: 0;
-    margin-right: 6px;
-  }
-
-  .announcements__pagination {
-    right: auto;
-    left: 0;
-  }
-
-  .notification__message {
-    margin-left: 0;
-    margin-right: 68px;
-  }
-
   .announcements__mastodon,
   .drawer__inner__mastodon > img {
     transform: scaleX(-1);
   }
 
-  .notification__favourite-icon-wrapper {
-    left: auto;
-    right: -26px;
-  }
-
-  .column-link__icon,
-  .column-header__icon {
-    margin-right: 0;
-    margin-left: 5px;
-  }
-
-  .compose-form .compose-form__buttons-wrapper .character-counter__wrapper {
-    margin-right: 0;
-    margin-left: 4px;
-  }
-
-  .navigation-bar__profile {
-    margin-left: 0;
-    margin-right: 8px;
-  }
-
-  .search__input {
+  .compose-form .autosuggest-textarea__textarea {
     padding-right: 10px;
-    padding-left: 30px;
-  }
-
-  .search__icon .fa {
-    right: auto;
-    left: 10px;
+    padding-left: 10px + 22px;
   }
 
   .columns-area {
     direction: rtl;
   }
 
-  .column-header__buttons {
-    left: 0;
-    right: auto;
-    margin-left: 0;
-    margin-right: -15px;
-  }
-
-  .column-inline-form .icon-button {
-    margin-left: 0;
-    margin-right: 5px;
-  }
-
-  .column-header__links .text-btn {
-    margin-left: 10px;
-    margin-right: 0;
-  }
-
-  .account__avatar-wrapper {
-    float: right;
-  }
-
-  .column-header__back-button {
-    padding-left: 5px;
-    padding-right: 0;
-  }
-
-  .column-header__setting-arrows {
-    float: left;
-
-    .column-header__setting-btn {
-      &:first-child {
-        padding-left: 7px;
-        padding-right: 5px;
-      }
-
-      &:last-child {
-        padding-right: 7px;
-        padding-left: 5px;
-        margin-right: 5px;
-        margin-left: 0;
-      }
-    }
-  }
-
-  .setting-toggle__label {
-    margin-left: 0;
-    margin-right: 8px;
-  }
-
-  .account__header__tabs__buttons > .icon-button {
-    margin-right: 0;
-    margin-left: 8px;
-  }
-
-  .account__avatar-overlay-overlay {
-    right: auto;
-    left: 0;
-  }
-
-  .column-back-button--slim-button {
-    right: auto;
-    left: 0;
-  }
-
-  .status__action-bar {
-    &__counter {
-      margin-right: 0;
-      margin-left: 11px;
-
-      .status__action-bar-button {
-        margin-right: 0;
-        margin-left: 4px;
-      }
-    }
-  }
-
-  .privacy-dropdown__dropdown {
-    margin-left: 0;
-    margin-right: 40px;
-  }
-
-  .privacy-dropdown__option__icon {
-    margin-left: 10px;
-    margin-right: 0;
-  }
-
-  .picture-in-picture__header__account .display-name,
-  .detailed-status__display-name .display-name {
-    text-align: right;
-  }
-
-  .detailed-status__display-avatar {
-    margin-right: 0;
-    margin-left: 10px;
-  }
-
-  .picture-in-picture__header__account .account__avatar {
-    margin-right: 0;
-    margin-left: 10px;
-  }
-
-  .icon-button__counter {
-    margin-left: 0;
-    margin-right: 4px;
-  }
-
-  .notifications-permission-banner__close {
-    right: auto;
-    left: 10px;
-  }
-
-  .detailed-status__favorites,
-  .detailed-status__reblogs {
-    margin-left: 0;
-    margin-right: 6px;
-  }
-
-  .fa-ul {
-    margin-left: 2.14285714em;
-  }
-
-  .fa-li {
-    left: auto;
-    right: -2.14285714em;
-  }
-
   .admin-wrapper {
     direction: rtl;
   }
 
-  .admin-wrapper .sidebar ul a i.fa,
-  a.table-action-link i.fa {
-    margin-right: 0;
-    margin-left: 5px;
-  }
-
-  .simple_form .check_boxes .checkbox label {
-    padding-left: 0;
-    padding-right: 25px;
-  }
-
-  .simple_form .input.with_label.boolean label.checkbox {
-    padding-left: 25px;
-    padding-right: 0;
-  }
-
-  .simple_form .check_boxes .checkbox input[type='checkbox'],
-  .simple_form .input.boolean input[type='checkbox'] {
-    left: auto;
-    right: 0;
-  }
-
-  .simple_form .input.radio_buttons .radio {
-    left: auto;
-    right: 0;
-  }
-
-  .simple_form .input.radio_buttons .radio > label {
-    padding-right: 28px;
-    padding-left: 0;
-  }
-
-  .simple_form .input-with-append .input input {
-    padding-left: 142px;
-    padding-right: 0;
-  }
-
-  .simple_form .input.boolean label.checkbox {
-    left: auto;
-    right: 0;
-  }
-
-  .simple_form .input.boolean .label_input,
-  .simple_form .input.boolean .hint {
-    padding-left: 0;
-    padding-right: 28px;
-  }
-
   .simple_form .label_input__append {
-    right: auto;
-    left: 3px;
-
     &::after {
-      right: auto;
-      left: 0;
       background-image: linear-gradient(
         to left,
         rgba(darken($ui-base-color, 10%), 0),
@@ -282,49 +39,6 @@ body.rtl {
       no-repeat left 8px center / auto 16px;
   }
 
-  .table th,
-  .table td {
-    text-align: right;
-  }
-
-  .filters .filter-subset {
-    margin-right: 0;
-    margin-left: 45px;
-  }
-
-  @media screen and (min-width: 631px) {
-    .column,
-    .drawer {
-      padding-left: 5px;
-      padding-right: 5px;
-
-      &:first-child {
-        padding-left: 5px;
-        padding-right: 10px;
-      }
-    }
-
-    .columns-area > div {
-      .column,
-      .drawer {
-        padding-left: 5px;
-        padding-right: 5px;
-      }
-    }
-  }
-
-  .columns-area--mobile .column,
-  .columns-area--mobile .drawer {
-    padding-left: 0;
-    padding-right: 0;
-  }
-
-  .card__bar .display-name {
-    margin-left: 0;
-    margin-right: 15px;
-    text-align: right;
-  }
-
   .fa-chevron-left::before {
     content: '\F054';
   }
@@ -332,19 +46,4 @@ body.rtl {
   .fa-chevron-right::before {
     content: '\F053';
   }
-
-  .column-back-button__icon {
-    margin-right: 0;
-    margin-left: 5px;
-  }
-
-  .simple_form .input.radio_buttons .radio > label input {
-    left: auto;
-    right: 0;
-  }
-
-  .picture-in-picture {
-    right: auto;
-    left: 20px;
-  }
 }
diff --git a/app/javascript/styles/mastodon/statuses.scss b/app/javascript/styles/mastodon/statuses.scss
index a42f1f42c..6c9ea916a 100644
--- a/app/javascript/styles/mastodon/statuses.scss
+++ b/app/javascript/styles/mastodon/statuses.scss
@@ -97,7 +97,7 @@
     width: 20px;
     height: auto;
     vertical-align: middle;
-    margin-right: 5px;
+    margin-inline-end: 5px;
     fill: $primary-text-color;
   }
 
@@ -162,7 +162,7 @@ a.button.logo-button {
     min-height: 48px + 2px;
 
     &__avatar {
-      left: 15px;
+      inset-inline-start: 15px;
       top: 17px;
 
       .account__avatar {
@@ -176,12 +176,12 @@ a.button.logo-button {
     }
 
     &__prepend {
-      margin-left: 48px + 15px * 2;
+      margin-inline-start: 48px + 15px * 2;
       padding-top: 15px;
     }
 
     &__prepend-icon-wrapper {
-      left: -32px;
+      inset-inline-start: -32px;
     }
 
     .media-gallery,
diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss
index b644b38f1..fb1ff0781 100644
--- a/app/javascript/styles/mastodon/tables.scss
+++ b/app/javascript/styles/mastodon/tables.scss
@@ -10,7 +10,7 @@
     line-height: 18px;
     vertical-align: top;
     border-top: 1px solid $ui-base-color;
-    text-align: left;
+    text-align: start;
     background: darken($ui-base-color, 4%);
   }
 
@@ -91,12 +91,12 @@
 
       &:first-child {
         border-radius: 4px 0 0;
-        border-left: 1px solid darken($ui-base-color, 8%);
+        border-inset-inline-start: 1px solid darken($ui-base-color, 8%);
       }
 
       &:last-child {
         border-radius: 0 4px 0 0;
-        border-right: 1px solid darken($ui-base-color, 8%);
+        border-inset-inline-end: 1px solid darken($ui-base-color, 8%);
       }
     }
   }
@@ -125,7 +125,7 @@ button.table-action-link,
 a.table-action-link {
   text-decoration: none;
   display: inline-block;
-  margin-right: 5px;
+  margin-inline-end: 5px;
   padding: 0 10px;
   color: $darker-text-color;
   font-weight: 500;
@@ -136,11 +136,11 @@ a.table-action-link {
 
   i.fa {
     font-weight: 400;
-    margin-right: 5px;
+    margin-inline-end: 5px;
   }
 
   &:first-child {
-    padding-left: 0;
+    padding-inline-start: 0;
   }
 }
 
@@ -172,7 +172,7 @@ a.table-action-link {
     &__actions,
     &__content {
       padding: 8px 0;
-      padding-right: 16px;
+      padding-inline-end: 16px;
       flex: 1 1 auto;
     }
   }
@@ -188,8 +188,8 @@ a.table-action-link {
     align-items: center;
 
     &__actions {
-      text-align: right;
-      padding-right: 16px - 5px;
+      text-align: end;
+      padding-inline-end: 16px - 5px;
     }
   }
 
@@ -296,7 +296,7 @@ a.table-action-link {
         display: flex;
         justify-content: center;
         align-items: center;
-        margin-right: 10px;
+        margin-inline-end: 10px;
 
         .emojione {
           width: 32px;
@@ -315,7 +315,7 @@ a.table-action-link {
 
       &__extra {
         flex: 0 0 auto;
-        text-align: right;
+        text-align: end;
         color: $darker-text-color;
         font-weight: 500;
       }
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index ef7bfc6de..1f69f0cf0 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -39,8 +39,8 @@
       width: 20px;
       height: 20px;
       margin: -3px 0 0;
-      margin-left: 0.075em;
-      margin-right: 0.075em;
+      margin-inline-start: 0.075em;
+      margin-inline-end: 0.075em;
     }
 
     p {
@@ -171,7 +171,7 @@
     margin-bottom: 15px;
 
     .fa {
-      margin-right: 5px;
+      margin-inline-end: 5px;
       color: $darker-text-color;
     }
   }
@@ -284,7 +284,7 @@
     }
 
     .trends__item__current {
-      padding-right: 0;
+      padding-inline-end: 0;
     }
   }
 }
@@ -309,7 +309,7 @@
     padding: 10px;
 
     &:first-child {
-      text-align: left;
+      text-align: start;
     }
   }
 
@@ -340,9 +340,9 @@
 
   tbody td.accounts-table__extra {
     width: 120px;
-    text-align: right;
+    text-align: end;
     color: $darker-text-color;
-    padding-right: 16px;
+    padding-inline-end: 16px;
 
     a {
       text-decoration: none;
@@ -363,7 +363,7 @@
 
   tbody td.accounts-table__interrelationships {
     width: 21px;
-    padding-right: 16px;
+    padding-inline-end: 16px;
   }
 
   .fa {
diff --git a/app/lib/admin/metrics/retention.rb b/app/lib/admin/metrics/retention.rb
index f6135ac1e..9bd47c58e 100644
--- a/app/lib/admin/metrics/retention.rb
+++ b/app/lib/admin/metrics/retention.rb
@@ -42,25 +42,54 @@ class Admin::Metrics::Retention
   end
 
   def perform_query
-    sql = <<-SQL.squish
+    report_rows.each_with_object([]) do |row, arr|
+      current_cohort = arr.last
+
+      if current_cohort.nil? || current_cohort.period != row['cohort_period']
+        current_cohort = Cohort.new(period: row['cohort_period'], frequency: @frequency, data: [])
+        arr << current_cohort
+      end
+
+      value, rate = row['retention_value_and_rate'].delete('{}').split(',')
+
+      current_cohort.data << CohortData.new(
+        date: row['retention_period'],
+        rate: rate.to_f,
+        value: value.to_s
+      )
+    end
+  end
+
+  def report_rows
+    ActiveRecord::Base.connection.select_all(sanitized_sql_string)
+  end
+
+  def sanitized_sql_string
+    ActiveRecord::Base.sanitize_sql_array(
+      [sql_query_string, { start_at: @start_at, end_at: @end_at, frequency: @frequency }]
+    )
+  end
+
+  def sql_query_string
+    <<~SQL.squish
       SELECT axis.*, (
         WITH new_users AS (
           SELECT users.id
           FROM users
-          WHERE date_trunc($3, users.created_at)::date = axis.cohort_period
+          WHERE date_trunc(:frequency, users.created_at)::date = axis.cohort_period
         ),
         retained_users AS (
           SELECT users.id
           FROM users
           INNER JOIN new_users on new_users.id = users.id
-          WHERE date_trunc($3, users.current_sign_in_at) >= axis.retention_period
+          WHERE date_trunc(:frequency, users.current_sign_in_at) >= axis.retention_period
         )
         SELECT ARRAY[count(*), (count(*))::float / (SELECT GREATEST(count(*), 1) FROM new_users)] AS retention_value_and_rate
         FROM retained_users
       )
       FROM (
         WITH cohort_periods AS (
-          SELECT generate_series(date_trunc($3, $1::timestamp)::date, date_trunc($3, $2::timestamp)::date, ('1 ' || $3)::interval) AS cohort_period
+          SELECT generate_series(date_trunc(:frequency, :start_at::timestamp)::date, date_trunc(:frequency, :end_at::timestamp)::date, ('1 ' || :frequency)::interval) AS cohort_period
         ),
         retention_periods AS (
           SELECT cohort_period AS retention_period FROM cohort_periods
@@ -70,24 +99,5 @@ class Admin::Metrics::Retention
         WHERE retention_period >= cohort_period
       ) as axis
     SQL
-
-    rows = ActiveRecord::Base.connection.select_all(sql, nil, [[nil, @start_at], [nil, @end_at], [nil, @frequency]])
-
-    rows.each_with_object([]) do |row, arr|
-      current_cohort = arr.last
-
-      if current_cohort.nil? || current_cohort.period != row['cohort_period']
-        current_cohort = Cohort.new(period: row['cohort_period'], frequency: @frequency, data: [])
-        arr << current_cohort
-      end
-
-      value, rate = row['retention_value_and_rate'].delete('{}').split(',')
-
-      current_cohort.data << CohortData.new(
-        date: row['retention_period'],
-        rate: rate.to_f,
-        value: value.to_s
-      )
-    end
   end
 end
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
deleted file mode 100644
index 260077a1c..000000000
--- a/app/lib/user_settings_decorator.rb
+++ /dev/null
@@ -1,180 +0,0 @@
-# frozen_string_literal: true
-
-class UserSettingsDecorator
-  attr_reader :user, :settings
-
-  def initialize(user)
-    @user = user
-  end
-
-  def update(settings)
-    @settings = settings
-    process_update
-  end
-
-  private
-
-  def process_update
-    user.settings['notification_emails'] = merged_notification_emails if change?('notification_emails')
-    user.settings['interactions']        = merged_interactions if change?('interactions')
-    user.settings['default_privacy']     = default_privacy_preference if change?('setting_default_privacy')
-    user.settings['default_sensitive']   = default_sensitive_preference if change?('setting_default_sensitive')
-    user.settings['default_language']    = default_language_preference if change?('setting_default_language')
-    user.settings['unfollow_modal']      = unfollow_modal_preference if change?('setting_unfollow_modal')
-    user.settings['boost_modal']         = boost_modal_preference if change?('setting_boost_modal')
-    user.settings['favourite_modal']     = favourite_modal_preference if change?('setting_favourite_modal')
-    user.settings['delete_modal']        = delete_modal_preference if change?('setting_delete_modal')
-    user.settings['auto_play_gif']       = auto_play_gif_preference if change?('setting_auto_play_gif')
-    user.settings['display_media']       = display_media_preference if change?('setting_display_media')
-    user.settings['expand_spoilers']     = expand_spoilers_preference if change?('setting_expand_spoilers')
-    user.settings['reduce_motion']       = reduce_motion_preference if change?('setting_reduce_motion')
-    user.settings['disable_swiping']     = disable_swiping_preference if change?('setting_disable_swiping')
-    user.settings['system_font_ui']      = system_font_ui_preference if change?('setting_system_font_ui')
-    user.settings['system_emoji_font']   = system_emoji_font_preference if change?('setting_system_emoji_font')
-    user.settings['noindex']             = noindex_preference if change?('setting_noindex')
-    user.settings['hide_followers_count'] = hide_followers_count_preference if change?('setting_hide_followers_count')
-    user.settings['flavour']             = flavour_preference if change?('setting_flavour')
-    user.settings['skin']                = skin_preference if change?('setting_skin')
-    user.settings['aggregate_reblogs']   = aggregate_reblogs_preference if change?('setting_aggregate_reblogs')
-    user.settings['show_application']    = show_application_preference if change?('setting_show_application')
-    user.settings['advanced_layout']     = advanced_layout_preference if change?('setting_advanced_layout')
-    user.settings['default_content_type']= default_content_type_preference if change?('setting_default_content_type')
-    user.settings['use_blurhash']        = use_blurhash_preference if change?('setting_use_blurhash')
-    user.settings['use_pending_items']   = use_pending_items_preference if change?('setting_use_pending_items')
-    user.settings['trends']              = trends_preference if change?('setting_trends')
-    user.settings['crop_images']         = crop_images_preference if change?('setting_crop_images')
-    user.settings['always_send_emails']  = always_send_emails_preference if change?('setting_always_send_emails')
-  end
-
-  def merged_notification_emails
-    user.settings['notification_emails'].merge coerced_settings('notification_emails').to_h
-  end
-
-  def merged_interactions
-    user.settings['interactions'].merge coerced_settings('interactions').to_h
-  end
-
-  def default_privacy_preference
-    settings['setting_default_privacy']
-  end
-
-  def default_sensitive_preference
-    boolean_cast_setting 'setting_default_sensitive'
-  end
-
-  def unfollow_modal_preference
-    boolean_cast_setting 'setting_unfollow_modal'
-  end
-
-  def boost_modal_preference
-    boolean_cast_setting 'setting_boost_modal'
-  end
-
-  def favourite_modal_preference
-    boolean_cast_setting 'setting_favourite_modal'
-  end
-
-  def delete_modal_preference
-    boolean_cast_setting 'setting_delete_modal'
-  end
-
-  def system_font_ui_preference
-    boolean_cast_setting 'setting_system_font_ui'
-  end
-
-  def system_emoji_font_preference
-    boolean_cast_setting 'setting_system_emoji_font'
-  end
-
-  def auto_play_gif_preference
-    boolean_cast_setting 'setting_auto_play_gif'
-  end
-
-  def display_media_preference
-    settings['setting_display_media']
-  end
-
-  def expand_spoilers_preference
-    boolean_cast_setting 'setting_expand_spoilers'
-  end
-
-  def reduce_motion_preference
-    boolean_cast_setting 'setting_reduce_motion'
-  end
-
-  def disable_swiping_preference
-    boolean_cast_setting 'setting_disable_swiping'
-  end
-
-  def noindex_preference
-    boolean_cast_setting 'setting_noindex'
-  end
-
-  def flavour_preference
-    settings['setting_flavour']
-  end
-
-  def skin_preference
-    settings['setting_skin']
-  end
-
-  def hide_followers_count_preference
-    boolean_cast_setting 'setting_hide_followers_count'
-  end
-
-  def show_application_preference
-    boolean_cast_setting 'setting_show_application'
-  end
-
-  def default_language_preference
-    settings['setting_default_language']
-  end
-
-  def aggregate_reblogs_preference
-    boolean_cast_setting 'setting_aggregate_reblogs'
-  end
-
-  def advanced_layout_preference
-    boolean_cast_setting 'setting_advanced_layout'
-  end
-
-  def default_content_type_preference
-    settings['setting_default_content_type']
-  end
-
-  def use_blurhash_preference
-    boolean_cast_setting 'setting_use_blurhash'
-  end
-
-  def use_pending_items_preference
-    boolean_cast_setting 'setting_use_pending_items'
-  end
-
-  def trends_preference
-    boolean_cast_setting 'setting_trends'
-  end
-
-  def crop_images_preference
-    boolean_cast_setting 'setting_crop_images'
-  end
-
-  def always_send_emails_preference
-    boolean_cast_setting 'setting_always_send_emails'
-  end
-
-  def boolean_cast_setting(key)
-    ActiveModel::Type::Boolean.new.cast(settings[key])
-  end
-
-  def coerced_settings(key)
-    coerce_values settings.fetch(key, {})
-  end
-
-  def coerce_values(params_hash)
-    params_hash.transform_values { |x| ActiveModel::Type::Boolean.new.cast(x) }
-  end
-
-  def change?(key)
-    !settings[key].nil?
-  end
-end
diff --git a/app/lib/user_settings_serializer.rb b/app/lib/user_settings_serializer.rb
new file mode 100644
index 000000000..10d1be04d
--- /dev/null
+++ b/app/lib/user_settings_serializer.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class UserSettingsSerializer
+  def self.load(value)
+    json = begin
+      if value.blank?
+        {}
+      else
+        Oj.load(value, symbol_keys: true)
+      end
+    end
+
+    UserSettings.new(json)
+  end
+
+  def self.dump(value)
+    Oj.dump(value.as_json)
+  end
+end
diff --git a/app/models/account.rb b/app/models/account.rb
index f2ed871e7..4fc7b9d08 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -53,7 +53,7 @@
 #
 
 class Account < ApplicationRecord
-  self.ignored_columns = %w(
+  self.ignored_columns += %w(
     subscription_expires_at
     secret
     remote_url
diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb
index 834f8ba4c..0fea7732e 100644
--- a/app/models/account_stat.rb
+++ b/app/models/account_stat.rb
@@ -16,7 +16,7 @@
 
 class AccountStat < ApplicationRecord
   self.locking_column = nil
-  self.ignored_columns = %w(lock_version)
+  self.ignored_columns += %w(lock_version)
 
   belongs_to :account, inverse_of: :account_stat
 
diff --git a/app/models/admin/action_log.rb b/app/models/admin/action_log.rb
index 4fa8008f5..f2c121d75 100644
--- a/app/models/admin/action_log.rb
+++ b/app/models/admin/action_log.rb
@@ -17,7 +17,7 @@
 #
 
 class Admin::ActionLog < ApplicationRecord
-  self.ignored_columns = %w(
+  self.ignored_columns += %w(
     recorded_changes
   )
 
diff --git a/app/models/backup.rb b/app/models/backup.rb
index dca06eb58..5feb31d7d 100644
--- a/app/models/backup.rb
+++ b/app/models/backup.rb
@@ -18,6 +18,6 @@
 class Backup < ApplicationRecord
   belongs_to :user, inverse_of: :backups
 
-  has_attached_file :dump, s3_permissions: 'private'
+  has_attached_file :dump, s3_permissions: ->(*) { ENV['S3_PERMISSION'] == '' ? nil : 'private' }
   validates_attachment_content_type :dump, content_type: /\Aapplication/
 end
diff --git a/app/models/concerns/attachmentable.rb b/app/models/concerns/attachmentable.rb
index 01fae4236..d44c22438 100644
--- a/app/models/concerns/attachmentable.rb
+++ b/app/models/concerns/attachmentable.rb
@@ -5,7 +5,7 @@ require 'mime/types/columnar'
 module Attachmentable
   extend ActiveSupport::Concern
 
-  MAX_MATRIX_LIMIT = 16_777_216 # 4096x4096px or approx. 16MB
+  MAX_MATRIX_LIMIT = 33_177_600 # 7680x4320px or approx. 847MB in RAM
   GIF_MATRIX_LIMIT = 921_600    # 1280x720px
 
   # For some file extensions, there exist different content
diff --git a/app/models/concerns/has_user_settings.rb b/app/models/concerns/has_user_settings.rb
new file mode 100644
index 000000000..b3fa1f683
--- /dev/null
+++ b/app/models/concerns/has_user_settings.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+module HasUserSettings
+  extend ActiveSupport::Concern
+
+  included do
+    serialize :settings, UserSettingsSerializer
+  end
+
+  def settings_attributes=(attributes)
+    settings.update(attributes)
+  end
+
+  def prefers_noindex?
+    settings['noindex']
+  end
+
+  def preferred_posting_language
+    valid_locale_cascade(settings['default_language'], locale, I18n.locale)
+  end
+
+  def setting_auto_play_gif
+    settings['web.auto_play']
+  end
+
+  def setting_default_sensitive
+    settings['default_sensitive']
+  end
+
+  def setting_unfollow_modal
+    settings['web.unfollow_modal']
+  end
+
+  def setting_boost_modal
+    settings['web.reblog_modal']
+  end
+
+  def setting_delete_modal
+    settings['web.delete_modal']
+  end
+
+  def setting_reduce_motion
+    settings['web.reduce_motion']
+  end
+
+  def setting_system_font_ui
+    settings['web.use_system_font']
+  end
+
+  def setting_noindex
+    settings['noindex']
+  end
+
+  def setting_theme
+    settings['theme']
+  end
+
+  def setting_display_media
+    settings['web.display_media']
+  end
+
+  def setting_expand_spoilers
+    settings['web.expand_content_warnings']
+  end
+
+  def setting_default_language
+    settings['default_language']
+  end
+
+  def setting_aggregate_reblogs
+    settings['aggregate_reblogs']
+  end
+
+  def setting_show_application
+    settings['show_application']
+  end
+
+  def setting_advanced_layout
+    settings['web.advanced_layout']
+  end
+
+  def setting_use_blurhash
+    settings['web.use_blurhash']
+  end
+
+  def setting_use_pending_items
+    settings['web.use_pending_items']
+  end
+
+  def setting_trends
+    settings['web.trends']
+  end
+
+  def setting_crop_images
+    settings['web.crop_images']
+  end
+
+  def setting_disable_swiping
+    settings['web.disable_swiping']
+  end
+
+  def setting_always_send_emails
+    settings['always_send_emails']
+  end
+
+  def setting_default_privacy
+    settings['default_privacy'] || (account.locked? ? 'private' : 'public')
+  end
+
+  def allows_report_emails?
+    settings['notification_emails.report']
+  end
+
+  def allows_pending_account_emails?
+    settings['notification_emails.pending_account']
+  end
+
+  def allows_appeal_emails?
+    settings['notification_emails.appeal']
+  end
+
+  def allows_trends_review_emails?
+    settings['notification_emails.trends']
+  end
+
+  def aggregates_reblogs?
+    settings['aggregate_reblogs']
+  end
+
+  def shows_application?
+    settings['show_application']
+  end
+
+  def show_all_media?
+    settings['web.display_media'] == 'show_all'
+  end
+
+  def hide_all_media?
+    settings['web.display_media'] == 'hide_all'
+  end
+end
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index d85e196e9..0f4fd78cb 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -15,7 +15,7 @@
 #
 
 class CustomFilter < ApplicationRecord
-  self.ignored_columns = %w(whole_word irreversible)
+  self.ignored_columns += %w(whole_word irreversible)
 
   alias_attribute :title, :phrase
   alias_attribute :filter_action, :action
diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb
index 276e7d31a..3c9be51ca 100644
--- a/app/models/email_domain_block.rb
+++ b/app/models/email_domain_block.rb
@@ -12,7 +12,7 @@
 #
 
 class EmailDomainBlock < ApplicationRecord
-  self.ignored_columns = %w(
+  self.ignored_columns += %w(
     ips
     last_refresh_at
   )
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 62c9828c6..0367b4af7 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -39,11 +39,11 @@ class MediaAttachment < ApplicationRecord
 
   MAX_DESCRIPTION_LENGTH = 1_500
 
-  IMAGE_LIMIT = (ENV['MAX_IMAGE_SIZE'] || 10.megabytes).to_i
-  VIDEO_LIMIT = (ENV['MAX_VIDEO_SIZE'] || 40.megabytes).to_i
+  IMAGE_LIMIT = (ENV['MAX_IMAGE_SIZE'] || 16.megabytes).to_i
+  VIDEO_LIMIT = (ENV['MAX_VIDEO_SIZE'] || 99.megabytes).to_i
 
-  MAX_VIDEO_MATRIX_LIMIT = 2_304_000 # 1920x1200px
-  MAX_VIDEO_FRAME_RATE   = 60
+  MAX_VIDEO_MATRIX_LIMIT = 8_294_400 # 3840x2160px
+  MAX_VIDEO_FRAME_RATE   = 120
 
   IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif .webp .heic .heif .avif).freeze
   VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze
@@ -69,7 +69,7 @@ class MediaAttachment < ApplicationRecord
 
   IMAGE_STYLES = {
     original: {
-      pixels: 2_073_600, # 1920x1080px
+      pixels: 8_294_400, # 3840x2160px
       file_geometry_parser: FastGeometryParser,
     }.freeze,
 
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index 6bce16562..a738940be 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -36,7 +36,7 @@ class PreviewCard < ApplicationRecord
   include Attachmentable
 
   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
-  LIMIT = 1.megabytes
+  LIMIT = 2.megabytes
 
   BLURHASH_OPTIONS = {
     x_comp: 4,
@@ -121,7 +121,7 @@ class PreviewCard < ApplicationRecord
     def image_styles(file)
       styles = {
         original: {
-          geometry: '400x400>',
+          pixels: 230_400, # 640x360px
           file_geometry_parser: FastGeometryParser,
           convert_options: '-coalesce',
           blurhash: BLURHASH_OPTIONS,
diff --git a/app/models/report.rb b/app/models/report.rb
index a9940459d..c3a0c4c8b 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -21,7 +21,7 @@
 #
 
 class Report < ApplicationRecord
-  self.ignored_columns = %w(action_taken)
+  self.ignored_columns += %w(action_taken)
 
   include Paginable
   include RateLimitable
diff --git a/app/models/status_edit.rb b/app/models/status_edit.rb
index 653a04252..fa35e38ac 100644
--- a/app/models/status_edit.rb
+++ b/app/models/status_edit.rb
@@ -21,7 +21,7 @@
 class StatusEdit < ApplicationRecord
   include RateLimitable
 
-  self.ignored_columns = %w(
+  self.ignored_columns += %w(
     media_attachments_changed
   )
 
diff --git a/app/models/user.rb b/app/models/user.rb
index 744d66c8f..3471bb2c1 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -39,10 +39,11 @@
 #  webauthn_id               :string
 #  sign_up_ip                :inet
 #  role_id                   :bigint(8)
+#  settings                  :text
 #
 
 class User < ApplicationRecord
-  self.ignored_columns = %w(
+  self.ignored_columns += %w(
     remember_created_at
     remember_token
     current_sign_in_ip
@@ -51,9 +52,9 @@ class User < ApplicationRecord
     filtered_languages
   )
 
-  include Settings::Extend
   include Redisable
   include LanguagesHelper
+  include HasUserSettings
 
   # The home and list feeds will be stored in Redis for this amount
   # of time, and status fan-out to followers will include only people
@@ -132,13 +133,6 @@ class User < ApplicationRecord
 
   has_many :session_activations, dependent: :destroy
 
-  delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :favourite_modal, :delete_modal,
-           :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_media, :hide_followers_count,
-           :expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
-           :advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images,
-           :disable_swiping, :always_send_emails, :default_content_type, :system_emoji_font,
-           to: :settings, prefix: :setting, allow_nil: false
-
   delegate :can?, to: :role
 
   attr_reader :invite_code
@@ -303,50 +297,6 @@ class User < ApplicationRecord
     save!
   end
 
-  def prefers_noindex?
-    setting_noindex
-  end
-
-  def preferred_posting_language
-    valid_locale_cascade(settings.default_language, locale, I18n.locale)
-  end
-
-  def setting_default_privacy
-    settings.default_privacy || (account.locked? ? 'private' : 'public')
-  end
-
-  def allows_report_emails?
-    settings.notification_emails['report']
-  end
-
-  def allows_pending_account_emails?
-    settings.notification_emails['pending_account']
-  end
-
-  def allows_appeal_emails?
-    settings.notification_emails['appeal']
-  end
-
-  def allows_trending_tags_review_emails?
-    settings.notification_emails['trending_tag']
-  end
-
-  def allows_trending_links_review_emails?
-    settings.notification_emails['trending_link']
-  end
-
-  def allows_trending_statuses_review_emails?
-    settings.notification_emails['trending_status']
-  end
-
-  def aggregates_reblogs?
-    @aggregates_reblogs ||= settings.aggregate_reblogs
-  end
-
-  def shows_application?
-    @shows_application ||= settings.show_application
-  end
-
   def token_for_app(app)
     return nil if app.nil? || app.owner != self
 
@@ -426,14 +376,6 @@ class User < ApplicationRecord
     send_reset_password_instructions
   end
 
-  def show_all_media?
-    setting_display_media == 'show_all'
-  end
-
-  def hide_all_media?
-    setting_display_media == 'hide_all'
-  end
-
   protected
 
   def send_devise_notification(notification, *args, **kwargs)
@@ -503,7 +445,8 @@ class User < ApplicationRecord
   def sanitize_languages
     return if chosen_languages.nil?
 
-    chosen_languages.reject!(&:blank?)
+    chosen_languages.compact_blank!
+
     self.chosen_languages = nil if chosen_languages.empty?
   end
 
diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb
new file mode 100644
index 000000000..2c025d6c5
--- /dev/null
+++ b/app/models/user_settings.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+class UserSettings
+  class Error < StandardError; end
+  class KeyError < Error; end
+
+  include UserSettings::DSL
+  include UserSettings::Glue
+
+  setting :always_send_emails, default: false
+  setting :aggregate_reblogs, default: true
+  setting :theme, default: -> { ::Setting.theme }
+  setting :noindex, default: -> { ::Setting.noindex }
+  setting :show_application, default: true
+  setting :default_language, default: nil
+  setting :default_sensitive, default: false
+  setting :default_privacy, default: nil
+
+  namespace :web do
+    setting :crop_images, default: true
+    setting :advanced_layout, default: false
+    setting :trends, default: true
+    setting :use_blurhash, default: true
+    setting :use_pending_items, default: false
+    setting :use_system_font, default: false
+    setting :disable_swiping, default: false
+    setting :delete_modal, default: true
+    setting :reblog_modal, default: false
+    setting :unfollow_modal, default: true
+    setting :reduce_motion, default: false
+    setting :expand_content_warnings, default: false
+    setting :display_media, default: 'default', in: %w(default show_all hide_all)
+    setting :auto_play, default: false
+  end
+
+  namespace :notification_emails do
+    setting :follow, default: true
+    setting :reblog, default: false
+    setting :favourite, default: false
+    setting :mention, default: true
+    setting :follow_request, default: true
+    setting :report, default: true
+    setting :pending_account, default: true
+    setting :trends, default: true
+    setting :appeal, default: true
+  end
+
+  namespace :interactions do
+    setting :must_be_follower, default: false
+    setting :must_be_following, default: false
+    setting :must_be_following_dm, default: false
+  end
+
+  def initialize(original_hash)
+    @original_hash = original_hash || {}
+  end
+
+  def [](key)
+    key = key.to_sym
+
+    raise KeyError, "Undefined setting: #{key}" unless self.class.definition_for?(key)
+
+    if @original_hash.key?(key)
+      @original_hash[key]
+    else
+      self.class.definition_for(key).default_value
+    end
+  end
+
+  def []=(key, value)
+    key = key.to_sym
+
+    raise KeyError, "Undefined setting: #{key}" unless self.class.definition_for?(key)
+
+    typecast_value = self.class.definition_for(key).type_cast(value)
+
+    if typecast_value.nil?
+      @original_hash.delete(key)
+    else
+      @original_hash[key] = typecast_value
+    end
+  end
+
+  def update(params)
+    params.each do |k, v|
+      self[k] = v unless v.nil?
+    end
+  end
+
+  keys.each do |key|
+    define_method(key) do
+      self[key]
+    end
+  end
+
+  def as_json
+    @original_hash
+  end
+end
diff --git a/app/models/user_settings/dsl.rb b/app/models/user_settings/dsl.rb
new file mode 100644
index 000000000..26238bbbe
--- /dev/null
+++ b/app/models/user_settings/dsl.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module UserSettings::DSL
+  module ClassMethods
+    def setting(key, options = {})
+      @definitions ||= {}
+
+      UserSettings::Setting.new(key, options).tap do |s|
+        @definitions[s.key] = s
+      end
+    end
+
+    def namespace(key, &block)
+      @definitions ||= {}
+
+      UserSettings::Namespace.new(key).configure(&block).tap do |n|
+        @definitions.merge!(n.definitions)
+      end
+    end
+
+    def keys
+      @definitions.keys
+    end
+
+    def definition_for(key)
+      @definitions[key.to_sym]
+    end
+
+    def definition_for?(key)
+      @definitions.key?(key.to_sym)
+    end
+  end
+
+  def self.included(base)
+    base.extend ClassMethods
+  end
+end
diff --git a/app/models/user_settings/glue.rb b/app/models/user_settings/glue.rb
new file mode 100644
index 000000000..02066a411
--- /dev/null
+++ b/app/models/user_settings/glue.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module UserSettings::Glue
+  def to_model
+    self
+  end
+
+  def to_key
+    ''
+  end
+
+  def persisted?
+    false
+  end
+
+  def type_for_attribute(key)
+    self.class.definition_for(key)&.type
+  end
+
+  def has_attribute?(key) # rubocop:disable Naming/PredicateName
+    self.class.definition_for?(key)
+  end
+end
diff --git a/app/models/user_settings/namespace.rb b/app/models/user_settings/namespace.rb
new file mode 100644
index 000000000..b8f7e092e
--- /dev/null
+++ b/app/models/user_settings/namespace.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class UserSettings::Namespace
+  attr_reader :name, :definitions
+
+  def initialize(name)
+    @name        = name.to_sym
+    @definitions = {}
+  end
+
+  def configure(&block)
+    instance_eval(&block)
+    self
+  end
+
+  def setting(key, options = {})
+    UserSettings::Setting.new(key, options.merge(namespace: name)).tap do |s|
+      @definitions[s.key] = s
+    end
+  end
+end
diff --git a/app/models/user_settings/setting.rb b/app/models/user_settings/setting.rb
new file mode 100644
index 000000000..5f5504254
--- /dev/null
+++ b/app/models/user_settings/setting.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class UserSettings::Setting
+  attr_reader :name, :namespace, :in
+
+  def initialize(name, options = {})
+    @name          = name.to_sym
+    @default_value = options[:default]
+    @namespace     = options[:namespace]
+    @in            = options[:in]
+  end
+
+  def default_value
+    if @default_value.respond_to?(:call)
+      @default_value.call
+    else
+      @default_value
+    end
+  end
+
+  def type
+    case default_value
+    when TrueClass, FalseClass
+      ActiveModel::Type::Boolean.new
+    else
+      ActiveModel::Type::String.new
+    end
+  end
+
+  def type_cast(value)
+    if type.respond_to?(:cast)
+      type.cast(value)
+    else
+      value
+    end
+  end
+
+  def to_a
+    [key, default_value]
+  end
+
+  def key
+    if namespace
+      "#{namespace}.#{name}".to_sym
+    else
+      name
+    end
+  end
+end
diff --git a/app/serializers/rest/admin/webhook_event_serializer.rb b/app/serializers/rest/admin/webhook_event_serializer.rb
index fe0ac23f9..b6d2616e5 100644
--- a/app/serializers/rest/admin/webhook_event_serializer.rb
+++ b/app/serializers/rest/admin/webhook_event_serializer.rb
@@ -7,6 +7,8 @@ class REST::Admin::WebhookEventSerializer < ActiveModel::Serializer
       REST::Admin::AccountSerializer
     when 'Report'
       REST::Admin::ReportSerializer
+    when 'Status'
+      REST::StatusSerializer
     else
       super
     end
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index 4c7acbcac..994ca588a 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -3,6 +3,11 @@
 class NotifyService < BaseService
   include Redisable
 
+  NON_EMAIL_TYPES = %i(
+    admin.report
+    admin.sign_up
+  ).freeze
+
   def call(recipient, type, activity)
     @recipient    = recipient
     @activity     = activity
@@ -36,11 +41,11 @@ class NotifyService < BaseService
   end
 
   def optional_non_follower?
-    @recipient.user.settings.interactions['must_be_follower']  && !@notification.from_account.following?(@recipient)
+    @recipient.user.settings['interactions.must_be_follower']  && !@notification.from_account.following?(@recipient)
   end
 
   def optional_non_following?
-    @recipient.user.settings.interactions['must_be_following'] && !following_sender?
+    @recipient.user.settings['interactions.must_be_following'] && !following_sender?
   end
 
   def message?
@@ -82,7 +87,7 @@ class NotifyService < BaseService
 
   def optional_non_following_and_direct?
     direct_message? &&
-      @recipient.user.settings.interactions['must_be_following_dm'] &&
+      @recipient.user.settings['interactions.must_be_following_dm'] &&
       !following_sender? &&
       !response_to_recipient?
   end
@@ -171,6 +176,6 @@ class NotifyService < BaseService
   end
 
   def send_email_for_notification_type?
-    @recipient.user.settings.notification_emails[@notification.type.to_s]
+    NON_EMAIL_TYPES.exclude?(@notification.type) && @recipient.user.settings["notification_emails.#{@notification.type}"]
   end
 end
diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb
index 7a8245839..de6f1e6d1 100644
--- a/app/services/update_status_service.rb
+++ b/app/services/update_status_service.rb
@@ -143,9 +143,9 @@ class UpdateStatusService < BaseService
     poll = @status.preloadable_poll
 
     # If the poll had no expiration date set but now has, or now has a sooner
-    # expiration date, and people have voted, schedule a notification
+    # expiration date, schedule a notification
 
-    return unless poll.present? && poll.expires_at.present? && poll.votes.exists?
+    return unless poll.present? && poll.expires_at.present?
 
     PollExpirationNotifyWorker.remove_from_scheduled(poll.id) if @previous_expires_at.present? && @previous_expires_at > poll.expires_at
     PollExpirationNotifyWorker.perform_at(poll.expires_at + 5.minutes, poll.id)
diff --git a/app/views/kaminari/_gap.html.haml b/app/views/kaminari/_gap.html.haml
new file mode 100644
index 000000000..0f9cff8fe
--- /dev/null
+++ b/app/views/kaminari/_gap.html.haml
@@ -0,0 +1,9 @@
+-#
+  Non-link tag that stands for skipped pages...
+  available local variables
+    current_page:  a page object for the currently displayed page
+    total_pages:   total number of pages
+    per_page:      number of items to fetch per page
+    remote:        data-remote
+%span.page.gap
+  != t('pagination.truncate')
diff --git a/app/views/settings/login_activities/_login_activity.html.haml b/app/views/settings/login_activities/_login_activity.html.haml
index 9f4c24d87..94ed60312 100644
--- a/app/views/settings/login_activities/_login_activity.html.haml
+++ b/app/views/settings/login_activities/_login_activity.html.haml
@@ -1,6 +1,6 @@
 - method_str = content_tag(:span, login_activity.omniauth? ? t(login_activity.provider, scope: 'auth.providers') : t(login_activity.authentication_method, scope: 'login_activities.authentication_methods'), class: 'target')
 - ip_str = content_tag(:span, login_activity.ip, class: 'target')
-- browser_str = content_tag(:span, t('sessions.description', browser: t("sessions.browsers.#{login_activity.browser}", default: login_activity.browser.to_s), platform: t("sessions.platforms.#{login_activity.platform}", default: login_activity.platform.to_)), class: 'target', title: login_activity.user_agent)
+- browser_str = content_tag(:span, t('sessions.description', browser: t("sessions.browsers.#{login_activity.browser}", default: login_activity.browser.to_s), platform: t("sessions.platforms.#{login_activity.platform}", default: login_activity.platform.to_s)), class: 'target', title: login_activity.user_agent)
 
 .log-entry
   .log-entry__header
diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml
index 16bb85068..dc82ce5b6 100644
--- a/app/views/settings/preferences/appearance/show.html.haml
+++ b/app/views/settings/preferences/appearance/show.html.haml
@@ -5,8 +5,9 @@
   = button_tag t('generic.save_changes'), class: 'button', form: 'edit_user'
 
 = simple_form_for current_user, url: settings_preferences_appearance_path, html: { method: :put, id: 'edit_user' } do |f|
-  .fields-group
-    = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| native_locale_name(locale) }, selected: I18n.locale, hint: false
+  .fields-row
+    .fields-group
+      = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| native_locale_name(locale) }, selected: I18n.locale, hint: false
 
   - unless I18n.locale == :en
     .flash-message.translation-prompt
@@ -14,53 +15,53 @@
       = link_to t('appearance.localization.glitch_guide_link'), target: '_blank', rel: 'noopener noreferrer' do
         = t('appearance.localization.glitch_guide_link_text')
 
-  %h4= t 'appearance.advanced_web_interface'
+  = f.simple_fields_for :settings, current_user.settings do |ff|
+    %h4= t 'appearance.advanced_web_interface'
 
-  %p.hint= t 'appearance.advanced_web_interface_hint'
+    %p.hint= t 'appearance.advanced_web_interface_hint'
 
-  .fields-group
-    = f.input :setting_advanced_layout, as: :boolean, wrapper: :with_label, hint: false
+    .fields-group
+      = ff.input :'web.advanced_layout', wrapper: :with_label, hint: false, label: I18n.t('simple_form.labels.defaults.setting_advanced_layout')
+    %h4= t 'appearance.animations_and_accessibility'
 
-  %h4= t 'appearance.animations_and_accessibility'
+    .fields-group
+      = ff.input :'web.use_pending_items', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_use_pending_items'), hint: I18n.t('simple_form.hints.defaults.setting_use_pending_items')
 
-  .fields-group
-    = f.input :setting_use_pending_items, as: :boolean, wrapper: :with_label
+    .fields-group
+      = ff.input :'web.auto_play', wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_auto_play_gif')
+      = ff.input :'web.reduce_motion', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_reduce_motion')
+      = ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping')
+      = ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui')
+      = ff.input :'web.use_system_emoji_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_emoji_font'), glitch_only: true
 
-  .fields-group
-    = f.input :setting_auto_play_gif, as: :boolean, wrapper: :with_label, recommended: true
-    = f.input :setting_reduce_motion, as: :boolean, wrapper: :with_label
-    = f.input :setting_disable_swiping, as: :boolean, wrapper: :with_label
-    = f.input :setting_system_font_ui, as: :boolean, wrapper: :with_label
-    = f.input :setting_system_emoji_font, as: :boolean, wrapper: :with_label, glitch_only: true
+    %h4= t 'appearance.toot_layout'
 
-  %h4= t 'appearance.toot_layout'
+    .fields-group
+      = ff.input :'web.crop_images', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_crop_images')
 
-  .fields-group
-    = f.input :setting_crop_images, as: :boolean, wrapper: :with_label
+    %h4= t 'appearance.discovery'
 
-  %h4= t 'appearance.discovery'
+    .fields-group
+      = ff.input :'web.trends', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_trends')
 
-  .fields-group
-    = f.input :setting_trends, as: :boolean, wrapper: :with_label
+    %h4= t 'appearance.confirmation_dialogs'
 
-  %h4= t 'appearance.confirmation_dialogs'
+    .fields-group
+      = ff.input :'web.unfollow_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_unfollow_modal')
+      = ff.input :'web.reblog_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_boost_modal')
+      = ff.input :'web.favourite_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_favourite_modal'), glitch_only: true
+      = ff.input :'web.delete_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_delete_modal')
 
-  .fields-group
-    = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label
-    = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label
-    = f.input :setting_favourite_modal, as: :boolean, wrapper: :with_label, glitch_only: true
-    = f.input :setting_delete_modal, as: :boolean, wrapper: :with_label
+    %h4= t 'appearance.sensitive_content'
 
-  %h4= t 'appearance.sensitive_content'
+    .fields-group
+      = ff.input :'web.display_media', collection: ['default', 'show_all', 'hide_all'],label_method: lambda { |item| t("simple_form.hints.defaults.setting_display_media_#{item}") }, hint: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', wrapper: :with_floating_label, label: I18n.t('simple_form.labels.defaults.setting_display_media')
 
-  .fields-group
-    = f.input :setting_display_media, collection: ['default', 'show_all', 'hide_all'], label_method: lambda { |item| t("simple_form.hints.defaults.setting_display_media_#{item}") }, hint: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', wrapper: :with_floating_label
+    .fields-group
+      = ff.input :'web.use_blurhash', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_use_blurhash'), hint: I18n.t('simple_form.hints.defaults.setting_use_blurhash')
 
-  .fields-group
-    = f.input :setting_use_blurhash, as: :boolean, wrapper: :with_label
-
-  .fields-group
-    = f.input :setting_expand_spoilers, as: :boolean, wrapper: :with_label
+    .fields-group
+      = ff.input :'web.expand_content_warnings', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_expand_spoilers')
 
   .actions
     = f.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/settings/preferences/notifications/show.html.haml b/app/views/settings/preferences/notifications/show.html.haml
index a03faa145..cfc468eef 100644
--- a/app/views/settings/preferences/notifications/show.html.haml
+++ b/app/views/settings/preferences/notifications/show.html.haml
@@ -11,27 +11,27 @@
 
   %p.hint= t 'notifications.email_events_hint'
 
-  .fields-group
-    = f.simple_fields_for :notification_emails, hash_to_object(current_user.settings.notification_emails) do |ff|
-      = ff.input :follow, as: :boolean, wrapper: :with_label
-      = ff.input :follow_request, as: :boolean, wrapper: :with_label
-      = ff.input :reblog, as: :boolean, wrapper: :with_label
-      = ff.input :favourite, as: :boolean, wrapper: :with_label
-      = ff.input :mention, as: :boolean, wrapper: :with_label
-      = ff.input :report, as: :boolean, wrapper: :with_label if current_user.can?(:manage_reports)
-      = ff.input :appeal, as: :boolean, wrapper: :with_label if current_user.can?(:manage_appeals)
-      = ff.input :pending_account, as: :boolean, wrapper: :with_label if current_user.can?(:manage_users)
-      = ff.input :trending_tag, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies)
-      = ff.input :trending_link, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies)
-      = ff.input :trending_status, as: :boolean, wrapper: :with_label if current_user.can?(:manage_taxonomies)
-
-  .fields-group
-    = f.input :setting_always_send_emails, as: :boolean, wrapper: :with_label
+  = f.simple_fields_for :settings, current_user.settings do |ff|
+    .fields-group
+      = ff.input :'notification_emails.follow', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.follow')
+      = ff.input :'notification_emails.follow_request', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.follow_request')
+      = ff.input :'notification_emails.reblog', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.reblog')
+      = ff.input :'notification_emails.favourite', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.favourite')
+      = ff.input :'notification_emails.mention', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.mention')
+      = ff.input :'notification_emails.report', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.report') if current_user.can?(:manage_reports)
+      = ff.input :'notification_emails.appeal', as: :boolean, wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.appeal') if current_user.can?(:manage_appeals)
+      = ff.input :'notification_emails.pending_account', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.pending_account') if current_user.can?(:manage_users)
+      = ff.input :'notification_emails.trends', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.trending_tag') if current_user.can?(:manage_taxonomies)
+      = ff.input :'notification_emails.link_trends', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.trending_link') if current_user.can?(:manage_taxonomies)
+      = ff.input :'notification_emails.status_trends', wrapper: :with_label, label: I18n.t('simple_form.labels.notification_emails.trending_status') if current_user.can?(:manage_taxonomies)
+
+    .fields-group
+      = ff.input :always_send_emails, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_always_send_emails'), hint: I18n.t('simple_form.hints.defaults.setting_always_send_emails')
 
   %h4= t 'notifications.other_settings'
 
   .fields-group
-    = f.simple_fields_for :interactions, hash_to_object(current_user.settings.interactions) do |ff|
-      = ff.input :must_be_follower, as: :boolean, wrapper: :with_label
-      = ff.input :must_be_following, as: :boolean, wrapper: :with_label
-      = ff.input :must_be_following_dm, as: :boolean, wrapper: :with_label
+    = f.simple_fields_for :settings, current_user.settings do |ff|
+      = ff.input :'interactions.must_be_follower', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_follower')
+      = ff.input :'interactions.must_be_following', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_following')
+      = ff.input :'interactions.must_be_following_dm', wrapper: :with_label, label: I18n.t('simple_form.labels.interactions.must_be_following_dm')
diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml
index fb3d21060..ebb89f44b 100644
--- a/app/views/settings/preferences/other/show.html.haml
+++ b/app/views/settings/preferences/other/show.html.haml
@@ -7,30 +7,31 @@
 = simple_form_for current_user, url: settings_preferences_other_path, html: { method: :put, id: 'edit_preferences' } do |f|
   = render 'shared/error_messages', object: current_user
 
-  .fields-group
-    = f.input :setting_noindex, as: :boolean, wrapper: :with_label
-
-  .fields-group
-    = f.input :setting_aggregate_reblogs, as: :boolean, wrapper: :with_label, recommended: true
+  = f.simple_fields_for :settings, current_user.settings do |ff|
+    .fields-group
+      = ff.input :noindex, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_noindex'), hint: I18n.t('simple_form.hints.defaults.setting_noindex')
 
-  - unless Setting.hide_followers_count
     .fields-group
-      = f.input :setting_hide_followers_count, as: :boolean, wrapper: :with_label, glitch_only: true
+      = ff.input :aggregate_reblogs, wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_aggregate_reblogs'), hint: I18n.t('simple_form.hints.defaults.setting_aggregate_reblogs')
 
-  %h4= t 'preferences.posting_defaults'
+    - unless Setting.hide_followers_count
+      .fields-group
+        = ff.input :hide_followers_count, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_hide_followers_count'), glitch_only: true
 
-  .fields-row
-    .fields-group.fields-row__column.fields-row__column-6
-      = f.input :setting_default_privacy, collection: Status.selectable_visibilities, wrapper: :with_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), I18n.t("statuses.visibilities.#{visibility}_long")], ' - ') }, required: false, hint: false
+    %h4= t 'preferences.posting_defaults'
 
-    .fields-group.fields-row__column.fields-row__column-6
-      = f.input :setting_default_language, collection: [nil] + filterable_languages, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.default_language') : native_locale_name(locale) }, required: false, include_blank: false, hint: false
+    .fields-row
+      .fields-group.fields-row__column.fields-row__column-6
+        = ff.input :default_privacy, collection: Status.selectable_visibilities, wrapper: :with_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), I18n.t("statuses.visibilities.#{visibility}_long")], ' - ') }, required: false, hint: false, label: I18n.t('simple_form.labels.defaults.setting_default_privacy')
 
-  .fields-group
-    = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label
+      .fields-group.fields-row__column.fields-row__column-6
+        = ff.input :default_language, collection: [nil] + filterable_languages, wrapper: :with_label, label_method: lambda { |locale| locale.nil? ? I18n.t('statuses.default_language') : native_locale_name(locale) }, required: false, include_blank: false, hint: false, label: I18n.t('simple_form.labels.defaults.setting_default_language')
 
-  .fields-group
-    = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true
+    .fields-group
+      = ff.input :default_sensitive, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_default_sensitive'), hint: I18n.t('simple_form.hints.defaults.setting_default_sensitive')
+
+    .fields-group
+      = ff.input :show_application, wrapper: :with_label, recommended: true, label: I18n.t('simple_form.labels.defaults.setting_show_application'), hint: I18n.t('simple_form.hints.defaults.setting_show_application')
 
   .fields-group
     = f.input :setting_default_content_type, collection: ['text/plain', 'text/markdown', 'text/html'], wrapper: :with_label, include_blank: false, label_method: lambda { |item| safe_join([t("simple_form.labels.defaults.setting_default_content_type_#{item.split('/')[1]}"), content_tag(:span, t("simple_form.hints.defaults.setting_default_content_type_#{item.split('/')[1]}"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li', glitch_only: true
diff --git a/app/workers/poll_expiration_notify_worker.rb b/app/workers/poll_expiration_notify_worker.rb
index 0e29a5f60..b7a60fab8 100644
--- a/app/workers/poll_expiration_notify_worker.rb
+++ b/app/workers/poll_expiration_notify_worker.rb
@@ -3,7 +3,7 @@
 class PollExpirationNotifyWorker
   include Sidekiq::Worker
 
-  sidekiq_options lock: :until_executed
+  sidekiq_options lock: :until_executing
 
   def perform(poll_id)
     @poll = Poll.find(poll_id)
diff --git a/app/workers/scheduler/indexing_scheduler.rb b/app/workers/scheduler/indexing_scheduler.rb
index c42396629..1bbe9cd5d 100644
--- a/app/workers/scheduler/indexing_scheduler.rb
+++ b/app/workers/scheduler/indexing_scheduler.rb
@@ -6,17 +6,21 @@ class Scheduler::IndexingScheduler
 
   sidekiq_options retry: 0
 
+  IMPORT_BATCH_SIZE = 1000
+  SCAN_BATCH_SIZE = 10 * IMPORT_BATCH_SIZE
+
   def perform
     return unless Chewy.enabled?
 
     indexes.each do |type|
       with_redis do |redis|
-        ids = redis.smembers("chewy:queue:#{type.name}")
-
-        type.import!(ids)
-
-        redis.pipelined do |pipeline|
-          ids.each { |id| pipeline.srem("chewy:queue:#{type.name}", id) }
+        redis.sscan_each("chewy:queue:#{type.name}", count: SCAN_BATCH_SIZE) do |ids|
+          redis.pipelined do
+            ids.each_slice(IMPORT_BATCH_SIZE) do |slice_ids|
+              type.import!(slice_ids)
+              redis.srem("chewy:queue:#{type.name}", slice_ids)
+            end
+          end
         end
       end
     end
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index a361cb0ec..95f0b5788 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -26,6 +26,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'URL'
   inflect.acronym 'ASCII'
   inflect.acronym 'DeepL'
+  inflect.acronym 'DSL'
 
   inflect.singular 'data', 'data'
 end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 9282c941d..bd37f6709 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -130,6 +130,7 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
       openstack_domain_name: ENV.fetch('SWIFT_DOMAIN_NAME') { 'default' },
       openstack_region: ENV['SWIFT_REGION'],
       openstack_cache_ttl: ENV.fetch('SWIFT_CACHE_TTL') { 60 },
+      openstack_temp_url_key: ENV['SWIFT_TEMP_URL_KEY'],
     },
     
     fog_file: { 'Cache-Control' => 'public, max-age=315576000, immutable' },
diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml
index c1dbaff0f..2cf1c823d 100644
--- a/config/locales/activerecord.fi.yml
+++ b/config/locales/activerecord.fi.yml
@@ -24,11 +24,11 @@ fi:
         admin/webhook:
           attributes:
             url:
-              invalid: ei ole kelvollinen URL
+              invalid: ei ole kelvollinen verkko-osoite
         doorkeeper/application:
           attributes:
             website:
-              invalid: ei ole kelvollinen URL
+              invalid: ei ole kelvollinen verkko-osoite
         import:
           attributes:
             data:
diff --git a/config/locales/an.yml b/config/locales/an.yml
index 0bbed8462..43c83efdc 100644
--- a/config/locales/an.yml
+++ b/config/locales/an.yml
@@ -1643,7 +1643,6 @@ an:
     seamless_external_login: Has iniciau sesión dende un servicio externo, asinas que los achustes de clau y correu no son disponibles.
     signed_in_as: 'Sesión iniciada como:'
   verification:
-    explanation_html: 'Puetz <strong> verificar-te a tu mesmo como lo duenyo d''os links en os metadatos d''o tuyo perfil </strong>. Pa ixo, lo puesto vinculau ha de contener un vinclo a lo tuyo perfil de Mastodon. Lo vinclo en o tuyo puesto <strong> debe </strong> tener un atributo <code> rel="me"</code>. Lo texto d''o vinclo no importa. Aquí un eixemplo:'
     verification: Verificación
   webauthn_credentials:
     add: Adhibir nueva clau de seguranza
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 481f08642..04631f7fe 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -1730,7 +1730,6 @@ ar:
     seamless_external_login: لقد قمت بتسجيل الدخول عبر خدمة خارجية، إنّ إعدادات الكلمة السرية و البريد الإلكتروني غير متوفرة.
     signed_in_as: 'تم تسجيل دخولك بصفة:'
   verification:
-    explanation_html: 'يمكنك <strong>التحقق من نفسك كمالك لروابط البيانات التعريفية على صفحتك الشخصية</strong>. لذلك، يجب أن يحتوي الموقع المقترِن على رابط إلى صفحتك التعريفية الشخصية على ماستدون. الرابط الخلفي <strong>يجب أن</strong> يحتوي على رمز <code>rel="me"</code>. محتوى النص في الرابط غير مهم. على سبيل المثال:'
     verification: التحقق
   webauthn_credentials:
     add: إضافة مفتاح أمان جديد
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 8e6935c09..62da6ff90 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -905,7 +905,6 @@ ast:
     seamless_external_login: Aniciesti la sesión pente un serviciu esternu, polo que la configuración de la contraseña ya de la direición de corréu electrónicu nun tán disponibles.
     signed_in_as: 'Aniciesti la sesión como:'
   verification:
-    explanation_html: 'Pues <strong>verificate como la persona propietaria de los enllaces nos metadatos del to perfil</strong>. Pa ello, el sitiu web enllaciáu ha contener un enllaz al to perfil de Mastodon. Esti enllaz <strong>ha</strong> tener l''atributu <code>rel="me"</code>. El testu del enllaz nun importa. Equí tienes un exemplu:'
     verification: Verificación
   webauthn_credentials:
     create:
diff --git a/config/locales/be.yml b/config/locales/be.yml
index 8001703c4..0509fc830 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -840,6 +840,12 @@ be:
         message_html: Вы не вызначылі ніякіх правілаў сервера.
       sidekiq_process_check:
         message_html: Не працуе працэс Sidekiq для %{value} чаргі. Калі ласка праверце вашу канфігурацыю Sidekiq
+      upload_check_privacy_error:
+        action: Для падрабязнасцей націсніце тут
+        message_html: "<strong>Ваш сервер не наладжаны. Прыватнасць карыстальнікаў пад пагрозай.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Для падрабязнасцей націсніце тут
+        message_html: "<strong>Ваша сховішча не наладжана. Прыватнасць карыстальнікаў пад пагрозай.</strong>"
     tags:
       review: Стан праверкі
       updated_msg: Налады хэштэгаў паспяхова змененыя
@@ -1457,6 +1463,7 @@ be:
     confirm_remove_selected_followers: Вы ўпэўнены, што жадаеце выдаліць выбраных падпісчыкаў?
     confirm_remove_selected_follows: Вы ўпэўнены, што жадаеце выдаліць выбраныя падпіскі?
     dormant: Занядбаны
+    follow_failure: Вы не можаце падпісацца на некаторыя акаўнты.
     follow_selected_followers: Падпісацца на выбраных падпісчыкаў
     followers: Падпісчыкі
     following: Падпісаны
@@ -1747,12 +1754,13 @@ be:
       title: Рады вітаць вас, %{name}!
   users:
     follow_limit_reached: Вы не можаце падпісацца на большую колькасць людзей чым %{limit}
+    go_to_sso_account_settings: Перайдзіце ў налады ідэнтыфікацыі вашага ўліковага запісу
     invalid_otp_token: Няправільны код двухфактарнай аўтэнтыфікацыі
     otp_lost_help_html: Калі вы страцілі доступ да абодвух, вы можаце скарыстацца %{email}
     seamless_external_login: Вы ўвайшлі праз знешні сэрвіс, таму налады пароля і эл. пошты недаступныя.
     signed_in_as: 'Увайшлі як:'
   verification:
-    explanation_html: 'Вы можаце <strong>пацвердзіць сябе як уладальніка спасылак у метададзеных вашага профілю</strong>. Для гэтага спасылка на вэб-сайт павінна ўтрымліваць спасылку на ваш профіль Mastodon. Зваротная спасылка <strong>павінна</strong> мець атрыбут <code>rel="me"</code>. Тэкставы змест спасылкі не мае значэння. Вось прыклад:'
+    explanation_html: 'Вы можаце <strong>пацвердзіць сябе як уладальніка спасылак у метададзеных вашага профілю</strong>. Для гэтага спасылка на вэб-сайт павінна ўтрымліваць спасылку на ваш профіль Mastodon. Пасля дадавання спасылка, вам спатрэбіцца вярнуцца і перазахаваць свой профіль, каб усё адбыдося. Зваротная спасылка <strong>павінна</strong> мець атрыбут <code>rel="me"</code>. Тэкставы змест спасылкі не мае значэння. Вось прыклад:'
     verification: Верыфікацыя
   webauthn_credentials:
     add: Дадаць новы ключ бяспекі
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 6cce2b294..4304966fa 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -812,6 +812,12 @@ bg:
         message_html: Не сте определили никакви правила на сървъра.
       sidekiq_process_check:
         message_html: Не работи процес Sidekiq за %{value} опашка/и. Прегледайте настройките си за Sidekiq
+      upload_check_privacy_error:
+        action: Щракнете тук за повече информация
+        message_html: "<strong>Вашият уеб сървър е погрешно конфигуриран. Поверителността на потребителите ви е изложена на риск.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Щракнете тук за повече информация
+        message_html: "<strong>Вашето съхранение на предмети е погрешно конфигурирано. Поверителността на потребителите ви е изложена на риск.</strong>"
     tags:
       review: Преглед на състояние
       updated_msg: Успешно осъвременени настройки на хаштага
@@ -1684,12 +1690,13 @@ bg:
       title: Добре дошли на борда, %{name}!
   users:
     follow_limit_reached: Не може да последвате повече от %{limit} души
+    go_to_sso_account_settings: Отидете при настройките на акаунта на своя доставчик на идентичност
     invalid_otp_token: Невалиден код
     otp_lost_help_html: Ако загубите достъп до двете, то може да се свържете с %{email}
     seamless_external_login: Влезли сте чрез външна услуга, така че настройките за парола и имейл не са налични.
     signed_in_as: 'Влезли като:'
   verification:
-    explanation_html: 'Можете да <strong>удостоверите самоличността си като собственик на линковете в метаданните на своя профил</strong>. За целта сайтът, към който води линк от метаданните, трябва да съдържа линк обратно към вашия профил в Mastodon. Линкът от сайта <strong>трябва</strong> да съдържа атрибут <code>rel="me"</code>. Текстовото съдържание на линка няма значение. Ето пример:'
+    explanation_html: 'Може да <strong>потвърдите себе си като собственик на връзките в метаданните на профила си</strong>. За целта свързаният уебсайт трябва да съдържа обратна връзка към профилa ви в Mastodon. След добавянето на връзката, може да се наложи да се върнете тук и да запазите пак профила си, за да влезе в сила потвърждаването. Връзката обратно <strong>трябва</strong> да има атрибут <code>rel="me"</code>. Текстовото съдържание на връзката няма значение. Ето пример:'
     verification: Проверка
   webauthn_credentials:
     add: Добавяне на нов ключ за сигурност
diff --git a/config/locales/br.yml b/config/locales/br.yml
index 91a09c002..ee465368a 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -535,7 +535,6 @@ br:
   users:
     signed_in_as: 'Aet-tre evel:'
   verification:
-    explanation_html: 'Gallout a rit <strong>gwiriañ c''hwi a zo perc''henn. ez liammoù metadata ho profil</strong>. Ret eo d''al lec''hienn web staget enderc''hel ul liamm evit mont d''ho profil Mastodon. <strong>Ret eo<strong> d''al liamm-se enderc''hel un doarenn <code>rel="me"</code>. Ne ra forzh an destenn a zo e-barzh al liamm. Setu ur skouer:'
     verification: Amprouadur
   webauthn_credentials:
     add: Ouzphennañ un alc'hwez surentez nevez
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index f722a2515..0d84c2c90 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -812,6 +812,12 @@ ca:
         message_html: No has definit cap norma del servidor.
       sidekiq_process_check:
         message_html: No hi ha cap procés de Sidekiq executant-se per a la cua (o cues) de %{value}. Si us plau revisa la teva configuració de Sidekiq
+      upload_check_privacy_error:
+        action: Consulta aquí per a més informació
+        message_html: "<strong>El teu servidor no està ben configurat. La privacitat dels teus usuaris està en risc.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Consulta aquí per a més informació
+        message_html: "<strong>El teu emagatzamatge d'objectes no està ben configurat. La privacitat dels teus usuaris està en risc.</strong>"
     tags:
       review: Revisar l'estat
       updated_msg: Ajustaments d'etiquetes actualitzats amb èxit
@@ -1684,12 +1690,13 @@ ca:
       title: Benvingut a bord, %{name}!
   users:
     follow_limit_reached: No pots seguir més de %{limit} persones
+    go_to_sso_account_settings: Ves a la configuració del compte del teu proveïdor d'identitat
     invalid_otp_token: El codi de dos factors no és correcte
     otp_lost_help_html: Si has perdut l'accés a tots dos pots contactar per %{email}
     seamless_external_login: Has iniciat sessió via un servei extern per tant els ajustos de contrasenya i correu electrònic no estan disponibles.
     signed_in_as: 'Sessió iniciada com a:'
   verification:
-    explanation_html: 'Pots <strong>verificar-te com a propietari dels enllaços a les metadades del teu perfil</strong>. Per això, el lloc web enllaçat ha de contenir un enllaç al teu perfil de Mastodon. El vincle <strong>ha de</strong> tenir l''atribut <code>rel="me"</code>. El contingut del text de l''enllaç no importa. Aquí tens un exemple:'
+    explanation_html: 'Pots <strong>verificar-te com a propietari dels enllaços a les metadades del teu perfil</strong>. Per això, el lloc web enllaçat ha de contenir un enllaç al teu perfil de Mastodon. Després d''afegir l''enllaç, podries necessitar tornar aquí a desar el teu perfil per a fer efectiva la verificació. El vincle <strong>ha de</strong> tenir l''atribut <code>rel="me"</code>. El contingut del text de l''enllaç no importa. Aquí tens un exemple:'
     verification: Verificació
   webauthn_credentials:
     add: Afegir nova clau de seguretat
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index b156f5b49..1970761e1 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -1070,7 +1070,6 @@ ckb:
     seamless_external_login: تۆ لە ڕێگەی خزمەتگوزاری دەرەکیەوە داخڵ بووی، بۆیە ڕێکبەندەکانی نهێنوشە و ئیمەیل بەردەست نین.
     signed_in_as: 'چوونە ژوورەوە وەک:'
   verification:
-    explanation_html: 'دەتوانیت <strong> خۆت بسەلمێنیت وەک خاوەنی لینکەکان لە مێتاداتای پرۆفایلەکەت</strong>. بۆ ئەمە، ماڵپەڕە لینککراوەکە پێویستە لینکێکی تێدا بێت بۆ پرۆفایلی ماستۆدۆنەکەت. بەستەری <strong> دەبێت </strong> هەبێت <code>="me"</code>. ناوەڕۆکی دەقی لینکەکە گرنگ نییە. ئەمە نموونەیەکە:'
     verification: ساغ کردنەوە
   webauthn_credentials:
     add: زیادکردنی کلیلی ئاسایشی نوێ
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 4d214f5c4..9f48bdb4b 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -1089,7 +1089,6 @@ co:
     seamless_external_login: Site cunnettatu·a dapoi un serviziu esternu, allora i parametri di chjave d’accessu è d’indirizzu e-mail ùn so micca dispunibili.
     signed_in_as: 'Cunnettatu·a cum’è:'
   verification:
-    explanation_html: 'Pudete <strong>verificavi cum''è u pruprietariu di i ligami in i metadati di u vostru prufile</strong>. Per quessa, u vostru situ deve avè un ligame versu a vostra pagina Mastodon. U ligame <strong>deve</strong> avè un''attributu <code>rel="me"</code>. U cuntenutu di u testu di u ligame ùn hè micca impurtante. Eccu un''esempiu:'
     verification: Verificazione
   webauthn_credentials:
     add: Aghjunghje una chjave di sicurità
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index b5f3b0f15..f54624a80 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1730,7 +1730,6 @@ cs:
     seamless_external_login: Jste přihlášeni přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná.
     signed_in_as: 'Přihlášeni jako:'
   verification:
-    explanation_html: 'Můžete se <strong>ověřit jako vlastník odkazů v metadatech profilu</strong>. Pro tento účel musí stránka v odkazu obsahovat odkaz zpět na váš profil na Mastodonu. Odkaz zpět <strong>musí</strong> mít atribut <code>rel="me"</code>. Na textu odkazu nezáleží. Zde je příklad:'
     verification: Ověření
   webauthn_credentials:
     add: Přidat nový bezpečnostní klíč
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index a50f8f32f..3f451ef72 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -868,6 +868,12 @@ cy:
         message_html: Nid ydych wedi diffinio unrhyw reolau gweinydd.
       sidekiq_process_check:
         message_html: Does dim proses Sidekiq yn rhedeg ar gyfer y ciw(iau) %{value}. Adolygwch eich ffurfweddiad Sidekiq
+      upload_check_privacy_error:
+        action: Ewch yma am fwy o wybodaeth
+        message_html: "<strong>Mae eich gweinydd gwe wedi'i gam ffurfweddu.. Mae preifatrwydd eich defnyddwyr mewn perygl.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Ewch yma am fwy o wybodaeth
+        message_html: "<strong>Mae eich storfa gwrthrychau wedi'i cham ffurfweddu. Mae preifatrwydd eich defnyddwyr mewn perygl.</strong>"
     tags:
       review: Adolygu statws
       updated_msg: Gosodiadau hashnodau wedi'i diweddaru'n llwyddiannus
@@ -1812,12 +1818,13 @@ cy:
       title: Croeso, %{name}!
   users:
     follow_limit_reached: Nid oes modd i chi ddilyn mwy na %{limit} o bobl
+    go_to_sso_account_settings: Ewch i osodiadau cyfrif eich darparwr hunaniaeth
     invalid_otp_token: Côd dau-ffactor annilys
     otp_lost_help_html: Os colloch chi fynediad i'r ddau, mae modd i chi gysylltu a %{email}
     seamless_external_login: Yr ydych wedi'ch mewngofnodi drwy wasanaeth allanol, felly nid yw gosodiadau cyfrinair ac e-bost ar gael.
     signed_in_as: 'Wedi mewngofnodi fel:'
   verification:
-    explanation_html: 'Mae modd i chi <strong>ddilysu eich hun fel perchenog y dolenni yn metadata eich proffil</strong>. Rhaid i''r wefan â dolen iddi gynnwys dolen yn ôl i''ch proffil Mastodon. <strong>Rhaid</strong> i''r ddolen yn ôl cynnwys y nodwedd <code>rel="me"</code>. Does dim ots beth yw cynnwys testun y ddolen. Dyma enghraifft:'
+    explanation_html: 'Gallwch <strong>wirio eich hun fel perchennog y dolenni ym metadata eich proffil</strong> . Ar gyfer gwneud hynny, rhaid i''r wefan gysylltiedig gynnwys dolen yn ôl i''ch proffil Mastodon. Ar ôl ychwanegu''r ddolen efallai y bydd angen i chi ddod yn ôl yma ac ail-gadw''ch proffil er mwyn i''r dilysiad ddod i rym. <strong>Rhaid</strong> i''r ddolen yn ôl gael priodoledd <code>rêl="me"</code>. Nid yw cynnwys testun y ddolen o bwys. Dyma enghraifft:'
     verification: Dilysu
   webauthn_credentials:
     add: Ychwanegu allwedd ddiogelwch newydd
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 6110e6eab..c558aafd6 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -812,6 +812,12 @@ da:
         message_html: Ingen serverregler defineret.
       sidekiq_process_check:
         message_html: Ingen Sidekiq-proces kører for %{value}-kø(er). Gennemgå Sidekiq-opsætningen
+      upload_check_privacy_error:
+        action: Tjek her for flere oplysninger
+        message_html: "<strong>Webserveren er fejlopsat. Brugernes fortrolighed er i fare.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Tjek her for flere oplysninger
+        message_html: "<strong>Objektlageret er fejlopsat. Brugernes fortrolighed er i fare.</strong>"
     tags:
       review: Revisionsstatus
       updated_msg: Hashtag-indstillinger opdateret
@@ -1684,12 +1690,13 @@ da:
       title: Velkommen ombord, %{name}!
   users:
     follow_limit_reached: Du kan maks. følge %{limit} personer
+    go_to_sso_account_settings: Gå til identitetsudbyderens kontoindstillinger
     invalid_otp_token: Ugyldig tofaktorkode
     otp_lost_help_html: Har du mistet adgang til begge, kan du kontakte %{email}
     seamless_external_login: Du er logget ind via en ekstern tjeneste, så adgangskode- og e-mailindstillinger er utilgængelige.
     signed_in_as: 'Logget ind som:'
   verification:
-    explanation_html: 'Du kan <strong>bekræfte dig selv som ejer af linkene i din profilmetadata</strong>. For at gøre det, skal det linkede websted indeholde et link pegende tilbage til din Mastodon-profil. Returlinket <strong>skal</strong> have en <code>rel="me"</code>-attribut. Linkets tekstindhold betyder ikke noget. Her er et eksempel:'
+    explanation_html: 'Man kan <strong>bekræfte sig selv som ejer af linkene i profilmetadataene</strong>. For at gøre dette, skal det linkede websted indeholde et link tilbage til Mastodon-profilen. Efter tilføjelse af linket, skal man muligvis returnere hertil og gemme sin profil igen, før bekræftelsen effektueres. Returlinket <strong>skal</strong> have en <code>rel="me"</code>-attribut. Linkets tekstindhold er ligegyldigt. Her er et eksempel:'
     verification: Bekræftelse
   webauthn_credentials:
     add: Tilføj ny sikkerhedsnøgle
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 82bfc221e..e8f6c86db 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -812,6 +812,12 @@ de:
         message_html: Du hast keine Serverregeln definiert.
       sidekiq_process_check:
         message_html: Kein Sidekiq-Prozess läuft für die %{value} Warteschlange(n). Bitte überprüfe deine Sidekiq-Konfiguration
+      upload_check_privacy_error:
+        action: Für weitere Informationen hier klicken
+        message_html: "<strong>Die Konfiguration deines Servers ist fehlerhaft. Die Privatsphäre deiner Benutzer*innen ist gefährdet.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Für weitere Informationen hier klicken
+        message_html: "<strong>Die Konfiguration deines Objektspeichers ist fehlerhaft. Die Privatsphäre deiner Benutzer*innen ist gefährdet.</strong>"
     tags:
       review: Prüfstatus
       updated_msg: Hashtageinstellungen wurden erfolgreich aktualisiert
@@ -1684,12 +1690,12 @@ de:
       title: Willkommen an Bord, %{name}!
   users:
     follow_limit_reached: Du kannst nicht mehr als %{limit} Leuten folgen
+    go_to_sso_account_settings: Kontoeinstellungen des Identitätsanbieters aufrufen
     invalid_otp_token: Ungültiger Code der Zwei-Faktor-Authentisierung (2FA)
     otp_lost_help_html: Wenn du beides nicht mehr weißt, melde dich bitte bei uns unter der E-Mail-Adresse %{email}
     seamless_external_login: Du bist über einen externen Dienst angemeldet, daher sind Passwort- und E-Mail-Einstellungen nicht verfügbar.
     signed_in_as: 'Angemeldet als:'
   verification:
-    explanation_html: 'Du kannst <strong>bestätigen, dass die Links in deinen Profil-Metadaten dir gehören</strong>. Dafür muss die verlinkte Website einen Link zurück auf dein Mastodon-Profil enthalten. Dieser Link <strong>muss</strong> ein <code>rel="me"</code>-Attribut enthalten. Der Linktext ist dabei egal. Hier ist ein Beispiel:'
     verification: Verifizierung
   webauthn_credentials:
     add: Sicherheitsschlüssel hinzufügen
diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml
index 08bc18ec1..86360c2ab 100644
--- a/config/locales/devise.fi.yml
+++ b/config/locales/devise.fi.yml
@@ -2,17 +2,17 @@
 fi:
   devise:
     confirmations:
-      confirmed: Sähköpostiosoitteesi on vahvistettu onnistuneesti.
+      confirmed: Sähköpostiosoitteesi on vahvistettu.
       send_instructions: Saat pian sähköpostitse ohjeet sähköpostiosoitteesi vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi.
-      send_paranoid_instructions: Jos sähköpostiosoitteesi on tietokannassamme, saat pian ohjeet osoitteesi vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi.
+      send_paranoid_instructions: Jos sähköpostiosoitteesi on tiedossammme, saat pian sähköpostiisi ohjeet sen vahvistamiseen. Jos et saanut viestiä, tarkista roskapostikansiosi.
     failure:
       already_authenticated: Olet jo kirjautunut sisään.
       inactive: Tiliäsi ei ole vielä aktivoitu.
       invalid: Virheellinen %{authentication_keys} tai salasana.
-      last_attempt: Sinulla on vielä yksi yritys ennen kuin tunnuksesi lukitaan.
+      last_attempt: Sinulla on vielä yksi yritys ennen kuin tilisi lukitaan.
       locked: Tilisi on lukittu.
       not_found_in_database: Virheellinen %{authentication_keys} tai salasana.
-      pending: Tämä tili on vielä tarkistamatta.
+      pending: Tilisi on vielä tarkistamatta.
       timeout: Istuntosi on umpeutunut. Jatka kirjautumalla uudelleen sisään.
       unauthenticated: Sinun pitää kirjautua sisään tai rekisteröityä ennen kuin voit jatkaa.
       unconfirmed: Vahvista sähköpostiosoitteesi, ennen kuin jatkat.
@@ -33,41 +33,41 @@ fi:
       password_change:
         explanation: Tilisi salasana on vaihdettu.
         extra: Jos et vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä. Jos et pääse kirjautumaan tilillesi, ota yhteyttä instanssin ylläpitäjään.
-        subject: 'Mastodon: Salasana vaihdettu'
+        subject: 'Mastodon: salasana vaihdettu'
         title: Salasana vaihdettu
       reconfirmation_instructions:
         explanation: Vahvista uusi sähköpostiosoite, niin muutos astuu voimaan.
         extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä.
-        subject: 'Mastodon: Vahvista sähköpostiosoite instanssille %{instance}'
+        subject: 'Mastodon: vahvista sähköpostiosoite: %{instance}'
         title: Vahvista sähköpostiosoite
       reset_password_instructions:
         action: Vaihda salasana
         explanation: Pyysit tilillesi uuden salasanan.
         extra: Jos et tehnyt pyyntöä itse, voit jättää tämän viestin huomiotta. Salasanaasi ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä ja luot uuden salasanan.
-        subject: 'Mastodon: Ohjeet salasanan vaihtoon'
+        subject: 'Mastodon: ohjeet salasanan vaihtoon'
         title: Salasanan vaihto
       two_factor_disabled:
-        explanation: Kaksivaiheinen tunnistus tilillesi on otettu pois käytöstä. Kirjautuminen onnistuu nyt pelkällä sähköpostiosoitteella ja salasanalla.
-        subject: 'Mastodon: Kaksivaiheinen tunnistut otettu pois käytöstä'
-        title: 2FA poistettu käytöstä
+        explanation: Kaksivaiheinen todennus tilillesi poistettiin käytöstä. Kirjautuminen onnistuu nyt käyttäen pelkkää sähköpostiosoitetta ja salasanaa.
+        subject: 'Mastodon: kaksivaiheinen todennus poistettu käytöstä'
+        title: 2-vaiheinen todennus pois käytöstä
       two_factor_enabled:
-        explanation: Kaksivaiheinen tunnistus on otettu käyttöön tilillesi. Koodi kaksivaiheisen tunnistuksen sovelluksesta tarvitaan kirjautumiseen.
-        subject: 'Mastodon: Kaksivaiheinen tunnistus otettu käyttöön'
-        title: 2FA käytössä
+        explanation: Kaksivaiheinen tunnistus on otettu käyttöön tilillesi. Kaksivaiheisen tunnistuksen sovelluksesta saatu koodi tarvitaan kirjautumiseen.
+        subject: 'Mastodon: kaksivaiheinen todennus otettu käyttöön'
+        title: 2-vaiheinen todennus käytössä
       two_factor_recovery_codes_changed:
-        explanation: Aiemmat palautuskoodi on poistettu käytöstä ja uudet on luotu.
-        subject: 'Mastodon: Kaksivaiheisen tunnistuksen palautuskoodit uudelleenluotu'
-        title: 2FA palautuskoodit vaihdettu
+        explanation: Uudet palautuskoodit on nyt luotu ja vanhat on mitätöity.
+        subject: 'Mastodon: kaksivaiheisen todennuksen palautuskoodit luotiin uudelleen'
+        title: 2-vaiheisen todennuksen palautuskoodit vaihdettiin
       unlock_instructions:
-        subject: 'Mastodon: Ohjeet lukituksen poistoon'
+        subject: 'Mastodon: lukituksen poistamisen ohjeet'
       webauthn_credential:
         added:
           explanation: Seuraava suojausavain on lisätty tilillesi
-          subject: 'Mastodon: Uusi suojausavain'
+          subject: 'Mastodon: uusi suojausavain'
           title: Uusi suojausavain on lisätty
         deleted:
           explanation: Seuraava suojausavain on poistettu tililtäsi
-          subject: 'Mastodon: Suojausavain poistettu'
+          subject: 'Mastodon: suojausavain poistettu'
           title: Yksi suojausavaimistasi on poistettu
       webauthn_disabled:
         explanation: Suojausavaimilla todennus on poistettu käytöstä tililtäsi. Kirjautuminen on nyt mahdollista käyttämällä vain paritetun TOTP-sovelluksen luomaa tokenia.
diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml
index ddadd1789..dd137f14c 100644
--- a/config/locales/devise.hu.yml
+++ b/config/locales/devise.hu.yml
@@ -7,43 +7,43 @@ hu:
       send_paranoid_instructions: Ha az e-mail címed már szerepel az adatbázisunkban, néhány percen belül kapsz egy levelet az e-mail cím megerősítésére vonatkozó utasításokkal. Kérjük, ellenőrizd a spam mappád, ha nem látod az e-mailt.
     failure:
       already_authenticated: Már bejelentkeztél.
-      inactive: A fiókod még nincs aktiválva.
+      inactive: A fiók még nincs aktiválva.
       invalid: Helytelen %{authentication_keys} vagy jelszó.
       last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk.
       locked: A fiókodat zároltuk.
       not_found_in_database: Helytelen %{authentication_keys} vagy jelszó.
-      pending: A fiókod még engedélyezésre vár.
+      pending: A fiók még áttekintés alatt áll.
       timeout: A munkameneted lejárt. Kérjük, a folytatáshoz jelentkezz be újra.
       unauthenticated: A folytatás előtt be kell jelentkezned vagy regisztrálnod kell.
-      unconfirmed: A folytatás előtt meg kell erősítened az e-mail címed.
+      unconfirmed: A folytatás előtt meg kell erősíteni az email címet.
     mailer:
       confirmation_instructions:
-        action: Erősítsd meg az e-mail címedet
-        action_with_app: Megerősítés majd vissza ide %{app}
-        explanation: Ezzel az e-mail címmel kezdeményeztek regisztrációt a(z) %{host} oldalon. Csak egy kattintás, és a felhasználói fiókodat aktiváljuk. Ha a regisztrációt nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak.
-        explanation_when_pending: Ezzel az e-mail címmel meghívást kértél a(z) %{host} oldalon. Ahogy megerősíted az e-mail címed, átnézzük a jelentkezésedet. Ennek ideje alatt nem tudsz belépni. Ha a jelentkezésed elutasítjuk, az adataidat töröljük, más teendőd nincs. Ha a kérelmet nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak.
-        extra_html: Tekintsd át a <a href="%{terms_path}">a kiszolgáló szabályait</a> és <a href="%{policy_path}">a felhasználási feltételeket</a>.
-        subject: 'Mastodon: Megerősítési lépések ehhez az instancehez: %{instance}'
-        title: E-mail cím megerősítése
+        action: Email cím ellenőrzése
+        action_with_app: 'Megerősítés majd visszatérés: %{app}'
+        explanation: Ezzel az email címmel kezdeményeztek regisztrációt %{host} kiszolgálón. Csak egy kattintás, és a felhasználói fiók bekapcsolásra kerül. Ha a regisztráció kezdeményezése téves volt, tekintsük ezt az emailt tárgytalannak.
+        explanation_when_pending: Ezzel az email címmel meghívás kérés történt %{host} kiszolgálón. Az email cím megerősítése után a jelentkezés áttekintésre kerül. Ennek ideje alatt nem lehet belépni. Ha a jelentkezés elutasításra kerül, az adatok törlésre kerülnek, más teendő nincs. Ha a kérelem kezdeményezése téves volt, tekintsük ezt az emailt tárgytalannak.
+        extra_html: Tekintsük át a <a href="%{terms_path}">a kiszolgáló szabályait</a> és a <a href="%{policy_path}">felhasználási feltételeket</a>.
+        subject: 'Mastodon: Megerősítési utasítások: %{instance}'
+        title: Email cím megerősítése
       email_changed:
         explanation: 'A fiókodhoz tartozó e-mail cím a következőre változik:'
         extra: Ha nem változtattad meg az e-mail címed, akkor valószínű, hogy valaki hozzáférhetett a fiókodhoz. Kérjük, azonnal változtasd meg a jelszavadat, vagy lépj kapcsolatba a szerver adminisztrátorával, ha ki vagy zárva a fiókodból.
-        subject: 'Mastodon: a fiókodhoz tartozó e-mail címet megváltoztattuk'
-        title: Új e-mail cím
+        subject: 'Mastodon: a fiókhoz tartozó email cím megváltoztatásra került'
+        title: Új email cím
       password_change:
-        explanation: A fiókodhoz tartozó jelszót megváltoztattuk.
-        extra: Ha nem te kérted a fiókod jelszavának módosítását, akkor valaki hozzáférhetett a fiókodhoz. Legjobb, ha azonnal megváltoztatod a jelszavadat; ha nem férsz hozzá a fiókodhoz, vedd fel a kapcsolatot a kiszolgálód adminisztrátorával.
-        subject: 'Mastodon: Jelszavad megváltoztattuk'
-        title: Sikeres jelszómódosítás
+        explanation: A fiókhoz tartozó jelszó megváltoztatásra került.
+        extra: Ha a fiók jelszavának módosítási kérelme téves volt, akkor valaki hozzáférhetett a fiókhoz. Legjobb, a jelszó azonnali megváltoztatása vagy ha kizárásra kerültünk a fiókból, vegyük fel a kapcsolatot a kiszolgáló adminisztrátorával.
+        subject: 'Mastodon: A jelszó megváltoztatásra került'
+        title: A jelszó megváltoztatásra került
       reconfirmation_instructions:
-        explanation: Az e-mail cím megváltoztatásához meg kell erősítened az új címet.
-        extra: Amennyiben nem te kezdeményezted a módosítást, kérjük tekintsd ezt az e-mailt tárgytalannak. A Mastodon fiókodhoz tartozó e-mail címed változatlan marad mindaddig, amíg rá nem kattintasz a fenti linkre.
-        subject: 'Mastodon: erősítsd meg a(z) %{instance} szerverhez tartozó e-mail címed'
-        title: E-mail cím megerősítése
+        explanation: Az email cím megváltoztatásához meg kell erősíteni az új email címet.
+        extra: Amennyiben a kezdeményezés téves volt, tekintsük ezt az emailt tárgytalannak. A Mastodon fiókhoz tartozó email cím változatlan marad a fenti hivatkozásra kattintásig.
+        subject: 'Mastodon: Email cím megerősítése: %{instance}'
+        title: Email cím megerősítése
       reset_password_instructions:
         action: Jelszó módosítása
-        explanation: A fiókodhoz tartozó jelszó módosítását kezdeményezted.
-        extra: Amennyiben nem te kezdeményezted a módosítást, kérjük tekintsd ezt az e-mailt tárgytalannak. A Mastodon fiókodhoz tartozó jelszavad változatlan marad mindaddig, amíg újat nem hozol létre a fenti linkre kattintva.
+        explanation: A fiókhoz tartozó jelszó módosítása kezdeményezésre került.
+        extra: Amennyiben a kezdeményezés téves volt, tekintsük ezt az emailt tárgytalannak. A Mastodon fiókhoz tartozó jelszó változatlan marad a fenti hivatkozásra kattintásig.
         subject: 'Mastodon: Jelszó visszaállítási lépések'
         title: Jelszó visszaállítása
       two_factor_disabled:
@@ -55,54 +55,54 @@ hu:
         subject: Kétlépcsős azonosítás engedélyezve
         title: Kétlépcsős hitelesítés engedélyezve
       two_factor_recovery_codes_changed:
-        explanation: A korábbi helyreállítási kódokat letiltottuk, és újakat generáltunk.
+        explanation: A korábbi helyreállítási kódok letiltásra és újragenerálásra kerültek.
         subject: Kétlépcsős helyreállítási kódok újra létrejöttek
-        title: A kétlépcsős kódok megváltozott
+        title: A kétlépcsős kódok megváltoztak
       unlock_instructions:
         subject: 'Mastodon: Feloldási lépések'
       webauthn_credential:
         added:
-          explanation: A következő biztonsági kulcsot hozzáadtuk a fiókodhoz
+          explanation: A következő biztonsági kulcs a fiókhoz hozzáadásra került
           subject: 'Mastodon: Új biztonsági kulcs'
-          title: Új biztonsági kulcsot vettünk fel
+          title: Új biztonsági kulcs lett hozzáadva
         deleted:
-          explanation: A következő biztonsági kulcsot töröltük a fiókodból
-          subject: 'Mastodon: Biztonsági kulcs törölve'
-          title: Az egyik biztonsági kulcsodat törölték
+          explanation: A következő biztonsági kulcs törlésre került a fiókból
+          subject: 'Mastodon: A biztonsági kulcs törlésre került'
+          title: Az egyik biztonsági kulcs törlésre került
       webauthn_disabled:
-        explanation: A biztonsági kulccsal történő hitelesítést letiltottuk a fiókodon. Bejelentkezni csak a párosított TOTP app által generált tokennel lehet.
-        subject: 'Mastodon: Biztonsági kulccsal történő hitelesítés letiltva'
-        title: Biztonsági kulcsok letiltva
+        explanation: A biztonsági kulccsal történő hitelesítés letiltásra kerüt a fióknál. Bejelentkezni csak a párosított TOTP app által generált vezérjellel lehet.
+        subject: 'Mastodon: A biztonsági kulccsal történő hitelesítés letiltásra került'
+        title: A bztonsági kulcsok letiltásra kerültek
       webauthn_enabled:
-        explanation: A biztonsági kulccsal történő hitelesítést engedélyeztük a fiókodon. A biztonsági kulcsodat mostantól használhatod bejelentkezésre.
-        subject: 'Mastodon: Biztonsági kulcsos hitelesítés engedélyezve'
-        title: Biztonsági kulcsok engedélyezve
+        explanation: A biztonsági kulccsal történő hitelesítést engedélyezve lett a fióknál. A biztonsági kulcs mostantól használható a bejelentkezésre.
+        subject: 'Mastodon: A biztonsági kulcsos hitelesítés engedélyezésre került'
+        title: A bztonsági kulcsok engedélyezésre kerültek
     omniauth_callbacks:
       failure: Sikertelen hitelesítés %{kind} fiókról, mert "%{reason}".
       success: Sikeres hitelesítés %{kind} fiókról.
     passwords:
-      no_token: Nem férhetsz hozzá ehhez az oldalhoz jelszó visszaállító e-mail nélkül. Ha egy jelszó visszaállító e-mail hozott ide, ellenőrizd, hogy a megadott teljes URL-t használd.
-      send_instructions: Pár percen belül kapni fogsz egy e-mailt arról, hogy hogyan tudod visszaállítani a jelszavadat. Kérlek ellenőrizd a levélszemét mappádat, ha nem kaptál ilyen e-mailt.
-      send_paranoid_instructions: Ha létezik az e-mail cím, pár percen belül kapni fogsz egy e-mailt arról, hogy hogyan tudod visszaállítani a jelszavadat. Kérlek ellenőrizd a levélszemét mappádat, ha nem kaptál ilyen e-mailt.
-      updated: Jelszavad sikeresen frissült. Bejelentkeztél.
-      updated_not_active: Jelszavad sikeresen megváltoztattuk.
+      no_token: Nem lehet hozzáférni ehhez az oldalhoz jelszó visszaállító email nélkül. Ha egy jelszó visszaállító email miatt érkeztünk ide, ellenőrizzük a megadott teljes webcím használatát.
+      send_instructions: Ha az email cím létezik az adatbázisban, néhány perc alatt megérkezik jelszó helyreállítási hivatkozás az email címre. Ellenőrizzük a spam mappát, ha nem érkezett meg ez az email.
+      send_paranoid_instructions: Ha az email cím létezik az adatbázisban, néhány perc alatt megérkezik jelszó helyreállítási hivatkozás az email címre. Ellenőrizzük a spam mappát, ha nem érkezett meg ez az email.
+      updated: A jelszó sikeresen megváltozott. Megtörtént a bejelentkezés.
+      updated_not_active: A jelszó sikeresen megváltoztatásra került.
     registrations:
-      destroyed: Viszlát! A fiókodat sikeresen töröltük. Reméljük hamarosan viszontláthatunk.
-      signed_up: Üdvözlünk! Sikeresen regisztráltál.
-      signed_up_but_inactive: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókodat még nem aktiválták.
-      signed_up_but_locked: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókod le van zárva.
+      destroyed: Viszontásátásra! A fiók sikeresen törlésre került. Reméljük hamarosan visszatér.
+      signed_up: Üdvözlet! A regisztráció sikeres volt.
+      signed_up_but_inactive: A regisztráció sikeres volt. Ennek ellenére nem lehet belépni, mert a fiók még nem lett aktiválva.
+      signed_up_but_locked: A regisztráció sikeres volt. Ennek ellenére nem lehet belépni, mert a fiók lezárásra került.
       signed_up_but_pending: Egy megerősítési hivatkozással ellátott üzenetet kiküldtünk az e-mail címedre. Ha kattintasz a hivatkozásra, átnézzük a kérelmedet. Értesítünk, ha jóváhagytuk.
       signed_up_but_unconfirmed: Egy megerősítési hivatkozással ellátott üzenetet kiküldtünk az e-mail címedre. Kérjük használd a hivatkozást a fiókod aktiválásához. Ellenőrizd a spam mappádat, ha nem kaptad meg ezt a levelet.
-      update_needs_confirmation: Sikeresen frissítetted a fiókodat, de szükségünk van az e-mail címed megerősítésére. Kérlek ellenőrizd az e-mailedet és kövesd a levélben szereplő megerősítési linket az e-mail címed megerősítéséhez. Ellenőrizd a levélszemét mappád, ha nem kaptál volna ilyen levelet.
-      updated: Fiókod frissítése sikeres.
+      update_needs_confirmation: A fiókodat sikeresen frissítésre került, de szükség van az email cím megerősítésére. Ellenőrizzük az emailt és kövessük a benne levő megerősítési hivatkozást az email cím megerősítéséhez. Ellenőrizzük a levélszemét mappát, ha nemérkezett volna meg ez az email.
+      updated: A fiók sikeresen frissítésre került.
     sessions:
-      already_signed_out: Sikeres kijelentkezés.
-      signed_in: Sikeres bejelentkezés.
-      signed_out: Sikeres kijelentkezés.
+      already_signed_out: A kijelentkezés sikeres volt.
+      signed_in: A bejelentkezés sikeres volt.
+      signed_out: A kijelentkezés sikeres volt.
     unlocks:
-      send_instructions: Pár percen belül egy e-mailt fogsz kapni a feloldáshoz szükséges lépésekkel. Ellenőrizd a levélszemét mappád, ha nem kaptál volna ilyen levelet.
-      send_paranoid_instructions: Ha a fiókod létezik, pár percen belül egy e-mailt fogsz kapni a feloldáshoz szükséges lépésekkel. Ellenőrizd a levélszemét mappád, ha nem kaptál volna ilyen levelet.
-      unlocked: A fiókodat sikeresen feloldottuk. Jelentkezz be a folytatáshoz.
+      send_instructions: Néhány perc múlva egy email érkezik a fiók feloldásáról. Ellenőrizzük a spam mappát, ha nem érkezett volna meg at email.
+      send_paranoid_instructions: Ha a fiók létezik, pár percen belül egy email érkezik a feloldáshoz szükséges lépésekkel. Ellenőrizzük a levélszemét mappát, ha nem érkezett volna ilyen email.
+      unlocked: A fiók sikeresen feloldásra került. Jelentkezzünk be a folytatáshoz.
   errors:
     messages:
       already_confirmed: már meg lett erősítve, kérjük jelentkezz be
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index 3c1968e50..f69434dc4 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -82,8 +82,8 @@ zh-TW:
       success: 成功透過 %{kind} 帳號登入。
     passwords:
       no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。
-      send_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
-      send_paranoid_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      send_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將於信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 若電子郵件地址存在於我們的資料庫,幾分鐘後您將於信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
       updated: 您的密碼已成功變更,現在已經登入。
       updated_not_active: 您的密碼已成功變更。
     registrations:
@@ -101,7 +101,7 @@ zh-TW:
       signed_out: 已成功登出。
     unlocks:
       send_instructions: 幾分鐘後您將收到解鎖帳號的指引信件。若未收到請檢查垃圾郵件資料夾。
-      send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 若此帳號存在,您將於幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
       unlocked: 已解鎖您的帳號,請登入繼續。
   errors:
     messages:
diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml
index e2a81b4e9..00a23f3a0 100644
--- a/config/locales/doorkeeper.fi.yml
+++ b/config/locales/doorkeeper.fi.yml
@@ -14,14 +14,14 @@ fi:
             redirect_uri:
               fragment_present: ei voi sisältää osia.
               invalid_uri: on oltava kelvollinen URI.
-              relative_uri: on oltava täydellinen URI.
+              relative_uri: on oltava täysi URI.
               secured_uri: on oltava HTTPS/SSL-URI.
   doorkeeper:
     applications:
       buttons:
         authorize: Valtuuta
         cancel: Peruuta
-        destroy: Tuhoa
+        destroy: Poista
         edit: Muokkaa
         submit: Lähetä
       confirmations:
@@ -29,11 +29,11 @@ fi:
       edit:
         title: Muokkaa sovellusta
       form:
-        error: Hups! Tarkista, että lomakkeessa ei ole virheitä
+        error: Hupsis! Tarkista, ettei lomakkeessasi ole virheitä
       help:
         native_redirect_uri: Käytä %{native_redirect_uri} paikallisiin testeihin
         redirect_uri: Lisää jokainen URI omalle rivilleen
-        scopes: Erota oikeudet välilyönnein. Jos kenttä jätetään tyhjäksi, käytetään oletusoikeuksia.
+        scopes: Erota oikeudet välilyönneillä. Jätä kenttä tyhjäksi, jos haluat käyttää oletusoikeuksia.
       index:
         application: Sovellus
         callback_url: Takaisinkutsu-URL
@@ -48,19 +48,19 @@ fi:
         title: Uusi sovellus
       show:
         actions: Toiminnot
-        application_id: Asiakasohjelman tunnus
+        application_id: Ohjelman tunnus
         callback_urls: Takaisinkutsu-URL:t
         scopes: Oikeudet
-        secret: Asiakasohjelman salainen avain
+        secret: Ohjelman salaisuus
         title: 'Sovellus: %{name}'
     authorizations:
       buttons:
         authorize: Valtuuta
-        deny: Evää
+        deny: Estä
       error:
         title: Tapahtui virhe
       new:
-        prompt_html: "%{client_name} pyytää lupaa käyttää tiliäsi. Se on kolmannen osapuolen sovellus. <strong>Jos et luota siihen, sinun ei pitäisi sallia sitä.</strong>"
+        prompt_html: "%{client_name} pyytää lupaa käyttää tiliäsi. Se on kolmannen osapuolen sovellus. <strong>Jos et luota siihen, älä valtuuta sitä.</strong>"
         review_permissions: Tarkista käyttöoikeudet
         title: Valtuutus vaaditaan
       show:
@@ -81,7 +81,7 @@ fi:
     errors:
       messages:
         access_denied: Resurssin omistaja tai valtuutuspalvelin hylkäsi pyynnön.
-        credential_flow_not_configured: Resurssin omistajan salasana epäonnistui, koska asetusta Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu.
+        credential_flow_not_configured: Resurssin omistajan salasanatietojen luku epäonnistui, koska asetusta Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu.
         invalid_client: Asiakasohjelman valtuutus epäonnistui, koska asiakas on tuntematon, asiakkaan valtuutus ei ollut mukana tai valtuutustapaa ei tueta.
         invalid_grant: Valtuutuslupa on virheellinen, umpeutunut, peruttu, valtuutuspyynnössä käytettyä uudelleenohjaus-URI:tä vastaamaton tai myönnetty toiselle asiakkaalle.
         invalid_redirect_uri: Uudelleenohjaus-URI on virheellinen.
@@ -111,12 +111,12 @@ fi:
           notice: Sovellus päivitetty.
       authorized_applications:
         destroy:
-          notice: Sovellus peruttu.
+          notice: Sovellus poistettu.
     grouped_scopes:
       access:
         read: Vain luku
         read/write: Luku- ja kirjoitusoikeudet
-        write: Vain kirjoitus
+        write: Vain kirjoitusoikeus
       title:
         accounts: Tilit
         admin/accounts: Tilien hallinta
diff --git a/config/locales/doorkeeper.gl.yml b/config/locales/doorkeeper.gl.yml
index 622fcfe76..c7f21d1ba 100644
--- a/config/locales/doorkeeper.gl.yml
+++ b/config/locales/doorkeeper.gl.yml
@@ -120,7 +120,7 @@ gl:
       title:
         accounts: Contas
         admin/accounts: Administración das contas
-        admin/all: Tódalas funcións administrativas
+        admin/all: Todas as funcións administrativas
         admin/reports: Administración das denuncias
         all: Acceso completo á túa conta de Mastodon
         blocks: Bloqueos
@@ -129,7 +129,7 @@ gl:
         crypto: Cifrado extremo-a-extremo
         favourites: Favoritas
         filters: Filtros
-        follow: Seguidas, Silenciadas e Bloqueadas
+        follow: Seguidas, Acaladas e Bloqueadas
         follows: Seguimentos
         lists: Listas
         media: Anexos multimedia
@@ -150,7 +150,7 @@ gl:
       admin:read: ler todos os datos no servidor
       admin:read:accounts: ler información sensible de todas as contas
       admin:read:canonical_email_blocks: ler a información sensíbel de tódolos bloqueos de correos electrónicos canónicos
-      admin:read:domain_allows: ler a información sensible de tódolos dominios permitidos
+      admin:read:domain_allows: ler a información sensible de todos os dominios permitidos
       admin:read:domain_blocks: ler a información sensible de tódolos bloqueos de dominio
       admin:read:email_domain_blocks: ler a información sensible de tódolos dominios de correo electrónico
       admin:read:ip_blocks: ler a información sensible de tódolos bloqueos de IP
diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml
index 584ff7219..ef020bd85 100644
--- a/config/locales/doorkeeper.ko.yml
+++ b/config/locales/doorkeeper.ko.yml
@@ -40,7 +40,7 @@ ko:
         delete: 삭제
         empty: 앱이 없습니다.
         name: 이름
-        new: 새로운 앱
+        new: 새 애플리케이션
         scopes: 범위
         show: 표시
         title: 내 응용프로그램
@@ -67,12 +67,12 @@ ko:
         title: 이 승인 코드를 복사해 앱에 붙여 넣어야 합니다.
     authorized_applications:
       buttons:
-        revoke: 삭제
+        revoke: 취소
       confirmations:
         revoke: 확실합니까?
       index:
         authorized_at: "%{date}에 승인됨"
-        description_html: 이 계정에 API를 통해 접근 가능한 앱의 목록입니다. 알 수 없는 앱이나 잘못된 행위를 하는 앱이 있다면 권한을 취소할 수 있습니다.
+        description_html: 이 계정에 API를 통해 접근 가능한 애플리케이션의 목록입니다. 알 수 없는 애플리케이션이나 잘못된 행위를 하는 애플리케이션이 있다면 권한을 취소할 수 있습니다.
         last_used_at: "%{date}에 마지막으로 사용됨"
         never_used: 사용되지 않음
         scopes: 권한
@@ -93,7 +93,7 @@ ko:
         invalid_scope: 요청한 범위가 올바르지 않거나, 알 수 없거나, 잘못 된 형식입니다.
         invalid_token:
           expired: 액세스 토큰이 만료되었습니다.
-          revoked: 액세스 토큰이 삭제되었습니다.
+          revoked: 액세스 토큰이 취소되었습니다.
           unknown: 액세스 토큰이 잘못되었습니다.
         resource_owner_authenticator_not_configured: Doorkeeper.configure.resource_owner_authenticator가 설정되지 않아 리소스 소유자 찾기가 실패하였습니다.
         server_error: 권한 부여 서버에 예기치 않은 상태가 발생하여, 요청을 수행할 수 없습니다.
@@ -104,14 +104,14 @@ ko:
     flash:
       applications:
         create:
-          notice: 앱이 생성 되었습니다.
+          notice: 애플리케이션을 만들었습니다.
         destroy:
-          notice: 앱을 삭제했습니다.
+          notice: 애플리케이션을 삭제하였습니다.
         update:
-          notice: 앱을 갱신했습니다.
+          notice: 애플리케이션을 갱신했습니다.
       authorized_applications:
         destroy:
-          notice: 운영자에 의해 앱이 해지되었습니다.
+          notice: 애플리케이션을 취소하였습니다.
     grouped_scopes:
       access:
         read: 읽기 전용 권한
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index b36ec21b9..030acd639 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -99,7 +99,7 @@ th:
         server_error: เซิร์ฟเวอร์การรับรองความถูกต้องพบเงื่อนไขที่ไม่คาดคิดซึ่งป้องกันไม่ให้เซิร์ฟเวอร์ดำเนินการตามคำขอ
         temporarily_unavailable: เซิร์ฟเวอร์การรับรองความถูกต้องไม่สามารถจัดการคำขอได้ในปัจจุบันเนื่องจากการทำงานเกินพิกัดชั่วคราวหรือการบำรุงรักษาเซิร์ฟเวอร์
         unauthorized_client: ไคลเอ็นต์ไม่ได้รับอนุญาตให้ทำคำขอนี้โดยใช้วิธีการนี้
-        unsupported_grant_type: ชนิดการให้การรับรองความถูกต้องไม่รองรับโดยเซิร์ฟเวอร์การรับรองความถูกต้อง
+        unsupported_grant_type: ไม่รองรับชนิดการให้การรับรองความถูกต้องโดยเซิร์ฟเวอร์การรับรองความถูกต้อง
         unsupported_response_type: เซิร์ฟเวอร์การอนุญาตไม่รองรับชนิดการตอบสนองนี้
     flash:
       applications:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index c185459b7..e5dce13b0 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -11,17 +11,17 @@ el:
     followers:
       one: Ακόλουθος
       other: Ακόλουθοι
-    following: Ακολουθεί
-    instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον εξυπηρετητή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για ομοσπονδιακούς σκοπούς και δεν πρέπει να ανασταλεί.
+    following: Ακολουθείτε
+    instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον διακομιστή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για ομοσπονδιακούς σκοπούς και δεν πρέπει να ανασταλεί.
     last_active: τελευταία ενεργός/ή
-    link_verified_on: Η κυριότητα αυτού του συνδέσμου ελέγχθηκε στις %{date}
+    link_verified_on: Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις %{date}
     nothing_here: Δεν υπάρχει τίποτα εδώ!
     pin_errors:
       following: Πρέπει ήδη να ακολουθείς το άτομο που θέλεις να επιδοκιμάσεις
     posts:
-      one: Τουτ
-      other: Τουτ
-    posts_tab_heading: Τουτ
+      one: Ανάρτηση
+      other: Αναρτήσεις
+    posts_tab_heading: Αναρτήσεις
   admin:
     account_actions:
       action: Εκτέλεση ενέργειας
@@ -31,11 +31,11 @@ el:
       created_msg: Επιτυχής δημιουργία σημειώματος συντονισμού!
       destroyed_msg: Η σημείωση συντονισμού καταστράφηκε επιτυχώς!
     accounts:
-      add_email_domain_block: Εγγραφή τομέα email σε μαύρη λίστα
+      add_email_domain_block: Αποκλεισμός τομέα email
       approve: Έγκριση
       approved_msg: Επιτυχής έγκριση αίτησης εγγραφής του/της %{username}
       are_you_sure: Σίγουρα;
-      avatar: Αβατάρ
+      avatar: Άβαταρ
       by_domain: Τομέας
       change_email:
         changed_msg: Το email άλλαξε επιτυχώς!
@@ -57,27 +57,27 @@ el:
       deleted: Διαγραμμένοι
       demote: Υποβίβαση
       destroyed_msg: Τα δεδομένα του/της %{username} εκκρεμούν για άμεση διαγραφή
-      disable: Απενεργοποίηση
+      disable: Πάγωμα
       disable_sign_in_token_auth: Απενεργοποίηση επαλήθευσης μέσω email
       disable_two_factor_authentication: Απενεργοποίηση 2FA
-      disabled: Απενεργοποιημένο
-      display_name: Όνομα εμφάνισης
+      disabled: Παγωμένος
+      display_name: Εμφανιζόμενο όνομα
       domain: Τομέας
       edit: Επεξεργασία
       email: Email
       email_status: Κατάσταση email
-      enable: Ενεργοποίηση
+      enable: Ξεπάγωμα
       enable_sign_in_token_auth: Ενεργοποίηση ελέγχου ταυτότητας μέσω e-mail
       enabled: Ενεργοποιημένο
       enabled_msg: Επιτυχές ξεπάγωμα λογαριασμού του/της %{username}
       followers: Ακόλουθοι
       follows: Ακολουθεί
-      header: Επικεφαλίδα
+      header: Κεφαλίδα
       inbox_url: URL εισερχομένων
-      invite_request_text: Λόγοι για εγγραφή
+      invite_request_text: Λόγοι για συμμετοχή
       invited_by: Προσκλήθηκε από
       ip: IP
-      joined: Γράφτηκε
+      joined: Έγινε μέλος
       location:
         all: Όλες
         local: Τοπική
@@ -85,15 +85,15 @@ el:
         title: Τοποθεσία
       login_status: Κατάσταση σύνδεσης
       media_attachments: Συνημμένα πολυμέσα
-      memorialize: Μετατροπή σε νεκρολογία
-      memorialized: Μετατροπή σε αναμνηστικό
-      memorialized_msg: Επιτυχής μετατροπή λογαριασμού του/της %{username} σε αναμνηστικό
+      memorialize: Μετατροπή σε εις μνήμην
+      memorialized: Μετατράπηκε σε εις μνήμην
+      memorialized_msg: Επιτυχής μετατροπή λογαριασμού του/της %{username} σε εις μνήμην
       moderation:
-        active: Ενεργός/ή
-        all: Όλα
+        active: Ενεργός
+        all: Όλοι
         disabled: Απενεργοποιημένο
         pending: Εκκρεμούν
-        silenced: Περιορισμένοι
+        silenced: Περιορισμένη
         suspended: Σε αναστολή
         title: Συντονισμός
       moderation_notes: Σημειώσεις συντονισμού
@@ -102,8 +102,8 @@ el:
       no_account_selected: Κανείς λογαριασμός δεν ενημερώθηκε αφού κανείς δεν ήταν επιλεγμένος
       no_limits_imposed: Χωρίς όρια
       no_role_assigned: Δεν έχει ανατεθεί ρόλος
-      not_subscribed: Άνευ συνδρομής
-      pending: Εκκρεμεί έγκριση
+      not_subscribed: Δεν έγινε εγγραφή
+      pending: Εκκρεμεί αξιολόγηση
       perform_full_suspension: Αναστολή
       previous_strikes: Προηγούμενα παραπτώματα
       previous_strikes_description_html:
@@ -113,15 +113,15 @@ el:
       protocol: Πρωτόκολλο
       public: Δημόσιο
       push_subscription_expires: Η εγγραφή PuSH λήγει
-      redownload: Ανανέωση αβατάρ
-      redownloaded_msg: Επιτυχής ανανέωη προφίλ του/της %{username} από την πηγή
+      redownload: Ανανέωση άβαταρ
+      redownloaded_msg: Επιτυχής ανανέωση προφίλ του/της %{username} από την πηγή
       reject: Απόρριψη
       rejected_msg: Επιτυχής απόρριψη αίτησης εγγραφής του/της %{username}
       remote_suspension_irreversible: Τα δεδομένα αυτού του λογαριασμού έχουν διαγραφεί αμετάκλητα.
-      remote_suspension_reversible_hint_html: Ο λογαριασμός έχει ανασταλλεί στον server του και τα δεδομένα του θα διαγραφούν πλήρως στις %{date}. Μέχρι τότε, ο απομακρυσμένος server μπορεί να επαναφέρει τον λογαριασμό χωρίς επιπτώσεις. Αν θέλεις να διαγράψεις αμέσως όλα τα δεδομένα του λογαριασμού, μπορείς να το κάνεις παρακάτω.
-      remove_avatar: Απομακρυσμένο αβατάρ
-      remove_header: Αφαίρεση επικεφαλίδας
-      removed_avatar_msg: Επιτυχής αφαίρεση εικόνας προφίλ του/της%{username}
+      remote_suspension_reversible_hint_html: Ο λογαριασμός έχει ανασταλλεί στον διακομιστή του και τα δεδομένα του θα διαγραφούν πλήρως στις %{date}. Μέχρι τότε, ο απομακρυσμένος διακομιστής μπορεί να επαναφέρει τον λογαριασμό χωρίς επιπτώσεις. Αν θέλεις να διαγράψεις αμέσως όλα τα δεδομένα του λογαριασμού, μπορείς να το κάνεις παρακάτω.
+      remove_avatar: Αφαίρεση άβαταρ
+      remove_header: Αφαίρεση κεφαλίδας
+      removed_avatar_msg: Επιτυχής αφαίρεση εικόνας προφίλ του/της %{username}
       removed_header_msg: Επιτυχής αφαίρεση εικόνας κεφαλίδας του/της %{username}
       resend_confirmation:
         already_confirmed: Ήδη επιβεβαιωμένος χρήστης
@@ -139,14 +139,14 @@ el:
         only_password: Μόνο κωδικός πρόσβασης
         password_and_2fa: Κωδικός πρόσβασης και 2FA
       sensitive: Ευαίσθητο
-      sensitized: σήμανση ως ευαίσθητο
+      sensitized: Επισημάνθηκε ως ευαίσθητος
       shared_inbox_url: URL κοινόχρηστων εισερχομένων
       show:
-        created_reports: Αναφορές από αυτόν το λογαριασμό
-        targeted_reports: Αναφορές για αυτόν το λογαριασμό
-      silence: Αποσιώπησε
-      silenced: Αποσιωπημένοι
-      statuses: Καταστάσεις
+        created_reports: Αναφορές από τον ίδιο
+        targeted_reports: Αναφορές από άλλους
+      silence: Περιορισμός
+      silenced: Περιορισμένος
+      statuses: Αναρτήσεις
       strikes: Προηγούμενα παραπτώματα
       subscribe: Εγγραφή
       suspend: Αναστολή
@@ -154,20 +154,20 @@ el:
       suspension_irreversible: Τα δεδομένα αυτού του λογαριασμού έχουν διαγραφεί οριστικά. Μπορείς να άρεις την αναστολή του λογαριασμού για να μπορέσει να χρησιμοποιηθεί αλλά αυτό δεν θα επαναφέρει όσα δεδομένα είχε προηγουμένως.
       suspension_reversible_hint_html: Ο λογαριασμός έχει ανασταλλεί και τα δεδομένα του θα διαγραφούν πλήρως στις %{date}. Μέχρι τότε ο λογαριασμός μπορεί να επανέλθει κανονικά. Αν θέλεις να διαγράψεις όλα τα δεδομένα του λογαριασμού, μπορείς να το κάνεις παρακάτω.
       title: Λογαριασμοί
-      unblock_email: Ξεμπλοκάρισμα διεύθυνσης email
-      unblocked_email_msg: Επιτυχής κατάργηση αποκλεισμού διεύθυνσης ηλεκτρονικού ταχυδρομείου %{username}
+      unblock_email: Άρση αποκλεισμού διεύθυνσης email
+      unblocked_email_msg: Επιτυχής άρση αποκλεισμού διεύθυνσης email %{username}
       unconfirmed_email: Ανεπιβεβαίωτο email
-      undo_sensitized: Αναίρεση ευαίσθητου
-      undo_silenced: Αναίρεση αποσιώπησης
+      undo_sensitized: Άρση ευαίσθητου
+      undo_silenced: Άρση περιορισμού
       undo_suspension: Αναίρεση παύσης
       unsilenced_msg: Επιτυχής άρση περιορισμών λογαριασμού του/της %{username}
       unsubscribe: Κατάργηση εγγραφής
       unsuspended_msg: Επιτυχής άρση αναστολής λογαριασμού του/της %{username}
       username: Όνομα χρήστη
-      view_domain: Προβολή περίληψης για τομέα
+      view_domain: Προβολή περίληψης τομέα
       warn: Προειδοποίηση
       web: Διαδίκτυο
-      whitelisted: Εγκεκριμένοι
+      whitelisted: Εγκεκριμένοι για συναλλαγές
     action_logs:
       action_types:
         approve_appeal: Έγκριση Έφεσης
@@ -180,9 +180,9 @@ el:
         create_announcement: Δημιουργία Ανακοίνωσης
         create_canonical_email_block: Δημιουργία αποκλεισμού e-mail
         create_custom_emoji: Δημιουργία Προσαρμοσμένου Emoji
-        create_domain_allow: Δημιουργία Επιτρεπτού Τομέα
-        create_domain_block: Δημιουργία Αποκλεισμένου Τομέα
-        create_email_domain_block: Δημουργία Αποκλεισμένου Τομέα email
+        create_domain_allow: Δημιουργία ΑποδεκτούΤομέα
+        create_domain_block: Δημιουργία Αποκλεισμού Τομέα
+        create_email_domain_block: Δημουργία Αποκλεισμού Τομέα email
         create_ip_block: Δημιουργία κανόνα IP
         create_unavailable_domain: Δημιουργία Μη Διαθέσιμου Τομέα
         create_user_role: Δημιουργία ρόλου
@@ -190,7 +190,7 @@ el:
         destroy_announcement: Διαγραφή Ανακοίνωσης
         destroy_canonical_email_block: Διαγραφή Αποκλεισμού email
         destroy_custom_emoji: Διαγραφή Προσαρμοσμένου Emoji
-        destroy_domain_allow: Διαγραφή Επιτρεπτού Τομέα
+        destroy_domain_allow: Διαγραφή Αποδεκτού Τομέα
         destroy_domain_block: Διαγραφή Αποκλεισμού Τομέα
         destroy_email_domain_block: Διαγραφή Αποκλεισμένου Τομέα email
         destroy_instance: Εκκαθάριση Τομέα
@@ -205,33 +205,33 @@ el:
         enable_custom_emoji: Ενεργοποίηση Προσαρμοσμένων Emoji
         enable_sign_in_token_auth_user: Ενεργοποίηση Ελέγχου Ταυτότητας Μέσω E-mail για το Χρήστη
         enable_user: Ενεργοποίηση Χρήστη
-        memorialize_account: Μετατροπή Λογαριασμού σε Αναμνηστικό
+        memorialize_account: Μετατροπή Λογαριασμού σε Εις Μνήμην
         promote_user: Προαγωγή Χρήστη
         reject_appeal: Απόρριψη Έφεσης
         reject_user: Απόρριψη Χρήστη
-        remove_avatar_user: Αφαίρεση Avatar
-        reopen_report: Ξανάνοιγμα Καταγγελίας
+        remove_avatar_user: Αφαίρεση Άβαταρ
+        reopen_report: Ξανάνοιγμα Ανααφοράς
         resend_user: Επαναποστολή του email επιβεβαίωσης
         reset_password_user: Επαναφορά Συνθηματικού
-        resolve_report: Επίλυση Καταγγελίας
-        sensitive_account: Σήμανση των πολυμέσων στον λογαριασμό σας ως ευαίσθητων
-        silence_account: Σίγαση Λογαριασμού
+        resolve_report: Επίλυση Αναφοράς
+        sensitive_account: Ευαίσθητος Λογιαριασμός
+        silence_account: Περιορισμός Λογαριασμού
         suspend_account: Αναστολή Λογαριασμού
-        unassigned_report: Αποδέσμευση Καταγγελίας
-        unblock_email_account: Ξεμπλοκάρισμα διεύθυνσης email
-        unsensitive_account: Αφαίρεση σήμανσης των πολυμέσων στον λογαριασμό σας ως ευαίσθητων
-        unsilence_account: Άρση Σίγασης Λογαριασμού
+        unassigned_report: Αποδέσμευση Αναφοράς
+        unblock_email_account: Άρση αποκλεισμού διεύθυνσης email
+        unsensitive_account: Άρση επισήμανσης Λογαριασμού ως Ευαίσθητο
+        unsilence_account: Άρση Περιορισμού Λογαριασμού
         unsuspend_account: Άρση Αναστολής Λογαριασμού
         update_announcement: Ενημέρωση Ανακοίνωσης
         update_custom_emoji: Ενημέρωση Προσαρμοσμένου Emoji
         update_domain_block: Ενημέρωση Αποκλεισμού Τομέα
         update_ip_block: Ενημέρωση κανόνα IP
-        update_status: Ενημέρωση Κατάστασης
+        update_status: Ενημέρωση Ανάρτησης
         update_user_role: Ενημέρωση ρόλου
       actions:
         approve_appeal_html: Ο/Η %{name} ενέκρινε την ένσταση της απόφασης των συντονιστών από %{target}
-        approve_user_html: "%{name} εγκρίθηκε εγγραφή από %{target}"
-        assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την καταγγελία %{target} στον εαυτό του/της
+        approve_user_html: ο/η %{name} ενέκρινε την εγγραφή του %{target}
+        assigned_to_self_report_html: Ο/Η %{name} ανάθεσε την αναφορά %{target} στον εαυτό του/της
         change_email_user_html: Ο/Η %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
         change_role_user_html: Ο/Η %{name} άλλαξε ρόλο του/της %{target}
         confirm_user_html: Ο/Η %{name} επιβεβαίωσε τη διεύθυνση email του χρήστη %{target}
@@ -239,7 +239,7 @@ el:
         create_announcement_html: Ο/Η %{name} δημιούργησε νέα ανακοίνωση %{target}
         create_canonical_email_block_html: Ο/Η %{name} απέκλεισε e-mail με το hash %{target}
         create_custom_emoji_html: Ο/Η %{name} ανέβασε νέο emoji %{target}
-        create_domain_allow_html: Ο/Η %{name} έβαλε τον τομέα %{target} σε λευκή λίστα
+        create_domain_allow_html: Ο/Η %{name} επέτρεψε την συναλλαγή με τον τομέα %{target}
         create_domain_block_html: Ο/Η %{name} απέκλεισε τον τομέα %{target}
         create_email_domain_block_html: Ο/Η %{name} απέκλεισε τον τομέα email %{target}
         create_ip_block_html: Ο/Η %{name} δημιούργησε κανόνα για την IP %{target}
@@ -257,18 +257,18 @@ el:
         destroy_status_html: Ο/Η %{name} αφαίρεσε την ανάρτηση του/της %{target}
         destroy_unavailable_domain_html: Ο/Η %{name} ξανάρχισε να τροφοδοτεί το domain %{target}
         destroy_user_role_html: Ο/Η %{name} διέγραψε τον ρόλο του %{target}
-        disable_2fa_user_html: Ο/Η %{name} απενεργοποίησε το two factor requirement για τον χρήστη %{target}
+        disable_2fa_user_html: Ο/Η %{name} απενεργοποίησε την απαίτηση για ταυτοποίηση δύο παραγόντων για τον χρήστη %{target}
         disable_custom_emoji_html: Ο/Η %{name} απενεργοποίησε το emoji %{target}
-        disable_sign_in_token_auth_user_html: Ο/Η %{name} απενεργοποίησε την πιστοποίηση e-mail token του %{target}
+        disable_sign_in_token_auth_user_html: Ο/Η %{name} απενεργοποίησε την ταυτοποίηση χαρακτηριστικού μέσω e-mail του %{target}
         disable_user_html: Ο/Η %{name} απενεργοποίησε τη σύνδεση για τον χρήστη %{target}
         enable_custom_emoji_html: Ο/Η %{name} ενεργοποίησε το emoji %{target}
-        enable_sign_in_token_auth_user_html: Ο/Η %{name} ενεργοποίησε την πιστοποίηση e-mail token του %{target}
+        enable_sign_in_token_auth_user_html: Ο/Η %{name} ενεργοποίησε την ταυτοποίηση χαρακτηριστικού μέσω e-mail του %{target}
         enable_user_html: Ο/Η %{name} ενεργοποίησε τη σύνδεση για τον χρήστη %{target}
-        memorialize_account_html: O/H %{name} μετέτρεψε τον λογαριασμό του %{target} σε σελίδα μνήμης
+        memorialize_account_html: O/H %{name} μετέτρεψε τον λογαριασμό του %{target} σε σελίδα εις μνήμην
         promote_user_html: Ο/Η %{name} προβίβασε το χρήστη %{target}
         reject_appeal_html: Ο/Η %{name} απέρριψε την ένσταση της απόφασης των συντονιστών από %{target}
-        reject_user_html: "%{name} απορρίφθηκε εγγραφή από %{target}"
-        remove_avatar_user_html: Ο/Η %{name} αφαίρεσε το αβατάρ του/της %{target}
+        reject_user_html: ο/η %{name} απέρριψε την εγγραφή από %{target}
+        remove_avatar_user_html: ο/η %{name} αφαίρεσε το άβαταρ του/της %{target}
         reopen_report_html: Ο/Η %{name} ξανάνοιξε την αναφορά %{target}
         resend_user_html: Ο/Η %{name} έστειλε ξανά e-mail επιβεβαίωσης για τον/την %{target}
         reset_password_user_html: Ο/Η %{name} επανέφερε το συνθηματικό του χρήστη %{target}
@@ -277,11 +277,11 @@ el:
         silence_account_html: Ο/Η %{name} περιόρισε τον λογαριασμό του/της %{target}
         suspend_account_html: Ο/Η %{name} ανέστειλε τον λογαριασμό του/της %{target}
         unassigned_report_html: Ο/Η %{name} αποδέσμευσε την αναφορά %{target}
-        unblock_email_account_html: "%{name} ξεμπλόκαρε τη διεύθυνση ηλεκτρονικού ταχυδρομείου του %{target}"
-        unsensitive_account_html: Ο/Η %{name} επισήμανε τα πολυμέσα του/της %{target} ως ευαίσθητα
-        unsilence_account_html: Ο/Η %{name} αφαίρεσε το όριο του λογαριασμού του/της %{target}
+        unblock_email_account_html: "%{name} έκανε άρση αποκλεισμού στη διεύθυνση email του %{target}"
+        unsensitive_account_html: Ο/Η %{name} επισήμανε τα πολυμέσα του/της %{target} ως μη ευαίσθητα
+        unsilence_account_html: Ο/Η %{name} αφαίρεσε το περιορισμό του λογαριασμού του/της %{target}
         unsuspend_account_html: Ο/Η %{name} επανέφερε τον λογαριασμό του/της %{target}
-        update_announcement_html: Ο/Η %{name} ενημέρωση την ανακοίνωση %{target}
+        update_announcement_html: Ο/Η %{name} ενημέρωσε την ανακοίνωση %{target}
         update_custom_emoji_html: Ο/Η %{name} ενημέρωσε το emoji %{target}
         update_domain_block_html: Ο/Η %{name} ενημέρωσε τον αποκλεισμό τομέα για %{target}
         update_ip_block_html: Ο/Η %{name} άλλαξε τον κανόνα για την IP %{target}
@@ -310,12 +310,12 @@ el:
       unpublished_msg: Επιτυχής ακύρωση δημοσίευσης ανακοίνωσης!
       updated_msg: Επιτυχής ενημέρωση ανακοίνωσης!
     custom_emojis:
-      assign_category: Κατηγορία
+      assign_category: Ανάθεση κατηγορίας
       by_domain: Τομέας
       copied_msg: Επιτυχής δημιουργία τοπικού αντίγραφου του emoji
       copy: Αντιγραφή
       copy_failed_msg: Αδυναμία δημιουργίας τοπικού αντίγραφου αυτού του emoji
-      create_new_category: Νέα κατηγορία
+      create_new_category: Δημιούργησε νέα κατηγορία
       created_msg: Επιτυχής δημιουργία του emoji!
       delete: Διαγραφή
       destroyed_msg: Επιτυχής καταστροφή του emojo!
@@ -327,7 +327,7 @@ el:
       enabled: Ενεργοποιημένα
       enabled_msg: Επιτυχής ενεργοποίηση αυτού του emoji
       image_hint: PNG ή GIF έως %{size}
-      list: Εμφάνιση
+      list: Παράθεση
       listed: Αναφερθέντα
       new:
         title: Προσθήκη νέου προσαρμοσμένου emoji
@@ -338,17 +338,20 @@ el:
       shortcode_hint: Τουλάχιστον 2 χαρακτήρες, μόνο αλφαριθμητικοί και κάτω παύλες
       title: Προσαρμοσμένα emoji
       uncategorized: Χωρίς κατηγορία
-      unlist: Απόκρυψη
+      unlist: Αφαίρεση από λίστα
       unlisted: Μη καταχωρημένα
       update_failed_msg: Αδυναμία ενημέρωσης του emoji
       updated_msg: Επιτυχής ενημέρωση του emoji!
-      upload: Ανέβασμα
+      upload: Μεταμόρφωση
     dashboard:
       active_users: ενεργοί χρήστες
       interactions: αλληλεπιδράσεις
-      media_storage: Αποθηκευτικός Χώρος
+      media_storage: Χώρος πολυμέσων
       new_users: νέοι χρήστες
-      opened_reports: αναφορές που ανοίχτηκαν
+      opened_reports: ανοιγμένες αναφορές
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> έφεση σε εκκρεμότητα"
+        other: "<strong>%{count}</strong> εφέσεις σε εκκρεμότητα"
       pending_reports_html:
         one: "<strong>%{count}</strong> εκκρεμής αναφορά"
         other: "<strong>%{count}</strong> εκκρεμείς αναφορές"
@@ -372,17 +375,17 @@ el:
         title: Εφέσεις
     domain_allows:
       add_new: Έγκριση τομέα
-      created_msg: Ο τομέας εγκρίθηκε με επιτυχία
-      destroyed_msg: Ο τομέας δεν είναι πια εγκεκριμένος
+      created_msg: Ο τομέας εγκρίθηκε με επιτυχία για συναλλαγές
+      destroyed_msg: Ο τομέας δεν είναι πια εγκεκριμένος για συναλλαγές
       export: Εξαγωγή
       import: Εισαγωγή
-      undo: Αφαίρεση έγκρισης
+      undo: Αφαίρεση συναλλαγής με τον τομέα
     domain_blocks:
-      add_new: Προσθήκη νέου
+      add_new: Προσθήκη νέου αποκλεισμού τομέα
       created_msg: Ο αποκλεισμός τομέα είναι υπό επεξεργασία
-      destroyed_msg: Ο αποκλεισμός τομέα άρθηκε
+      destroyed_msg: Ο αποκλεισμός τομέα αναιρέθηκε
       domain: Τομέας
-      edit: Επεξεργασία αποκλεισμένου τομέα
+      edit: Επεξεργασία αποκλεισμού τομέα
       existing_domain_block: Έχετε ήδη επιβάλει αυστηρότερα όρια στο %{name}.
       existing_domain_block_html: Έχεις ήδη επιβάλλει αυστηρότερους περιορισμούς στο %{name}, πρώτα θα πρέπει να τους <a href="%{unblock_url}">αναιρέσεις</a>.
       export: Εξαγωγή
@@ -391,7 +394,7 @@ el:
         create: Δημιουργία αποκλεισμού
         hint: Ο αποκλεισμός τομέα δεν θα αποτρέψει νέες καταχωρίσεις λογαριασμών στην βάση δεδομένων, αλλά θα εφαρμόσει αναδρομικά και αυτόματα συγκεκριμένες πολιτικές συντονισμού σε αυτούς τους λογαριασμούς.
         severity:
-          desc_html: Ο <strong>περιορισμός</strong> θα κάνει αόρατες τις δημοσιεύσεις ενός λογαριασμού σε όσους δεν τον ακολουθούν. Η <strong>αναστολή</strong> θα αφαιρέσει όλο το περιεχόμενο, τα πολυμέσα και τα στοιχεία προφίλ ενός λογαριασμού. Χρησιμοποίησε το <strong>κανένα</strong> αν θέλεις απλά να απορρίψεις τα αρχεία πολυμέσων.
+          desc_html: Ο <strong>περιορισμός</strong> θα κάνει αόρατες τις ανάρτησεις ενός λογαριασμού σε όσους δεν τον ακολουθούν. Η <strong>αναστολή</strong> θα αφαιρέσει όλο το περιεχόμενο, τα πολυμέσα και τα στοιχεία προφίλ ενός λογαριασμού. Χρησιμοποίησε το <strong>κανένα</strong> αν θέλεις απλά να απορρίψεις τα αρχεία πολυμέσων.
           noop: Κανένα
           silence: Περιορισμός
           suspend: Αναστολή
@@ -403,33 +406,33 @@ el:
       private_comment: Ιδιωτικό σχόλιο
       private_comment_hint: Σχόλιο για τον περιορισμό αυτού του τομέα για εσωτερική χρήση από τους συντονιστές.
       public_comment: Δημόσιο σχόλιο
-      public_comment_hint: Σχόλιο σχετικά με τον περιορισμό αυτού του τομέα προς το κοινό, αν η λειτουργία δημοσιοποίησης των περιορισμένων τομέων είναι ενεργοποιημένη.
-      reject_media: Απόρριψη πολυμέσων
+      public_comment_hint: Σχόλιο σχετικά με τον περιορισμό αυτού του τομέα προς το κοινό, αν η λειτουργία διαφήμισης των περιορισμένων τομέων είναι ενεργοποιημένη.
+      reject_media: Απόρριψη αρχείων πολυμέσων
       reject_media_hint: Αφαιρεί τα τοπικά αποθηκευμένα αρχεία πολυμέσων και αποτρέπει τη λήψη άλλων στο μέλλον. Δεν έχει σημασία για τις αναστολές
-      reject_reports: Απόρριψη καταγγελιών
-      reject_reports_hint: Αγνόηση όσων καταγγελιών προέρχονται από αυτό τον τομέα. Δεν σχετίζεται με τις παύσεις
-      undo: Αναίρεση
+      reject_reports: Απόρριψη αναφορών
+      reject_reports_hint: Αγνόησε όσων αναφορών που προέρχονται από αυτό τον τομέα. Δεν σχετίζεται με τις παύσεις
+      undo: Αναίρεση αποκλεισμού τομέα
       view: Εμφάνιση αποκλεισμού τομέα
     email_domain_blocks:
       add_new: Πρόσθεση νέου
       attempts_over_week:
         one: "%{count} προσπάθεια την τελευταία εβδομάδα"
         other: "%{count} προσπάθειες εγγραφής την τελευταία εβδομάδα"
-      created_msg: Επιτυχής πρόσθεση email τομέα σε μαύρη λίστα
+      created_msg: Επιτυχής αποκλεισμού email τομέα
       delete: Διαγραφή
       dns:
         types:
           mx: Εγγραφή MX
       domain: Τομέας
       new:
-        create: Πρόσθεση τομέα
+        create: Προσθήκη τομέα
         resolve: Επίλυση τομέα
-        title: Νέα εγγραφή email στη μαύρη λίστα
+        title: Αποκλεισμός νέου τομέα email
       no_email_domain_block_selected: Δεν άλλαξαν οι αποκλεισμοί τομέα καθώς δεν επιλέχθηκε κανένας
       not_permitted: Δεν επιτρέπεται
       resolved_dns_records_hint_html: Το όνομα τομέα επιλύεται στους ακόλουθους τομείς MX, οι οποίοι είναι τελικά υπεύθυνοι για την αποδοχή των e-mail. Αποκλείοντας έναν τομέα MX θα μπλοκάρει τις εγγραφές από οποιαδήποτε διεύθυνση email που χρησιμοποιεί τον ίδιο τομέα MX, ακόμη και αν το ορατό όνομα τομέα είναι διαφορετικό. <strong>Προσέξτε να μην αποκλείσετε τους μεγάλους παρόχους ηλεκτρονικού ταχυδρομείου.</strong>
       resolved_through_html: Επιλύθηκε μέσω %{domain}
-      title: Μαύρη λίστα email
+      title: Αποκλεισμένοι τομείς email
     export_domain_allows:
       new:
         title: Εισαγωγή επιτρεπόμενων τομέων
@@ -451,14 +454,14 @@ el:
       status: Κατάσταση
       suppress: Καταστολή της πρότασης ακολούθησης
       suppressed: Κατασταλμένο
-      title: Ακολουθήστε τις προτάσεις
+      title: Ακολούθησε τις προτάσεις
       unsuppress: Επαναφορά των συστάσεων ακολούθησης
     instances:
       availability:
         description_html:
-          one: Εάν η παράδοση στον τομέα αποτύχει για <strong>%{count} ημέρα</strong>, δεν θα γίνουν περαιτέρω προσπάθειες παράδοσης εκτός αν μια παράδοση <em>από</em> τον τομέα παραληφθεί.
-          other: Εάν η παράδοση στον τομέα αποτύχει για <strong>%{count} διαφορετικές ημέρες</strong>, δεν θα γίνουν περαιτέρω προσπάθειες παράδοσης εκτός αν μια παράδοση <em>από</em> τον τομέα παραληφθεί.
-        failure_threshold_reached: Το όριο αποτυχίας έφτασε στο %{date}.
+          one: Εάν η παράδοση στον τομέα αποτύχει για <strong>%{count} ημέρα</strong>, δεν θα γίνουν περαιτέρω προσπάθειες παράδοσης εκτός αν μια παράδοση <em>από</em> τον τομέα ληφθεί.
+          other: Εάν η παράδοση στον τομέα αποτύχει για <strong>%{count} διαφορετικές ημέρες</strong>, δεν θα γίνουν περαιτέρω προσπάθειες παράδοσης εκτός αν μια παράδοση <em>από</em> τον τομέα ληφθεί.
+        failure_threshold_reached: Το όριο αποτυχίας επετεύχθη στις %{date}.
         failures_recorded:
           one: Αποτυχία προσπάθειας την %{count} ημέρα.
           other: Αποτυχημένες προσπάθειες σε %{count} διαφορετικές ημέρες.
@@ -467,13 +470,13 @@ el:
         warning: Η τελευταία προσπάθεια σύνδεσης σε αυτόν τον διακομιστή απέτυχε
       back_to_all: Όλα
       back_to_limited: Περιορισμένα
-      back_to_warning: Προσοχή
+      back_to_warning: Προειδοποίηση
       by_domain: Τομέας
-      confirm_purge: Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα τα δεδομένα από αυτόν τον τομέα;
+      confirm_purge: Είσαι βέβαιος ότι θες να διαγράψεις μόνιμα τα δεδομένα από αυτόν τον τομέα;
       content_policies:
         comment: Εσωτερική σημείωση
-        description_html: Μπορείτε να ορίσετε τις πολιτικές περιεχομένου που θα εφαρμόζονται σε όλους τους λογαριασμούς από αυτόν τον τομέα και οποιονδήποτε από τους υποτομείς του.
-        limited_federation_mode_description_html: Μπορείτε να επιλέξετε αν θα επιτρέψετε την ομοσπονδία με αυτόν τον τομέα.
+        description_html: Μπορείς να ορίσεις τις πολιτικές περιεχομένου που θα εφαρμόζονται σε όλους τους λογαριασμούς από αυτόν τον τομέα και οποιονδήποτε από τους υποτομείς του.
+        limited_federation_mode_description_html: Μπορείτε να επιλέξετε αν θα επιτρέψετε τις συναλλαγές με αυτόν τον τομέα.
         policies:
           reject_media: Απόρριψη πολυμέσων
           reject_reports: Απόρριψη αναφορών
@@ -490,11 +493,11 @@ el:
         instance_languages_dimension: Κορυφαίες γλώσσες
         instance_media_attachments_measure: αποθηκευμένα συνημμένα πολυμέσων
         instance_reports_measure: αναφορές γι' αυτές
-        instance_statuses_measure: αποθηκευμένες δημοσιεύσεις
+        instance_statuses_measure: αποθηκευμένες αναρτήσεις
       delivery:
         all: Όλες
         clear: Εκκαθάριση σφαλμάτων παράδοσης
-        failing: Αποτυγχάνει
+        failing: Αποτυχημένες
         restart: Επανεκκίνηση παράδοσης
         stop: Διακοπή παράδοσης
         unavailable: Μη διαθέσιμο
@@ -513,12 +516,12 @@ el:
       private_comment: Ιδιωτικό σχόλιο
       public_comment: Δημόσιο σχόλιο
       purge: Εκκαθάριση
-      purge_description_html: Εάν πιστεύετε ότι αυτός ο τομέας είναι εκτός σύνδεσης για πάντα, μπορείτε να διαγράψετε όλες τις καταχωρήσεις λογαριασμών και τα σχετικά δεδομένα από αυτόν τον τομέα από τον αποθηκευτικό σας χώρο. Αυτό μπορεί να διαρκέσει λίγη ώρα.
-      title: Γνωστοί κόμβοι
-      total_blocked_by_us: Μπλοκάρονται από εμάς
+      purge_description_html: Εάν πιστεύεις ότι αυτός ο τομέας είναι πλήρως εκτός σύνδεσης, μπορείς να διαγράψεις όλες τις καταχωρήσεις λογαριασμών και τα σχετικά δεδομένα από αυτόν τον τομέα από τον αποθηκευτικό σου χώρο. Αυτό μπορεί να διαρκέσει λίγη ώρα.
+      title: Συναλλαγές
+      total_blocked_by_us: Αποκλεισμένοι από εμάς
       total_followed_by_them: Ακολουθούνται από εκείνους
       total_followed_by_us: Ακολουθούνται από εμάς
-      total_reported: Καταγγελίες προς εκείνους
+      total_reported: Αναφορές προς εκείνους
       total_storage: Συνημμένα πολυμέσα
       totals_time_period_hint_html: Τα σύνολα που εμφανίζονται παρακάτω περιλαμβάνουν στοιχεία από την αρχή.
     invites:
@@ -545,26 +548,26 @@ el:
       no_ip_block_selected: Δεν άλλαξαν οι κανόνες IP καθώς κανένας δεν επιλέχθηκε
       title: Κανόνες IP
     relationships:
-      title: Σχέσεις %{acct}
+      title: Σχέσεις του %{acct}
     relays:
-      add_new: Πρόσθεσε νέο ανταποκριτή (relay)
+      add_new: Προσθήκη νέου ανταποκριτή
       delete: Διαγραφή
-      description_html: Ο <strong>ομοσπονδιακός ανταποκριτής</strong> είναι ένας ενδιάμεσος εξυπηρετητής (server) που ανταλλάσσει μεγάλους όγκους δημόσιων τουτ μεταξύ εξυπηρετητών που εγγράφονται και δημοσιεύουν σε αυτόν. <strong>Βοηθάει μικρούς και μεσαίους εξυπηρετητές να ανακαλύψουν περιεχόμενο στο fediverse</strong>, που υπό άλλες συνθήκες θα χρειαζόταν κάποιους τοπικούς χρήστες που να ακολουθούν χρήστες σε απομακρυσμένους εξυπηρετητές.
+      description_html: Ο <strong>ανταποκριτής συναλλαγών</strong> είναι ένας ενδιάμεσος διακομιστής που ανταλλάσσει μεγάλους όγκους δημόσιων αναρτήσεων μεταξύ διακομιστών που εγγράφονται και δημοσιεύουν σε αυτόν. <strong>Βοηθάει μικρούς και μεσαίους να ανακαλύψουν περιεχόμενο στο fediverse</strong>, που υπό άλλες συνθήκες θα χρειαζόταν κάποιους τοπικούς χρήστες που να ακολουθούν χρήστες σε απομακρυσμένους διακομιστές.
       disable: Απενεργοποίηση
       disabled: Απενεργοποιημένο
       enable: Ενεργοποίηση
-      enable_hint: Μόλις ενεργοποιηθεί, ο εξυπηρετητής (server) σου θα εγγραφεί σε όλα τα δημόσια τουτ αυτού του ανταποκριτή (relay) και θα αρχίσει να προωθεί τα δικά του δημόσια τουτ σε αυτόν.
+      enable_hint: Μόλις ενεργοποιηθεί, ο διακομιστής σου θα εγγραφεί σε όλα τις δημόσιες αναρτήσεις αυτού του ανταποκριτή και θα αρχίσει να προωθεί τις δικές του δημόσιες αναρτήσεις σε αυτόν.
       enabled: Ενεργοποιημένο
       inbox_url: URL ανταποκριτή
       pending: Περιμένοντας την έγκριση του ανταποκριτή
       save_and_enable: Αποθήκευση και ενεργοποίηση
       setup: Όρισε μια σύνδεση ανταπόκρισης
-      signatures_not_enabled: Οι ανταποκριτές δεν θα λειτουργούν σωστά όσο είναι ενεργοποιημένες οι επιλογές ασφαλούς λειτουργίας ή επιτρεπόμενων συνδέσεων
+      signatures_not_enabled: Οι ανταποκριτές δεν θα λειτουργούν σωστά όσο είναι ενεργοποιημένες οι επιλογές ασφαλούς λειτουργίας ή περιορισμένων συναλλαγών
       status: Κατάσταση
       title: Ανταποκριτές
     report_notes:
-      created_msg: Επιτυχής δημιουργία σημείωσης καταγγελίας!
-      destroyed_msg: Επιτυχής διαγραφή σημείωσης καταγγελίας!
+      created_msg: Επιτυχής δημιουργία σημείωσης αναφοράς!
+      destroyed_msg: Επιτυχής διαγραφή σημείωσης αναφοράς!
     reports:
       account:
         notes:
@@ -576,16 +579,16 @@ el:
         delete_description_html: Οι δημοσιεύσεις με αναφορά θα διαγραφούν και θα καταγραφεί μια ποινή που θα σας βοηθήσει να αποφασίσετε σε μελλοντικές παραβάσεις από τον ίδιο λογαριασμό.
         mark_as_sensitive_description_html: Τα πολυμέσα με αναφορά θα επισημανθούν ως ευαίσθητα και θα καταγραφεί μια ποινή που θα σας βοηθήσει να αποφασίσετε σε μελλοντικές παραβάσεις από τον ίδιο λογαριασμό.
         other_description_html: Δείτε περισσότερες επιλογές για τον έλεγχο της συμπεριφοράς του λογαριασμού και προσαρμόσετε την επικοινωνία στον αναφερόμενο λογαριασμό.
-        resolve_description_html: Δεν θα ληφθούν μέτρα κατά του αναφερόμενου λογαριασμού, δεν θα καταγραφεί καμία ποινή, και η αναφορά θα κλείσει.
+        resolve_description_html: Δεν θα ληφθούν μέτρα κατά του αναφερόμενου λογαριασμού, δεν θα καταγραφεί κανένα παράπτωμα, και η αναφορά θα κλείσει.
         silence_description_html: Ο λογαριασμός θα είναι ορατός μόνο σε εκείνους που ήδη τον ακολουθούν ή τον αναζητούν χειροκίνητα, περιορίζοντας κατά πολύ την εμβέλειά του. Η ενέργεια αυτή είναι αναστρέψιμη. Κλείνει όλες τις αναφορές εναντίον αυτού του λογαριασμού.
         suspend_description_html: Ο λογαριασμός και όλο το περιεχόμενό του θα είναι απρόσιτα και τελικά θα διαγραφούν και η αλληλεπίδραση με αυτόν θα είναι αδύνατη. Αναστρέψιμη εντός 30 ημερών. Κλείνει όλες τις αναφορές εναντίον αυτού του λογαριασμού.
-      actions_description_html: Αποφασίστε ποια μέτρα θα ληφθούν για την επίλυση αυτής της αναφοράς. Εάν προβείτε σε τιμωρητική ενέργεια κατά του αναφερόμενου λογαριασμού, θα αποσταλεί ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου σε αυτούς, εκτός όταν η κατηγορία <strong>Σπαμ</strong> είναι επιλεγμένη.
-      actions_description_remote_html: Αποφασίστε ποια μέτρα θα ληφθούν για την επίλυση αυτής της αναφοράς. Αυτό θα επηρεάσει μόνο το πώς <strong>ο δικός σας</strong> διακομιστής επικοινωνεί με αυτόν τον απομακρυσμένο λογαριασμό και χειρίζεται το περιεχόμενό του.
-      add_to_report: Προσθέστε περισσότερα στην αναφορά
+      actions_description_html: Αποφάσισε ποια μέτρα θα ληφθούν για την επίλυση αυτής της αναφοράς. Εάν προβείς σε τιμωρητική ενέργεια κατά του αναφερόμενου λογαριασμού, θα αποσταλεί ειδοποίηση μέσω ηλεκτρονικού ταχυδρομείου σε αυτόν, εκτός όταν η κατηγορία <strong>Σπαμ</strong> είναι επιλεγμένη.
+      actions_description_remote_html: Αποφάσισε ποια μέτρα θα ληφθούν για την επίλυση αυτής της αναφοράς. Αυτό θα επηρεάσει μόνο το πώς <strong>ο δικός σας</strong> διακομιστής επικοινωνεί με αυτόν τον απομακρυσμένο λογαριασμό και χειρίζεται το περιεχόμενό του.
+      add_to_report: Πρόσθεσε περισσότερα στην αναφορά
       are_you_sure: Σίγουρα;
       assign_to_self: Ανάθεση σε μένα
       assigned: Αρμόδιος συντονιστής
-      by_target_domain: Κόμβος του λογαριασμού υπό καταγγελία
+      by_target_domain: Τομέας του αναφερόμενου λογαριασμού
       cancel: Άκυρο
       category: Κατηγορία
       category_description_html: Ο λόγος για τον οποίο αναφέρθηκε αυτός ο λογαριασμός και/ή το περιεχόμενο θα εσωκλείεται σε επικοινωνία με τον αναφερόμενο λογαριασμό
@@ -593,57 +596,57 @@ el:
         none: Κανένα
       comment_description_html: 'Για να δώσει περισσότερες πληροφορίες, ο/η %{name} έγραψε:'
       confirm: Επιβεβαίωση
-      confirm_action: Επιβεβαίωση ενέργειαςδιαχείρισης ενάντια στον λογαριασμό @%{acct}
-      created_at: Καταγγέλθηκε
-      delete_and_resolve: Διαγραφή δημοσιεύσεων
+      confirm_action: Επιβεβαίωση ενέργειας συντονισμού ενάντια στον λογαριασμό @%{acct}
+      created_at: Αναφέρθηκε
+      delete_and_resolve: Διαγραφή αναρτήσεων
       forwarded: Προωθημένα
       forwarded_to: Προώθημένα προς %{domain}
-      mark_as_resolved: Σημειωμένο ως επιλυμένο
+      mark_as_resolved: Σημείωση ως επιλυμένο
       mark_as_sensitive: Σήμανση ως ευαίσθητο
-      mark_as_unresolved: Σημειωμένο ως ανεπίλυτο
+      mark_as_unresolved: Σήμανση ως ανεπίλυτο
       no_one_assigned: Κανένας
       notes:
         create: Πρόσθεσε σημείωση
-        create_and_resolve: Επίλυσε με σημείωση
-        create_and_unresolve: Ξανάνοιξε με σημείωση
+        create_and_resolve: Επίλυσε μέ σημείωση
+        create_and_unresolve: Ξανάνοιξε μέ σημείωση
         delete: Διαγραφή
-        placeholder: Περιέγραψε τις ενέργειες που έγιναν, ή οποιαδήποτε άλλη ενημέρωση...
+        placeholder: Περιέγραψε τις ενέργειες που έγιναν, ή οποιαδήποτε άλλη σχετική ενημέρωση...
         title: Σημειώσεις
-      notes_description_html: Δείτε και αφήστε σημειώσεις σε άλλους διαχειριστές και τον μελλοντικό εαυτό σας
+      notes_description_html: Δες και άφησε σημειώσεις σε άλλους συντονιστές και τον μελλοντικό εαυτό σου
       processed_msg: 'Η αναφορά #%{id} διεκπεραιώθηκε με επιτυχία'
-      quick_actions_description_html: 'Κάντε μια γρήγορη ενέργεια ή μετακινηθείτε προς τα κάτω για να δείτε το αναφερόμενο περιεχόμενο:'
+      quick_actions_description_html: 'Κάνε μια γρήγορη ενέργεια ή μετακινήσου προς τα κάτω για να δεις το αναφερόμενο περιεχόμενο:'
       remote_user_placeholder: ο απομακρυσμένος χρήστης από %{instance}
-      reopen: Ξανάνοιξε την καταγγελία
-      report: 'Καταγγελία #%{id}'
+      reopen: Ξανάνοιξε την αναφορά
+      report: 'Αναφορά #%{id}'
       reported_account: Αναφερόμενος λογαριασμός
       reported_by: Αναφέρθηκε από
       resolved: Επιλύθηκε
-      resolved_msg: Η καταγγελία επιλύθηκε επιτυχώς!
+      resolved_msg: Η αναφορά επιλύθηκε επιτυχώς!
       skip_to_actions: Μετάβαση στις ενέργειες
       status: Κατάσταση
       statuses: Αναφερόμενο περιεχόμενο
-      statuses_description_html: Το προσβλητικό θα εσωκλείεται στην επικοινωνία με τον αναφερόμενο λογαριασμό
+      statuses_description_html: Το προσβλητικό περιεχόμενο θα εσωκλείεται στην επικοινωνία με τον αναφερόμενο λογαριασμό
       summary:
         action_preambles:
-          delete_html: 'Πρόκειται να <strong>αφαιρέσετε</strong> μερικές από τις δημοσιεύσεις του <strong>@%{acct}</strong>. Αυτό θα:'
-          mark_as_sensitive_html: 'Πρόκειται να <strong>επισημάνετε</strong> μερικές από τις δημοσιεύσεις του <strong>@%{acct}</strong> ως <strong>ευαίσθητες</strong>. Αυτό θα:'
-          silence_html: 'Πρόκειται να <strong>περιορίσετε</strong> τον λογαριασμό <strong>@%{acct}</strong>. Αυτό θα:'
-          suspend_html: 'Πρόκειται να <strong>αναστείλετε</strong> τον λογαριασμό <strong>@%{acct}</strong>. Αυτό θα:'
+          delete_html: 'Πρόκειται να <strong>αφαιρέσεις</strong> μερικές από τις αναρτήσεις του <strong>@%{acct}</strong>. Αυτό θα:'
+          mark_as_sensitive_html: 'Πρόκειται να <strong>επισημάνεις</strong> μερικές από τις αναρτήσεις του <strong>@%{acct}</strong> ως <strong>ευαίσθητες</strong>. Αυτό θα:'
+          silence_html: 'Πρόκειται να <strong>περιορίσεις</strong> τον λογαριασμό του <strong>@%{acct}</strong>. Αυτό θα:'
+          suspend_html: 'Πρόκειται να <strong>αναστείλεις</strong> τον λογαριασμό του <strong>@%{acct}</strong>. Αυτό θα:'
         actions:
-          delete_html: Αφαιρέστε τις προσβλητικές δημοσιεύσεις
+          delete_html: Αφαίρεσε τις προσβλητικές αναρτήσεις
           mark_as_sensitive_html: Σημειώστε τα πολυμέσα των προσβλητικών αναρτήσεων ως ευαίσθητα
-          silence_html: Περιορίστε σοβαρά την εμβέλεια του <strong>@%{acct}</strong> κάνοντας το προφίλ και το περιεχόμενό του ορατά μόνο σε άτομα που ήδη τον ακολουθούν ή που αναζητούν χειροκίνητα το προφίλ του
+          silence_html: Περιορίσε σοβαρά την εμβέλεια του <strong>@%{acct}</strong> κάνοντας το προφίλ και το περιεχόμενό του ορατά μόνο σε άτομα που ήδη τον ακολουθούν ή που αναζητούν χειροκίνητα το προφίλ του
           suspend_html: Αναστολή του <strong>@%{acct}</strong>, καθιστώντας το προφίλ και το περιεχόμενό του μη προσβάσιμα και αδύνατο να αλληλεπιδράσει κανείς με αυτά
         close_report: 'Επισήμανση αναφοράς #%{id} ως επιλυμένη'
-        close_reports_html: Επισημάνετε <strong>όλες τις</strong> αναφορές ενάντια στον λογαριασμό <strong>@%{acct}</strong> ως επιλυμένες
-        delete_data_html: Διαγράψτε το προφίλ και το περιεχόμενο του <strong>@%{acct}</strong> σε 30 ημέρες από τώρα εκτός και αν ανακληθεί η αναστολή εν τω μεταξύ
+        close_reports_html: Επισήμανε <strong>όλες </strong> τις αναφορές ενάντια στον λογαριασμό <strong>@%{acct}</strong> ως επιλυμένες
+        delete_data_html: Διάγραψε το προφίλ και το περιεχόμενο του <strong>@%{acct}</strong> σε 30 ημέρες από τώρα εκτός αν, εν τω μεταξύ, ανακληθεί η αναστολή
         preview_preamble_html: 'Ο <strong>@%{acct}</strong> θα λάβει μια προειδοποίηση με τα ακόλουθο περιεχόμενο:'
-        record_strike_html: Καταγράψτε μια ποινή εναντίον του <strong>@%{acct}</strong> για να σας βοηθήσει να αποφασίσετε σε μελλοντικές παραβιάσεις από αυτόν τον λογαριασμό
-        send_email_html: Στείλτε στον <strong>@%{acct}</strong> ένα προειδοποιητικό e-mail
-        warning_placeholder: Προαιρετικές επιπλέον εξηγήσεις για αυτή την ενέργεια από τη διαχείριση.
+        record_strike_html: Κατάγραψε ένα παράπτωμα εναντίον του <strong>@%{acct}</strong> για να σε βοηθήσει να αποφασίσει; σε μελλοντικές παραβιάσεις από αυτόν τον λογαριασμό
+        send_email_html: Στείλε στον <strong>@%{acct}</strong> ένα προειδοποιητικό e-mail
+        warning_placeholder: Προαιρετικές επιπλέον εξηγήσεις για αυτή την ενέργεια από την ομάδα συντονισμού.
       target_origin: Προέλευση του αναφερόμενου λογαριασμού
       title: Αναφορές
-      unassign: Αποσύνδεση
+      unassign: Αναίρεση ανάθεσης
       unknown_action_msg: 'Άγνωστη ενέργεια: %{action}'
       unresolved: Άλυτη
       updated_at: Ενημερωμένη
@@ -655,12 +658,12 @@ el:
         other: "%{count} χρήστες"
       categories:
         administration: Διαχείριση
-        devops: Devops
+        devops: DevOps
         invites: Προσκλήσεις
         moderation: Συντονισμός
         special: Ειδικός
       delete: Διαγραφή
-      description_html: Με τους <strong>ρόλους χρηστών</strong>, μπορείτε να προσαρμόσετε σε ποιες λειτουργίες και περιοχές του Mastodon, οι χρήστες σας μπορούν να έχουν πρόσβαση.
+      description_html: Με τους <strong>ρόλους χρηστών</strong>, μπορείς να προσαρμόσεις σε ποιες λειτουργίες και περιοχές του Mastodon, οι χρήστες σας μπορούν να έχουν πρόσβαση.
       edit: Επεξεργασία ρόλου '%{name}'
       everyone: Προεπιλεγμένα δικαιώματα
       everyone_full_description_html: Αυτός είναι ο <strong>βασικός ρόλος</strong> που επηρεάζει <strong>όλους τους χρήστες</strong>, ακόμη και εκείνους που δεν έχουν κάποιον ρόλο. Όλοι οι άλλοι ρόλοι κληρονομούν δικαιώματα από αυτόν.
@@ -672,18 +675,18 @@ el:
         administrator_description: Οι χρήστες με αυτό το δικαίωμα θα παρακάμπτουν κάθε δικαίωμα
         delete_user_data: Διαγραφή Δεδομένων Χρήστη
         delete_user_data_description: Επιτρέπει στους χρήστες να διαγράφουν τα δεδομένα άλλων χρηστών χωρίς καθυστέρηση
-        invite_users: Πρόσκληση χρηστών
+        invite_users: Πρόσκληση Χρηστών
         invite_users_description: Επιτρέπει στους χρήστες να προσκαλούν νέα άτομα στον διακομιστή
-        manage_announcements: Διαχείριση ανακοινώσεων
+        manage_announcements: Διαχείριση Ανακοινώσεων
         manage_announcements_description: Επιτρέπει στους χρήστες να διαχειρίζονται ανακοινώσεις στον διακομιστή
         manage_appeals: Διαχείριση Εφέσεων
-        manage_appeals_description: Επιτρέπει στους χρήστες να εξετάζουν τις εφέσεις κατά των ενεργειών της συντονισμού
+        manage_appeals_description: Επιτρέπει στους χρήστες να εξετάζουν τις εφέσεις κατά των ενεργειών της ομάδας συντονισμού
         manage_blocks: Διαχείριση Αποκλεισμών
         manage_blocks_description: Επιτρέπει στους χρήστες να αποκλείουν παρόχους e-mail και διευθύνσεις IP
         manage_custom_emojis: Διαχείριση Προσαρμοσμένων Emojis
         manage_custom_emojis_description: Επιτρέπει στους χρήστες να διαχειρίζονται προσαρμοσμένα emojis στον διακομιστή
-        manage_federation: Διαχείριση Ομοσπονδίας
-        manage_federation_description: Επιτρέπει στους χρήστες να αποκλείουν ή να επιτρέπουν την ομοσπονδία με άλλους τομείς και να ελέγχουν την παράδοση
+        manage_federation: Διαχείριση Συναλλαγών
+        manage_federation_description: Επιτρέπει στους χρήστες να αποκλείουν ή να επιτρέπουν τις συναλλαγές με άλλους τομείς και να ελέγχουν την παράδοση
         manage_invites: Διαχείριση Προσκλήσεων
         manage_invites_description: Επιτρέπει στους χρήστες να περιηγούνται και να απενεργοποιούν τους συνδέσμους πρόσκλησης
         manage_reports: Διαχείριση Αναφορών
@@ -704,7 +707,7 @@ el:
         manage_webhooks_description: Επιτρέπει στους χρήστες να ορίζουν webhooks για συμβάντα διαχείρισης
         view_audit_log: Προβολή Καταλόγου Καταγραφών
         view_audit_log_description: Επιτρέπει στους χρήστες να βλέπουν ένα ιστορικό ενεργειών διαχείρισης στον διακομιστή
-        view_dashboard: Προβολή Ταμπλό πληροφοριών
+        view_dashboard: Προβολή Ταμπλό
         view_dashboard_description: Επιτρέπει στους χρήστες να έχουν πρόσβαση στον ταμπλό πληροφοριών και σε διάφορες μετρήσεις
         view_devops: DevOps
         view_devops_description: Επιτρέπει στους χρήστες να έχουν πρόσβαση στα ταμπλό πληροφοριών Sidekiq και pgHero
@@ -712,7 +715,7 @@ el:
     rules:
       add_new: Προσθήκη κανόνα
       delete: Διαγραφή
-      description_html: Ενώ οι περισσότεροι ισχυρίζονται ότι έχουν διαβάσει και συμφωνούν με τους όρους της υπηρεσίας, συνήθως οι άνθρωποι δεν διαβάζουν μέχρι μετά την εμφάνιση ενός προβλήματος. <strong>Κάντε ευκολότερο να δουν τους κανόνες του διακομιστή σας με μια ματιά παρέχοντας τους σε μια λίστα σημείων.</strong> Προσπαθήστε να κρατήσετε μεμονωμένους κανόνες σύντομους και απλούς, αλλά προσπαθήστε να μην τους χωρίσετε σε πολλά ξεχωριστά αντικείμενα.
+      description_html: Ενώ οι περισσότεροι ισχυρίζονται ότι έχουν διαβάσει και συμφωνούν με τους όρους της υπηρεσίας, συνήθως οι άνθρωποι δεν διαβάζουν μέχρι μετά την εμφάνιση ενός προβλήματος. <strong>Κάνε ευκολότερο να δουν τους κανόνες του διακομιστή σας με μια ματιά παρέχοντας τους σε μια λίστα.</strong> Προσπάθησε να κρατήσεις τους μεμονωμένους κανόνες σύντομους και απλούς, αλλά προσπάθησε να μην τους χωρίσεις σε πολλά ξεχωριστά αντικείμενα.
       edit: Επεξεργασία κανόνα
       empty: Δεν έχουν οριστεί ακόμα κανόνες διακομιστή.
       title: Κανόνες διακομιστή
@@ -723,20 +726,20 @@ el:
         rules_hint: Υπάρχει μια ειδική περιοχή για τους κανόνες που αναμένεται να τηρούν οι χρήστες σας.
         title: Σχετικά με
       appearance:
-        preamble: Προσαρμόστε τη διεπαφή ιστού του Mastodon.
+        preamble: Προσάρμοσε την ιστοσελίδα του Mastodon.
         title: Εμφάνιση
       branding:
-        preamble: Η ταυτότητα του διακομιστή σας, τον διαφοροποιεί από άλλους διακομιστές του δικτύου. Αυτές οι πληροφορίες μπορεί να εμφανίζονται σε διάφορα περιβάλλοντα, όπως η διαδικτυακή διεπαφή του Mastodon, εγγενείς εφαρμογές, σε προεπισκοπήσεις συνδέσμου σε άλλους ιστότοπους και εντός εφαρμογών μηνυμάτων και ούτω καθεξής. Γι' αυτό, είναι καλύτερο να διατηρούνται αυτές οι πληροφορίες σαφείς, σύντομες και συνοπτικές.
+        preamble: Η ταυτότητα του διακομιστή σου, τον διαφοροποιεί από άλλους διακομιστές του δικτύου. Αυτές οι πληροφορίες μπορεί να εμφανίζονται σε διάφορα περιβάλλοντα, όπως η ιστοσελίδα του Mastodon, εγγενείς εφαρμογές, σε προεπισκοπήσεις συνδέσμου σε άλλους ιστότοπους και εντός εφαρμογών μηνυμάτων και ούτω καθεξής. Γι' αυτό, είναι καλύτερο να διατηρούνται αυτές οι πληροφορίες σαφείς, σύντομες και συνοπτικές.
         title: Ταυτότητα
       content_retention:
-        preamble: Ελέγξτε πώς αποθηκεύεται το περιεχόμενο που δημιουργείται από τους χρήστες στο Mastodon.
+        preamble: Έλεγξε πώς αποθηκεύεται το περιεχόμενο που δημιουργείται από τους χρήστες στο Mastodon.
         title: Διατήρηση περιεχομένου
       default_noindex:
-        desc_html: Επηρεάζει όσους χρήστες δεν έχουν αλλάξει αυτή τη ρύθμιση οι ίδιοι
+        desc_html: Επηρεάζει όσους χρήστες δεν έχουν αλλάξει οι ίδιοι αυτή τη ρύθμιση
         title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης
       discovery:
-        follow_recommendations: Ακολουθήστε τις προτάσεις
-        preamble: Δημοσιεύοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Ελέγξτε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας.
+        follow_recommendations: Ακολούθησε τις προτάσεις
+        preamble: Δημοσιεύοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Έλεγξε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας.
         profile_directory: Κατάλογος προφίλ
         public_timelines: Δημόσιες ροές
         publish_discovered_servers: Δημοσίευση διακομιστών που έχουν ανακαλυφθεί
@@ -748,7 +751,7 @@ el:
         disabled: Για κανέναν
         users: Προς συνδεδεμένους τοπικούς χρήστες
       registrations:
-        preamble: Ελέγξτε ποιος μπορεί να δημιουργήσει ένα λογαριασμό στον διακομιστή σας.
+        preamble: Έλεγξε ποιος μπορεί να δημιουργήσει ένα λογαριασμό στον διακομιστή σας.
         title: Εγγραφές
       registrations_mode:
         modes:
@@ -776,17 +779,17 @@ el:
         title: Πολυμέσα
       metadata: Μεταδεδομένα
       no_status_selected: Καμία δημοσίευση δεν άλλαξε αφού καμία δεν ήταν επιλεγμένη
-      open: Άνοιγμα δημοσίευσης
-      original_status: Αρχική δημοσίευση
+      open: Άνοιγμα ανάρτησης
+      original_status: Αρχική ανάρτηση
       reblogs: Αναδημοσιεύσεις
       status_changed: Η ανάρτηση άλλαξε
       title: Καταστάσεις λογαριασμού
-      trending: Δημοφιλή
+      trending: Τάσεις
       visibility: Ορατότητα
       with_media: Με πολυμέσα
     strikes:
       actions:
-        delete_statuses: Ο/Η %{name} διέγραψε τις δημοσιεύσεις του/της %{target}
+        delete_statuses: Ο/Η %{name} διέγραψε τις αναρτήσεις του/της %{target}
         disable: Ο/Η %{name} πάγωσε τον λογαριασμό του/της %{target}
         mark_statuses_as_sensitive: Ο/Η %{name} επισήμανε τα πολυμέσα του/της %{target} ως ευαίσθητα
         none: Ο/Η %{name} έστειλε προειδοποίηση προς τον/την %{target}
@@ -795,65 +798,162 @@ el:
         suspend: ο/η %{name} ανέστειλε τον λογαριασμό %{target}
       appeal_approved: Έγινε έφεση
       appeal_pending: Έφεση σε εκκρεμότητα
-      appeal_rejected: Η αίτηση απορρίφθηκε
+      appeal_rejected: Η έφεση απορρίφθηκε
     system_checks:
       database_schema_check:
-        message_html: Υπάρχουν μετακινήσεις βάσης δεδομένων που εκκρεμούν. Παρακαλώ εκτελέστε τις για να βεβαιωθείτε ότι η εφαρμογή συμπεριφέρεται όπως αναμένεται
+        message_html: Υπάρχουν μετακινήσεις βάσεων δεδομένων που εκκρεμούν. Παρακαλώ εκτέλεσέ τες για να βεβαιωθείς ότι η εφαρμογή συμπεριφέρεται όπως αναμένεται
       elasticsearch_running_check:
-        message_html: Δεν ήταν δυνατή η σύνδεση στο Elasticsearch. Παρακαλώ ελέγξτε ότι εκτελείται ή απενεργοποιήστε την αναζήτηση πλήρους κειμένου
+        message_html: Δεν ήταν δυνατή η σύνδεση στο Elasticsearch. Παρακαλώ έλεγξε ότι εκτελείται ή απενεργοποίησε την αναζήτηση πλήρους κειμένου
       elasticsearch_version_check:
         message_html: 'Μη συμβατή έκδοση Elasticsearch: %{value}'
-        version_comparison: Η έκδοση Elasticsearch %{running_version} εκτελείται ενώ η %{required_version} απαιτείται
+        version_comparison: Εκτελείται η έκδοση Elasticsearch %{running_version} ενώ απαιτείται %{required_version}
       rules_check:
         action: Διαχείριση κανόνων διακομιστή
-        message_html: Δεν έχετε ορίσει κανέναν κανόνα διακομιστή.
+        message_html: Δεν έχεις ορίσει κανέναν κανόνα διακομιστή.
+      sidekiq_process_check:
+        message_html: Καμία διεργασία Sidekiq δεν εκτελείται για την ουρά %{value}. Παρακαλώ έλεγξε τη διαμόρφωση του Sidekiq
+      upload_check_privacy_error:
+        action: Δες εδώ για περισσότερες πληροφορίες
+        message_html: "<strong>Ο διακομιστής σας δεν έχει ρυθμιστεί σωστά. Το απόρρητο των χρηστών σας κινδυνεύει.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Δες εδώ για περισσότερες πληροφορίες
+        message_html: "<strong>Ο χώρος αποθήκευσης αντικειμένων σας δεν έχει ρυθμιστεί σωστά. Το απόρρητο των χρηστών σας κινδυνεύει.</strong>"
     tags:
-      review: Κατάσταση έγκρισης
+      review: Κατάσταση αξιολόγησης
       updated_msg: Οι ρυθμίσεις των ετικετών ενημερώθηκαν επιτυχώς
     title: Διαχείριση
     trends:
-      not_allowed_to_trend: Δεν επιτρέπεται η τάση
+      allow: Επιτρέπεται
+      approved: Εγκρίθηκε
+      disallow: Να μην επιτρέπεται
+      links:
+        allow: Να επιτρέπεται σύνδεσμος
+        allow_provider: Να επιτρέπεται ο εκδότης
+        description_html: Αυτοί οι σύνδεσμοι μοιράζονται αρκετά από λογαριασμούς των οποίων τις δημοσιεύσεις, βλέπει ο διακομιστής σας. Μπορεί να βοηθήσει τους χρήστες σας να μάθουν τί συμβαίνει στον κόσμο. Οι σύνδεσμοι δεν εμφανίζονται δημόσια μέχρι να εγκρίνετε τον εκδότη. Μπορείτε επίσης να επιτρέψετε ή να απορρίψετε μεμονωμένους συνδέσμους.
+        disallow: Να μην επιτρέπεται ο σύνδεσμος
+        disallow_provider: Να μην επιτρέπεται ο εκδότης
+        no_link_selected: Κανένας σύνδεσμος δεν άλλαξε αφού κανείς δεν επιλέχθηκε
+        publishers:
+          no_publisher_selected: Κανένας εκδότης δεν άλλαξε καθώς κανένας δεν επιλέχθηκε
+        shared_by_over_week:
+          one: Κοινοποιήθηκε από ένα άτομο την τελευταία εβδομάδα
+          other: Κοινοποιήθηκε από %{count} άτομα την τελευταία εβδομάδα
+        title: Δημοφιλείς σύνδεσμοι
+        usage_comparison: Κοινοποιήθηκε %{today} φορές σήμερα, σε σύγκριση με %{yesterday} χθες
+      not_allowed_to_trend: Δεν επιτρέπεται να γίνει δημοφιλές
       only_allowed: Μόνο επιτρεπόμενα
+      pending_review: Εκκρεμεί αξιολόγηση
+      preview_card_providers:
+        allowed: Σύνδεσμοι από αυτόν τον εκδότη μπορούν να γίνουν δημοφιλείς
+        description_html: Αυτοί είναι τομείς από τους οποίους οι σύνδεσμοι συχνά μοιράζονται στον διακομιστή σας. Σύνδεσμοι δεν γίνουν δημοφιλείς δημοσίως εκτός και αν ο τομέας του συνδέσμου εγκριθεί. Η έγκρισή σας (ή απόρριψη) περιλαμβάνει και τους υποτομείς.
+        rejected: Σύνδεσμοι από αυτόν τον εκδότη δε θα γίνουν δημοφιλείς
+        title: Εκδότες
+      rejected: Απορρίφθηκε
+      statuses:
+        allow: Να επιτρέπεται η ανάρτηση
+        allow_account: Να επιτρέπεται ο συγγραφέας
+        description_html: Αυτές είναι αναρτήσεις για τις οποίες ο διακομιστής σας γνωρίζει ότι κοινοποιούνται και αρέσουν πολύ αυτή τη περίοδο. Μπορεί να βοηθήσει νέους και χρήστες που επιστρέφουν, να βρουν περισσότερα άτομα να ακολουθήσουν. Καμία ανάρτηση δεν εμφανίζεται δημόσια μέχρι να εγκρίνετε το συντάκτη και ο συντάκτης να επιτρέπει ο λογαριασμός του να προτείνεται και σε άλλους. Μπορείτε επίσης να επιτρέψετε ή να απορρίψετε μεμονωμένες δημοσιεύσεις.
+        disallow: Να μην επιτρέπεται η δημοσίευση
+        disallow_account: Να μην επιτρέπεται ο συντάκτης
+        no_status_selected: Καμία δημοφιλής ανάρτηση δεν άλλαξε αφού καμία δεν επιλέχθηκε
+        not_discoverable: Ο συντάκτης δεν έχει επιλέξει να είναι ανακαλύψιμος
+        shared_by:
+          one: Μοιράστηκε ή προστέθηκε στα αγαπημένα μία φορά
+          other: Μοιράστηκε και προστέθηκε στα αγαπημένα %{friendly_count} φορές
+        title: Δημοφιλείς αναρτήσεις
       tags:
+        current_score: Τρέχουσα βαθμολογία %{score}
         dashboard:
+          tag_accounts_measure: μοναδικές χρήσεις
           tag_languages_dimension: Κορυφαίες γλώσσες
           tag_servers_dimension: Κορυφαίοι διακομιστές
           tag_servers_measure: διαφορετικοί διακομιστές
-      trending: Δημοφιλή
+          tag_uses_measure: συνολικές χρήσεις
+        description_html: Αυτές είναι ετικέτες που εμφανίζονται αυτή τη στιγμή σε πολλές αναρτήσεις που βλέπει ο διακομιστής σας. Μπορεί να βοηθήσει τους χρήστες σας να μάθουν τί συζητείται αυτή τη στιγμή. Δεν εμφανίζονται ετικέτες δημοσίως μέχρι να τις εγκρίνετε.
+        listable: Μπορεί να προταθεί
+        no_tag_selected: Καμία ετικέτα δεν άλλαξε αφού καμία δεν ήταν επιλεγμένη
+        not_listable: Δεν θα προτείνεται
+        not_trendable: Δεν θα εμφανίζεται στις τάσεις
+        not_usable: Δεν μπορεί να χρησιμοποιηθεί
+        peaked_on_and_decaying: Κορυφαία θέση στις %{date}, τώρα φθίνει
+        title: Δημοφιλείς ετικέτες
+        trendable: Μπορεί να εμφανιστεί στις τάσεις
+        trending_rank: 'Δημοφιλές #%{rank}'
+        usable: Μπορεί να χρησιμοποιηθεί
+        usage_comparison: Χρησιμοποιήθηκε %{today} φορές σήμερα, σε σύγκριση με %{yesterday} χθες
+        used_by_over_week:
+          one: Χρησιμοποιήθηκε από ένα άτομο την τελευταία εβδομάδα
+          other: Χρησιμοποιήθηκε από %{count} άτομα την τελευταία εβδομάδα
+      title: Δημοφιλή
+      trending: Τάσεις
     warning_presets:
       add_new: Πρόσθεση νέου
       delete: Διαγραφή
       edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης
-      empty: Δεν έχετε ακόμη ορίσει κάποια προεπιλογή προειδοποίησης.
+      empty: Δεν έχετε ακόμη ορίσει κάποια προκαθορισμένη προειδοποίηση.
       title: Διαχείριση προκαθορισμένων προειδοποιήσεων
     webhooks:
+      add_new: Προσθήκη σημείου τερματισμού
       delete: Διαγραφή
+      description_html: Ένα <strong>webhook</strong> επιτρέπει στο Mastodon να στείλει <strong>ειδοποιήσεις πραγματικού χρόνου</strong> σχετικά με επιλεγμένα γεγονότα στη δική σας εφαρμογή, ώστε η εφαρμογή να σας μπορεί <strong>να προκαλέσει αντιδράσεις αυτόματα</strong>.
       disable: Απενεργοποίηση
       disabled: Απενεργοποιημένα
+      edit: Επεξεργασία σημείου τερματισμού
+      empty: Δεν έχετε ακόμα ρυθμισμένα σημεία τερματισμού webhook.
       enable: Ενεργοποίηση
+      enabled: Ενεργό
+      enabled_events:
+        one: 1 ενεργό συμβάν
+        other: "%{count} ενεργά συμβάντα"
+      events: Συμβάντα
+      new: Νέο webhook
+      rotate_secret: Περιστροφή μυστικού
+      secret: Υπογραφή μυστικού
       status: Κατάσταση
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
+        delete_statuses: διαγραφή των αναρτήσεών του
+        disable: να παγώσει τον λογαριασμό του
+        mark_statuses_as_sensitive: να επισημάνουν τις δημοσιεύσεις του ως ευαίσθητες
         none: μια προειδοποίηση
+        sensitive: να επισημάνουν τον λογαριασμό του ως ευαίσθητο
+        silence: να περιορίσουν το λογαριασμό του
+        suspend: να αναστείλουν τον λογαριασμό του
+      body: 'Ο/Η %{target} κάνει έφεση στην απόφαση συντονισμού που έγινε από τον/την %{action_taken_by} στις %{date}, η οποία ήταν %{type}. Έγραψαν:'
+      next_steps: Μπορείτε να εγκρίνετε την έφεση για να αναιρέσετε την απόφαση της ομάδας συντονισμού ή να την αγνοήσετε.
+      subject: Ο/Η %{username} κάνει έφεση σε μια απόφαση της ομάδας συντονισμού στον %{instance}
     new_pending_account:
       body: Τα στοιχεία του νέου λογαριασμού είναι παρακάτω. Μπορείς να εγκρίνεις ή να απορρίψεις αυτή την αίτηση.
       subject: Νέος λογαριασμός προς έγκριση στο %{instance} (%{username})
     new_report:
-      body: Ο/Η %{reporter} κατήγγειλε τον/την %{target}
-      body_remote: Κάποιος/α από τον τομέα %{domain} κατήγγειλε τον/την %{target}
-      subject: Νέα καταγγελία για %{instance} (#%{id})
+      body: Ο/Η %{reporter} ανέφερε τον/την %{target}
+      body_remote: Κάποιος/α από τον τομέα %{domain} ανέφερε τον/την %{target}
+      subject: Νέα αναφορά για %{instance} (#%{id})
+    new_trends:
+      body: 'Τα ακόλουθα στοιχεία χρειάζονται αξιολόγηση για να μπορούν να προβληθούν δημόσια:'
+      new_trending_links:
+        title: Σύνδεσμοι σε τάση
+      new_trending_statuses:
+        title: Αναρτήσεις σε τάση
+      new_trending_tags:
+        no_approved_tags: Προς το παρόν δεν υπάρχουν εγκεκριμένες δημοφιλείς ετικέτες.
+        requirements: 'Οποιοσδήποτε από αυτούς τους υποψηφίους θα μπορούσε να ξεπεράσει την #%{rank} εγκεκριμένη δημοφιλή ετικέτα, που επί του παρόντος είναι #%{lowest_tag_name} με βαθμολογία %{lowest_tag_score}.'
+        title: Δημοφιλείς ετικέτες
+      subject: Νέες τάσεις προς αξιολόγηση στο %{instance}
   aliases:
     add_new: Δημιουργία ψευδώνυμου
     created_msg: Δημιουργήθηκε νέο ψευδώνυμο. Τώρα μπορείς να ξεκινήσεις τη μεταφορά από τον παλιό λογαριασμό.
     deleted_msg: Αφαιρέθηκε το ψευδώνυμο. Η μεταφορά από εκείνον τον λογαριασμό σε αυτόν εδώ δε θα είναι πλέον δυνατή.
     empty: Δεν έχεις ψευδώνυμα.
-    hint_html: Αν θέλεις να μετακομίσεις από έναν άλλο λογαριασμό σε αυτόν εδώ, μπορείς εδώ να δημιουργήσεις ένα ψευδώνυμο, πράγμα που απαιτείται πριν προχωρήσεις για να μεταφέρεις τους ακολούθους σου από τον παλιό λογαριασμό σε αυτόν εδώ. Η ενέργεια αυτή είναι <strong>ακίνδυνη και αναστρέψιμη</strong>.<strong>Η μετακόμιση του λογαριασμού ξεκινάει από τον παλιό λογαριασμό</strong>.
+    hint_html: Αν θέλεις να μετακομίσεις από έναν άλλο λογαριασμό σε αυτόν εδώ, εδώ μπορείς να δημιουργήσεις ένα ψευδώνυμο, πράγμα που απαιτείται πριν προχωρήσεις για να μεταφέρεις τους ακολούθους σου από τον παλιό λογαριασμό σε αυτόν εδώ. Η ενέργεια αυτή είναι <strong>ακίνδυνη και αναστρέψιμη</strong>.<strong>Η μετακόμιση του λογαριασμού ξεκινάει από τον παλιό λογαριασμό</strong>.
     remove: Αφαίρεση ψευδώνυμου
   appearance:
-    advanced_web_interface: Προηγμένη λειτουργία χρήσης
-    advanced_web_interface_hint: 'Αν θέλεις να χρησιμοποιήσεις ολόκληρο το πλάτος της οθόνης σου, η προηγμένη λειτουργία χρήσης σου επιτρέπει να ορίσεις πολλαπλές κολώνες ώστε να βλέπεις ταυτόχρονα όση πληροφορία θέλεις: Την αρχική ροή, τις ειδοποιήσεις, την ομοσπονδιακή ροή και όσες λίστες και ετικέτες θέλεις.'
-    animations_and_accessibility: Κίνηση και προσβασιμότητα
+    advanced_web_interface: Προηγμένη διεπαφή ιστού
+    advanced_web_interface_hint: 'Αν θέλεις να χρησιμοποιήσεις ολόκληρο το πλάτος της οθόνης σου, η προηγμένη λειτουργία χρήσης σου επιτρέπει να ορίσεις πολλαπλές στύλες ώστε να βλέπεις ταυτόχρονα όση πληροφορία θέλεις: Την αρχική ροή, τις ειδοποιήσεις, την ροή συναλλαγών και όσες λίστες και ετικέτες θέλεις.'
+    animations_and_accessibility: Εφέ κινήσεων και προσβασιμότητα
     confirmation_dialogs: Ερωτήσεις επιβεβαίωσης
     discovery: Εξερεύνηση
     localization:
@@ -861,30 +961,32 @@ el:
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Μπορεί να συνεισφέρει ο οποιοσδήποτε.
     sensitive_content: Ευαίσθητο περιεχόμενο
-    toot_layout: Διαρρύθμιση τουτ
+    toot_layout: Διαρρύθμιση αναρτήσεων
   application_mailer:
     notification_preferences: Αλλαγή προτιμήσεων email
     salutation: "%{name},"
     settings: 'Άλλαξε τις προτιμήσεις email: %{link}'
     view: 'Προβολή:'
     view_profile: Προβολή προφίλ
-    view_status: Προβολή κατάστασης
+    view_status: Προβολή ανάρτησης
   applications:
     created: Η εφαρμογή δημιουργήθηκε επιτυχώς
     destroyed: Η εφαρμογή διαγράφηκε επιτυχώς
     logout: Αποσύνδεση
     regenerate_token: Αναδημιουργία του διακριτικού πρόσβασης (access token)
-    token_regenerated: Το διακριτικό πρόσβασης (access token) αναδημιουργήθηκε επιτυχώς
-    warning: Μεγάλη προσοχή με αυτά τα στοιχεία. Μην τα μοιραστείς ποτέ με κανέναν!
-    your_token: Το διακριτικό πρόσβασής σου (access token)
+    token_regenerated: Το διακριτικό πρόσβασης αναδημιουργήθηκε επιτυχώς
+    warning: Να είσαι πολύ προσεκτικός με αυτά τα στοιχεία. Μην τα μοιραστείς ποτέ με κανέναν!
+    your_token: Το διακριτικό πρόσβασής σου
   auth:
     apply_for_account: Ζητήστε έναν λογαριασμό
     change_password: Συνθηματικό
+    confirmations:
+      wrong_email_hint: Εάν αυτή η διεύθυνση email δεν είναι σωστή, μπορείς να την αλλάξεις στις ρυθμίσεις λογαριασμού.
     delete_account: Διαγραφή λογαριασμού
     delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς <a href="%{path}">να συνεχίσεις εδώ</a>. Θα σου ζητηθεί επιβεβαίωση.
     description:
       prefix_invited_by_user: Ο/Η @%{name} σε προσκαλεί να συνδεθείς με αυτό τον διακομιστή του Mastodon!
-      prefix_sign_up: Άνοιξε λογαριασμό στο Mastodon σήμερα!
+      prefix_sign_up: Κάνε εγγραφή στο Mastodon σήμερα!
       suffix: Ανοίγοντας λογαριασμό θα μπορείς να ακολουθείς άλλους, να ανεβάζεις ενημερώσεις και να ανταλλάζεις μηνύματα με χρήστες σε οποιοδήποτε διακομιστή Mastodon, καθώς και άλλα!
     didnt_get_confirmation: Δεν έλαβες τις οδηγίες επιβεβαίωσης;
     dont_have_your_security_key: Δεν έχετε κλειδί ασφαλείας;
@@ -898,6 +1000,7 @@ el:
     migrate_account: Μετακόμιση σε διαφορετικό λογαριασμό
     migrate_account_html: Αν θέλεις να ανακατευθύνεις αυτό τον λογαριασμό σε έναν διαφορετικό, μπορείς να το <a href="%{path}">διαμορφώσεις εδώ</a>.
     or_log_in_with: Ή συνδέσου με
+    privacy_policy_agreement_html: Έχω διαβάσει και συμφωνώ με την <a href="%{privacy_policy_path}" target="_blank">πολιτική απορρήτου</a>
     providers:
       cas: Υπηρεσία Κεντρικής Πιστοποίησης (CAS)
       saml: Πρωτόκολλο SAML
@@ -908,6 +1011,7 @@ el:
     rules:
       accept: Αποδοχή
       back: Πίσω
+      preamble: Αυτά ορίζονται και επιβάλλονται από τους συντονιστές του%{domain}.
       title: Ορισμένοι βασικοί κανόνες.
     security: Ασφάλεια
     set_new_password: Ορισμός νέου συνθηματικού
@@ -916,14 +1020,18 @@ el:
       email_settings_hint_html: Το email επιβεβαίωσης στάλθηκε στο %{email}. Αν η διεύθυνση αυτή δεν είναι σωστή, μπορείτε να την ενημερώσετε στις ρυθμίσεις λογαριασμού.
       title: Ρυθμίσεις
     sign_in:
+      preamble_html: Συνδεθείτε με τα διαπιστευτήριά σας στον <strong>%{domain}</strong>. Αν ο λογαριασμός σας φιλοξενείται σε διαφορετικό διακομιστή, δε θα μπορείτε να συνδεθείτε εδώ.
       title: Συνδεθείτε στο %{domain}
     sign_up:
+      preamble: Με έναν λογαριασμό σ' αυτόν τον διακομιστή Mastodon, θα μπορείτε να ακολουθήσετε οποιοδήποτε άλλο άτομο στο δίκτυο, ανεξάρτητα από το πού φιλοξενείται ο λογαριασμός του.
       title: Ας ξεκινήσουμε τις ρυθμίσεις στο %{domain}.
     status:
       account_status: Κατάσταση λογαριασμού
       confirming: Αναμονή για ολοκλήρωση επιβεβαίωσης του email.
+      functional: Ο λογαριασμός σας είναι πλήρως λειτουργικός.
       pending: Η εφαρμογή σας εκκρεμεί έγκρισης, πιθανόν θα διαρκέσει κάποιο χρόνο. Θα λάβετε email αν εγκριθεί.
       redirecting_to: Ο λογαριασμός σου είναι ανενεργός γιατί επί του παρόντος ανακατευθύνει στον %{acct}.
+      view_strikes: Προβολή προηγούμενων ποινών εναντίον του λογαριασμού σας
     too_fast: Η φόρμα υποβλήθηκε πολύ γρήγορα, προσπαθήστε ξανά.
     use_security_key: Χρήση κλειδιού ασφαλείας
   authorize_follow:
@@ -947,6 +1055,10 @@ el:
     errors:
       invalid_key: δεν είναι έγκυρο κλειδί Ed25519 ή Curve25519
       invalid_signature: δεν είναι έγκυρη υπογραφή Ed25519
+  date:
+    formats:
+      default: "%b %d, %Y"
+      with_month_name: "%B %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ω"
@@ -980,8 +1092,34 @@ el:
       username_unavailable: Το όνομα χρήστη σου θα παραμείνει μη διαθέσιμο
   disputes:
     strikes:
+      action_taken: Ενέργεια που πραγματοποιήθηκε
+      appeal: Έφεση
+      appeal_approved: Αυτή η ποινή έχει αναιρεθεί επιτυχώς και δεν είναι πλέον έγκυρη
+      appeal_rejected: Η έφεση απορρίφθηκε
+      appeal_submitted_at: Η έφεση υποβλήθηκε
+      appealed_msg: Η έφεσή σας έχει υποβληθεί. Αν εγκριθεί, θα ειδοποιηθείτε.
+      appeals:
+        submit: Υποβολή έφεσης
       approve_appeal: Έγκριση έφεσης
+      associated_report: Συσχετισμένη αναφορά
+      created_at: Χρονολογείται
+      description_html: Αυτές είναι ενέργειες που λήφθηκαν κατά του λογαριασμού σας και προειδοποιήσεις που σας έχουν σταλεί από το προσωπικό του %{instance}.
+      recipient: Απευθύνεται σε
       reject_appeal: Απόρριψη έφεσης
+      status: 'Δημοσίευση #%{id}'
+      status_removed: Η δημοσιεύση έχει ήδη αφαιρεθεί από το σύστημα
+      title: "%{action} στις %{date}"
+      title_actions:
+        delete_statuses: Αφαίρεση δημοσίευσης
+        disable: Πάγωμα λογαριασμού
+        mark_statuses_as_sensitive: Σήμανση δημοσιεύσεων ως ευαίσθητες
+        none: Προειδοποίηση
+        sensitive: Σήμανση λογαριασμού ως ευαίσθητο
+        silence: Περιορισμός λογαριασμού
+        suspend: Αναστολή λογαριασμού
+      your_appeal_approved: Η έφεση σας έχει εγκριθεί
+      your_appeal_pending: Υποβάλατε έφεση
+      your_appeal_rejected: Η έφεση σας απορρίφθηκε
   domain_validator:
     invalid_domain: δεν είναι έγκυρο όνομα τομέα
   errors:
@@ -1019,6 +1157,8 @@ el:
     storage: Αποθήκευση πολυμέσων
   featured_tags:
     add_new: Προσθήκη νέας
+    errors:
+      limit: Έχεις ήδη προσθέσει το μέγιστο αριθμό ετικετών
     hint_html: "<strong>Τι είναι οι προβεβλημένες ετικέτες;</strong> Προβάλλονται στο δημόσιο προφίλ σου επιτρέποντας σε όποιον το βλέπει να χαζέψει τις δημοσιεύσεις που τις χρησιμοποιούν. Είναι ένας ωραίος τρόπος να παρακολουθείς την πορεία μιας δημιουργία ή ενός μακροπρόθεσμου έργου."
   filters:
     contexts:
@@ -1030,8 +1170,11 @@ el:
     edit:
       add_keyword: Προσθήκη λέξης-κλειδιού
       keywords: Λέξεις-κλειδιά
+      statuses: Μεμονωμένες δημοσιεύσεις
+      statuses_hint_html: Αυτό το φίλτρο εφαρμόζεται για την επιλογή μεμονωμένων δημοσιεύσεων, ανεξάρτητα από το αν ταιριάζουν με τις λέξεις - κλειδιά παρακάτω. <a href="%{path}">Επισκόπηση ή αφαίρεση δημοσιεύσεων από το φίλτρο</a>.
       title: Ενημέρωση φίλτρου
     errors:
+      deprecated_api_multiple_keywords: Αυτές οι παράμετροι δεν μπορούν να αλλάξουν από αυτήν την εφαρμογή επειδή ισχύουν για περισσότερες από μία λέξεις - κλειδιά φίλτρου. Χρησιμοποιήστε μια πιο πρόσφατη εφαρμογή ή την ιστοσελίδα.
       invalid_context: Έδωσες λάθος ή ανύπαρκτο πλαίσιο
     index:
       contexts: Φίλτρα σε %{contexts}
@@ -1039,17 +1182,44 @@ el:
       empty: Δεν έχεις φίλτρα.
       expires_in: Λήγει σε %{distance}
       expires_on: Λήγει στις %{date}
+      keywords:
+        one: "%{count} λέξη - κλειδί"
+        other: "%{count} λέξεις - κλειδιά"
+      statuses:
+        one: "%{count} δημοσίευση"
+        other: "%{count} δημοσιεύσεις"
+      statuses_long:
+        one: "%{count} κρυμμένη μεμονωμένη δημοσίευση"
+        other: "%{count} κρυμμένες μεμονωμένες δημοσιεύσεις"
       title: Φίλτρα
     new:
       save: Αποθήκευση νέου φίλτρου
       title: Πρόσθεσε νέο φίλτρο
+    statuses:
+      back_to_filter: Πίσω στο φίλτρο
+      batch:
+        remove: Αφαίρεση από φίλτρο
+      index:
+        hint: Αυτό το φίλτρο ισχύει για την επιλογή μεμονωμένων δημοσιεύσεων ανεξάρτητα από άλλα κριτήρια. Μπορείτε να προσθέσετε περισσότερες δημοσιεύσεις σε αυτό το φίλτρο από την ιστοσελίδα.
+        title: Φιλτραρισμένες δημοσιεύσεις
   generic:
     all: Όλα
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> στοιχείο σε αυτή τη σελίδα είναι επιλεγμένο."
+      other: Όλα τα <strong>%{count}</strong> 5 στοιχεία σε αυτή τη σελίδα είναι επιλεγμένα.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> στοιχείο που ταιριάζει με την αναζήτησή σας είναι επιλεγμένο."
+      other: Όλα τα <strong>%{count}</strong> στοιχεία που ταιριάζουν στην αναζήτησή σας είναι επιλεγμένα.
     changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν!
     copy: Αντιγραφή
     delete: Διαγραφή
+    deselect: Αποεπιλογή όλων
+    none: Κανένα
     order_by: Ταξινόμηση κατά
     save_changes: Αποθήκευση αλλαγών
+    select_all_matching_items:
+      one: Επιλέξτε %{count} στοιχείο που ταιριάζει με την αναζήτησή σας.
+      other: Επιλέξτε και τα %{count} αντικείμενα που ταιριάζουν στην αναζήτησή σας.
     today: σήμερα
     validation_errors:
       one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παρακάτω σφάλμα
@@ -1094,6 +1264,20 @@ el:
       expires_at: Λήγει
       uses: Χρήσεις
     title: Προσκάλεσε κόσμο
+  lists:
+    errors:
+      limit: Έχεις φτάσει το μέγιστο αριθμό λιστών
+  login_activities:
+    authentication_methods:
+      otp: εφαρμογή ταυτοποίησης δύο παραγόντων
+      password: συνθηματικό
+      sign_in_token: κωδικός ασφαλείας e-mail
+      webauthn: κλειδιά ασφαλείας
+    description_html: Αν δείτε δραστηριότητα που δεν αναγνωρίζετε, σκεφτείτε να αλλάξετε τον κωδικό πρόσβασής σας και να ενεργοποιήσετε τον έλεγχο ταυτότητας δύο παραγόντων.
+    empty: Δεν υπάρχει διαθέσιμο ιστορικό ελέγχου ταυτότητας
+    failed_sign_in_html: Αποτυχημένη προσπάθεια σύνδεσης με %{method} από %{ip} (%{browser})
+    successful_sign_in_html: Επιτυχής σύνδεση με %{method} από %{ip} (%{browser})
+    title: Ιστορικό ελέγχου ταυτότητας
   media_attachments:
     validations:
       images_and_video: Δεν γίνεται να προσθέσεις βίντεο σε ενημέρωση που ήδη περιέχει εικόνες
@@ -1162,6 +1346,8 @@ el:
       body: 'Αναφέρθηκες από τον/την %{name} στο:'
       subject: Αναφέρθηκες από τον/την %{name}
       title: Νέα αναφορά
+    poll:
+      subject: Μια δημοσκόπηση του %{name} έληξε
     reblog:
       body: 'Η κατάστασή σου προωθήθηκε από τον/την %{name}:'
       subject: Ο/Η %{name} προώθησε την κατάστασή σου
@@ -1186,8 +1372,12 @@ el:
           trillion: τρις.
   otp_authentication:
     code_hint: Για να συνεχίσεις, γράψε τον κωδικό που δημιούργησε η εφαρμογή πιστοποίησης
+    description_html: Αν ενεργοποιήσεις την <strong>ταυτοποίηση δύο παραγόντων</strong> χρησιμοποιώντας εφαρμογή ταυτοποίησης, για να συνδεθείς θα πρέπει να έχεις το τηλέφωνό σου, που θα σού δημιουργήσει κλειδιά εισόδου.
     enable: Ενεργοποίηση
+    instructions_html: "<strong>Σάρωσε αυτόν τον κωδικό QR με την εφαρμογή Google Authenticator ή κάποια άλλη αντίστοιχη στο τηλέφωνό σου</strong>. Από εδώ και στο εξής, η εφαρμογή θα δημιουργεί κλειδιά που θα πρέπει να εισάγεις όταν συνδέεσαι."
+    manual_instructions: 'Αν δεν μπορείς να σαρώσεις τον κωδικό QR και χρειάζεσαι να τον εισάγεις χειροκίνητα, ορίστε η μυστική φράση σε μορφή κειμένου:'
     setup: Ρύθμιση
+    wrong_code: Ο κωδικός που έβαλες ήταν άκυρος! Η ώρα στον διακομιστή και τη συσκευή είναι σωστή;
   pagination:
     newer: Νεότερο
     next: Επόμενο
@@ -1217,8 +1407,12 @@ el:
       unrecognized_emoji: δεν αναγνωρίζεται ως emoji
   relationships:
     activity: Δραστηριότητα λογαριασμού
+    confirm_follow_selected_followers: Είσαι βέβαιος ότι θες να ακολουθήσεις τους επιλεγμένους ακόλουθους;
+    confirm_remove_selected_followers: Είσαι βέβαιος ότι θες να αφαιρέσεις τους επιλεγμένους ακόλουθους;
+    confirm_remove_selected_follows: Είσαι βέβαιος ότι θες να αφαιρέσεις τα επιλεγμένα άτομα που ακολουθείς;
     dormant: Αδρανείς
     follow_failure: Δεν ήταν δυνατή η παρακολούθηση ορισμένων από τους επιλεγμένους λογαριασμούς.
+    follow_selected_followers: Ακολουθήστε τους επιλεγμένους ακόλουθους
     followers: Σε ακολουθούν
     following: Ακολουθείς
     invited: Προσκεκλημένοι
@@ -1239,6 +1433,9 @@ el:
       invalid_rules: δεν παραπέμπει σε έγκυρους κανόνες
   rss:
     content_warning: 'Προειδοποίηση περιεχομένου:'
+    descriptions:
+      account: Δημόσιες δημοσιεύσεις από @%{acct}
+      tag: 'Δημόσιες δημοσιεύσεις με ετικέτα #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ για εκείνη τη μέρα
     over_total_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ
@@ -1247,13 +1444,17 @@ el:
     activity: Τελευταία δραστηριότητα
     browser: Φυλλομετρητής (Browser)
     browsers:
+      alipay: Alipay
       blackberry: BlackBerry
       chrome: Chrome
       edge: Microsoft Edge
+      electron: Electron
       firefox: Firefox
       generic: Άγνωστος φυλλομετρητής
       huawei_browser: Huawei Browser
       ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
       opera: Opera
       otter: Otter
       phantom_js: PhantomJS
@@ -1261,10 +1462,13 @@ el:
       safari: Safari
       uc_browser: UC Browser
       unknown_browser: Άγνωστος φυλλομετρητής
+      weibo: Weibo
     current_session: Τρέχουσα σύνδεση
     description: "%{browser} σε %{platform}"
     explanation: Αυτοί είναι οι φυλλομετρητές (browsers) που είναι συνδεδεμένοι στον λογαριασμό σου στο Mastodon αυτή τη στιγμή.
+    ip: IP
     platforms:
+      adobe_air: Adobe Air
       android: Android
       blackberry: BlackBerry
       chrome_os: ChromeOS
@@ -1274,9 +1478,13 @@ el:
       linux: Linux
       mac: Mac
       unknown_platform: Άγνωστη Πλατφόρμα
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
     revoke: Ανακάλεσε
     revoke_success: Η σύνδεση ανακλήθηκε επιτυχώς
     title: Σύνδεση
+    view_authentication_history: Δείτε το ιστορικό ταυτοποιήσεων του λογαριασμού σας
   settings:
     account: Λογαριασμός
     account_settings: Ρυθμίσεις λογαριασμού
@@ -1296,7 +1504,10 @@ el:
     preferences: Προτιμήσεις
     profile: Προφίλ
     relationships: Ακολουθείς και σε ακολουθούν
+    statuses_cleanup: Αυτοματοποιημένη διαγραφή δημοσιεύσεων
+    strikes: Ποινές από ομάδα συντονισμού
     two_factor_authentication: Πιστοποίηση 2 παραγόντων (2FA)
+    webauthn_authentication: Κλειδιά ασφαλείας
   statuses:
     attached:
       audio:
@@ -1338,7 +1549,9 @@ el:
     show_older: Εμφάνιση παλαιότερων
     show_thread: Εμφάνιση νήματος
     sign_in_to_participate: Συνδέσου για να συμμετάσχεις στη συζήτηση
+    title: '%{name}: "%{quote}"'
     visibilities:
+      direct: Άμεση
       private: Μόνο ακόλουθοι
       private_long: Εμφάνιση μόνο σε ακόλουθους
       public: Δημόσιο
@@ -1346,6 +1559,26 @@ el:
       unlisted: Μη καταχωρημένο
       unlisted_long: Βλέπει οποιοσδήποτε, αλλά δεν καταχωρείται στις δημόσιες ροές
   statuses_cleanup:
+    enabled: Αυτόματη διαγραφή παλιών δημοσιεύσεων
+    enabled_hint: Διαγράφει αυτόματα τις δημοσιεύσεις σας μόλις φτάσουν σε ένα καθορισμένο όριο ηλικίας, εκτός αν ταιριάζουν με μία από τις παρακάτω εξαιρέσεις
+    exceptions: Εξαιρέσεις
+    explanation: Επειδή η διαγραφή δημοσιέυσεων είναι μια κοστοβόρα διαδικασία, γίνεται σε αραιά τακτά διαστήματα, όταν ο διακομιστής δεν είναι ιδιαίτερα απασχολημένος. Γι' αυτό, οι δημοσιεύσεις σας μπορεί να διαγραφούν λίγο μετά το πέρας του ορίου ηλικίας.
+    ignore_favs: Αγνόηση αγαπημένων
+    ignore_reblogs: Αγνόηση ενισχύσεων
+    interaction_exceptions: Εξαιρέσεις βασισμένες σε αλληλεπιδράσεις
+    interaction_exceptions_explanation: Σημειώστε ότι δεν υπάρχει εγγύηση για πιθανή διαγραφή δημοσιεύσεων αν αυτά πέσουν κάτω από το όριο αγαπημένων ή ενισχύσεων ακόμα και αν κάποτε το είχαν ξεπεράσει.
+    keep_direct: Διατήρηση άμεσων μηνυμάτων
+    keep_direct_hint: Δεν διαγράφει κανένα από τα άμεσα μηνύματά σας
+    keep_media: Διατήρηση δημοσιεύσεων με συνημμένα πολυμέσων
+    keep_media_hint: Δεν διαγράφει καμία από τις δημοσιεύσεις σας που έχουν συνημμένα πολυμέσων
+    keep_pinned: Διατήρηση καρφιτσωμένων δημοσιεύσεων
+    keep_pinned_hint: Δεν διαγράφει καμία από τις καρφιτσωμένες δημοσιεύσεις σας
+    keep_polls: Διατήρηση δημοσκοπήσεων
+    keep_polls_hint: Δεν διαγράφει καμία από τις δημοσκοπήσεις σας
+    keep_self_bookmark: Διατήρηση δημοσιεύσεων που έχετε σελιδοδείκτη
+    keep_self_bookmark_hint: Δεν διαγράφει τις δημοσιεύσεις σας αν τις έχετε προσθέσει στους σελιδοδείκτες
+    keep_self_fav: Κρατήστε τις δημοσιεύσεις που έχετε στα αγαπημένες
+    keep_self_fav_hint: Δεν διαγράφει τις δημοσιεύσεις σας αν τις έχετε στα αγαπημένα
     min_age:
       '1209600': 2 εβδομάδες
       '15778476': 6 μήνες
@@ -1355,10 +1588,18 @@ el:
       '604800': 1 εβδομάδα
       '63113904': 2 χρόνια
       '7889238': 3 μήνες
+    min_age_label: Όριο ηλικίας
+    min_favs: Κρατήστε τις δημοσιεύσεις που έχουν γίνει αγαπημένες τουλάχιστον
+    min_favs_hint: Δεν διαγράφει καμία από τις δημοσιεύσεις σας που έχει λάβει τουλάχιστον αυτόν τον αριθμό αγαπημένων. Αφήστε κενό για να διαγράψετε δημοσιεύσεις ανεξάρτητα από τον αριθμό των αγαπημένων
+    min_reblogs: Διατήρηση δημοσιεύσεων που έχουν ενισχυθεί τουλάχιστον
+    min_reblogs_hint: Δεν διαγράφει καμία από τις δημοσιεύσεις σας που έχει λάβει τουλάχιστον αυτόν τον αριθμό ενισχύσεων. Αφήστε κενό για να διαγράψετε δημοσιεύσεις ανεξάρτητα από τον αριθμό των ενισχύσεων
   stream_entries:
     pinned: Καρφιτσωμένο τουτ
     reblogged: προωθημένο
     sensitive_content: Ευαίσθητο περιεχόμενο
+  strikes:
+    errors:
+      too_late: Είναι πολύ αργά για να κάνετε έφεση σε αυτήν την ποινή
   tags:
     does_not_match_previous_name: δεν ταιριάζει με το προηγούμενο όνομα
   themes:
@@ -1367,64 +1608,110 @@ el:
     mastodon-light: Mastodon (Ανοιχτόχρωμο)
   time:
     formats:
+      default: "%b %d, %Y, %H:%M"
+      month: "%b %Y"
       time: "%H:%M"
   two_factor_authentication:
     add: Προσθήκη
     disable: Απενεργοποίησε
+    disabled_success: Η ταυτοποίηση δύο παραγόντων απενεργοποιήθηκε επιτυχώς
     edit: Επεξεργασία
     enabled: Η πιστοποίηση 2 παραγόντων (2FA) είναι ενεργοποιημένη
     enabled_success: Η πιστοποίηση 2 παραγόντων (2FA) ενεργοποιήθηκε επιτυχώς
     generate_recovery_codes: Δημιούργησε κωδικούς ανάκτησης
     lost_recovery_codes: Οι κωδικοί ανάκτησης σου επιτρέπουν να ανακτήσεις ξανά πρόσβαση στον λογαριασμό σου αν χάσεις το τηλέφωνό σου. Αν έχεις χάσει τους κωδικούς ανάκτησης, μπορείς να τους δημιουργήσεις ξανά εδώ. Οι παλιοί κωδικοί σου θα ακυρωθούν.
+    methods: Μέθοδοι δύο παραγόντων
     otp: Εφαρμογή επαλήθευσης
     recovery_codes: Εφεδρικοί κωδικοί ανάκτησης
     recovery_codes_regenerated: Οι εφεδρικοί κωδικοί ανάκτησης δημιουργήθηκαν επιτυχώς
     recovery_instructions_html: Αν ποτέ δεν έχεις πρόσβαση στο κινητό σου, μπορείς να χρησιμοποιήσεις έναν από τους παρακάτω κωδικούς ανάκτησης για να αποκτήσεις πρόσβαση στο λογαριασμό σου. <strong>Διαφύλαξε τους κωδικούς ανάκτησης</strong>. Για παράδειγμα, μπορείς να τους εκτυπώσεις και να τους φυλάξεις μαζί με άλλα σημαντικά σου έγγραφα.
+    webauthn: Κλειδιά ασφαλείας
   user_mailer:
+    appeal_approved:
+      action: Μετάβαση στον λογαριασμό σας
+      explanation: Η έφεση της ποινής εναντίον του λογαριασμού σας στις %{strike_date}, που υποβάλλατε στις %{appeal_date}, έχει εγκριθεί. Ο λογαριασμός σας είναι και πάλι σε καλή κατάσταση.
+      subject: Η έφεση σας από τις %{date} έχει εγκριθεί
+      title: Έφεση εγκρίθηκε
+    appeal_rejected:
+      explanation: Η έφεση της ποινής εναντίον του λογαριασμού σας στις %{strike_date}, που υποβάλλατε στις %{appeal_date}, έχει απορριφθεί.
+      subject: Η έφεση σας από τις %{date} έχει απορριφθεί
+      title: Έφεση απορρίφθηκε
     backup_ready:
       explanation: Είχες ζητήσει εφεδρικό αντίγραφο του λογαριασμού σου στο Mastodon. Είναι έτοιμο για κατέβασμα!
       subject: Το εφεδρικό αντίγραφό σου είναι έτοιμο για κατέβασμα
       title: Λήψη εφεδρικού αρχείου
     suspicious_sign_in:
       change_password: αλλάξτε τον κωδικό πρόσβασής σας
+      details: 'Εδώ είναι οι λεπτομέρειες της σύνδεσης:'
+      explanation: Εντοπίσαμε μια σύνδεση στο λογαριασμό σας από μια νέα διεύθυνση IP.
+      further_actions_html: Αν δεν ήσασταν εσείς, σας συνιστούμε να %{action} αμέσως και να ενεργοποιήσετε τον έλεγχο ταυτοποίησης δύο παραγόντων για να διατηρήσετε τον λογαριασμό σας ασφαλή.
+      subject: Ο λογαριασμός σας έχει συνδεθεί από μια νέα διεύθυνση IP
+      title: Μια νέα σύνδεση
     warning:
+      appeal: Υποβολή έφεσης
+      appeal_description: Αν πιστεύετε ότι έγινε λάθος, μπορείτε να υποβάλετε μια αίτηση στο προσωπικό του %{instance}.
       categories:
         spam: Ανεπιθύμητο
+        violation: Το περιεχόμενο παραβιάζει τις ακόλουθες οδηγίες κοινότητας
+      explanation:
+        delete_statuses: Μερικές από τις δημοσιεύσεις σου έχουν βρεθεί να παραβιάζουν μία ή περισσότερες οδηγίες κοινότητας και έχουν συνεπώς αφαιρεθεί από τους συντονιστές του %{instance}.
+        disable: Δεν μπορείς πλέον να χρησιμοποιήσεις τον λογαριασμό σου, αλλά το προφίλ σου και άλλα δεδομένα παραμένουν άθικτα. Μπορείς να ζητήσετε ένα αντίγραφο ασφαλείας των δεδομένων σου, να αλλάξεις τις ρυθμίσεις του λογαριασμού σου ή να διαγράψεις τον λογαριασμό σου.
+        mark_statuses_as_sensitive: Μερικές από τις δημοσιεύσεις σου έχουν επισημανθεί ως ευαίσθητες από τους συντονιστές του %{instance}. Αυτό σημαίνει ότι οι άνθρωποι θα πρέπει να πατήσουν τα πολυμέσα στις δημοσιεύσεις πριν εμφανιστεί μια προεπισκόπηση. Μπορείς να επισημάνεις τα πολυμέσα ως ευαίσθητα όταν δημοσιεύεις στο μέλλον.
+        sensitive: Από δω και στο εξής, όλα τα μεταφορτωμένα αρχεία πολυμέσων σου θα επισημανθούν ως ευαίσθητα και κρυμμένα πίσω από μια προειδοποίηση πατήστε - για - εμφάνιση.
+        silence: Μπορείς ακόμα να χρησιμοποιείς το λογαριασμό σου, αλλά μόνο άτομα που σε ακολουθούν ήδη θα δουν τις δημοσιεύσεις σου σε αυτόν τον διακομιστή και μπορεί να αποκλειστείς από διάφορες δυνατότητες ανακάλυψης. Ωστόσο, οι άλλοι μπορούν ακόμα να σε ακολουθήσουν με μη αυτόματο τρόπο.
+        suspend: Δε μπορείς πλέον να χρησιμοποιήσεις τον λογαριασμό σου και το προφίλ σου και άλλα δεδομένα δεν είναι πλέον προσβάσιμα. Μπορείς ακόμα να συνδεθείς για να αιτηθείς αντίγραφο των δεδομένων σου μέχρι να αφαιρεθούν πλήρως σε περίπου 30 μέρες αλλά, θα διατηρήσουμε κάποια βασικά δεδομένα για να σε αποτρέψουμε να παρακάμψεις την αναστολή.
       reason: 'Αιτιολογία:'
+      statuses: 'Αναφερόμενες δημοσιεύσεις:'
       subject:
+        delete_statuses: Οι δημοσιεύσεις σου στον %{acct} έχουν αφαιρεθεί
         disable: Ο λογαριασμός σου %{acct} έχει παγώσει
+        mark_statuses_as_sensitive: Οι δημοσιεύσεις σου στον %{acct} έχουν επισημανθεί ως ευαίσθητες
         none: Προειδοποίηση προς %{acct}
+        sensitive: Οι δημοσιεύσεις σου στο %{acct} θα επισημανθούν ως ευαίσθητες από 'δω και στο εξής
         silence: Ο λογαριασμός σου %{acct} έχει περιοριστεί
         suspend: Ο λογαριασμός σου %{acct} έχει ανασταλεί
       title:
+        delete_statuses: Οι δημοσιεύσεις αφαιρέθηκαν
         disable: Παγωμένος λογαριασμός
+        mark_statuses_as_sensitive: Οι δημοσιέυσεις επισημάνθηκαν ως ευαίσθητες
         none: Προειδοποίηση
+        sensitive: Ο λογαριασμός επισημάνθηκε ως ευαίσθητος
         silence: Περιορισμένος λογαριασμός
         suspend: Λογαριασμός σε αναστολή
     welcome:
       edit_profile_action: Στήσιμο προφίλ
+      edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν.
       explanation: Μερικές συμβουλές για να ξεκινήσεις
       final_action: Ξεκίνα τις δημοσιεύσεις
+      final_step: 'Ξεκίνα να δημοσιεύεις! Ακόμα και χωρίς ακόλουθους τις δημόσιες δημοσιεύσεις σου μπορεί να τις δουν άλλοι, για παράδειγμα στην τοπική ροή ή στις ετικέτες. Ίσως να θέλεις να μας γνωρίσεις τον εαυτό σου με την ετικέτα #introductions.'
       full_handle: Το πλήρες όνομά σου
       full_handle_hint: Αυτό θα εδώ θα πεις στους φίλους σου για να σου μιλήσουν ή να σε ακολουθήσουν από άλλο κόμβο.
       subject: Καλώς ήρθες στο Mastodon
       title: Καλώς όρισες, %{name}!
   users:
     follow_limit_reached: Δεν μπορείς να ακολουθήσεις περισσότερα από %{limit} άτομα
+    go_to_sso_account_settings: Μεταβείτε στις ρυθμίσεις λογαριασμού του παρόχου ταυτότητας σας
     invalid_otp_token: Άκυρος κωδικός πιστοποίησης 2 παραγόντων (2FA)
     otp_lost_help_html: Αν χάσεις και τα δύο, μπορείς να επικοινωνήσεις με τον/την %{email}
     seamless_external_login: Επειδή έχεις συνδεθεί μέσω τρίτης υπηρεσίας, οι ρυθμίσεις συνθηματικού και email δεν είναι διαθέσιμες.
     signed_in_as: 'Έχεις συνδεθεί ως:'
   verification:
-    explanation_html: 'Μπορείς να <strong>πιστοποιήσεις τον εαυτό σου ως ιδιοκτήτη των συνδέσμων που εμφανίζεις στα μεταδεδομένα του προφίλ σου</strong>. Για να συμβεί αυτό, ο συνδεδεμένος ιστότοπος πρέπει να περιέχει ένα σύνδεσμο που να επιστρέφει προς το προφίλ σου στο Mastodon. Ο σύνδεσμος επιστροφής <strong>πρέπει</strong> περιέχει την ιδιότητα (attribute) <code>rel="me"</code>. Το περιεχόμενο του κειμένου δεν έχει σημασία. Για παράδειγμα:'
+    explanation_html: 'Μπορείς να <strong>επαληθεύσεις τον εαυτό σου ως ιδιοκτήτη των συνδέσμων που εμφανίζεις στα μεταδεδομένα του προφίλ σου</strong>. Για να συμβεί αυτό, ο συνδεδεμένος ιστότοπος πρέπει να περιέχει ένα σύνδεσμο που να επιστρέφει προς το προφίλ σου στο Mastodon. Ο σύνδεσμος επιστροφής <strong>πρέπει</strong> να περιέχει την ιδιότητα <code>rel="me"</code>. Το περιεχόμενο του κειμένου δεν έχει σημασία. Για παράδειγμα:'
     verification: Πιστοποίηση
   webauthn_credentials:
     add: Προσθήκη νέου κλειδιού ασφαλείας
     create:
+      error: Παρουσιάστηκε πρόβλημα κατά την προσθήκη του κλειδιού ασφαλείας. Παρακαλώ δοκίμασε ξανά.
       success: Το κλειδί ασφαλείας σας προστέθηκε με επιτυχία.
     delete: Διαγραφή
     delete_confirmation: Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το κλειδί ασφαλείας;
+    description_html: Αν ενεργοποιήσεις την <strong>ταυτοποίηση κλειδιού ασφαλείας</strong>, κατά τη σύνδεσή σου θα χρειαστεί να χρησιμοποιήσεις ένα από τα κλειδιά ασφαλείας σου.
     destroy:
+      error: Παρουσιάστηκε πρόβλημα κατά την διαγραφή του κλειδιού ασφαλείας. Παρακαλώ δοκίμασε ξανά.
       success: Το κλειδί ασφαλείας σας διαγράφηκε με επιτυχία.
     invalid_credential: Άκυρο κλειδί ασφαλείας
+    nickname_hint: Εισάγετε το ψευδώνυμο του νέου κλειδιού ασφαλείας σου
+    not_enabled: Δεν έχεις ενεργοποιήσει το WebAuthn ακόμα
+    not_supported: Αυτό το πρόγραμμα περιήγησης δεν υποστηρίζει κλειδιά ασφαλείας
+    otp_required: Για να χρησιμοποιήσεις κλειδιά ασφαλείας, ενεργοποιήσε πρώτα την ταυτοποίηση δύο παραγόντων.
     registered_on: Εγγραφή στις %{date}
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index 8e2e45350..a457509ee 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -475,6 +475,67 @@ en-GB:
       confirm_purge: Are you sure you want to permanently delete data from this domain?
       content_policies:
         comment: Internal note
+        description_html: You can define content policies that will be applied to all accounts from this domain and any of its subdomains.
+        limited_federation_mode_description_html: You can chose whether to allow federation with this domain.
+        policies:
+          reject_media: Reject media
+          reject_reports: Reject reports
+          silence: Limit
+          suspend: Suspend
+        policy: Policy
+        reason: Public reason
+        title: Content policies
+      dashboard:
+        instance_accounts_dimension: Most followed accounts
+        instance_accounts_measure: stored accounts
+        instance_followers_measure: our followers there
+        instance_follows_measure: their followers here
+        instance_languages_dimension: Top languages
+        instance_media_attachments_measure: stored media attachments
+        instance_reports_measure: reports about them
+        instance_statuses_measure: stored posts
+      delivery:
+        all: All
+        clear: Clear delivery errors
+        failing: Failing
+        restart: Restart delivery
+        stop: Stop delivery
+        unavailable: Unavailable
+      delivery_available: Delivery is available
+      delivery_error_days: Delivery error days
+      delivery_error_hint: If delivery is not possible for %{count} days, it will be automatically marked as undeliverable.
+      destroyed_msg: Data from %{domain} is now queued for imminent deletion.
+      empty: No domains found.
+      known_accounts:
+        one: "%{count} known account"
+        other: "%{count} known accounts"
+      moderation:
+        all: All
+        limited: Limited
+        title: Moderation
+      private_comment: Private comment
+      public_comment: Public comment
+      purge: Purge
+      purge_description_html: If you believe this domain is offline for good, you can delete all account records and associated data from this domain from your storage. This may take a while.
+      title: Federation
+      total_blocked_by_us: Blocked by us
+      total_followed_by_them: Followed by them
+      total_followed_by_us: Followed by us
+      total_reported: Reports about them
+      total_storage: Media attachments
+      totals_time_period_hint_html: The totals displayed below include data for all time.
+    invites:
+      deactivate_all: Deactivate all
+      filter:
+        all: All
+        available: Available
+        expired: Expired
+        title: Filter
+      title: Invites
+    ip_blocks:
+      add_new: Create rule
+      created_msg: Successfully added new IP rule
+      delete: Delete
     roles:
       categories:
         devops: DevOps
@@ -523,8 +584,12 @@ en-GB:
   invites:
     delete: Deactivate
     expired: Expired
+  navigation:
+    toggle_menu: Toggle menu
   notification_mailer:
     admin:
+      report:
+        subject: "%{name} submitted a report"
       sign_up:
         subject: "%{name} signed up"
     favourite:
@@ -539,8 +604,60 @@ en-GB:
       action: Manage follow requests
       body: "%{name} has requested to follow you"
       subject: 'Pending follower: %{name}'
+      title: New follow request
+    mention:
+      action: Reply
+      body: 'You were mentioned by %{name} in:'
+      subject: You were mentioned by %{name}
+      title: New mention
+    poll:
+      subject: A poll by %{name} has ended
+    reblog:
+      body: 'Your post was boosted by %{name}:'
+      subject: "%{name} boosted your post"
+      title: New boost
+    status:
+      subject: "%{name} just posted"
+    update:
+      subject: "%{name} edited a post"
+  notifications:
+    email_events: Events for e-mail notifications
+    email_events_hint: 'Select events that you want to receive notifications for:'
+    other_settings: Other notifications settings
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  otp_authentication:
+    code_hint: Enter the code generated by your authenticator app to confirm
+    description_html: If you enable <strong>two-factor authentication</strong> using an authenticator app, logging in will require you to be in possession of your phone, which will generate tokens for you to enter.
+    enable: Enable
+    instructions_html: "<strong>Scan this QR code into Google Authenticator or a similar TOTP app on your phone</strong>. From now on, that app will generate tokens that you will have to enter when logging in."
+    manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:'
+    setup: Set up
+    wrong_code: The entered code was invalid! Are server time and device time correct?
+  pagination:
+    newer: Newer
+    next: Next
+    older: Older
+    prev: Prev
+    truncate: "&hellip;"
   polls:
     errors:
+      already_voted: You have already voted on this poll
+      duplicate_options: contain duplicate items
+      duration_too_long: is too far into the future
+      duration_too_short: is too soon
+      expired: The poll has already ended
+      invalid_choice: The chosen vote option does not exist
+      over_character_limit: cannot be longer than %{max} characters each
+      too_few_options: must have more than one item
       too_many_options: can't contain more than %{max} items
   preferences:
     other: Other
@@ -837,12 +954,13 @@ en-GB:
       title: Welcome aboard, %{name}!
   users:
     follow_limit_reached: You cannot follow more than %{limit} people
+    go_to_sso_account_settings: Go to your identity provider's account settings
     invalid_otp_token: Invalid two-factor code
     otp_lost_help_html: If you lost access to both, you may get in touch with %{email}
     seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
     signed_in_as: 'Signed in as:'
   verification:
-    explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
+    explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. After adding the link you may need to come back here and re-save your profile for the verification to take effect. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
     verification: Verification
   webauthn_credentials:
     add: Add new security key
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index b381805a1..b45692664 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -1691,7 +1691,6 @@ eo:
     seamless_external_login: Vi estas ensalutinta per ekstera servo, do pasvortaj kaj retadresaj agordoj ne estas disponeblaj.
     signed_in_as: 'Salutinta kiel:'
   verification:
-    explanation_html: 'Vi povas <strong>pruvi, ke vi estas la posedanto de la ligiloj en viaj profilaj metadatumoj</strong>. Por fari tion, la alligita retejo devas enhavi ligilon reen al via Mastodon-profilo. La religilo <strong>devas</strong> havi la atributon <code>rel="me"</code>. Ne gravas la teksta enhavo de la religilo. Jen ekzemplo:'
     verification: Kontrolo
   webauthn_credentials:
     add: Aldoni novan sekurecan ŝlosilon
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 2a395c80f..fce42cf96 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -812,6 +812,12 @@ es-AR:
         message_html: No definiste ninguna regla del servidor.
       sidekiq_process_check:
         message_html: No hay ningún proceso Sidekiq en ejecución para la/s cola/s %{value}. Por favor, revisá tu configuración de Sidekiq
+      upload_check_privacy_error:
+        action: Revisá acá para más información
+        message_html: "<strong>Tu servidor web está mal configurado. La privacidad de tus usuarios está en riesgo.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Revisá acá para más información
+        message_html: "<strong>El almacenamiento de tu objeto está mal configurado. La privacidad de tus usuarios está en riesgo.</strong>"
     tags:
       review: Estado de revisión
       updated_msg: La configuración de la etiqueta se actualizó exitosamente
@@ -1684,12 +1690,13 @@ es-AR:
       title: "¡Bienvenido a bordo, %{name}!"
   users:
     follow_limit_reached: No podés seguir a más de %{limit} cuentas
+    go_to_sso_account_settings: Andá a la configuración de cuenta de tu proveedor de identidad
     invalid_otp_token: Código de dos factores no válido
     otp_lost_help_html: Si perdiste al acceso a ambos, podés ponerte en contacto con %{email}
     seamless_external_login: Iniciaste sesión desde un servicio externo, así que la configuración de contraseña y correo electrónico no están disponibles.
     signed_in_as: 'Iniciaste sesión como:'
   verification:
-    explanation_html: 'Podés <strong>verificarte a vos mismo como el propietario de los enlaces en los metadatos de tu perfil</strong>. Para eso, el sitio web del enlace debe contener un enlace de vuelta a tu perfil de Mastodon. El enlace en tu sitio <strong>debe</strong> tener un atributo <code>rel="me"</code>. El contenido del texto del enlace no importa. Acá tenés un ejemplo:'
+    explanation_html: 'Podés <strong>verificarte a vos mismo como el propietario de los enlaces en los metadatos de tu perfil</strong>. Para eso, el sitio web del enlace debe contener un enlace de vuelta a tu perfil de Mastodon. Después de agregar el enlace, puede que tengás que volver acá y volver a guardar los cambios en tu perfil para que la verificación surta efecto. El enlace en tu sitio <strong>debe</strong> tener un atributo <code>rel="me"</code>. El contenido del texto del enlace no importa. Acá tenés un ejemplo:'
     verification: Verificación
   webauthn_credentials:
     add: Agregar nueva llave de seguridad
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 3919b4064..077a0192d 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -812,6 +812,12 @@ es-MX:
         message_html: No ha definido ninguna regla del servidor.
       sidekiq_process_check:
         message_html: No hay ningún proceso Sidekiq en ejecución para la(s) cola(s) %{value}. Por favor, revise su configuración de Sidekiq
+      upload_check_privacy_error:
+        action: Para más información aquí
+        message_html: "<strong>Su servidor web no está configurado. Está en riesgo la privacidad de sus usuarios.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Para más información aquí
+        message_html: "<strong>Su almacenamiento no está configurado. Está en riesgo la privacidad de sus usuarios.</strong>"
     tags:
       review: Estado de revisión
       updated_msg: Hashtags actualizados exitosamente
@@ -1684,12 +1690,13 @@ es-MX:
       title: Te damos la bienvenida a bordo, %{name}!
   users:
     follow_limit_reached: No puedes seguir a más de %{limit} personas
+    go_to_sso_account_settings: Diríjete a la configuración de la cuenta de su proveedor de identidad
     invalid_otp_token: Código de dos factores incorrecto
     otp_lost_help_html: Si perdiste al acceso a ambos, puedes ponerte en contancto con %{email}
     seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles.
     signed_in_as: 'Sesión iniciada como:'
   verification:
-    explanation_html: 'Puedes <strong> verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil </strong>. Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodon. El vínculo en tu sitio <strong> debe </strong> tener un atributo <code> rel="me"</code>. El texto del vínculo no importa. Aquí un ejemplo:'
+    explanation_html: 'Puedes <strong>verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil</strong>. Para eso, el sitio enlazado debe contener un enlace a tu perfil de Mastodon. Después de añadir el enlace, necesitarás regresar aquí y volver a guardar tu perfil para que la verificación tenga efecto. El enlace en tu sitio <strong>debe</strong> tener un atributo <code>rel="me"</code>. El texto del contenido del enlace no importa. Aquí un ejemplo:'
     verification: Verificación
   webauthn_credentials:
     add: Agregar nueva clave de seguridad
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 04f9b2346..3fce5035d 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -812,6 +812,12 @@ es:
         message_html: No ha definido ninguna regla del servidor.
       sidekiq_process_check:
         message_html: No hay ningún proceso Sidekiq en ejecución para la(s) cola(s) %{value}. Por favor, revise su configuración de Sidekiq
+      upload_check_privacy_error:
+        action: Haga clic aquí para obtener más información
+        message_html: "<strong>Su servidor web está mal configurado. La privacidad de sus usuarios está en riesgo.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Haga clic aquí para obtener más información
+        message_html: "<strong>El almacenamiento de su objeto está mal configurado. La privacidad de sus usuarios está en riesgo.</strong>"
     tags:
       review: Estado de revisión
       updated_msg: Hashtags actualizados exitosamente
@@ -1684,12 +1690,12 @@ es:
       title: Te damos la bienvenida a bordo, %{name}!
   users:
     follow_limit_reached: No puedes seguir a más de %{limit} personas
+    go_to_sso_account_settings: Diríjase a la configuración de la cuenta de su proveedor de identidad
     invalid_otp_token: Código de dos factores incorrecto
     otp_lost_help_html: Si perdiste al acceso a ambos, puedes ponerte en contancto con %{email}
     seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles.
     signed_in_as: 'Sesión iniciada como:'
   verification:
-    explanation_html: 'Puedes <strong> verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil </strong>. Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodon. El vínculo en tu sitio <strong> debe </strong> tener un atributo <code> rel="me"</code>. El texto del vínculo no importa. Aquí un ejemplo:'
     verification: Verificación
   webauthn_credentials:
     add: Agregar nueva clave de seguridad
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 3da578402..ad3af525b 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -600,7 +600,7 @@ et:
       created_at: Teavitatud
       delete_and_resolve: Kustuta postitused
       forwarded: Edastatud
-      forwarded_to: Edastatud domeenile %{domain}
+      forwarded_to: Edastatud %{domain} domeeni
       mark_as_resolved: Märgi lahendatuks
       mark_as_sensitive: Märgi kui tundlik sisu
       mark_as_unresolved: Märgi lahendamata
@@ -812,6 +812,12 @@ et:
         message_html: Serverireegleid pole defineeritud.
       sidekiq_process_check:
         message_html: Ühtegi Sidekiq protsessi pole %{value} järjekorra jaoks. Sidekiq seadistus vajab üle vaatamist
+      upload_check_privacy_error:
+        action: Klõpsa lisainfo saamiseks siia
+        message_html: "<strong>Veebiserver on valesti seadistatud. Kasutajate privaatsus on ohustatud.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Klõpsa lisainfo saamiseks siia
+        message_html: "<strong>Objektihoidla on valesti seadistatud. Kasutajate privaatsus on ohustatud.</strong>"
     tags:
       review: Vaata olek üle
       updated_msg: Sildi sätted edukalt uuendatud
@@ -1689,12 +1695,13 @@ et:
       title: Tere tulemast, %{name}!
   users:
     follow_limit_reached: Ei saa jälgida rohkem kui %{limit} inimest
+    go_to_sso_account_settings: Mine oma idenditeedipakkuja kontosätetesse
     invalid_otp_token: Vale kaheastmeline võti
     otp_lost_help_html: Kui kaotasid ligipääsu mõlemale, saad võtta ühendust %{email}-iga
     seamless_external_login: Välise teenuse kaudu sisse logides pole salasõna ja e-posti sätted saadaval.
     signed_in_as: 'Sisse logitud kasutajana:'
   verification:
-    explanation_html: 'Saad <strong>kinnitada ennast oma profiili veebiviidete omanikuna</strong>. Selleks peab viidatud veebilehel olema link tagasi su Mastodoni profiilile. Tagasi saatval lingil <strong>peab</strong> olema <code>rel="me"</code> atribuut. Lingi tekstiline sisu ei ole oluline. Siin on üks näide:'
+    explanation_html: 'Saad <strong>kinnitada ennast oma profiili metaandmete veebiviidete omanikuna.</strong> Selleks peab lingitud veebilehel olema viide tagasi sinu Mastodoni profiilile. Pärast lingi lisamist pead võib-olla siia tagasi tulema ja oma profiili uuesti salvestama, et kinnitus jõustuks. Tagasiviide <strong>peab</strong> sisaldama <code>rel="me"</code> atribuuti. Lingi tekstiline sisu ei ole oluline. Siin on näide:'
     verification: Kinnitamine
   webauthn_credentials:
     add: Uue turvavõtme lisamine
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 39e0b2607..b2e87cc8a 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -814,6 +814,12 @@ eu:
         message_html: Ez duzu zerbitzariaren araurik definitu.
       sidekiq_process_check:
         message_html: Ez da ari Sidekiq prozesurik exekutatzen %{value} ilad(et)an. Egiaztatu Sidekiq konfigurazioa
+      upload_check_privacy_error:
+        action: Ikus hemen informazio gehiagorako
+        message_html: "<strong>Zure zerbitzaria ez dago ongi konfiguratua. Zure erabiltzaileen pribatutasuna arriskuan dago.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Ikus hemen informazio gehiagorako
+        message_html: "<strong>Zure objektuen biltegiratzea ez dago ongi konfiguratua. Zure erabiltzaileen pribatutasuna arriskuan dago.</strong>"
     tags:
       review: Berrikusketaren egoera
       updated_msg: Traola-ezarpenak ongi eguneratu dira
@@ -1686,12 +1692,13 @@ eu:
       title: Ongi etorri, %{name}!
   users:
     follow_limit_reached: Ezin dituzu %{limit} pertsona baino gehiago jarraitu
+    go_to_sso_account_settings: Jo zure identitate-hornitzaileko kontuaren ezarpenetara
     invalid_otp_token: Bi faktoreetako kode baliogabea
     otp_lost_help_html: 'Bietara sarbidea galdu baduzu, jarri kontaktuan hemen: %{email}'
     seamless_external_login: Kanpo zerbitzu baten bidez hasi duzu saioa, beraz pasahitza eta e-mail ezarpenak ez daude eskuragarri.
     signed_in_as: 'Saioa honela hasita:'
   verification:
-    explanation_html: 'Ezin duzu <strong>zure burua zure profileko metadatuen esteken jabe gisa egiaztatu</strong>. Horretarako, estekatutako webgunean zure Mastodon profilera daraman esteka bat egon behar du. Mastodonera daraman esteka horrek<strong>derrigorrez</strong> <code>rel="me"</code> artibutua izan behar du . Estekaren testuak ez du axola. Hona adibide bat:'
+    explanation_html: '<strong>Zure profileko metadatuetako esteken jabe zarela egiazta</strong> dezakezu. Horretarako, webguneak zure Mastodoneko profilaren esteka eduki behar du. Esteka webgunean erantsi ondoren, aldaketak berriro gorde beharko dituzu egiaztapena burutu ahal izateko. Estekak <code>rel="me"</code> atributua eduki <strong>behar</strong> du. Estekaren testu-edukia ez da aintzat hartzen. Hemen duzu adibide bat:'
     verification: Egiaztaketa
   webauthn_credentials:
     add: Gehitu segurtasun gako berria
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 0127d0e61..4fc9ef5ab 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -1319,7 +1319,6 @@ fa:
     seamless_external_login: شما با یک سرویس خارج از مجموعه وارد شده‌اید، به همین دلیل تنظیمات ایمیل و رمز برای شما در دسترس نیست.
     signed_in_as: 'واردشده به نام:'
   verification:
-    explanation_html: 'شما می‌توانید <strong>خود را به عنوان مالک صفحه‌ای که در نمایه‌تان به آن پیوند داده‌اید تأیید کنید.</strong> برای این کار، صفحه‌ای که به آن پیوند داده‌اید، خودش باید پیوندی به نمایهٔ ماستودون شما داشته باشد. پیوند در آن صفحه <strong>باید</strong> عبارت <code>rel="me"‎</code> را به عنوان مشخّصهٔ (attribute) در خود داشته باشد. محتوای متن پیوند اهمتی ندارد. یک نمونه از چنین پیوندی:'
     verification: تأیید
   webauthn_credentials:
     add: افزودن کلید امنیتی
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index a9554d096..4a1a175d6 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -134,7 +134,7 @@ fi:
       search: Hae
       search_same_email_domain: Muut käyttäjät, joilla on sama sähköpostin verkkotunnus
       search_same_ip: Muut käyttäjät, joilla on sama IP-osoite
-      security: Suojaus
+      security: Turvallisuus
       security_measures:
         only_password: Vain salasana
         password_and_2fa: Salasana ja kaksivaiheinen tunnistautuminen
@@ -316,9 +316,9 @@ fi:
       copy: Kopioi
       copy_failed_msg: Emojista ei voitu tehdä paikallista kopiota
       create_new_category: Luo uusi kategoria
-      created_msg: Emojin luonti onnistui!
+      created_msg: Emojin luotu!
       delete: Poista
-      destroyed_msg: Emojon poisto onnistui!
+      destroyed_msg: Emojo poistettu!
       disable: Poista käytöstä
       disabled: Ei käytössä
       disabled_msg: Emojin poisto käytöstä onnistui
@@ -333,7 +333,7 @@ fi:
         title: Lisää uusi mukautettu emoji
       no_emoji_selected: Emojeita ei muutettu, koska yhtään ei valittu
       not_permitted: Sinulla ei ole oikeutta suorittaa tätä toimintoa
-      overwrite: Kirjoita yli
+      overwrite: Korvaa
       shortcode: Lyhennekoodi
       shortcode_hint: Vähintään kaksi merkkiä, vain kirjaimia, numeroita ja alaviivoja
       title: Mukautetut emojit
@@ -812,6 +812,12 @@ fi:
         message_html: Et ole määrittänyt mitään palvelimen sääntöä.
       sidekiq_process_check:
         message_html: Ei ole Sidekiq-prosessia käynnissä jonossa %{value}. Tarkista Sidekiq-asetukset
+      upload_check_privacy_error:
+        action: Katso täältä lisätietoja
+        message_html: "<strong>Verkkopalvelimesi on määritetty virheellisesti, ja käyttäjiesi yksityisyys on vaarassa.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Katso täältä lisätietoja
+        message_html: "<strong>Objektivarastosi on määritetty virheellisesti, ja käyttäjiesi yksityisyys on vaarassa.</strong>"
     tags:
       review: Tarkista tila
       updated_msg: Aihetunnisteen asetukset päivitetty onnistuneesti
@@ -966,7 +972,7 @@ fi:
   applications:
     created: Sovelluksen luonti onnistui
     destroyed: Sovelluksen poisto onnistui
-    logout: Uloskirjautuminen
+    logout: Kirjaudu ulos
     regenerate_token: Luo pääsytunnus uudelleen
     token_regenerated: Pääsytunnuksen uudelleenluonti onnistui
     warning: Säilytä tietoa hyvin. Älä milloinkaan jaa sitä muille!
@@ -1152,7 +1158,7 @@ fi:
   featured_tags:
     add_new: Lisää uusi
     errors:
-      limit: Olet jo lisännyt enimmäismäärän aihetunnisteita
+      limit: Olet jo nostanut esille enimmäismäärän aihetunnisteita
     hint_html: "<strong>Mitä ovat näkyvillä olevat hashtagit eli aihetunnisteet?</strong> Ne ovat näkyvissä julkisessa profiilissasi ja niiden avulla ihmiset voivat selata julkisia viestejäsi nimenomaan näiden aihetunnisteiden alla. Ne auttavat esimerkiksi luovan työn tai pitkäaikaisten projektien seurannassa."
   filters:
     contexts:
@@ -1260,7 +1266,7 @@ fi:
     title: Kutsu ihmisiä
   lists:
     errors:
-      limit: Olet saavuttanut listojen enimmäismäärän
+      limit: Sinulla on enimmäismäärä listoja
   login_activities:
     authentication_methods:
       otp: kaksivaiheinen todennussovellus
@@ -1584,7 +1590,7 @@ fi:
       '7889238': 3 kuukautta
     min_age_label: Ikäraja
     min_favs: Pidä viestit suosikeissa vähintään
-    min_favs_hint: Ei poista julkaisujasi, joita on tykätty vähintään näin monta kertaa. Jätä tyhjäksi poistaaksesi julkaisut tykkäyskertojen määrästä riippumatta
+    min_favs_hint: Toiminto ei poista julkaisujasi, joista on tykätty vähintään tässä kohtaa määritellyn monesti. Jätä kenttä tyhjäksi, jos haluat poistaa julkaisut tykkäyksistä huolimatta
     min_reblogs: Pidä viestit tehostettuna vähintään
     min_reblogs_hint: Ei poista yhtään viestiäsi, jota on tehostettu vähintään näin monta kertaa. Jätä tyhjäksi poistaaksesi viestejä riippumatta niiden tehosteiden määrästä
   stream_entries:
@@ -1604,7 +1610,7 @@ fi:
     formats:
       default: "%d.%m.%Y klo %H.%M"
       month: "%b %Y"
-      time: "%H:%M"
+      time: "%H.%M"
   two_factor_authentication:
     add: Lisää
     disable: Poista käytöstä
@@ -1684,12 +1690,13 @@ fi:
       title: Tervetuloa mukaan, %{name}!
   users:
     follow_limit_reached: Et voi seurata yli %{limit} henkilöä
+    go_to_sso_account_settings: Avaa identiteettitarjoajasi tiliasetukset
     invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi
     otp_lost_help_html: Jos sinulla ei ole pääsyä kumpaankaan, voit ottaa yhteyttä osoitteeseen %{email}
     seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä.
     signed_in_as: 'Kirjautunut tilillä:'
   verification:
-    explanation_html: 'Voit <strong>vahvistaa olevasi profiilisi metatiedoissa olevien linkkien omistaja.</strong>. Tätä varten linkitetyn verkkosivuston täytyy sisältää linkki takaisin Mastodon-profiiliisi. Palauttavalla linkillä <strong>täytyy</strong> olla <code>rel="me"</code>-arvo. Linkin tekstisisällöllä ei ole merkitystä. Tässä on esimerkki:'
+    explanation_html: 'Voit <strong>vahvistaa olevasi profiilisi metatietojen sisältämien linkkien omistaja</strong>. Tätä varten linkitetyn verkkosivuston täytyy sisältää paluulinkki Mastodon-profiiliisi. Paluulinkillä <strong>täytyy</strong> olla <code>rel="me"</code>-attribuutti, mutta sen tekstisisältö voi olla mitä tahansa. Tässä esimerkki:'
     verification: Vahvistus
   webauthn_credentials:
     add: Lisää uusi suojausavain
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 3199690c9..f969ac69e 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -812,6 +812,12 @@ fo:
         message_html: Tú hevur ikki ásett nakrar ambætarareglur.
       sidekiq_process_check:
         message_html: Eingin Sidekiq gongd koyrir fyri %{value} bíðirøðina(r). Vinarliga eftirkanna Sidekiq uppsetingina
+      upload_check_privacy_error:
+        action: Kekka her fyri at fáa fleiri upplýsingar
+        message_html: "<strong>Vevambætarin hjá tær er skeivt uppsettur. Privatlívið hjá brúkarunum hjá tær er í vanda.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Kekka her fyri at fáa fleiri upplýsingar
+        message_html: "<strong>Objekt-goymslan hjá tær er skeivt uppsett. Privatlívið hjá brúkarunum hjá tær er í vanda.</strong>"
     tags:
       review: Eftirkanna støðu
       updated_msg: Frámerkjastillingar dagførdar
@@ -1495,7 +1501,7 @@ fo:
     import_and_export: Innflyt og útflyt
     migrate: Flyting av kontu
     notifications: Fráboðanir
-    preferences: Sertokki
+    preferences: Stillingar
     profile: Vangi
     relationships: Fylging og fylgjarar
     statuses_cleanup: Sjálvvirkandi striking av postum
@@ -1684,12 +1690,13 @@ fo:
       title: Vælkomin umborð, %{name}!
   users:
     follow_limit_reached: Tú kanst ikki fylgja fleiri enn %{limit} fólk
+    go_to_sso_account_settings: Far til kontustillingarnar hjá samleikaveitaranum hjá tær
     invalid_otp_token: Ógyldug tvey-stigs koda
     otp_lost_help_html: Hevur tú mist atgongd til bæði, so kanst tú koma í samband við %{email}
     seamless_external_login: Tú er ritað/ur inn umvegis eina uttanhýsis tænastu, so loyniorð og teldupoststillingar eru ikki tøkar.
     signed_in_as: 'Ritað/ur inn sum:'
   verification:
-    explanation_html: 'Tú kanst <strong>vátta teg sjálva/n sum eigara av leinkjunum í metadátunum á vanganum hjá tær</strong>. Til tess má leinkjaða vevstaðið innihalda eitt leinki aftur til Mastodon vangan hjá tær. Leinkið <strong>má</strong> hava eina <code>rel="me"</code> viðseting. Tekstinnihaldið í leikinum er óviðkomandi. Her er eitt dømi:'
+    explanation_html: 'Tú kanst <strong>vátta teg sjálva/n sum eigara av leinkjunum í metadátunum á vanganum hjá tær</strong>. Til tess má leinkjaða vevstaðið innihalda eitt leinki aftur til Mastodon vangan hjá tær. Eftir at tú hevur lagt leinkið afturat, so er møguliga neyðugt at koma aftur her og goyma vangan hjá tær av nýggjum fyri at fáa góðkenningina at rigga. Leinkið <strong>má</strong> hava eina <code>rel="me"</code> viðseting. Tekstinnihaldið í leikinum er óviðkomandi. Her er eitt dømi:'
     verification: Váttan
   webauthn_credentials:
     add: Legg nýggjan trygdarlykil afturat
diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml
index 400ed4b11..41c011c18 100644
--- a/config/locales/fr-QC.yml
+++ b/config/locales/fr-QC.yml
@@ -1689,7 +1689,6 @@ fr-QC:
     seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles.
     signed_in_as: 'Connecté·e en tant que :'
   verification:
-    explanation_html: 'Vous pouvez <strong>vous vérifier en tant que propriétaire des liens dans les métadonnées de votre profil</strong>. Pour cela, le site web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour <strong>doit</strong> avoir un attribut <code>rel="me"</code> . Le texte du lien n’a pas d’importance. Voici un exemple :'
     verification: Vérification
   webauthn_credentials:
     add: Ajouter une nouvelle clé de sécurité
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 048cbd527..667cd9b97 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -812,6 +812,12 @@ fr:
         message_html: Vous n'avez pas défini de règles pour le serveur.
       sidekiq_process_check:
         message_html: Aucun processus Sidekiq en cours d'exécution pour la/les file(s) d'attente %{value}. Veuillez vérifier votre configuration de Sidekiq
+      upload_check_privacy_error:
+        action: Pour plus d'informations, cliquez ici
+        message_html: "<strong>Votre serveur web est mal configuré. La confidentialité de vos utilisateurs est en péril.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Pour plus d'informations, cliquez ici
+        message_html: "<strong>Votre serveur web est mal configuré. La confidentialité de vos utilisateurs est en péril.</strong>"
     tags:
       review: État du traitement
       updated_msg: Paramètres du hashtag mis à jour avec succès
@@ -1684,6 +1690,7 @@ fr:
       title: Bienvenue à bord, %{name} !
   users:
     follow_limit_reached: Vous ne pouvez pas suivre plus de %{limit} personnes
+    go_to_sso_account_settings: Accédez aux paramètres du compte de votre fournisseur d'identité
     invalid_otp_token: Le code d’authentification à deux facteurs est invalide
     otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email}
     seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles.
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 15f4bd88b..669da37aa 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -812,6 +812,12 @@ fy:
         message_html: Jo hawwe foar dizze server gjin regels opsteld.
       sidekiq_process_check:
         message_html: Der draait gjin Sidekiq-proses foar de wachtrige(n) %{value}. Kontrolearje jo Sidekiq-konfiguraasje
+      upload_check_privacy_error:
+        action: Klik hjir foar mear ynformaasje
+        message_html: "<strong>Jo webserver is ferkeard konfigurearre. De privacy fan jo brûkers is yn gefaar.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Klik hjir foar mear ynformaasje
+        message_html: "<strong>Jo objektûnthâld is ferkeard konfigurearre. De privacy fan jo brûkers is yn gefaar.</strong>"
     tags:
       review: Steat beoardiele
       updated_msg: Hashtagynstellingen mei sukses bywurke
@@ -1684,12 +1690,13 @@ fy:
       title: Wolkom oan board %{name}!
   users:
     follow_limit_reached: Jo kinne net mear as %{limit} accounts folgje
+    go_to_sso_account_settings: Gean nei de accountynstellingen fan jo identiteitsprovider
     invalid_otp_token: Unjildige twa-stapstagongskoade
     otp_lost_help_html: As jo tagong ta beide kwytrekke binne, nim dan kontakt op fia %{email}
     seamless_external_login: Jo binne oanmeld fia in eksterne tsjinst, dêrom binne wachtwurden en e-mailynstellingen net beskikber.
     signed_in_as: 'Oanmeld as:'
   verification:
-    explanation_html: 'Jo kinne <strong>josels ferifiearje as de eigener fan de keppelingen yn de metadata fan jo profyl</strong>. Hjirfoar moat op de keppele website in keppeling werom nei jo Mastodon-profyl stean. Dizze keppeling <strong>moat</strong> it <code>rel="me"</code>-attribút befetsje. De omskriuwing fan de keppeling makket net út. Hjir is in foarbyld:'
+    explanation_html: 'Jo kinne <strong>josels ferifiearje as de eigener fan de keppelingen yn de metadata fan jo profyl</strong>. Hjirfoar moat op de keppele website in keppeling werom nei jo Mastodon-profyl stean. Nei it tafoegjen fan de keppeling moatte jo miskien hjir werom komme en jo profyl opnij bewarje om de ferifikaasje te befêstigjen. Dizze keppeling <strong>moat</strong> it <code>rel="me"</code>-attribút befetsje. De omskriuwing fan de keppeling makket net út. Hjir is in foarbyld:'
     verification: Ferifikaasje
   webauthn_credentials:
     add: Nije befeiligingskaai tafoegje
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index fb3b8f8ee..a481bbb25 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -653,7 +653,7 @@ gd:
         actions:
           delete_html: Thoir air falbh na postaichean oilbheumach
           mark_as_sensitive_html: Cuir comharra gu bheil meadhanan nam postaichean oilbheumach frionasach
-          silence_html: Thèid cò ruigeas <strong>@%{acct}</strong> a chuingeachadh gu mòr air sgàth ’s nach fhaic ach an fheadhainn a bheil ’ga leantainn mu thràth no a tha a’ lorg na pròifil aca a làimh a’ phròifil is an t-susbaint aca.
+          silence_html: Thèid cò ruigeas <strong>@%{acct}</strong> a chuingeachadh gu mòr air sgàth ’s nach fhaic ach an fheadhainn a bheil ’ga leantainn mu thràth no a tha a’ lorg na pròifil aca a làimh a’ phròifil is an t-susbaint aca
           suspend_html: Thèid <strong>@%{acct}</strong> a chur à rèim agus cha ghabh a’ phròifil is an t-susbaint aca a ruigsinn no eadar-ghabhail
         close_report: 'Cuir comharra gun deach gearan #%{id} fhuasgladh'
         close_reports_html: Cuir comharra gun deach <strong>gach</strong> gearan an aghaidh <strong>@%{acct}</strong> fhuasgladh
@@ -661,7 +661,7 @@ gd:
         preview_preamble_html: 'Gheibh <strong>@%{acct}</strong> rabhadh leis an t-susbaint seo:'
         record_strike_html: Clàraich rabhadh an aghaidh <strong>@%{acct}</strong> airson do chuideachadh ach am bi thu nas teinne le droch-ghiùlan on chunntas seo san àm ri teachd
         send_email_html: Cuir post-d rabhaidh gu <strong>@%{acct}</strong>
-        warning_placeholder: Adhbharan roghainneil eile air gnìomh na maorsainneachd
+        warning_placeholder: Adhbharan roghainneil eile air gnìomh na maorsainneachd.
       target_origin: Tùs cunntas a’ ghearain
       title: Gearanan
       unassign: Dì-iomruin
@@ -1731,7 +1731,6 @@ gd:
     seamless_external_login: Rinn thu clàradh a-steach le seirbheis on taobh a-muigh, mar sin chan eil roghainnean an fhacail-fhaire ’s a’ phuist-d ri làimh dhut.
     signed_in_as: 'Chlàraich thu a-steach mar:'
   verification:
-    explanation_html: '’S urrainn dhut <strong>dearbhadh gur e seilbheadair nan ceanglaichean ann am meata-dàta na pròifil agad a th’ annad</strong>. Airson sin a dhèanamh, feumaidh ceangal air ais dhan phròifil Mastodon a bhith aig an làrach-lìn cheangailte. <strong>Feumaidh</strong> buadh <code>rel="me"</code> a bhith aig a’ cheangal air ais. Chan eil e gu diofar dè an t-susbaint a tha ann an teacsa a’ cheangail. Seo ball-eisimpleir dhut:'
     verification: Dearbhadh
   webauthn_credentials:
     add: Cuir iuchair tèarainteachd ùr ris
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 0eccaa951..aa451a699 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -444,7 +444,7 @@ gl:
         private_comment_description_html: 'Para axudarche a lembrar de onde veñen os bloqueos importados, imos crealos engadindo o seguinte comentario privado: <q>%{comment}</q>'
         private_comment_template: Importada desde %{source} o %{date}
         title: Importar bloqueos de dominio
-      invalid_domain_block: 'Un ou varios dominios non se bloquearon debido ao seguintes erros: %{error}'
+      invalid_domain_block: 'Un ou varios dominios non se bloquearon debido ao seguinte erro(s): %{error}'
       new:
         title: Importar bloqueos de dominio
       no_file: Ningún ficheiro seleccionado
@@ -476,7 +476,7 @@ gl:
       content_policies:
         comment: Nota interna
         description_html: Podes definir políticas acerca do contido que serán aplicadas a tódalas contas deste dominio e tódolos seus subdominios.
-        limited_federation_mode_description_html: Podes elexir se permites a federación con este dominio.
+        limited_federation_mode_description_html: Podes elexir se permites ou non a federación con este dominio.
         policies:
           reject_media: Rexeitar multimedia
           reject_reports: Rexeitar denuncias
@@ -812,6 +812,12 @@ gl:
         message_html: Non tes definidas regras para o servidor.
       sidekiq_process_check:
         message_html: Non hai procesos Sidekiq a funcionar para a cola(s) %{value}. Revisa a túa configuración para Sidekiq
+      upload_check_privacy_error:
+        action: Mira aquí para máis información
+        message_html: "<strong>O teu servidor non está ben configurado. A privacidade das usuarias está en risco.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Mira aquí para máis información
+        message_html: "<strong>A almacenaxe de obxectos está mal configurada. A privacidade das usuarias está en risco.</strong>"
     tags:
       review: Estado de revisión
       updated_msg: Actualizaronse os axustes dos cancelos
@@ -1684,12 +1690,13 @@ gl:
       title: Benvida, %{name}!
   users:
     follow_limit_reached: Non pode seguir a máis de %{limit} persoas
+    go_to_sso_account_settings: Ir aos axustes da conta no teu provedor de identidade
     invalid_otp_token: O código do segundo factor non é válido
     otp_lost_help_html: Se perdes o acceso a ambos, podes contactar con %{email}
     seamless_external_login: Accedeches a través dun servizo externo, polo que os axustes de contrasinal e email non están dispoñibles.
     signed_in_as: 'Rexistrada como:'
   verification:
-    explanation_html: 'Podes <strong>validarte a ti mesma como a dona das ligazóns nos metadatos do teu perfil</strong>. Para esto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Esta ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non importa. Aquí tes un exemplo:'
+    explanation_html: 'Podes <strong>validarte a ti mesma como a dona das ligazóns nos metadatos do perfil</strong>. Para isto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Despois de engadir a ligazón tes que volver aquí e volver a gardar o teu perfil para que a verificación tome efecto. A ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non ten importancia. Aquí tes un exemplo:'
     verification: Validación
   webauthn_credentials:
     add: Engadir nova chave de seguridade
diff --git a/config/locales/he.yml b/config/locales/he.yml
index aff0e7c6a..ab53dc581 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -840,6 +840,12 @@ he:
         message_html: לא הוגדרו שום כללי שרת.
       sidekiq_process_check:
         message_html: שום הליכי Sidekiq לא רצים עבור %{value} תור(ות). בחנו בבקשה את הגדרות Sidekiq
+      upload_check_privacy_error:
+        action: למידע נוסף
+        message_html: "<strong>שרת הווב שלך אינו מכוון כראוי. פרטיות המשתמשות והמשתמשים שלך בסכנה.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: למידע נוסף
+        message_html: "<strong>שרות אחסון הענן שלך אינו מוגדר כראוי. פרטיות המשתמשות והמשתמשים שלך בסכנה.</strong>"
     tags:
       review: סקירת מצב
       updated_msg: הגדרות תגיות עודכנו בהצלחה
@@ -1748,12 +1754,13 @@ he:
       title: ברוך/ה הבא/ה, %{name} !
   users:
     follow_limit_reached: לא תוכל לעקוב אחר יותר מ %{limit} אנשים
+    go_to_sso_account_settings: מעבר לאפיוני החשבון שלך בשרת הזהות
     invalid_otp_token: קוד דו-שלבי שגוי
     otp_lost_help_html: אם איבדת גישה לשניהם, ניתן ליצור קשר ב-%{email}
     seamless_external_login: את.ה מחובר דרך שירות חיצוני, לכן אפשרויות הסיסמא והדוא"ל לא מאופשרות.
     signed_in_as: 'מחובר בתור:'
   verification:
-    explanation_html: 'ניתן <strong>לאמת את עצמך כבעלים של הקישורית במטא-נתונים של פרופילך</strong>. כדי לעשות זאת, האתר המקושר חייב להכיל קישורית חוזרת לפרופיל המסטודון שלך. הקישורית החוזרת <strong>חייבת</strong> להכיל תכונת <code>rel="me"</code>. התוכן הטקסטואלי של הקישורית לא משנה. הנה דוגמא:'
+    explanation_html: 'תוכל/י <strong>לאמת את עצמך כבעל/ת הקישורים שבפרופיל שלך</strong>. לשם כך, על האתר המקושר להכיל קישור חוזר לפרופיל המסטודון שלך. אחרי הוספת הקישור ניתן לשוב לפה ולשמור מחדש את הפרופיל כדי להפעיל את אימות הקישור. הקישור החוזר <strong>חייב</strong> להכיל בקוד ה-HTML שלו את התכונה <code>rel="me"</code>. התוכן הטקסטואלי של הקישור לא משנה. הנה דוגמא:'
     verification: אימות
   webauthn_credentials:
     add: הוספת מפתח אבטחה חדש
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 228bd1659..809e425d8 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -1,5 +1,12 @@
 ---
 hi:
+  admin:
+    system_checks:
+      upload_check_privacy_error:
+        message_html: "<strong> आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। </strong>"
+      upload_check_privacy_error_object_storage:
+        action: अधिक जानकारी हेतु यहां क्लिक करें।
+        message_html: "<strong> आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। </strong>"
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
@@ -17,3 +24,5 @@ hi:
     platforms:
       kai_os: काइ ओएस
       unknown_platform: अनजान प्लेटफॉर्म
+  verification:
+    explanation_html: 'आप अपने <strong> प्रोफाइल में इस्तेमाल किए गए लिंक वेरिफाई कर सकते हैं</strong>। इसके लिए आपके वेबसाइट पर आपके मॅस्टोडॉन प्रोफाइल का लिंक होना चाहिए। वेरिफिकेशन पूरा करने के लिए लिंक जोड़ने के बाद यहाँ वापस आकर अपना प्रोफाइल पुनः सेव करें। लिंक बैक में <code>rel="me"</code> अट्रीब्यूट <strong>ज़रूर</strong> होना चाहिए। लिंक पर लिखे टेक्स्ट से कोई मतलब नहीं। ये रहा उदाहरण:'
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 6c9d869e1..0ab763ce4 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -812,6 +812,12 @@ hu:
         message_html: Még nem definiáltál egy szerver szabályt sem.
       sidekiq_process_check:
         message_html: Nincs Sidekiq folyamat, mely a %{value} sorhoz van rendelve. Kérlek, nézd át a Sidekiq beállításait
+      upload_check_privacy_error:
+        action: Itt találsz több információt
+        message_html: "<strong>A webkiszolgálód félre van konfigurálva. Kockázat merül fel a felhasználóid adatainak biztonságával kapcsolatban.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Itt találsz több információt
+        message_html: "<strong>Az objektumtárolód félre van konfigurálva. Kockázat merül fel a felhasználóid adatainak biztonságával kapcsolatban.</strong>"
     tags:
       review: Engedélyezés állapota
       updated_msg: A hashtag beállításokat sikeresen frissítettük
@@ -1684,12 +1690,13 @@ hu:
       title: Üdv a fedélzeten, %{name}!
   users:
     follow_limit_reached: Nem követhetsz több, mint %{limit} embert
+    go_to_sso_account_settings: Ugrás az azonosítási szolgáltatód fiókbeállításaihoz
     invalid_otp_token: Érvénytelen ellenőrző kód
     otp_lost_help_html: Ha mindkettőt elvesztetted, kérhetsz segítséget itt %{email}
     seamless_external_login: Külső szolgáltatáson keresztül jelentkeztél be, így a jelszó és e-mail beállítások nem elérhetőek.
     signed_in_as: Bejelentkezve mint
   verification:
-    explanation_html: 'A profilodon <strong>hitelesítheted magad, mint az itt található linkek tulajdonosa</strong>. Ehhez a linkelt weboldalnak tartalmaznia kell egy linket vissza a Mastodon profilodra. Ennek <strong>tartalmaznia kell</strong> a <code>rel="me"</code> attribútumot. A link szövege bármi lehet. Itt egy példa:'
+    explanation_html: 'A profilodon <strong>hitelesítheted magad, mint az itt található hivatkozások tulajdonosa</strong>. Ehhez a hivatkozott weboldalnak tartalmaznia kell egy visszahivatkozást a Mastodon-profilodra. A hivatkozás hozzáadása után lehet, hogy vissza kell ide térned, és újra mentened kell a profilodat, hogy az ellenőrzés életbe lépjen. A visszahivatkozásnak <strong>tartalmaznia kell</strong> a <code>rel="me"</code> attribútumot. A hivatkozás szövege bármi lehet. Itt egy példa:'
     verification: Hitelesítés
   webauthn_credentials:
     add: Biztonsági kulcs hozzáadása
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 7a1b33c70..a3658eae9 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -881,7 +881,6 @@ hy:
     invalid_otp_token: Անվաւեր 2F կոդ
     signed_in_as: Մոտք գործել որպէս․
   verification:
-    explanation_html: Պիտակների յղումների հեղինակութիւնը կարելի է վաւերացնել։ Անհրաժեշտ է որ յղուած կայքը պարունակի յետադարձ յղում ձեր մաստադոնի էջին, որը <strong>պէտք է</strong> ունենայ <code>rel="me"</code> նիշքը։ Յղման բովանդակութիւնը կարևոր չէ։ Օրինակ՝
     verification: Ստուգում
   webauthn_credentials:
     delete: Ջնջել
diff --git a/config/locales/id.yml b/config/locales/id.yml
index d6672e96d..790296654 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -1603,7 +1603,6 @@ id:
     seamless_external_login: Anda masuk via layanan eksternal, sehingga pengaturan kata sandi dan email tidak tersedia.
     signed_in_as: 'Masuk sebagai:'
   verification:
-    explanation_html: 'Anda dapat <strong>memverifikasi diri Anda sebagai pemiliki tautan pada metadata profil</strong>. Situsweb yang ditautkan haruslah berisi tautan ke profil Mastodon Anda. Tautan tersebut <strong>harus</strong> memiliki atribut <code>rel="me"</code>. Isi teks tautan tidaklah penting. Ini contohnya:'
     verification: Verifikasi
   webauthn_credentials:
     add: Tambahkan kunci keamanan baru
diff --git a/config/locales/io.yml b/config/locales/io.yml
index ab37c13c2..849b80cb9 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -1592,7 +1592,6 @@ io:
     seamless_external_login: Vu enirar tra externa serveso, do pasvorto e retpostoopcioni ne esas disponebla.
     signed_in_as: 'Eniris quale:'
   verification:
-    explanation_html: 'Vu povas <strong>verifikar su kom proprietero di ligili en vua profilmetainformi</strong>. En ta kazo, ligita retsito <strong>mustas</strong> havar <code>rel="me"</code> atributo. Textokontenajo di ligilo ne esas importanta. Co esas exemplo:'
     verification: Verifikeso
   webauthn_credentials:
     add: Insertez nova sekuresklefo
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 75fff8441..4020e7ba3 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -812,6 +812,12 @@ is:
         message_html: Þú hefur ekki skilgreint neinar reglur fyrir netþjón.
       sidekiq_process_check:
         message_html: Ekkert Sidekiq-ferli er í gangi fyrir %{value} biðröð/biðraðir. Endilega athugaðu Sidekiq-uppsetninguna þína
+      upload_check_privacy_error:
+        action: Skoðaðu hér til að fá frekari upplýsingar
+        message_html: "<strong>Vefþjónninn þinn er ekki rétt stilltur. Friðhelgi notendanna þinna gæti verið í hættu.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Skoðaðu hér til að fá frekari upplýsingar
+        message_html: "<strong>Gagnageymslan þín er ekki rétt stillt. Friðhelgi notendanna þinna gæti verið í hættu.</strong>"
     tags:
       review: Yfirfara stöðufærslu
       updated_msg: Það tókst að uppfæra stillingar myllumerkja
@@ -1684,12 +1690,13 @@ is:
       title: Velkomin/n um borð, %{name}!
   users:
     follow_limit_reached: Þú getur ekki fylgst með fleiri en %{limit} aðilum
+    go_to_sso_account_settings: Fara í stillingar aðgangsins hjá auðkennisveitunni þinni
     invalid_otp_token: Ógildur tveggja-þátta kóði
     otp_lost_help_html: Ef þú hefur misst aðganginn að hvoru tveggja, geturðu sett þig í samband við %{email}
     seamless_external_login: Innskráning þín er í gegnum utanaðkomandi þjónustu, þannig að stillingar fyrir lykilorð og tölvupóst eru ekki aðgengilegar.
     signed_in_as: 'Skráð inn sem:'
   verification:
-    explanation_html: 'Þú getur <strong>vottað að þú sért eigandi og ábyrgur fyrir tenglunum í lýsigögnum notandasniðsins þíns</strong>. Til að það virki, þurfa vefsvæðin sem vísað er í að innihalda tengil til baka í Mastodon-notandasniðið. Tengillinn sem vísar til baka <strong>verður</strong> að vera með <code>rel="me"</code> eigindi. Textinn í tenglinum skiptir ekki máli. Hérna er dæmi:'
+    explanation_html: 'Þú getur <strong>sannvottað sjálfa/n þig sem eiganda tenglanna í notandasniðinu þinu</strong>. Til að það virki, þarf tilvísaða vefsvæðið að innihalda tengil til baka á notandasnið þitt á Mastodon. Eftir að tenglinum hefur verið bætt inn, gætirðu þurft að koma aftur hingað og vista aftur notandasniðið þitt áður en sannvottunin fer að virka. Tengillinn til baka <strong>verður</strong> að innihalda <code>rel="me"</code> eigindi. Efni textans í tenglinum skiptir ekki máli. Hér er dæmi:'
     verification: Sannprófun
   webauthn_credentials:
     add: Bæta við nýjum öryggislykli
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 694f4e806..98c1689c9 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -812,6 +812,12 @@ it:
         message_html: Non hai definito alcuna regola del server.
       sidekiq_process_check:
         message_html: Nessun processo di Sidekiq in esecuzione per le code di %{value}. Sei pregato di revisionare la tua configurazione di Sidekiq
+      upload_check_privacy_error:
+        action: Controlla qui per maggiori informazioni
+        message_html: "<strong>Il tuo server web è mal configurato. La privacy dei tuoi utenti è a rischio.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Controlla qui per maggiori informazioni
+        message_html: "<strong>La tua archiviazione oggetti è mal configurata. La privacy dei tuoi utenti è a rischio.</strong>"
     tags:
       review: Esamina status
       updated_msg: Impostazioni hashtag aggiornate con successo
@@ -1686,12 +1692,13 @@ it:
       title: Benvenuto a bordo, %{name}!
   users:
     follow_limit_reached: Non puoi seguire più di %{limit} persone
+    go_to_sso_account_settings: Vai alle impostazioni dell'account del tuo provider di identità
     invalid_otp_token: Codice d'accesso non valido
     otp_lost_help_html: Se perdessi l'accesso ad entrambi, puoi entrare in contatto con %{email}
     seamless_external_login: Hai effettuato l'accesso tramite un servizio esterno, quindi le impostazioni di password e e-mail non sono disponibili.
     signed_in_as: 'Hai effettuato l''accesso come:'
   verification:
-    explanation_html: 'Puoi <strong>certificare te stesso come proprietario dei link nei metadati del tuo profilo</strong>. Per farlo, il sito a cui punta il link deve contenere un link che punta al tuo profilo Mastodon. Il link di ritorno <strong>deve</strong> avere l''attributo <code>rel="me"</code>. Il testo del link non ha importanza. Ecco un esempio:'
+    explanation_html: 'Puoi <strong>verificarti come proprietario dei link nei metadati del tuo profilo</strong>. Per questo, il sito web collegato deve contenere un collegamento al tuo profilo Mastodon. Dopo aver aggiunto il collegamento, potrebbe essere necessario tornare qui e salvare nuovamente il profilo affinché la verifica abbia effetto. Il link di ritorno <strong>deve</strong> avere un attributo <code>rel="me"</code>. Il contenuto del testo del collegamento non ha importanza. Ecco un esempio:'
     verification: Verifica
   webauthn_credentials:
     add: Aggiungi una nuova chiave di sicurezza
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 5d0b27411..c2faed6a2 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -798,6 +798,12 @@ ja:
         message_html: サーバーのルールを定義していません。
       sidekiq_process_check:
         message_html: "%{value}キューに対応するSidekiqプロセスがありません。Sidekiqの設定を確認してください。"
+      upload_check_privacy_error:
+        action: ここを開いて詳細を確認してください
+        message_html: "<strong>Web サーバーが正しく設定されていません。ユーザーのプライバシーが危険な状態になっています。</strong>"
+      upload_check_privacy_error_object_storage:
+        action: ここを開いて詳細を確認してください
+        message_html: "<strong>オブジェクトストレージが正しく設定されていません。ユーザーのプライバシーが危険な状態になっています。</strong>"
     tags:
       review: 審査状況
       updated_msg: ハッシュタグ設定が更新されました
@@ -1654,12 +1660,13 @@ ja:
       title: ようこそ、%{name}さん!
   users:
     follow_limit_reached: あなたは現在 %{limit}人以上フォローできません
+    go_to_sso_account_settings: 外部サービスアカウントの設定はこちらで行ってください
     invalid_otp_token: 二要素認証コードが間違っています
     otp_lost_help_html: どちらも使用できない場合、%{email}に連絡を取ると解決できるかもしれません
     seamless_external_login: あなたは外部サービスを介してログインしているため、パスワードとメールアドレスの設定は利用できません。
     signed_in_as: '下記でログイン中:'
   verification:
-    explanation_html: <strong>プロフィール内のリンクの所有者であることを認証することができます</strong>。そのためにはリンクされたウェブサイトにMastodonプロフィールへのリンクが含まれている必要があります。リンクには<code>rel="me"</code>属性を<strong>必ず</strong>与えなければなりません。リンクのテキストについては重要ではありません。以下は例です:
+    explanation_html: <strong>プロフィール補足情報のリンクの所有者であることを認証できます</strong>。認証するには、リンク先のウェブサイトにMastodonプロフィールへのリンクを追加してください。リンクを追加後、このページで変更の保存を再実行すると認証が反映されます。プロフィールへのリンクには<code>rel="me"</code>属性が<strong>かならず</strong>付与してください。リンク内のテキストは自由に記述できます。以下は一例です:
     verification: 認証
   webauthn_credentials:
     add: セキュリティキーを追加
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index d250a30a8..1812f8983 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -758,5 +758,4 @@ kk:
     seamless_external_login: Сыртқы сервис арқылы кіріпсіз, сондықтан құпиясөз және электрондық пошта параметрлері қол жетімді емес.
     signed_in_as: 'Былай кірдіңіз:'
   verification:
-    explanation_html: 'Өзіңіздің профиль метадеректеріңіздегі сілтемелердің иесі ретінде өзіңізді <strong>тексере аласыз</strong>. Ол үшін байланыстырылған веб-сайтта Mastodon профиліне <strong>сілтеме болуы керек. </strong> Сілтемеде <code>rel = «me»</code> атрибуты болуы керек. Сілтеме мәтінінің мазмұны маңызды емес. Міне мысал:'
     verification: Растау
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 96d73af86..bbfc6f311 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -344,7 +344,7 @@ ko:
       active_users: 활성 사용자
       interactions: 상호 작용
       media_storage: 미디어 저장소
-      new_users: 새로운 사용자
+      new_users: 새 사용자
       opened_reports: 신고 열림
       pending_appeals_html:
         other: "<strong>%{count}</strong>개의 대기 중인 이의 제기"
@@ -800,6 +800,12 @@ ko:
         message_html: 아직 서버규칙을 정하지 않았습니다.
       sidekiq_process_check:
         message_html: "%{value} 큐에 대한 사이드킥 프로세스가 발견되지 않았습니다. 사이드킥 설정을 검토해주세요"
+      upload_check_privacy_error:
+        action: 더 많은 정보를 보려면 여기를 확인하세요.
+        message_html: "<strong>웹 서버가 잘못 구성되었습니다. 사용자의 프라이버시에 위협이 됩니다.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: 더 많은 정보를 보려면 여기를 확인하세요
+        message_html: "<strong>오브젝트 스토리지가 잘못 구성되었습니다. 사용자의 프라이버시에 위협이 됩니다.</strong>"
     tags:
       review: 심사 상태
       updated_msg: 해시태그 설정이 성공적으로 갱신되었습니다
@@ -992,7 +998,7 @@ ko:
       preamble: 다음은 %{domain}의 중재자들에 의해 설정되고 적용되는 규칙들입니다.
       title: 몇 개의 규칙이 있습니다.
     security: 보안
-    set_new_password: 새 암호
+    set_new_password: 새 암호 설정
     setup:
       email_below_hint_html: 아래의 이메일 계정이 올바르지 않을 경우, 여기서 변경하고 새 확인 메일을 받을 수 있습니다.
       email_settings_hint_html: 확인 메일이 %{email}로 보내졌습니다. 이메일 주소가 올바르지 않은 경우, 계정 설정에서 변경하세요.
@@ -1028,7 +1034,7 @@ ko:
     confirm: 계속
     hint_html: "<strong>팁:</strong> 한 시간 동안 다시 암호를 묻지 않을 것입니다."
     invalid_password: 잘못된 암호
-    prompt: 계속하려면 암호 확인
+    prompt: 계속하려면 암호를 확인하세요.
   crypto:
     errors:
       invalid_key: 유효하지 않은 Ed25519 또는 Curve25519 키
@@ -1105,7 +1111,7 @@ ko:
     '403': 이 페이지를 표시할 권한이 없습니다.
     '404': 찾으려는 페이지가 존재하지 않습니다.
     '406': 이 페이지는 요청한 자료형으로 제공되지 않습니다.
-    '410': 보려는 페이지는 더 이상 여기에 존재하지 않습니다.
+    '410': 찾는 페이지가 더 이상 존재하지 않습니다.
     '422':
       content: 보안 인증에 실패했습니다. 쿠키를 차단하고 있진 않습니까?
       title: 보안 인증 실패
@@ -1385,7 +1391,7 @@ ko:
     follow_selected_followers: 선택한 팔로워들을 팔로우
     followers: 팔로워
     following: 팔로잉
-    invited: 초대됨
+    invited: 초대함
     last_active: 마지막 활동
     most_recent: 가장 최근
     moved: 이동함
@@ -1451,8 +1457,8 @@ ko:
       windows: 윈도우
       windows_mobile: 윈도우 모바일
       windows_phone: 윈도우 폰
-    revoke: 삭제
-    revoke_success: 세션이 성공적으로 삭제되었습니다
+    revoke: 취소
+    revoke_success: 세션을 성공적으로 취소하였습니다.
     title: 세션
     view_authentication_history: 내 계정에 대한 인증 이력 보기
   settings:
@@ -1460,7 +1466,7 @@ ko:
     account_settings: 계정 설정
     aliases: 계정 별명
     appearance: 외관
-    authorized_apps: 인증된 애플리케이션
+    authorized_apps: 승인된 애플리케이션
     back: 마스토돈으로 돌아가기
     delete: 계정 삭제
     development: 개발
@@ -1560,7 +1566,7 @@ ko:
   stream_entries:
     pinned: 고정된 게시물
     reblogged: 님이 부스트 했습니다
-    sensitive_content: 민감한 콘텐츠
+    sensitive_content: 민감한 내용
   strikes:
     errors:
       too_late: 이의를 제기하기에 너무 늦었습니다
@@ -1654,12 +1660,13 @@ ko:
       title: 환영합니다 %{name} 님!
   users:
     follow_limit_reached: 당신은 %{limit}명의 사람을 넘어서 팔로우 할 수 없습니다
+    go_to_sso_account_settings: ID 공급자의 계정 설정으로 이동
     invalid_otp_token: 2단계 인증 코드가 올바르지 않습니다
     otp_lost_help_html: 만약 양쪽 모두를 잃어버렸다면 %{email}을 통해 복구할 수 있습니다
     seamless_external_login: 외부 서비스를 이용해 로그인했으므로 이메일과 암호는 설정할 수 없습니다.
     signed_in_as: '다음과 같이 로그인 중:'
   verification:
-    explanation_html: '당신은 <strong>프로필 메타데이터의 링크 소유자임을 검증할 수 있습니다</strong>. 이것을 하기 위해서는, 링크 된 웹사이트에서 당신의 마스토돈 프로필을 역으로 링크해야 합니다. 역링크는 <strong>반드시</strong> <code>rel="me"</code> 속성을 가지고 있어야 합니다. 링크의 텍스트는 상관이 없습니다. 여기 예시가 있습니다:'
+    explanation_html: '<strong>내 프로필 메타데이터에 담긴 링크의 소유 여부를 검증</strong>할 수 있습니다. 이를 위해서 반드시 링크한 웹사이트에 Mastodon 프로필에 대한 역링크가 포함되어야 합니다. 링크를 추가한 후 이곳으로 돌아와서 프로필을 다시 저장해야 인증을 적용할 수 있습니다. 돌아오는 링크에는 <strong>반드시</strong> <code>rel="me"</code> 속성이 있어야 합니다. 링크의 텍스트 콘텐트는 중요하지 않습니다. 다음 예제를 참고하세요:'
     verification: 검증
   webauthn_credentials:
     add: 보안 키 추가
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 534eacdd6..a1fce2c36 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -1637,7 +1637,6 @@ ku:
     seamless_external_login: Te bi rajekarke biyanî re têketina xwe kir, ji ber vê yekê borînpeyv û e-name nayê bikaranîn.
     signed_in_as: 'Têketin wekî:'
   verification:
-    explanation_html: 'Tu dikarî <strong>xwe wekî xwediyê girêdanên li daneyê meta profîla xwe piştrast bikî</strong>. Ji bo vê, hewceye girêda malperê di nav profîla te ya mastodonê de girêdanekî paş hebe. Girêdana paş<strong>hewceye</strong> taybetîyek <code>rel="me"</code>hebe. Naveroka nivîsa girêdanê ne girîng e. Ev jî mînakek e:'
     verification: Piştrastkirin
   webauthn_credentials:
     add: Kilîteke ewlehiyê nû tevlî bike
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 5139c7c48..06eeff6ab 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -517,5 +517,4 @@ lt:
     seamless_external_login: Jūs esate prisijungę per išorini įrenginį, todėl slaptąžodis ir el pašto nustatymai neprieinami.
     signed_in_as: 'Prisijungta kaip:'
   verification:
-    explanation_html: 'Jūs galite <strong>patvirtinti savę kaip savininką nuorodų savo profilio meta duomenyse</strong>. Kad tai padarytumėte, susieta svetainė privalo turėti nuorodą atgal į Jūsų Mastodon profilį. Nuoroda atgal <strong> privalo </strong> turėti <code>rel="me"</code> savybę. Teksto turinys nuorodoje nesvarbus. Štai pavyzdys:'
     verification: Patvirtinimas
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index fbe0ccc72..e7b8372ca 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -826,6 +826,12 @@ lv:
         message_html: Tu neesi definējis nevienu servera nosacījumu.
       sidekiq_process_check:
         message_html: Rindā(s) %{value} nedarbojas neviens Sidekiq process. Lūdzu, pārskati savu Sidekiq konfigurāciju
+      upload_check_privacy_error:
+        action: Pārbaudi šeit, lai iegūtu plašāku informāciju
+        message_html: "<strong>Tavs tīmekļa serveris ir nepareizi konfigurēts. Tavu lietotāju privātums ir apdraudēts.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Pārbaudi šeit, lai iegūtu plašāku informāciju
+        message_html: "<strong>Tava objektu krātuve ir nepareizi konfigurēta. Tavu lietotāju privātums ir apdraudēts.</strong>"
     tags:
       review: Pārskatīt statusu
       updated_msg: Tēmtura iestatījumi ir veiksmīgi atjaunināti
@@ -1716,12 +1722,13 @@ lv:
       title: Laipni lūgts uz borta, %{name}!
   users:
     follow_limit_reached: Tu nevari sekot vairāk par %{limit} cilvēkiem
+    go_to_sso_account_settings: Dodies uz sava identitātes nodrošinātāja konta iestatījumiem
     invalid_otp_token: Nederīgs divfaktora kods
     otp_lost_help_html: Ja esi zaudējis piekļuvi abiem, tu vari sazināties ar %{email}
     seamless_external_login: Tu esi pieteicies, izmantojot ārēju pakalpojumu, tāpēc paroles un e-pasta iestatījumi nav pieejami.
     signed_in_as: 'Pierakstījies kā:'
   verification:
-    explanation_html: 'Tu vari <strong>apstiprināt sevi kā sava profila metadatos esošo saišu īpašnieku</strong>. Lai to izdarītu, saistītajā vietnē ir jābūt saitei uz tavu Mastodon profilu. Atpakaļsaitē <strong>jābūt</strong> atribūtam <code>rel="me"</code>. Saites teksta saturam nav nozīmes. Šeit ir piemērs:'
+    explanation_html: 'Tu vari <strong>apstiprināt sevi kā sava profila metadatos esošo saišu īpašnieku</strong>. Lai to izdarītu, saistītajā vietnē ir jābūt saitei uz tavu Mastodon profilu. Pēc saites pievienošanas tev, iespējams, vajadzēs atgriezties šeit un atkārtoti saglabāt savu profilu, lai pārbaude stātos spēkā. Atpakaļsaitē <strong>jābūt</strong> atribūtam <code>rel="me"</code>. Saites teksta saturam nav nozīmes. Šeit ir piemērs:'
     verification: Pārbaude
   webauthn_credentials:
     add: Pievienot jaunu drošības atslēgu
diff --git a/config/locales/my.yml b/config/locales/my.yml
index ae3b941e0..5096aa0d7 100644
--- a/config/locales/my.yml
+++ b/config/locales/my.yml
@@ -2,6 +2,7 @@
 my:
   about:
     about_mastodon_html: အနာဂတ်အတွက်လူမှုကွန်ရက် - ကြော်ငြာများမရှိခြင်း၊ အဖွဲ့သားများအား စောင့်ကြည့်မှုမရှိခြင်း၊ ကျင့်ဝတ်ပိုင်းဆိုင်ရာစိတ်ချရခြင်းနှင့် ဗဟိုချုပ်ကိုင်မှုမရှိခြင်း၊ သင့်အချက်အလက်များကို Mastodon နှင့်သာ မျှဝေအသုံးပြုလိုက်ပါ။
+    contact_missing: မသတ်မှတ်ထား
     contact_unavailable: မရှိ
     hosted_on: "%{domain} မှ လက်ခံဆောင်ရွက်ထားသော Mastodon"
     title: အကြောင်း
@@ -11,6 +12,7 @@ my:
       other: စောင့်ကြည့်သူ
     following: စောင့်ကြည့်နေသည်
     last_active: နောက်ဆုံးအသုံးပြုခဲ့သည့်အချိန်
+    link_verified_on: ဤလင့်ခ်၏ ပိုင်ဆိုင်မှုကို %{date} တွင် စစ်ဆေးခဲ့သည်
     nothing_here: ဤနေရာတွင် မည်သည့်အရာမျှမရှိပါ။
     pin_errors:
       following: သင်ထောက်ခံလိုသောလူနောက်သို့ စောင့်ကြည့်ပြီးသားဖြစ်နေပါမည်
@@ -19,6 +21,7 @@ my:
     posts_tab_heading: ပို့စ်များ
   admin:
     account_actions:
+      action: ဆောင်ရွက်ရန်
       title: "%{acct} စိစစ်မှုလုပ်ဆောင်ရန်"
     account_moderation_notes:
       create: မှတ်စုမှထွက်ရန်
@@ -49,16 +52,21 @@ my:
       custom: စိတ်ကြိုက်
       delete: အချက်အလက်များဖျက်ပါ
       deleted: ဖျက်ပြီးပါပြီ
+      demote: အဆင့်လျော့မည်
+      destroyed_msg: "%{username} ၏ အချက်အလက်ကို မကြာမီ ဖျက်ပါမည်"
       disable: ရပ်တန့်
       disable_sign_in_token_auth: အီးမေးတိုကင် အထောက်အထားပြခြင်းကို ပိတ်ပါ
       disable_two_factor_authentication: 2FA ကို ပိတ်ပါ
+      disabled: အကောင့်ပိတ်သိမ်းထားသည်
       display_name: ဖော်ပြမည့်အမည်
       domain: ဒိုမိန်း
       edit: ပြင်ဆင်ရန်
       email: အီးမေးလ်
       email_status: အီးမေးလ်အခြေအနေ
+      enable: မပိတ်သိမ်းထားသော
       enable_sign_in_token_auth: အီးမေးတိုကင် စစ်မှန်ကြောင်းအတည်ပြုချက်ကို ဖွင့်ပါ
       enabled: ဖွင့်ထားသည်
+      enabled_msg: "%{username} ၏ အကောင့်ကို ပိတ်သိမ်းထားသည်"
       followers: စောင့်ကြည့်သူများ
       follows: စောင့်ကြည့်မယ်
       header: မျက်နှာဖုံးပုံ
@@ -75,6 +83,7 @@ my:
       login_status: အကောင့်ဝင်ရောက်မှုအခြေအနေ
       media_attachments: မီဒီယာ ပူးတွဲချက်များ
       memorialize: အမှတ်တရအဖြစ် ပြောင်းပါ
+      memorialized: အမှတ်တရ
       memorialized_msg: "%{username} ကို အမှတ်တရအကောင့်အဖြစ် ပြောင်းလဲခဲ့သည်"
       moderation:
         active: လက်ရှိအသုံးပြုလျက်ရှိခြင်း
@@ -88,17 +97,24 @@ my:
       most_recent_activity: နောက်ဆုံးအသုံးပြုခဲ့သည့်အချိန်
       most_recent_ip: အသုံးပြုလေ့ရှိသည့် IP လိပ်စာ
       no_account_selected: မည်သည့်အကောင့်ကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
+      no_limits_imposed: ကန့်သတ်ချက် မရှိပါ။
       no_role_assigned: တာဝန်ပေးအပ်ထားခြင်း မရှိပါ
       not_subscribed: စာရင်းသွင်းထားခြင်းမရှိပါ
+      pending: ဆိုင်းငံ့ထားသော သုံးသပ်ချက်
       perform_full_suspension: ရပ်ဆိုင်းရန်
+      previous_strikes: ယခင်လုပ်ဆောင်ချက်များ
+      previous_strikes_description_html:
+        other: ဤအကောင့်တွင် လုပ်ဆောင်ချက်<strong>%{count}</strong> ရှိသည်။
       promote: အထောက်အကူ
       protocol: လုပ်ထုံးလုပ်နည်း
       public: အများမြင်
+      push_subscription_expires: PuSH စာရင်းသွင်းမှုမှာ သက်တမ်းကုန်ဆုံးသွားပါပြီ
       redownload: ပရိုဖိုင်ကို ပြန်လည်စတင်ရန်
       redownloaded_msg: မူလမှစ၍ %{username} ၏ ပရိုဖိုင်ကို ပြန်လည်စတင်ပြီးပါပြီ
       reject: ဖယ်ရှားပါ
       rejected_msg: "%{username} ၏ အကောင့်ဖွင့်အက်ပလီကေးရှင်းကို ဖယ်ရှားလိုက်ပါပြီ"
       remote_suspension_irreversible: ဤအကောင့်၏အချက်အလက်ကို လုံးဝ ဖျက်လိုက်ပါပြီ။
+      remote_suspension_reversible_hint_html: အကောင့်ကို ၎င်းတို့၏ဆာဗာတွင် ဆိုင်းငံ့ထားပြီး အချက်အလက်ကို %{date} နေ့တွင် လုံးဝဖယ်ရှားလိုက်ပါမည်။ ထိုအချိန်အထိ အဝေးမှထိန်းချုပ်နိုင်သောဆာဗာက ဤအကောင့်ကို ပြန်လည်ရယူနိုင်သည်။ အကောင့်အချက်အလက်အားလုံးကို ချက်ချင်းဖယ်ရှားလိုပါက အောက်ပါအတိုင်း ပြုလုပ်နိုင်ပါသည်။
       remove_avatar: ကိုယ်စားပြုရုပ်ပုံကို ဖယ်ရှားပါ
       remove_header: မျက်နှာဖုံးပုံ ဖယ်ရှားရန်
       removed_avatar_msg: "%{username} ၏ ကိုယ်စားပြုရုပ်ပုံအား ဖယ်ရှားပြီးပါပြီ"
@@ -108,6 +124,9 @@ my:
         send: အတည်ပြုထားသောအီးမေးလ် ပြန်ပို့ပေးရန်
         success: အတည်ပြုထားသောအီးမေးလ် ပို့ပြီးပါပြီ။
       reset: ပြန်သတ်မှတ်မည်
+      reset_password: 'လျှို့ဝှတ်နံပါတ်အားပြန်သတ်မှတ်မည်
+
+        '
       resubscribe: ပြန်လည်စာရင်းသွင်းပါ
       role: အခန်းကဏ္ဍ
       search: ရှာရန်
@@ -125,13 +144,18 @@ my:
       silence: ကန့်သတ်
       silenced: ကန့်သတ်ထားသည်
       statuses: ပို့စ်များ
+      strikes: ယခင်လုပ်ဆောင်ချက်များ
       subscribe: စာရင်းသွင်းပါ
       suspend: ရပ်ဆိုင်းပါ
       suspended: ရပ်ဆိုင်းထားသည်
+      suspension_irreversible: ဤအကောင့်၏ဒေတာကို နောက်ပြန်မဆုတ်ဘဲ ဖျက်လိုက်ပါပြီ။ ၎င်းကိုအသုံးပြုနိုင်စေရန် အကောင့်အား ဆိုင်းငံ့ထားနိုင်သော်လည်း ၎င်းတွင် ယခင်ကရှိထားသည့် မည်သည့်ဒေတာကိုမှ ပြန်လည်ရယူမည်မဟုတ်ပါ။
+      suspension_reversible_hint_html: အကောင့်ကို ဆိုင်းငံ့ထားပြီး၊ ဒေတာကို %{date} တွင် အပြည့်အဝ ဖယ်ရှားပါမည်။ ထိုအချိန်အထိ မည်သည့်ဆိုးကျိုးများမရှိဘဲ အကောင့်ကို ပြန်လည်ရယူနိုင်သည်။ အကောင့်၏ဒေတာအားလုံးကို ချက်ချင်းဖယ်ရှားလိုပါက အောက်ပါအတိုင်း ပြုလုပ်နိုင်ပါသည်။
       title: အကောင့်များ
       unblock_email: အီးမေးလ်ကိုပြန်ဖွင့်မည်
       unblocked_email_msg: " %{username} အီးမေးလ်ကိုပြန်ဖွင့်လိုက်ပါပြီ"
       unconfirmed_email: အတည်မပြုရသေးသော အီးမေးလ်
+      undo_silenced: ကန့်သတ်ချက်မလုပ်တော့ပါ
+      unsilenced_msg: "%{username} ၏ အကောင့်၏ ကန့်သတ်ချက်ကို အောင်မြင်စွာ ပယ်ဖျက်ခဲ့သည်။"
       unsubscribe: စာရင်းမှထွက်ရန်
       unsuspended_msg: "%{username} ၏ အကောင့်ကို ရပ်ဆိုင်းလိုက်ပါပြီ"
       username: အသုံးပြုသူအမည်
@@ -143,6 +167,7 @@ my:
       action_types:
         approve_appeal: အယူခံကို အတည်ပြုပါ
         approve_user: အသုံးပြုသူကို အတည်ပြုရန်
+        assigned_to_self_report: မှတ်တမ်းကိုတစ်ယောက်ယောက်အားလုပ်ခိုင်းမည်
         change_email_user: အသုံးပြုသူအတွက် အီးမေးလ်ပြောင်းရန်
         change_role_user: အသုံးပြုသူ၏ အခန်းကဏ္ဍကို ပြောင်းလဲရန်
         confirm_user: အသုံးပြုသူကို လက်ခံရန်
@@ -156,6 +181,7 @@ my:
         create_ip_block: IP စည်းမျဉ်း ဖန်တီးရန်
         create_unavailable_domain: အသုံးမပြုနိုင်သောဒိုမိန်းကို ဖန်တီးပါ
         create_user_role: အခန်းကဏ္ဍဖန်တီးပါ
+        demote_user: အသုံးပြုသူကိုအဆင့်လျော့ချမည်
         destroy_announcement: ကြေညာချက်ကို ဖျက်ပါ
         destroy_canonical_email_block: အီးမေးလ်ပိတ်ပင်ခြင်းအား ဖျက်ရန်
         destroy_custom_emoji: စိတ်ကြိုက်အီမိုဂျီကို ဖျက်ရန်
@@ -183,10 +209,13 @@ my:
         resend_user: အတည်ပြုရန် မေးလ်ကို ပြန်ပို့ပေးရန်
         reset_password_user: စကားဝှက်ကို ပြန်လည်ရယူမည်
         resolve_report: အစီရင်ခံစာကို ဖြေရှင်းရန်
+        sensitive_account: Force-Sensitive အကောင့်
         silence_account: အကောင့် ကန့်သတ်ပါ
         suspend_account: အကောင့် ရပ်ဆိုင်းပါ
         unassigned_report: အစီရင်ခံစာ ဖြုတ်ရန်
         unblock_email_account: အီးမေးလ်လိပ်စာ ပြန်ဖွင့်ရန်
+        unsilence_account: ကန့်သတ်အကောင့်ကို မလုပ်တော့ပါ
+        unsuspend_account: အကောင့်ကို ရပ်ဆိုင်းပါ။
         update_announcement: ကြေညာချက်ပြင်ဆင်ရန်
         update_custom_emoji: စိတ်ကြိုက်အီမိုဂျီကို ပြင်ဆင်ရန်
         update_domain_block: ဒိုမိန်းပိတ်ပင်ခြင်းအား ပြင်ဆင်ရန်
@@ -244,6 +273,7 @@ my:
         unassigned_report_html: "%{name} က အစီရင်ခံစာ %{target} ကို ဖြုတ်ထားသည်"
         unblock_email_account_html: "%{name} က %{target} ၏ အီးမေးလ်လိပ်စာကို ပြန်ဖွင့်ခဲ့သည်"
         unsensitive_account_html: "%{name} က %{target} ၏ မီဒီယာကို သတိထားရသောမီဒီယာအဖြစ် အမှတ်အသားပြုထားခြင်းမရှိပါ"
+        unsilence_account_html: "%{target} ၏ အကောင့်၏ %{name} ကန့်သတ်ချက် မရှိပါ။"
         unsuspend_account_html: "%{name} က %{target} ၏ အကောင့်ကို ဆိုင်းငံ့ထားသည်"
         update_announcement_html: "%{name} က ကြေညာချက် %{target} ကို ပြင်ဆင်ခဲ့သည်"
         update_custom_emoji_html: "%{name} က အီမိုဂျီ %{target} ကို ပြင်ဆင်ခဲ့သည်"
@@ -261,12 +291,14 @@ my:
       edit:
         title: ကြေညာချက် ပြင်ဆင်ရန်
       empty: ကြေညာချက်များမတွေ့ပါ
+      live: လက်ရှိ
       new:
         create: ကြေညာချက်ဖန်တီးပါ
         title: ကြေညာချက်အသစ်
       publish: ပို့စ်တင်မည်
       published_msg: ကြေညာချက်တင်ပြီးပါပြီ။
       scheduled_for: "%{time} အတွက် စီစဉ်ထားသည်"
+      scheduled_msg: ကြေညာချက်ထုတ်ပြန်ရန် စီစဉ်ထားသည်။
       title: ကြေညာချက်များ
       unpublish: ပြန်ဖြုတ်ပါ
       unpublished_msg: ကြေညာချက်ကို ဖြုတ်ပြီးပါပြီ
@@ -274,7 +306,9 @@ my:
     custom_emojis:
       assign_category: အမျိုးအစားသတ်မှတ်ရန်
       by_domain: ဒိုမိန်း
+      copied_msg: အီမိုဂျီ၏စက်အတွင်းကူးထားသည်များကို အောင်မြင်စွာ ဖန်တီးခဲ့သည်။
       copy: ကူးယူပါ
+      copy_failed_msg: အီမိုဂျီ၏စက်အတွင်းမကူးနိုင်ပါ
       create_new_category: အမျိုးအစားအသစ်ဖန်တီးရန်
       created_msg: အီမိုဂျီ ဖန်တီးပြီးပါပြီ။
       delete: ဖျက်ပါ
@@ -293,6 +327,11 @@ my:
         title: စိတ်ကြိုက်အီမိုဂျီအသစ် ထည့်ပါ
       no_emoji_selected: မည်သည့်အီမိုဂျီကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
       not_permitted: ဤလုပ်ဆောင်ချက်ကို ဆောင်ရွက်ရန် သင့်ကို ခွင့်မပြုပါ။
+      overwrite: ထပ်ရေးရန်
+      shortcode: 'တိုတိုကုတ်
+
+        '
+      shortcode_hint: အက္ခရာဂဏန်းများနှင့် underscore များဖြင့် အနည်းဆုံး စာလုံး ၂ လုံးရှိရပါမည်
       title: စိတ်ကြိုက်အီမိုဂျီများ
       uncategorized: အမျိုးအစားခွဲခြားထားခြင်းမရှိပါ
       unlist: စာရင်းမသွင်းထားပါ
@@ -305,6 +344,7 @@ my:
       interactions: အပြန်အလှန်ဆက်သွယ်မှုများ
       media_storage: မီဒီယာသိုလှောင်မှု
       new_users: အသုံးပြုသူအသစ်များ
+      opened_reports: မှတ်တမ်းများကိုဖွင့်လှစ်ခဲ့သည်
       pending_appeals_html:
         other: "<strong>%{count}</strong> အယူခံဝင်မှုကို ဆိုင်းငံ့ထားခြင်း"
       pending_reports_html:
@@ -313,6 +353,7 @@ my:
         other: "<strong>%{count}</strong> hashtag ဆောင်ရွက်ဆဲ"
       pending_users_html:
         other: "<strong>%{count}</strong> ဆိုင်းငံ့အသုံးပြုသူ"
+      resolved_reports: မှတ်တမ်းများဖြေရှင်းခဲ့သည်
       software: ဆော့ဖ်ဝဲလ်
       sources: အကောင့်ဖွင့်ခြင်းဆိုင်ရာ သတင်းရင်းမြစ်များ
       space: နေရာလွတ်အသုံးပြုမှု
@@ -334,18 +375,26 @@ my:
     domain_blocks:
       add_new: ဒိုမိန်းပိတ်ပင်ခြင်းအသစ် ထည့်ပါ
       created_msg: ဒိုမိန်းပိတ်ပင်ခြင်းကို ယခုလုပ်ဆောင်နေပါသည်
+      destroyed_msg: ဒိုမိန်းပိတ်ဆို့ခြင်းကို ပြန်ပြင်လိုက်ပါပြီ။
       domain: ဒိုမိန်း
       edit: ဒိုမိန်းပိတ်ပင်ခြင်းကို ပြင်ဆင်ရန်
+      existing_domain_block: "%{name}  အပေါ် ပိုမိုတင်းကျပ်သောကန့်သတ်ချက်များကို ချမှတ်ထားပြီးဖြစ်သည်။"
+      existing_domain_block_html: '%{name} အပေါ် ပိုမိုတင်းကျပ်သော ကန့်သတ်ချက်များကို ချမှတ်ထားပြီး <a href="%{unblock_url}">၎င်းကို ပြန်ဖွင့်ရန်</a> လိုအပ်ပါသည်။'
       export: ထုတ်ယူခြင်း
       import: ထည့်သွင်းခြင်း
       new:
         create: ပိတ်ပင်ခြင်း ဖန်တီးရန်
+        hint: ဒိုမိန်းပိတ်ဆို့ခြင်းသည် ဒေတာဘေ့စ်အတွင်း အကောင့်ထည့်သွင်းမှုများကို မတားဆီးသော်လည်း ထိုအကောင့်များအတွက် တိကျစွာစိစစ်ခြင်းနည်းလမ်းများကို အလိုအလျောက်ပြန်လည်အသုံးချမည်ဖြစ်သည်။
         severity:
+          desc_html: "<strong>ကန့်သတ်ချက်</strong> သည် ဤဒိုမိန်းရှိ အကောင့်များမှ ပို့စ်များကို ၎င်းတို့ကို မလိုက်ကြည့်သူတိုင်းကို မမြင်နိုင်စေမည်ဖြစ်သည်။ <strong>ဆိုင်းငံ့ထားရန်</strong> သည် ဤဒိုမိန်းအကောင့်များအတွက် အကြောင်းအရာ၊ မီဒီယာနှင့် ပရိုဖိုင်ဒေတာအားလုံးကို သင့်ဆာဗာမှ ဖယ်ရှားပါမည်။ မီဒီယာဖိုင်များကို ငြင်းပယ်လိုပါက <strong>None</strong> ကို အသုံးပြုပါ။"
+          noop: တစ်ခုမျှမရှိ
           silence: ကန့်သတ်
           suspend: ရပ်ဆိုင်းပါ
         title: ဒိုမိန်းပိတ်ပင်ထားခြင်းအသစ်
       no_domain_block_selected: မည်သည့်ဒိုမိန်းပိတ်ပင်ထားခြင်းကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
       not_permitted: ဤလုပ်ဆောင်ချက်ကို ဆောင်ရွက်ရန် သင့်ကို ခွင့်မပြုပါ။
+      obfuscate: မှတ်ရခက်သောဒိုမိန်းအမည်
+      obfuscate_hint: ဒိုမိန်းကန့်သတ်ချက်များစာရင်းကို ဖွင့်ထားပါက စာရင်းရှိ ဒိုမိန်းအမည်များမှာ ရှုပ်ထွေးစေနိုင်ပါသည်။
       private_comment: သီးသန့်မှတ်ချက်
       private_comment_hint: စိစစ်သူများ၏အတွင်းပိုင်းအသုံးပြုမှုအတွက် ဤဒိုမိန်းကန့်သတ်ချက်ဆိုင်ရာမှတ်ချက်။
       public_comment: အများမြင်မှတ်ချက်
@@ -372,12 +421,16 @@ my:
         title: အီးမေးလ်ဒိုမိန်းအသစ်ကို ပိတ်ရန်
       no_email_domain_block_selected: မည်သည့်အီးမေးလ်ဒိုမိန်းပိတ်ပင်ခြင်းကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
       not_permitted: ခွင့်ပြုထားခြင်းမရှိပါ
+      resolved_dns_records_hint_html: ဒိုမိန်းအမည်သည် အီးမေးလ်လက်ခံခြင်းအတွက် နောက်ဆုံးတွင် တာဝန်ရှိသည့် အောက်ပါ MX ဒိုမိန်းများသို့ ဖြေရှင်းပေးသည်။ MX ဒိုမိန်းကို ပိတ်ဆို့ခြင်းသည် တူညီသော MX ဒိုမိန်းကို အသုံးပြုသည့် မည်သည့်အီးမေးလ်လိပ်စာမှ အကောင့်ဖွင့်ခြင်းများကို ပိတ်ဆို့စေမည်၊ မြင်နိုင်သောဒိုမိန်းအမည်သည် ကွဲပြားသော်လည်း၊ <strong>အဓိက အီးမေးလ်ဝန်ဆောင်မှုပေးသူများကို မပိတ်ဆို့ရန် သတိထားပါ။</strong>
       resolved_through_html: "%{domain} မှတစ်ဆင့် ဖြေရှင်းခဲ့သည်"
       title: ပိတ်ပင်ထားသော အီးမေးလ်ဒိုမိန်းများ
     export_domain_allows:
+      new:
+        title: ဒိုမိန်းတင်သွင်းခွင့်ပြုသည်
       no_file: ဖိုင်ရွေးထားခြင်းမရှိပါ။
     export_domain_blocks:
       import:
+        existing_relationships_warning: လက်ရှိစောင့်ကြည့်သူများနှင့် ဆက်ဆံရေး
         private_comment_template: "%{date} တွင် %{source} မှ ထည့်သွင်းခဲ့သည်"
         title: ဒိုမိန်းပိတ်ပင်ထားမှုများကို ထည့်သွင်းရန်
       invalid_domain_block: အောက်ပါအမှား(များ)ကြောင့် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော ဒိုမိန်းပိတ်ပင်ထားမှုများကို ကျော်သွားခဲ့သည် - %{error}
@@ -393,6 +446,7 @@ my:
       availability:
         failures_recorded:
           other: "%{count} ရက်နေ့တွင် ကြိုးစားမှု မအောင်မြင်ပါ။"
+        no_failures_recorded: မှတ်တမ်းမရှိပါ။
         title: ရရှိနိုင်မှု
       back_to_all: အားလုံး
       back_to_limited: ကန့်သတ်ထားသည်
@@ -400,6 +454,8 @@ my:
       by_domain: ဒိုမိန်း
       confirm_purge: ဤဒိုမိန်းမှ အချက်အလက်များကို အပြီးတိုင်ဖျက်လိုသည်မှာ သေချာပါသလား။
       content_policies:
+        comment: အတွင်းပိုင်းမှတ်ချက်
+        description_html: ဤဒိုမိန်းနှင့် ဒိုမိန်းခွဲများမှ အကောင့်အားလုံးအတွက် အသုံးချမည့် အကြောင်းအရာမူဝါဒများကို သတ်မှတ်နိုင်သည်။
         limited_federation_mode_description_html: ဤဒိုမိန်းဖြင့် ဖက်ဒီကို ခွင့်ပြုမလား။
         policies:
           reject_media: မီဒီယာဖယ်ရှားရန်
@@ -419,22 +475,33 @@ my:
         instance_statuses_measure: သိမ်းဆည်းထားသောပို့စ်များ
       delivery:
         all: အားလုံး
+        clear: ပေးပို့မှု အမှားအယွင်းများကို ရှင်းလင်းပါ
+        failing: မအောင်မြင်ခြင်း
         restart: ပေးပို့မှုကို ပြန်လည်စတင်ရန်
         stop: ပေးပို့မှုကို ရပ်ရန်
         unavailable: မရရှိနိုင်ပါ
+      delivery_available: ပေးပို့နိုင်ပါပြီ
+      delivery_error_days: ပေးပို့မှု မှားယွင်းသည့်ရက်များ
+      delivery_error_hint: "%{count} ရက်အတွင်း မပေးပို့နိုင်ပါက ၎င်းကို ပေးပို့မရနိုင်ဟု အလိုအလျောက် အမှတ်အသားပြုပါမည်။"
+      destroyed_msg: "%{domain} မှ အချက်အလက်များကို မကြာမီ ဖျက်ပါမည်။"
       empty: ဒိုမိန်းများ မတွေ့ပါ။
+      known_accounts:
+        other: လူသိများသော အကောင့် %{count} ခု
       moderation:
         all: အားလုံး
         limited: ကန့်သတ်ထားသော
         title: စိစစ်ခြင်း
       private_comment: သီးသန့်မှတ်ချက်
       public_comment: အများမြင်မှတ်ချက်
+      purge: ဖျက်
+      purge_description_html: ဤဒိုမိန်းသည် အော့ဖ်လိုင်းဖြစ်နေပါက သင့်သိုလှောင်မှုမှ အကောင့်မှတ်တမ်းများနှင့် ဆက်စပ်အချက်အလက်အားလုံးကို ဖျက်နိုင်သည်။ အချိန်အနည်းငယ် ကြာနိုင်ပါသည်။
       title: ဖက်ဒီ
       total_blocked_by_us: ကျွန်ုပ်တို့မှ ပိတ်ပင်ထားခြင်း
       total_followed_by_them: "၎င်းတို့မှ စောင့်ကြည့်ခဲ့သည်"
       total_followed_by_us: ကျွန်ုပ်တို့မှ စောင့်ကြည့်ခဲ့သည်
       total_reported: "၎င်းတို့နှင့်ဆိုင်သော အစီရင်ခံစာများ"
       total_storage: မီဒီယာ ပူးတွဲချက်များ
+      totals_time_period_hint_html: အောက်တွင်ဖော်ပြထားသော စုစုပေါင်းမှာ အချိန်တိုင်းအတွက် အချက်အလက်များဖြစ်သည်။
     invites:
       deactivate_all: အားလုံးပယ်ဖျက်ရန်
       filter:
@@ -483,15 +550,19 @@ my:
           other: "%{count} မှတ်စု"
       action_log: မှတ်တမ်းများစစ်ဆေးခြင်း
       action_taken_by: ဆောင်ရွက်ခဲ့ပါသည်
+      add_to_report: အစီရင်ခံစာထပ်ထည့်ရန်
       are_you_sure: သေချာပါသလား။
       assign_to_self: ကျွန်ုပ်ကို တာဝန်ပေးရန်
       assigned: စိစစ်သူကို တာဝန်ပေးရန်
       by_target_domain: တိုင်ကြားထားသော အကောင့်၏ ဒိုမိန်း
       cancel: ပယ်ဖျက်မည်
       category: အမျိုးအစား
+      comment:
+        none: တစ်ခုမျှမရှိ
       comment_description_html: "%{name} က နောက်ထပ်အချက်အလက်များ ပံ့ပိုးပေးနိုင်ရန်အတွက် ရေးသားခဲ့သည် -"
       confirm: အတည်ပြုမည်
       confirm_action: "@%{acct} ကို စိစစ်အကဲဖြတ်ခြင်းအား အတည်ပြုပါ"
+      created_at: အကြောင်းကြားပြီးပါပြီ
       delete_and_resolve: ပို့စ်များကို ဖျက်ပါ
       forwarded: ထပ်ဆင့်ပို့ပြီးပါပြီ
       forwarded_to: "%{domain} သို့ ထပ်ဆင့်ပို့ထားသည်"
@@ -505,13 +576,17 @@ my:
         create_and_unresolve: မှတ်စုဖြင့် ပြန်ဖွင့်ရန်
         delete: ဖျက်ပါ
         title: မှတ်စုများ
+      processed_msg: 'အကြောင်းကြားမှု #%{id} ကို ဆောင်ရွက်ပြီးပါပြီ'
       remote_user_placeholder: "%{instance} မှ အဝေးကနေအသုံးပြုသူ"
       reopen: အစီရင်ခံစာပြန်ဖွင့်ရန်
       report: "#%{id} အစီရင်ခံရန်"
+      reported_account: တိုင်ကြားထားသောအကောင့်
+      reported_by: မှ တိုင်ကြားထားသည်
       resolved: ဖြေရှင်းပြီးပါပြီ
       resolved_msg: မှတ်တမ်းကို ဖြေရှင်းပြီးပါပြီ။
       skip_to_actions: လုပ်ဆောင်ချက်များသို့ ကျော်သွားရန်
       status: အခြေအနေ
+      statuses: တိုင်ကြားထားသောအကြောင်းအရာ
       summary:
         action_preambles:
           delete_html: သင်သည် <strong>@%{acct}</strong> ၏ ပို့စ်အချို့ကို <strong>ဖယ်ရှား</strong> တော့မည်ဖြစ်သည်။ ၎င်းတို့မှာ -
@@ -519,10 +594,15 @@ my:
           silence_html: သင်သည် <strong>@%{acct}</strong> ၏ အကောင့်ကို <strong>ကန့်သတ်</strong> တော့မည်ဖြစ်သည်။ ၎င်းမှာ -
           suspend_html: သင်သည် <strong>@%{acct}</strong> ၏ အကောင့်ကို <strong>ဆိုင်းငံ့</strong> တော့မည်ဖြစ်သည်။ ၎င်းမှာ -
         actions:
+          delete_html: စိတ်အနှောင့်အယှက်ဖြစ်စေသောပို့စ်များကို ဖယ်ရှားပါ
+          mark_as_sensitive_html: စိတ်အနှောင့်အယှက်ဖြစ်စေသောပို့စ်များ၏ မီဒီယာကို သတိထားရသောမီဒီယာအဖြစ် အမှတ်အသားပြုပါ
           suspend_html: "<strong>@%{acct}</strong> ကို ဆိုင်းငံ့ထားသောကြောင့် ပရိုဖိုင်နှင့် အကြောင်းအရာများအား ဝင်ရောက်ခွင့်မရှိတော့သဖြင့် အပြန်အလှန် တုံ့ပြန်၍ မရတော့ခြင်း"
         close_report: 'တိုင်ကြားစာ #%{id} ကို ဖြေရှင်းပြီးကြောင်း အမှတ်အသားပြုပါ'
+        close_reports_html: "<strong>@%{acct}</strong> နှင့်ပတ်သက်သည့် အစီရင်ခံစာ<strong>အားလုံး</strong> ကို ဖြေရှင်းပြီးကြောင်း အမှတ်အသားပြုပါ"
         delete_data_html: "<strong>@%{acct}</strong> ၏ ပရိုဖိုင်နှင့် အကြောင်းအရာများကို ဆိုင်းငံ့ထားခြင်းမရှိပါက ယခုမှ ရက်ပေါင်း ၃၀ အတွင်း ဖျက်ရန်"
         preview_preamble_html: "<strong>@%{acct}</strong> သည် အောက်ပါအကြောင်းအရာများကြောင့် သတိပေးချက်ကို လက်ခံရရှိပါမည် -"
+        send_email_html: သတိပေးချက် အီးမေးလ်တစ်စောင် <strong>@%{acct}</strong> ပေးပို့ပါ
+      target_origin: တိုင်ကြားထားသောအကောင့်၏ မူလအစ
       title: မှတ်တမ်းများ
       unassign: တာဝန်မှဖြုတ်ရန်
       unknown_action_msg: အမည်မသိလုပ်ဆောင်ချက်- %{action}
@@ -540,6 +620,7 @@ my:
         moderation: စိစစ်ခြင်း
         special: အထူး
       delete: ဖျက်ပါ
+      description_html: "<strong>အသုံးပြုသူအခန်းကဏ္ဍများ</strong>ဖြင့် Mastodon အသုံးပြုသူများ၏ မည်သည့်လုပ်ဆောင်ချက်များနှင့် နေရာများကိုမဆို သင် စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါသည်။"
       edit: "'%{name} ၏ အခန်းကဏ္ဍကို ပြင်ဆင်ရန်"
       everyone: မူလသတ်မှတ်ထားသည့် ခွင့်ပြုချက်များ
       permissions_count:
@@ -564,18 +645,22 @@ my:
         manage_invites: ဖိတ်ခေါ်ခြင်းကို စီမံရန်
         manage_invites_description: အသုံးပြုသူများအား ဖိတ်ခေါ်ထားသည့်လင့်များကို ရှာဖွေကြည့်ရှုပြီး ပိတ်ရန် ခွင့်ပြုသည်
         manage_reports: အစီရင်ခံစာများကို စီမံပါ
+        manage_reports_description: အသုံးပြုသူများအား အစီရင်ခံစာများကို ပြန်လည်သုံးသပ်ရန်နှင့် ၎င်းတို့နှင့် ဆန့်ကျင်သည့် စိစစ်အရေးယူမှုများကို လုပ်ဆောင်ရန် ခွင့်ပြုသည်
         manage_roles: အခန်းကဏ္ဍများကို စီမံပါ
         manage_roles_description: အသုံးပြုသူများအား ၎င်းတို့၏အောက်တွင်ရှိသော အခန်းကဏ္ဍများကို စီမံခန့်ခွဲရန်နှင့် သတ်မှတ်ရန် ခွင့်ပြုထားသည်
         manage_rules: စည်းမျဉ်းများကို စီမံပါ
         manage_rules_description: အသုံးပြုသူများအား ဆာဗာစည်းမျဉ်းများကို ပြောင်းလဲခွင့် ပြုထားသည်
         manage_settings: သတ်မှတ်ချက်များကို စီမံပါ
         manage_settings_description: အသုံးပြုသူများကို ဆိုက်သတ်မှတ်ချက်များ ပြောင်းလဲခွင့် ပြုရန်
+        manage_taxonomies: အမျိုးအစားခွဲခြားပါ
         manage_taxonomies_description: ခေတ်စားနေသော အကြောင်းအရာများကို ပြန်လည်သုံးသပ်ရန်နှင့် hashtag သတ်မှတ်ချက်များကို ပြင်ဆင်ရန်အတွက် အသုံးပြုသူများကို ခွင့်ပြုသည်
         manage_user_access: အသုံးပြုသူဝင်ရောက်မှုကို စီမံပါ
         manage_user_access_description: အသုံးပြုသူများကို အခြားအသုံးပြုသူများ၏ နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ကို ပိတ်ရန်၊ ၎င်းတို့၏ အီးမေးလ်လိပ်စာကို ပြောင်းလဲရန်နှင့် စကားဝှက်ကို ပြန်လည်သတ်မှတ်ရန် ခွင့်ပြုသည်
         manage_users: အသုံးပြုသူများကို စီမံပါ
+        manage_users_description: အသုံးပြုသူများအား အခြားအသုံးပြုသူများ၏ အသေးစိတ်အချက်အလက်များကို ကြည့်ရှုနိုင်ပြီး ၎င်းတို့နှင့် ဆန့်ကျင်သည့် စိစစ်အရေးယူမှုများကို လုပ်ဆောင်ခွင့်ပြုသည်
         manage_webhooks: Webhooks ကို စီမံပါ
         manage_webhooks_description: စီမံခန့်ခွဲရေးဆိုင်ရာ ဖြစ်ရပ်များအတွက် အသုံးပြုသူများအား webhook စနစ်ထည့်သွင်းရန် ခွင့်ပြုထားသည်
+        view_audit_log: စာရင်းမှတ်တမ်းကို ကြည့်ရန်
         view_audit_log_description: အသုံးပြုသူများကို ဆာဗာပေါ်တွင် စီမံခန့်ခွဲရေးဆိုင်ရာ လုပ်ဆောင်ချက်မှတ်တမ်းကို ကြည့်ရှုခွင့်ပြုသည်။
         view_dashboard: ဒက်ရှ်ဘုတ်မြင်ကွင်းကို ကြည့်ရန်
         view_dashboard_description: အသုံးပြုသူများကို ဒက်ရှ်ဘုတ်မြင်ကွင်းနှင့် အမျိုးမျိုးသော ဆိုဒ်နှင့်ဆိုင်သောဂဏန်းများအား ဝင်ရောက်ကြည့်ရှုခွင့်ပြုသည်
@@ -586,6 +671,7 @@ my:
       add_new: စည်းမျဉ်းထည့်ပါ
       delete: ဖျက်ပါ
       edit: စည်းမျဉ်းကို ပြင်ဆင်မည်
+      empty: ဆာဗာစည်းမျဉ်းများကို မသတ်မှတ်ရသေးပါ။
       title: ဆာဗာစည်းမျဉ်းများ
     settings:
       about:
@@ -594,12 +680,15 @@ my:
       appearance:
         preamble: Mastodon ၏ ဝဘ်ပုံစံကို စိတ်ကြိုက်ပြင်ဆင်ပါ။
         title: ပုံပန်းသဏ္ဌာန်
+      content_retention:
+        preamble: Mastodon တွင် အသုံးပြုသူဖန်တီးထားသော အကြောင်းအရာများ မည်သို့သိမ်းဆည်းမည်ကို ထိန်းချုပ်ပါ။
       default_noindex:
         desc_html: ဤသတ်မှတ်ချက်ကို ကိုယ်တိုင်မပြောင်းရသေးသော အသုံးပြုသူအားလုံးအပေါ် သက်ရောက်မှုရှိသည်
       discovery:
         follow_recommendations: အကြံပြုချက်များကို စောင့်ကြည့်ပါ
         profile_directory: ပရိုဖိုင်လမ်းညွှန်
         public_timelines: အများမြင်စာမျက်နှာ
+        publish_discovered_servers: ရှာဖွေတွေ့ရှိထားသော ဆာဗာများကို ထုတ်ပြန်ပါ
         title: ရှာဖွေတွေ့ရှိမှု
         trends: လက်ရှိခေတ်စားမှုများ
       domain_blocks:
@@ -621,6 +710,7 @@ my:
       account: ရေးသားသူ
       application: အက်ပလီကေးရှင်း
       back_to_account: အကောင့်စာမျက်နှာသို့ ပြန်သွားရန်
+      back_to_report: အစီရင်ခံစာ စာမျက်နှာသို့ ပြန်သွားရန်
       batch:
         remove_from_report: တိုင်ကြားစာမှ ဖယ်ရှားပါ
         report: တိုင်ကြားစာ
@@ -639,19 +729,31 @@ my:
       status_changed: ပို့စ်ပြောင်းပြီးပါပြီ
       title: အကောင့်ပို့စ်များ
       trending: လက်ရှိခေတ်စားနေခြင်း
+      visibility: မြင်နိုင်မှု
       with_media: မီဒီယာနှင့်အတူ
     strikes:
       actions:
         delete_statuses: "%{name} မှ %{target} ၏ ပို့စ်များကို ဖျက်ခဲ့သည်"
+        disable: "%{name} က %{target} ၏ အကောင့်ကို ရပ်ထားသည်"
         mark_statuses_as_sensitive: "%{name} က %{target} ၏ ပို့စ်များကို သတိထားရသောပို့စ်များအဖြစ် အမှတ်အသားပြုထားသည်"
         none: "%{name} မှ %{target} သို့ သတိပေးချက်တစ်ခု ပေးပို့ခဲ့သည်"
         sensitive: "%{name} က %{target} ၏ အကောင့်ကို သတိထားရသောအကောင့်အဖြစ် အမှတ်အသားပြုထားသည်"
         silence: "%{name} က %{target} ၏ အကောင့်ကို ကန့်သတ်ထားသည်"
         suspend: "%{name} က %{target} ၏ အကောင့်ကို ဆိုင်းငံ့ထားသည်"
+      appeal_approved: အတည်ပြုခဲ့ပြီး
+      appeal_pending: အတည်ပြုမှုဆိုင်းငံ့ထားခြင်း
+      appeal_rejected: တင်ပြခြင်းကို ပယ်ချခဲ့သည်
     system_checks:
       rules_check:
         action: ဆာဗာစည်းမျဉ်းများကို စီမံရန်
         message_html: သင်သည် မည်သည့်ဆာဗာစည်းမျဉ်းများကိုမျှ မသတ်မှတ်ထားပါ။
+      upload_check_privacy_error:
+        action: နောက်ထပ်အချက်အလက်များအတွက် ဤနေရာတွင် ကြည့်ပါ
+      upload_check_privacy_error_object_storage:
+        action: နောက်ထပ်အချက်အလက်များအတွက် ဤနေရာတွင် ကြည့်ပါ
+    tags:
+      review: အခြေအနေသုံးသပ်ရန်
+      updated_msg: ဟက်ရှ်တဂျ်သတ်မှတ်ချက်များကို အပ်ဒိတ်လုပ်ပြီးပါပြီ
     title: စီမံခန့်ခွဲခြင်း
     trends:
       allow: ခွင့်ပြု
@@ -659,13 +761,30 @@ my:
       disallow: ခွင့်မပြု
       links:
         allow: လင့်ခ်ကို ခွင့်ပြုရန်
+        allow_provider: ပို့စ်တင်သူကိုခွင့်ပြုရန်
         disallow: လင့်ခ်ကို ခွင့်မပြုရန်
+        disallow_provider: ပို့စ်တင်သူကို ခွင့်မပြုရန်
+        no_link_selected: မည်သည့်လင့်ခ်ကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
+        publishers:
+          no_publisher_selected: မည်သည့်ပို့စ်တင်သူကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
+        shared_by_over_week:
+          other: ပြီးခဲ့သည့်အပတ်တွင် လူ %{count} ဦး မှ မျှဝေခဲ့သည်
         title: လက်ရှိခေတ်စားနေသော လင့်များ
+        usage_comparison: မနေ့က %{yesterday} နှင့် နှိုင်းယှဉ်၍ ယနေ့ %{today} ကြိမ် မျှဝေခဲ့သည်
       only_allowed: သာခွင့်ပြုသည်
+      pending_review: ဆိုင်းငံ့ထားသော သုံးသပ်ချက်
+      preview_card_providers:
+        allowed: ဤပို့စ်တင်သူထံမှ လင့်ခ်များ ခေတ်စားနိုင်သည်
+        title: ပို့စ်တင်သူများ
       rejected: ဖယ်ရှားပြီးပါပြီ
       statuses:
         allow: ပို့စ်တင်ခွင့်ပြုရန်
+        allow_account: ပို့စ်တင်သူကို ခွင့်ပြုပါ
         disallow: ပို့စ်ကို တင်ခွင့်မပြုရန်
+        disallow_account: ပို့စ်တင်သူကို ခွင့်မပြုပါနဲ့
+        no_status_selected: မည်သည့်ခေတ်စားနေသောပို့စ်ကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
+        shared_by:
+          other: မျှဝေမှုနှင့် နှစ်သက်မှု %{friendly_count} ကြိမ်
         title: လက်ရှိခေတ်စားနေသော ပို့စ်များ
       tags:
         current_score: "%{score} လက်ရှိရမှတ်"
@@ -675,10 +794,12 @@ my:
           tag_servers_measure: မတူညီသောဆာဗာများ
           tag_uses_measure: စုစုပေါင်းအသုံးပြုမှု
         listable: အကြံပြုနိုင်ပါသည်
+        no_tag_selected: မည်သည့်တဂျ်ကိုမျှ ရွေးချယ်ထားခြင်းမရှိသောကြောင့် ပြောင်းလဲခြင်းမရှိပါ
         not_listable: အကြံပြုမည်မဟုတ်ပါ
         not_trendable: လက်ရှိခေတ်စားနေသာပို့စ်များအောက်တွင် ပေါ်လာမည်မဟုတ်ပါ
         not_usable: အသုံးမပြုနိုင်ပါ
         title: လက်ရှိခေတ်စားနေသော hashtag များ
+        trendable: လက်ရှိခေတ်စားနေသာပို့စ်များအောက်တွင် ပေါ်လာမည်
         trending_rank: "#%{rank} ခေတ်စားနေခြင်း"
         usable: အသုံးပြုနိုင်သည်
         usage_comparison: မနေ့က %{yesterday} နှင့် နှိုင်းယှဉ်လျှင် ယနေ့ %{today} ကြိမ် အသုံးပြုခဲ့သည်
@@ -698,10 +819,14 @@ my:
       disable: ပိတ်ပါ
       disabled: ပိတ်ထားသည်
       edit: ဆုံးမှတ် ပြင်ဆင်ပါ
+      empty: မည်သည့် webhook endpoints မှ မစီစဉ်ရသေးပါ။
       enable: ဖွင့်ပါ
       enabled: လက်ရှိ
+      enabled_events:
+        other: ဖွင့်ထားသောအစီအစဉ်များ %{count} ခု
       events: ပွဲအစီအစဉ်များ
       new: webhook အသစ်
+      secret: လျှို့ဝှက်လက်မှတ်ထိုးခြင်း
       status: အခြေအနေ
       title: Webhook များ
       webhook: Webhook
@@ -715,12 +840,15 @@ my:
         sensitive: "၎င်းတို့၏ အကောင့်များကို သတိထားရသော အကောင့်များအဖြစ် အမှတ်အသားပြုရန်"
         silence: "၎င်းတို့၏ ပို့စ်များကို ကန့်သတ်ရန်"
         suspend: "၎င်းတို့၏ အကောင့်ကို ရပ်ဆိုင်းရန်"
+      next_steps: စိစစ်ဆုံးဖြတ်ချက်ပြန်ဖျက်ရန်အတွက် တင်ပြနိုင်သည် သို့မဟုတ် ၎င်းကို လျစ်လျူရှုနိုင်သည်။
+      subject: "%{username} က %{instance} တွင် စိစစ်ဆုံးဖြတ်ချက်ကို တင်ပြနေသည်"
     new_pending_account:
       body: အကောင့်သစ်၏အသေးစိတ်ကို အောက်တွင်ဖော်ပြထားသည်။ ၎င်းကို အတည်ပြုနိုင်သည် သို့မဟုတ် ငြင်းပယ်နိုင်သည်။
       subject: " (%{username}) %{instance} ပေါ်ရှိ ပြန်လည်သုံးသပ်ရမည့် အကောင့်သစ်"
     new_report:
       body: "%{reporter} က %{target} ကို တိုင်ကြားခဲ့သည်"
       body_remote: "%{domain} မှ တစ်စုံတစ်ယောက်က %{target} ကို တိုင်ကြားခဲ့သည်"
+      subject: "%{instance} (#%{id}) အတွက် တိုင်ကြားစာအသစ်"
     new_trends:
       body: အောက်ပါအရာများကို အများကိုမပြမီ ပြန်လည်သုံးသပ်ရန် လိုအပ်သည် -
       new_trending_links:
@@ -736,8 +864,10 @@ my:
     created_msg: နာမည်တူတစ်ခုကို ဖန်တီးပြီးပါပြီ။ အကောင့်ဟောင်းမှ စတင်ရွှေ့နိုင်ပါပြီ။
     deleted_msg: နာမည်တူကို ဖယ်ရှားထားပြီးပါပြီ။ ထိုအကောင့်မှ ဤအကောင့်သို့ပြောင်းရန် မဖြစ်နိုင်တော့ပါ။
     empty: သင့်တွင် နာမည်တူများ မရှိပါ။
+    remove: နာမည်တူများကို လင့်ခ်ဖြုတ်ပါ
   appearance:
     advanced_web_interface: အဆင့်မြင့်ဝဘ်ပုံစံ
+    confirmation_dialogs: အတည်ပြုချက် ဒိုင်ယာလော့ခ်များ
     discovery: ရှာဖွေတွေ့ရှိမှု
     localization:
       body: Mastodon ကို စေတနာ့ဝန်ထမ်းများမှ ဘာသာပြန်ထားပါသည်။
@@ -756,42 +886,66 @@ my:
     created: အက်ပလီကေးရှင်းကို ဖန်တီးပြီးပါပြီ
     destroyed: အက်ပလီကေးရှင်းကို ဖျက်ပြီးပါပြီ
     logout: ထွက်မယ်
+    regenerate_token: ဝင်ရောက်ခွင့် တိုကင်ကို ပြန်ထုတ်ပါ
+    token_regenerated: အသုံးပြုခွင့်တိုကင်ကို ပြန်လည်ထုတ်ပေးသည်
     warning: ဤအချက်အလက်ကို သတိထားပါ။ မည်သူ့ကိုမျှ မမျှဝေပါနှင့်။
+    your_token: သင့် အသုံးပြုခွင့်တိုကင်
   auth:
     apply_for_account: အကောင့်တစ်ခုတောင်းဆိုပါ
     change_password: စကားဝှက်
     confirmations:
       wrong_email_hint: ထိုအီးမေးလ်လိပ်စာ မမှန်ပါက အကောင့်သတ်မှတ်ချက်များတွင် ပြောင်းလဲနိုင်သည်။
     delete_account: အကောင့်ဖျက်ပါ
+    delete_account_html: သင့်အကောင့်ဖျက်လိုပါက<a href="%{path}">ဤနေရာတွင် ဆက်လက်လုပ်ဆောင်နိုင်သည်</a>။ အတည်ပြုချက်တောင်းပါမည်။
     description:
       prefix_invited_by_user: "@%{name} က Mastodon ၏ ဆာဗာတွင် ပါဝင်ရန် သင့်ကို ဖိတ်ခေါ်ထားသည်။"
       prefix_sign_up: ယနေ့တွင် Mastodon ၌ စာရင်းသွင်းလိုက်ပါ။
+      suffix: အကောင့်တစ်ခုဖြင့် မည်သည့် Mastodon ဆာဗာများမှ အသုံးပြုသူများနှင့်မဆို စောင့်ကြည့်နိုင်၊ ပို့စ်အသစ်များ တင်နိုင်ပြီး မက်ဆေ့ချ်များ ပေးပို့နိုင်ပါသည်။
+    didnt_get_confirmation: အတည်ပြုချက်ညွှန်ကြားချက်များကို မရရှိခဲ့ဘူးလား။
     dont_have_your_security_key: သင့်တွင် လုံခြုံရေးကီး မရှိဘူးလား။
     forgot_password: သင့်စကားဝှက် မေ့နေပါသလား။
+    link_to_otp: သင့်ဖုန်းမှ နှစ်ဆင့်ခံလုံခြုံရေးကုဒ် သို့မဟုတ် ပြန်လည်ရယူရေးကုဒ် ထည့်ပါ
+    link_to_webauth: လုံခြုံရေးကီး အသုံးပြုပါ
     log_in_with: ဖြင့် ဝင်ရောက်ပါ
     login: အကောင့်ဝင်ရန်
     logout: ထွက်မယ်
     migrate_account: အခြားအကောင့်တစ်ခုသို့ ရွှေ့ရန်
+    migrate_account_html: ဤအကောင့်ကို အခြားအကောင့်သို့ ပြန်ညွှန်းလိုပါက <a href="%{path}">ဤနေရာတွင် စီစဉ်သတ်မှတ်နိုင်သည်</a>။
+    or_log_in_with: သို့မဟုတ် အကောင့်ဖြင့် ဝင်ရောက်ပါ
+    privacy_policy_agreement_html: <a href="%{privacy_policy_path}" target="_blank">ကိုယ်ရေးအချက်အလက်မူဝါဒ</a> ကို ဖတ်ပြီး သဘောတူလိုက်ပါပြီ
     providers:
       cas: CAS
       saml: SAML
     register: အကောင့်ဖွင့်ရန်
     registration_closed: "%{instance} သည် အဖွဲ့ဝင်အသစ်များကို လက်ခံထားခြင်းမရှိပါ"
+    resend_confirmation: အတည်ပြုချက်ညွှန်ကြားမှုများကို ပြန်ပို့ရန်
     rules:
       accept: လက်ခံပါ
       back: နောက်သို့
+      title: အခြေခံစည်းမျဉ်းအချို့
     security: လုံခြုံရေး
     set_new_password: စကားဝှက်အသစ် သတ်မှတ်ပါ။
+    setup:
+      email_below_hint_html: အောက်ဖော်ပြပါ အီးမေးလ်လိပ်စာ မှားယွင်းနေပါက ဤနေရာတွင် ပြောင်းလဲနိုင်ပြီး အတည်ပြုအီးမေးလ်အသစ် လက်ခံရရှိမည်ဖြစ်ပါသည်။
+      email_settings_hint_html: အတည်ပြုအီးမေးလ်ကို %{email} သို့ ပေးပို့ခဲ့သည်။ ထိုအီးမေးလ်လိပ်စာ မှားယွင်းနေပါက ၎င်းကို အကောင့်သတ်မှတ်ချက်များတွင် ပြောင်းလဲနိုင်သည်။
+      title: သတ်မှတ်
     sign_in:
+      preamble_html: သင်၏ <strong>%{domain}</strong> အထောက်အထားများဖြင့် ဝင်ရောက်ပါ။ သင့်အကောင့်ကို အခြားဆာဗာတစ်ခုတွင် ဖွင့်ထားပါက ဤနေရာ၌ အကောင့်ဝင်ရောက်နိုင်မည်မဟုတ်ပါ။
       title: "%{domain} သို့ အကောင့်ဝင်ရန်"
+    sign_up:
+      title: "%{domain} တွင် ထည့်သွင်းရန်။"
     status:
       account_status: အကောင့်အခြေအနေ
+      confirming: အီးမေးလ်အတည်ပြုချက် အပြီးသတ်ရန် စောင့်ဆိုင်းခြင်း
+      functional: သင့်အကောင့်မှာ အပြည့်အဝလုပ်ဆောင်နေပါပြီ။
+      view_strikes: သင့်အကောင့်ကို ဆန့်ကျင်သည့် ယခင်ကလုပ်ဆောင်ချက်များကို ကြည့်ပါ
     use_security_key: လုံခြုံရေးကီးကို သုံးပါ
   authorize_follow:
     already_following: သင်သည် ဤအကောင့်ကို စောင့်ကြည့်နေပြီဖြစ်ပါသည်
     already_requested: သင်သည် ထိုအကောင့်စောင့်ကြည့်ရန် တောင်းဆိုမှုတစ်ခု ပေးပို့ခဲ့ပြီးပါပြီ
     follow: စောင့်ကြည့်မယ်
     follow_request: သင်သည် စောင့်ကြည့်မည် တောင်းဆိုချက်တစ်ခု ပေးပို့ထားသည်-
+    following: သင် ယခု အောက်ပါအတိုင်း လုပ်ဆောင်နေပါသည် -
     post_follow:
       close: သို့မဟုတ် သင်သည် ဤဝင်းဒိုးကို ပိတ်နိုင်သည်
       return: အသုံးပြုသူ၏ ပရိုဖိုင်ကိုပြရန်
@@ -799,8 +953,13 @@ my:
     title: "%{acct} ကို စောင့်ကြည့်မယ်"
   challenge:
     confirm: ဆက်လုပ်မည်
+    hint_html: "<strong>အကြံပြုချက် -</strong> နောက်နာရီများတွင် သင့်စကားဝှက်ကို ထပ်မံတောင်းဆိုမည်မဟုတ်ပါ။"
     invalid_password: စကားဝှက် မမှန်ပါ
     prompt: ဆက်လက်လုပ်ဆောင်ရန်အတွက် စကားဝှက်အတည်ပြုပါ
+  crypto:
+    errors:
+      invalid_key: မှန်ကန်သော Ed25519 သို့မဟုတ် Curve25519 ကီး မဟုတ်ပါ။
+      invalid_signature: မှန်ကန်သော Ed25519 လက်မှတ်မဟုတ်ပါ
   date:
     formats:
       default: "%b %d, %Y"
@@ -820,38 +979,73 @@ my:
       x_months: "%{count}mo"
       x_seconds: "%{count}s"
   deletes:
+    challenge_not_passed: သင်ထည့်လိုက်သော အချက်အလက်မှာ မမှန်ပါ
     confirm_password: အထောက်အထားကိုအတည်ပြုရန်အတွက် သင့်လက်ရှိစကားဝှက်ကို ထည့်ပါ
     confirm_username: လုပ်ငန်းစဉ်ကို အတည်ပြုရန်အတွက် သင့်အသုံးပြုသူအမည်ကို ထည့်သွင်းပါ
     proceed: အကောင့်ဖျက်ပါ
     success_msg: သင့်အကောင့်ကို အောင်မြင်စွာ ဖျက်လိုက်ပါပြီ
     warning:
+      before: ရှေ့မဆက်မီ ဤမှတ်စုများကို သေချာဖတ်ပါ -
+      caches: အခြားဆာဗာများမှ ကက်ရှ်လုပ်ထားသော အကြောင်းအရာမှာ ဆက်ရှိနေနိုင်သည်
       data_removal: သင့်ပို့စ်များနှင့် အခြားအချက်အလက်များကို အပြီးတိုင် ဖယ်ရှားပါမည်
+      email_change_html: သင့်အကောင့်မဖျက်ဘဲ <a href="%{path}">သင့်အီးမေးလ်လိပ်စာကို ပြောင်းလဲနိုင်သည်</a>
+      email_contact_html: မရောက်သေးပါက အကူအညီအတွက် <a href="mailto:%{email}">%{email}</a> သို့ အီးမေးလ်ပို့နိုင်ပါသည်
+      email_reconfirmation_html: အတည်ပြုချက်အီးမေးလ် လက်ခံမရရှိပါက <a href="%{path}">ထပ်မံတောင်းဆိုနိုင်သည်</a>
+      irreversible: အကောင့်ကို ပြန်လည်ရယူရန် သို့မဟုတ် ပြန်လည်အသုံးပြုရန် မဖြစ်နိုင်တော့ပါ
+      more_details_html: အသေးစိတ်အချက်အလက်များအတွက်၊ <a href="%{terms_path}">ကိုယ်ရေးကိုယ်တာမူဝါဒ</a> ကို ကြည့်ပါ။
+      username_available: သင့်အသုံးပြုသူအမည်ကို ပြန်လည်ရရှိနိုင်ပါမည်
   disputes:
     strikes:
+      action_taken: ဆောင်ရွက်ခဲ့သည်
+      appeal: အယူခံဝင်ခြင်း
+      appeal_rejected: တင်သွင်းခြင်းကို ပယ်ချလိုက်သည်
+      appeal_submitted_at: အယူခံဝင်မှုကို တင်သွင်းပြီးချိန်
+      appealed_msg: အယူခံဝင်မှုကို တင်သွင်းပြီးဖြစ်သည်။ အတည်ပြုပြီးပါက အကြောင်းကြားပါမည်။
       appeals:
         submit: အယူခံဝင်ခွင့်ပြုရန်
+      approve_appeal: တင်သွင်းခြင်းကို အတည်ပြုပါ
+      associated_report: ဆက်စပ်အစီရင်ခံစာ
+      created_at: ရက်စွဲ
+      description_html: ဤအရာများမှာ သင့်အကောင့်နှင့် %{instance} မှ သင့်ထံပေးပို့ထားသော သတိပေးချက်များကို ဆန့်ကျင်သည့် လုပ်ဆောင်ချက်များဖြစ်သည်။
       recipient: လိပ်မူထားသည်
+      reject_appeal: တင်သွင်းခြင်းကို ပယ်ချပါ
       status: "#%{id} ပို့စ်"
+      status_removed: ပို့စ်ကို စနစ်မှ ဖယ်ရှားပြီးဖြစ်သည်
       title: "%{date} မှ %{action}"
       title_actions:
         delete_statuses: ပို့စ်ဖယ်ရှားခြင်း
+        disable: အကောင့်ပိတ်သိမ်းခြင်း
+        mark_statuses_as_sensitive: သတိထားရသောပို့စ်များအဖြစ် အမှတ်အသားပြုခြင်း
         none: သတိပေးချက်
+        sensitive: သတိထားရသောအကောင့်အဖြစ် အမှတ်အသားပြုခြင်း
+        silence: အကောင့်ကန့်သတ်ချက်
+        suspend: အကောင့်ပိတ်ခြင်း
+      your_appeal_approved: သင့်တင်သွင်းခြင်းကို အတည်ပြုပြီးပါပြီ
+      your_appeal_pending: အယူခံဝင်ရန် တင်သွင်းထားသည်
+      your_appeal_rejected: အယူခံဝင်မှုကို ပယ်ချလိုက်သည်
+  domain_validator:
+    invalid_domain: တရားဝင်ဒိုမိန်းအမည်မဟုတ်ပါ
   errors:
-    '400': The request you submitted was invalid or malformed.
-    '403': You don't have permission to view this page.
-    '404': The page you are looking for isn't here.
-    '406': This page is not available in the requested format.
-    '410': The page you were looking for doesn't exist here anymore.
+    '400': သင်တင်ပြသော တောင်းဆိုချက်မှာ မမှန်ကန်ပါ သို့မဟုတ် ပုံစံမမှန်ပါ။
+    '403': ဤစာမျက်နှာကြည့်ရှုရန် သင့်တွင် ခွင့်ပြုချက်မရှိပါ။
+    '404': သင်ရှာဖွေနေသော စာမျက်နှာသည် ဤနေရာတွင် မရှိပါ။
+    '406': ဤစာမျက်နှာကို တောင်းဆိုထားသော ပုံစံဖြင့် မရရှိနိုင်ပါ။
+    '410': သင်ရှာဖွေနေသည့် စာမျက်နှာသည် ဤနေရာတွင် မရှိတော့ပါ။
     '422':
       content: လုံခြုံရေး အတည်ပြုခြင်း မအောင်မြင်ပါ။ သင်သည် ကွတ်ကီးများကို ပိတ်ပင်ထားပါသလား။
+      title: လုံခြုံရေး အတည်ပြုခြင်း မအောင်မြင်ပါ
     '429': တောင်းဆိုမှု များနေပါသည်
     '500':
+      content: စိတ်မကောင်းပါ။ အဆုံးတွင် တစ်ခုမှားယွင်းသွားပါသည်။
       title: ဤစာမျက်နှာမှာ မမှန်ကန်ပါ
-    '503': The page could not be served due to a temporary server failure.
+    '503': ယာယီဆာဗာချို့ယွင်းမှုကြောင့် စာမျက်နှာကို ကြည့်ရှု၍မရပါ။
+  existing_username_validator:
+    not_found_multiple: "%{usernames} ကို ရှာမတွေ့ပါ"
   exports:
     archive_takeout:
       date: ရက်စွဲ
       download: သင်၏မှတ်တမ်းကို ဒေါင်းလုဒ်လုပ်ပါ
+      in_progress: သင့်မှတ်တမ်းကို ပြုစုနေသည်...
       request: မှတ်တမ်း တောင်းဆိုရန်
       size: အရွယ်အစား
     blocks: သင်ပိတ်ပင်ထားသည့်လူများစာရင်း
@@ -859,6 +1053,7 @@ my:
     csv: CSV
     domain_blocks: ဒိုမိန်းပိတ်ပင်ထားမှုများ
     lists: စာရင်းများ
+    mutes: အသံပိတ်
     storage: မီဒီယာသိုလှောင်မှု
   featured_tags:
     add_new: အသစ် ထည့်ပါ
@@ -884,6 +1079,8 @@ my:
         other: "%{count} အဓိကစကားလုံး"
       statuses:
         other: "%{count} ပို့စ်"
+      statuses_long:
+        other: တစ်ဦးချင်းပို့စ် %{count} များ ကို ဖျောက်ထားသည်
       title: စစ်ထုတ်ခြင်းများ
     new:
       save: စစ်ထုတ်မှုအသစ် သိမ်းပါ
@@ -896,21 +1093,39 @@ my:
         title: စစ်ထုတ်ထားသော ပို့စ်များ
   generic:
     all: အားလုံး
+    changes_saved_msg: အပြောင်းအလဲများကို သိမ်းဆည်းပြီးပါပြီ။
     copy: ကူးယူပါ
     delete: ဖျက်ပါ
+    deselect: အားလုံး ရွေးထားခြင်းကို ဖျက်မည်
+    none: တစ်ခုမျှ
+    order_by: စီထားသည်
     save_changes: ပြောင်းလဲမှုများကို သိမ်းဆည်းပါ
+    select_all_matching_items:
+      other: သင့်ရှာဖွေမှုနှင့် ကိုက်ညီသည့် %{count} ခု အားလုံးကို ရွေးပါ။
     today: ယနေ့
+    validation_errors:
+      other: မမှန်သေးပါ။ ကျေးဇူးပြု၍ အောက်ပါ %{count} အမှားများကို ပြန်လည်သုံးသပ်ပါ
   imports:
+    errors:
+      invalid_csv_file: မမှန်ကန်သော CSV ဖိုင်။ အမှား - %{error}
+      over_rows_processing_limit: "%{count} တန်းထက် ပိုနေပါသည်"
     modes:
       merge: ပေါင်း
+      merge_long: ရှိပြီးသားမှတ်တမ်းများ သိမ်းဆည်းပြီး အသစ်များ ထပ်ထည့်ပါ
+      overwrite: ထပ်ရေးရန်
+      overwrite_long: လက်ရှိမှတ်တမ်းများကို အသစ်များဖြင့် အစားထိုးပါ
     preface: သင်စောင့်ကြည့်နေသည့်လူများစာရင်း သို့မဟုတ် ပိတ်ပင်ထားသည့်စာရင်းကဲ့သို့သော အခြားဆာဗာတစ်ခုမှ သင်ထုတ်ယူထားသည့်အချက်အလက်များကို ပြန်လည်ထည့်သွင်းနိုင်သည်။
+    success: သင့်အချက်အလက်ကို အပ်လုဒ်လုပ်ပြီး သတ်မှတ်ချိန်အတွင်း ဆောင်ရွက်ပါမည်
     types:
       blocking: ပိတ်ပင်ထားသည့်စာရင်း
       bookmarks: Bookmarks
       domain_blocking: ဒိုမိန်းပိတ်ပင်ထားသည့်စာရင်း
       following: စောင့်ကြည့်စာရင်း
+      muting: ပိတ်ထားသောစာရင်း
     upload: တင္ရန်
   invites:
+    delete: အကောင့်ပိတ်ရန်
+    expired: သက်တမ်းကုန်သွားပါပြီ
     expires_in:
       '1800': ၃၀ မိနစ်
       '21600': ၆ နာရီ
@@ -918,33 +1133,78 @@ my:
       '43200': ၁၂ နာရီ
       '604800': ၁ ပတ်
       '86400': ၁ ရက်
+    expires_in_prompt: ဘယ်တော့မှ
+    generate: ဖိတ်ကြားချက်လင့်ခ် ဖန်တီးပါ
+    invited_by: သင့်ကို ဖိတ်ခေါ်ထားသည် -
+    max_uses:
+      other: "%{count} အသုံးပြုမှုများ"
     max_uses_prompt: အကန့်အသတ်မဲ့
+    prompt: ဤဆာဗာသို့ ဝင်ရောက်ရန်အတွက် လင့်ခ်များဖန်တီးပြီး အခြားသူများကို မျှဝေပါ
+    table:
+      expires_at: သက်တမ်းကုန်သည်
+      uses: အသုံးပြုမှုများ
     title: ဖိတ်ခေါ်ရန်
+  lists:
+    errors:
+      limit: သင်သည် အများဆုံးစာရင်း အရေအတွက်သို့ ရောက်ရှိသွားပါပြီ
   login_activities:
     authentication_methods:
       otp: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်အက်ပ်
       password: စကားဝှက်
       sign_in_token: အီးမေးလ်လုံခြုံရေးကုဒ်
       webauthn: လုံခြုံရေးကီးများ
+    description_html: သင်မပြုလုပ်သည့် လုပ်ဆောင်ချက်တွေ့ရှိပါက သင့်စကားဝှက်ကို ပြောင်းလဲပြီး နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ကို အသုံးပြုသင့်ပါသည်။
+    empty: စစ်မှန်ကြောင်းအထောက်အထားမရရှိနိုင်ပါ
+    failed_sign_in_html: "%{ip} (%{browser}) မှ %{method} ဖြင့် အကောင့်ဝင်ရောက်ခြင်း မအောင်မြင်ပါ"
+    successful_sign_in_html: "%{ip} (%{browser}) မှ %{method} ဖြင့် အကောင့်ဝင်၍ရပါပြီ"
+    title: အထောက်အထားမှတ်တမ်း
   media_attachments:
     validations:
       images_and_video: ရုပ်ပုံပါရှိပြီးသားပို့စ်တွင် ဗီဒီယို ပူးတွဲ၍မရပါ
+      not_ready: မပြီးသေးသောဖိုင်များကို ပူးတွဲ၍မရပါ။ ခဏအကြာတွင် ထပ်စမ်းကြည့်ပါ။
+      too_many: ဖိုင် ၄ ဖိုင်ထက် ပို၍တွဲမရပါ
   migrations:
     acct: သို့ ပြောင်းရွှေ့ရန်
     cancel: ပြန်ညွှန်းခြင်းကို ပယ်ဖျက်ရန်
+    cancelled_msg: ပြန်ညွှန်းခြင်းကို ပယ်ဖျက်ပြီးပါပြီ။
     errors:
+      already_moved: သင်ပြောင်းရွှေ့ပြီးသော အကောင့်နှင့် တူညီပါသည်
       missing_also_known_as: ဤအကောင့်၏ အမည်တူမဟုတ်ပါ
       move_to_self: လက်ရှိအကောင့်မဖြစ်နိုင်ပါ
       not_found: ရှာမတွေ့ပါ
+    followers_count: ပြောင်းရွှေ့ချိန်၌ စောင့်ကြည့်သူများအရေအတွက်
+    incoming_migrations: အခြားအကောင့်တစ်ခုမှ ပြောင်းရွှေ့ခြင်း
     incoming_migrations_html: အခြားအကောင့်မှ ဤအကောင့်သို့ ရွှေ့ရန် ဦးစွာ သင်သည် <a href="%{path}">အကောင့်အမည်တူတစ်ခု ဖန်တီးရန်</a> လိုအပ်ပါသည်။
+    moved_msg: သင့်အကောင့်မှာ ယခု %{acct} သို့ ပြန်ညွှန်းနေပြီး စောင့်ကြည့်သူများကို ရွှေ့ပြောင်းနေလျက်ရှိပါသည်။
+    not_redirecting: သင့်အကောင့်သည် လက်ရှိတွင် အခြားအကောင့်တစ်ခုသို့ ပြန်ညွှန်းနေခြင်းမဟုတ်ပါ။
+    on_cooldown: မကြာသေးမီက သင့်အကောင့်ကို ပြောင်းရွှေ့ခဲ့သည်။ ဤလုပ်ဆောင်ချက်ကို %{count} ရက်များတွင် ထပ်မံရရှိနိုင်ပါမည်။
+    past_migrations: ယခင်ရွှေ့ပြောင်းမှုများ
     proceed_with_move: စောင့်ကြည့်သူများကို ရွှေ့ရန်
+    redirected_msg: သင့်အကောင့်သည် %{acct} သို့ ယခုပြန်ညွှန်းနေပါသည်။
+    redirecting_to: သင့်အကောင့်က %{acct} သို့ ပြန်ညွှန်းနေသည်။
+    set_redirect: ပြန်ညွှန်းသတ်မှတ်ပါ
     warning:
+      backreference_required: အကောင့်အသစ်က ဤအကောင့်ကို ပြန်ကိုးကားရန်အတွက် ဦးစွာ ပြင်ဆင်သတ်မှတ်ရပါမည်
+      before: ဆက်လက်မလုပ်ဆောင်မီ ဤမှတ်စုများကို သေချာဖတ်ပါ -
+      cooldown: ရွှေ့ပြီးပါက နောက်တစ်ကြိမ် ထပ်ရွှေ့ရန် အချိန်စောင့်ရပါမည်
+      followers: ဤလုပ်ဆောင်ချက်မှာ စောင့်ကြည့်သူအားလုံးကို လက်ရှိအကောင့်မှ အကောင့်အသစ်သို့ ရွှေ့ပြောင်းခြင်းဖြစ်သည်
       only_redirect_html: တနည်းအားဖြင့် သင်သည် <a href="%{path}">သင့်ပရိုဖိုင်ပေါ်တွင် ပြန်ညွှန်းခြင်းကိုသာ ပြုလုပ်နိုင်သည်</a>။
+      other_data: အခြားအချက်အလက်များကို အလိုအလျောက်ရွှေ့မည်မဟုတ်ပါ
       redirect: သင့်လက်ရှိအကောင့်၏ပရိုဖိုင်ကို ပြန်လည်ညွှန်းပေးသည့်အသိပေးချက်ဖြင့် ပြင်ဆင်ပေးမည်ဖြစ်ပြီး ရှာဖွေမှုများမှ ဖယ်ထုတ်ပေးမည်ဖြစ်သည်
   moderation:
     title: စိစစ်ခြင်း
+  move_handler:
+    carry_blocks_over_text: ဤအသုံးပြုသူသည် သင်ပိတ်ဆို့ထားသော %{acct} မှ ပြောင်းရွှေ့ခဲ့သည်။
+    carry_mutes_over_text: ဤအသုံးပြုသူသည် သင်အသံပိတ်ထားသော %{acct} မှ ပြောင်းရွှေ့ခဲ့သည်။
+    copy_account_note_text: ဤအသုံးပြုသူသည် %{acct} မှ ပြောင်းရွှေ့ခဲ့သည်။ ဤသည်မှာ ၎င်းတို့နှင့်ပတ်သက်သော ယခင်မှတ်စုများဖြစ်သည် -
+  navigation:
+    toggle_menu: 'မီနူးပြောင်းရန်
+
+      '
   notification_mailer:
     admin:
+      report:
+        subject: "%{name} က တိုင်ကြားစာတစ်စောင် ပို့ခဲ့သည်"
       sign_up:
         subject: "%{name} က အကောင့်ဖွင့်ထားသည်"
     favourite:
@@ -957,17 +1217,28 @@ my:
       title: စောင့်ကြည့်သူအသစ်
     follow_request:
       action: စောင့်ကြည့်ရန်တောင်းဆိုမှုများကို ပြင်ဆင်ရန်
+      body: "%{name} က သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုထားသည်"
+      subject: ဆိုင်းငံ့ထားသော စောင့်ကြည့်သူ - %{name}
       title: စောင့်ကြည့်ခွင့်ပြုရန် တောင်းဆိုမှုအသစ်
     mention:
       action: စာပြန်ရန်
       body: သင့်ကို %{name} မှ ဖော်ပြခဲ့သည်-
       subject: သင့်ကို %{name} မှ ဖော်ပြခဲ့သည်
+      title: ဖော်ပြမှုအသစ်
+    poll:
+      subject: "%{name} ၏ စစ်တမ်းတစ်ခု ပြီးသွားပါပြီ"
     reblog:
+      body: "%{name} က သင့်ပို့စ်ကို  Boost လုပ်ခဲ့သည် -"
+      subject: "%{name} က သင့်ပို့စ်ကို Boost လုပ်ခဲ့သည်"
       title: Boost အသစ်
     status:
       subject: "%{name} က အခုလေးတင် ပို့စ်တင်လိုက်ပါပြီ"
     update:
       subject: "%{name} က ပို့စ်တစ်ခုကို ပြင်ဆင်ခဲ့သည်"
+  notifications:
+    email_events: အီးမေးလ်သတိပေးချက်များအတွက်အကြောင်းအရာများ
+    email_events_hint: အသိပေးချက်များရယူမည့် အစီအစဉ်များကို ရွေးပါ -
+    other_settings: အခြားအသိပေးချက်များ၏ သတ်မှတ်ချက်များ
   number:
     human:
       decimal_units:
@@ -979,7 +1250,11 @@ my:
           thousand: K
           trillion: T
   otp_authentication:
+    code_hint: အတည်ပြုရန်အတွက် အထောက်အထားစိစစ်အက်ပ်မှ ထုတ်ပေးသည့်ကုဒ်ကို ထည့်သွင်းပါ
     enable: ဖွင့်ပါ
+    manual_instructions: QR ကုဒ်စကင်န်ဖတ်၍မရပါက ကိုယ်တိုင်ရိုက်ထည့်ရန်လိုအပ်ပြီး ဤနေရာသည် စာရွက်အလွတ်နေရာဖြစ်သည်။
+    setup: သတ်မှတ်ရန်
+    wrong_code: ထည့်သွင်းထားသောကုဒ်သည် မမှန်ကန်ပါ။ ဆာဗာအချိန်နှင့် စက်အချိန်မှာ မှန်ကန်ပါသလား။
   pagination:
     newer: ပိုသစ်သော
     next: ရှေ့သို့
@@ -999,14 +1274,20 @@ my:
       too_many_options: သတ်မှတ်ထားသောအရေအတွက် %{max} ကိုကျော်လွန်နေသည်
   preferences:
     other: အခြား
+    posting_defaults: ပို့စ်တင်ရာတွင် သတ်မှတ်ချက်များ
     public_timelines: အများမြင်စာမျက်နှာ
   privacy_policy:
     title: ကိုယ်ရေးအချက်အလက်မူဝါဒ
+  reactions:
+    errors:
+      limit_reached: မတူညီသော တုံ့ပြန်မှုများ၏ ကန့်သတ်ချက်သို့ ရောက်ရှိခဲ့သည်။
+      unrecognized_emoji: အသိအမှတ်ပြုထားသော အီမိုဂျီမဟုတ်ပါ
   relationships:
     activity: အကောင့်လုပ်ဆောင်ချက်
     confirm_follow_selected_followers: ရွေးချယ်စောင့်ကြည့်သူများကို စောင့်ကြည့်လိုသည်မှာ သေချာပါသလား။
     confirm_remove_selected_followers: ရွေးချယ်စောင့်ကြည့်သူများကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။
     confirm_remove_selected_follows: ရွေးချယ်စောင့်ကြည့်သူများကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။
+    dormant: Dormant
     follow_failure: ရွေးချယ်ထားသော အကောင့်အချို့ကို စောင့်ကြည့်၍ရမည်မဟုတ်ပါ။
     follow_selected_followers: ရွေးချယ်စောင့်ကြည့်သူများကို စောင့်ကြည့်ပါ
     followers: စောင့်ကြည့်သူများ
@@ -1024,11 +1305,18 @@ my:
     status: အကောင့်အခြေအနေ
   remote_follow:
     missing_resource: သင့်အကောင့်အတွက် လိုအပ်သော ပြန်ညွှန်းမည့် URL ကို ရှာမတွေ့ပါ
+  reports:
+    errors:
+      invalid_rules: မှန်ကန်သောစည်းမျဉ်းများကို ကိုးကားထားခြင်း မရှိပါ
   rss:
     content_warning: 'အကြောင်းအရာသတိပေးချက် - '
     descriptions:
       account: "@%{acct} မှ အများမြင်ပို့စ်များ"
       tag: "#%{hashtag} ကို တဂ်ထားသော အများမြင်ပို့စ်များ"
+  scheduled_statuses:
+    over_daily_limit: ယနေ့အတွက် စီစဉ်ထားသည့် ပို့စ်များ၏ ကန့်သတ်ချက် %{limit} ကို ကျော်လွန်သွားပါပြီ
+    over_total_limit: စီစဉ်ထားသည့် ပို့စ်များ၏ ကန့်သတ်ချက် %{limit} ကို ကျော်လွန်သွားပါပြီ
+    too_soon: စီစဉ်ထားသောရက်စွဲမှာ အနာဂတ်အတွက်ဖြစ်သည်
   sessions:
     activity: နောက်ဆုံးလုပ်ဆောင်ချက်
     browser: ဘရောက်ဇာ
@@ -1054,6 +1342,7 @@ my:
       weibo: Weibo
     current_session: လက်ရှိဆက်ရှင်
     description: "%{platform} ပေါ်ရှိ %{browser}"
+    explanation: ဤသည်မှာ သင်၏ Mastodon အကောင့်သို့ လက်ရှိဝင်ရောက်ထားသည့် ဝဘ်ဘရောက်ဆာများဖြစ်သည်။
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1081,14 +1370,19 @@ my:
     authorized_apps: ခွင့်ပြုထားသောအက်ပ်များ
     back: Mastodon သို့ ပြန်သွားရန်
     delete: အကောင့်ဖျက်သိမ်းခြင်း
+    development: Development
     edit_profile: ပရိုဖိုင်ပြင်ဆင်ရန်
     export: အချက်အလက်ထုတ်ယူခြင်း
+    featured_tags: အသားပေးဖော်ပြထားသည့် ဟက်ရှ်တဂျ်များ
     import: ထည့်သွင်းခြင်း
+    import_and_export: ထည့်သွင်းခြင်းနှင့် ထုတ်ယူခြင်း
+    migrate: အကောင့်ပြောင်းရွှေ့ခြင်း
     notifications: အသိပေးချက်များ
     preferences: သတ်မှတ်ချက်များ
     profile: ပရိုဖိုင်
     relationships: စောင့်ကြည့်သူများနှင့် စောင့်ကြည့်စာရင်း
     statuses_cleanup: အလိုအလျောက်ပို့စ်ဖျက်ခြင်း
+    strikes: စိစစ်လုပ်ဆောင်ချက်များ
     two_factor_authentication: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်
     webauthn_authentication: လုံခြုံရေးကီးများ
   statuses:
@@ -1106,8 +1400,14 @@ my:
     disallowed_hashtags:
       other: ခွင့်မပြုထားသော hashtags များပါရှိသည် - %{tags}
     edited_at_html: "%{date} ကို ပြင်ဆင်ပြီးပါပြီ"
+    errors:
+      in_reply_not_found: သင် စာပြန်နေသည့်ပို့စ်မှာ မရှိတော့ပါ။
     open_in_web: ဝဘ်တွင် ဖွင့်ပါ
+    over_character_limit: စာလုံးကန့်သတ်ချက် %{max} ကို ကျော်လွန်သွားပါပြီ
     pin_errors:
+      direct: အမည်ဖော်ပြထားသည့် ပို့စ်များကို ပင်တွဲ၍မရပါ
+      limit: သင်သည် ပို့စ်အရေအတွက်အများဆုံးကို ပင်တွဲထားပြီးဖြစ်သည်
+      ownership: အခြားသူ၏ပို့စ်ကို ပင်တွဲ၍မရပါ
       reblog: Boost လုပ်ထားသောပို့စ်ကို ပင်ထား၍မရပါ
     poll:
       total_people:
@@ -1131,16 +1431,25 @@ my:
       unlisted_long: လူတိုင်းမြင်နိုင်သော်လည်း အများမြင်မည့်စာမျက်နှာများတွင် စာရင်းမသွင်းထားပါ။
   statuses_cleanup:
     enabled: ပို့စ်အဟောင်းများကို အလိုအလျောက် ဖျက်ပါ
+    enabled_hint: အောက်ပါခြွင်းချက်များထဲမှ တစ်ခုနှင့် မကိုက်ညီပါက သတ်မှတ်ထားသည့်ကာလအပိုင်းအခြားသို့ ရောက်သည်နှင့် သင့်ပို့စ်များကို အလိုအလျောက် ဖျက်ပါမည်
+    exceptions: ခြွင်းချက်များ
+    explanation: ပို့စ်များကို ဖျက်ခြင်းသည် စျေးကြီးသော လုပ်ဆောင်မှုတစ်ခုဖြစ်သောကြောင့်၊ ဆာဗာမှမဟုတ်ရင် အလုပ်ရှုပ်နေချိန်တွင် အချိန်ကြာလာသည်နှင့်အမျှ ၎င်းကို ဖြည်းဖြည်းချင်း လုပ်ဆောင်ပါသည်။ ထို့ကြောင့်၊ သင့်ပို့စ်များသည် အချိန်သတ်မှတ်ချက်သို့ရောက်ရှိပြီးနောက် ခဏအကြာတွင် ဖျက်လိုက်နိုင်ပါသည်။
     ignore_favs: နှစ်သက်မှုများကို လျစ်လျူရှုပါ
     ignore_reblogs: Boost များကို လျစ်လျူရှုပါ
+    interaction_exceptions: အပြန်အလှန်တုံ့ပြန်မှုများအပေါ်အခြေခံသည့် ခြွင်းချက်များ
+    interaction_exceptions_explanation: ပို့စ်များသည် အကြိုက်ဆုံးအဆင့်အောက်သို့ရောက်သွားပါက သို့မဟုတ် ၎င်းတို့ကို တစ်ကြိမ်ကျော်ပြီးပါက ဖျက်ပစ်ရန် အာမခံချက်မရှိကြောင်း သတိပြုပါ။
     keep_direct: တိုက်ရိုက်မက်ဆေ့ချ်များကို သိမ်းထားပါ
     keep_direct_hint: တိုက်ရိုက်စကားပြောထားသည်များကို မဖျက်ပါနှင့်
     keep_media: မီဒီယာဖိုင်များပါသောပို့စ်များကို သိမ်းဆည်းပါ
     keep_media_hint: မီဒီယာဖိုင်များပါသောပို့စ်များကို မဖျက်ပါနှင့်
     keep_pinned: ပင်ထိုးထားသော ပို့စ်များကို သိမ်းထားပါ
+    keep_pinned_hint: ပင်ထိုးထားသော ပို့စ်များကို မဖျက်ပါ
     keep_polls: စစ်တမ်းကိုဆက်လက်ထားမည်
     keep_polls_hint: သင့်မှတ်တမ်းတစ်ခုမှ မပျက်ပါ
+    keep_self_bookmark: မှတ်ထားသောပို့စ်များကို သိမ်းဆည်းပါ
+    keep_self_bookmark_hint: မှတ်ထားပြီးသော ပို့စ်များကို မဖျက်ပါနှင့်
     keep_self_fav: သင်နှစ်သက်ခဲ့သောပို့စ်များကို သိမ်းထားပါ
+    keep_self_fav_hint: နှစ်သက်ထားပြီးသော ပို့စ်များကို မဖျက်ပါနှင့်
     min_age:
       '1209600': ၂ ပတ်
       '15778476': ၆ လ
@@ -1150,10 +1459,20 @@ my:
       '604800': ၁ ပတ်
       '63113904': ၂ နှစ်
       '7889238': ၃ လ
+    min_age_label: ကာလအပိုင်းအခြား
+    min_favs: အနည်းဆုံးအားဖြင့် နှစ်သက်သည့်ပို့စ်များကို သိမ်းဆည်းပါ
+    min_favs_hint: အနည်းဆုံး ဤအကြိုက်ဆုံးအရေအတွက်ကို လက်ခံရရှိထားသည့် သင့်ပို့စ်များကို မဖျက်ပါ။ ပို့စ်များကို ၎င်းတို့၏ စိတ်ကြိုက်အရေအတွက်မခွဲခြားဘဲ ဖျက်ရန် ချန်ထားပါ။
+    min_reblogs: အနည်းဆုံးအားဖြင့် Boost လုပ်ထားသည့်ပို့စ်များကို သိမ်းဆည်းပါ
+    min_reblogs_hint: အနည်းဆုံး ဤအကြိမ်အရေအတွက်ကို မြှင့်တင်ထားသည့် သင့်ပို့စ်များကို မဖျက်ပါ။ ၎င်းတို့၏ မြှင့်တင်မှုအရေအတွက်ကို မခွဲခြားဘဲ ပို့စ်များကို ဖျက်ရန် ချန်ထားပါ
   stream_entries:
     pinned: ပင်တွဲထားသောပို့စ်
     reblogged: Boost လုပ်ခဲ့သည်
     sensitive_content: သတိထားရသော အကြောင်းအရာ
+  strikes:
+    errors:
+      too_late: ဤလုပ်ဆောင်ချက်တင်ပြရန် နောက်ကျသွားပါပြီ
+  tags:
+    does_not_match_previous_name: ယခင်အမည်နှင့် မကိုက်ညီပါ
   themes:
     default: Mastodon (အနက်)
     mastodon-light: Mastodon (အလင်းနောက်ခံ)
@@ -1169,33 +1488,55 @@ my:
     edit: ပြင်ဆင်ရန်
     enabled: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ကို ဖွင့်ထားသည်
     enabled_success: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ကို ဖွင့်ပြီးပါပြီ
+    generate_recovery_codes: ပြန်လည်ရယူရေးကုဒ်များ ဖန်တီးပါ
+    lost_recovery_codes: သင့်ဖုန်းပျောက်ဆုံးသွားပါက ပြန်လည်ရယူခြင်းကုဒ်များသည် သင့်အကောင့်သို့ ပြန်လည်ဝင်ရောက်ခွင့်ရရှိစေမည်ဖြစ်သည်။ သင်၏ ပြန်လည်ရယူရေးကုဒ်များ ပျောက်ဆုံးသွားပါက ၎င်းတို့ကို ဤနေရာတွင် ပြန်လည်ထုတ်ပေးနိုင်ပါသည်။ သင်၏ ပြန်လည်ရယူရေး ကုဒ်ဟောင်းများ ပျက်သွားပါမည်။
     methods: နှစ်ဆင့်ခံလုံခြုံရေးနည်းလမ်းများ
     otp: Authenticator အက်ပ်
     recovery_codes: အရန်ပြန်လည်ရယူရေးကုဒ်များ
+    recovery_codes_regenerated: ပြန်လည်ရယူရေးကုဒ်များကို ပြန်ထုတ်ပေးပြီးပါပြီ
+    recovery_instructions_html: သင့်ဖုန်းသို့ ဝင်ရောက်သုံးစွဲခွင့် ဆုံးရှုံးခဲ့ဖူးပါက၊ သင့်အကောင့်သို့ ပြန်လည်ဝင်ရောက်ခွင့်ရရန် အောက်ပါ ပြန်လည်ရယူရေးကုဒ်များထဲမှ တစ်ခုကို အသုံးပြုနိုင်ပါသည်။ <strong>ပြန်လည်ရယူရေးကုဒ်များကို လုံခြုံအောင်ထားပါ။</strong> ဥပမာအားဖြင့်၊ သင်သည် ၎င်းတို့ကို ပရင့်ထုတ်ပြီး အခြားအရေးကြီးစာရွက်စာတမ်းများဖြင့် သိမ်းဆည်းနိုင်သည်။
     webauthn: လုံခြုံရေးကီးများ
   user_mailer:
     appeal_approved:
       action: သင့်အကောင့်သို့ သွားပါ
+      explanation: "%{appeal_date} တွင် သင်တင်သွင်းခဲ့သည့် %{strike_date} တွင် သင့်အကောင့်ကို ဆန့်ကျင်သည့် တိုင်ချက်၏ အယူခံဝင်မှုကို အတည်ပြုပြီးဖြစ်သည်။ သင့်အကောင့်သည် ကောင်းမွန်သောအနေအထားတွင် ရှိနေပြန်သည်။"
+      subject: "%{date} တွင် သင့်အယူခံဝင်ချက်ကို အတည်ပြုပြီးပါပြီ"
+      title: အယူခံဝင်သည်
     appeal_rejected:
+      explanation: "%{appeal_date} တွင် သင်တင်သွင်းခဲ့သည့် %{strike_date} တွင် သင့်အကောင့်ကို ဆန့်ကျင်သည့် တိုင်ချက်၏ အယူခံဝင်မှုကို ပယ်ချခဲ့သည်။"
+      subject: "%{date} တွင် သင့်တင်ပြချက်ကို ပယ်ချခဲ့သည်"
       title: အယူခံကို ပယ်ချခဲ့သည်
+    backup_ready:
+      explanation: သင့် Mastodon အကောင့် အရန်ကူးယူရန် တောင်းဆိုပြီးဖြစ်သည်။ ယခု ဒေါင်းလုဒ်လုပ်နိုင်ပါပြီ။
+      subject: သင့်မှတ်တမ်း ဒေါင်းလုဒ်ဆွဲရန် အသင့်ဖြစ်ပါပြီ
     suspicious_sign_in:
       change_password: သင်၏ စကားဝှက်ပြောင်းလဲပါ
       details: ဤသည်မှာ အကောင့်ဝင်ရောက်ခြင်းအတွက် အသေးစိတ်အချက်များဖြစ်သည် -
       explanation: IP လိပ်စာအသစ်တစ်ခုမှနေ၍ သင့်အကောင့်ဝင်ရောက်သည်ကို တွေ့ရှိခဲ့ပါသည်။
+      further_actions_html: သင် မဟုတ်ပါက သင့်အကောင့်လုံခြုံစေရန်အတွက် %{action} ကို ချက်ချင်းဆောင်ရွက်ပြီး နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ဖွင့်ထားရန် အကြံပြုပါသည်။
+      subject: သင့်အကောင့်ကို IP လိပ်စာအသစ်တစ်ခုမှ ဝင်ရောက်အသုံးပြုလျက်ရှိသည်
       title: အကောင့်ဝင်ရောက်မှုအသစ်
     warning:
       appeal: အယူခံတင်သွင်းပါ
+      appeal_description: အမှားအယွင်းတစ်ခုဟု သင်ယုံကြည်ပါက %{instance} ဝန်ထမ်းများထံ တင်ပြနိုင်သည်။
       categories:
         spam: Spam
+        violation: အကြောင်းအရာသည် အောက်ပါကွန်မြူနတီလမ်းညွှန်ချက်များကို ချိုးဖောက်သည်။
       explanation:
+        delete_statuses: သင့်ပို့စ်အချို့သည် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော ကွန်မြူနတီလမ်းညွှန်ချက်များကို ချိုးဖောက်ကြောင်း တွေ့ရှိပြီး %{instance} ၏ ကြီးကြပ်သူများမှ ဖယ်ရှားလိုက်ပါသည်။
         disable: သင့်အကောင့်ကို အသုံးမပြုနိုင်တော့သော်လည်း သင့်ပရိုဖိုင်နှင့် အခြားအချက်အလက်များမှာ ကျန်ရှိနေမည်ဖြစ်သည်။ သင့်အချက်အလက်ကို မိတ္တူကူးရန်၊ အကောင့်သတ်မှတ်ချက်များကို ပြောင်းလဲရန် သို့မဟုတ် သင့်အကောင့်ဖျက်သိမ်းရန်တို့အတွက် အရန်သိမ်းဆည်းမှုအား သင် တောင်းဆိုနိုင်သည်။
+        silence: သင့်အကောင့်ကို ဆက်လက်အသုံးပြုနိုင်သော်လည်း သင့်စောင့်ကြည့်သူများသာ ဤဆာဗာတွင် သင့်ပို့စ်များကို မြင်နိုင်မည်ဖြစ်ပြီး အကြောင်းအရာခေါင်းစဉ်အမျိုးမျိုးမှ သင့်ကို ဖယ်ထုတ်ထားနိုင်သည်။ သို့သော် အခြားသူများက သင့်ကို စောင့်ကြည့်နေနိုင်ပါသေးသည်။
         suspend: သင့်အကောင့်ကို အသုံးမပြုနိုင်တော့သည့်အပြင် ပရိုဖိုင်နှင့် အခြားအချက်အလက်များကိုလည်း အသုံးပြု၍မရတော့ပါ။ သင့်အချက်အလက်ကို ရက်ပေါင်း ၃၀ ခန့်အတွင်း အပြည့်အဝ မဖယ်ရှားမချင်း အချက်အလက်များ အရန်ကူးယူရန်အတွက် အကောင့်သို့ ဝင်ရောက်နိုင်ပါသေးသည်။ သို့သော် အကောင့်ရပ်ဆိုင်းထားမှုရှောင်လွှဲခြင်းမှ ကာကွယ်ရန်အတွက် အခြေခံအချက်အလက်အချို့ကို ကျွန်ုပ်တို့ ထိန်းသိမ်းထားရပါမည်။
       reason: အကြောင်းပြချက် -
+      statuses: ကိုးကားထားသောပို့စ်များ -
       subject:
         delete_statuses: "%{acct} ရှိ သင့်ပို့စ်များကို ဖယ်ရှားလိုက်ပါပြီ"
+        disable: သင့်အကောင့် %{acct} ကို ပိတ်သိမ်းထားသည်
         mark_statuses_as_sensitive: "%{acct} ရှိ သင့်ပို့စ်များကို သတိထားရသောပို့စ်များအဖြစ် အမှတ်အသားပြုထားသည်"
         none: "%{acct} အတွက် သတိပေးချက်"
+        sensitive: "%{acct} ရှိ သင့်ပို့စ်များကို ယခုမှစပြီး သတိထားရသောပို့စ်များအဖြစ် အမှတ်အသားပြုပါမည်"
         silence: သင့်အကောင့် %{acct} ကို ကန့်သတ်ထားသည်
+        suspend: သင့်အကောင့် %{acct} ကို ဆိုင်းငံ့ထားသည်
       title:
         delete_statuses: ပို့စ်များကို ဖယ်ရှားခဲ့သည်
         disable: အကောင့်ပိတ်သွားပါပြီ။
@@ -1209,10 +1550,17 @@ my:
       edit_profile_step: ပရိုဖိုင်ဓာတ်ပုံတစ်ပုံ တင်ခြင်း၊ ဖော်ပြမည့်အမည် ပြောင်းလဲခြင်းနှင့် အခြားအရာများပြုလုပ်ခြင်းတို့ဖြင့် သင့်ပရိုဖိုင်ကို စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါသည်။ စောင့်ကြည့်သူအသစ်များ သင့်ကိုစောင့်ကြည့်ခွင့်မပြုမီ ပြန်လည်သုံးသပ်ရန်အတွက် ဆုံးဖြတ်နိုင်ပါသည်။
       explanation: ဤသည်မှာ သင် စတင်အသုံးပြုနိုင်ရန်အတွက် အကြံပြုချက်အချို့ဖြစ်ပါသည်
       final_action: ပို့စ် တင်ရန်
+      final_step: 'ပို့စ်စပြီး တင်နိုင်ပါပြီ။ စောင့်ကြည့်သူများမရှိသေးသော်လည်း သင့်အများမြင်ပို့စ်များကို ဒေသတွင်းစာမျက်နှာ သို့မဟုတ် ဟက်ရှ်တက်စာမျက်နှာတို့တွင် အခြားသူများက မြင်နိုင်ပါသည်။ #introductions ဟက်ရှ်တက်ဖြင့် သင့်ကိုယ်သင် မိတ်ဆက်နိုင်ပါသည်။'
+      full_handle: ကိုယ်တိုင်ထိန်းချုပ်နိုင်သည်
+      full_handle_hint: ဤသည်မှာ သင့်သူငယ်ချင်းများကို အခြားဆာဗာတစ်ခုမှ မက်ဆေ့ချ်ပို့နိုင်ကြောင်း သို့မဟုတ် စောင့်ကြည့်နိုင်ကြောင်း အသိပေးပါမည်။
       subject: Mastodon မှ လှိုက်လှဲစွာကြိုဆိုပါသည်။
+      title: "%{name} က ကြိုဆိုပါတယ်။"
   users:
     follow_limit_reached: လူ %{limit} ထက် ပိုပြီး စောင့်ကြည့်၍မရပါ
+    go_to_sso_account_settings: အထောက်အထားပေးသူ၏အကောင့်သတ်မှတ်ချက်များသို့ သွားပါ
     invalid_otp_token: မမှန်ကန်သော နှစ်ဆင့်ခံလုံခြုံရေးကုဒ်
+    otp_lost_help_html: နှစ်ခုစလုံးကို ဝင်ရောက်ခွင့် ဆုံးရှုံးသွားပါက %{email} နှင့် ဆက်သွယ်နိုင်ပါသည်
+    seamless_external_login: ပြင်ပဝန်ဆောင်မှုမှတစ်ဆင့် အကောင့်ဝင်ထားသောကြောင့် စကားဝှက်နှင့် အီးမေးလ်သတ်မှတ်ချက်များကို မရနိုင်ပါ။
     signed_in_as: အဖြစ် အကောင့်ဝင်ခဲ့သည် -
   verification:
     verification: စိစစ်ခြင်း
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 93e7c5502..93d99fa4c 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -812,6 +812,12 @@ nl:
         message_html: Je hebt voor deze server geen regels opgesteld.
       sidekiq_process_check:
         message_html: Er draait geen Sidekiqproces voor de wachtrij(en) %{value}. Controleer je Sidekiqconfiguratie
+      upload_check_privacy_error:
+        action: Klik hier voor meer informatie
+        message_html: "<strong>Uw webserver is verkeerd geconfigureerd. De privacy van uw gebruikers is in gevaar.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Klik hier voor meer informatie
+        message_html: "<strong>Je objectopslag is verkeerd geconfigureerd. De privacy van je gebruikers is in gevaar.</strong>"
     tags:
       review: Status beoordelen
       updated_msg: Instellingen hashtag succesvol bijgewerkt
@@ -1684,12 +1690,13 @@ nl:
       title: Welkom aan boord %{name}!
   users:
     follow_limit_reached: Je kunt niet meer dan %{limit} accounts volgen
+    go_to_sso_account_settings: Ga naar de accountinstellingen van uw identiteitsprovider
     invalid_otp_token: Ongeldige tweestaps-toegangscode
     otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email}
     seamless_external_login: Je bent ingelogd via een externe dienst, daarom zijn wachtwoorden en e-mailinstellingen niet beschikbaar.
     signed_in_as: 'Ingelogd als:'
   verification:
-    explanation_html: 'Je kunt <strong>jezelf verifiëren als de eigenaar van de links in de metadata van jouw profiel</strong>. Hiervoor moet op de gelinkte website een link terug naar jouw Mastodonprofiel staan. Deze link <strong>moet</strong> het <code>rel="me"</code>-attribuut bevatten. De omschrijving van de link maakt niet uit. Hier is een voorbeeld:'
+    explanation_html: 'Je kunt <strong>jezelf verifiëren als de eigenaar van de koppelingen in de metadata van jouw profiel</strong>. Hiervoor moet op de gekoppelde website een koppeling terug naar jouw Mastodonprofiel staan. Na het toevoegen van de koppeling moet je wellicht hier terug komen en je profiel opnieuw bewaren om de verificatie te bevestigen. Deze koppeling <strong>moet</strong> het <code>rel="me"</code>-attribuut bevatten. De omschrijving van de koppeling maakt niet uit. Hier is een voorbeeld:'
     verification: Verificatie
   webauthn_credentials:
     add: Nieuwe beveiligingssleutel toevoegen
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index ee496f272..ea4d2e09d 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -1659,7 +1659,6 @@ nn:
     seamless_external_login: Du er logga inn gjennom eit eksternt reiskap, so passord og e-postinstillingar er ikkje tilgjengelege.
     signed_in_as: 'Logga inn som:'
   verification:
-    explanation_html: 'Du kan <strong>bekrefte at du selv er eieren av lenkene i din profilmetadata</strong>. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Lenken tilbake <strong>må</strong> ha en <code>rel="me"</code>-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:'
     verification: Stadfesting
   webauthn_credentials:
     add: Legg til ny sikkerhetsnøkkel
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 9f22a1bdb..9f09db57e 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -1612,7 +1612,6 @@
     seamless_external_login: Du er logget inn via en ekstern tjeneste, så passord og e-post innstillinger er ikke tilgjengelige.
     signed_in_as: 'Innlogget som:'
   verification:
-    explanation_html: 'Du kan <strong>bekrefte at du selv er eieren av lenkene i din profilmetadata</strong>. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Lenken tilbake <strong>må</strong> ha en <code>rel="me"</code>-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:'
     verification: Bekreftelse
   webauthn_credentials:
     add: Legg til ny sikkerhetsnøkkel
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index fa23f0522..67005422b 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -1004,7 +1004,6 @@ oc:
     seamless_external_login: Sètz connectat via un servici extèrn, los paramètres de senhal e de corrièl son doncas pas disponibles.
     signed_in_as: 'Session a :'
   verification:
-    explanation_html: 'Podètz <strong>verificar vosautres meteisses coma proprietari dels ligams per las metadonadas de vòstre perfil</strong>. Per aquò far, lo site Web ligat deu conténer un ligam cap a vòstre perfil Mastodon. Lo ligam <strong>deu</strong> aver un atribut <code>rel="me"</code>. Lo contengut tèxte del ligam impòrta pas. Vaquí un exemple :'
     verification: Verificacion
   webauthn_credentials:
     add: Apondre una clau de seguretat novèla
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 66f01ccaa..771a1623e 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -840,6 +840,12 @@ pl:
         message_html: Nie zdefiniowano żadnych reguł serwera.
       sidekiq_process_check:
         message_html: Brak uruchomionego procesu Sidekiq dla kolejki(-ek) %{value}. Sprawdź konfigurację Sidekiq
+      upload_check_privacy_error:
+        action: Kliknij tutaj, aby dowiedzieć się więcej
+        message_html: "<strong>Twój serwer internetowy jest nieprawidłowo skonfigurowany. Prywatność twoich użytkowników jest zagrożona.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Kliknij tutaj, aby dowiedzieć się więcej
+        message_html: "<strong>Pamięć obiektu jest nieprawidłowa. Prywatność twoich użytkowników jest zagrożona.</strong>"
     tags:
       review: Stan przeglądu
       updated_msg: Pomyślnie uaktualniono ustawienia hashtagów
@@ -1748,6 +1754,7 @@ pl:
       title: Witaj na pokładzie, %{name}!
   users:
     follow_limit_reached: Nie możesz obserwować więcej niż %{limit} osób
+    go_to_sso_account_settings: Przejdź do ustawień konta dostawcy tożsamości
     invalid_otp_token: Kod uwierzytelniający jest niepoprawny
     otp_lost_help_html: Jeżeli utracisz dostęp do obu, możesz skontaktować się z %{email}
     seamless_external_login: Zalogowano z użyciem zewnętrznej usługi, więc ustawienia hasła i adresu e-mail nie są dostępne.
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 931c0009e..3669b52fc 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -441,8 +441,10 @@ pt-BR:
       import:
         description_html: Você está prestes a importar uma lista de boqueio de domínio. Por favor, revise esta lista com muito cuidado, especialmente se você mesmo não criou esta lista.
         existing_relationships_warning: Existem relações de seguimento
+        private_comment_description_html: 'Para ajudá-lo a rastrear de onde vêm os blocos importados, serão criados blocos importados com o seguinte comentário privado: <q>%{comment}</q>'
         private_comment_template: Importado de %{source} em %{date}
         title: Importar bloqueio de domínios
+      invalid_domain_block: 'Um ou mais blocos de domínio foram ignorados devido ao(s) seguinte(s) erro(s): %{error}'
       new:
         title: Importar bloqueio de domínios
       no_file: Nenhum arquivo selecionado
@@ -474,6 +476,7 @@ pt-BR:
       content_policies:
         comment: Nota interna
         description_html: Você pode definir políticas de conteúdo que serão aplicadas a todas as contas deste domínio e a qualquer um dos seus subdomínios.
+        limited_federation_mode_description_html: Você pode escolher se deseja permitir a associação com este domínio.
         policies:
           reject_media: Rejeitar mídia
           reject_reports: Rejeitar denúncias
@@ -578,7 +581,9 @@ pt-BR:
         other_description_html: Veja mais opções para controlar o comportamento da conta e personalizar a comunicação com a conta denunciada.
         resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, nenhuma violação será guardada e a denúncia será encerrada.
         silence_description_html: A conta ficará visível apenas para aqueles que já a seguem ou que a procuram manualmente, limitando severamente seu alcance. Pode ser revertido a qualquer momento. Fecha todas as denúncias desta conta.
+        suspend_description_html: A conta e todo o seu conteúdo ficará inacessível e, eventualmente, excluído e interagir com ela será impossível. Reversível dentro de 30 dias. Encerra todas as denúncias contra esta conta.
       actions_description_html: Decida que medidas tomar para resolver esta denúncia. Se você decidir punir a conta denunciada, ela receberá uma notificação por e-mail, exceto quando for selecionada a categoria <strong>spam</strong> for selecionada.
+      actions_description_remote_html: Decida quais medidas tomará para resolver esta denúncia. Isso só afetará como <strong>seu servidor</strong> se comunica com esta conta remota e manipula seu conteúdo.
       add_to_report: Adicionar mais à denúncia
       are_you_sure: Você tem certeza?
       assign_to_self: Atribuir para si
@@ -629,12 +634,16 @@ pt-BR:
           suspend_html: 'Você está prestes a <strong>suspender</strong> <strong>a conta de @%{acct}</strong>. Isso irá:'
         actions:
           delete_html: Remover as publicações ofensivas
+          mark_as_sensitive_html: Marcar a mídia de posts ofensivos como sensível
+          silence_html: Limitar firmemente o alcance de <strong>@%{acct}</strong>, tornando seus perfis e conteúdos apenas visíveis para pessoas que já os estão seguindo ou olhando manualmente o perfil
           suspend_html: Suspender <strong>@%{acct}</strong>, tornando seu perfil e conteúdo inacessíveis, impossibilitando a interação
         close_report: 'Marcar denúncia #%{id} como resolvida'
         close_reports_html: Marcar <strong>todas</strong> as denúncias contra <strong>@%{acct}</strong> como resolvidas
         delete_data_html: Exclua o perfil e o conteúdo de <strong>@%{acct}</strong> daqui a 30 dias, a menos que a suspensão seja desfeita nesse meio tempo
         preview_preamble_html: "<strong>@%{acct}</strong> receberá um aviso com o seguinte conteúdo:"
+        record_strike_html: Registre uma ação contra <strong>@%{acct}</strong> para te ajudar em futuras violações desta conta
         send_email_html: Enviar <strong>@%{acct}</strong> um e-mail de aviso
+        warning_placeholder: Argumentos adicionais para a ação de moderação.
       target_origin: Origem da conta denunciada
       title: Denúncias
       unassign: Desatribuir
@@ -803,6 +812,12 @@ pt-BR:
         message_html: Você não definiu nenhuma regra de servidor.
       sidekiq_process_check:
         message_html: Nenhum processo Sidekiq rodando para a(s) fila(s) %{value}. Por favor, revise a sua configuração para Sidekiq
+      upload_check_privacy_error:
+        action: Confira aqui para mais informações
+        message_html: "<strong>Seu servidor está mal configurado. A privacidade de seus usuários está em risco.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Confira aqui para mais informações
+        message_html: "<strong>Seu armazenamento de objetos está mal configurado. A privacidade de seus usuários está em risco.</strong>"
     tags:
       review: Status da revisão
       updated_msg: Configurações de hashtag atualizadas
@@ -825,6 +840,7 @@ pt-BR:
           other: Compartilhado por %{count} pessoas na última semana
         title: Em alta no momento
         usage_comparison: Compartilhado %{today} vezes hoje, em comparação com %{yesterday} de ontem
+      not_allowed_to_trend: Não tem permissão para criar tendências
       only_allowed: Somente permitido
       pending_review: Revisão pendente
       preview_card_providers:
@@ -1574,6 +1590,7 @@ pt-BR:
       '7889238': 3 meses
     min_age_label: Validade
     min_favs: Manter publicações favoritadas por ao menos
+    min_favs_hint: Não exclui suas publicações que receberam pelo menos esta quantidade de favoritos. Deixe em branco para excluir publicações independentemente da quantidade de favoritos
     min_reblogs: Manter publicações impulsionadas por ao menos
     min_reblogs_hint: Não exclui publicações que receberam pelo menos esta quantidade de impulsos. Deixe em branco para excluir publicações independentemente da quantidade de impulsos
   stream_entries:
@@ -1673,12 +1690,13 @@ pt-BR:
       title: Boas vindas, %{name}!
   users:
     follow_limit_reached: Você não pode seguir mais de %{limit} pessoas
+    go_to_sso_account_settings: Vá para as configurações de conta do seu provedor de identidade
     invalid_otp_token: Código de dois fatores inválido
     otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email}
     seamless_external_login: Você entrou usando um serviço externo, então configurações de e-mail e senha não estão disponíveis.
     signed_in_as: 'Entrou como:'
   verification:
-    explanation_html: 'Você pode <strong>verificar os links nos metadados do seu perfil</strong>. Para isso, o site citado deve conter um link de volta para o seu perfil do Mastodon. O link de volta <strong>deve</strong> conter um atributo <code>rel="me"</code>. O conteúdo ou texto do link não importa. Aqui está um exemplo:'
+    explanation_html: 'Você pode <strong>se verificar como proprietário dos links nos metadados do seu perfil</strong>. Para isso, o site vinculado deve conter um link de volta para o seu perfil de Mastodon. Depois de adicionar o link, talvez você precise voltar aqui e salvar novamente o seu perfil para que a verificação tenha efeito. O link de volta <strong>deve</strong> ter um atributo <code>rel="me"</code>. O conteúdo do texto do link não importa. Aqui está um exemplo:'
     verification: Verificação
   webauthn_credentials:
     add: Adicionar nova chave de segurança
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 082de57e3..67c9102e2 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -812,6 +812,12 @@ pt-PT:
         message_html: Não definiu nenhuma regra para a instância.
       sidekiq_process_check:
         message_html: Nenhum processo Sidekiq em execução para a(s) fila(s) %{value}. Reveja a configuração do seu Sidekiq
+      upload_check_privacy_error:
+        action: Verifique aqui para mais informações
+        message_html: "<strong>O seu servidor web está mal configurado. A privacidade dos seus utilizadores está em risco.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Verifique aqui para mais informações
+        message_html: "<strong>O seu armazenamento de objetos está mal configurado. A privacidade dos seus utilizadores está em risco.</strong>"
     tags:
       review: Estado da revisão
       updated_msg: 'Definições de #etiquetas correctamente actualizadas'
@@ -1684,12 +1690,13 @@ pt-PT:
       title: Bem-vindo a bordo, %{name}!
   users:
     follow_limit_reached: Não pode seguir mais do que %{limit} pessoas
+    go_to_sso_account_settings: Ir para as definições de conta do seu fornecedor de identidade
     invalid_otp_token: Código de autenticação inválido
     otp_lost_help_html: Se perdeu o acesso a ambos, pode entrar em contacto com %{email}
     seamless_external_login: Tu estás ligado via um serviço externo. Por isso, as configurações da palavra-passe e do e-mail não estão disponíveis.
     signed_in_as: 'Registado como:'
   verification:
-    explanation_html: 'Pode <strong>comprovar que é o dono das hiperligações nos metadados do seu perfil</strong>. Para isso, a página para a qual a ligação aponta tem de conter uma outra para o seu perfil do Mastodon. Essa ligação <strong>tem</strong> de ter um atributo <code>rel="me"</code>. O conteúdo do texto não é importante. Eis um exemplo:'
+    explanation_html: 'Pode <strong>comprovar que é o dono das hiperligações nos metadados do seu perfil</strong>. Para isso, a página para a qual a hiperligação aponta tem de conter uma outra para o seu perfil do Mastodon. Após adicionar a hiperligação, poderá ter de voltar aqui e voltar a guardar o seu perfil para que a verificação produza efeito. Essa hiperligação <strong>tem</strong> de ter um atributo <code>rel="me"</code>. O conteúdo do texto não é importante. Eis um exemplo:'
     verification: Verificação
   webauthn_credentials:
     add: Adicionar nova chave de segurança
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index f842988a2..32b0bdd2f 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -749,5 +749,4 @@ ro:
     seamless_external_login: Sunteți autentificat prin intermediul unui serviciu extern, astfel încât parola și setările de e-mail nu sunt disponibile.
     signed_in_as: 'Conectat ca:'
   verification:
-    explanation_html: 'Poți <strong>să te verifici ca proprietar al link-urilor din metadatele profilului tău</strong>. Pentru aceasta, site-ul web asociat trebuie să conțină un link înapoi la profilul tău. Link-ul înapoi <strong>trebuie</strong> să aibă un atribut <code>rel="me"</code>. Conținut textului link-ului nu contează. Iată un exemplu:'
     verification: Verificare
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 050ea2c25..f80aec27c 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -650,6 +650,7 @@ ru:
       statuses_description_html: Нарушающее правила содержимое будет процитировано при коммуникации с фигурирующим в жалобе аккаунтом
       summary:
         action_preambles:
+          delete_html: 'Вы собираетесь <strong>удалить</strong> некоторые посты <strong>@%{acct}</strong>. В результате этого:'
           suspend_html: 'Вы собираетесь <strong>заморозить</strong> учетную запись <strong>@%{acct}</strong>. В результате этого:'
         actions:
           delete_html: Удалить оскорбительные сообщения
@@ -1732,7 +1733,6 @@ ru:
     seamless_external_login: Вы залогинены через сторонний сервис, поэтому настройки e-mail и пароля недоступны.
     signed_in_as: 'Выполнен вход под именем:'
   verification:
-    explanation_html: 'Вы можете <strong>подтвердить владение</strong> любой из ссылок в таблице. Для этого страница по ссылке должна содержать обратную ссылку на ваш профиль Mastodon, а у самой ссылки <strong>должен</strong> атрибут <code>rel="me"</code>. Текст ссылки значения не имеет. Вот пример:'
     verification: Верификация ссылок
   webauthn_credentials:
     add: Добавить новый ключ безопасности
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index 7a46fe38a..307a44758 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -1020,7 +1020,6 @@ sc:
     seamless_external_login: As abertu sa sessione pro mèdiu de unu servìtziu esternu, e pro custa resone is cunfiguratziones de sa crae de intrada e de posta eletrònica non sunt a disponimentu.
     signed_in_as: 'Sessione aberta comente:'
   verification:
-    explanation_html: 'Ti podes <strong>verificare a sa sola comente mere de is ligòngios in is metadatos de su profilu tuo</strong>. Pro ddu fàghere su situ ligadu depet cuntènnere unu ligòngiu chi torret a su profilu de Mastodon tuo. Su ligòngiu in su situ <strong>depet</strong> tènnere un''atributu <code>rel="me"</code>. Su testu cuntenutu in su ligòngiu no est de importu. Custu est un''esèmpiu:'
     verification: Verìfica
   webauthn_credentials:
     add: Agiunghe una crae de seguresa noa
diff --git a/config/locales/sco.yml b/config/locales/sco.yml
index 04c3f192c..55d8e09a4 100644
--- a/config/locales/sco.yml
+++ b/config/locales/sco.yml
@@ -1627,7 +1627,6 @@ sco:
     seamless_external_login: Ye'r logged in via a external service, sae passwird an email settins urnae available.
     signed_in_as: 'Signt in as:'
   verification:
-    explanation_html: 'Ye kin <strong>verify yersel as the ainer o the links in yer profile metadata</strong>. Fir that, the linkt wabsteid haes tae contain a link back tae yer Mastodon profile. The link back <strong>haes tae</strong> hae a <code>rel="me"</code> attribute. The text content o the link disnae maitter. Here a example:'
     verification: Verification
   webauthn_credentials:
     add: Add new security key
diff --git a/config/locales/si.yml b/config/locales/si.yml
index 4a5321524..c34df2986 100644
--- a/config/locales/si.yml
+++ b/config/locales/si.yml
@@ -1413,7 +1413,6 @@ si:
     seamless_external_login: ඔබ බාහිර සේවාවක් හරහා ලොග් වී ඇත, එබැවින් මුරපදය සහ ඊමේල් සැකසුම් නොමැත.
     signed_in_as: 'මෙසේ පුරනය වී ඇත:'
   verification:
-    explanation_html: 'ඔබගේ පැතිකඩ පාරදත්ත</strong>හි ඇති සබැඳි වල හිමිකරු ලෙස ඔබට <strong>සත්‍යාපනය කළ හැක. ඒ සඳහා, සම්බන්ධිත වෙබ් අඩවියේ ඔබේ Mastodon පැතිකඩ වෙත ආපසු සබැඳියක් තිබිය යුතුය. සබැඳිය ආපසු <strong></code> </strong> <code>යුතුය. සබැඳියේ පෙළ අන්තර්ගතය වැදගත් නොවේ. මෙන්න උදාහරණයක්:'
     verification: සත්යාපනය
   webauthn_credentials:
     add: නව ආරක්ෂක යතුර එක් කරන්න
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index ac5e0a8ce..b96cf0cd7 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -91,13 +91,13 @@ fi:
         site_short_description: Lyhyt kuvaus auttaa yksilöimään palvelimesi. Kuka sitä johtaa, kenelle se on tarkoitettu?
         site_terms: Käytä omaa tietosuojakäytäntöä tai jätä tyhjäksi, jos haluat käyttää oletusta. Voidaan jäsentää Markdown-syntaksilla.
         site_title: Kuinka ihmiset voivat viitata palvelimeen sen verkkotunnuksen lisäksi.
-        status_page_url: URL-osoite, jonka kautta palvelimen tila voidaan tarkastaa sen ollessa tavoittamattomissa
+        status_page_url: URL-osoite sivulle, jonka kautta tämän palvelimen tila voidaan ongelmatilanteissa tarkastaa
         theme: Teema, jonka uloskirjautuneet vierailijat ja uudet käyttäjät näkevät.
         thumbnail: Noin 2:1 kuva näytetään palvelimen tietojen rinnalla.
         timeline_preview: Uloskirjautuneet vierailijat voivat selata uusimpia julkisia viestejä, jotka ovat saatavilla palvelimella.
         trendable_by_default: Ohita suositun sisällön manuaalinen tarkistus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen.
         trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset ovat saamassa vetoa palvelimellasi.
-        trends_as_landing_page: Näytä suosittu sisältö uloskirjautuneille käyttäjille ja kävijöille palvelimen kuvauksen sijaan. Edellyttää suositun sisällön käyttöönottoa.
+        trends_as_landing_page: Näytä vierailijoille ja uloskirjautuneille käyttäjille suosittu sisältö palvelininstanssin kuvaustekstin sijaan. Edellytyksenä on, että suosittu sisältö -ominaisuus on käytössä.
       form_challenge:
         current_password: Olet menossa suojatulle alueelle
       imports:
diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml
index 44a40e486..93319b13e 100644
--- a/config/locales/simple_form.my.yml
+++ b/config/locales/simple_form.my.yml
@@ -2,16 +2,29 @@
 my:
   simple_form:
     hints:
-      account_alias:
-        acct: သင်ပြောင်းရွှေ့လိုသောအကောင့်၏ username@domain ကိုသတ်မှတ်ပါ
       account_warning_preset:
         text: URLs၊ hashtags နှင့် mentions များကဲ့သို့ ပို့စ်ကို သုံးနိုင်သည်
+        title: လက်ခံသူမှ မြင်နိုင်၊ မမြင်နိုင် ရွေးချယ်ခွင့်
       admin_account_action:
         include_statuses: အသုံးပြုသူသည် မည်သည့်ပို့စ်များမှာ စိစစ်ထားခြင်း သို့မဟုတ် သတိပေးထားခြင်းဖြစ်စေသည်ကို တွေ့မြင်နိုင်ပါသည်
         send_email_notification: အသုံးပြုသူသည် ၎င်းတို့၏အကောင့်နှင့် ဖြစ်ပျက်ခဲ့သော ရှင်းလင်းချက်ကို လက်ခံရရှိမည်ဖြစ်သည်
+        text_html: Post Syntax ကို သုံးနိုင်သည်။ အချိန်ကုန်သက်သာစေရန်အတွက် <a href="%{path}">ကြိုတင်သတိပေးချက်များ ထည့်နိုင်သည်</a>
         type_html: "<strong>%{acct}</strong> နှင့် ဘာလုပ်ရမည်ကို ရွေးပါ။"
+        types:
+          disable: အသုံးပြုသူကို ၄င်း၏အကောင့်အား သုံးစွဲခြင်းမှ ဟန့်တားပါ။ သို့သော် ၄င်းဖန်တီးထားသည့် အချက်အလက်များကို မဖျက်ပါ။ မဖျောက်ပါ။
+          none: အခြားလုပ်ဆောင်ချက်တစ်ခုမှ မလုပ်ဘဲ အသုံးပြုသူထံ သတိပေးချက်ပေးပို့ရန် ၎င်းကို အသုံးပြုပါ။
+          sensitive: ဤအသုံးပြုသူ၏ မီဒီယာပူးတွဲပါဖိုင်များအားလုံးကို သတိထားရသောမီဒီယာအဖြစ် သတ်မှတ်ရန် တိုက်တွန်းပါ။
+          silence: စောင့်ကြည့်မထားသူများ၏ ပို့စ်များနှင့် အသိပေးချက်များကို ဖျောက်ထားနိုင်ပြီး အသုံးပြုသူအား အများမြင်မည့်ပို့စ် တင်ခြင်းကို တားမြစ်နိုင်သည်။ ဤအကောင့်နှင့်ပတ်သက်သည့် အစီရင်ခံစာအားလုံးကို ပိတ်ထားနိုင်သည်။
+          suspend: ဤအကောင့်မှ သို့မဟုတ် ဤအကောင့်နှင့် အပြန်အလှန်တုံ့ပြန်မှုကို တားဆီးပြီး အကြောင်းအရာများကို ဖျက်ပါ။ ရက်ပေါင်း ၃၀ အတွင်း ပြန်ပြောင်းနိုင်သည်။ ဤအကောင့်နှင့်ပတ်သက်သည့် အစီရင်ခံစာအားလုံးကို ပိတ်ရန်။
+        warning_preset_id: ကြိုတင်သတ်မှတ်မှုအဆုံးတွင် စိတ်ကြိုက်စာသားကို ထည့်နိုင်သည်
       announcement:
+        all_day: အချိန်အပိုင်းအခြား ရက်စွဲများကိုသာ ပြသပါမည်
+        ends_at: ကြေညာချက်ထုတ်ပြန်ခြင်းကို ဤအချိန်တွင် အလိုအလျောက် ရပ်တန့်လိုက်ပါမည်
         scheduled_at: ကြေညာချက်ချက်ချင်းထုတ်ပြန်ရန်အတွက် နေရာလွတ်ချန်ထားပါ
+        starts_at: သင့်ကြေညာချက်သည် အချိန်အပိုင်းအခြားတစ်ခုနှင့် ဆက်စပ်နိုင်ပါသည်
+        text: Post Syntax ကို သုံးနိုင်သည်။ အသုံးပြုသူ၏ဖန်သားပြင်တွင် ပေါ်လာမည့် ကြေညာချက်နေရာကို သတိထားပါ
+      appeal:
+        text: လုပ်ဆောင်ချက်တစ်ကြိမ်သာ အသုံးပြုနိုင်သည်
       defaults:
         autofollow: ဖိတ်ကြားချက်မှတစ်ဆင့် အကောင့်ဖွင့်သူများမှာ သင့်ကို အလိုအလျောက်စောင့်ကြည့်မည်ဖြစ်ပါသည်
         avatar: PNG၊ GIF သို့မဟုတ် JPG။ အများဆုံး %{size}။ %{dimensions}px သို့ လျှော့ချပါမည်။
@@ -25,9 +38,11 @@ my:
         fields: သင့်ပရိုဖိုင်တွင် ၄ ခုအထိ ပြသထားနိုင်သည်
         header: PNG၊ GIF သို့မဟုတ် JPG။ အများဆုံး %{size}။ %{dimensions}px သို့ လျှော့ချပါမည်
         inbox_url: သင်အသုံးပြုလိုသော relay ၏ ရှေ့စာမျက်နှာမှ URL ကို ကူးယူပါ
+        irreversible: စစ်ထုတ်ခြင်းကိုဖယ်ရှားလိုက်ပါက စစ်ထုတ်ထားသော ပို့စ်များမှာ ပျောက်ကွယ်သွားပါမည်
         locale: အသုံးပြုသူမှ လက်ရှိသုံးနေသည့်ဘာသာစကား၊ အီးမေးလ်များနှင့် ရရှိစေရန်ပေးပို့သည့် အသိပေးချက်များ
         locked: စောင့်ကြည့်ရန်အတွက် တောင်းဆိုမှုများကို အတည်ပြုခြင်းဖြင့် စောင့်ကြည့်သူများကို ထိန်းချုပ်နိုင်သည်
         password: အနည်းဆုံး စာလုံး ၈ လုံး အသုံးပြုပါ။
+        scopes: API အက်ပလီကေးရှင်းများကို ဝင်ရောက်ကြည့်ရှုခွင့်ပြုပါမည်။ ထိပ်တန်းအဆင့်နယ်ပယ်ကို ရွေးချယ်ထားပါက တစ်ခုချင်းစီရွေးချယ်ရန် မလိုအပ်တော့ပါ။
         setting_aggregate_reblogs: မကြာသေးခင်က Boost လုပ်ထားသောပို့စ်များအတွက် Boost  အသစ်များကို မပြပါနှင့် (အသစ်ရရှိထားသော Boost များကိုသာ ပြသပါရန်)
         setting_always_send_emails: Mastodon ကို လက်ရှိအသုံးပြုနေချိန်တွင် ပုံမှန်အားဖြင့် အီးမေးလ်အသိပေးချက်များကို ပေးပို့မည်မဟုတ်ပါ
         setting_default_sensitive: သတိထားရသောမီဒီယာကို မူလအားဖြင့် ဖျောက်ထားနိုင်ပြီး ကလစ်တစ်ချက်နှိပ်ရုံဖြင့် ပြန်လည်ဖော်ပြနိုင်သည်
@@ -38,26 +53,40 @@ my:
         setting_noindex: သင်၏ အများမြင်သည့်ပရိုဖိုင်နှင့် ပို့စ်စာမျက်နှာများကို အကျိုးသက်ရောက်သည်
         setting_show_application: ပို့စ်တင်ရန်အတွက် သင်အသုံးပြုသည့် အက်ပလီကေးရှင်းကို သင့်ပို့စ်များ၏ အသေးစိတ်ကြည့်ရှုမှုတွင် ပြသမည်ဖြစ်သည်
         username: "%{domain} ရှိ သင့်အသုံးပြုသူအမည်မှာ တူညီ၍မရပါ"
+        whole_word: အဓိကစကားလုံး သို့မဟုတ် စကားစုသည် အက္ခရာဂဏန်းများသာဖြစ်ပါကစကားလုံးတစ်ခုလုံးနှင့် ကိုက်ညီမှသာ အသုံးပြုနိုင်မည်ဖြစ်သည်
+      domain_allow:
+        domain: ဤဒိုမိန်းသည် ဤဆာဗာမှ အချက်အလက်များကို ရယူနိုင်မည်ဖြစ်ပြီး ဝင်လာသောအချက်အလက်များကို စီမံဆောင်ရွက်ပေးပြီး သိမ်းဆည်းသွားမည်ဖြစ်သည်
       email_domain_block:
         domain: "၎င်းမှာ အီးမေးလ်လိပ်စာ သို့မဟုတ် အသုံးပြုသည့် MX မှတ်တမ်းတွင် ပေါ်လာသည့် ဒိုမိန်းအမည် ဖြစ်နိုင်သည်။ အကောင့်ဖွင့်ပြီးပါက စစ်ဆေးနိုင်မည်ဖြစ်သည်။"
+        with_dns_records: ပေးထားသော ဒိုမိန်း၏ DNS မှတ်တမ်းများကို ဖြေရှင်းရန် ကြိုးပမ်းမှု ပြုလုပ်မည်ဖြစ်ပြီး ရလဒ်များကိုလည်း ပိတ်ဆို့သွားမည်ဖြစ်သည်။
       featured_tag:
         name: ဤသည်မှာ သင်မကြာသေးမီက အသုံးပြုခဲ့သော hashtag အချို့ဖြစ်သည် -
       filters:
         action: ပို့စ်တစ်ခုသည် စစ်ထုတ်မှုနှင့် ကိုက်ညီချိန်တွင် မည်သည့်လုပ်ဆောင်ချက် ဆောင်ရွက်မည်ကို ရွေးချယ်ပါ
         actions:
+          hide: စစ်ထုတ်ထားသော အကြောင်းအရာကို လုံးဝဖျောက်ထားပြီး မရှိသကဲ့သို့ ပြပါ
           warn: စစ်ထုတ်မှုခေါင်းစဉ်ကိုဖော်ပြသည့်သတိပေးချက်နောက်တွင် စစ်ထုတ်ထားသောအကြောင်းအရာကို ဖျောက်ထားပါ
       form_admin_settings:
         activity_api_enabled: အပတ်စဉ် စာရင်းများတွင် ဒေသတွင်းတင်ထားသောပို့စ်များ၊ လက်ရှိအသုံးပြုသူများနှင့် စာရင်းသွင်းမှုအသစ်များ
         backups_retention_period: သတ်မှတ်ထားသော ရက်အရေအတွက်အလိုက် အသုံးပြုသူမှတ်တမ်းများကို သိမ်းဆည်းပါ။
         bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များ၏ စောင့်ကြည့်မှု အကြံပြုချက်များ၏ထိပ်ဆုံးတွင် ပင်ချိတ်ထားပါမည်။
         closed_registrations_message: အကောင့်ဖွင့်ခြင်းများကို ပိတ်ထားသည့်အခါတွင် ပြသထားသည်
+        content_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် အခြားဆာဗာများမှ ပို့စ်များကို ဖျက်လိုက်ပါမည်။ ပြန်လည်ပြင်ဆင်၍မရပါ။
         custom_css: Mastodon ဝဘ်ဗားရှင်းတွင် စိတ်ကြိုက်စတိုင်များကို အသုံးပြုနိုင်ပါသည်။
+        mascot: အဆင့်မြင့် ဝဘ်ပုံစံတွင်တွင် ရုပ်ပုံဖြင့်ဖော်ပြထားသည်။
+        media_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် ဒေါင်းလုဒ်လုပ်ထားသော မီဒီယာဖိုင်များကို ဖျက်လိုက်ပါမည်။ တောင်းဆိုပါက ပြန်လည်ဒေါင်းလုဒ် လုပ်ခွင့်ရှိသည်။
+        profile_directory: ပရိုဖိုင်လမ်းညွှန်တွင် ရှာဖွေ‌နိုင်သည့်အသုံးပြုသူအားလုံးကို စာရင်းပြုစုထားသည်။
+        site_contact_email: ဥပဒေရေးရာ သို့မဟုတ် အကူအညီ စုံစမ်းမေးမြန်းရန် လူများက သင့်ထံ မည်သို့ဆက်သွယ်နိုင်မည်နည်း။
         site_contact_username: Mastodon တွင် အခြားသူများက သင့်ကို မည်သို့သိရှိနိုင်မည်နည်း။
         site_extended_description: ဝင်ရောက်ကြည့်ရှုသူများနှင့် အသုံးပြုသူများအတွက် အသုံးဝင်မည့် နောက်ထပ်အချက်အလက်များကို Markdown စာကြောင်းများဖြင့် ရေးသားနိုင်သည်။
+        site_short_description: သင်၏ဆာဗာအား သိသားထင်ရှားစွာ အမှတ်အသားပြုနိုင်မည့် အကျဉ်းရုံးဖော်ပြချက်။ မည်သူမှ ဆာဗာအား ထိန်းကြောင်းလည်ပတ်နေသည်၊ မည်သူ့အတွက် ဖြစ်သည်?
         site_terms: သင့်ကိုယ်ပိုင် ကိုယ်ရေးအချက်အလက်မူဝါဒကို အသုံးပြုပါ သို့မဟုတ် မူလသတ်မှတ်ချက်ကို အသုံးပြုရန်အတွက် ကွက်လပ်ထားပါ။ Markdown စာများဖြင့် ရေးသားနိုင်သည်။
+        site_title: ဒိုမိန်းအမည်မှတပါး သင့်ဆာဗာကို လူများက မည်သို့သိရှိနိုင်မည်နည်း။
         status_page_url: ပြတ်တောက်နေစဉ်အတွင်း လူများက ဤဆာဗာအခြေအနေကို မြင်နိုင်မည့် စာမျက်နှာ URL
         theme: အကောင့်မှထွက်ပြီး အသုံးပြုသူအသစ်များနှင့် ဝင်ကြည့်မည့်သူများအတွက် မြင်ရမည့်ပုံစံ။
+        thumbnail: သင့်ဆာဗာအချက်အလက်နှင့်အတူ အကြမ်းဖျင်းအားဖြင့် ၂:၁ ဖြင့် ပြသထားသောပုံတစ်ပုံ။
         timeline_preview: အကောင့်မှထွက်ထားသူများသည် ဆာဗာပေါ်ရှိ လတ်တလော အများမြင်ပို့စ်များကို ရှာဖွေကြည့်ရှုနိုင်မည်ဖြစ်သည်။
+        trendable_by_default: ခေတ်စားနေသော အကြောင်းအရာများ၏ ကိုယ်တိုင်သုံးသပ်ချက်ကို ကျော်ပါ။ နောက်ပိုင်းတွင် အချက်အလက်တစ်ခုချင်းစီကို ခေတ်စားနေသောအကြောင်းအရာများကဏ္ဍမှ ဖယ်ရှားနိုင်ပါသေးသည်။
         trends: လက်ရှိခေတ်စားနေသာပို့စ်များ၊ hashtag များနှင့် သတင်းဇာတ်လမ်းများကို သင့်ဆာဗာပေါ်တွင် တွေ့မြင်နိုင်ပါမည်။
         trends_as_landing_page: ဤဆာဗာဖော်ပြချက်အစား အကောင့်မှ ထွက်ထားသူများနှင့် ဝင်ရောက်ကြည့်ရှုသူများအတွက် ခေတ်စားနေသော အကြောင်းအရာများကို ပြသပါ။ ခေတ်စားနေသောပို့စ်များကို ဖွင့်ထားရန် လိုအပ်သည်။
       form_challenge:
@@ -67,7 +96,9 @@ my:
       invite_request:
         text: "၎င်းသည် သင့်အက်ပလီကေးရှင်းကို ပြန်လည်သုံးသပ်ရန်အတွက် ကူညီပေးနိုင်ပါသည်"
       ip_block:
-        comment: ရွေးချယ်ခွင့်ရှိသည်။ ဤစည်းမျဉ်းကို ဘာကြောင့်ထည့်ခဲ့တာလဲဆိုတာ သတိရပါ။
+        comment: ဤစည်းမျဉ်း ဘာကြောင့်ထည့်ခဲ့သည်အား သတိရရန်။
+        expires_in: အိုင်ပီလိပ်စာများမှာ အကန့်အသတ်ရှိသည့် အရင်းအမြစ်ဖြစ်သည်။ တခါတရံ လိပ်စာများအား မျှဝေသုံးစွဲကြသည်။ အခါအားလျှော်စွာ လက်လွှဲသုံးစွဲမှုများလည်း ရှီတတ်သည်။ ထို့အတွက်ကြောင့် အကန့်အသတ်မဲ့ အိုင်ပီကန့်သတ်ထိန်းချုပ်မှု လုပ်ဆောင်ခြင်းကို အားမပေးပါ။
+        ip: IPv4 သို့မဟုတ် IPv6 လိပ်စာကို ထည့်ပါ။ CIDR syntax ကို အသုံးပြု၍ အတိုင်းအတာတစ်ခုလုံးကို ပိတ်ဆို့နိုင်သည်။ ကိုယ်တိုင် လော့ခ်မချမိစေရန် သတိထားပါ။
         severities:
           no_access: အရင်းအမြစ်များအားလုံးသို့ ဝင်ရောက်ခွင့်ကို ပိတ်ပါ
           sign_up_block: အကောင့်အသစ်များ မဖွင့်နိုင်တော့ပါ
@@ -88,6 +119,7 @@ my:
         highlighted: ယင်းက အခန်းကဏ္ဍကို အများမြင်အောင် ဖွင့်ပေးထားသည်။
         name: အကယ်၍ အခန်းကဏ္ဍကို သင်္ကေတတစ်ခုအဖြစ်ပြသရန် သတ်မှတ်ထားပါက အခန်းကဏ္ဍကို အများမြင်မည့်အမည်
         permissions_as_keys: ဤအခန်းကဏ္ဍဖြင့် အသုံးပြုသူများသာ အသုံးပြုခွင့်ရှိပါမည်...
+        position: အခန်းကဏ္ဍအဆင့်မြင့်သူအနေဖြင့် အချို့သောအခြေအနေများတွင် ပဋိပက္ခများကို ဖြေရှင်းနိုင်သည်။ အချို့လုပ်ဆောင်ချက်များမှာ အဆင့်နိမ့်အခန်းကဏ္ဍများတွင်သာ လုပ်ဆောင်နိုင်သည်။
       webhook:
         events: ပို့မည့်အကြောင်းအရာများကို ရွေးချယ်ပါ
         url: အကြောင်းအရာများကို ဘယ်ကို ပို့မလဲ။
@@ -109,6 +141,7 @@ my:
         text: စိတ်ကြိုက်သတိပေးချက်
         type: လုပ်ဆောင်ချက်
         types:
+          disable: ရပ်တန့်
           none: သတိပေးချက်ပေးပို့ပါ
           sensitive: သတိထားရသော
           silence: ကန့်သတ်
@@ -117,8 +150,11 @@ my:
       announcement:
         all_day: တစ်နေ့တာလုပ်ငန်းစဉ်
         ends_at: အကြောင်းအရာ၏အဆုံး
+        scheduled_at: ထုတ်ပြန်မည့်အချိန်
         starts_at: အကြောင်းအရာ၏အစ
         text: ကြေညာချက်
+      appeal:
+        text: ဆုံးဖြတ်ချက် ပြောင်းပြန်ချသင့်သောအကြောင်းရင်းအား ရှင်းပြပါ။
       defaults:
         autofollow: သင့်အကောင့်စောင့်ကြည့်ရန် ဖိတ်ခေါ်ပါ
         avatar: ကိုယ်စားပြုရုပ်ပုံ
@@ -133,8 +169,10 @@ my:
         display_name: ဖော်ပြမည့်အမည်
         email: အီးမေးလ်လိပ်စာ
         expires_in: သက်တမ်းကုန်ဆုံးမည့်ရက်
+        fields: ပရိုဖိုင်မီတာဒေတာ
         header: မျက်နှာဖုံးပုံ
         honeypot: "%{label} (မဖြည့်ပါနှင့်)"
+        inbox_url: ထပ်ဆင့်ဝင်စာ၏ URL
         locale: ဘာသာစကား
         locked: စောင့်ကြည့်တောင်းဆိုမှုများ လိုအပ်သည်
         max_uses: အများဆုံးအသုံးပြုမှုအရေအတွက်
@@ -148,10 +186,12 @@ my:
         setting_always_send_emails: အီးမေးလ်သတိပေးချက်များကို အမြဲပို့ပါ
         setting_auto_play_gif: ကာတွန်း GIF များကို အလိုအလျောက်ဖွင့်ပါ
         setting_boost_modal: Boost မလုပ်မီ အတည်ပြုချက်ပြပါ
+        setting_crop_images: အကျယ်မချဲ့ထားသော စာစုများတွင် ပုံများကို ၁၆း၉ အရွယ် ဖြတ်တောက်ပါ။
         setting_default_language: ပို့စ်တင်မည့်ဘာသာစကား
         setting_default_privacy: ပို့စ်ကို ဘယ်သူမြင်နိုင်မလဲ
         setting_default_sensitive: သတိထားရသောမီဒီယာအဖြစ် အမြဲအမှတ်အသားပြုပါ
         setting_delete_modal: ပို့စ်တစ်ခုမဖျက်မီ အတည်ပြုချက်ပြပါ။
+        setting_disable_swiping: ပွတ်ဆွဲခြင်းများကို ပိတ်ပါ
         setting_display_media: မီဒီယာဖော်ပြမှု
         setting_display_media_default: မူလသတ်မှတ်ချက်
         setting_display_media_hide_all: အားလုံးကို ဖျောက်ပါ
@@ -159,12 +199,15 @@ my:
         setting_expand_spoilers: အကြောင်းအရာသတိပေးချက်များဖြင့် အမှတ်အသားပြုထားသော ပို့စ်များကို အမြဲချဲ့ပါ
         setting_hide_network: သင့် Social Graph ကို ဖျောက်ထားပါ
         setting_noindex: ရှာဖွေရေးအညွှန်းမှ ဖယ်ထုတ်ပါ
+        setting_reduce_motion: ကာတွန်းများတွင် လှုပ်ရှားမှုကို လျှော့ချပါ
         setting_show_application: ပို့စ်များ ပေးပို့ရာတွင် အသုံးပြုသည့် အက်ပလီကေးရှင်း
         setting_system_font_ui: စနစ်ရှိ နဂိုမူလ စာလုံးပုံစံကို အသုံးပြုပါ
         setting_theme: ဆိုက်အပြင်အဆင်
         setting_trends: ယနေ့ ရေပန်းစားသည်များကို ပြပါ
         setting_unfollow_modal: တစ်စုံတစ်ဦးကို မစောင့်ကြည့်မီ အတည်ပြုချက် ဒိုင်ယာလော့ခ်ကို ပြပါ
+        setting_use_blurhash: ဖုံးကွယ်ထားသော ရုပ်ပုံ၊ဗီဒီယိုများအား အရောင်စုံ ရောင်ပြေးအနေနှင့် ပြသပါ။
         setting_use_pending_items: အနှေးပြကွက်
+        severity: ပြင်းထန်မှု
         sign_in_token_attempt: လုံခြုံရေးကုဒ်
         title: ခေါင်းစဥ်
         type: ထည့်သွင်းမှုအမျိုးအစား
@@ -180,6 +223,7 @@ my:
           hide: လုံးဝဖျောက်ထားပါ
           warn: သတိပေးချက်ဖြင့် ဖျောက်ပါ
       form_admin_settings:
+        activity_api_enabled: API ရှိ အသုံးပြုသူလုပ်ဆောင်ချက်စာရင်းများကို ထုတ်ပြန်ပါ
         backups_retention_period: အသုံးပြုသူ၏ မှတ်တမ်းကာလ
         bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များအတွက် အကြံပြုပေးပါ
         closed_registrations_message: အကောင့်ဖွင့်ခြင်းများ မရတော့သောအခါ စိတ်ကြိုက်မက်ဆေ့ချ်ပို့ခြင်း
@@ -205,6 +249,7 @@ my:
         timeline_preview: အများမြင်စာမျက်နှာများသို့ အထောက်အထားမရှိဘဲ ဝင်ရောက်ခွင့်ပြုပါ
         trendable_by_default: ကြိုမသုံးသပ်ဘဲ ခေတ်စားနေသောအကြောင်းအရာများကို ခွင့်ပြုပါ
         trends: လက်ရှိခေတ်စားနေမှုများကိုပြပါ
+        trends_as_landing_page: ခေတ်စားနေသောပို့စ်များကို landing စာမျက်နှာအဖြစ် အသုံးပြုပါ
       interactions:
         must_be_follower: စောင့်ကြည့်မနေသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ
         must_be_following: သင် စောင့်ကြည့်မထားသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index ddc1a0d21..bf46305ee 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -91,11 +91,13 @@ pt-BR:
         site_short_description: Uma curta descrição para ajudar unicamente a identificar a sua instância. Quem está o administrando, e para quem é direcionado?
         site_terms: Use a sua própria política de privacidade ou deixe em branco para usar o padrão. Pode ser estruturado com o formato Markdown.
         site_title: Como as pessoas podem se referir ao seu servidor além do nome do domínio.
+        status_page_url: URL de uma página onde as pessoas podem ver o status deste servidor durante uma interrupção
         theme: Tema que visitantes e novos usuários veem.
         thumbnail: Uma imagem de aproximadamente 2:1 exibida ao lado da informação de sua instância.
         timeline_preview: Visitantes conseguirão navegar pelas postagens públicas mais recentes disponíveis na instância.
         trendable_by_default: Pular a revisão manual do conteúdo em tendência. Itens individuais ainda poderão ser removidos das tendências após a sua exibição.
         trends: Tendências mostram quais publicações, hashtags e notícias estão ganhando destaque na sua instância.
+        trends_as_landing_page: Mostrar conteúdo de tendências para usuários deslogados e visitantes em vez de uma descrição deste servidor. Requer que as tendências sejam ativadas.
       form_challenge:
         current_password: Você está entrando em uma área segura
       imports:
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index 1e99fefa3..e854dd64a 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -95,7 +95,7 @@ th:
         theme: ชุดรูปแบบที่ผู้เยี่ยมชมที่ออกจากระบบและผู้ใช้ใหม่เห็น
         thumbnail: แสดงภาพ 2:1 โดยประมาณควบคู่ไปกับข้อมูลเซิร์ฟเวอร์ของคุณ
         timeline_preview: ผู้เยี่ยมชมที่ออกจากระบบจะสามารถเรียกดูโพสต์สาธารณะล่าสุดที่มีในเซิร์ฟเวอร์
-        trendable_by_default: ข้ามการตรวจทานเนื้อหาที่กำลังนิยมด้วยตนเอง ยังคงสามารถเอารายการแต่ละรายการออกจากแนวโน้มได้หลังเกิดเหตุ
+        trendable_by_default: ข้ามการตรวจทานเนื้อหาที่กำลังนิยมด้วยตนเอง ยังคงสามารถเอารายการแต่ละรายการออกจากแนวโน้มได้หลังจากเกิดเหตุ
         trends: แนวโน้มแสดงว่าโพสต์, แฮชแท็ก และเรื่องข่าวใดกำลังได้รับความสนใจในเซิร์ฟเวอร์ของคุณ
         trends_as_landing_page: แสดงเนื้อหาที่กำลังนิยมแก่ผู้ใช้และผู้เยี่ยมชมที่ออกจากระบบแทนที่จะเป็นคำอธิบายของเซิร์ฟเวอร์นี้ ต้องมีการเปิดใช้งานแนวโน้ม
       form_challenge:
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 1976df4d9..28aacb92e 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -59,12 +59,12 @@ zh-TW:
         setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示
         setting_use_blurhash: 彩色漸層圖樣是基於隱藏媒體內容顏色產生,所有細節會變得模糊
         setting_use_pending_items: 關閉自動捲動更新,時間軸只會在點擊後更新
-        username: 您的使用者名稱將在 %{domain} 是獨一無二的
+        username: 您的使用者名稱將於 %{domain} 是獨一無二的
         whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用
       domain_allow:
         domain: 此網域將能夠攫取本站資料,而自該網域發出的資料也會於本站處理和留存。
       email_domain_block:
-        domain: 這可以是顯示在電子郵件中的網域名稱,或是其使用的 MX 紀錄。其將在註冊時檢查。
+        domain: 這可以是顯示在電子郵件中的網域名稱,或是其使用的 MX 紀錄。其將於註冊時檢查。
         with_dns_records: Mastodon 會嘗試解析所給網域的 DNS 記錄,解析結果一致者將一併封鎖
       featured_tag:
         name: 這些是您最近使用的一些主題標籤:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 53ef48fe5..494b15307 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -231,6 +231,14 @@ sk:
         destroy_status_html: "%{name} zmazal/a príspevok od %{target}"
         memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku"
         reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}"
+        reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}"
+        resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}"
+        reset_password_user_html: "%{name} resetoval/a heslo používateľa %{target}"
+        resolve_report_html: "%{name} vyriešil/a nahlásenie %{target}"
+        sensitive_account_html: "%{name} označil médium od %{target} za chúlostivé"
+        silence_account_html: "%{name} obmedzil/a účet %{target}"
+        suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}"
+        unassigned_report_html: "%{name} odobral/a report od %{target}"
       deleted_account: zmazaný účet
       empty: Žiadne záznamy nenájdené.
       filter_by_action: Filtruj podľa úkonu
@@ -587,6 +595,10 @@ sk:
       rules_check:
         action: Spravuj serverové pravidlá
         message_html: Neurčil/a si žiadne serverové pravidlá.
+      upload_check_privacy_error:
+        action: Pozri tu pre viac informácií
+      upload_check_privacy_error_object_storage:
+        action: Pozri tu pre viac informácií
     tags:
       review: Prehodnoť stav
       updated_msg: Nastavenia haštagov boli úspešne aktualizované
@@ -1153,5 +1165,4 @@ sk:
     seamless_external_login: Si prihlásená/ý cez externú službu, takže nastavenia hesla a emailu ti niesú prístupné.
     signed_in_as: 'Prihlásená/ý ako:'
   verification:
-    explanation_html: 'Môžeš sa <strong>overiť ako majiteľ odkazov v metadátach tvojho profilu</strong>. Na to ale musí odkazovaná stránka obsahovať odkaz späť na tvoj Mastodon profil. Tento spätný odkaz <strong>musí</strong> mať prívlastok <code>rel="me"</code>. Na texte odkazu nezáleží. Tu je príklad:'
     verification: Overenie
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index eb3085cd6..00bdd10a9 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -840,6 +840,12 @@ sl:
         message_html: Nobenih pravil strežnika niste določili.
       sidekiq_process_check:
         message_html: Noben proces Sidekiq ne poteka za %{value} vrst. Preglejte svojo prilagoditev Sidekiq
+      upload_check_privacy_error:
+        action: Preverite tukaj za več informacij
+        message_html: "<strong>Vaš spletni strežnik je napačno nastavljen. Zasebnost vaših uporabnikov je izpostavljena tveganjem.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Preverite tukaj za več informacij
+        message_html: "<strong>Vaša predmetna shramba je napačno nastavljena. Zasebnost vaših uporabnikov je izpostavljena tveganjem.</strong>"
     tags:
       review: Stanje pregleda
       updated_msg: Nastavitve ključnikov uspešno posodobljene
@@ -1748,12 +1754,13 @@ sl:
       title: Dobrodošli, %{name}!
   users:
     follow_limit_reached: Ne morete spremljati več kot %{limit} ljudi
+    go_to_sso_account_settings: Pojdite na nastavitve svojega računa ponudnika identitete
     invalid_otp_token: Neveljavna dvofaktorska koda
     otp_lost_help_html: Če ste izgubili dostop do obeh, stopite v stik z %{email}
     seamless_external_login: Prijavljeni ste prek zunanje storitve, tako da nastavitve gesla in e-pošte niso na voljo.
     signed_in_as: 'Vpisani kot:'
   verification:
-    explanation_html: '<strong>V metapodatkih svojega profila se lahko potrdite kot lastnik povezav</strong>. Za to mora povezano spletno mesto vsebovati povezavo do vašega Mastodon profila. Povezava <strong>mora</strong> imeti atribut <code>el="me"</code>. Vsebina besedila povezave ni pomembna. Tukaj je primer:'
+    explanation_html: '<strong>V metapodatkih svojega profila se lahko potrdite kot lastnik povezav</strong>. Za to mora povezano spletno mesto vsebovati povezavo do vašega profila Mastodon. Po dodajanju povezave se boste morda morali vrniti sem in ponovno shraniti svoj profil, da bo overjanje učinkovalo. Povezava <strong>mora</strong> imeti atribut <code>el="me"</code>. Vsebina besedila povezave ni pomembna. Tukaj je primer:'
     verification: Potrditev
   webauthn_credentials:
     add: Dodaj nov varnostni ključ
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 38afb2996..281ef7cb1 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -809,6 +809,12 @@ sq:
         message_html: S’keni përcaktuar ndonjë rregull shërbyesi.
       sidekiq_process_check:
         message_html: S’ka proces Sidekiq në punë për %{value} radhë. Ju lutemi, shqyrtoni formësimin tuaj për Sidekiq-un
+      upload_check_privacy_error:
+        action: Për më tepër hollësi, shihni këtu
+        message_html: "<strong>Shërbyesi juaj është formësuar keq. Privatësia e përdoruesve tuaj është në rrezik.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Për më tepër hollësi, shihni këtu
+        message_html: "<strong>Depozita juaj e objekteve është e formësuar keq. Privatësia e përdoruesve tuaj është në rrezik.</strong>"
     tags:
       review: Gjendje rishikimi
       updated_msg: Rregullimet për hashtag-ët u përditësuan me sukses
@@ -1678,12 +1684,13 @@ sq:
       title: Mirë se vini, %{name}!
   users:
     follow_limit_reached: S’mund të ndiqni më tepër se %{limit} persona
+    go_to_sso_account_settings: Kaloni te rregullime llogarie te shërbimi juaj i identitetit
     invalid_otp_token: Kod dyfaktorësh i pavlefshëm
     otp_lost_help_html: Nëse humbët hyrjen te të dy, mund të lidheni me %{email}
     seamless_external_login: Jeni futur përmes një shërbimi të jashtëm, ndaj s’ka rregullime fjalëkalimi dhe email.
     signed_in_as: 'I futur si:'
   verification:
-    explanation_html: 'Mundeni <strong>të verifikoni veten si i zoti i lidhjeve te tejtëdhënat e profilit tuaj</strong>. Për këtë, sajti i lidhur duhet të përmbajë një lidhje për te profili juaj Mastodon. Lidhje për te ajo <strong>duhet</strong> të ketë një atribut <code>rel="me"</code>. Lënda tekst e lidhjes nuk ngre peshë. Ja një shembull:'
+    explanation_html: 'Mundeni të <strong>verifikoni veten si i zoti i lidhjeve që nga tejtëdhëna të profilit tuaj</strong>. Për këtë, sajti i lidhur duhet të përmbajë një lidhje që shpie te profili juaj Mastodon. Pas shtimit të lidhjes mund t’ju duhet të ktheheni këtu dhe të riruani profilin tuaj, që verifikimi të ketë efekt. Lidhja e kthimit <strong>duhet</strong> të përmbajë një atribut <code>rel="me"</code>. Teksi i lidhjes s’ka rëndësi. Ja një shembull:'
     verification: Verifikim
   webauthn_credentials:
     add: Shtoni kyç të ri sigurie
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index b6e17677d..a2e860ef6 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -826,6 +826,12 @@ sr-Latn:
         message_html: Niste definisali nijedno pravilo servera.
       sidekiq_process_check:
         message_html: Nijedan Sidekiq proces nije pokrenut za red(ove) %{value}. Molimo Vas pregledajte svoju Sidekiq konfiguraciju
+      upload_check_privacy_error:
+        action: Proverite ovde za više informacija
+        message_html: "<strong>Vaš veb server je pogrešno konfigurisan. Privatnost vaših korisnika je izložena riziku.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Proverite ovde za više informacija
+        message_html: "<strong>Vaše skladište objekta je pogrešno konfigurisano. Privatnost vaših korisnika je izložena riziku.</strong>"
     tags:
       review: Pregledaj status
       updated_msg: Podešavanja heš oznaka uspešno ažurirana
@@ -1716,12 +1722,12 @@ sr-Latn:
       title: Dobrodošli, %{name}!
   users:
     follow_limit_reached: Ne možete pratiti više od %{limit} ljudi
+    go_to_sso_account_settings: Idite na podešavanja naloga svog dobavljača identiteta
     invalid_otp_token: Neispravni dvofaktorski kod
     otp_lost_help_html: Ako izgubite pristup za oba, možete stupiti u kontakt sa %{email}
     seamless_external_login: Prijavljeni ste putem spoljašnje usluge, tako da lozinka i podešavanja E-pošte nisu dostupni.
     signed_in_as: 'Prijavljen/a kao:'
   verification:
-    explanation_html: 'Možete <strong>izvršiti proveru da ste Vi vlasnik veza na Vašem nalogu</strong>. Da bi to radilo, povezani veb sajt mora da sadrži vezu nazad ka Vašem Mastodon nalogu. Veza nazad <strong>mora</strong> da ima <code>rel="me"</code> atribut. Tekstuelni sadržaj veze nije bitan. Evo primera:'
     verification: Provera
   webauthn_credentials:
     add: Dodajte novi sigurnosni ključ
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 9fc831f20..fb90cef5d 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -826,6 +826,12 @@ sr:
         message_html: Нисте дефинисали ниједно правило сервера.
       sidekiq_process_check:
         message_html: Ниједан Sidekiq процес није покренут за ред(ове) %{value}. Молимо Вас прегледајте своју Sidekiq конфигурацију
+      upload_check_privacy_error:
+        action: Проверите овде за више информација
+        message_html: "<strong>Ваш веб сервер је погрешно конфигурисан. Приватност ваших корисника је изложена ризику.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Проверите овде за више информација
+        message_html: "<strong>Ваше складиште објекта је погрешно конфигурисано. Приватност ваших корисника је изложена ризику.</strong>"
     tags:
       review: Прегледај статус
       updated_msg: Подешавања хеш ознака успешно ажурирана
@@ -1716,12 +1722,13 @@ sr:
       title: Добродошли, %{name}!
   users:
     follow_limit_reached: Не можете пратити више од %{limit} људи
+    go_to_sso_account_settings: Идите на подешавања налога свог добављача идентитета
     invalid_otp_token: Неисправни двофакторски код
     otp_lost_help_html: Ако изгубите приступ за оба, можете ступити у контакт са %{email}
     seamless_external_login: Пријављени сте путем спољашње услуге, тако да лозинка и подешавања Е-поште нису доступни.
     signed_in_as: 'Пријављен/а као:'
   verification:
-    explanation_html: 'Можете <strong>извршити проверу да сте Ви власник веза на Вашем налогу</strong>. Да би то радило, повезани веб сајт мора да садржи везу назад ка Вашем Мастодон налогу. Веза назад <strong>мора</strong> да има <code>rel="me"</code> атрибут. Текстуелни садржај везе није битан. Ево примера:'
+    explanation_html: 'Можете да се <strong>верификујете као власник веза у метаподацима профила</strong>. За то је потребно да повезани веб сајт мора садржати везу до вашег Mastodon профила. Након што додате везу, можда ћете морати да се вратите овде и поново сачувате свој профил да би верификација ступила на снагу. Повратна веза <strong>мора</strong> имати атрибут <code>rel="me"</code>. Текстуални садржај везе није битан. Ево примера:'
     verification: Провера
   webauthn_credentials:
     add: Додајте нови сигурносни кључ
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index b543b18cb..58537ea7f 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -812,6 +812,12 @@ sv:
         message_html: Du har inte definierat några serverregler.
       sidekiq_process_check:
         message_html: Ingen Sidekiq-process körs för kön/köerna %{value}. Vänligen kontrollera din Sidekiq-konfiguration
+      upload_check_privacy_error:
+        action: Kolla här för mer information
+        message_html: "<strong>Din webbserver är felkonfigurerad. Sekretessen för dina användare är i fara.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Kolla här för mer information
+        message_html: "<strong>Din objektlagring är felkonfigurerad. Sekretessen för dina användare är i riskzonen.</strong>"
     tags:
       review: Granskningsstatus
       updated_msg: Hashtagg-inställningarna har uppdaterats
@@ -1684,12 +1690,12 @@ sv:
       title: Välkommen ombord, %{name}!
   users:
     follow_limit_reached: Du kan inte följa fler än %{limit} personer
+    go_to_sso_account_settings: Gå till din identitetsleverantörs kontoinställningar
     invalid_otp_token: Ogiltig tvåfaktorskod
     otp_lost_help_html: Om du förlorat åtkomst till båda kan du komma i kontakt med %{email}
     seamless_external_login: Du är inloggad via en extern tjänst, inställningar för lösenord och e-post är därför inte tillgängliga.
     signed_in_as: 'Inloggad som:'
   verification:
-    explanation_html: 'Du kan <strong>verifiera dig själv som ägare av länkar i din profilmetadata</strong>, genom att på den länkade webbplatsen även länka tillbaka till din Mastodon-profil. Länken tillbaka <strong>måste</strong> ha attributet <code>rel="me"</code>. Textinnehållet i länken spelar ingen roll. Här är ett exempel:'
     verification: Bekräftelse
   webauthn_credentials:
     add: Lägg till ny säkerhetsnyckel
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 13a312f26..5c56b1723 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -798,6 +798,12 @@ th:
         message_html: คุณไม่ได้กำหนดกฎของเซิร์ฟเวอร์ใด ๆ
       sidekiq_process_check:
         message_html: ไม่มีกระบวนการ Sidekiq ที่กำลังทำงานสำหรับคิว %{value} โปรดตรวจทานการกำหนดค่า Sidekiq ของคุณ
+      upload_check_privacy_error:
+        action: ตรวจสอบที่นี่สำหรับข้อมูลเพิ่มเติม
+        message_html: "<strong>เว็บเซิร์ฟเวอร์ของคุณกำหนดค่าไม่ถูกต้อง ความเป็นส่วนตัวของผู้ใช้ของคุณตกอยู่ในความเสี่ยง</strong>"
+      upload_check_privacy_error_object_storage:
+        action: ตรวจสอบที่นี่สำหรับข้อมูลเพิ่มเติม
+        message_html: "<strong>ที่เก็บข้อมูลวัตถุของคุณกำหนดค่าไม่ถูกต้อง ความเป็นส่วนตัวของผู้ใช้ของคุณตกอยู่ในความเสี่ยง</strong>"
     tags:
       review: สถานะการตรวจทาน
       updated_msg: อัปเดตการตั้งค่าแฮชแท็กสำเร็จ
@@ -1652,12 +1658,13 @@ th:
       title: ยินดีต้อนรับ %{name}!
   users:
     follow_limit_reached: คุณไม่สามารถติดตามมากกว่า %{limit} คน
+    go_to_sso_account_settings: ไปยังการตั้งค่าบัญชีของผู้ให้บริการข้อมูลประจำตัวของคุณ
     invalid_otp_token: รหัสสองปัจจัยไม่ถูกต้อง
     otp_lost_help_html: หากคุณสูญเสียการเข้าถึงทั้งสองอย่าง คุณสามารถติดต่อ %{email}
     seamless_external_login: คุณได้เข้าสู่ระบบผ่านบริการภายนอก ดังนั้นจึงไม่มีการตั้งค่ารหัสผ่านและอีเมล
     signed_in_as: 'ลงชื่อเข้าเป็น:'
   verification:
-    explanation_html: 'คุณสามารถ <strong>ยืนยันตัวคุณเองว่าเป็นเจ้าของของลิงก์ในข้อมูลอภิพันธุ์โปรไฟล์ของคุณ</strong> สำหรับสิ่งนั้น เว็บไซต์ที่เชื่อมโยงต้องมีลิงก์ย้อนกลับไปยังโปรไฟล์ Mastodon ของคุณ ลิงก์ย้อนกลับ <strong>ต้อง</strong> มีแอตทริบิวต์ <code>rel="me"</code> เนื้อหาข้อความของลิงก์ไม่สำคัญ นี่คือตัวอย่าง:'
+    explanation_html: 'คุณสามารถ <strong>ยืนยันตัวคุณเองว่าเป็นเจ้าของของลิงก์ในข้อมูลอภิพันธุ์โปรไฟล์ของคุณ</strong> สำหรับสิ่งนั้น เว็บไซต์ที่เชื่อมโยงต้องมีลิงก์ย้อนกลับไปยังโปรไฟล์ Mastodon ของคุณ หลังจากการเพิ่มลิงก์คุณอาจจำเป็นต้องกลับมาที่นี่และบันทึกโปรไฟล์ของคุณใหม่เพื่อให้การตรวจสอบมีผล ลิงก์ย้อนกลับ <strong>ต้อง</strong> มีแอตทริบิวต์ <code>rel="me"</code> เนื้อหาข้อความของลิงก์ไม่สำคัญ นี่คือตัวอย่าง:'
     verification: การตรวจสอบ
   webauthn_credentials:
     add: เพิ่มกุญแจความปลอดภัยใหม่
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 384e06085..99aa325cb 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -812,6 +812,12 @@ tr:
         message_html: Herhangi bir sunucu kuralı belirlemediniz.
       sidekiq_process_check:
         message_html: "%{value} kuyruk(lar)ı için herhangi bir Sidekiq süreci çalışmıyor. Lütfen Sidekiq yapılandırmanızı gözden geçirin"
+      upload_check_privacy_error:
+        action: Daha fazla bilgi için buraya tıklayın
+        message_html: "<strong>Web sunucunuz hatalı yapılandırılmış. Kullanıcılarınızın gizliliği tehlikede.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Daha fazla bilgi için buraya göz atın
+        message_html: "<strong>Nesne depolamanız hatalı yapılandırılmış. Kullanıcılarınızın gizliliği tehlikede.</strong>"
     tags:
       review: Durumu gözden geçir
       updated_msg: Etiket ayarları başarıyla güncellendi
@@ -1684,12 +1690,13 @@ tr:
       title: Gemiye hoşgeldin, %{name}!
   users:
     follow_limit_reached: "%{limit} kişiden daha fazlasını takip edemezsiniz"
+    go_to_sso_account_settings: Kimlik sağlayıcı hesap ayarlarına gidin
     invalid_otp_token: Geçersiz iki adımlı doğrulama kodu
     otp_lost_help_html: Her ikisine de erişiminizi kaybettiyseniz, %{email} ile irtibata geçebilirsiniz
     seamless_external_login: Harici bir servis aracılığıyla oturum açtınız, bu nedenle parola ve e-posta ayarları mevcut değildir.
     signed_in_as: 'Oturum açtı:'
   verification:
-    explanation_html: '<strong>Profil meta verisindeki bağlantıların sahibi olarak kendinizi doğrulayabilirsiniz</strong>. Bunun için, link verilen web sitesi Mastodon profilinize geri bir link içermelidir. Geri link bir <code>rel="me"</code> özelliğine sahip <strong>olmalıdır</strong>. Bağlantının metin içeriği önemli değildir. İşte bir örnek:'
+    explanation_html: '<strong>Profil meta verisindeki bağlantıların sahibi olarak kendinizi doğrulayabilirsiniz</strong>. Bunun için, bağlantısı verilen web sitesi Mastodon profilinize bir bağlantı içermelidir. Doğrulamanın gerçekleşmesi için bağlantıyı ekledikten sonra buraya gelip profilinizi tekrar kaydetmelisiniz. Geri bağlantı bir <code>rel="me"</code> özelliğine sahip <strong>olmalıdır</strong>. Bağlantının metin içeriği önemli değildir. İşte bir örnek:'
     verification: Doğrulama
   webauthn_credentials:
     add: Yeni güvenlik anahtarı ekle
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 8bd005961..62736d23d 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -840,6 +840,12 @@ uk:
         message_html: Ви не визначили будь-які правила сервера.
       sidekiq_process_check:
         message_html: Не працює процес Sidekiq для %{value} черги. Перегляньте конфігурації вашого Sidekiq
+      upload_check_privacy_error:
+        action: Перегляньте подробиці тут
+        message_html: "<strong>Ваш вебсервер неправильно налаштований. Приватність ваших користувачів піддається ризику</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Перегляньте подробиці тут
+        message_html: "<strong>Ваше сховище об'єктів неправильно налаштоване. Приватність ваших користувачів піддається ризику</strong>"
     tags:
       review: Переглянути допис
       updated_msg: Параметри хештеґів успішно оновлені
@@ -1748,12 +1754,13 @@ uk:
       title: Ласкаво просимо, %{name}!
   users:
     follow_limit_reached: Не можна слідкувати більш ніж за %{limit} людей
+    go_to_sso_account_settings: Перейдіть до налаштувань облікового запису постачальника ідентифікації
     invalid_otp_token: Введено неправильний код
     otp_lost_help_html: Якщо ви втратили доступ до обох, ви можете отримати доступ з %{email}
     seamless_external_login: Ви увійшли за допомогою зовнішнього сервісу, тому налаштування паролю та електронної пошти недоступні.
     signed_in_as: 'Ви увійшли як:'
   verification:
-    explanation_html: 'Ви можете <strong>підтвердити володіння посиланнями в метаданих вашого профілю</strong>. Для цього на зазначеному сайті повинне міститися посилання на ваш профіль Mastodon. Посилання <strong>повинне</strong> мати атрибут <code>rel="me"</code>. Текстовий вміст посилання не має значення. Ось приклад:'
+    explanation_html: 'Ви можете <strong>підтвердити володіння посиланнями в метаданих вашого профілю</strong>. Для цього на зазначеному сайті повинен міститися посилання на ваш профіль Mastodon. Посилання <strong>повинне</strong> мати атрибут <code>rel="me"</code>. Текстовий вміст посилання не має значення. Ось приклад:'
     verification: Підтвердження
   webauthn_credentials:
     add: Додати новий ключ безпеки
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 81b30e6a2..a1a225701 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -798,6 +798,12 @@ vi:
         message_html: Bạn chưa cập nhật nội quy máy chủ.
       sidekiq_process_check:
         message_html: Sidekiq không hoạt động khi truy vấn %{value}. Hãy kiểm tra lại cấu hình Sidekiq
+      upload_check_privacy_error:
+        action: Nhấn vào đây để biết thêm thông tin
+        message_html: "<strong>Máy chủ web của bạn bị cấu hình sai. Có nguy cơ ảnh hưởng bảo mật của người dùng.</strong>"
+      upload_check_privacy_error_object_storage:
+        action: Nhấn vào đây để biết thêm thông tin
+        message_html: "<strong>Lưu trữ đối tượng của bạn bị cấu hình sai. Có nguy cơ ảnh hưởng bảo mật của người dùng.</strong>"
     tags:
       review: Phê duyệt
       updated_msg: Hashtag đã được cập nhật thành công
@@ -1652,6 +1658,7 @@ vi:
       title: Xin chào %{name}!
   users:
     follow_limit_reached: Bạn chỉ có thể theo dõi tối đa %{limit} người
+    go_to_sso_account_settings: Thiết lập tài khoản nhà cung cấp danh tính
     invalid_otp_token: Mã xác minh 2 bước không hợp lệ
     otp_lost_help_html: Nếu bạn mất quyền truy cập vào cả hai, bạn có thể đăng nhập bằng %{email}
     seamless_external_login: Bạn đã đăng nhập thông qua một dịch vụ bên ngoài, vì vậy mật khẩu và email không khả dụng.
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 4267b652f..5934a8607 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -798,6 +798,12 @@ zh-CN:
         message_html: 你没有定义任何服务器规则。
       sidekiq_process_check:
         message_html: "%{value} 队列未运行任何 Sidekiq 进程。请检查你的 Sidekiq 配置"
+      upload_check_privacy_error:
+        action: 点击这里查看更多信息
+        message_html: "<strong>您的网站服务器配置错误,您用户的隐私处于危险中。</strong>"
+      upload_check_privacy_error_object_storage:
+        action: 点击这里查看更多信息
+        message_html: "<strong>您的对象存储空间配置错误,您用户的隐私处于危险中。</strong>"
     tags:
       review: 审核状态
       updated_msg: 话题标签设置更新成功
@@ -1652,12 +1658,13 @@ zh-CN:
       title: "%{name},欢迎你的加入!"
   users:
     follow_limit_reached: 你不能关注超过 %{limit} 个人
+    go_to_sso_account_settings: 转到您的身份提供商进行账户设置
     invalid_otp_token: 输入的双重认证代码无效
     otp_lost_help_html: 如果你不慎丢失了所有的代码,请联系 %{email} 寻求帮助
     seamless_external_login: 因为你是通过外部服务登录的,所以密码和电子邮件地址设置都不可用。
     signed_in_as: 当前登录的账户:
   verification:
-    explanation_html: 你可以 <strong>验证自己是个人资料元数据中的某个链接的所有者</strong>。 为此,被链接网站必须包含一个到你的 Mastodon 主页的链接。链接中 <strong>必须</strong> 包括 <code>rel="me"</code> 属性。链接的文本内容可以随意填写。例如:
+    explanation_html: 您可以 <strong>验证自己是个人资料元数据中的链接的所有者</strong> 。为此,链接的网站必须包含返回到您的 Mastodon 个人资料的链接。添加链接后,您可能需要回到这里并重新保存个人资料以使验证生效。 <strong>必须</strong> 在返回链接上使用 <code>rel="me"</code> 属性。 链接的文本内容无关紧要。以下是一个示例:
     verification: 验证
   webauthn_credentials:
     add: 添加新的安全密钥
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 835ecd33c..b334e66d9 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -1652,7 +1652,6 @@ zh-HK:
     seamless_external_login: 因為你正在使用第三方服務登入,所以不能設定密碼和電郵。
     signed_in_as: 目前登入的帳戶:
   verification:
-    explanation_html: 你可以<strong>認證個人資料頁面的元數據 (Metadata) 連結是屬於你的</strong>。要認證,那些連結的目的地網站必須有一條回到你 Mastodon 個人頁面的連結,而且連結<strong>必須</strong>具有<code>rel="me"</code>屬性。連結的文字內容都不會影響認證。這裏有一個例子:
     verification: 驗證
   webauthn_credentials:
     add: 新增安全密鑰裝置
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 1e31e2249..11a67ec47 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -800,6 +800,12 @@ zh-TW:
         message_html: 您尚未定義任何伺服器規則。
       sidekiq_process_check:
         message_html: 沒有佇列 %{value} 的 Sidekiq 行程,請檢查您的 Sidekiq 設定組態
+      upload_check_privacy_error:
+        action: 檢查這裡以取得更多資訊
+        message_html: "<strong>您的網頁伺服器設定錯誤。您的使用者隱私正暴露於風險之中。</strong>"
+      upload_check_privacy_error_object_storage:
+        action: 檢查這裡以取得更多資訊
+        message_html: "<strong>您的物件資料儲存空間 (object storage) 設定錯誤。您的使用者隱私正暴露於風險之中。</strong>"
     tags:
       review: 審核嘟文
       updated_msg: 成功更新主題標籤設定
@@ -1007,7 +1013,7 @@ zh-TW:
       account_status: 帳號狀態
       confirming: 等待電子郵件確認完成。
       functional: 您的帳號可以正常使用了。
-      pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將在申請通過後以電子郵件方式通知您。
+      pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將於申請通過後以電子郵件方式通知您。
       redirecting_to: 您的帳號因目前重定向至 %{acct} 而被停用。
       view_strikes: 檢視針對您帳號過去的警示
     too_fast: 送出表單的速度太快跟不上,請稍後再試。
@@ -1269,7 +1275,7 @@ zh-TW:
     incoming_migrations_html: 要從其他帳號移動到此帳號的話,首先您必須<a href="%{path}">建立帳號別名</a>。
     moved_msg: 您的帳號正被重新導向到 %{acct},您的跟隨者也會同步轉移至該帳號。
     not_redirecting: 您的帳號目前尚未重新導向到任何其他帳號。
-    on_cooldown: 您最近已轉移過您的帳號。此功能將在 %{count} 天後可再度使用。
+    on_cooldown: 您最近已轉移過您的帳號。此功能將於 %{count} 天後可再度使用。
     past_migrations: 以往的轉移紀錄
     proceed_with_move: 移動跟隨者
     redirected_msg: 您的帳號現在指向 %{acct}
@@ -1654,12 +1660,13 @@ zh-TW:
       title: "%{name} 誠摯歡迎您的加入!"
   users:
     follow_limit_reached: 您無法跟隨多於 %{limit} 個人
+    go_to_sso_account_settings: 前往您的身分提供商 (identity provider) 之帳號設定
     invalid_otp_token: 兩階段認證碼不正確
     otp_lost_help_html: 如果您無法訪問這兩者,可以透過 %{email} 與我們聯繫
     seamless_external_login: 由於您是由外部系統登入,所以不能設定密碼與電子郵件。
     signed_in_as: 目前登入的帳號:
   verification:
-    explanation_html: 您在 Mastodon 個人檔案頁上所列出的連結,可以用此方式<strong>驗證您確實掌控該連結網頁的內容</strong>。您可以在連結的網頁上加上一個連回 Mastodon 個人檔案頁面的連結,該連結的原始碼 <strong>必須</strong>包含<code>rel="me"</code>屬性。連結的顯示文字可自由發揮,以下為範例:
+    explanation_html: 您可以<strong>透過以個人檔案頁上列出連結的方式,驗證您確實掌控該連結網頁的內容</strong>。為此,您可以在連結的網頁中加入一個連回 Mastodon 個人檔案頁面的連結。新增此連結之後,您可能要回到這裡並重新儲存您的個人檔案以使該驗證生效。該連結的原始碼 <strong>必須</strong>包含<code>rel="me"</code>屬性。連結的顯示文字則可自由發揮,以下為範例:
     verification: 驗證連結
   webauthn_credentials:
     add: 新增安全金鑰
@@ -1668,7 +1675,7 @@ zh-TW:
       success: 您已成功加入安全金鑰。
     delete: 刪除
     delete_confirmation: 您確定要移除這把安全金鑰嗎?
-    description_html: 如果您啟用<strong>安全金鑰驗證</strong>的話,您將在登入時需要使用其中一把安全金鑰。
+    description_html: 如果您啟用<strong>安全金鑰驗證</strong>的話,您將於登入時需要使用其中一把安全金鑰。
     destroy:
       error: 移除安全金鑰時出現了問題。請再試一次。
       success: 您已成功將安全金鑰移除。
diff --git a/config/settings.yml b/config/settings.yml
index c8d37a678..65eee7516 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -12,55 +12,17 @@ defaults: &defaults
   registrations_mode: 'open'
   profile_directory: true
   closed_registrations_message: ''
-  open_deletion: true
   timeline_preview: false
-  min_invite_role: 'admin'
   show_staff_badge: true
-  default_sensitive: false
-  unfollow_modal: false
-  boost_modal: false
-  favourite_modal: false
-  delete_modal: true
-  auto_play_gif: false
-  display_media: 'default'
-  expand_spoilers: false
   preview_sensitive_media: false
-  reduce_motion: false
-  disable_swiping: false
-  show_application: false
-  system_font_ui: false
-  system_emoji_font: false
   noindex: false
-  hide_followers_count: false
   flavour: 'glitch'
   skin: 'default'
-  aggregate_reblogs: true
-  advanced_layout: false
-  use_blurhash: true
-  use_pending_items: false
   trends: true
   trends_as_landing_page: true
   trendable_by_default: false
   trending_status_cw: true
-  crop_images: true
-  notification_emails:
-    follow: true
-    reblog: false
-    favourite: false
-    mention: true
-    follow_request: true
-    digest: true
-    report: true
-    pending_account: true
-    trending_tag: true
-    trending_link: false
-    trending_status: false
-    appeal: true
-  always_send_emails: false
-  interactions:
-    must_be_follower: false
-    must_be_following: false
-    must_be_following_dm: false
+  hide_followers_count: false
   reserved_usernames:
     - admin
     - support
diff --git a/db/migrate/20170918125918_ids_to_bigints.rb b/db/migrate/20170918125918_ids_to_bigints.rb
index bf875e4e5..e3fc34a51 100644
--- a/db/migrate/20170918125918_ids_to_bigints.rb
+++ b/db/migrate/20170918125918_ids_to_bigints.rb
@@ -1,7 +1,9 @@
-require Rails.root.join('lib', 'mastodon', 'migration_helpers')
+require_relative '../../lib/mastodon/migration_helpers'
+require_relative '../../lib/mastodon/migration_warning'
 
 class IdsToBigints < ActiveRecord::Migration[5.1]
   include Mastodon::MigrationHelpers
+  include Mastodon::MigrationWarning
 
   disable_ddl_transaction!
 
@@ -69,24 +71,12 @@ class IdsToBigints < ActiveRecord::Migration[5.1]
     ]
     included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
 
-    # Print out a warning that this will probably take a while.
-    if $stdout.isatty
-      say ''
-      say 'WARNING: This migration may take a *long* time for large instances'
-      say 'It will *not* lock tables for any significant time, but it may run'
-      say 'for a very long time. We will pause for 10 seconds to allow you to'
-      say 'interrupt this migration if you are not ready.'
-      say ''
-      say 'This migration has some sections that can be safely interrupted'
-      say 'and restarted later, and will tell you when those are occurring.'
-      say ''
-      say 'For more information, see https://github.com/mastodon/mastodon/pull/5088'
+    migration_duration_warning(<<~EXPLANATION)
+      This migration has some sections that can be safely interrupted
+      and restarted later, and will tell you when those are occurring.
 
-      10.downto(1) do |i|
-        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-        sleep 1
-      end
-    end
+      For more information, see https://github.com/mastodon/mastodon/pull/5088
+    EXPLANATION
 
     tables = included_columns.map(&:first).uniq
     table_sizes = {}
diff --git a/db/migrate/20170927215609_add_description_to_media_attachments.rb b/db/migrate/20170927215609_add_description_to_media_attachments.rb
index db8d76566..9c3312373 100644
--- a/db/migrate/20170927215609_add_description_to_media_attachments.rb
+++ b/db/migrate/20170927215609_add_description_to_media_attachments.rb
@@ -1,4 +1,4 @@
-class AddDescriptionToMediaAttachments < ActiveRecord::Migration[5.1]
+class AddDescriptionToMediaAttachments < ActiveRecord::Migration[5.2]
   def change
     add_column :media_attachments, :description, :text
   end
diff --git a/db/migrate/20170928082043_create_email_domain_blocks.rb b/db/migrate/20170928082043_create_email_domain_blocks.rb
index 1f0fb7587..2baed54ef 100644
--- a/db/migrate/20170928082043_create_email_domain_blocks.rb
+++ b/db/migrate/20170928082043_create_email_domain_blocks.rb
@@ -1,4 +1,4 @@
-class CreateEmailDomainBlocks < ActiveRecord::Migration[5.1]
+class CreateEmailDomainBlocks < ActiveRecord::Migration[5.2]
   def change
     create_table :email_domain_blocks do |t|
       t.string :domain, null: false
diff --git a/db/migrate/20171005102658_create_account_moderation_notes.rb b/db/migrate/20171005102658_create_account_moderation_notes.rb
index 010b94586..afa2f5f25 100644
--- a/db/migrate/20171005102658_create_account_moderation_notes.rb
+++ b/db/migrate/20171005102658_create_account_moderation_notes.rb
@@ -1,4 +1,4 @@
-class CreateAccountModerationNotes < ActiveRecord::Migration[5.1]
+class CreateAccountModerationNotes < ActiveRecord::Migration[5.2]
   def change
     create_table :account_moderation_notes do |t|
       t.text :content, null: false
diff --git a/db/migrate/20171005171936_add_disabled_to_custom_emojis.rb b/db/migrate/20171005171936_add_disabled_to_custom_emojis.rb
index 067a7bee0..7cf007ae9 100644
--- a/db/migrate/20171005171936_add_disabled_to_custom_emojis.rb
+++ b/db/migrate/20171005171936_add_disabled_to_custom_emojis.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddDisabledToCustomEmojis < ActiveRecord::Migration[5.1]
+class AddDisabledToCustomEmojis < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171006142024_add_uri_to_custom_emojis.rb b/db/migrate/20171006142024_add_uri_to_custom_emojis.rb
index 04dfcf397..ff62aed20 100644
--- a/db/migrate/20171006142024_add_uri_to_custom_emojis.rb
+++ b/db/migrate/20171006142024_add_uri_to_custom_emojis.rb
@@ -1,4 +1,4 @@
-class AddUriToCustomEmojis < ActiveRecord::Migration[5.1]
+class AddUriToCustomEmojis < ActiveRecord::Migration[5.2]
   def change
     add_column :custom_emojis, :uri, :string
     add_column :custom_emojis, :image_remote_url, :string
diff --git a/db/migrate/20171010023049_add_foreign_key_to_account_moderation_notes.rb b/db/migrate/20171010023049_add_foreign_key_to_account_moderation_notes.rb
index cdcd15934..a2c0fbcc4 100644
--- a/db/migrate/20171010023049_add_foreign_key_to_account_moderation_notes.rb
+++ b/db/migrate/20171010023049_add_foreign_key_to_account_moderation_notes.rb
@@ -1,4 +1,4 @@
-class AddForeignKeyToAccountModerationNotes < ActiveRecord::Migration[5.1]
+class AddForeignKeyToAccountModerationNotes < ActiveRecord::Migration[5.2]
   def change
     safety_assured { add_foreign_key :account_moderation_notes, :accounts }
   end
diff --git a/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb b/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
index 1d7a0086c..62725c88d 100644
--- a/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
+++ b/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
@@ -1,4 +1,4 @@
-class ChangeAccountsNonnullableInAccountModerationNotes < ActiveRecord::Migration[5.1]
+class ChangeAccountsNonnullableInAccountModerationNotes < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       change_column_null :account_moderation_notes, :account_id, false
diff --git a/db/migrate/20171020084748_add_visible_in_picker_to_custom_emoji.rb b/db/migrate/20171020084748_add_visible_in_picker_to_custom_emoji.rb
index 946e26ff2..5f7c60a3e 100644
--- a/db/migrate/20171020084748_add_visible_in_picker_to_custom_emoji.rb
+++ b/db/migrate/20171020084748_add_visible_in_picker_to_custom_emoji.rb
@@ -1,4 +1,4 @@
-class AddVisibleInPickerToCustomEmoji < ActiveRecord::Migration[5.1]
+class AddVisibleInPickerToCustomEmoji < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       add_column :custom_emojis, :visible_in_picker, :boolean, default: true, null: false
diff --git a/db/migrate/20171028221157_add_reblogs_to_follows.rb b/db/migrate/20171028221157_add_reblogs_to_follows.rb
index 3b2e46ed8..773904249 100644
--- a/db/migrate/20171028221157_add_reblogs_to_follows.rb
+++ b/db/migrate/20171028221157_add_reblogs_to_follows.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddReblogsToFollows < ActiveRecord::Migration[5.1]
+class AddReblogsToFollows < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171107143332_add_memorial_to_accounts.rb b/db/migrate/20171107143332_add_memorial_to_accounts.rb
index f3e012ce8..4fb1216a1 100644
--- a/db/migrate/20171107143332_add_memorial_to_accounts.rb
+++ b/db/migrate/20171107143332_add_memorial_to_accounts.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddMemorialToAccounts < ActiveRecord::Migration[5.1]
+class AddMemorialToAccounts < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171107143624_add_disabled_to_users.rb b/db/migrate/20171107143624_add_disabled_to_users.rb
index a71cac1c6..fb736786d 100644
--- a/db/migrate/20171107143624_add_disabled_to_users.rb
+++ b/db/migrate/20171107143624_add_disabled_to_users.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddDisabledToUsers < ActiveRecord::Migration[5.1]
+class AddDisabledToUsers < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171109012327_add_moderator_to_accounts.rb b/db/migrate/20171109012327_add_moderator_to_accounts.rb
index ddd87583a..70b0b598c 100644
--- a/db/migrate/20171109012327_add_moderator_to_accounts.rb
+++ b/db/migrate/20171109012327_add_moderator_to_accounts.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddModeratorToAccounts < ActiveRecord::Migration[5.1]
+class AddModeratorToAccounts < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171114080328_add_index_domain_to_email_domain_blocks.rb b/db/migrate/20171114080328_add_index_domain_to_email_domain_blocks.rb
index 84a341510..34dc6ff00 100644
--- a/db/migrate/20171114080328_add_index_domain_to_email_domain_blocks.rb
+++ b/db/migrate/20171114080328_add_index_domain_to_email_domain_blocks.rb
@@ -1,4 +1,4 @@
-class AddIndexDomainToEmailDomainBlocks < ActiveRecord::Migration[5.1]
+class AddIndexDomainToEmailDomainBlocks < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20171114231651_create_lists.rb b/db/migrate/20171114231651_create_lists.rb
index 21285e901..b7761abe4 100644
--- a/db/migrate/20171114231651_create_lists.rb
+++ b/db/migrate/20171114231651_create_lists.rb
@@ -1,4 +1,4 @@
-class CreateLists < ActiveRecord::Migration[5.1]
+class CreateLists < ActiveRecord::Migration[5.2]
   def change
     create_table :lists do |t|
       t.references :account, foreign_key: { on_delete: :cascade }
diff --git a/db/migrate/20171116161857_create_list_accounts.rb b/db/migrate/20171116161857_create_list_accounts.rb
index b76c90651..7dbb78d8d 100644
--- a/db/migrate/20171116161857_create_list_accounts.rb
+++ b/db/migrate/20171116161857_create_list_accounts.rb
@@ -1,4 +1,4 @@
-class CreateListAccounts < ActiveRecord::Migration[5.1]
+class CreateListAccounts < ActiveRecord::Migration[5.2]
   def change
     create_table :list_accounts do |t|
       t.belongs_to :list, foreign_key: { on_delete: :cascade }, null: false
diff --git a/db/migrate/20171118012443_add_moved_to_account_id_to_accounts.rb b/db/migrate/20171118012443_add_moved_to_account_id_to_accounts.rb
index 586ef6f02..893972848 100644
--- a/db/migrate/20171118012443_add_moved_to_account_id_to_accounts.rb
+++ b/db/migrate/20171118012443_add_moved_to_account_id_to_accounts.rb
@@ -1,4 +1,4 @@
-class AddMovedToAccountIdToAccounts < ActiveRecord::Migration[5.1]
+class AddMovedToAccountIdToAccounts < ActiveRecord::Migration[5.2]
   def change
     add_column :accounts, :moved_to_account_id, :bigint, null: true, default: nil
     safety_assured { add_foreign_key :accounts, :accounts, column: :moved_to_account_id, on_delete: :nullify }
diff --git a/db/migrate/20171119172437_create_admin_action_logs.rb b/db/migrate/20171119172437_create_admin_action_logs.rb
index b690735d2..80d5a3dba 100644
--- a/db/migrate/20171119172437_create_admin_action_logs.rb
+++ b/db/migrate/20171119172437_create_admin_action_logs.rb
@@ -1,4 +1,4 @@
-class CreateAdminActionLogs < ActiveRecord::Migration[5.1]
+class CreateAdminActionLogs < ActiveRecord::Migration[5.2]
   def change
     create_table :admin_action_logs do |t|
       t.belongs_to :account, foreign_key: { on_delete: :cascade }
diff --git a/db/migrate/20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb b/db/migrate/20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
index 131e54b72..a02ffe09d 100644
--- a/db/migrate/20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
+++ b/db/migrate/20171122120436_add_index_account_and_reblog_of_id_to_statuses.rb
@@ -1,4 +1,4 @@
-class AddIndexAccountAndReblogOfIdToStatuses < ActiveRecord::Migration[5.1]
+class AddIndexAccountAndReblogOfIdToStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def up
diff --git a/db/migrate/20171125024930_create_invites.rb b/db/migrate/20171125024930_create_invites.rb
index bcf03bd72..2e814babf 100644
--- a/db/migrate/20171125024930_create_invites.rb
+++ b/db/migrate/20171125024930_create_invites.rb
@@ -1,4 +1,4 @@
-class CreateInvites < ActiveRecord::Migration[5.1]
+class CreateInvites < ActiveRecord::Migration[5.2]
   def change
     create_table :invites do |t|
       t.belongs_to :user, foreign_key: { on_delete: :cascade }
diff --git a/db/migrate/20171125031751_add_invite_id_to_users.rb b/db/migrate/20171125031751_add_invite_id_to_users.rb
index 9cfb0c542..2ff6c3430 100644
--- a/db/migrate/20171125031751_add_invite_id_to_users.rb
+++ b/db/migrate/20171125031751_add_invite_id_to_users.rb
@@ -1,4 +1,4 @@
-class AddInviteIdToUsers < ActiveRecord::Migration[5.1]
+class AddInviteIdToUsers < ActiveRecord::Migration[5.2]
   def change
     safety_assured { add_reference :users, :invite, null: true, default: nil, foreign_key: { on_delete: :nullify }, index: false }
   end
diff --git a/db/migrate/20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb b/db/migrate/20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
index 37662eaa5..8952387b5 100644
--- a/db/migrate/20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
+++ b/db/migrate/20171125185353_add_index_reblog_of_id_and_account_to_statuses.rb
@@ -1,4 +1,4 @@
-class AddIndexReblogOfIdAndAccountToStatuses < ActiveRecord::Migration[5.1]
+class AddIndexReblogOfIdAndAccountToStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20171125190735_remove_old_reblog_index_on_statuses.rb b/db/migrate/20171125190735_remove_old_reblog_index_on_statuses.rb
index 68146c5ce..dc7e09a25 100644
--- a/db/migrate/20171125190735_remove_old_reblog_index_on_statuses.rb
+++ b/db/migrate/20171125190735_remove_old_reblog_index_on_statuses.rb
@@ -1,4 +1,4 @@
-class RemoveOldReblogIndexOnStatuses < ActiveRecord::Migration[5.1]
+class RemoveOldReblogIndexOnStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def up
diff --git a/db/migrate/20171129172043_add_index_on_stream_entries.rb b/db/migrate/20171129172043_add_index_on_stream_entries.rb
index 181c4f288..4580fb42f 100644
--- a/db/migrate/20171129172043_add_index_on_stream_entries.rb
+++ b/db/migrate/20171129172043_add_index_on_stream_entries.rb
@@ -1,4 +1,4 @@
-class AddIndexOnStreamEntries < ActiveRecord::Migration[5.1]
+class AddIndexOnStreamEntries < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb b/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb
index 8fcabef9f..811f6ceae 100644
--- a/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb
+++ b/db/migrate/20171130000000_add_embed_url_to_preview_cards.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddEmbedURLToPreviewCards < ActiveRecord::Migration[5.1]
+class AddEmbedURLToPreviewCards < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
index ac86c9e77..e8e878611 100644
--- a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
+++ b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
@@ -1,4 +1,4 @@
-class ChangeAccountIdNonnullableInLists < ActiveRecord::Migration[5.1]
+class ChangeAccountIdNonnullableInLists < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       change_column_null :lists, :account_id, false
diff --git a/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb b/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb
index ba67eee86..f3007c77c 100644
--- a/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb
+++ b/db/migrate/20171212195226_remove_duplicate_indexes_in_lists.rb
@@ -1,4 +1,4 @@
-class RemoveDuplicateIndexesInLists < ActiveRecord::Migration[5.1]
+class RemoveDuplicateIndexesInLists < ActiveRecord::Migration[5.2]
   def change
     remove_index :list_accounts, name: 'index_list_accounts_on_account_id'
     remove_index :list_accounts, name: 'index_list_accounts_on_list_id'
diff --git a/db/migrate/20171226094803_more_faster_index_on_notifications.rb b/db/migrate/20171226094803_more_faster_index_on_notifications.rb
index 0273a4e7c..e0e73b27a 100644
--- a/db/migrate/20171226094803_more_faster_index_on_notifications.rb
+++ b/db/migrate/20171226094803_more_faster_index_on_notifications.rb
@@ -1,4 +1,4 @@
-class MoreFasterIndexOnNotifications < ActiveRecord::Migration[5.1]
+class MoreFasterIndexOnNotifications < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb b/db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
index 401fc5e62..eb277d3bc 100644
--- a/db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
+++ b/db/migrate/20180106000232_add_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
@@ -1,4 +1,4 @@
-class AddIndexOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.1]
+class AddIndexOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20180109143959_add_remember_token_to_users.rb b/db/migrate/20180109143959_add_remember_token_to_users.rb
index 662905bcb..f244fc6f6 100644
--- a/db/migrate/20180109143959_add_remember_token_to_users.rb
+++ b/db/migrate/20180109143959_add_remember_token_to_users.rb
@@ -1,4 +1,4 @@
-class AddRememberTokenToUsers < ActiveRecord::Migration[5.1]
+class AddRememberTokenToUsers < ActiveRecord::Migration[5.2]
   def change
     add_column :users, :remember_token, :string, null: true
   end
diff --git a/db/migrate/20180204034416_create_identities.rb b/db/migrate/20180204034416_create_identities.rb
index f6f5da910..68288aadf 100644
--- a/db/migrate/20180204034416_create_identities.rb
+++ b/db/migrate/20180204034416_create_identities.rb
@@ -1,7 +1,7 @@
-class CreateIdentities < ActiveRecord::Migration[5.0]
+class CreateIdentities < ActiveRecord::Migration[5.2]
   def change
-    create_table :identities do |t|
-      t.references :user, foreign_key: { on_delete: :cascade }
+    create_table :identities, id: :integer do |t|
+      t.references :user, type: :integer, foreign_key: { on_delete: :cascade }
       t.string :provider, null: false, default: ''
       t.string :uid, null: false, default: ''
 
diff --git a/db/migrate/20180206000000_change_user_id_nonnullable.rb b/db/migrate/20180206000000_change_user_id_nonnullable.rb
index 2d2cf20d3..119638387 100644
--- a/db/migrate/20180206000000_change_user_id_nonnullable.rb
+++ b/db/migrate/20180206000000_change_user_id_nonnullable.rb
@@ -1,4 +1,4 @@
-class ChangeUserIdNonnullable < ActiveRecord::Migration[5.1]
+class ChangeUserIdNonnullable < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       change_column_null :invites, :user_id, false
diff --git a/db/migrate/20180211015820_create_backups.rb b/db/migrate/20180211015820_create_backups.rb
index 9725a3e9f..4aaeed83b 100644
--- a/db/migrate/20180211015820_create_backups.rb
+++ b/db/migrate/20180211015820_create_backups.rb
@@ -1,4 +1,4 @@
-class CreateBackups < ActiveRecord::Migration[5.1]
+class CreateBackups < ActiveRecord::Migration[5.2]
   def change
     create_table :backups do |t|
       t.references :user, foreign_key: { on_delete: :nullify }
diff --git a/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb b/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb
index 1964b5121..46842a9e3 100644
--- a/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb
+++ b/db/migrate/20180304013859_add_featured_collection_url_to_accounts.rb
@@ -1,4 +1,4 @@
-class AddFeaturedCollectionURLToAccounts < ActiveRecord::Migration[5.1]
+class AddFeaturedCollectionURLToAccounts < ActiveRecord::Migration[5.2]
   def change
     add_column :accounts, :featured_collection_url, :string
   end
diff --git a/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb b/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
index dba789207..8577d0235 100644
--- a/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
+++ b/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
@@ -1,4 +1,4 @@
-class ChangeColumnsInNotificationsNonnullable < ActiveRecord::Migration[5.1]
+class ChangeColumnsInNotificationsNonnullable < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       change_column_null :notifications, :activity_id, false
diff --git a/db/migrate/20180402031200_add_assigned_account_id_to_reports.rb b/db/migrate/20180402031200_add_assigned_account_id_to_reports.rb
index e2d1371d2..27cbd6c2a 100644
--- a/db/migrate/20180402031200_add_assigned_account_id_to_reports.rb
+++ b/db/migrate/20180402031200_add_assigned_account_id_to_reports.rb
@@ -1,4 +1,4 @@
-class AddAssignedAccountIdToReports < ActiveRecord::Migration[5.1]
+class AddAssignedAccountIdToReports < ActiveRecord::Migration[5.2]
   def change
     safety_assured { add_reference :reports, :assigned_account, null: true, default: nil, foreign_key: { on_delete: :nullify, to_table: :accounts }, index: false }
   end
diff --git a/db/migrate/20180402040909_create_report_notes.rb b/db/migrate/20180402040909_create_report_notes.rb
index 429cb4534..5d5a33627 100644
--- a/db/migrate/20180402040909_create_report_notes.rb
+++ b/db/migrate/20180402040909_create_report_notes.rb
@@ -1,4 +1,4 @@
-class CreateReportNotes < ActiveRecord::Migration[5.1]
+class CreateReportNotes < ActiveRecord::Migration[5.2]
   def change
     create_table :report_notes do |t|
       t.text :content, null: false
diff --git a/db/migrate/20180410204633_add_fields_to_accounts.rb b/db/migrate/20180410204633_add_fields_to_accounts.rb
index 5b8c17480..a1b9504b6 100644
--- a/db/migrate/20180410204633_add_fields_to_accounts.rb
+++ b/db/migrate/20180410204633_add_fields_to_accounts.rb
@@ -1,4 +1,4 @@
-class AddFieldsToAccounts < ActiveRecord::Migration[5.1]
+class AddFieldsToAccounts < ActiveRecord::Migration[5.2]
   def change
     add_column :accounts, :fields, :jsonb
   end
diff --git a/db/migrate/20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb b/db/migrate/20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
index a3f883fcb..48d156bef 100644
--- a/db/migrate/20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
+++ b/db/migrate/20180514130000_improve_index_on_statuses_for_api_v1_accounts_account_id_statuses.rb
@@ -1,10 +1,10 @@
 # frozen_string_literal: true
 
-class ImproveIndexOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.1]
+class ImproveIndexOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
-    #  These changes ware reverted by migration 20180514140000.
+    #  These changes were reverted by migration 20180514140000.
     #  add_index :statuses, [:account_id, :id, :visibility], where: 'visibility IN (0, 1, 2)', algorithm: :concurrently
     #  add_index :statuses, [:account_id, :id], where: 'visibility = 3', algorithm: :concurrently
     #  remove_index :statuses, column: [:account_id, :id, :visibility, :updated_at], order: { id: :desc }, algorithm: :concurrently, name: :index_statuses_20180106
diff --git a/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb b/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
index c00302804..242ae7410 100644
--- a/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
+++ b/db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class RevertIndexChangeOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.1]
+class RevertIndexChangeOnStatusesForApiV1AccountsAccountIdStatuses < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def change
diff --git a/db/migrate/20180528141303_fix_accounts_unique_index.rb b/db/migrate/20180528141303_fix_accounts_unique_index.rb
index 0b39f7107..1e67b4bb4 100644
--- a/db/migrate/20180528141303_fix_accounts_unique_index.rb
+++ b/db/migrate/20180528141303_fix_accounts_unique_index.rb
@@ -1,4 +1,8 @@
+require_relative '../../lib/mastodon/migration_warning'
+
 class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
+  include Mastodon::MigrationWarning
+
   class Account < ApplicationRecord
     # Dummy class, to make migration possible across version changes
     has_one :user, inverse_of: :account
@@ -35,22 +39,11 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def up
-    if $stdout.isatty
-      say ''
-      say 'WARNING: This migration may take a *long* time for large instances'
-      say 'It will *not* lock tables for any significant time, but it may run'
-      say 'for a very long time. We will pause for 10 seconds to allow you to'
-      say 'interrupt this migration if you are not ready.'
-      say ''
-      say 'This migration will irreversibly delete user accounts with duplicate'
-      say 'usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`'
-      say 'task to manually deal with such accounts before running this migration.'
-
-      10.downto(1) do |i|
-        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-        sleep 1
-      end
-    end
+    migration_duration_warning(<<~EXPLANATION)
+      This migration will irreversibly delete user accounts with duplicate
+      usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`
+      task to manually deal with such accounts before running this migration.
+    EXPLANATION
 
     duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_ary
 
diff --git a/db/migrate/20180831171112_create_bookmarks.rb b/db/migrate/20180831171112_create_bookmarks.rb
index 5d587b7e9..9f6bfae57 100644
--- a/db/migrate/20180831171112_create_bookmarks.rb
+++ b/db/migrate/20180831171112_create_bookmarks.rb
@@ -1,7 +1,7 @@
 # This migration is a duplicate of 20180410220657 and may get ignored, see
 # config/initializers/0_duplicate_migrations.rb
 
-class CreateBookmarks < ActiveRecord::Migration[5.1]
+class CreateBookmarks < ActiveRecord::Migration[5.2]
   def change
     create_table :bookmarks do |t|
       t.references :account, null: false
diff --git a/db/migrate/20181024224956_migrate_account_conversations.rb b/db/migrate/20181024224956_migrate_account_conversations.rb
index aca6638e1..e4dcdb18b 100644
--- a/db/migrate/20181024224956_migrate_account_conversations.rb
+++ b/db/migrate/20181024224956_migrate_account_conversations.rb
@@ -1,4 +1,8 @@
+require_relative '../../lib/mastodon/migration_warning'
+
 class MigrateAccountConversations < ActiveRecord::Migration[5.2]
+  include Mastodon::MigrationWarning
+
   disable_ddl_transaction!
 
   class Mention < ApplicationRecord
@@ -62,19 +66,7 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2]
   end
 
   def up
-    if $stdout.isatty
-      say ''
-      say 'WARNING: This migration may take a *long* time for large instances'
-      say 'It will *not* lock tables for any significant time, but it may run'
-      say 'for a very long time. We will pause for 10 seconds to allow you to'
-      say 'interrupt this migration if you are not ready.'
-      say ''
-
-      10.downto(1) do |i|
-        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-        sleep 1
-      end
-    end
+    migration_duration_warning
 
     migrated  = 0
     last_time = Time.zone.now
diff --git a/db/migrate/20191031163205_change_list_account_follow_nullable.rb b/db/migrate/20191031163205_change_list_account_follow_nullable.rb
index 65ff93365..43ebfe892 100644
--- a/db/migrate/20191031163205_change_list_account_follow_nullable.rb
+++ b/db/migrate/20191031163205_change_list_account_follow_nullable.rb
@@ -1,4 +1,4 @@
-class ChangeListAccountFollowNullable < ActiveRecord::Migration[5.1]
+class ChangeListAccountFollowNullable < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
       change_column_null :list_accounts, :follow_id, true
diff --git a/db/migrate/20200622213645_media_attachment_ids_to_timestamp_ids.rb b/db/migrate/20200622213645_media_attachment_ids_to_timestamp_ids.rb
index ccd65bf53..7c141e7af 100644
--- a/db/migrate/20200622213645_media_attachment_ids_to_timestamp_ids.rb
+++ b/db/migrate/20200622213645_media_attachment_ids_to_timestamp_ids.rb
@@ -1,4 +1,4 @@
-class MediaAttachmentIdsToTimestampIds < ActiveRecord::Migration[5.1]
+class MediaAttachmentIdsToTimestampIds < ActiveRecord::Migration[5.2]
   def up
     # Set up the media_attachments.id column to use our timestamp-based IDs.
     safety_assured do
diff --git a/db/migrate/20200917192924_add_notify_to_follows.rb b/db/migrate/20200917192924_add_notify_to_follows.rb
index d27471c44..342eaa38d 100644
--- a/db/migrate/20200917192924_add_notify_to_follows.rb
+++ b/db/migrate/20200917192924_add_notify_to_follows.rb
@@ -1,6 +1,6 @@
 require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 
-class AddNotifyToFollows < ActiveRecord::Migration[5.1]
+class AddNotifyToFollows < ActiveRecord::Migration[5.2]
   include Mastodon::MigrationHelpers
 
   disable_ddl_transaction!
diff --git a/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb b/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb
index 40c582842..b287c60dd 100644
--- a/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb
+++ b/db/migrate/20210306164523_account_ids_to_timestamp_ids.rb
@@ -1,4 +1,4 @@
-class AccountIdsToTimestampIds < ActiveRecord::Migration[5.1]
+class AccountIdsToTimestampIds < ActiveRecord::Migration[5.2]
   def up
     # Set up the accounts.id column to use our timestamp-based IDs.
     safety_assured do
diff --git a/db/migrate/20230215074327_add_settings_to_users.rb b/db/migrate/20230215074327_add_settings_to_users.rb
new file mode 100644
index 000000000..ff5308f42
--- /dev/null
+++ b/db/migrate/20230215074327_add_settings_to_users.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddSettingsToUsers < ActiveRecord::Migration[6.1]
+  def change
+    add_column :users, :settings, :text
+  end
+end
diff --git a/db/migrate/20230215074423_move_user_settings.rb b/db/migrate/20230215074423_move_user_settings.rb
new file mode 100644
index 000000000..351a8b61d
--- /dev/null
+++ b/db/migrate/20230215074423_move_user_settings.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+class MoveUserSettings < ActiveRecord::Migration[6.1]
+  class User < ApplicationRecord; end
+
+  MAPPING = {
+    default_privacy: 'default_privacy',
+    default_sensitive: 'web.default_sensitive',
+    default_language: 'default_language',
+    noindex: 'noindex',
+    theme: 'theme',
+    trends: 'web.trends',
+    unfollow_modal: 'web.unfollow_modal',
+    boost_modal: 'web.reblog_modal',
+    delete_modal: 'web.delete_modal',
+    auto_play_gif: 'web.auto_play',
+    display_media: 'web.display_media',
+    expand_spoilers: 'web.expand_content_warnings',
+    reduce_motion: 'web.reduce_motion',
+    disable_swiping: 'web.disable_swiping',
+    show_application: 'show_application',
+    system_font_ui: 'web.use_system_font',
+    aggregate_reblogs: 'aggregate_reblogs',
+    advanced_layout: 'web.advanced_layout',
+    use_blurhash: 'web.use_blurhash',
+    use_pending_items: 'web.use_pending_items',
+    crop_images: 'web.crop_images',
+    notification_emails: {
+      follow: 'notification_emails.follow',
+      reblog: 'notification_emails.reblog',
+      favourite: 'notification_emails.favourite',
+      mention: 'notification_emails.mention',
+      follow_request: 'notification_emails.follow_request',
+      report: 'notification_emails.report',
+      pending_account: 'notification_emails.pending_account',
+      trending_tag: 'notification_emails.trends',
+      appeal: 'notification_emails.appeal',
+    }.freeze,
+    always_send_emails: 'always_send_emails',
+    interactions: {
+      must_be_follower: 'interactions.must_be_follower',
+      must_be_following: 'interactions.must_be_following',
+      must_be_following_dm: 'interactions.must_be_following_dm',
+    }.freeze,
+  }.freeze
+
+  class LegacySetting < ApplicationRecord
+    self.table_name = 'settings'
+
+    def var
+      self[:var]&.to_sym
+    end
+
+    def value
+      YAML.safe_load(self[:value], permitted_classes: [ActiveSupport::HashWithIndifferentAccess]) if self[:value].present?
+    end
+  end
+
+  def up
+    User.find_each do |user|
+      previous_settings = LegacySetting.where(thing_type: 'User', thing_id: user.id).index_by(&:var)
+
+      user_settings = {}
+
+      MAPPING.each do |legacy_key, new_key|
+        value = previous_settings[legacy_key]&.value
+
+        next if value.blank?
+
+        if value.is_a?(Hash)
+          value.each do |nested_key, nested_value|
+            user_settings[MAPPING[legacy_key][nested_key.to_sym]] = nested_value
+          end
+        else
+          user_settings[new_key] = value
+        end
+      end
+
+      user.update_column('settings', Oj.dump(user_settings)) # rubocop:disable Rails/SkipsModelValidations
+    end
+  end
+
+  def down; end
+end
diff --git a/db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb b/db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb
index a46349cb7..615f35cd0 100644
--- a/db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb
+++ b/db/post_migrate/20190511152737_remove_suspended_silenced_account_fields.rb
@@ -34,6 +34,7 @@ class RemoveSuspendedSilencedAccountFields < ActiveRecord::Migration[5.2]
       remove_column :accounts, :suspended, :boolean, null: false, default: false
       remove_column :accounts, :silenced, :boolean, null: false, default: false
     end
+    Account.reset_column_information
   end
 
   def down
diff --git a/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb b/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb
index 53e24ef26..511104cef 100644
--- a/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb
+++ b/db/post_migrate/20210308133107_remove_subscription_expires_at_from_accounts.rb
@@ -1,7 +1,7 @@
-class RemoveSubscriptionExpiresAtFromAccounts < ActiveRecord::Migration[5.0]
+class RemoveSubscriptionExpiresAtFromAccounts < ActiveRecord::Migration[5.2]
   def change
     safety_assured do
-      remove_column :accounts, :subscription_expires_at, :datetime, null: true, default: nil
+      remove_column :accounts, :subscription_expires_at, :datetime, null: true, default: nil, precision: nil
     end
   end
 end
diff --git a/db/schema.rb b/db/schema.rb
index 7462bf2c7..5b03e24f5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2022_12_06_114142) do
+ActiveRecord::Schema.define(version: 2023_02_15_074423) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -1063,6 +1063,7 @@ ActiveRecord::Schema.define(version: 2022_12_06_114142) do
     t.inet "sign_up_ip"
     t.boolean "skip_sign_in_token"
     t.bigint "role_id"
+    t.text "settings"
     t.index ["account_id"], name: "index_users_on_account_id"
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id", where: "(created_by_application_id IS NOT NULL)"
diff --git a/db/seeds.rb b/db/seeds.rb
index 1ca300de7..c01e83f1d 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1,5 +1,7 @@
 # frozen_string_literal: true
 
-Dir[Rails.root.join('db', 'seeds', '*.rb')].sort.each do |seed|
-  load seed
+Chewy.strategy(:mastodon) do
+  Dir[Rails.root.join('db', 'seeds', '*.rb')].sort.each do |seed|
+    load seed
+  end
 end
diff --git a/dist/nginx.conf b/dist/nginx.conf
index 5bc960e25..bed4bd3db 100644
--- a/dist/nginx.conf
+++ b/dist/nginx.conf
@@ -39,7 +39,7 @@ server {
 
   keepalive_timeout    70;
   sendfile             on;
-  client_max_body_size 80m;
+  client_max_body_size 99m;
 
   root /home/mastodon/live/public;
 
diff --git a/lib/mastodon/migration_warning.rb b/lib/mastodon/migration_warning.rb
new file mode 100644
index 000000000..227f6705d
--- /dev/null
+++ b/lib/mastodon/migration_warning.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Mastodon
+  module MigrationWarning
+    WARNING_SECONDS = 10
+
+    DEFAULT_WARNING = <<~WARNING_MESSAGE
+      WARNING: This migration may take a *long* time for large instances.
+      It will *not* lock tables for any significant time, but it may run
+      for a very long time. We will pause for #{WARNING_SECONDS} seconds to allow you to
+      interrupt this migration if you are not ready.
+    WARNING_MESSAGE
+
+    def migration_duration_warning(explanation = nil)
+      return unless valid_environment?
+
+      announce_warning(explanation)
+
+      announce_countdown
+    end
+
+    private
+
+    def announce_countdown
+      WARNING_SECONDS.downto(1) do |i|
+        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
+        sleep 1
+      end
+    end
+
+    def valid_environment?
+      $stdout.isatty && Rails.env.production?
+    end
+
+    def announce_warning(explanation)
+      announce_message prepare_message(explanation)
+    end
+
+    def announce_message(text)
+      say ''
+      text.each_line do |line|
+        say(line)
+      end
+      say ''
+    end
+
+    def prepare_message(explanation)
+      if explanation.blank?
+        DEFAULT_WARNING
+      else
+        DEFAULT_WARNING + "\n#{explanation}"
+      end
+    end
+  end
+end
diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake
index 1dd25abb9..35073b78b 100644
--- a/lib/tasks/tests.rake
+++ b/lib/tasks/tests.rake
@@ -53,6 +53,11 @@ namespace :tests do
         puts 'Admin::ActionLog email domain block records not updated as expected'
         exit(1)
       end
+
+      unless User.find(1).settings['notification_emails.favourite'] == true && User.find(1).settings['notification_emails.mention'] == false
+        puts 'User settings not kept as expected'
+        exit(1)
+      end
     end
 
     desc 'Populate the database with test data for 2.4.3'
@@ -98,6 +103,11 @@ namespace :tests do
           (1, 'destroy', 'EmailDomainBlock', 1, now(), now()),
           (1, 'destroy', 'Status', 1, now(), now()),
           (1, 'destroy', 'CustomEmoji', 3, now(), now());
+
+        INSERT INTO "settings"
+          (id, thing_type, thing_id, var, value, created_at, updated_at)
+        VALUES
+          (3, 'User', 1, 'notification_emails', E'--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess\nfollow: false\nreblog: true\nfavourite: true\nmention: false\nfollow_request: true\ndigest: true\nreport: true\npending_account: false\ntrending_tag: true\nappeal: true\n', now(), now());
       SQL
     end
 
diff --git a/package.json b/package.json
index e7af5a913..4eaace8ce 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
     "test:lint:sass": "stylelint \"**/*.{css,scss}\" && prettier --check \"**/*.{css,scss}\"",
     "test:jest": "cross-env NODE_ENV=test jest",
     "format": "prettier --write .",
-    "format-check": "prettier --check ."
+    "format-check": "prettier --check .",
+    "prepare": "husky install"
   },
   "repository": {
     "type": "git",
@@ -51,19 +52,18 @@
     "compression-webpack-plugin": "^6.1.1",
     "cross-env": "^7.0.3",
     "css-loader": "^5.2.7",
-    "cssnano": "^5.1.15",
+    "cssnano": "^6.0.0",
     "detect-passive-events": "^2.0.3",
     "dotenv": "^16.0.3",
     "emoji-mart": "npm:emoji-mart-lazyload@latest",
     "es6-symbol": "^3.1.3",
     "escape-html": "^1.0.3",
-    "exif-js": "^2.3.0",
     "express": "^4.18.2",
     "favico.js": "^0.3.10",
     "file-loader": "^6.2.0",
     "font-awesome": "^4.7.0",
     "fuzzysort": "^2.0.4",
-    "glob": "^9.3.0",
+    "glob": "^9.3.2",
     "history": "^4.10.1",
     "http-link-header": "^1.1.0",
     "immutable": "^4.3.0",
@@ -75,9 +75,8 @@
     "jsdom": "^21.1.1",
     "lodash": "^4.17.21",
     "mark-loader": "^0.1.6",
-    "marky": "^1.2.5",
     "mini-css-extract-plugin": "^1.6.2",
-    "mkdirp": "^2.1.5",
+    "mkdirp": "^2.1.6",
     "npmlog": "^7.0.1",
     "object-assign": "^4.1.1",
     "object.values": "^1.1.6",
@@ -103,10 +102,10 @@
     "react-redux-loading-bar": "^5.0.4",
     "react-router-dom": "^4.1.1",
     "react-router-scroll-4": "^1.0.0-beta.1",
-    "react-select": "^5.7.1",
+    "react-select": "^5.7.2",
     "react-sparklines": "^1.7.0",
     "react-swipeable-views": "^0.14.0",
-    "react-textarea-autosize": "^8.4.0",
+    "react-textarea-autosize": "^8.4.1",
     "react-toggle": "^4.1.3",
     "redis": "^4.6.5",
     "redux": "^4.2.1",
@@ -115,8 +114,8 @@
     "regenerator-runtime": "^0.13.11",
     "requestidlecallback": "^0.3.0",
     "reselect": "^4.1.7",
-    "rimraf": "^4.4.0",
-    "sass": "^1.59.3",
+    "rimraf": "^4.4.1",
+    "sass": "^1.60.0",
     "sass-loader": "^10.2.0",
     "stacktrace-js": "^2.0.2",
     "stringz": "^2.1.0",
@@ -151,10 +150,13 @@
     "eslint-plugin-jsx-a11y": "~6.7.1",
     "eslint-plugin-promise": "~6.1.1",
     "eslint-plugin-react": "~7.32.2",
+    "husky": "^8.0.3",
     "jest": "^29.5.0",
     "jest-environment-jsdom": "^29.5.0",
+    "lint-staged": "^13.1.2",
+    "marky": "^1.2.5",
     "postcss-scss": "^4.0.6",
-    "prettier": "^2.8.5",
+    "prettier": "^2.8.7",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
     "react-test-renderer": "^16.14.0",
@@ -169,5 +171,10 @@
   "optionalDependencies": {
     "bufferutil": "^4.0.7",
     "utf-8-validate": "^6.0.3"
+  },
+  "lint-staged": {
+    "*": "prettier --ignore-unknown --write",
+    "*.{js,jsx}": "eslint --fix",
+    "*.{css,scss}": "stylelint --fix"
   }
 }
diff --git a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb
index e42f1de32..de08dd524 100644
--- a/spec/controllers/api/v1/accounts/credentials_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/credentials_controller_spec.rb
@@ -46,6 +46,7 @@ describe Api::V1::Accounts::CredentialsController do
         end
 
         it 'updates account info' do
+          user.reload
           user.account.reload
 
           expect(user.account.display_name).to eq("Alice Isn't Dead")
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index dc742074c..1aabae0ea 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -101,7 +101,8 @@ describe ApplicationController, type: :controller do
 
     it 'returns user\'s flavour when it is set' do
       current_user = Fabricate(:user)
-      current_user.settings['flavour'] = 'glitch'
+      current_user.settings.update(flavour: 'glitch')
+      current_user.save
       sign_in current_user
 
       allow(Setting).to receive(:[]).with('skin').and_return 'default'
diff --git a/spec/controllers/settings/preferences/notifications_controller_spec.rb b/spec/controllers/settings/preferences/notifications_controller_spec.rb
index 66fb8c5eb..29b7b6aec 100644
--- a/spec/controllers/settings/preferences/notifications_controller_spec.rb
+++ b/spec/controllers/settings/preferences/notifications_controller_spec.rb
@@ -20,20 +20,22 @@ describe Settings::Preferences::NotificationsController do
 
   describe 'PUT #update' do
     it 'updates notifications settings' do
-      user.settings['notification_emails'] = user.settings['notification_emails'].merge('follow' => false)
-      user.settings['interactions'] = user.settings['interactions'].merge('must_be_follower' => true)
+      user.settings.update('notification_emails.follow': false, 'interactions.must_be_follower': true)
+      user.save
 
       put :update, params: {
         user: {
-          notification_emails: { follow: '1' },
-          interactions: { must_be_follower: '0' },
+          settings_attributes: {
+            'notification_emails.follow': '1',
+            'interactions.must_be_follower': '0',
+          },
         },
       }
 
       expect(response).to redirect_to(settings_preferences_notifications_path)
       user.reload
-      expect(user.settings['notification_emails']['follow']).to be true
-      expect(user.settings['interactions']['must_be_follower']).to be false
+      expect(user.settings['notification_emails.follow']).to be true
+      expect(user.settings['interactions.must_be_follower']).to be false
     end
   end
 end
diff --git a/spec/controllers/settings/preferences/other_controller_spec.rb b/spec/controllers/settings/preferences/other_controller_spec.rb
index 63eeefaf0..249d1b5b5 100644
--- a/spec/controllers/settings/preferences/other_controller_spec.rb
+++ b/spec/controllers/settings/preferences/other_controller_spec.rb
@@ -29,20 +29,22 @@ describe Settings::Preferences::OtherController do
     end
 
     it 'updates user settings' do
-      user.settings['boost_modal'] = false
-      user.settings['delete_modal'] = true
+      user.settings.update('web.reblog_modal': false, 'web.delete_modal': true)
+      user.save
 
       put :update, params: {
         user: {
-          setting_boost_modal: '1',
-          setting_delete_modal: '0',
+          settings_attributes: {
+            'web.reblog_modal': '1',
+            'web.delete_modal': '0',
+          },
         },
       }
 
       expect(response).to redirect_to(settings_preferences_other_path)
       user.reload
-      expect(user.settings['boost_modal']).to be true
-      expect(user.settings['delete_modal']).to be false
+      expect(user.settings['web.reblog_modal']).to be true
+      expect(user.settings['web.delete_modal']).to be false
     end
   end
 end
diff --git a/spec/controllers/settings/profiles_controller_spec.rb b/spec/controllers/settings/profiles_controller_spec.rb
index e45596b1a..563e60271 100644
--- a/spec/controllers/settings/profiles_controller_spec.rb
+++ b/spec/controllers/settings/profiles_controller_spec.rb
@@ -44,12 +44,4 @@ RSpec.describe Settings::ProfilesController, type: :controller do
       expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(account.id)
     end
   end
-
-  describe 'PUT #update with oversized image' do
-    it 'gives the user an error message' do
-      allow(ActivityPub::UpdateDistributionWorker).to receive(:perform_async)
-      put :update, params: { account: { avatar: fixture_file_upload('4096x4097.png', 'image/png') } }
-      expect(response.body).to include('images are not supported')
-    end
-  end
 end
diff --git a/spec/lib/settings/extend_spec.rb b/spec/lib/settings/extend_spec.rb
deleted file mode 100644
index ea623137b..000000000
--- a/spec/lib/settings/extend_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Settings::Extend do
-  class User
-    include Settings::Extend
-  end
-
-  describe '#settings' do
-    it 'sets @settings as an instance of Settings::ScopedSettings' do
-      user = Fabricate(:user)
-      expect(user.settings).to be_a Settings::ScopedSettings
-    end
-  end
-end
diff --git a/spec/lib/settings/scoped_settings_spec.rb b/spec/lib/settings/scoped_settings_spec.rb
deleted file mode 100644
index 7566685b4..000000000
--- a/spec/lib/settings/scoped_settings_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Settings::ScopedSettings do
-  let(:object)         { Fabricate(:user) }
-  let(:scoped_setting) { described_class.new(object) }
-  let(:val)            { 'whatever' }
-  let(:methods)        { %i(auto_play_gif default_sensitive unfollow_modal boost_modal delete_modal reduce_motion system_font_ui noindex theme) }
-
-  describe '.initialize' do
-    it 'sets @object' do
-      scoped_setting = described_class.new(object)
-      expect(scoped_setting.instance_variable_get(:@object)).to be object
-    end
-  end
-
-  describe '#method_missing' do
-    it 'sets scoped_setting.method_name = val' do
-      methods.each do |key|
-        scoped_setting.send("#{key}=", val)
-        expect(scoped_setting.send(key)).to eq val
-      end
-    end
-  end
-
-  describe '#[]= and #[]' do
-    it 'sets [key] = val' do
-      methods.each do |key|
-        scoped_setting[key] = val
-        expect(scoped_setting[key]).to eq val
-      end
-    end
-  end
-end
diff --git a/spec/lib/user_settings_decorator_spec.rb b/spec/lib/user_settings_decorator_spec.rb
deleted file mode 100644
index 3b9b7ee2b..000000000
--- a/spec/lib/user_settings_decorator_spec.rb
+++ /dev/null
@@ -1,84 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-describe UserSettingsDecorator do
-  describe 'update' do
-    let(:user) { Fabricate(:user) }
-    let(:settings) { described_class.new(user) }
-
-    it 'updates the user settings value for email notifications' do
-      values = { 'notification_emails' => { 'follow' => '1' } }
-
-      settings.update(values)
-      expect(user.settings['notification_emails']['follow']).to be true
-    end
-
-    it 'updates the user settings value for interactions' do
-      values = { 'interactions' => { 'must_be_follower' => '0' } }
-
-      settings.update(values)
-      expect(user.settings['interactions']['must_be_follower']).to be false
-    end
-
-    it 'updates the user settings value for privacy' do
-      values = { 'setting_default_privacy' => 'public' }
-
-      settings.update(values)
-      expect(user.settings['default_privacy']).to eq 'public'
-    end
-
-    it 'updates the user settings value for sensitive' do
-      values = { 'setting_default_sensitive' => '1' }
-
-      settings.update(values)
-      expect(user.settings['default_sensitive']).to be true
-    end
-
-    it 'updates the user settings value for unfollow modal' do
-      values = { 'setting_unfollow_modal' => '0' }
-
-      settings.update(values)
-      expect(user.settings['unfollow_modal']).to be false
-    end
-
-    it 'updates the user settings value for boost modal' do
-      values = { 'setting_boost_modal' => '1' }
-
-      settings.update(values)
-      expect(user.settings['boost_modal']).to be true
-    end
-
-    it 'updates the user settings value for delete toot modal' do
-      values = { 'setting_delete_modal' => '0' }
-
-      settings.update(values)
-      expect(user.settings['delete_modal']).to be false
-    end
-
-    it 'updates the user settings value for gif auto play' do
-      values = { 'setting_auto_play_gif' => '0' }
-
-      settings.update(values)
-      expect(user.settings['auto_play_gif']).to be false
-    end
-
-    it 'updates the user settings value for system font in UI' do
-      values = { 'setting_system_font_ui' => '0' }
-
-      settings.update(values)
-      expect(user.settings['system_font_ui']).to be false
-    end
-
-    it 'decoerces setting values before applying' do
-      values = {
-        'setting_delete_modal' => 'false',
-        'setting_boost_modal' => 'true',
-      }
-
-      settings.update(values)
-      expect(user.settings['delete_modal']).to be false
-      expect(user.settings['boost_modal']).to be true
-    end
-  end
-end
diff --git a/spec/models/user_settings/namespace_spec.rb b/spec/models/user_settings/namespace_spec.rb
new file mode 100644
index 000000000..ae2fa7b48
--- /dev/null
+++ b/spec/models/user_settings/namespace_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings::Namespace do
+  subject { described_class.new(name) }
+
+  let(:name) { :foo }
+
+  describe '#setting' do
+    before do
+      subject.setting :bar, default: 'baz'
+    end
+
+    it 'adds setting to definitions' do
+      expect(subject.definitions[:'foo.bar']).to have_attributes(name: :bar, namespace: :foo, default_value: 'baz')
+    end
+  end
+
+  describe '#definitions' do
+    it 'returns a hash' do
+      expect(subject.definitions).to be_a Hash
+    end
+  end
+end
diff --git a/spec/models/user_settings/setting_spec.rb b/spec/models/user_settings/setting_spec.rb
new file mode 100644
index 000000000..9884ae4f8
--- /dev/null
+++ b/spec/models/user_settings/setting_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings::Setting do
+  subject { described_class.new(name, options) }
+
+  let(:name)      { :foo }
+  let(:options)   { { default: default, namespace: namespace } }
+  let(:default)   { false }
+  let(:namespace) { nil }
+
+  describe '#default_value' do
+    context 'when default value is a primitive value' do
+      it 'returns default value' do
+        expect(subject.default_value).to eq default
+      end
+    end
+
+    context 'when default value is a proc' do
+      let(:default) { -> { 'bar' } }
+
+      it 'returns value from proc' do
+        expect(subject.default_value).to eq 'bar'
+      end
+    end
+  end
+
+  describe '#type' do
+    it 'returns a type' do
+      expect(subject.type).to be_a ActiveModel::Type::Value
+    end
+
+    context 'when default value is a boolean' do
+      let(:default) { false }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::Boolean
+      end
+    end
+
+    context 'when default value is a string' do
+      let(:default) { '' }
+
+      it 'returns string' do
+        expect(subject.type).to be_a ActiveModel::Type::String
+      end
+    end
+
+    context 'when default value is a lambda returning a boolean' do
+      let(:default) { -> { false } }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::Boolean
+      end
+    end
+
+    context 'when default value is a lambda returning a string' do
+      let(:default) { -> { '' } }
+
+      it 'returns boolean' do
+        expect(subject.type).to be_a ActiveModel::Type::String
+      end
+    end
+  end
+
+  describe '#type_cast' do
+    context 'when default value is a boolean' do
+      let(:default) { false }
+
+      it 'returns boolean' do
+        expect(subject.type_cast('1')).to be true
+      end
+    end
+
+    context 'when default value is a string' do
+      let(:default) { '' }
+
+      it 'returns string' do
+        expect(subject.type_cast(1)).to eq '1'
+      end
+    end
+  end
+
+  describe '#to_a' do
+    it 'returns an array' do
+      expect(subject.to_a).to eq [name, default]
+    end
+  end
+
+  describe '#key' do
+    context 'when there is no namespace' do
+      it 'returnsn a symbol' do
+        expect(subject.key).to eq :foo
+      end
+    end
+
+    context 'when there is a namespace' do
+      let(:namespace) { :bar }
+
+      it 'returns a symbol' do
+        expect(subject.key).to eq :'bar.foo'
+      end
+    end
+  end
+end
diff --git a/spec/models/user_settings_spec.rb b/spec/models/user_settings_spec.rb
new file mode 100644
index 000000000..f0e4272fd
--- /dev/null
+++ b/spec/models/user_settings_spec.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe UserSettings do
+  subject { described_class.new(json) }
+
+  let(:json) { {} }
+
+  describe '#[]' do
+    context 'when setting is not set' do
+      it 'returns default value' do
+        expect(subject[:always_send_emails]).to be false
+      end
+    end
+
+    context 'when setting is set' do
+      let(:json) { { default_language: 'fr' } }
+
+      it 'returns value' do
+        expect(subject[:default_language]).to eq 'fr'
+      end
+    end
+
+    context 'when setting was not defined' do
+      it 'raises error' do
+        expect { subject[:foo] }.to raise_error UserSettings::KeyError
+      end
+    end
+  end
+
+  describe '#[]=' do
+    context 'when value matches type' do
+      before do
+        subject[:always_send_emails] = true
+      end
+
+      it 'updates value' do
+        expect(subject[:always_send_emails]).to be true
+      end
+    end
+
+    context 'when value needs to be type-cast' do
+      before do
+        subject[:always_send_emails] = '1'
+      end
+
+      it 'updates value with a type-cast' do
+        expect(subject[:always_send_emails]).to be true
+      end
+    end
+  end
+
+  describe '#update' do
+    before do
+      subject.update(always_send_emails: true, default_language: 'fr', default_privacy: nil)
+    end
+
+    it 'updates values' do
+      expect(subject[:always_send_emails]).to be true
+      expect(subject[:default_language]).to eq 'fr'
+    end
+
+    it 'does not set values that are nil' do
+      expect(subject.as_json).to_not include(default_privacy: nil)
+    end
+  end
+
+  describe '#as_json' do
+    let(:json) { { default_language: 'fr' } }
+
+    it 'returns hash' do
+      expect(subject.as_json).to eq json
+    end
+  end
+
+  describe '.keys' do
+    it 'returns an array' do
+      expect(described_class.keys).to be_a Array
+    end
+  end
+
+  describe '.definition_for' do
+    context 'when key is defined' do
+      it 'returns a setting' do
+        expect(described_class.definition_for(:always_send_emails)).to be_a UserSettings::Setting
+      end
+    end
+
+    context 'when key is not defined' do
+      it 'returns nil' do
+        expect(described_class.definition_for(:foo)).to be_nil
+      end
+    end
+  end
+
+  describe '.definition_for?' do
+    context 'when key is defined' do
+      it 'returns true' do
+        expect(described_class.definition_for?(:always_send_emails)).to be true
+      end
+    end
+
+    context 'when key is not defined' do
+      it 'returns false' do
+        expect(described_class.definition_for?(:foo)).to be false
+      end
+    end
+  end
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 3e7b59f17..ab883927a 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -313,9 +313,9 @@ RSpec.describe User, type: :model do
   end
 
   describe 'settings' do
-    it 'is instance of Settings::ScopedSettings' do
+    it 'is instance of UserSettings' do
       user = Fabricate(:user)
-      expect(user.settings).to be_a Settings::ScopedSettings
+      expect(user.settings).to be_a UserSettings
     end
   end
 
@@ -379,16 +379,6 @@ RSpec.describe User, type: :model do
     end
   end
 
-  it_behaves_like 'Settings-extended' do
-    def create!
-      User.create!(account: Fabricate(:account, user: nil), email: 'foo@mastodon.space', password: 'abcd1234', agreement: true)
-    end
-
-    def fabricate
-      Fabricate(:user)
-    end
-  end
-
   describe 'token_for_app' do
     let(:user) { Fabricate(:user) }
     let(:app) { Fabricate(:application, owner: user) }
diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb
index da2857627..4d66f255c 100644
--- a/spec/services/notify_service_spec.rb
+++ b/spec/services/notify_service_spec.rb
@@ -54,7 +54,8 @@ RSpec.describe NotifyService, type: :service do
     let(:type)     { :mention }
 
     before do
-      user.settings.interactions = user.settings.interactions.merge('must_be_following_dm' => enabled)
+      user.settings.update('interactions.must_be_following_dm': enabled)
+      user.save
     end
 
     context 'if recipient is supposed to be following sender' do
@@ -155,8 +156,8 @@ RSpec.describe NotifyService, type: :service do
     before do
       ActionMailer::Base.deliveries.clear
 
-      notification_emails = user.settings.notification_emails
-      user.settings.notification_emails = notification_emails.merge('follow' => enabled)
+      user.settings.update('notification_emails.follow': enabled)
+      user.save
     end
 
     context 'when email notification is enabled' do
diff --git a/spec/services/report_service_spec.rb b/spec/services/report_service_spec.rb
index 9d81bd971..452400f72 100644
--- a/spec/services/report_service_spec.rb
+++ b/spec/services/report_service_spec.rb
@@ -96,7 +96,8 @@ RSpec.describe ReportService, type: :service do
 
     before do
       ActionMailer::Base.deliveries.clear
-      source_account.user.settings.notification_emails['report'] = true
+      source_account.user.settings['notification_emails.report'] = true
+      source_account.user.save
     end
 
     it 'does not send an e-mail' do
diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb
index e52a0e52b..d6923722a 100644
--- a/spec/services/update_status_service_spec.rb
+++ b/spec/services/update_status_service_spec.rb
@@ -120,7 +120,9 @@ RSpec.describe UpdateStatusService, type: :service do
     before do
       status.update(poll: poll)
       VoteService.new.call(voter, poll, [0])
-      subject.call(status, status.account_id, text: 'Foo', poll: { options: %w(Bar Baz Foo), expires_in: 5.days.to_i })
+      Sidekiq::Testing.fake! do
+        subject.call(status, status.account_id, text: 'Foo', poll: { options: %w(Bar Baz Foo), expires_in: 5.days.to_i })
+      end
     end
 
     it 'updates poll' do
@@ -138,6 +140,11 @@ RSpec.describe UpdateStatusService, type: :service do
     it 'saves edit history' do
       expect(status.edits.pluck(:poll_options)).to eq [%w(Foo Bar), %w(Bar Baz Foo)]
     end
+
+    it 'requeues expiration notification' do
+      poll = status.poll.reload
+      expect(PollExpirationNotifyWorker).to have_enqueued_sidekiq_job(poll.id).at(poll.expires_at + 5.minutes)
+    end
   end
 
   context 'when mentions in text change' do
diff --git a/spec/workers/poll_expiration_notify_worker_spec.rb b/spec/workers/poll_expiration_notify_worker_spec.rb
index 8229db815..78cbc1ee4 100644
--- a/spec/workers/poll_expiration_notify_worker_spec.rb
+++ b/spec/workers/poll_expiration_notify_worker_spec.rb
@@ -4,10 +4,69 @@ require 'rails_helper'
 
 describe PollExpirationNotifyWorker do
   let(:worker) { described_class.new }
+  let(:account) { Fabricate(:account, domain: remote? ? 'example.com' : nil) }
+  let(:status) { Fabricate(:status, account: account) }
+  let(:poll) { Fabricate(:poll, status: status, account: account) }
+  let(:remote?) { false }
+  let(:poll_vote) { Fabricate(:poll_vote, poll: poll) }
+
+  describe '#perform' do
+    around do |example|
+      Sidekiq::Testing.fake! do
+        example.run
+      end
+    end
 
-  describe 'perform' do
     it 'runs without error for missing record' do
       expect { worker.perform(nil) }.to_not raise_error
     end
+
+    context 'when poll is not expired' do
+      it 'requeues job' do
+        worker.perform(poll.id)
+        expect(described_class.sidekiq_options_hash['lock']).to be :until_executing
+        expect(described_class).to have_enqueued_sidekiq_job(poll.id).at(poll.expires_at + 5.minutes)
+      end
+    end
+
+    context 'when poll is expired' do
+      before do
+        poll_vote
+
+        travel_to poll.expires_at + 5.minutes
+
+        worker.perform(poll.id)
+      end
+
+      context 'when poll is local' do
+        it 'notifies voters' do
+          expect(ActivityPub::DistributePollUpdateWorker).to have_enqueued_sidekiq_job(poll.status.id)
+        end
+
+        it 'notifies owner' do
+          expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll.account.id, poll.id, 'Poll', 'poll')
+        end
+
+        it 'notifies local voters' do
+          expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll_vote.account.id, poll.id, 'Poll', 'poll')
+        end
+      end
+
+      context 'when poll is remote' do
+        let(:remote?) { true }
+
+        it 'does not notify remote voters' do
+          expect(ActivityPub::DistributePollUpdateWorker).to_not have_enqueued_sidekiq_job(poll.status.id)
+        end
+
+        it 'does not notify owner' do
+          expect(LocalNotificationWorker).to_not have_enqueued_sidekiq_job(poll.account.id, poll.id, 'Poll', 'poll')
+        end
+
+        it 'notifies local voters' do
+          expect(LocalNotificationWorker).to have_enqueued_sidekiq_job(poll_vote.account.id, poll.id, 'Poll', 'poll')
+        end
+      end
+    end
   end
 end
diff --git a/yarn.lock b/yarn.lock
index 0891b2ac9..48280dbfc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1075,14 +1075,14 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
   version "7.21.0"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
   integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
   dependencies:
     regenerator-runtime "^0.13.11"
 
-"@babel/template@^7.18.10", "@babel/template@^7.20.7":
+"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.20.7":
   version "7.20.7"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
   integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
@@ -1592,7 +1592,7 @@
     "@jridgewell/set-array" "^1.0.0"
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
-"@jridgewell/gen-mapping@^0.3.2":
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
   integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
@@ -2390,6 +2390,13 @@ ansi-escapes@^4.2.1:
   dependencies:
     type-fest "^0.11.0"
 
+ansi-escapes@^4.3.0:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+  integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+  dependencies:
+    type-fest "^0.21.3"
+
 ansi-html-community@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
@@ -2410,6 +2417,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
+ansi-regex@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+  integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
 ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -2430,6 +2442,11 @@ ansi-styles@^5.0.0:
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
+ansi-styles@^6.0.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
 anymatch@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -3255,6 +3272,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464:
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz#c1e6197c540392e09709ecaa9e3e403428c53375"
   integrity sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==
 
+chalk@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
+  integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
+
 chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -3374,6 +3396,29 @@ clean-stack@^2.0.0:
   resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
   integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
 
+cli-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+  integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+  dependencies:
+    restore-cursor "^3.1.0"
+
+cli-truncate@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+  integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+  dependencies:
+    slice-ansi "^3.0.0"
+    string-width "^4.2.0"
+
+cli-truncate@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389"
+  integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
+  dependencies:
+    slice-ansi "^5.0.0"
+    string-width "^5.0.0"
+
 cliui@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@@ -3468,6 +3513,11 @@ colord@^2.9.1, colord@^2.9.3:
   resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
   integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
 
+colorette@^2.0.19:
+  version "2.0.19"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+  integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
 combined-stream@^1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -3475,6 +3525,11 @@ combined-stream@^1.0.8:
   dependencies:
     delayed-stream "~1.0.0"
 
+commander@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1"
+  integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==
+
 commander@^2.20.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -3777,26 +3832,18 @@ css-loader@^5.2.7:
     schema-utils "^3.0.0"
     semver "^7.3.5"
 
-css-select@^4.1.3:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
-  integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+css-select@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
+  integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
   dependencies:
     boolbase "^1.0.0"
-    css-what "^6.0.1"
-    domhandler "^4.3.1"
-    domutils "^2.8.0"
+    css-what "^6.1.0"
+    domhandler "^5.0.2"
+    domutils "^3.0.1"
     nth-check "^2.0.1"
 
-css-tree@^1.1.2, css-tree@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
-  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
-  dependencies:
-    mdn-data "2.0.14"
-    source-map "^0.6.1"
-
-css-tree@^2.3.1:
+css-tree@^2.2.1, css-tree@^2.3.1:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20"
   integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==
@@ -3804,7 +3851,15 @@ css-tree@^2.3.1:
     mdn-data "2.0.30"
     source-map-js "^1.0.1"
 
-css-what@^6.0.1:
+css-tree@~2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032"
+  integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==
+  dependencies:
+    mdn-data "2.0.28"
+    source-map-js "^1.0.1"
+
+css-what@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
   integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
@@ -3819,61 +3874,60 @@ cssesc@^3.0.0:
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
   integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
-cssnano-preset-default@^5.2.14:
-  version "5.2.14"
-  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8"
-  integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==
+cssnano-preset-default@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz#058726536bdc18711c01b1d328766cbc5691cf71"
+  integrity sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==
   dependencies:
     css-declaration-sorter "^6.3.1"
-    cssnano-utils "^3.1.0"
+    cssnano-utils "^4.0.0"
     postcss-calc "^8.2.3"
-    postcss-colormin "^5.3.1"
-    postcss-convert-values "^5.1.3"
-    postcss-discard-comments "^5.1.2"
-    postcss-discard-duplicates "^5.1.0"
-    postcss-discard-empty "^5.1.1"
-    postcss-discard-overridden "^5.1.0"
-    postcss-merge-longhand "^5.1.7"
-    postcss-merge-rules "^5.1.4"
-    postcss-minify-font-values "^5.1.0"
-    postcss-minify-gradients "^5.1.1"
-    postcss-minify-params "^5.1.4"
-    postcss-minify-selectors "^5.2.1"
-    postcss-normalize-charset "^5.1.0"
-    postcss-normalize-display-values "^5.1.0"
-    postcss-normalize-positions "^5.1.1"
-    postcss-normalize-repeat-style "^5.1.1"
-    postcss-normalize-string "^5.1.0"
-    postcss-normalize-timing-functions "^5.1.0"
-    postcss-normalize-unicode "^5.1.1"
-    postcss-normalize-url "^5.1.0"
-    postcss-normalize-whitespace "^5.1.1"
-    postcss-ordered-values "^5.1.3"
-    postcss-reduce-initial "^5.1.2"
-    postcss-reduce-transforms "^5.1.0"
-    postcss-svgo "^5.1.0"
-    postcss-unique-selectors "^5.1.1"
-
-cssnano-utils@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861"
-  integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==
+    postcss-colormin "^6.0.0"
+    postcss-convert-values "^6.0.0"
+    postcss-discard-comments "^6.0.0"
+    postcss-discard-duplicates "^6.0.0"
+    postcss-discard-empty "^6.0.0"
+    postcss-discard-overridden "^6.0.0"
+    postcss-merge-longhand "^6.0.0"
+    postcss-merge-rules "^6.0.0"
+    postcss-minify-font-values "^6.0.0"
+    postcss-minify-gradients "^6.0.0"
+    postcss-minify-params "^6.0.0"
+    postcss-minify-selectors "^6.0.0"
+    postcss-normalize-charset "^6.0.0"
+    postcss-normalize-display-values "^6.0.0"
+    postcss-normalize-positions "^6.0.0"
+    postcss-normalize-repeat-style "^6.0.0"
+    postcss-normalize-string "^6.0.0"
+    postcss-normalize-timing-functions "^6.0.0"
+    postcss-normalize-unicode "^6.0.0"
+    postcss-normalize-url "^6.0.0"
+    postcss-normalize-whitespace "^6.0.0"
+    postcss-ordered-values "^6.0.0"
+    postcss-reduce-initial "^6.0.0"
+    postcss-reduce-transforms "^6.0.0"
+    postcss-svgo "^6.0.0"
+    postcss-unique-selectors "^6.0.0"
+
+cssnano-utils@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.0.tgz#d1da885ec04003ab19505ff0e62e029708d36b08"
+  integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==
 
-cssnano@^5.1.15:
-  version "5.1.15"
-  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf"
-  integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==
+cssnano@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.0.tgz#53f4cb81101cccba0809fad779f006b5d44925ee"
+  integrity sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==
   dependencies:
-    cssnano-preset-default "^5.2.14"
-    lilconfig "^2.0.3"
-    yaml "^1.10.2"
+    cssnano-preset-default "^6.0.0"
+    lilconfig "^2.1.0"
 
-csso@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
-  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+csso@^5.0.5:
+  version "5.0.5"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6"
+  integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==
   dependencies:
-    css-tree "^1.1.2"
+    css-tree "~2.2.0"
 
 cssom@^0.5.0:
   version "0.5.0"
@@ -4243,26 +4297,21 @@ dom-helpers@^5.2.0:
     "@babel/runtime" "^7.8.7"
     csstype "^3.0.2"
 
-dom-serializer@^1.0.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
-  integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+dom-serializer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+  integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
   dependencies:
-    domelementtype "^2.0.1"
-    domhandler "^4.2.0"
-    entities "^2.0.0"
+    domelementtype "^2.3.0"
+    domhandler "^5.0.2"
+    entities "^4.2.0"
 
 domain-browser@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
   integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
 
-domelementtype@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
-  integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
-
-domelementtype@^2.2.0:
+domelementtype@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
   integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
@@ -4274,21 +4323,21 @@ domexception@^4.0.0:
   dependencies:
     webidl-conversions "^7.0.0"
 
-domhandler@^4.2.0, domhandler@^4.3.1:
-  version "4.3.1"
-  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
-  integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+domhandler@^5.0.1, domhandler@^5.0.2:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+  integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
   dependencies:
-    domelementtype "^2.2.0"
+    domelementtype "^2.3.0"
 
-domutils@^2.8.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
-  integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+domutils@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c"
+  integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==
   dependencies:
-    dom-serializer "^1.0.1"
-    domelementtype "^2.2.0"
-    domhandler "^4.2.0"
+    dom-serializer "^2.0.0"
+    domelementtype "^2.3.0"
+    domhandler "^5.0.1"
 
 dotenv@^16.0.3:
   version "16.0.3"
@@ -4310,6 +4359,11 @@ duplexify@^3.4.2, duplexify@^3.6.0:
     readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
+eastasianwidth@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
 ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -4395,12 +4449,7 @@ enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0:
     memory-fs "^0.5.0"
     tapable "^1.0.0"
 
-entities@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
-  integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
-
-entities@^4.4.0:
+entities@^4.2.0, entities@^4.4.0:
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
   integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
@@ -4826,10 +4875,20 @@ execa@^5.0.0:
     signal-exit "^3.0.3"
     strip-final-newline "^2.0.0"
 
-exif-js@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/exif-js/-/exif-js-2.3.0.tgz#9d10819bf571f873813e7640241255ab9ce1a814"
-  integrity sha1-nRCBm/Vx+HOBPnZAJBJVq5zhqBQ=
+execa@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
+  integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.1"
+    human-signals "^4.3.0"
+    is-stream "^3.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^5.1.0"
+    onetime "^6.0.0"
+    signal-exit "^3.0.7"
+    strip-final-newline "^3.0.0"
 
 exit@^0.1.2:
   version "0.1.2"
@@ -5336,7 +5395,7 @@ get-stream@^4.0.0:
   dependencies:
     pump "^3.0.0"
 
-get-stream@^6.0.0:
+get-stream@^6.0.0, get-stream@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
   integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
@@ -5388,10 +5447,10 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^9.2.0, glob@^9.3.0:
-  version "9.3.0"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.0.tgz#be6e50d172d025c3fcf87903ae25b36b787c0bb0"
-  integrity sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==
+glob@^9.2.0, glob@^9.3.2:
+  version "9.3.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.2.tgz#8528522e003819e63d11c979b30896e0eaf52eda"
+  integrity sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==
   dependencies:
     fs.realpath "^1.0.0"
     minimatch "^7.4.1"
@@ -5768,6 +5827,16 @@ human-signals@^2.1.0:
   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
 
+human-signals@^4.3.0:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
+  integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
+
+husky@^8.0.3:
+  version "8.0.3"
+  resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
+  integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
+
 iconv-lite@0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -6158,6 +6227,11 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-fullwidth-code-point@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
+  integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
 is-generator-fn@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
@@ -6295,6 +6369,11 @@ is-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
   integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
 
+is-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+  integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
 is-string@^1.0.5, is-string@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -7088,7 +7167,7 @@ levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-lilconfig@^2.0.3:
+lilconfig@2.1.0, lilconfig@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
   integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
@@ -7098,6 +7177,39 @@ lines-and-columns@^1.1.6:
   resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
   integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
 
+lint-staged@^13.1.2:
+  version "13.2.0"
+  resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a"
+  integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==
+  dependencies:
+    chalk "5.2.0"
+    cli-truncate "^3.1.0"
+    commander "^10.0.0"
+    debug "^4.3.4"
+    execa "^7.0.0"
+    lilconfig "2.1.0"
+    listr2 "^5.0.7"
+    micromatch "^4.0.5"
+    normalize-path "^3.0.0"
+    object-inspect "^1.12.3"
+    pidtree "^0.6.0"
+    string-argv "^0.3.1"
+    yaml "^2.2.1"
+
+listr2@^5.0.7:
+  version "5.0.8"
+  resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23"
+  integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==
+  dependencies:
+    cli-truncate "^2.1.0"
+    colorette "^2.0.19"
+    log-update "^4.0.0"
+    p-map "^4.0.0"
+    rfdc "^1.3.0"
+    rxjs "^7.8.0"
+    through "^2.3.8"
+    wrap-ansi "^7.0.0"
+
 loader-runner@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
@@ -7215,6 +7327,16 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
+log-update@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
+  integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
+  dependencies:
+    ansi-escapes "^4.3.0"
+    cli-cursor "^3.1.0"
+    slice-ansi "^4.0.0"
+    wrap-ansi "^6.2.0"
+
 loglevel@^1.6.8:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0"
@@ -7326,10 +7448,10 @@ md5.js@^1.3.4:
     inherits "^2.0.1"
     safe-buffer "^5.1.2"
 
-mdn-data@2.0.14:
-  version "2.0.14"
-  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
-  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+mdn-data@2.0.28:
+  version "2.0.28"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba"
+  integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==
 
 mdn-data@2.0.30:
   version "2.0.30"
@@ -7462,6 +7584,11 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+mimic-fn@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+  integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
 min-indent@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@@ -7598,10 +7725,10 @@ mkdirp@^1.0, mkdirp@^1.0.3, mkdirp@^1.0.4:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-mkdirp@^2.1.5:
-  version "2.1.5"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.5.tgz#78d7eaf15e069ba7b6b47d76dd94cfadf7a4062f"
-  integrity sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==
+mkdirp@^2.1.6:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19"
+  integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==
 
 mousetrap@^1.5.2:
   version "1.6.5"
@@ -7793,11 +7920,6 @@ normalize-range@^0.1.2:
   resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
   integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
 
-normalize-url@^6.0.1:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
-  integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
-
 npm-run-path@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -7812,6 +7934,13 @@ npm-run-path@^4.0.1:
   dependencies:
     path-key "^3.0.0"
 
+npm-run-path@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
+  integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+  dependencies:
+    path-key "^4.0.0"
+
 npmlog@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8"
@@ -7853,6 +7982,11 @@ object-inspect@^1.12.2, object-inspect@^1.9.0:
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
   integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
 
+object-inspect@^1.12.3:
+  version "1.12.3"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+  integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
 object-is@^1.0.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81"
@@ -7957,13 +8091,20 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
   dependencies:
     wrappy "1"
 
-onetime@^5.1.2:
+onetime@^5.1.0, onetime@^5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
   integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
   dependencies:
     mimic-fn "^2.1.0"
 
+onetime@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+  integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+  dependencies:
+    mimic-fn "^4.0.0"
+
 opencollective-postinstall@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
@@ -8195,6 +8336,11 @@ path-key@^3.0.0, path-key@^3.1.0:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
 
+path-key@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+  integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
 path-parse@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -8312,6 +8458,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
+pidtree@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
+  integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
+
 pify@^2.0.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -8375,43 +8526,43 @@ postcss-calc@^8.2.3:
     postcss-selector-parser "^6.0.9"
     postcss-value-parser "^4.2.0"
 
-postcss-colormin@^5.3.1:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f"
-  integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==
+postcss-colormin@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.0.tgz#d4250652e952e1c0aca70c66942da93d3cdeaafe"
+  integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==
   dependencies:
     browserslist "^4.21.4"
     caniuse-api "^3.0.0"
     colord "^2.9.1"
     postcss-value-parser "^4.2.0"
 
-postcss-convert-values@^5.1.3:
-  version "5.1.3"
-  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393"
-  integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==
+postcss-convert-values@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz#ec94a954957e5c3f78f0e8f65dfcda95280b8996"
+  integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==
   dependencies:
     browserslist "^4.21.4"
     postcss-value-parser "^4.2.0"
 
-postcss-discard-comments@^5.1.2:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696"
-  integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==
+postcss-discard-comments@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz#9ca335e8b68919f301b24ba47dde226a42e535fe"
+  integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==
 
-postcss-discard-duplicates@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848"
-  integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==
+postcss-discard-duplicates@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz#c26177a6c33070922e67e9a92c0fd23d443d1355"
+  integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==
 
-postcss-discard-empty@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c"
-  integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==
+postcss-discard-empty@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz#06c1c4fce09e22d2a99e667c8550eb8a3a1b9aee"
+  integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==
 
-postcss-discard-overridden@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
-  integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
+postcss-discard-overridden@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz#49c5262db14e975e349692d9024442de7cd8e234"
+  integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==
 
 postcss-loader@^4.3.0:
   version "4.3.0"
@@ -8429,53 +8580,53 @@ postcss-media-query-parser@^0.2.3:
   resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
   integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
 
-postcss-merge-longhand@^5.1.7:
-  version "5.1.7"
-  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16"
-  integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==
+postcss-merge-longhand@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69"
+  integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==
   dependencies:
     postcss-value-parser "^4.2.0"
-    stylehacks "^5.1.1"
+    stylehacks "^6.0.0"
 
-postcss-merge-rules@^5.1.4:
-  version "5.1.4"
-  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c"
-  integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==
+postcss-merge-rules@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz#0d95bc73541156b8b4e763bd0de2c3f9d0ecf013"
+  integrity sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==
   dependencies:
     browserslist "^4.21.4"
     caniuse-api "^3.0.0"
-    cssnano-utils "^3.1.0"
+    cssnano-utils "^4.0.0"
     postcss-selector-parser "^6.0.5"
 
-postcss-minify-font-values@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b"
-  integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==
+postcss-minify-font-values@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz#68d4a028f9fa5f61701974724b2cc9445d8e6070"
+  integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-minify-gradients@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c"
-  integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==
+postcss-minify-gradients@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz#22b5c88cc63091dadbad34e31ff958404d51d679"
+  integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==
   dependencies:
     colord "^2.9.1"
-    cssnano-utils "^3.1.0"
+    cssnano-utils "^4.0.0"
     postcss-value-parser "^4.2.0"
 
-postcss-minify-params@^5.1.4:
-  version "5.1.4"
-  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352"
-  integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==
+postcss-minify-params@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz#2b3a85a9e3b990d7a16866f430f5fd1d5961b539"
+  integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==
   dependencies:
     browserslist "^4.21.4"
-    cssnano-utils "^3.1.0"
+    cssnano-utils "^4.0.0"
     postcss-value-parser "^4.2.0"
 
-postcss-minify-selectors@^5.2.1:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6"
-  integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==
+postcss-minify-selectors@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz#5046c5e8680a586e5a0cad52cc9aa36d6be5bda2"
+  integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==
   dependencies:
     postcss-selector-parser "^6.0.5"
 
@@ -8507,89 +8658,88 @@ postcss-modules-values@^4.0.0:
   dependencies:
     icss-utils "^5.0.0"
 
-postcss-normalize-charset@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
-  integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==
+postcss-normalize-charset@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz#36cc12457259064969fb96f84df491652a4b0975"
+  integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==
 
-postcss-normalize-display-values@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8"
-  integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==
+postcss-normalize-display-values@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz#8d2961415078644d8c6bbbdaf9a2fdd60f546cd4"
+  integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-positions@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92"
-  integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==
+postcss-normalize-positions@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz#25b96df99a69f8925f730eaee0be74416865e301"
+  integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-repeat-style@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2"
-  integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==
+postcss-normalize-repeat-style@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz#ddf30ad8762feb5b1eb97f39f251acd7b8353299"
+  integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-string@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228"
-  integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==
+postcss-normalize-string@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz#948282647a51e409d69dde7910f0ac2ff97cb5d8"
+  integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-timing-functions@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb"
-  integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==
+postcss-normalize-timing-functions@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz#5f13e650b8c43351989fc5de694525cc2539841c"
+  integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-unicode@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030"
-  integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==
+postcss-normalize-unicode@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz#741b3310f874616bdcf07764f5503695d3604730"
+  integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==
   dependencies:
     browserslist "^4.21.4"
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-url@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc"
-  integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==
+postcss-normalize-url@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz#d0a31e962a16401fb7deb7754b397a323fb650b4"
+  integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==
   dependencies:
-    normalize-url "^6.0.1"
     postcss-value-parser "^4.2.0"
 
-postcss-normalize-whitespace@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa"
-  integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==
+postcss-normalize-whitespace@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz#accb961caa42e25ca4179b60855b79b1f7129d4d"
+  integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==
   dependencies:
     postcss-value-parser "^4.2.0"
 
-postcss-ordered-values@^5.1.3:
-  version "5.1.3"
-  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38"
-  integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==
+postcss-ordered-values@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz#374704cdff25560d44061d17ba3c6308837a3218"
+  integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==
   dependencies:
-    cssnano-utils "^3.1.0"
+    cssnano-utils "^4.0.0"
     postcss-value-parser "^4.2.0"
 
-postcss-reduce-initial@^5.1.2:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6"
-  integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==
+postcss-reduce-initial@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz#7d16e83e60e27e2fa42f56ec0b426f1da332eca7"
+  integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==
   dependencies:
     browserslist "^4.21.4"
     caniuse-api "^3.0.0"
 
-postcss-reduce-transforms@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9"
-  integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==
+postcss-reduce-transforms@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz#28ff2601a6d9b96a2f039b3501526e1f4d584a46"
+  integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==
   dependencies:
     postcss-value-parser "^4.2.0"
 
@@ -8616,18 +8766,18 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selecto
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
 
-postcss-svgo@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d"
-  integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==
+postcss-svgo@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.0.tgz#7b18742d38d4505a0455bbe70d52b49f00eaf69d"
+  integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==
   dependencies:
     postcss-value-parser "^4.2.0"
-    svgo "^2.7.0"
+    svgo "^3.0.2"
 
-postcss-unique-selectors@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6"
-  integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==
+postcss-unique-selectors@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz#c94e9b0f7bffb1203894e42294b5a1b3fb34fbe1"
+  integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==
   dependencies:
     postcss-selector-parser "^6.0.5"
 
@@ -8677,10 +8827,10 @@ prelude-ls@~1.1.2:
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-prettier@^2.8.5:
-  version "2.8.5"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.5.tgz#3dd8ae1ebddc4f6aa419c9b64d8c8319a7e0d982"
-  integrity sha512-3gzuxrHbKUePRBB4ZeU08VNkUcqEHaUaouNt0m7LGP4Hti/NuB07C7PPTM/LkWqXoJYJn2McEo5+kxPNrtQkLQ==
+prettier@^2.8.7:
+  version "2.8.7"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450"
+  integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==
 
 pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
   version "5.6.0"
@@ -9087,10 +9237,10 @@ react-router@^4.3.1:
     prop-types "^15.6.1"
     warning "^4.0.1"
 
-react-select@^5.7.1:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.1.tgz#c85afa8a771d75c935ec698726a8fbfece662ed0"
-  integrity sha512-u/brzm3B6vgI+PtxNyE4/18kXgaf6bn5sOAjKhaQ54EItBfW41SRLH1AJC5fefPnGM4JmMcM51t/HAVCi5GrpQ==
+react-select@^5.7.2:
+  version "5.7.2"
+  resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.2.tgz#ccd40071b9429277983bf15526e7a5773a060e09"
+  integrity sha512-cTlJkQ8YjV6T/js8wW0owTzht0hHGABh29vjLscY4HfZGkv7hc3FFTmRp9NzY/Ib1uQ36GieAKEjxpHdpCFpcA==
   dependencies:
     "@babel/runtime" "^7.12.0"
     "@emotion/cache" "^11.4.0"
@@ -9155,12 +9305,12 @@ react-test-renderer@^16.14.0:
     react-is "^16.8.6"
     scheduler "^0.19.1"
 
-react-textarea-autosize@^8.4.0:
-  version "8.4.0"
-  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c"
-  integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==
+react-textarea-autosize@^8.4.1:
+  version "8.4.1"
+  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz#bcfc5462727014b808b14ee916c01e275e8a8335"
+  integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==
   dependencies:
-    "@babel/runtime" "^7.10.2"
+    "@babel/runtime" "^7.20.13"
     use-composed-ref "^1.3.0"
     use-latest "^1.2.1"
 
@@ -9484,6 +9634,14 @@ resolve@^2.0.0-next.4:
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
+restore-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+  integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+  dependencies:
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -9499,6 +9657,11 @@ reusify@^1.0.4:
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
+rfdc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
+  integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+
 rimraf@^2.5.4, rimraf@^2.6.3:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -9513,10 +9676,10 @@ rimraf@^3.0.2:
   dependencies:
     glob "^7.1.3"
 
-rimraf@^4.4.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.0.tgz#c7a9f45bb2ec058d2e60ef9aca5167974313d605"
-  integrity sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==
+rimraf@^4.4.1:
+  version "4.4.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755"
+  integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==
   dependencies:
     glob "^9.2.0"
 
@@ -9564,6 +9727,13 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
+rxjs@^7.8.0:
+  version "7.8.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
+  integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
+  dependencies:
+    tslib "^2.1.0"
+
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -9606,10 +9776,10 @@ sass-loader@^10.2.0:
     schema-utils "^3.0.0"
     semver "^7.3.2"
 
-sass@^1.59.3:
-  version "1.59.3"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.3.tgz#a1ddf855d75c70c26b4555df4403e1bbf8e4403f"
-  integrity sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==
+sass@^1.60.0:
+  version "1.60.0"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81"
+  integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -9862,6 +10032,15 @@ slash@^3.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slice-ansi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+  integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
 slice-ansi@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@@ -9871,6 +10050,14 @@ slice-ansi@^4.0.0:
     astral-regex "^2.0.0"
     is-fullwidth-code-point "^3.0.0"
 
+slice-ansi@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
+  integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
+  dependencies:
+    ansi-styles "^6.0.0"
+    is-fullwidth-code-point "^4.0.0"
+
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -10073,11 +10260,6 @@ ssri@^8.0.0:
   dependencies:
     minipass "^3.1.1"
 
-stable@^0.1.8:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
-  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
-
 stack-generator@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
@@ -10171,6 +10353,11 @@ stream-shift@^1.0.0:
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
+string-argv@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
+
 string-length@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1"
@@ -10197,6 +10384,15 @@ string-width@^3.0.0, string-width@^3.1.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
+string-width@^5.0.0:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+  dependencies:
+    eastasianwidth "^0.2.0"
+    emoji-regex "^9.2.2"
+    strip-ansi "^7.0.1"
+
 string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
@@ -10273,6 +10469,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   dependencies:
     ansi-regex "^5.0.1"
 
+strip-ansi@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
+  integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+  dependencies:
+    ansi-regex "^6.0.1"
+
 strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -10298,6 +10501,11 @@ strip-final-newline@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
 
+strip-final-newline@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+  integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
 strip-indent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -10315,10 +10523,10 @@ style-search@^0.1.0:
   resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
   integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
 
-stylehacks@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9"
-  integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==
+stylehacks@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.0.tgz#9fdd7c217660dae0f62e14d51c89f6c01b3cb738"
+  integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==
   dependencies:
     browserslist "^4.21.4"
     postcss-selector-parser "^6.0.4"
@@ -10467,18 +10675,17 @@ svg-tags@^1.0.0:
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
   integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
 
-svgo@^2.7.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
-  integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+svgo@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.0.2.tgz#5e99eeea42c68ee0dc46aa16da093838c262fe0a"
+  integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==
   dependencies:
     "@trysound/sax" "0.2.0"
     commander "^7.2.0"
-    css-select "^4.1.3"
-    css-tree "^1.1.3"
-    csso "^4.2.0"
+    css-select "^5.1.0"
+    css-tree "^2.2.1"
+    csso "^5.0.5"
     picocolors "^1.0.0"
-    stable "^0.1.8"
 
 symbol-tree@^3.2.4:
   version "3.2.4"
@@ -10628,6 +10835,11 @@ through2@^2.0.0:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
+through@^2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
 thunky@^1.0.2:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
@@ -10768,6 +10980,11 @@ tslib@^1.9.0:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
   integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
 
+tslib@^2.1.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
+  integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -10827,6 +11044,11 @@ type-fest@^0.20.2:
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
   integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
 
+type-fest@^0.21.3:
+  version "0.21.3"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+  integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
 type-fest@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -11640,6 +11862,15 @@ wrap-ansi@^5.1.0:
     string-width "^3.0.0"
     strip-ansi "^5.0.0"
 
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrap-ansi@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -11722,11 +11953,16 @@ yallist@^3.0.2:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
-yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
+yaml@^1.10.0, yaml@^1.7.2:
   version "1.10.2"
   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
 
+yaml@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4"
+  integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==
+
 yargs-parser@^13.1.2:
   version "13.1.2"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"