about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.browserslistrc7
-rw-r--r--.devcontainer/devcontainer.json3
-rw-r--r--CHANGELOG.md99
-rw-r--r--Gemfile18
-rw-r--r--Gemfile.lock167
-rw-r--r--SECURITY.md2
-rw-r--r--app/chewy/accounts_index.rb8
-rw-r--r--app/chewy/statuses_index.rb4
-rw-r--r--app/chewy/tags_index.rb10
-rw-r--r--app/controllers/accounts_controller.rb1
-rw-r--r--app/controllers/activitypub/base_controller.rb1
-rw-r--r--app/controllers/admin/domain_blocks_controller.rb21
-rw-r--r--app/controllers/admin/export_domain_allows_controller.rb60
-rw-r--r--app/controllers/admin/export_domain_blocks_controller.rb71
-rw-r--r--app/controllers/api/base_controller.rb5
-rw-r--r--app/controllers/api/v1/accounts_controller.rb10
-rw-r--r--app/controllers/auth/confirmations_controller.rb2
-rw-r--r--app/controllers/concerns/admin_export_controller_concern.rb39
-rw-r--r--app/controllers/media_proxy_controller.rb17
-rw-r--r--app/controllers/settings/exports_controller.rb15
-rw-r--r--app/controllers/tags_controller.rb1
-rw-r--r--app/helpers/application_helper.rb6
-rw-r--r--app/helpers/formatting_helper.rb26
-rw-r--r--app/helpers/languages_helper.rb4
-rw-r--r--app/helpers/settings/keyword_mutes_helper.rb2
-rw-r--r--app/helpers/statuses_helper.rb2
-rw-r--r--app/javascript/core/admin.js6
-rw-r--r--app/javascript/flavours/glitch/actions/accounts.js7
-rw-r--r--app/javascript/flavours/glitch/actions/compose.js15
-rw-r--r--app/javascript/flavours/glitch/actions/importer/normalizer.js1
-rw-r--r--app/javascript/flavours/glitch/actions/languages.js12
-rw-r--r--app/javascript/flavours/glitch/actions/local_settings.js53
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js3
-rw-r--r--app/javascript/flavours/glitch/components/account.js12
-rw-r--r--app/javascript/flavours/glitch/components/avatar.js26
-rw-r--r--app/javascript/flavours/glitch/components/dropdown_menu.js2
-rw-r--r--app/javascript/flavours/glitch/components/modal_root.js4
-rw-r--r--app/javascript/flavours/glitch/containers/mastodon.js4
-rw-r--r--app/javascript/flavours/glitch/features/account/components/header.js39
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/components/header.js10
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js35
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js5
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js22
-rw-r--r--app/javascript/flavours/glitch/features/blocks/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/language_dropdown.js332
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/options.js2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/search_results.js6
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/text_icon_button.js7
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js34
-rw-r--r--app/javascript/flavours/glitch/features/followers/index.js18
-rw-r--r--app/javascript/flavours/glitch/features/following/index.js18
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/components/announcements.js3
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js83
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/index.js53
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/item/index.js5
-rw-r--r--app/javascript/flavours/glitch/features/mutes/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/report/thanks.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/columns_area.js9
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js86
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/media_modal.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/modal_root.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js1
-rw-r--r--app/javascript/flavours/glitch/images/logo_warn_glitch.svg49
-rw-r--r--app/javascript/flavours/glitch/reducers/accounts.js7
-rw-r--r--app/javascript/flavours/glitch/reducers/compose.js9
-rw-r--r--app/javascript/flavours/glitch/reducers/identity_proofs.js25
-rw-r--r--app/javascript/flavours/glitch/reducers/index.js2
-rw-r--r--app/javascript/flavours/glitch/reducers/local_settings.js6
-rw-r--r--app/javascript/flavours/glitch/reducers/settings.js5
-rw-r--r--app/javascript/flavours/glitch/selectors/index.js8
-rw-r--r--app/javascript/flavours/glitch/styles/accessibility.scss15
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss9
-rw-r--r--app/javascript/flavours/glitch/styles/components/composer.scss65
-rw-r--r--app/javascript/flavours/glitch/styles/components/local_settings.scss38
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss7
-rw-r--r--app/javascript/flavours/glitch/styles/components/single_column.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss62
-rw-r--r--app/javascript/flavours/glitch/styles/mastodon-light/diff.scss6
-rw-r--r--app/javascript/flavours/glitch/util/backend_links.js9
-rw-r--r--app/javascript/flavours/glitch/util/content_warning.js4
-rw-r--r--app/javascript/flavours/glitch/util/initial_state.js4
-rw-r--r--app/javascript/mastodon/actions/accounts.js7
-rw-r--r--app/javascript/mastodon/actions/compose.js16
-rw-r--r--app/javascript/mastodon/actions/languages.js12
-rw-r--r--app/javascript/mastodon/actions/notifications.js3
-rw-r--r--app/javascript/mastodon/components/account.js9
-rw-r--r--app/javascript/mastodon/components/avatar.js28
-rw-r--r--app/javascript/mastodon/components/status.js2
-rw-r--r--app/javascript/mastodon/features/account/components/header.js57
-rw-r--r--app/javascript/mastodon/features/account_timeline/components/header.js8
-rw-r--r--app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js35
-rw-r--r--app/javascript/mastodon/features/account_timeline/containers/header_container.js3
-rw-r--r--app/javascript/mastodon/features/account_timeline/index.js16
-rw-r--r--app/javascript/mastodon/features/blocks/index.js2
-rw-r--r--app/javascript/mastodon/features/compose/components/compose_form.js13
-rw-r--r--app/javascript/mastodon/features/compose/components/language_dropdown.js332
-rw-r--r--app/javascript/mastodon/features/compose/components/privacy_dropdown.js2
-rw-r--r--app/javascript/mastodon/features/compose/components/text_icon_button.js7
-rw-r--r--app/javascript/mastodon/features/compose/containers/language_dropdown_container.js34
-rw-r--r--app/javascript/mastodon/features/followers/index.js20
-rw-r--r--app/javascript/mastodon/features/following/index.js20
-rw-r--r--app/javascript/mastodon/features/mutes/index.js2
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/boost_modal.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js2
-rw-r--r--app/javascript/mastodon/initial_state.js1
-rw-r--r--app/javascript/mastodon/locales/af.json94
-rw-r--r--app/javascript/mastodon/locales/ar.json58
-rw-r--r--app/javascript/mastodon/locales/ast.json12
-rw-r--r--app/javascript/mastodon/locales/bg.json12
-rw-r--r--app/javascript/mastodon/locales/bn.json12
-rw-r--r--app/javascript/mastodon/locales/br.json12
-rw-r--r--app/javascript/mastodon/locales/ca.json84
-rw-r--r--app/javascript/mastodon/locales/ckb.json196
-rw-r--r--app/javascript/mastodon/locales/co.json12
-rw-r--r--app/javascript/mastodon/locales/cs.json14
-rw-r--r--app/javascript/mastodon/locales/cy.json32
-rw-r--r--app/javascript/mastodon/locales/da.json14
-rw-r--r--app/javascript/mastodon/locales/de.json46
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json80
-rw-r--r--app/javascript/mastodon/locales/el.json14
-rw-r--r--app/javascript/mastodon/locales/en-GB.json549
-rw-r--r--app/javascript/mastodon/locales/en.json16
-rw-r--r--app/javascript/mastodon/locales/eo.json24
-rw-r--r--app/javascript/mastodon/locales/es-AR.json16
-rw-r--r--app/javascript/mastodon/locales/es-MX.json22
-rw-r--r--app/javascript/mastodon/locales/es.json16
-rw-r--r--app/javascript/mastodon/locales/et.json96
-rw-r--r--app/javascript/mastodon/locales/eu.json12
-rw-r--r--app/javascript/mastodon/locales/fa.json26
-rw-r--r--app/javascript/mastodon/locales/fi.json12
-rw-r--r--app/javascript/mastodon/locales/fr.json40
-rw-r--r--app/javascript/mastodon/locales/ga.json12
-rw-r--r--app/javascript/mastodon/locales/gd.json24
-rw-r--r--app/javascript/mastodon/locales/gl.json32
-rw-r--r--app/javascript/mastodon/locales/he.json538
-rw-r--r--app/javascript/mastodon/locales/hi.json48
-rw-r--r--app/javascript/mastodon/locales/hr.json14
-rw-r--r--app/javascript/mastodon/locales/hu.json32
-rw-r--r--app/javascript/mastodon/locales/hy.json16
-rw-r--r--app/javascript/mastodon/locales/id.json14
-rw-r--r--app/javascript/mastodon/locales/io.json648
-rw-r--r--app/javascript/mastodon/locales/is.json14
-rw-r--r--app/javascript/mastodon/locales/it.json14
-rw-r--r--app/javascript/mastodon/locales/ja.json16
-rw-r--r--app/javascript/mastodon/locales/ka.json12
-rw-r--r--app/javascript/mastodon/locales/kab.json12
-rw-r--r--app/javascript/mastodon/locales/kk.json12
-rw-r--r--app/javascript/mastodon/locales/kn.json12
-rw-r--r--app/javascript/mastodon/locales/ko.json34
-rw-r--r--app/javascript/mastodon/locales/ku.json14
-rw-r--r--app/javascript/mastodon/locales/kw.json12
-rw-r--r--app/javascript/mastodon/locales/lt.json12
-rw-r--r--app/javascript/mastodon/locales/lv.json14
-rw-r--r--app/javascript/mastodon/locales/mk.json12
-rw-r--r--app/javascript/mastodon/locales/ml.json12
-rw-r--r--app/javascript/mastodon/locales/mr.json12
-rw-r--r--app/javascript/mastodon/locales/ms.json12
-rw-r--r--app/javascript/mastodon/locales/nl.json14
-rw-r--r--app/javascript/mastodon/locales/nn.json12
-rw-r--r--app/javascript/mastodon/locales/no.json12
-rw-r--r--app/javascript/mastodon/locales/oc.json12
-rw-r--r--app/javascript/mastodon/locales/pa.json12
-rw-r--r--app/javascript/mastodon/locales/pl.json14
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json34
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json14
-rw-r--r--app/javascript/mastodon/locales/ro.json12
-rw-r--r--app/javascript/mastodon/locales/ru.json16
-rw-r--r--app/javascript/mastodon/locales/sa.json12
-rw-r--r--app/javascript/mastodon/locales/sc.json12
-rw-r--r--app/javascript/mastodon/locales/si.json12
-rw-r--r--app/javascript/mastodon/locales/sk.json18
-rw-r--r--app/javascript/mastodon/locales/sl.json96
-rw-r--r--app/javascript/mastodon/locales/sq.json14
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json12
-rw-r--r--app/javascript/mastodon/locales/sr.json12
-rw-r--r--app/javascript/mastodon/locales/sv.json22
-rw-r--r--app/javascript/mastodon/locales/szl.json12
-rw-r--r--app/javascript/mastodon/locales/ta.json12
-rw-r--r--app/javascript/mastodon/locales/tai.json12
-rw-r--r--app/javascript/mastodon/locales/te.json12
-rw-r--r--app/javascript/mastodon/locales/th.json26
-rw-r--r--app/javascript/mastodon/locales/tr.json16
-rw-r--r--app/javascript/mastodon/locales/tt.json26
-rw-r--r--app/javascript/mastodon/locales/ug.json12
-rw-r--r--app/javascript/mastodon/locales/uk.json276
-rw-r--r--app/javascript/mastodon/locales/ur.json12
-rw-r--r--app/javascript/mastodon/locales/vi.json16
-rw-r--r--app/javascript/mastodon/locales/whitelist_en-GB.json2
-rw-r--r--app/javascript/mastodon/locales/zgh.json12
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json200
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json12
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json32
-rw-r--r--app/javascript/mastodon/reducers/accounts.js7
-rw-r--r--app/javascript/mastodon/reducers/compose.js9
-rw-r--r--app/javascript/mastodon/reducers/settings.js5
-rw-r--r--app/javascript/mastodon/selectors/index.js8
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss22
-rw-r--r--app/javascript/styles/mastodon/components.scss79
-rw-r--r--app/lib/activitypub/activity.rb17
-rw-r--r--app/lib/activitypub/activity/announce.rb2
-rw-r--r--app/lib/activitypub/activity/create.rb4
-rw-r--r--app/lib/activitypub/activity/delete.rb6
-rw-r--r--app/lib/advanced_text_formatter.rb2
-rw-r--r--app/lib/application_extension.rb4
-rw-r--r--app/lib/emoji_formatter.rb28
-rw-r--r--app/lib/importer/accounts_index_importer.rb30
-rw-r--r--app/lib/importer/base_importer.rb87
-rw-r--r--app/lib/importer/statuses_index_importer.rb89
-rw-r--r--app/lib/importer/tags_index_importer.rb26
-rw-r--r--app/lib/rss/builder.rb33
-rw-r--r--app/lib/rss/channel.rb49
-rw-r--r--app/lib/rss/element.rb24
-rw-r--r--app/lib/rss/item.rb45
-rw-r--r--app/lib/rss/media_content.rb35
-rw-r--r--app/lib/rss/serializer.rb55
-rw-r--r--app/lib/rss_builder.rb130
-rw-r--r--app/lib/user_settings_decorator.rb5
-rw-r--r--app/models/account.rb17
-rw-r--r--app/models/account_migration.rb13
-rw-r--r--app/models/account_stat.rb12
-rw-r--r--app/models/admin/account_action.rb8
-rw-r--r--app/models/admin/import.rb29
-rw-r--r--app/models/admin/status_batch_action.rb6
-rw-r--r--app/models/concerns/lockable.rb19
-rw-r--r--app/models/concerns/redisable.rb8
-rw-r--r--app/models/domain_allow.rb4
-rw-r--r--app/models/form/domain_block_batch.rb35
-rw-r--r--app/models/mute.rb1
-rw-r--r--app/models/poll.rb5
-rw-r--r--app/models/status.rb6
-rw-r--r--app/models/status_stat.rb12
-rw-r--r--app/models/trends.rb4
-rw-r--r--app/models/trends/history.rb20
-rw-r--r--app/models/user.rb3
-rw-r--r--app/policies/status_policy.rb2
-rw-r--r--app/presenters/instance_presenter.rb9
-rw-r--r--app/serializers/initial_state_serializer.rb8
-rw-r--r--app/serializers/rest/account_serializer.rb7
-rw-r--r--app/serializers/rest/preferences_serializer.rb2
-rw-r--r--app/serializers/rss/account_serializer.rb28
-rw-r--r--app/serializers/rss/tag_serializer.rb25
-rw-r--r--app/services/activitypub/fetch_remote_status_service.rb1
-rw-r--r--app/services/activitypub/process_account_service.rb33
-rw-r--r--app/services/activitypub/process_status_update_service.rb46
-rw-r--r--app/services/appeal_service.rb3
-rw-r--r--app/services/approve_appeal_service.rb3
-rw-r--r--app/services/fetch_link_card_service.rb15
-rw-r--r--app/services/process_mentions_service.rb3
-rw-r--r--app/services/remove_status_service.rb63
-rw-r--r--app/services/report_service.rb2
-rw-r--r--app/services/resolve_account_service.rb13
-rw-r--r--app/services/unfollow_service.rb6
-rw-r--r--app/services/verify_link_service.rb2
-rw-r--r--app/services/vote_service.rb21
-rw-r--r--app/validators/admin_import_validator.rb19
-rw-r--r--app/validators/status_pin_validator.rb2
-rw-r--r--app/views/accounts/show.rss.ruby37
-rw-r--r--app/views/admin/custom_emojis/new.html.haml2
-rw-r--r--app/views/admin/export_domain_allows/new.html.haml10
-rw-r--r--app/views/admin/export_domain_blocks/_domain_block.html.haml27
-rw-r--r--app/views/admin/export_domain_blocks/import.html.haml21
-rw-r--r--app/views/admin/export_domain_blocks/new.html.haml10
-rw-r--r--app/views/admin/instances/index.html.haml4
-rw-r--r--app/views/disputes/strikes/show.html.haml4
-rw-r--r--app/views/statuses/_simple_status.html.haml2
-rw-r--r--app/views/tags/show.rss.ruby35
-rw-r--r--app/workers/distribution_worker.rb9
-rw-r--r--app/workers/scheduler/indexing_scheduler.rb26
-rw-r--r--chart/templates/configmap-env.yaml5
-rw-r--r--chart/values.yaml5
-rw-r--r--config/application.rb2
-rw-r--r--config/initializers/chewy.rb5
-rw-r--r--config/initializers/doorkeeper.rb7
-rw-r--r--config/locales-glitch/en.yml20
-rw-r--r--config/locales-glitch/simple_form.ko.yml4
-rw-r--r--config/locales/activerecord.af.yml31
-rw-r--r--config/locales/activerecord.ckb.yml15
-rw-r--r--config/locales/activerecord.he.yml19
-rw-r--r--config/locales/af.yml24
-rw-r--r--config/locales/ar.yml36
-rw-r--r--config/locales/ast.yml2
-rw-r--r--config/locales/ca.yml58
-rw-r--r--config/locales/ckb.yml182
-rw-r--r--config/locales/cs.yml10
-rw-r--r--config/locales/cy.yml44
-rw-r--r--config/locales/da.yml13
-rw-r--r--config/locales/de.yml30
-rw-r--r--config/locales/devise.ca.yml2
-rw-r--r--config/locales/devise.gl.yml2
-rw-r--r--config/locales/devise.he.yml58
-rw-r--r--config/locales/devise.io.yml55
-rw-r--r--config/locales/devise.ru.yml2
-rw-r--r--config/locales/devise.th.yml2
-rw-r--r--config/locales/devise.zh-TW.yml36
-rw-r--r--config/locales/doorkeeper.ar.yml1
-rw-r--r--config/locales/doorkeeper.ckb.yml42
-rw-r--r--config/locales/doorkeeper.en-GB.yml1
-rw-r--r--config/locales/doorkeeper.eo.yml8
-rw-r--r--config/locales/doorkeeper.he.yml77
-rw-r--r--config/locales/doorkeeper.io.yml60
-rw-r--r--config/locales/doorkeeper.pt-BR.yml2
-rw-r--r--config/locales/doorkeeper.ru.yml11
-rw-r--r--config/locales/doorkeeper.sl.yml6
-rw-r--r--config/locales/doorkeeper.th.yml5
-rw-r--r--config/locales/doorkeeper.uk.yml6
-rw-r--r--config/locales/doorkeeper.zh-CN.yml2
-rw-r--r--config/locales/doorkeeper.zh-TW.yml30
-rw-r--r--config/locales/el.yml6
-rw-r--r--config/locales/en.yml14
-rw-r--r--config/locales/eo.yml17
-rw-r--r--config/locales/es-AR.yml12
-rw-r--r--config/locales/es-MX.yml9
-rw-r--r--config/locales/es.yml12
-rw-r--r--config/locales/et.yml18
-rw-r--r--config/locales/eu.yml2
-rw-r--r--config/locales/fa.yml30
-rw-r--r--config/locales/fr.yml11
-rw-r--r--config/locales/gd.yml12
-rw-r--r--config/locales/gl.yml16
-rw-r--r--config/locales/he.yml1388
-rw-r--r--config/locales/hu.yml16
-rw-r--r--config/locales/id.yml10
-rw-r--r--config/locales/io.yml1589
-rw-r--r--config/locales/is.yml10
-rw-r--r--config/locales/it.yml28
-rw-r--r--config/locales/ja.yml10
-rw-r--r--config/locales/ko.yml52
-rw-r--r--config/locales/ku.yml12
-rw-r--r--config/locales/lv.yml12
-rw-r--r--config/locales/pl.yml31
-rw-r--r--config/locales/pt-BR.yml134
-rw-r--r--config/locales/pt-PT.yml12
-rw-r--r--config/locales/ru.yml45
-rw-r--r--config/locales/simple_form.ar.yml1
-rw-r--r--config/locales/simple_form.ca.yml24
-rw-r--r--config/locales/simple_form.cy.yml2
-rw-r--r--config/locales/simple_form.he.yml172
-rw-r--r--config/locales/simple_form.hu.yml6
-rw-r--r--config/locales/simple_form.io.yml187
-rw-r--r--config/locales/simple_form.ko.yml12
-rw-r--r--config/locales/simple_form.ru.yml8
-rw-r--r--config/locales/simple_form.sl.yml63
-rw-r--r--config/locales/simple_form.uk.yml5
-rw-r--r--config/locales/simple_form.zh-TW.yml52
-rw-r--r--config/locales/sk.yml1
-rw-r--r--config/locales/sl.yml720
-rw-r--r--config/locales/sq.yml7
-rw-r--r--config/locales/sv.yml5
-rw-r--r--config/locales/th.yml26
-rw-r--r--config/locales/tr.yml10
-rw-r--r--config/locales/uk.yml86
-rw-r--r--config/locales/vi.yml16
-rw-r--r--config/locales/zh-CN.yml30
-rw-r--r--config/locales/zh-TW.yml330
-rw-r--r--config/routes.rb21
-rw-r--r--config/sidekiq.yml4
-rw-r--r--jest.config.js33
-rw-r--r--lib/chewy/strategy/custom_sidekiq.rb11
-rw-r--r--lib/chewy/strategy/mastodon.rb27
-rw-r--r--lib/mastodon/search_cli.rb129
-rw-r--r--lib/mastodon/version.rb2
-rw-r--r--lib/tasks/mastodon.rake8
-rw-r--r--package.json80
-rw-r--r--public/embed.js36
-rw-r--r--spec/controllers/admin/domain_allows_controller_spec.rb48
-rw-r--r--spec/controllers/admin/domain_blocks_controller_spec.rb21
-rw-r--r--spec/controllers/admin/export_domain_allows_controller_spec.rb42
-rw-r--r--spec/controllers/admin/export_domain_blocks_controller_spec.rb35
-rw-r--r--spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb4
-rw-r--r--spec/fixtures/files/domain_allows.csv3
-rw-r--r--spec/fixtures/files/domain_blocks.csv4
-rw-r--r--spec/helpers/settings/keyword_mutes_helper_spec.rb15
-rw-r--r--spec/lib/advanced_text_formatter_spec.rb4
-rw-r--r--spec/lib/emoji_formatter_spec.rb6
-rw-r--r--spec/lib/rss/serializer_spec.rb56
-rw-r--r--spec/models/account_spec.rb178
-rw-r--r--spec/services/activitypub/fetch_remote_status_service_spec.rb40
-rw-r--r--spec/services/fetch_remote_status_service_spec.rb6
-rw-r--r--spec/services/resolve_url_service_spec.rb19
-rw-r--r--yarn.lock2195
381 files changed, 13192 insertions, 4199 deletions
diff --git a/.browserslistrc b/.browserslistrc
new file mode 100644
index 000000000..54dd3aaf3
--- /dev/null
+++ b/.browserslistrc
@@ -0,0 +1,7 @@
+[production]
+defaults
+not IE 11
+not dead
+
+[development]
+supports es6-module
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 628efc8ec..9d9e54d4f 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -11,7 +11,8 @@
   "extensions": [
     "EditorConfig.EditorConfig",
     "dbaeumer.vscode-eslint",
-    "rebornix.Ruby"
+    "rebornix.Ruby",
+    "webben.browserslist"
   ],
 
   // Use 'forwardPorts' to make a list of ports inside the container available locally.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8814d5a4c..ed4cdd881 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,105 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## [3.5.3] - 2022-05-26
+### Added
+
+- **Add language dropdown to compose form in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/18420), [ykzts](https://github.com/mastodon/mastodon/pull/18460))
+- **Add warning for limited accounts in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/18344))
+- Add `limited` attribute to accounts in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/18344))
+
+### Changed
+
+- **Change RSS feeds** ([Gargron](https://github.com/mastodon/mastodon/pull/18356), [tribela](https://github.com/mastodon/mastodon/pull/18406))
+  - Titles are now date and time of post
+  - Bodies now render all content faithfully, including polls and emojis
+  - All media attachments are included with Media RSS
+- Change "dangerous" to "sensitive" in privacy policy and web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18515))
+- Change unconfirmed accounts to not be visible in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17530))
+- Change `tootctl search deploy` to improve performance ([Gargron](https://github.com/mastodon/mastodon/pull/18463), [Gargron](https://github.com/mastodon/mastodon/pull/18514))
+- Change search indexing to use batches to minimize resource usage ([Gargron](https://github.com/mastodon/mastodon/pull/18451))
+
+### Fixed
+
+- Fix follower and other counters being able to go negative ([Gargron](https://github.com/mastodon/mastodon/pull/18517))
+- Fix unnecessary query on when creating a status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17901))
+- Fix warning an account outside of a report closing all reports for that account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18387))
+- Fix error when resolving a link that redirects to a local post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18314))
+- Fix preferred posting language returning unusable value in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/18428))
+- Fix race condition error when external status is reblogged ([ykzts](https://github.com/mastodon/mastodon/pull/18424))
+- Fix missing string for appeal validation error ([Gargron](https://github.com/mastodon/mastodon/pull/18410))
+- Fix block/mute lists showing a follow button in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18364))
+- Fix Redis configuration not being changed by `mastodon:setup` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18383))
+- Fix streaming notifications not using quick filter logic in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18316))
+- Fix ambiguous wording on appeal actions in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18328))
+- Fix floating action button obscuring last element in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18332))
+- Fix account warnings not being recorded in audit log ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18338))
+- Fix leftover icons for direct visibility statuses ([Steffo99](https://github.com/mastodon/mastodon/pull/18305))
+- Fix link verification requiring case sensitivity on links ([sgolemon](https://github.com/mastodon/mastodon/pull/18320))
+- Fix embeds not setting their height correctly ([rinsuki](https://github.com/mastodon/mastodon/pull/18301))
+
+### Security
+
+- Fix concurrent unfollowing decrementing follower count more than once ([Gargron](https://github.com/mastodon/mastodon/pull/18527))
+- Fix being able to appeal a strike unlimited times ([Gargron](https://github.com/mastodon/mastodon/pull/18529))
+- Fix being able to report otherwise inaccessible statuses ([Gargron](https://github.com/mastodon/mastodon/pull/18528))
+- Fix empty votes arbitrarily increasing voters count in polls ([Gargron](https://github.com/mastodon/mastodon/pull/18526))
+- Fix moderator identity leak when approving appeal of sensitive marked statuses ([Gargron](https://github.com/mastodon/mastodon/pull/18525))
+- Fix suspended users being able to access APIs that don't require a user ([Gargron](https://github.com/mastodon/mastodon/pull/18524))
+- Fix confirmation redirect to app without `Location` header ([Gargron](https://github.com/mastodon/mastodon/pull/18523))
+
+## [3.5.2] - 2022-05-04
+### Added
+
+- Add warning on direct messages screen in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18289))
+  - We already had a warning when composing a direct message, it has now been reworded to be more clear
+  - Same warning is now displayed when viewing sent and received direct messages
+- Add ability to set approval-based registration through tootctl ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18248))
+- Add pre-filling of domain from search filter in domain allow/block admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18172))
+
+## Changed
+
+- Change name of “Direct” visibility to “Mentioned people only” in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18146), [Gargron](https://github.com/mastodon/mastodon/pull/18289), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18291))
+- Change trending posts to only show one post from each account ([Gargron](https://github.com/mastodon/mastodon/pull/18181))
+- Change half-life of trending posts from 6 hours to 2 hours ([Gargron](https://github.com/mastodon/mastodon/pull/18182))
+- Change full-text search feature to also include polls you have voted in ([tribela](https://github.com/mastodon/mastodon/pull/18070))
+- Change Redis from using one connection per process, to using a connection pool ([Gargron](https://github.com/mastodon/mastodon/pull/18135), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18160), [Gargron](https://github.com/mastodon/mastodon/pull/18171))
+  - Different threads no longer have to wait on a mutex over a single connection
+  - However, this does increase the number of Redis connections by a fair amount
+  - We are planning to optimize Redis use so that the pool can be made smaller in the future
+
+## Removed
+
+- Remove IP matching from e-mail domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/18190))
+  - The IPs of the blocked e-mail domain or its MX records are no longer checked
+  - Previously it was too easy to block e-mail providers by mistake
+  
+## Fixed
+
+- Fix compatibility with Friendica's pinned posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18254), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18260))
+- Fix error when looking up handle with surrounding spaces in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18225))
+- Fix double render error when authorizing interaction ([Gargron](https://github.com/mastodon/mastodon/pull/18203))
+- Fix error when a post references an invalid media attachment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18211))
+- Fix error when trying to revoke OAuth token without supplying a token ([Gargron](https://github.com/mastodon/mastodon/pull/18205))
+- Fix error caused by missing subject in Webfinger response ([Gargron](https://github.com/mastodon/mastodon/pull/18204))
+- Fix error on attempting to delete an account moderation note ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18196))
+- Fix light-mode emoji borders in web UI ([Gaelan](https://github.com/mastodon/mastodon/pull/18131))
+- Fix being able to scroll away from the loading bar in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18170))
+- Fix error when a bookmark or favorite has been reported and deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18174))
+- Fix being offered empty “Server rules violation” report option in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18165))
+- Fix temporary network errors preventing from authorizing interactions with remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18161))
+- Fix incorrect link in "new trending tags" email ([cdzombak](https://github.com/mastodon/mastodon/pull/18156))
+- Fix missing indexes on some foreign keys ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18157))
+- Fix n+1 query on feed merge and populate operations ([Gargron](https://github.com/mastodon/mastodon/pull/18111))
+- Fix feed unmerge worker being exceptionally slow in some conditions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18110))
+- Fix PeerTube videos appearing with an erroneous “Edited at” marker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18100))
+- Fix instance actor being created incorrectly when running through migrations ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18109))
+- Fix web push notifications containing HTML entities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18071))
+- Fix inconsistent parsing of `TRUSTED_PROXY_IP` ([ykzts](https://github.com/mastodon/mastodon/pull/18051))
+- Fix error when fetching pinned posts ([tribela](https://github.com/mastodon/mastodon/pull/18030))
+- Fix wrong optimization in feed populate operation ([dogelover911](https://github.com/mastodon/mastodon/pull/18009))
+- Fix error in alias settings page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18004))
+
 ## [3.5.1] - 2022-04-08
 ### Added
 
diff --git a/Gemfile b/Gemfile
index 6f11c391e..c8d58b06e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,13 +1,13 @@
 # frozen_string_literal: true
 
 source 'https://rubygems.org'
-ruby '>= 2.5.0', '< 3.1.0'
+ruby '>= 2.6.0', '< 3.1.0'
 
 gem 'pkg-config', '~> 1.4'
 gem 'rexml', '~> 3.2'
 
 gem 'puma', '~> 5.6'
-gem 'rails', '~> 6.1.5'
+gem 'rails', '~> 6.1.6'
 gem 'sprockets', '~> 3.7.2'
 gem 'thor', '~> 1.2'
 gem 'rack', '~> 2.2.3'
@@ -18,7 +18,7 @@ gem 'makara', '~> 0.5'
 gem 'pghero', '~> 2.8'
 gem 'dotenv-rails', '~> 2.7'
 
-gem 'aws-sdk-s3', '~> 1.113', require: false
+gem 'aws-sdk-s3', '~> 1.114', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'kt-paperclip', '~> 7.1'
@@ -79,13 +79,13 @@ gem 'ruby-progressbar', '~> 1.11'
 gem 'sanitize', '~> 6.0'
 gem 'scenic', '~> 1.6'
 gem 'sidekiq', '~> 6.4'
-gem 'sidekiq-scheduler', '~> 3.2'
+gem 'sidekiq-scheduler', '~> 4.0'
 gem 'sidekiq-unique-jobs', '~> 7.1'
-gem 'sidekiq-bulk', '~>0.2.0'
+gem 'sidekiq-bulk', '~> 0.2.0'
 gem 'simple-navigation', '~> 4.3'
 gem 'simple_form', '~> 5.1'
 gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
-gem 'stoplight', '~> 2.2.1'
+gem 'stoplight', '~> 3.0.0'
 gem 'strong_migrations', '~> 0.7'
 gem 'tty-prompt', '~> 0.23', require: false
 gem 'twitter-text', '~> 3.1.0'
@@ -114,9 +114,9 @@ group :production, :test do
 end
 
 group :test do
-  gem 'capybara', '~> 3.36'
+  gem 'capybara', '~> 3.37'
   gem 'climate_control', '~> 0.2'
-  gem 'faker', '~> 2.20'
+  gem 'faker', '~> 2.21'
   gem 'microformats', '~> 4.2'
   gem 'rails-controller-testing', '~> 1.0'
   gem 'rspec-sidekiq', '~> 3.1'
@@ -134,7 +134,7 @@ group :development do
   gem 'letter_opener', '~> 1.8'
   gem 'letter_opener_web', '~> 2.0'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 1.27', require: false
+  gem 'rubocop', '~> 1.29', require: false
   gem 'rubocop-rails', '~> 2.14', require: false
   gem 'brakeman', '~> 5.2', require: false
   gem 'bundler-audit', '~> 0.9', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 2aa318499..3218adcee 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,40 +1,40 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    actioncable (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actioncable (6.1.6)
+      actionpack (= 6.1.6)
+      activesupport (= 6.1.6)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      activejob (= 6.1.5.1)
-      activerecord (= 6.1.5.1)
-      activestorage (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actionmailbox (6.1.6)
+      actionpack (= 6.1.6)
+      activejob (= 6.1.6)
+      activerecord (= 6.1.6)
+      activestorage (= 6.1.6)
+      activesupport (= 6.1.6)
       mail (>= 2.7.1)
-    actionmailer (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      actionview (= 6.1.5.1)
-      activejob (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actionmailer (6.1.6)
+      actionpack (= 6.1.6)
+      actionview (= 6.1.6)
+      activejob (= 6.1.6)
+      activesupport (= 6.1.6)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (6.1.5.1)
-      actionview (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actionpack (6.1.6)
+      actionview (= 6.1.6)
+      activesupport (= 6.1.6)
       rack (~> 2.0, >= 2.0.9)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
-    actiontext (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      activerecord (= 6.1.5.1)
-      activestorage (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actiontext (6.1.6)
+      actionpack (= 6.1.6)
+      activerecord (= 6.1.6)
+      activestorage (= 6.1.6)
+      activesupport (= 6.1.6)
       nokogiri (>= 1.8.5)
-    actionview (6.1.5.1)
-      activesupport (= 6.1.5.1)
+    actionview (6.1.6)
+      activesupport (= 6.1.6)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
@@ -45,22 +45,22 @@ GEM
       case_transform (>= 0.2)
       jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
     active_record_query_trace (1.8)
-    activejob (6.1.5.1)
-      activesupport (= 6.1.5.1)
+    activejob (6.1.6)
+      activesupport (= 6.1.6)
       globalid (>= 0.3.6)
-    activemodel (6.1.5.1)
-      activesupport (= 6.1.5.1)
-    activerecord (6.1.5.1)
-      activemodel (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
-    activestorage (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      activejob (= 6.1.5.1)
-      activerecord (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    activemodel (6.1.6)
+      activesupport (= 6.1.6)
+    activerecord (6.1.6)
+      activemodel (= 6.1.6)
+      activesupport (= 6.1.6)
+    activestorage (6.1.6)
+      actionpack (= 6.1.6)
+      activejob (= 6.1.6)
+      activerecord (= 6.1.6)
+      activesupport (= 6.1.6)
       marcel (~> 1.0)
       mini_mime (>= 1.1.0)
-    activesupport (6.1.5.1)
+    activesupport (6.1.6)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
@@ -81,7 +81,7 @@ GEM
     attr_required (1.0.1)
     awrence (1.1.1)
     aws-eventstream (1.2.0)
-    aws-partitions (1.582.0)
+    aws-partitions (1.587.0)
     aws-sdk-core (3.130.2)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.525.0)
@@ -90,7 +90,7 @@ GEM
     aws-sdk-kms (1.56.0)
       aws-sdk-core (~> 3, >= 3.127.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.113.2)
+    aws-sdk-s3 (1.114.0)
       aws-sdk-core (~> 3, >= 3.127.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.4)
@@ -116,7 +116,7 @@ GEM
       ffi (~> 1.14)
     bootsnap (1.11.1)
       msgpack (~> 1.2)
-    brakeman (5.2.2)
+    brakeman (5.2.3)
     browser (4.2.0)
     brpoplpush-redis_script (0.1.2)
       concurrent-ruby (~> 1.0, >= 1.0.5)
@@ -144,7 +144,7 @@ GEM
       sshkit (~> 1.3)
     capistrano-yarn (2.0.2)
       capistrano (~> 3.0)
-    capybara (3.36.0)
+    capybara (3.37.1)
       addressable
       matrix
       mini_mime (>= 0.1.3)
@@ -203,7 +203,6 @@ GEM
     dotenv-rails (2.7.6)
       dotenv (= 2.7.6)
       railties (>= 3.2)
-    e2mmap (0.1.0)
     ed25519 (1.3.0)
     elasticsearch (7.13.3)
       elasticsearch-api (= 7.13.3)
@@ -220,7 +219,7 @@ GEM
       tzinfo
     excon (0.76.0)
     fabrication (2.28.0)
-    faker (2.20.0)
+    faker (2.21.0)
       i18n (>= 1.8.11, < 2)
     faraday (1.9.3)
       faraday-em_http (~> 1.0)
@@ -309,7 +308,7 @@ GEM
       rainbow (>= 2.0.0)
     i18n (1.10.0)
       concurrent-ruby (~> 1.0)
-    i18n-tasks (1.0.9)
+    i18n-tasks (1.0.10)
       activesupport (>= 4.0.2)
       ast (>= 2.1.0)
       better_html (~> 1.0)
@@ -377,7 +376,7 @@ GEM
       activesupport (>= 4)
       railties (>= 4)
       request_store (~> 1.0)
-    loofah (2.17.0)
+    loofah (2.18.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     mail (2.7.1)
@@ -407,7 +406,7 @@ GEM
       net-ssh (>= 2.6.5, < 7.0.0)
     net-ssh (6.1.0)
     nio4r (2.5.8)
-    nokogiri (1.13.4)
+    nokogiri (1.13.6)
       mini_portile2 (~> 2.8.0)
       racc (~> 1.4)
     nsa (0.2.8)
@@ -444,7 +443,7 @@ GEM
     orm_adapter (0.5.0)
     ox (2.14.11)
     parallel (1.22.1)
-    parser (3.1.1.0)
+    parser (3.1.2.0)
       ast (~> 2.4.1)
     parslet (2.0.0)
     pastel (0.8.0)
@@ -470,7 +469,7 @@ GEM
       pry (~> 0.13.0)
     pry-rails (0.3.9)
       pry (>= 0.10.4)
-    public_suffix (4.0.6)
+    public_suffix (4.0.7)
     puma (5.6.4)
       nio4r (~> 2.0)
     pundit (2.2.0)
@@ -492,20 +491,20 @@ GEM
       rack
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
-    rails (6.1.5.1)
-      actioncable (= 6.1.5.1)
-      actionmailbox (= 6.1.5.1)
-      actionmailer (= 6.1.5.1)
-      actionpack (= 6.1.5.1)
-      actiontext (= 6.1.5.1)
-      actionview (= 6.1.5.1)
-      activejob (= 6.1.5.1)
-      activemodel (= 6.1.5.1)
-      activerecord (= 6.1.5.1)
-      activestorage (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    rails (6.1.6)
+      actioncable (= 6.1.6)
+      actionmailbox (= 6.1.6)
+      actionmailer (= 6.1.6)
+      actionpack (= 6.1.6)
+      actiontext (= 6.1.6)
+      actionview (= 6.1.6)
+      activejob (= 6.1.6)
+      activemodel (= 6.1.6)
+      activerecord (= 6.1.6)
+      activestorage (= 6.1.6)
+      activesupport (= 6.1.6)
       bundler (>= 1.15.0)
-      railties (= 6.1.5.1)
+      railties (= 6.1.6)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
@@ -521,9 +520,9 @@ GEM
       railties (>= 6.0.0, < 7)
     rails-settings-cached (0.6.6)
       rails (>= 4.2.0)
-    railties (6.1.5.1)
-      actionpack (= 6.1.5.1)
-      activesupport (= 6.1.5.1)
+    railties (6.1.6)
+      actionpack (= 6.1.6)
+      activesupport (= 6.1.6)
       method_source
       rake (>= 12.2)
       thor (~> 1.0)
@@ -537,7 +536,7 @@ GEM
     redis (4.5.1)
     redis-namespace (1.8.2)
       redis (>= 3.0.4)
-    regexp_parser (2.3.0)
+    regexp_parser (2.4.0)
     request_store (1.5.1)
       rack (>= 1.4)
     responders (3.0.1)
@@ -572,16 +571,16 @@ GEM
     rspec-support (3.11.0)
     rspec_junit_formatter (0.5.1)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (1.27.0)
+    rubocop (1.29.1)
       parallel (~> 1.10)
       parser (>= 3.1.0.0)
       rainbow (>= 2.2.2, < 4.0)
       regexp_parser (>= 1.8, < 3.0)
-      rexml
-      rubocop-ast (>= 1.16.0, < 2.0)
+      rexml (>= 3.2.5, < 4.0)
+      rubocop-ast (>= 1.17.0, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 3.0)
-    rubocop-ast (1.17.0)
+    rubocop-ast (1.18.0)
       parser (>= 3.1.1.0)
     rubocop-rails (2.14.2)
       activesupport (>= 4.2.0)
@@ -604,20 +603,18 @@ GEM
       railties (>= 4.0.0)
     securecompare (1.0.0)
     semantic_range (3.0.0)
-    sidekiq (6.4.1)
+    sidekiq (6.4.2)
       connection_pool (>= 2.2.2)
       rack (~> 2.0)
       redis (>= 4.2.0)
     sidekiq-bulk (0.2.0)
       sidekiq
-    sidekiq-scheduler (3.2.0)
-      e2mmap
-      redis (>= 3, < 5)
+    sidekiq-scheduler (4.0.0)
+      redis (>= 4.2.0)
       rufus-scheduler (~> 3.2)
-      sidekiq (>= 3)
-      thwait
+      sidekiq (>= 4)
       tilt (>= 1.4.0)
-    sidekiq-unique-jobs (7.1.21)
+    sidekiq-unique-jobs (7.1.22)
       brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
       concurrent-ruby (~> 1.0, >= 1.0.5)
       sidekiq (>= 5.0, < 8.0)
@@ -646,7 +643,7 @@ GEM
       net-ssh (>= 2.8.0)
     stackprof (0.2.19)
     statsd-ruby (1.5.0)
-    stoplight (2.2.1)
+    stoplight (3.0.0)
     strong_migrations (0.7.9)
       activerecord (>= 5)
     swd (1.3.0)
@@ -659,8 +656,6 @@ GEM
     terrapin (0.6.0)
       climate_control (>= 0.0.3, < 1.0)
     thor (1.2.1)
-    thwait (0.2.0)
-      e2mmap
     tilt (2.0.10)
     tpm-key_attestation (0.9.0)
       bindata (~> 2.4)
@@ -737,7 +732,7 @@ DEPENDENCIES
   active_record_query_trace (~> 1.8)
   addressable (~> 2.8)
   annotate (~> 3.2)
-  aws-sdk-s3 (~> 1.113)
+  aws-sdk-s3 (~> 1.114)
   better_errors (~> 2.9)
   binding_of_caller (~> 1.0)
   blurhash (~> 0.1)
@@ -750,7 +745,7 @@ DEPENDENCIES
   capistrano-rails (~> 1.6)
   capistrano-rbenv (~> 2.2)
   capistrano-yarn (~> 2.0)
-  capybara (~> 3.36)
+  capybara (~> 3.37)
   charlock_holmes (~> 0.7.7)
   chewy (~> 7.2)
   climate_control (~> 0.2)
@@ -765,7 +760,7 @@ DEPENDENCIES
   dotenv-rails (~> 2.7)
   ed25519 (~> 1.3)
   fabrication (~> 2.28)
-  faker (~> 2.20)
+  faker (~> 2.21)
   fast_blank (~> 1.0)
   fastimage
   fog-core (<= 2.1.0)
@@ -817,7 +812,7 @@ DEPENDENCIES
   rack (~> 2.2.3)
   rack-attack (~> 6.6)
   rack-cors (~> 1.1)
-  rails (~> 6.1.5)
+  rails (~> 6.1.6)
   rails-controller-testing (~> 1.0)
   rails-i18n (~> 6.0)
   rails-settings-cached (~> 0.6)
@@ -830,14 +825,14 @@ DEPENDENCIES
   rspec-rails (~> 5.1)
   rspec-sidekiq (~> 3.1)
   rspec_junit_formatter (~> 0.5)
-  rubocop (~> 1.27)
+  rubocop (~> 1.29)
   rubocop-rails (~> 2.14)
   ruby-progressbar (~> 1.11)
   sanitize (~> 6.0)
   scenic (~> 1.6)
   sidekiq (~> 6.4)
   sidekiq-bulk (~> 0.2.0)
-  sidekiq-scheduler (~> 3.2)
+  sidekiq-scheduler (~> 4.0)
   sidekiq-unique-jobs (~> 7.1)
   simple-navigation (~> 4.3)
   simple_form (~> 5.1)
@@ -845,7 +840,7 @@ DEPENDENCIES
   sprockets (~> 3.7.2)
   sprockets-rails (~> 3.4)
   stackprof
-  stoplight (~> 2.2.1)
+  stoplight (~> 3.0.0)
   strong_migrations (~> 0.7)
   thor (~> 1.2)
   tty-prompt (~> 0.23)
diff --git a/SECURITY.md b/SECURITY.md
index 12f50ed88..62e23f736 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -14,7 +14,7 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
 | ------- | ------------------ |
 | 3.5.x   | Yes                |
 | 3.4.x   | Yes                |
-| 3.3.x   | Yes                |
+| 3.3.x   | No                 |
 | < 3.3   | No                 |
 
 [bug-bounty]: https://app.intigriti.com/programs/mastodon/mastodonio/detail
diff --git a/app/chewy/accounts_index.rb b/app/chewy/accounts_index.rb
index 6f9ea76e9..e38e14a10 100644
--- a/app/chewy/accounts_index.rb
+++ b/app/chewy/accounts_index.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class AccountsIndex < Chewy::Index
-  settings index: { refresh_interval: '5m' }, analysis: {
+  settings index: { refresh_interval: '30s' }, analysis: {
     analyzer: {
       content: {
         tokenizer: 'whitespace',
@@ -23,7 +23,7 @@ class AccountsIndex < Chewy::Index
     },
   }
 
-  index_scope ::Account.searchable.includes(:account_stat), delete_if: ->(account) { account.destroyed? || !account.searchable? }
+  index_scope ::Account.searchable.includes(:account_stat)
 
   root date_detection: false do
     field :id, type: 'long'
@@ -36,8 +36,8 @@ class AccountsIndex < Chewy::Index
       field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content'
     end
 
-    field :following_count, type: 'long', value: ->(account) { account.following.local.count }
-    field :followers_count, type: 'long', value: ->(account) { account.followers.local.count }
+    field :following_count, type: 'long', value: ->(account) { account.following_count }
+    field :followers_count, type: 'long', value: ->(account) { account.followers_count }
     field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at }
   end
 end
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index 1304aeedb..6dd4fb18b 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -3,7 +3,7 @@
 class StatusesIndex < Chewy::Index
   include FormattingHelper
 
-  settings index: { refresh_interval: '15m' }, analysis: {
+  settings index: { refresh_interval: '30s' }, analysis: {
     filter: {
       english_stop: {
         type: 'stop',
@@ -33,6 +33,8 @@ class StatusesIndex < Chewy::Index
     },
   }
 
+  # We do not use delete_if option here because it would call a method that we
+  # expect to be called with crutches without crutches, causing n+1 queries
   index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll)
 
   crutch :mentions do |collection|
diff --git a/app/chewy/tags_index.rb b/app/chewy/tags_index.rb
index f9db2b03a..df3d9e4cc 100644
--- a/app/chewy/tags_index.rb
+++ b/app/chewy/tags_index.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class TagsIndex < Chewy::Index
-  settings index: { refresh_interval: '15m' }, analysis: {
+  settings index: { refresh_interval: '30s' }, analysis: {
     analyzer: {
       content: {
         tokenizer: 'keyword',
@@ -23,7 +23,11 @@ class TagsIndex < Chewy::Index
     },
   }
 
-  index_scope ::Tag.listable, delete_if: ->(tag) { tag.destroyed? || !tag.listable? }
+  index_scope ::Tag.listable
+
+  crutch :time_period do
+    7.days.ago.to_date..0.days.ago.to_date
+  end
 
   root date_detection: false do
     field :name, type: 'text', analyzer: 'content' do
@@ -31,7 +35,7 @@ class TagsIndex < Chewy::Index
     end
 
     field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? }
-    field :usage, type: 'long', value: ->(tag) { tag.history.reduce(0) { |total, day| total + day.accounts } }
+    field :usage, type: 'long', value: ->(tag, crutches) { tag.history.aggregate(crutches.time_period).accounts }
     field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at }
   end
 end
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 03c07c50b..9949206cb 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -45,7 +45,6 @@ class AccountsController < ApplicationController
         limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
         @statuses = filtered_statuses.without_reblogs.limit(limit)
         @statuses = cache_collection(@statuses, Status)
-        render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
       end
 
       format.json do
diff --git a/app/controllers/activitypub/base_controller.rb b/app/controllers/activitypub/base_controller.rb
index 196d85a32..b8a7e0ab9 100644
--- a/app/controllers/activitypub/base_controller.rb
+++ b/app/controllers/activitypub/base_controller.rb
@@ -2,6 +2,7 @@
 
 class ActivityPub::BaseController < Api::BaseController
   skip_before_action :require_authenticated_user!
+  skip_before_action :require_not_suspended!
   skip_around_action :set_locale
 
   private
diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb
index 16defc1ea..48e9781d6 100644
--- a/app/controllers/admin/domain_blocks_controller.rb
+++ b/app/controllers/admin/domain_blocks_controller.rb
@@ -4,6 +4,17 @@ module Admin
   class DomainBlocksController < BaseController
     before_action :set_domain_block, only: [:show, :destroy, :edit, :update]
 
+    def batch
+      @form = Form::DomainBlockBatch.new(form_domain_block_batch_params.merge(current_account: current_account, action: action_from_button))
+      @form.save
+    rescue ActionController::ParameterMissing
+      flash[:alert] = I18n.t('admin.email_domain_blocks.no_domain_block_selected')
+    rescue Mastodon::NotPermittedError
+      flash[:alert] = I18n.t('admin.domain_blocks.created_msg')
+    else
+      redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
+    end
+
     def new
       authorize :domain_block, :create?
       @domain_block = DomainBlock.new(domain: params[:_domain])
@@ -76,5 +87,15 @@ module Admin
     def resource_params
       params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
     end
+
+    def form_domain_block_batch_params
+      params.require(:form_domain_block_batch).permit(domain_blocks_attributes: [:enabled, :domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate])
+    end
+
+    def action_from_button
+      if params[:save]
+        'save'
+      end
+    end
   end
 end
diff --git a/app/controllers/admin/export_domain_allows_controller.rb b/app/controllers/admin/export_domain_allows_controller.rb
new file mode 100644
index 000000000..eb2955ac3
--- /dev/null
+++ b/app/controllers/admin/export_domain_allows_controller.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'csv'
+
+module Admin
+  class ExportDomainAllowsController < BaseController
+    include AdminExportControllerConcern
+
+    before_action :set_dummy_import!, only: [:new]
+
+    ROWS_PROCESSING_LIMIT = 20_000
+
+    def new
+      authorize :domain_allow, :create?
+    end
+
+    def export
+      authorize :instance, :index?
+      send_export_file
+    end
+
+    def import
+      authorize :domain_allow, :create?
+      begin
+        @import = Admin::Import.new(import_params)
+        parse_import_data!(export_headers)
+
+        @data.take(ROWS_PROCESSING_LIMIT).each do |row|
+          domain = row['#domain'].strip
+          next if DomainAllow.allowed?(domain)
+
+          domain_allow = DomainAllow.new(domain: domain)
+          log_action :create, domain_allow if domain_allow.save
+        end
+        flash[:notice] = I18n.t('admin.domain_allows.created_msg')
+      rescue ActionController::ParameterMissing
+        flash[:error] = I18n.t('admin.export_domain_allows.no_file')
+      end
+      redirect_to admin_instances_path
+    end
+
+    private
+
+    def export_filename
+      'domain_allows.csv'
+    end
+
+    def export_headers
+      %w(#domain)
+    end
+
+    def export_data
+      CSV.generate(headers: export_headers, write_headers: true) do |content|
+        DomainAllow.allowed_domains.each do |instance|
+          content << [instance.domain]
+        end
+      end
+    end
+  end
+end
diff --git a/app/controllers/admin/export_domain_blocks_controller.rb b/app/controllers/admin/export_domain_blocks_controller.rb
new file mode 100644
index 000000000..db8863551
--- /dev/null
+++ b/app/controllers/admin/export_domain_blocks_controller.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'csv'
+
+module Admin
+  class ExportDomainBlocksController < BaseController
+    include AdminExportControllerConcern
+
+    before_action :set_dummy_import!, only: [:new]
+
+    ROWS_PROCESSING_LIMIT = 20_000
+
+    def new
+      authorize :domain_block, :create?
+    end
+
+    def export
+      authorize :instance, :index?
+      send_export_file
+    end
+
+    def import
+      authorize :domain_block, :create?
+
+      @import = Admin::Import.new(import_params)
+      parse_import_data!(export_headers)
+
+      @global_private_comment = I18n.t('admin.export_domain_blocks.import.private_comment_template', source: @import.data_file_name, date: I18n.l(Time.now.utc))
+
+      @form = Form::DomainBlockBatch.new
+      @domain_blocks = @data.take(ROWS_PROCESSING_LIMIT).filter_map do |row|
+        domain = row['#domain'].strip
+        next if DomainBlock.rule_for(domain).present?
+
+        domain_block = DomainBlock.new(domain: domain,
+                                       severity: row['#severity'].strip,
+                                       reject_media: row['#reject_media'].strip,
+                                       reject_reports: row['#reject_reports'].strip,
+                                       private_comment: @global_private_comment,
+                                       public_comment: row['#public_comment']&.strip,
+                                       obfuscate: row['#obfuscate'].strip)
+
+        domain_block if domain_block.valid?
+      end
+
+      @warning_domains = Instance.where(domain: @domain_blocks.map(&:domain)).where('EXISTS (SELECT 1 FROM follows JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id WHERE accounts.domain = instances.domain)').pluck(:domain)
+    rescue ActionController::ParameterMissing
+      flash.now[:alert] = I18n.t('admin.export_domain_blocks.no_file')
+      set_dummy_import!
+      render :new
+    end
+
+    private
+
+    def export_filename
+      'domain_blocks.csv'
+    end
+
+    def export_headers
+      %w(#domain #severity #reject_media #reject_reports #public_comment #obfuscate)
+    end
+
+    def export_data
+      CSV.generate(headers: export_headers, write_headers: true) do |content|
+        DomainBlock.with_user_facing_limitations.each do |instance|
+          content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate]
+        end
+      end
+    end
+  end
+end
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index d96285b44..2e393fbb6 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -11,6 +11,7 @@ class Api::BaseController < ApplicationController
   skip_before_action :require_functional!, unless: :whitelist_mode?
 
   before_action :require_authenticated_user!, if: :disallow_unauthenticated_api_access?
+  before_action :require_not_suspended!
   before_action :set_cache_headers
 
   protect_from_forgery with: :null_session
@@ -97,6 +98,10 @@ class Api::BaseController < ApplicationController
     render json: { error: 'This method requires an authenticated user' }, status: 401 unless current_user
   end
 
+  def require_not_suspended!
+    render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.suspended?
+  end
+
   def require_user!
     if !current_user
       render json: { error: 'This method requires an authenticated user' }, status: 422
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 5134bfb94..5537cc9b0 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -9,6 +9,8 @@ class Api::V1::AccountsController < Api::BaseController
 
   before_action :require_user!, except: [:show, :create]
   before_action :set_account, except: [:create]
+  before_action :check_account_approval, except: [:create]
+  before_action :check_account_confirmation, except: [:create]
   before_action :check_enabled_registrations, only: [:create]
 
   skip_before_action :require_authenticated_user!, only: :create
@@ -74,6 +76,14 @@ class Api::V1::AccountsController < Api::BaseController
     @account = Account.find(params[:id])
   end
 
+  def check_account_approval
+    raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending?
+  end
+
+  def check_account_confirmation
+    raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed?
+  end
+
   def relationships(**options)
     AccountRelationshipsPresenter.new([@account.id], current_user.account_id, **options)
   end
diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb
index 17ad56fa8..0817a905c 100644
--- a/app/controllers/auth/confirmations_controller.rb
+++ b/app/controllers/auth/confirmations_controller.rb
@@ -89,7 +89,7 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
 
   def after_confirmation_path_for(_resource_name, user)
     if user.created_by_application && truthy_param?(:redirect_to_app)
-      user.created_by_application.redirect_uri
+      user.created_by_application.confirmation_redirect_uri
     else
       super
     end
diff --git a/app/controllers/concerns/admin_export_controller_concern.rb b/app/controllers/concerns/admin_export_controller_concern.rb
new file mode 100644
index 000000000..013915d02
--- /dev/null
+++ b/app/controllers/concerns/admin_export_controller_concern.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module AdminExportControllerConcern
+  extend ActiveSupport::Concern
+
+  private
+
+  def send_export_file
+    respond_to do |format|
+      format.csv { send_data export_data, filename: export_filename }
+    end
+  end
+
+  def export_data
+    raise 'Override in controller'
+  end
+
+  def export_filename
+    raise 'Override in controller'
+  end
+
+  def set_dummy_import!
+    @import = Admin::Import.new
+  end
+
+  def import_params
+    params.require(:admin_import).permit(:data)
+  end
+
+  def import_data
+    Paperclip.io_adapters.for(@import.data).read
+  end
+
+  def parse_import_data!(default_headers)
+    data = CSV.parse(import_data, headers: true)
+    data = CSV.parse(import_data, headers: default_headers) unless data.headers&.first&.strip&.include?(default_headers[0])
+    @data = data.reject(&:blank?)
+  end
+end
diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb
index d2a4cb207..3b228722f 100644
--- a/app/controllers/media_proxy_controller.rb
+++ b/app/controllers/media_proxy_controller.rb
@@ -4,6 +4,7 @@ class MediaProxyController < ApplicationController
   include RoutingHelper
   include Authorization
   include Redisable
+  include Lockable
 
   skip_before_action :store_current_location
   skip_before_action :require_functional!
@@ -16,14 +17,10 @@ class MediaProxyController < ApplicationController
   rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error
 
   def show
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        @media_attachment = MediaAttachment.remote.attached.find(params[:id])
-        authorize @media_attachment.status, :show?
-        redownload! if @media_attachment.needs_redownload? && !reject_media?
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("media_download:#{params[:id]}") do
+      @media_attachment = MediaAttachment.remote.attached.find(params[:id])
+      authorize @media_attachment.status, :show?
+      redownload! if @media_attachment.needs_redownload? && !reject_media?
     end
 
     redirect_to full_asset_url(@media_attachment.file.url(version))
@@ -45,10 +42,6 @@ class MediaProxyController < ApplicationController
     end
   end
 
-  def lock_options
-    { redis: redis, key: "media_download:#{params[:id]}", autorelease: 15.minutes.seconds }
-  end
-
   def reject_media?
     DomainBlock.reject_media?(@media_attachment.account.domain)
   end
diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb
index 1638d3412..deaa7940e 100644
--- a/app/controllers/settings/exports_controller.rb
+++ b/app/controllers/settings/exports_controller.rb
@@ -3,6 +3,7 @@
 class Settings::ExportsController < Settings::BaseController
   include Authorization
   include Redisable
+  include Lockable
 
   skip_before_action :require_functional!
 
@@ -14,21 +15,13 @@ class Settings::ExportsController < Settings::BaseController
   def create
     backup = nil
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        authorize :backup, :create?
-        backup = current_user.backups.create!
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("backup:#{current_user.id}") do
+      authorize :backup, :create?
+      backup = current_user.backups.create!
     end
 
     BackupWorker.perform_async(backup.id)
 
     redirect_to settings_export_path
   end
-
-  def lock_options
-    { redis: redis, key: "backup:#{current_user.id}" }
-  end
 end
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 64736e77f..46821a200 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -27,7 +27,6 @@ class TagsController < ApplicationController
 
       format.rss do
         expires_in 0, public: true
-        render xml: RSS::TagSerializer.render(@tag, @statuses)
       end
 
       format.json do
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index ce25e26f9..b26e68c4d 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -132,7 +132,7 @@ module ApplicationHelper
     elsif status.private_visibility? || status.limited_visibility?
       fa_icon('lock', title: I18n.t('statuses.visibilities.private'))
     elsif status.direct_visibility?
-      fa_icon('envelope', title: I18n.t('statuses.visibilities.direct'))
+      fa_icon('at', title: I18n.t('statuses.visibilities.direct'))
     end
   end
 
@@ -244,7 +244,7 @@ module ApplicationHelper
     end.values
   end
 
-  def prerender_custom_emojis(html, custom_emojis)
-    EmojiFormatter.new(html, custom_emojis, animate: prefers_autoplay?).to_s
+  def prerender_custom_emojis(html, custom_emojis, other_options = {})
+    EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
   end
 end
diff --git a/app/helpers/formatting_helper.rb b/app/helpers/formatting_helper.rb
index 53e100dd2..448177bec 100644
--- a/app/helpers/formatting_helper.rb
+++ b/app/helpers/formatting_helper.rb
@@ -18,6 +18,32 @@ module FormattingHelper
     html_aware_format(status.text, status.local?, preloaded_accounts: [status.account] + (status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []), content_type: status.content_type)
   end
 
+  def rss_status_content_format(status)
+    html = status_content_format(status)
+
+    before_html = begin
+      if status.spoiler_text?
+        "<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />"
+      else
+        ''
+      end
+    end.html_safe # rubocop:disable Rails/OutputSafety
+
+    after_html = begin
+      if status.preloadable_poll
+        "<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>"
+      else
+        ''
+      end
+    end.html_safe # rubocop:disable Rails/OutputSafety
+
+    prerender_custom_emojis(
+      safe_join([before_html, html, after_html]),
+      status.emojis,
+      style: 'width: 1.1em; height: 1.1em; object-fit: contain; vertical-align: middle; margin: -.2ex .15em .2ex'
+    ).to_str
+  end
+
   def account_bio_format(account)
     html_aware_format(account.note, account.local?)
   end
diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb
index cbda21b2a..7ab2c9b66 100644
--- a/app/helpers/languages_helper.rb
+++ b/app/helpers/languages_helper.rb
@@ -258,4 +258,8 @@ module LanguagesHelper
   def valid_locale?(locale)
     locale.present? && SUPPORTED_LOCALES.key?(locale.to_sym)
   end
+
+  def available_locale_or_nil(locale_name)
+    locale_name.to_sym if locale_name.present? && I18n.available_locales.include?(locale_name.to_sym)
+  end
 end
diff --git a/app/helpers/settings/keyword_mutes_helper.rb b/app/helpers/settings/keyword_mutes_helper.rb
deleted file mode 100644
index 7b98cd59e..000000000
--- a/app/helpers/settings/keyword_mutes_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Settings::KeywordMutesHelper
-end
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
index e92b4c839..488eabeec 100644
--- a/app/helpers/statuses_helper.rb
+++ b/app/helpers/statuses_helper.rb
@@ -101,7 +101,7 @@ module StatusesHelper
     when 'private'
       fa_icon 'lock fw'
     when 'direct'
-      fa_icon 'envelope fw'
+      fa_icon 'at fw'
     end
   end
 
diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js
index ef0a8f267..c1b9f07a4 100644
--- a/app/javascript/core/admin.js
+++ b/app/javascript/core/admin.js
@@ -102,6 +102,12 @@ ready(() => {
   const registrationMode = document.getElementById('form_admin_settings_registrations_mode');
   if (registrationMode) onChangeRegistrationMode(registrationMode);
 
+  const checkAllElement = document.querySelector('#batch_checkbox_all');
+  if (checkAllElement) {
+    checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
+    checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
+  }
+
   document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => {
     const domain = document.getElementById('by_domain')?.value;
 
diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js
index 0cf64e076..f5871beb3 100644
--- a/app/javascript/flavours/glitch/actions/accounts.js
+++ b/app/javascript/flavours/glitch/actions/accounts.js
@@ -88,6 +88,8 @@ export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE = 'PINNED_ACCOUNTS_EDITOR
 export const PINNED_ACCOUNTS_EDITOR_RESET = 'PINNED_ACCOUNTS_EDITOR_RESET';
 
 
+export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL';
+
 export function fetchAccount(id) {
   return (dispatch, getState) => {
     dispatch(fetchRelationships([id]));
@@ -798,6 +800,11 @@ export function unpinAccountFail(error) {
   };
 };
 
+export const revealAccount = id => ({
+  type: ACCOUNT_REVEAL,
+  id,
+});
+
 export function fetchPinnedAccounts() {
   return (dispatch, getState) => {
     dispatch(fetchPinnedAccountsRequest());
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index baa98e98f..ab74fb303 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -48,12 +48,13 @@ export const COMPOSE_MOUNT   = 'COMPOSE_MOUNT';
 export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
 
 export const COMPOSE_ADVANCED_OPTIONS_CHANGE = 'COMPOSE_ADVANCED_OPTIONS_CHANGE';
-export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
-export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
+export const COMPOSE_SENSITIVITY_CHANGE  = 'COMPOSE_SENSITIVITY_CHANGE';
+export const COMPOSE_SPOILERNESS_CHANGE  = 'COMPOSE_SPOILERNESS_CHANGE';
 export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
-export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
-export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
+export const COMPOSE_VISIBILITY_CHANGE   = 'COMPOSE_VISIBILITY_CHANGE';
+export const COMPOSE_LISTABILITY_CHANGE  = 'COMPOSE_LISTABILITY_CHANGE';
 export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE';
+export const COMPOSE_LANGUAGE_CHANGE     = 'COMPOSE_LANGUAGE_CHANGE';
 
 export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
 
@@ -189,6 +190,7 @@ export function submitCompose(routerHistory) {
         spoiler_text: spoilerText,
         visibility: getState().getIn(['compose', 'privacy']),
         poll: getState().getIn(['compose', 'poll'], null),
+        language: getState().getIn(['compose', 'language']),
       },
       headers: {
         'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -675,6 +677,11 @@ export function changeComposeSensitivity() {
   };
 };
 
+export const changeComposeLanguage = language => ({
+  type: COMPOSE_LANGUAGE_CHANGE,
+  language,
+});
+
 export function changeComposeSpoilerness() {
   return {
     type: COMPOSE_SPOILERNESS_CHANGE,
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index bda15a9b0..c38af196a 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -1,7 +1,6 @@
 import escapeTextContentForBrowser from 'escape-html';
 import emojify from 'flavours/glitch/util/emoji';
 import { unescapeHTML } from 'flavours/glitch/util/html';
-import { expandSpoilers } from 'flavours/glitch/util/initial_state';
 
 const domParser = new DOMParser();
 
diff --git a/app/javascript/flavours/glitch/actions/languages.js b/app/javascript/flavours/glitch/actions/languages.js
new file mode 100644
index 000000000..ad186ba0c
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/languages.js
@@ -0,0 +1,12 @@
+import { saveSettings } from './settings';
+
+export const LANGUAGE_USE = 'LANGUAGE_USE';
+
+export const useLanguage = language => dispatch => {
+  dispatch({
+    type: LANGUAGE_USE,
+    language,
+  });
+
+  dispatch(saveSettings());
+};
diff --git a/app/javascript/flavours/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js
index 28660a4e8..856674eb3 100644
--- a/app/javascript/flavours/glitch/actions/local_settings.js
+++ b/app/javascript/flavours/glitch/actions/local_settings.js
@@ -1,4 +1,46 @@
+import { expandSpoilers, disableSwiping } from 'flavours/glitch/util/initial_state';
+import { openModal } from './modal';
+
 export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE';
+export const LOCAL_SETTING_DELETE = 'LOCAL_SETTING_DELETE';
+
+export function checkDeprecatedLocalSettings() {
+  return (dispatch, getState) => {
+    const local_auto_unfold = getState().getIn(['local_settings', 'content_warnings', 'auto_unfold']);
+    const local_swipe_to_change_columns = getState().getIn(['local_settings', 'swipe_to_change_columns']);
+    let changed_settings = [];
+
+    if (local_auto_unfold !== null && local_auto_unfold !== undefined) {
+      if (local_auto_unfold === expandSpoilers) {
+        dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold']));
+      } else {
+        changed_settings.push('user_setting_expand_spoilers');
+      }
+    }
+
+    if (local_swipe_to_change_columns !== null && local_swipe_to_change_columns !== undefined) {
+      if (local_swipe_to_change_columns === !disableSwiping) {
+        dispatch(deleteLocalSetting(['swipe_to_change_columns']));
+      } else {
+        changed_settings.push('user_setting_disable_swiping');
+      }
+    }
+
+    if (changed_settings.length > 0) {
+      dispatch(openModal('DEPRECATED_SETTINGS', {
+        settings: changed_settings,
+        onConfirm: () => dispatch(clearDeprecatedLocalSettings()),
+      }));
+    }
+  };
+};
+
+export function clearDeprecatedLocalSettings() {
+  return (dispatch) => {
+    dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold']));
+    dispatch(deleteLocalSetting(['swipe_to_change_columns']));
+  };
+};
 
 export function changeLocalSetting(key, value) {
   return dispatch => {
@@ -12,6 +54,17 @@ export function changeLocalSetting(key, value) {
   };
 };
 
+export function deleteLocalSetting(key) {
+  return dispatch => {
+    dispatch({
+      type: LOCAL_SETTING_DELETE,
+      key,
+    });
+
+    dispatch(saveLocalSettings());
+  };
+};
+
 //  __TODO :__
 //  Right now `saveLocalSettings()` doesn't keep track of which user
 //  is currently signed in, but it might be better to give each user
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index 42ad39efa..85938867b 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -70,7 +70,8 @@ export const loadPending = () => ({
 
 export function updateNotifications(notification, intlMessages, intlLocale) {
   return (dispatch, getState) => {
-    const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true);
+    const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
+    const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type;
     const showAlert    = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
     const playSound    = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
     const filters      = getFiltersRegex(getState(), { contextType: 'notifications' });
diff --git a/app/javascript/flavours/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js
index 396a36ea0..489f60736 100644
--- a/app/javascript/flavours/glitch/components/account.js
+++ b/app/javascript/flavours/glitch/components/account.js
@@ -16,8 +16,10 @@ const messages = defineMessages({
   requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
   unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
-  mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'You are not currently muting notifications from @{name}. Click to mute notifications' },
-  unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'You are currently muting notifications from @{name}. Click to unmute notifications' },
+  mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' },
+  unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' },
+  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
+  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
 });
 
 export default @injectIntl
@@ -34,6 +36,7 @@ class Account extends ImmutablePureComponent {
     small: PropTypes.bool,
     actionIcon: PropTypes.string,
     actionTitle: PropTypes.string,
+    defaultAction: PropTypes.string,
     onActionClick: PropTypes.func,
   };
 
@@ -70,6 +73,7 @@ class Account extends ImmutablePureComponent {
       onActionClick,
       actionIcon,
       actionTitle,
+      defaultAction,
     } = this.props;
 
     if (!account) {
@@ -114,6 +118,10 @@ class Account extends ImmutablePureComponent {
             {hidingNotificationsButton}
           </Fragment>
         );
+      } else if (defaultAction === 'mute') {
+        buttons = <IconButton icon='volume-off' title={intl.formatMessage(messages.mute, { name: account.get('username') })} onClick={this.handleMute} />;
+      } else if (defaultAction === 'block') {
+        buttons = <IconButton icon='lock' title={intl.formatMessage(messages.block, { name: account.get('username') })} onClick={this.handleBlock} />;
       } else if (!account.get('moved') || following) {
         buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;
       }
diff --git a/app/javascript/flavours/glitch/components/avatar.js b/app/javascript/flavours/glitch/components/avatar.js
index c5e9072c4..6d53a5298 100644
--- a/app/javascript/flavours/glitch/components/avatar.js
+++ b/app/javascript/flavours/glitch/components/avatar.js
@@ -1,13 +1,13 @@
-import classNames from 'classnames';
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { autoPlayGif } from 'flavours/glitch/util/initial_state';
+import classNames from 'classnames';
 
 export default class Avatar extends React.PureComponent {
 
   static propTypes = {
-    account: ImmutablePropTypes.map.isRequired,
+    account: ImmutablePropTypes.map,
     className: PropTypes.string,
     size: PropTypes.number.isRequired,
     style: PropTypes.object,
@@ -45,11 +45,6 @@ export default class Avatar extends React.PureComponent {
     } = this.props;
     const { hovering } = this.state;
 
-    const src = account.get('avatar');
-    const staticSrc = account.get('avatar_static');
-
-    const computedClass = classNames('account__avatar', { 'account__avatar-inline': inline }, className);
-
     const style = {
       ...this.props.style,
       width: `${size}px`,
@@ -57,19 +52,24 @@ export default class Avatar extends React.PureComponent {
       backgroundSize: `${size}px ${size}px`,
     };
 
-    if (hovering || animate) {
-      style.backgroundImage = `url(${src})`;
-    } else {
-      style.backgroundImage = `url(${staticSrc})`;
+    if (account) {
+      const src = account.get('avatar');
+      const staticSrc = account.get('avatar_static');
+
+      if (hovering || animate) {
+        style.backgroundImage = `url(${src})`;
+      } else {
+        style.backgroundImage = `url(${staticSrc})`;
+      }
     }
 
     return (
       <div
-        className={computedClass}
+        className={classNames('account__avatar', { 'account__avatar-inline': inline }, className)}
         onMouseEnter={this.handleMouseEnter}
         onMouseLeave={this.handleMouseLeave}
         style={style}
-        data-avatar-of={`@${account.get('acct')}`}
+        data-avatar-of={account && `@${account.get('acct')}`}
       />
     );
   }
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index bd6bc4ffd..e04af8074 100644
--- a/app/javascript/flavours/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -7,7 +7,7 @@ import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
-import { CircularProgress } from 'mastodon/components/loading_indicator';
+import { CircularProgress } from 'flavours/glitch/components/loading_indicator';
 
 const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 let id = 0;
diff --git a/app/javascript/flavours/glitch/components/modal_root.js b/app/javascript/flavours/glitch/components/modal_root.js
index 0595f6a0e..056277447 100644
--- a/app/javascript/flavours/glitch/components/modal_root.js
+++ b/app/javascript/flavours/glitch/components/modal_root.js
@@ -55,6 +55,10 @@ export default class ModalRoot extends React.PureComponent {
     window.addEventListener('keyup', this.handleKeyUp, false);
     window.addEventListener('keydown', this.handleKeyDown, false);
     this.history = this.context.router ? this.context.router.history : createBrowserHistory();
+
+    if (this.props.children) {
+      this._handleModalOpen();
+    }
   }
 
   componentWillReceiveProps (nextProps) {
diff --git a/app/javascript/flavours/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js
index de8ea8ee2..989e37024 100644
--- a/app/javascript/flavours/glitch/containers/mastodon.js
+++ b/app/javascript/flavours/glitch/containers/mastodon.js
@@ -8,6 +8,7 @@ import UI from 'flavours/glitch/features/ui';
 import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
 import { hydrateStore } from 'flavours/glitch/actions/store';
 import { connectUserStream } from 'flavours/glitch/actions/streaming';
+import { checkDeprecatedLocalSettings } from 'flavours/glitch/actions/local_settings';
 import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'locales';
 import initialState from 'flavours/glitch/util/initial_state';
@@ -20,6 +21,9 @@ export const store = configureStore();
 const hydrateAction = hydrateStore(initialState);
 store.dispatch(hydrateAction);
 
+// check for deprecated local settings
+store.dispatch(checkDeprecatedLocalSettings());
+
 // load custom emojis
 store.dispatch(fetchCustomEmojis());
 
diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js
index 68c6bae8e..45aba53f7 100644
--- a/app/javascript/flavours/glitch/features/account/components/header.js
+++ b/app/javascript/flavours/glitch/features/account/components/header.js
@@ -82,6 +82,7 @@ class Header extends ImmutablePureComponent {
     onEditAccountNote: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     domain: PropTypes.string.isRequired,
+    hidden: PropTypes.bool,
   };
 
   openEditProfile = () => {
@@ -115,7 +116,7 @@ class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, intl, domain, identity_proofs } = this.props;
+    const { account, hidden, intl, domain } = this.props;
 
     if (!account) {
       return null;
@@ -270,23 +271,29 @@ class Header extends ImmutablePureComponent {
             {info}
           </div>
 
-          <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />
+          {!(suspended || hidden) && <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />}
         </div>
 
         <div className='account__header__bar'>
           <div className='account__header__tabs'>
             <a className='avatar' href={account.get('url')} rel='noopener noreferrer' target='_blank'>
-              <Avatar account={account} size={90} />
+              <Avatar account={suspended || hidden ? undefined : account} size={90} />
             </a>
 
             <div className='spacer' />
 
-            <div className='account__header__tabs__buttons'>
-              {actionBtn}
-              {bellBtn}
+            {!suspended && (
+              <div className='account__header__tabs__buttons'>
+                {!hidden && (
+                  <React.Fragment>
+                    {actionBtn}
+                    {bellBtn}
+                  </React.Fragment>
+                )}
 
-              <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
-            </div>
+                <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
+              </div>
+            )}
           </div>
 
           <div className='account__header__tabs__name'>
@@ -298,23 +305,11 @@ class Header extends ImmutablePureComponent {
 
           <AccountNoteContainer account={account} />
 
-          {!suspended && (
+          {!(suspended || hidden) && (
             <div className='account__header__extra'>
               <div className='account__header__bio'>
-                { (fields.size > 0 || identity_proofs.size > 0) && (
+                { fields.size > 0 && (
                   <div className='account__header__fields'>
-                    {identity_proofs.map((proof, i) => (
-                      <dl key={i}>
-                        <dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} className='translate' />
-
-                        <dd className='verified'>
-                          <a href={proof.get('proof_url')} target='_blank' rel='noopener noreferrer'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}>
-                            <Icon id='check' className='verified__mark' />
-                          </span></a>
-                          <a href={proof.get('profile_url')} target='_blank' rel='noopener noreferrer'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} className='translate' /></a>
-                        </dd>
-                      </dl>
-                    ))}
                     {fields.map((pair, i) => (
                       <dl key={i}>
                         <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
index d6e607a37..645ff29ea 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/components/header.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
@@ -12,7 +12,6 @@ export default class Header extends ImmutablePureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map,
-    identity_proofs: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
     onBlock: PropTypes.func.isRequired,
     onMention: PropTypes.func.isRequired,
@@ -26,6 +25,7 @@ export default class Header extends ImmutablePureComponent {
     onAddToList: PropTypes.func.isRequired,
     hideTabs: PropTypes.bool,
     domain: PropTypes.string.isRequired,
+    hidden: PropTypes.bool,
   };
 
   static contextTypes = {
@@ -93,7 +93,7 @@ export default class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, hideTabs, identity_proofs } = this.props;
+    const { account, hidden, hideTabs } = this.props;
 
     if (account === null) {
       return null;
@@ -101,11 +101,10 @@ export default class Header extends ImmutablePureComponent {
 
     return (
       <div className='account-timeline__header'>
-        {account.get('moved') && <MovedNote from={account} to={account.get('moved')} />}
+        {(!hidden && account.get('moved')) && <MovedNote from={account} to={account.get('moved')} />}
 
         <InnerHeader
           account={account}
-          identity_proofs={identity_proofs}
           onFollow={this.handleFollow}
           onBlock={this.handleBlock}
           onMention={this.handleMention}
@@ -120,13 +119,14 @@ export default class Header extends ImmutablePureComponent {
           onAddToList={this.handleAddToList}
           onEditAccountNote={this.handleEditAccountNote}
           domain={this.props.domain}
+          hidden={hidden}
         />
 
         <ActionBar
           account={account}
         />
 
-        {!hideTabs && (
+        {!(hideTabs || hidden) && (
           <div className='account__section-headline'>
             <NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Posts' /></NavLink>
             <NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Posts with replies' /></NavLink>
diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js b/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js
new file mode 100644
index 000000000..e465c83b4
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/account_timeline/components/limited_account_hint.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { revealAccount } from 'flavours/glitch/actions/accounts';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+
+const mapDispatchToProps = (dispatch, { accountId }) => ({
+
+  reveal () {
+    dispatch(revealAccount(accountId));
+  },
+
+});
+
+export default @connect(() => {}, mapDispatchToProps)
+class LimitedAccountHint extends React.PureComponent {
+
+  static propTypes = {
+    accountId: PropTypes.string.isRequired,
+    reveal: PropTypes.func,
+  }
+
+  render () {
+    const { reveal } = this.props;
+
+    return (
+      <div className='limited-account-hint'>
+        <p><FormattedMessage id='limited_account_hint.title' defaultMessage='This profile has been hidden by the moderators of your server.' /></p>
+        <Button onClick={reveal}><FormattedMessage id='limited_account_hint.action' defaultMessage='Show profile anyway' /></Button>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
index 90e746679..3fa7c1448 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { makeGetAccount } from 'flavours/glitch/selectors';
+import { makeGetAccount, getAccountHidden } from 'flavours/glitch/selectors';
 import Header from '../components/header';
 import {
   followAccount,
@@ -22,7 +22,6 @@ import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_block
 import { initEditAccountNote } from 'flavours/glitch/actions/account_notes';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { unfollowModal } from 'flavours/glitch/util/initial_state';
-import { List as ImmutableList } from 'immutable';
 
 const messages = defineMessages({
   unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
@@ -35,7 +34,7 @@ const makeMapStateToProps = () => {
   const mapStateToProps = (state, { accountId }) => ({
     account: getAccount(state, accountId),
     domain: state.getIn(['meta', 'domain']),
-    identity_proofs: state.getIn(['identity_proofs', accountId], ImmutableList()),
+    hidden: getAccountHidden(state, accountId),
   });
 
   return mapStateToProps;
diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index 6d2df5c6f..68d558e66 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -13,9 +13,10 @@ import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import { List as ImmutableList } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
-import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import TimelineHint from 'flavours/glitch/components/timeline_hint';
+import LimitedAccountHint from './components/limited_account_hint';
+import { getAccountHidden } from 'flavours/glitch/selectors';
 
 const emptyList = ImmutableList();
 
@@ -40,6 +41,7 @@ const mapStateToProps = (state, { params: { acct, id }, withReplies = false }) =
     isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
     hasMore:   state.getIn(['timelines', `account:${path}`, 'hasMore']),
     suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
   };
 };
 
@@ -68,6 +70,7 @@ class AccountTimeline extends ImmutablePureComponent {
     withReplies: PropTypes.bool,
     isAccount: PropTypes.bool,
     suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -77,7 +80,7 @@ class AccountTimeline extends ImmutablePureComponent {
     const { accountId, withReplies, dispatch } = this.props;
 
     dispatch(fetchAccount(accountId));
-    dispatch(fetchAccountIdentityProofs(accountId));
+
     if (!withReplies) {
       dispatch(expandAccountFeaturedTimeline(accountId));
     }
@@ -109,10 +112,11 @@ class AccountTimeline extends ImmutablePureComponent {
 
     if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
       dispatch(fetchAccount(nextProps.params.accountId));
-      dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
+
       if (!nextProps.withReplies) {
         dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
       }
+
       dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
     }
   }
@@ -130,7 +134,7 @@ class AccountTimeline extends ImmutablePureComponent {
   }
 
   render () {
-    const { statusIds, featuredStatusIds, isLoading, hasMore, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props;
+    const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -151,8 +155,12 @@ class AccountTimeline extends ImmutablePureComponent {
 
     let emptyMessage;
 
+    const forceEmptyState = suspended || hidden;
+
     if (suspended) {
       emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
     } else if (remote && statusIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
     } else {
@@ -166,14 +174,14 @@ class AccountTimeline extends ImmutablePureComponent {
         <ProfileColumnHeader onClick={this.handleHeaderClick} multiColumn={multiColumn} />
 
         <StatusList
-          prepend={<HeaderContainer accountId={this.props.accountId} />}
+          prepend={<HeaderContainer accountId={this.props.accountId} hideTabs={forceEmptyState} />}
           alwaysPrepend
           append={remoteMessage}
           scrollKey='account_timeline'
-          statusIds={suspended ? emptyList : statusIds}
+          statusIds={forceEmptyState ? emptyList : statusIds}
           featuredStatusIds={featuredStatusIds}
           isLoading={isLoading}
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           onLoadMore={this.handleLoadMore}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
diff --git a/app/javascript/flavours/glitch/features/blocks/index.js b/app/javascript/flavours/glitch/features/blocks/index.js
index 4d0f58239..4461bd14d 100644
--- a/app/javascript/flavours/glitch/features/blocks/index.js
+++ b/app/javascript/flavours/glitch/features/blocks/index.js
@@ -69,7 +69,7 @@ class Blocks extends ImmutablePureComponent {
           bindToDocument={!multiColumn}
         >
           {accountIds.map(id =>
-            <AccountContainer key={id} id={id} />,
+            <AccountContainer key={id} id={id} defaultAction='block' />,
           )}
         </ScrollableList>
       </Column>
diff --git a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js
new file mode 100644
index 000000000..c8c503e58
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js
@@ -0,0 +1,332 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages } from 'react-intl';
+import TextIconButton from './text_icon_button';
+import Overlay from 'react-overlays/lib/Overlay';
+import Motion from 'flavours/glitch/util/optional_motion';
+import spring from 'react-motion/lib/spring';
+import { supportsPassiveEvents } from 'detect-passive-events';
+import classNames from 'classnames';
+import { languages as preloadedLanguages } from 'flavours/glitch/util/initial_state';
+import fuzzysort from 'fuzzysort';
+
+const messages = defineMessages({
+  changeLanguage: { id: 'compose.language.change', defaultMessage: 'Change language' },
+  search: { id: 'compose.language.search', defaultMessage: 'Search languages...' },
+  clear: { id: 'emoji_button.clear', defaultMessage: 'Clear' },
+});
+
+// Copied from emoji-mart for consistency with emoji picker and since
+// they don't export the icons in the package
+const icons = {
+  loupe: (
+    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'>
+      <path d='M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z' />
+    </svg>
+  ),
+
+  delete: (
+    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'>
+      <path d='M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z' />
+    </svg>
+  ),
+};
+
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
+
+class LanguageDropdownMenu extends React.PureComponent {
+
+  static propTypes = {
+    style: PropTypes.object,
+    value: PropTypes.string.isRequired,
+    frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired,
+    placement: PropTypes.string.isRequired,
+    onClose: PropTypes.func.isRequired,
+    onChange: PropTypes.func.isRequired,
+    languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),
+    intl: PropTypes.object,
+  };
+
+  static defaultProps = {
+    languages: preloadedLanguages,
+  };
+
+  state = {
+    mounted: false,
+    searchValue: '',
+  };
+
+  handleDocumentClick = e => {
+    if (this.node && !this.node.contains(e.target)) {
+      this.props.onClose();
+    }
+  }
+
+  componentDidMount () {
+    document.addEventListener('click', this.handleDocumentClick, false);
+    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+    this.setState({ mounted: true });
+  }
+
+  componentWillUnmount () {
+    document.removeEventListener('click', this.handleDocumentClick, false);
+    document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+  }
+
+  setRef = c => {
+    this.node = c;
+  }
+
+  setListRef = c => {
+    this.listNode = c;
+  }
+
+  handleSearchChange = ({ target }) => {
+    this.setState({ searchValue: target.value });
+  }
+
+  search () {
+    const { languages, value, frequentlyUsedLanguages } = this.props;
+    const { searchValue } = this.state;
+
+    if (searchValue === '') {
+      return [...languages].sort((a, b) => {
+        // Push current selection to the top of the list
+
+        if (a[0] === value) {
+          return -1;
+        } else if (b[0] === value) {
+          return 1;
+        } else {
+          // Sort according to frequently used languages
+
+          const indexOfA = frequentlyUsedLanguages.indexOf(a[0]);
+          const indexOfB = frequentlyUsedLanguages.indexOf(b[0]);
+
+          return ((indexOfA > -1 ? indexOfA : Infinity) - (indexOfB > -1 ? indexOfB : Infinity));
+        }
+      });
+    }
+
+    return fuzzysort.go(searchValue, languages, {
+      keys: ['0', '1', '2'],
+      limit: 5,
+      threshold: -10000,
+    }).map(result => result.obj);
+  }
+
+  frequentlyUsed () {
+    const { languages, value } = this.props;
+    const current = languages.find(lang => lang[0] === value);
+    const results = [];
+
+    if (current) {
+      results.push(current);
+    }
+
+    return results;
+  }
+
+  handleClick = e => {
+    const value = e.currentTarget.getAttribute('data-index');
+
+    e.preventDefault();
+
+    this.props.onClose();
+    this.props.onChange(value);
+  }
+
+  handleKeyDown = e => {
+    const { onClose } = this.props;
+    const index = Array.from(this.listNode.childNodes).findIndex(node => node === e.currentTarget);
+
+    let element = null;
+
+    switch(e.key) {
+    case 'Escape':
+      onClose();
+      break;
+    case 'Enter':
+      this.handleClick(e);
+      break;
+    case 'ArrowDown':
+      element = this.listNode.childNodes[index + 1] || this.listNode.firstChild;
+      break;
+    case 'ArrowUp':
+      element = this.listNode.childNodes[index - 1] || this.listNode.lastChild;
+      break;
+    case 'Tab':
+      if (e.shiftKey) {
+        element = this.listNode.childNodes[index - 1] || this.listNode.lastChild;
+      } else {
+        element = this.listNode.childNodes[index + 1] || this.listNode.firstChild;
+      }
+      break;
+    case 'Home':
+      element = this.listNode.firstChild;
+      break;
+    case 'End':
+      element = this.listNode.lastChild;
+      break;
+    }
+
+    if (element) {
+      element.focus();
+      e.preventDefault();
+      e.stopPropagation();
+    }
+  }
+
+  handleSearchKeyDown = e => {
+    const { onChange, onClose } = this.props;
+    const { searchValue } = this.state;
+
+    let element = null;
+
+    switch(e.key) {
+    case 'Tab':
+    case 'ArrowDown':
+      element = this.listNode.firstChild;
+
+      if (element) {
+        element.focus();
+        e.preventDefault();
+        e.stopPropagation();
+      }
+
+      break;
+    case 'Enter':
+      element = this.listNode.firstChild;
+
+      if (element) {
+        onChange(element.getAttribute('data-index'));
+        onClose();
+      }
+      break;
+    case 'Escape':
+      if (searchValue !== '') {
+        e.preventDefault();
+        this.handleClear();
+      }
+
+      break;
+    }
+  }
+
+  handleClear = () => {
+    this.setState({ searchValue: '' });
+  }
+
+  renderItem = lang => {
+    const { value } = this.props;
+
+    return (
+      <div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
+        <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span>
+      </div>
+    );
+  }
+
+  render () {
+    const { style, placement, intl } = this.props;
+    const { mounted, searchValue } = this.state;
+    const isSearching = searchValue !== '';
+    const results = this.search();
+
+    return (
+      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
+        {({ opacity, scaleX, scaleY }) => (
+          // It should not be transformed when mounting because the resulting
+          // size will be used to determine the coordinate of the menu by
+          // react-overlays
+          <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
+            <div className='emoji-mart-search'>
+              <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} autoFocus />
+              <button className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? icons.loupe : icons.delete}</button>
+            </div>
+
+            <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
+              {results.map(this.renderItem)}
+            </div>
+          </div>
+        )}
+      </Motion>
+    );
+  }
+
+}
+
+export default @injectIntl
+class LanguageDropdown extends React.PureComponent {
+
+  static propTypes = {
+    value: PropTypes.string,
+    frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string),
+    intl: PropTypes.object.isRequired,
+    onChange: PropTypes.func,
+    onClose: PropTypes.func,
+  };
+
+  state = {
+    open: false,
+    placement: 'bottom',
+  };
+
+  handleToggle = ({ target }) => {
+    const { top } = target.getBoundingClientRect();
+
+    if (this.state.open && this.activeElement) {
+      this.activeElement.focus({ preventScroll: true });
+    }
+
+    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
+    this.setState({ open: !this.state.open });
+  }
+
+  handleClose = () => {
+    const { value, onClose } = this.props;
+
+    if (this.state.open && this.activeElement) {
+      this.activeElement.focus({ preventScroll: true });
+    }
+
+    this.setState({ open: false });
+    onClose(value);
+  }
+
+  handleChange = value => {
+    const { onChange } = this.props;
+    onChange(value);
+  }
+
+  render () {
+    const { value, intl, frequentlyUsedLanguages } = this.props;
+    const { open, placement } = this.state;
+
+    return (
+      <div className={classNames('privacy-dropdown', { active: open })}>
+        <div className='privacy-dropdown__value'>
+          <TextIconButton
+            className='privacy-dropdown__value-icon'
+            label={value && value.toUpperCase()}
+            title={intl.formatMessage(messages.changeLanguage)}
+            active={open}
+            onClick={this.handleToggle}
+          />
+        </div>
+
+        <Overlay show={open} placement={placement} target={this}>
+          <LanguageDropdownMenu
+            value={value}
+            frequentlyUsedLanguages={frequentlyUsedLanguages}
+            onClose={this.handleClose}
+            onChange={this.handleChange}
+            placement={placement}
+            intl={intl}
+          />
+        </Overlay>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/compose/components/options.js b/app/javascript/flavours/glitch/features/compose/components/options.js
index 3a31e214d..f005dbdd1 100644
--- a/app/javascript/flavours/glitch/features/compose/components/options.js
+++ b/app/javascript/flavours/glitch/features/compose/components/options.js
@@ -12,6 +12,7 @@ import IconButton from 'flavours/glitch/components/icon_button';
 import TextIconButton from './text_icon_button';
 import Dropdown from './dropdown';
 import PrivacyDropdown from './privacy_dropdown';
+import LanguageDropdown from '../containers/language_dropdown_container';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 
 //  Utils.
@@ -306,6 +307,7 @@ class ComposerOptions extends ImmutablePureComponent {
             title={formatMessage(messages.spoiler)}
           />
         )}
+        <LanguageDropdown />
         <Dropdown
           active={advancedOptions && advancedOptions.some(value => !!value)}
           disabled={disabled || isEditing}
diff --git a/app/javascript/flavours/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.js
index d92a6bf6b..e82ee2ca2 100644
--- a/app/javascript/flavours/glitch/features/compose/components/search_results.js
+++ b/app/javascript/flavours/glitch/features/compose/components/search_results.js
@@ -48,6 +48,9 @@ class SearchResults extends ImmutablePureComponent {
   render () {
     const { intl, results, suggestions, dismissSuggestion, searchTerm } = this.props;
 
+    let accounts, statuses, hashtags;
+    let count = 0;
+
     if (searchTerm === '' && !suggestions.isEmpty()) {
       return (
         <div className='drawer--results'>
@@ -81,9 +84,6 @@ class SearchResults extends ImmutablePureComponent {
       );
     }
 
-    let accounts, statuses, hashtags;
-    let count = 0;
-
     if (results.get('accounts') && results.get('accounts').size > 0) {
       count   += results.get('accounts').size;
       accounts = (
diff --git a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js
index 7f2005060..a35bd4ff5 100644
--- a/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js
+++ b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js
@@ -17,11 +17,6 @@ export default class TextIconButton extends React.PureComponent {
     ariaControls: PropTypes.string,
   };
 
-  handleClick = (e) => {
-    e.preventDefault();
-    this.props.onClick();
-  }
-
   render () {
     const { label, title, active, ariaControls } = this.props;
 
@@ -31,7 +26,7 @@ export default class TextIconButton extends React.PureComponent {
         aria-label={title}
         className={`text-icon-button ${active ? 'active' : ''}`}
         aria-expanded={active}
-        onClick={this.handleClick}
+        onClick={this.props.onClick}
         aria-controls={ariaControls}
         style={iconStyle}
       >
diff --git a/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js
new file mode 100644
index 000000000..828d08cf5
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/compose/containers/language_dropdown_container.js
@@ -0,0 +1,34 @@
+import { connect } from 'react-redux';
+import LanguageDropdown from '../components/language_dropdown';
+import { changeComposeLanguage } from 'flavours/glitch/actions/compose';
+import { useLanguage } from 'flavours/glitch/actions/languages';
+import { createSelector } from 'reselect';
+import { Map as ImmutableMap } from 'immutable';
+
+const getFrequentlyUsedLanguages = createSelector([
+  state => state.getIn(['settings', 'frequentlyUsedLanguages'], ImmutableMap()),
+], languageCounters => (
+  languageCounters.keySeq()
+    .sort((a, b) => languageCounters.get(a) - languageCounters.get(b))
+    .reverse()
+    .toArray()
+));
+
+const mapStateToProps = state => ({
+  frequentlyUsedLanguages: getFrequentlyUsedLanguages(state),
+  value: state.getIn(['compose', 'language']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+  onChange (value) {
+    dispatch(changeComposeLanguage(value));
+  },
+
+  onClose (value) {
+    dispatch(useLanguage(value));
+  },
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(LanguageDropdown);
diff --git a/app/javascript/flavours/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js
index 978436dcc..27a63b3fd 100644
--- a/app/javascript/flavours/glitch/features/followers/index.js
+++ b/app/javascript/flavours/glitch/features/followers/index.js
@@ -19,6 +19,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import ScrollableList from 'flavours/glitch/components/scrollable_list';
 import TimelineHint from 'flavours/glitch/components/timeline_hint';
+import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
+import { getAccountHidden } from 'flavours/glitch/selectors';
 
 const mapStateToProps = (state, { params: { acct, id } }) => {
   const accountId = id || state.getIn(['accounts_map', acct]);
@@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
     accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']),
     hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']),
     isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true),
+    suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
   };
 };
 
@@ -62,6 +66,8 @@ class Followers extends ImmutablePureComponent {
     hasMore: PropTypes.bool,
     isLoading: PropTypes.bool,
     isAccount: PropTypes.bool,
+    suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -107,7 +113,7 @@ class Followers extends ImmutablePureComponent {
   }
 
   render () {
-    const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
+    const { accountId, accountIds, hasMore, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -127,7 +133,13 @@ class Followers extends ImmutablePureComponent {
 
     let emptyMessage;
 
-    if (remote && accountIds.isEmpty()) {
+    const forceEmptyState = suspended || hidden;
+
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
+    } else if (remote && accountIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
     } else {
       emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
@@ -141,7 +153,7 @@ class Followers extends ImmutablePureComponent {
 
         <ScrollableList
           scrollKey='followers'
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           isLoading={isLoading}
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
diff --git a/app/javascript/flavours/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js
index 446a19894..aa187bf95 100644
--- a/app/javascript/flavours/glitch/features/following/index.js
+++ b/app/javascript/flavours/glitch/features/following/index.js
@@ -19,6 +19,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import ScrollableList from 'flavours/glitch/components/scrollable_list';
 import TimelineHint from 'flavours/glitch/components/timeline_hint';
+import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
+import { getAccountHidden } from 'flavours/glitch/selectors';
 
 const mapStateToProps = (state, { params: { acct, id } }) => {
   const accountId = id || state.getIn(['accounts_map', acct]);
@@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
     accountIds: state.getIn(['user_lists', 'following', accountId, 'items']),
     hasMore: !!state.getIn(['user_lists', 'following', accountId, 'next']),
     isLoading: state.getIn(['user_lists', 'following', accountId, 'isLoading'], true),
+    suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
   };
 };
 
@@ -62,6 +66,8 @@ class Following extends ImmutablePureComponent {
     hasMore: PropTypes.bool,
     isLoading: PropTypes.bool,
     isAccount: PropTypes.bool,
+    suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -107,7 +113,7 @@ class Following extends ImmutablePureComponent {
   }
 
   render () {
-    const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
+    const { accountId, accountIds, hasMore, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -127,7 +133,13 @@ class Following extends ImmutablePureComponent {
 
     let emptyMessage;
 
-    if (remote && accountIds.isEmpty()) {
+    const forceEmptyState = suspended || hidden;
+
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
+    } else if (remote && accountIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
     } else {
       emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
@@ -141,7 +153,7 @@ class Following extends ImmutablePureComponent {
 
         <ScrollableList
           scrollKey='following'
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           isLoading={isLoading}
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
diff --git a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
index 2f6d2de5c..f7097e2ec 100644
--- a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
+++ b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
@@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
 import IconButton from 'flavours/glitch/components/icon_button';
 import Icon from 'flavours/glitch/components/icon';
 import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
-import { autoPlayGif, reduceMotion } from 'flavours/glitch/util/initial_state';
+import { autoPlayGif, reduceMotion, disableSwiping } from 'flavours/glitch/util/initial_state';
 import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
 import { mascot } from 'flavours/glitch/util/initial_state';
 import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light';
@@ -430,6 +430,7 @@ class Announcements extends ImmutablePureComponent {
                 removeReaction={this.props.removeReaction}
                 intl={intl}
                 selected={index === idx}
+                disabled={disableSwiping}
               />
             ))}
           </ReactSwipeableViews>
diff --git a/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js
new file mode 100644
index 000000000..362bd97c0
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/local_settings/page/deprecated_item/index.js
@@ -0,0 +1,83 @@
+//  Package imports
+import React from 'react';
+import PropTypes from 'prop-types';
+
+//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+export default class LocalSettingsPageItem extends React.PureComponent {
+
+  static propTypes = {
+    children: PropTypes.node.isRequired,
+    id: PropTypes.string.isRequired,
+    options: PropTypes.arrayOf(PropTypes.shape({
+      value: PropTypes.string.isRequired,
+      message: PropTypes.string.isRequired,
+      hint: PropTypes.string,
+    })),
+    value: PropTypes.any,
+    placeholder: PropTypes.string,
+  };
+
+  render () {
+    const { id, options, children, placeholder, value } = this.props;
+
+    if (options && options.length > 0) {
+      const currentValue = value;
+      const optionElems = options && options.length > 0 && options.map((opt) => {
+        let optionId = `${id}--${opt.value}`;
+        return (
+          <label htmlFor={optionId}>
+            <input
+              type='radio'
+              name={id}
+              id={optionId}
+              value={opt.value}
+              checked={currentValue === opt.value}
+              disabled
+            />
+            {opt.message}
+            {opt.hint && <span className='hint'>{opt.hint}</span>}
+          </label>
+        );
+      });
+      return (
+        <div className='glitch local-settings__page__item radio_buttons'>
+          <fieldset>
+            <legend>{children}</legend>
+            {optionElems}
+          </fieldset>
+        </div>
+      );
+    } else if (placeholder) {
+      return (
+        <div className='glitch local-settings__page__item string'>
+          <label htmlFor={id}>
+            <p>{children}</p>
+            <p>
+              <input
+                id={id}
+                type='text'
+                value={value}
+                placeholder={placeholder}
+                disabled
+              />
+            </p>
+          </label>
+        </div>
+      );
+    } else return (
+      <div className='glitch local-settings__page__item boolean'>
+        <label htmlFor={id}>
+          <input
+            id={id}
+            type='checkbox'
+            checked={value}
+            disabled
+          />
+          {children}
+        </label>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js
index 45d10d154..4b86a8f6f 100644
--- a/app/javascript/flavours/glitch/features/local_settings/page/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js
@@ -5,7 +5,10 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
 
 //  Our imports
+import { expandSpoilers, disableSwiping } from 'flavours/glitch/util/initial_state';
+import { preferenceLink } from 'flavours/glitch/util/backend_links';
 import LocalSettingsPageItem from './item';
+import DeprecatedLocalSettingsPageItem from './deprecated_item';
 
 //  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
@@ -146,14 +149,28 @@ class LocalSettingsPage extends React.PureComponent {
           >
             <FormattedMessage id='settings.navbar_under' defaultMessage='Navbar at the bottom (Mobile only)' />
           </LocalSettingsPageItem>
-          <LocalSettingsPageItem
-            settings={settings}
-            item={['swipe_to_change_columns']}
+          <DeprecatedLocalSettingsPageItem
             id='mastodon-settings--swipe_to_change_columns'
-            onChange={onChange}
+            value={!disableSwiping}
           >
             <FormattedMessage id='settings.swipe_to_change_columns' defaultMessage='Allow swiping to change columns (Mobile only)' />
-          </LocalSettingsPageItem>
+            <span className='hint'>
+              <FormattedMessage
+                id='settings.deprecated_setting'
+                defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}"
+                values={{
+                  settings_page_link: (
+                    <a href={preferenceLink('user_setting_disable_swiping')}>
+                      <FormattedMessage
+                        id='settings.shared_settings_link'
+                        defaultMessage='user preferences'
+                      />
+                    </a>
+                  )
+                }}
+              />
+            </span>
+          </DeprecatedLocalSettingsPageItem>
         </section>
       </div>
     ),
@@ -242,21 +259,35 @@ class LocalSettingsPage extends React.PureComponent {
     ({ intl, onChange, settings }) => (
       <div className='glitch local-settings__page content_warnings'>
         <h1><FormattedMessage id='settings.content_warnings' defaultMessage='Content warnings' /></h1>
-        <LocalSettingsPageItem
-          settings={settings}
-          item={['content_warnings', 'auto_unfold']}
+        <DeprecatedLocalSettingsPageItem
           id='mastodon-settings--content_warnings-auto_unfold'
-          onChange={onChange}
+          value={expandSpoilers}
         >
           <FormattedMessage id='settings.enable_content_warnings_auto_unfold' defaultMessage='Automatically unfold content-warnings' />
-        </LocalSettingsPageItem>
+          <span className='hint'>
+            <FormattedMessage
+              id='settings.deprecated_setting'
+              defaultMessage="This setting is now controlled from Mastodon's {settings_page_link}"
+              values={{
+                settings_page_link: (
+                  <a href={preferenceLink('user_setting_expand_spoilers')}>
+                    <FormattedMessage
+                      id='settings.shared_settings_link'
+                      defaultMessage='user preferences'
+                    />
+                  </a>
+                )
+              }}
+            />
+          </span>
+        </DeprecatedLocalSettingsPageItem>
         <LocalSettingsPageItem
           settings={settings}
           item={['content_warnings', 'filter']}
           id='mastodon-settings--content_warnings-auto_unfold'
           onChange={onChange}
-          dependsOn={[['content_warnings', 'auto_unfold']]}
           placeholder={intl.formatMessage(messages.regexp)}
+          disabled={!expandSpoilers}
         >
           <FormattedMessage id='settings.content_warnings_filter' defaultMessage='Content warnings to not automatically unfold:' />
         </LocalSettingsPageItem>
diff --git a/app/javascript/flavours/glitch/features/local_settings/page/item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js
index 5a68523f6..6b24e4143 100644
--- a/app/javascript/flavours/glitch/features/local_settings/page/item/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js
@@ -21,6 +21,7 @@ export default class LocalSettingsPageItem extends React.PureComponent {
     })),
     settings: ImmutablePropTypes.map.isRequired,
     placeholder: PropTypes.string,
+    disabled: PropTypes.bool,
   };
 
   handleChange = e => {
@@ -33,8 +34,8 @@ export default class LocalSettingsPageItem extends React.PureComponent {
 
   render () {
     const { handleChange } = this;
-    const { settings, item, id, options, children, dependsOn, dependsOnNot, placeholder } = this.props;
-    let enabled = true;
+    const { settings, item, id, options, children, dependsOn, dependsOnNot, placeholder, disabled } = this.props;
+    let enabled = !disabled;
 
     if (dependsOn) {
       for (let i = 0; i < dependsOn.length; i++) {
diff --git a/app/javascript/flavours/glitch/features/mutes/index.js b/app/javascript/flavours/glitch/features/mutes/index.js
index 9f0d5a43e..764cbef1a 100644
--- a/app/javascript/flavours/glitch/features/mutes/index.js
+++ b/app/javascript/flavours/glitch/features/mutes/index.js
@@ -69,7 +69,7 @@ class Mutes extends ImmutablePureComponent {
           bindToDocument={!multiColumn}
         >
           {accountIds.map(id =>
-            <AccountContainer key={id} id={id} />,
+            <AccountContainer key={id} id={id} defaultAction='mute' />,
           )}
         </ScrollableList>
       </Column>
diff --git a/app/javascript/flavours/glitch/features/report/thanks.js b/app/javascript/flavours/glitch/features/report/thanks.js
index 9c41baa7f..454979f9f 100644
--- a/app/javascript/flavours/glitch/features/report/thanks.js
+++ b/app/javascript/flavours/glitch/features/report/thanks.js
@@ -8,7 +8,7 @@ import {
   unfollowAccount,
   muteAccount,
   blockAccount,
-} from 'mastodon/actions/accounts';
+} from 'flavours/glitch/actions/accounts';
 
 const mapStateToProps = () => ({});
 
diff --git a/app/javascript/flavours/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
index e39a31e5d..bfb1ae405 100644
--- a/app/javascript/flavours/glitch/features/ui/components/columns_area.js
+++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
@@ -8,6 +8,8 @@ import ReactSwipeableViews from 'react-swipeable-views';
 import TabsBar, { links, getIndex, getLink } from './tabs_bar';
 import { Link } from 'react-router-dom';
 
+import { disableSwiping } from 'flavours/glitch/util/initial_state';
+
 import BundleContainer from '../containers/bundle_container';
 import ColumnLoading from './column_loading';
 import DrawerLoading from './drawer_loading';
@@ -63,7 +65,6 @@ class ColumnsArea extends ImmutablePureComponent {
   static propTypes = {
     intl: PropTypes.object.isRequired,
     columns: ImmutablePropTypes.list.isRequired,
-    swipeToChangeColumns: PropTypes.bool,
     singleColumn: PropTypes.bool,
     children: PropTypes.node,
     navbarUnder: PropTypes.bool,
@@ -210,7 +211,7 @@ class ColumnsArea extends ImmutablePureComponent {
   }
 
   render () {
-    const { columns, children, singleColumn, swipeToChangeColumns, intl, navbarUnder, openSettings } = this.props;
+    const { columns, children, singleColumn, intl, navbarUnder, openSettings } = this.props;
     const { shouldAnimate, renderComposePanel } = this.state;
 
     const columnIndex = getIndex(this.context.router.history.location.pathname);
@@ -219,7 +220,7 @@ class ColumnsArea extends ImmutablePureComponent {
       const floatingActionButton = shouldHideFAB(this.context.router.history.location.pathname) ? null : <Link key='floating-action-button' to='/publish' className='floating-action-button' aria-label={intl.formatMessage(messages.publish)}><Icon id='pencil' /></Link>;
 
       const content = columnIndex !== -1 ? (
-        <ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={!swipeToChangeColumns}>
+        <ReactSwipeableViews key='content' hysteresis={0.2} threshold={15} index={columnIndex} onChangeIndex={this.handleSwipe} onTransitionEnd={this.handleAnimationEnd} animateTransitions={shouldAnimate} springConfig={{ duration: '400ms', delay: '0s', easeFunction: 'ease' }} style={{ height: '100%' }} disabled={disableSwiping}>
           {links.map(this.renderView)}
         </ReactSwipeableViews>
       ) : (
@@ -234,7 +235,7 @@ class ColumnsArea extends ImmutablePureComponent {
             </div>
           </div>
 
-          <div className='columns-area__panels__main'>
+          <div className={`columns-area__panels__main ${floatingActionButton && 'with-fab'}`}>
             {!navbarUnder && <TabsBar key='tabs' />}
             {content}
             {navbarUnder && <TabsBar key='tabs' />}
diff --git a/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js b/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js
new file mode 100644
index 000000000..9cb5a30b9
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.js
@@ -0,0 +1,86 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { preferenceLink } from 'flavours/glitch/util/backend_links';
+import Button from 'flavours/glitch/components/button';
+import Icon from 'flavours/glitch/components/icon';
+import illustration from 'flavours/glitch/images/logo_warn_glitch.svg';
+
+const messages = defineMessages({
+  discardChanges: { id: 'confirmations.deprecated_settings.confirm', defaultMessage: 'Use Mastodon preferences' },
+  user_setting_expand_spoilers: { id: 'settings.enable_content_warnings_auto_unfold', defaultMessage: 'Automatically unfold content-warnings' },
+  user_setting_disable_swiping: { id: 'settings.swipe_to_change_columns', defaultMessage: 'Allow swiping to change columns (Mobile only)' },
+});
+
+export default @injectIntl
+class DeprecatedSettingsModal extends React.PureComponent {
+
+  static propTypes = {
+    settings: ImmutablePropTypes.list.isRequired,
+    onClose: PropTypes.func.isRequired,
+    onConfirm: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+  };
+
+  componentDidMount() {
+    this.button.focus();
+  }
+
+  handleClick = () => {
+    this.props.onConfirm();
+    this.props.onClose();
+  }
+
+  setRef = (c) => {
+    this.button = c;
+  }
+
+  render () {
+    const { settings, intl } = this.props;
+
+    return (
+      <div className='modal-root__modal confirmation-modal'>
+        <div className='confirmation-modal__container'>
+
+          <img src={illustration} className='modal-warning' alt='' />
+
+          <FormattedMessage
+            id='confirmations.deprecated_settings.message'
+            defaultMessage='Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:'
+            values={{
+              app_settings: (
+                <strong className='deprecated-settings-label'>
+                  <Icon id='cogs' /> <FormattedMessage id='navigation_bar.app_settings' defaultMessage='App settings' />
+                </strong>
+              ),
+              preferences: (
+                <strong className='deprecated-settings-label'>
+                  <Icon id='cog' /> <FormattedMessage id='navigation_bar.preferences' defaultMessage='Preferences' />
+                </strong>
+              ),
+            }}
+          />
+
+          <div className='deprecated-settings-info'>
+            <ul>
+              { settings.map((setting_name) => (
+                <li>
+                  <a href={preferenceLink(setting_name)}><FormattedMessage {...messages[setting_name]} /></a>
+                </li>
+              )) }
+            </ul>
+          </div>
+        </div>
+
+        <div>
+          <div className='confirmation-modal__action-bar'>
+            <div />
+            <Button text={intl.formatMessage(messages.discardChanges)} onClick={this.handleClick} ref={this.setRef} />
+          </div>
+        </div>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
index 6974aab26..baa5ff275 100644
--- a/app/javascript/flavours/glitch/features/ui/components/media_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
@@ -12,6 +12,7 @@ import Icon from 'flavours/glitch/components/icon';
 import GIFV from 'flavours/glitch/components/gifv';
 import Footer from 'flavours/glitch/features/picture_in_picture/components/footer';
 import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
+import { disableSwiping } from 'flavours/glitch/util/initial_state';
 
 const messages = defineMessages({
   close: { id: 'lightbox.close', defaultMessage: 'Close' },
@@ -227,6 +228,7 @@ class MediaModal extends ImmutablePureComponent {
             onChangeIndex={this.handleSwipe}
             onTransitionEnd={this.handleTransitionEnd}
             index={index}
+            disabled={disableSwiping}
           >
             {content}
           </ReactSwipeableViews>
diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
index a975c4013..8f18d93b7 100644
--- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
@@ -14,6 +14,7 @@ import AudioModal from './audio_modal';
 import DoodleModal from './doodle_modal';
 import ConfirmationModal from './confirmation_modal';
 import FocalPointModal from './focal_point_modal';
+import DeprecatedSettingsModal from './deprecated_settings_modal';
 import {
   OnboardingModal,
   MuteModal,
@@ -40,6 +41,7 @@ const MODAL_COMPONENTS = {
   'BLOCK': BlockModal,
   'REPORT': ReportModal,
   'SETTINGS': SettingsModal,
+  'DEPRECATED_SETTINGS': () => Promise.resolve({ default: DeprecatedSettingsModal }),
   'ACTIONS': () => Promise.resolve({ default: ActionsModal }),
   'EMBED': EmbedModal,
   'LIST_EDITOR': ListEditor,
diff --git a/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
index b69842cd6..1107be740 100644
--- a/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js
@@ -4,7 +4,6 @@ import { openModal } from 'flavours/glitch/actions/modal';
 
 const mapStateToProps = state => ({
   columns: state.getIn(['settings', 'columns']),
-  swipeToChangeColumns: state.getIn(['local_settings', 'swipe_to_change_columns']),
 });
 
 const mapDispatchToProps = dispatch => ({
diff --git a/app/javascript/flavours/glitch/images/logo_warn_glitch.svg b/app/javascript/flavours/glitch/images/logo_warn_glitch.svg
new file mode 100644
index 000000000..32c5854ee
--- /dev/null
+++ b/app/javascript/flavours/glitch/images/logo_warn_glitch.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   viewBox="0 0 216.41507 232.00976"
+   version="1.1"
+   id="svg6"
+   sodipodi:docname="logo_warn_glitch.svg"
+   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     id="namedview8"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     showgrid="false"
+     inkscape:zoom="1.7951831"
+     inkscape:cx="-30.916067"
+     inkscape:cy="90.241493"
+     inkscape:window-width="1920"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg6" />
+  <g
+     id="g2025">
+    <path
+       d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915"
+       fill="#3088d4"
+       id="path2" />
+    <path
+       d="m 124.52893,137.75645 c 0,9.01375 -7.30875,16.32125 -16.3225,16.32125 -9.01375,0 -16.32125,-7.3075 -16.32125,-16.32125 0,-9.01375 7.3075,-16.3225 16.32125,-16.3225 9.01375,0 16.3225,7.30875 16.3225,16.3225"
+       fill="#ffffff"
+       id="path4"
+       sodipodi:nodetypes="csssc" />
+    <path
+       id="path1121"
+       d="m 108.20703,25.453125 c -9.013749,0 -16.322264,7.308516 -16.322264,16.322266 0,5.31808 2.555126,37.386806 6.492187,67.763669 4.100497,4.20028 15.890147,3.77063 19.660157,-0.01 3.9367,-30.375272 6.49219,-62.4364 6.49219,-67.753909 0,-9.01375 -7.30852,-16.322266 -16.32227,-16.322266 z"
+       style="fill:#ffffff"
+       sodipodi:nodetypes="ssccsss" />
+  </g>
+</svg>
diff --git a/app/javascript/flavours/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js
index 530ed8e60..e02a5592e 100644
--- a/app/javascript/flavours/glitch/reducers/accounts.js
+++ b/app/javascript/flavours/glitch/reducers/accounts.js
@@ -1,4 +1,5 @@
-import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
+import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'flavours/glitch/actions/importer';
+import { ACCOUNT_REVEAL } from 'flavours/glitch/actions/accounts';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
 const initialState = ImmutableMap();
@@ -10,6 +11,8 @@ const normalizeAccount = (state, account) => {
   delete account.following_count;
   delete account.statuses_count;
 
+  account.hidden = state.getIn([account.id, 'hidden']) === false ? false : account.limited;
+
   return state.set(account.id, fromJS(account));
 };
 
@@ -27,6 +30,8 @@ export default function accounts(state = initialState, action) {
     return normalizeAccount(state, action.account);
   case ACCOUNTS_IMPORT:
     return normalizeAccounts(state, action.accounts);
+  case ACCOUNT_REVEAL:
+    return state.setIn([action.id, 'hidden'], false);
   default:
     return state;
   }
diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index f97c799e7..d0aeaa1f0 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -30,6 +30,7 @@ import {
   COMPOSE_SPOILERNESS_CHANGE,
   COMPOSE_SPOILER_TEXT_CHANGE,
   COMPOSE_VISIBILITY_CHANGE,
+  COMPOSE_LANGUAGE_CHANGE,
   COMPOSE_CONTENT_TYPE_CHANGE,
   COMPOSE_EMOJI_INSERT,
   COMPOSE_UPLOAD_CHANGE_REQUEST,
@@ -100,6 +101,7 @@ const initialState = ImmutableMap({
   }),
   default_privacy: 'public',
   default_sensitive: false,
+  default_language: 'en',
   resetFileKey: Math.floor((Math.random() * 0x10000)),
   idempotencyKey: null,
   tagHistory: ImmutableList(),
@@ -175,7 +177,8 @@ function clearAll(state) {
       map => map.mergeWith(overwrite, state.get('default_advanced_options'))
     );
     map.set('privacy', state.get('default_privacy'));
-    map.set('sensitive', false);
+    map.set('sensitive', state.get('default_sensitive'));
+    map.set('language', state.get('default_language'));
     map.update('media_attachments', list => list.clear());
     map.set('poll', null);
     map.set('idempotencyKey', uuid());
@@ -557,6 +560,7 @@ export default function compose(state = initialState, action) {
       map.set('caretPosition', null);
       map.set('idempotencyKey', uuid());
       map.set('sensitive', action.status.get('sensitive'));
+      map.set('language', action.status.get('language'));
       map.update(
         'advanced_options',
         map => map.merge(new ImmutableMap({ do_not_federate }))
@@ -589,6 +593,7 @@ export default function compose(state = initialState, action) {
       map.set('caretPosition', null);
       map.set('idempotencyKey', uuid());
       map.set('sensitive', action.status.get('sensitive'));
+      map.set('language', action.status.get('language'));
 
       if (action.spoiler_text.length > 0) {
         map.set('spoiler', true);
@@ -618,6 +623,8 @@ export default function compose(state = initialState, action) {
     return state.updateIn(['poll', 'options'], options => options.delete(action.index));
   case COMPOSE_POLL_SETTINGS_CHANGE:
     return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple));
+  case COMPOSE_LANGUAGE_CHANGE:
+    return state.set('language', action.language);
   default:
     return state;
   }
diff --git a/app/javascript/flavours/glitch/reducers/identity_proofs.js b/app/javascript/flavours/glitch/reducers/identity_proofs.js
deleted file mode 100644
index 58af0a5fa..000000000
--- a/app/javascript/flavours/glitch/reducers/identity_proofs.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Map as ImmutableMap, fromJS } from 'immutable';
-import {
-  IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
-  IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS,
-  IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
-} from '../actions/identity_proofs';
-
-const initialState = ImmutableMap();
-
-export default function identityProofsReducer(state = initialState, action) {
-  switch(action.type) {
-  case IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST:
-    return state.set('isLoading', true);
-  case IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL:
-    return state.set('isLoading', false);
-  case IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS:
-    return state.update(identity_proofs => identity_proofs.withMutations(map => {
-      map.set('isLoading', false);
-      map.set('loaded', true);
-      map.set(action.accountId, fromJS(action.identity_proofs));
-    }));
-  default:
-    return state;
-  }
-};
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index 92348c0c5..b8aad9fad 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -34,7 +34,6 @@ import conversations from './conversations';
 import suggestions from './suggestions';
 import pinnedAccountsEditor from './pinned_accounts_editor';
 import polls from './polls';
-import identity_proofs from './identity_proofs';
 import trends from './trends';
 import announcements from './announcements';
 import markers from './markers';
@@ -73,7 +72,6 @@ const reducers = {
   notifications,
   height_cache,
   custom_emojis,
-  identity_proofs,
   lists,
   listEditor,
   listAdder,
diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js
index c115cad6b..a16c337fc 100644
--- a/app/javascript/flavours/glitch/reducers/local_settings.js
+++ b/app/javascript/flavours/glitch/reducers/local_settings.js
@@ -3,13 +3,12 @@ import { Map as ImmutableMap } from 'immutable';
 
 //  Our imports.
 import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
-import { LOCAL_SETTING_CHANGE } from 'flavours/glitch/actions/local_settings';
+import { LOCAL_SETTING_CHANGE, LOCAL_SETTING_DELETE } from 'flavours/glitch/actions/local_settings';
 
 const initialState = ImmutableMap({
   layout    : 'auto',
   stretch   : true,
   navbar_under : false,
-  swipe_to_change_columns: true,
   side_arm  : 'none',
   side_arm_reply_mode : 'keep',
   show_reply_count : false,
@@ -26,7 +25,6 @@ const initialState = ImmutableMap({
   tag_misleading_links: true,
   rewrite_mentions: 'no',
   content_warnings : ImmutableMap({
-    auto_unfold : false,
     filter      : null,
   }),
   collapsed : ImmutableMap({
@@ -66,6 +64,8 @@ export default function localSettings(state = initialState, action) {
     return hydrate(state, action.state.get('local_settings'));
   case LOCAL_SETTING_CHANGE:
     return state.setIn(action.key, action.value);
+  case LOCAL_SETTING_DELETE:
+    return state.deleteIn(action.key);
   default:
     return state;
   }
diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js
index 676a1ccc1..0c28b2959 100644
--- a/app/javascript/flavours/glitch/reducers/settings.js
+++ b/app/javascript/flavours/glitch/reducers/settings.js
@@ -3,6 +3,7 @@ import { NOTIFICATIONS_FILTER_SET } from 'flavours/glitch/actions/notifications'
 import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from 'flavours/glitch/actions/columns';
 import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
 import { EMOJI_USE } from 'flavours/glitch/actions/emojis';
+import { LANGUAGE_USE } from 'flavours/glitch/actions/languages';
 import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 import uuid from 'flavours/glitch/util/uuid';
@@ -134,6 +135,8 @@ const changeColumnParams = (state, uuid, path, value) => {
 
 const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false);
 
+const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false);
+
 const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
 
 export default function settings(state = initialState, action) {
@@ -159,6 +162,8 @@ export default function settings(state = initialState, action) {
     return changeColumnParams(state, action.uuid, action.path, action.value);
   case EMOJI_USE:
     return updateFrequentEmojis(state, action.emoji);
+  case LANGUAGE_USE:
+    return updateFrequentLanguages(state, action.language);
   case SETTING_SAVE:
     return state.set('saved', true);
   case LIST_FETCH_FAIL:
diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js
index bb9180d12..99afe5355 100644
--- a/app/javascript/flavours/glitch/selectors/index.js
+++ b/app/javascript/flavours/glitch/selectors/index.js
@@ -194,3 +194,11 @@ export const getAccountGallery = createSelector([
 
   return medias;
 });
+
+export const getAccountHidden = createSelector([
+  (state, id) => state.getIn(['accounts', id, 'hidden']),
+  (state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']),
+  (state, id) => id === me,
+], (hidden, followingOrRequested, isSelf) => {
+  return hidden && !(isSelf || followingOrRequested);
+});
diff --git a/app/javascript/flavours/glitch/styles/accessibility.scss b/app/javascript/flavours/glitch/styles/accessibility.scss
index cb27497a4..96e20f839 100644
--- a/app/javascript/flavours/glitch/styles/accessibility.scss
+++ b/app/javascript/flavours/glitch/styles/accessibility.scss
@@ -12,6 +12,21 @@ $emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
   }
 }
 
+// Display a checkmark on active UI elements otherwise differing only by color
+.status__action-bar-button,
+.detailed-status__button .icon-button {
+  position: relative;
+
+  &.active::after {
+    position: absolute;
+    content: "\F00C";
+    font-size: 50%;
+    font-family: FontAwesome;
+    right: -5px;
+    top: -4px;
+  }
+}
+
 .hicolor-privacy-icons {
   .status__visibility-icon.fa-globe,
   .composer--options--dropdown--content--item .fa-globe {
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index 96e292d8b..d52ecf02c 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -560,6 +560,15 @@
   }
 }
 
+.limited-account-hint {
+  p {
+    color: $secondary-text-color;
+    font-size: 15px;
+    font-weight: 500;
+    margin-bottom: 20px;
+  }
+}
+
 .empty-column-indicator,
 .error-column,
 .follow_requests-unlocked_explanation {
diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index 3137b2dea..6d45c110c 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -644,3 +644,68 @@
     & > .count { color: $warning-red }
   }
 }
+
+.language-dropdown {
+  &__dropdown {
+    position: absolute;
+    background: $simple-background-color;
+    box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
+    border-radius: 4px;
+    overflow: hidden;
+    z-index: 2;
+
+    &.top {
+      transform-origin: 50% 100%;
+    }
+
+    &.bottom {
+      transform-origin: 50% 0;
+    }
+
+    .emoji-mart-search {
+      padding-right: 10px;
+    }
+
+    .emoji-mart-search-icon {
+      right: 10px + 5px;
+    }
+
+    .emoji-mart-scroll {
+      padding: 0 10px 10px;
+    }
+
+    &__results {
+      &__item {
+        cursor: pointer;
+        color: $inverted-text-color;
+        font-weight: 500;
+        padding: 10px;
+        border-radius: 4px;
+
+        &:focus,
+        &:active,
+        &:hover {
+          background: $ui-secondary-color;
+        }
+
+        &__common-name {
+          color: $darker-text-color;
+        }
+
+        &.active {
+          background: $ui-highlight-color;
+          color: $primary-text-color;
+          outline: 0;
+
+          .language-dropdown__dropdown__results__item__common-name {
+            color: $secondary-text-color;
+          }
+
+          &:hover {
+            background: lighten($ui-highlight-color, 4%);
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/local_settings.scss b/app/javascript/flavours/glitch/styles/components/local_settings.scss
index 0b7a74575..db2b9f154 100644
--- a/app/javascript/flavours/glitch/styles/components/local_settings.scss
+++ b/app/javascript/flavours/glitch/styles/components/local_settings.scss
@@ -98,6 +98,18 @@
 
 .glitch.local-settings__page__item {
   margin-bottom: 2px;
+
+  .hint a {
+    color: $lighter-text-color;
+    font-weight: 500;
+    text-decoration: underline;
+
+    &:active,
+    &:focus,
+    &:hover {
+      text-decoration: none;
+    }
+  }
 }
 
 .glitch.local-settings__page__item.string,
@@ -120,3 +132,29 @@
     }
   }
 }
+
+.deprecated-settings-label {
+  white-space: nowrap;
+}
+
+.deprecated-settings-info {
+  text-align: start;
+
+  ul {
+    padding: 10px;
+    margin-left: 12px;
+    list-style: disc inside;
+  }
+
+  a {
+    color: $lighter-text-color;
+    font-weight: 500;
+    text-decoration: underline;
+
+    &:active,
+    &:focus,
+    &:hover {
+      text-decoration: none;
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 61c292b19..90e0da02a 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -1279,3 +1279,10 @@
   pointer-events: auto;
   z-index: 9999;
 }
+
+img.modal-warning {
+  display: block;
+  margin: auto;
+  margin-bottom: 15px;
+  width: 60px;
+}
diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss
index db510f1f4..ba43e7f29 100644
--- a/app/javascript/flavours/glitch/styles/components/single_column.scss
+++ b/app/javascript/flavours/glitch/styles/components/single_column.scss
@@ -233,6 +233,10 @@
   .columns-area__panels__pane--compositional {
     display: none;
   }
+
+  .with-fab .scrollable .item-list:last-child {
+    padding-bottom: 5.25rem;
+  }
 }
 
 @media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index ea416a79f..e4105cba5 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -1016,68 +1016,6 @@ code {
   }
 }
 
-.connection-prompt {
-  margin-bottom: 25px;
-
-  .fa-link {
-    background-color: darken($ui-base-color, 4%);
-    border-radius: 100%;
-    font-size: 24px;
-    padding: 10px;
-  }
-
-  &__column {
-    align-items: center;
-    display: flex;
-    flex: 1;
-    flex-direction: column;
-    flex-shrink: 1;
-    max-width: 50%;
-
-    &-sep {
-      align-self: center;
-      flex-grow: 0;
-      overflow: visible;
-      position: relative;
-      z-index: 1;
-    }
-
-    p {
-      word-break: break-word;
-    }
-  }
-
-  .account__avatar {
-    margin-bottom: 20px;
-  }
-
-  &__connection {
-    background-color: lighten($ui-base-color, 8%);
-    box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
-    border-radius: 4px;
-    padding: 25px 10px;
-    position: relative;
-    text-align: center;
-
-    &::after {
-      background-color: darken($ui-base-color, 4%);
-      content: '';
-      display: block;
-      height: 100%;
-      left: 50%;
-      position: absolute;
-      top: 0;
-      width: 1px;
-    }
-  }
-
-  &__row {
-    align-items: flex-start;
-    display: flex;
-    flex-direction: row;
-  }
-}
-
 .input.user_confirm_password,
 .input.user_website {
   &:not(.field_with_errors) {
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
index bb91abdac..d16f23aed 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
@@ -165,6 +165,12 @@
   }
 }
 
+.language-dropdown__dropdown__results__item:hover,
+.language-dropdown__dropdown__results__item:focus,
+.language-dropdown__dropdown__results__item:active {
+  background-color: $ui-base-color;
+}
+
 .dropdown-menu__separator,
 .dropdown-menu__item.edited-timestamp__history__item,
 .dropdown-menu__container__header,
diff --git a/app/javascript/flavours/glitch/util/backend_links.js b/app/javascript/flavours/glitch/util/backend_links.js
index 2e5111a7f..5b2dd8dbf 100644
--- a/app/javascript/flavours/glitch/util/backend_links.js
+++ b/app/javascript/flavours/glitch/util/backend_links.js
@@ -7,3 +7,12 @@ export const statusAdminLink = (account_id, status_id) => `/admin/accounts/${acc
 export const filterEditLink = (id) => `/filters/${id}/edit`;
 export const relationshipsLink = '/relationships';
 export const securityLink = '/auth/edit';
+export const preferenceLink = (setting_name) => {
+  switch (setting_name) {
+  case 'user_setting_expand_spoilers':
+  case 'user_setting_disable_swiping':
+    return `/settings/preferences/appearance#${setting_name}`;
+  default:
+    return preferencesLink;
+  }
+};
diff --git a/app/javascript/flavours/glitch/util/content_warning.js b/app/javascript/flavours/glitch/util/content_warning.js
index 5e874a49c..baeb97881 100644
--- a/app/javascript/flavours/glitch/util/content_warning.js
+++ b/app/javascript/flavours/glitch/util/content_warning.js
@@ -1,5 +1,7 @@
+import { expandSpoilers } from 'flavours/glitch/util/initial_state';
+
 export function autoUnfoldCW (settings, status) {
-  if (!settings.getIn(['content_warnings', 'auto_unfold'])) {
+  if (!expandSpoilers) {
     return false;
   }
 
diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js
index 7154e020b..b6eab0c87 100644
--- a/app/javascript/flavours/glitch/util/initial_state.js
+++ b/app/javascript/flavours/glitch/util/initial_state.js
@@ -13,8 +13,8 @@ const getMeta = (prop) => initialState && initialState.meta && initialState.meta
 
 export const reduceMotion = getMeta('reduce_motion');
 export const autoPlayGif = getMeta('auto_play_gif');
-export const displaySensitiveMedia = getMeta('display_sensitive_media');
 export const displayMedia = getMeta('display_media') || (getMeta('display_sensitive_media') ? 'show_all' : 'default');
+export const expandSpoilers = getMeta('expand_spoilers');
 export const unfollowModal = getMeta('unfollow_modal');
 export const boostModal = getMeta('boost_modal');
 export const favouriteModal = getMeta('favourite_modal');
@@ -37,5 +37,7 @@ export const useBlurhash = getMeta('use_blurhash');
 export const usePendingItems = getMeta('use_pending_items');
 export const useSystemEmojiFont = getMeta('system_emoji_font');
 export const showTrends = getMeta('trends');
+export const disableSwiping = getMeta('disable_swiping');
+export const languages = initialState && initialState.languages;
 
 export default initialState;
diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js
index ce7bb6d5f..eedf61dc9 100644
--- a/app/javascript/mastodon/actions/accounts.js
+++ b/app/javascript/mastodon/actions/accounts.js
@@ -77,6 +77,8 @@ export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
 export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
 export const FOLLOW_REQUEST_REJECT_FAIL    = 'FOLLOW_REQUEST_REJECT_FAIL';
 
+export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL';
+
 export function fetchAccount(id) {
   return (dispatch, getState) => {
     dispatch(fetchRelationships([id]));
@@ -780,3 +782,8 @@ export function unpinAccountFail(error) {
     error,
   };
 };
+
+export const revealAccount = id => ({
+  type: ACCOUNT_REVEAL,
+  id,
+});
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index f3129f8d9..878011fc0 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -45,12 +45,12 @@ export const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE';
 export const COMPOSE_MOUNT   = 'COMPOSE_MOUNT';
 export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
 
-export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
-export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
+export const COMPOSE_SENSITIVITY_CHANGE  = 'COMPOSE_SENSITIVITY_CHANGE';
+export const COMPOSE_SPOILERNESS_CHANGE  = 'COMPOSE_SPOILERNESS_CHANGE';
 export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
-export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
-export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
-export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
+export const COMPOSE_VISIBILITY_CHANGE   = 'COMPOSE_VISIBILITY_CHANGE';
+export const COMPOSE_COMPOSING_CHANGE    = 'COMPOSE_COMPOSING_CHANGE';
+export const COMPOSE_LANGUAGE_CHANGE     = 'COMPOSE_LANGUAGE_CHANGE';
 
 export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
 
@@ -169,6 +169,7 @@ export function submitCompose(routerHistory) {
         spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
         visibility: getState().getIn(['compose', 'privacy']),
         poll: getState().getIn(['compose', 'poll'], null),
+        language: getState().getIn(['compose', 'language']),
       },
       headers: {
         'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -637,6 +638,11 @@ export function changeComposeSensitivity() {
   };
 };
 
+export const changeComposeLanguage = language => ({
+  type: COMPOSE_LANGUAGE_CHANGE,
+  language,
+});
+
 export function changeComposeSpoilerness() {
   return {
     type: COMPOSE_SPOILERNESS_CHANGE,
diff --git a/app/javascript/mastodon/actions/languages.js b/app/javascript/mastodon/actions/languages.js
new file mode 100644
index 000000000..ad186ba0c
--- /dev/null
+++ b/app/javascript/mastodon/actions/languages.js
@@ -0,0 +1,12 @@
+import { saveSettings } from './settings';
+
+export const LANGUAGE_USE = 'LANGUAGE_USE';
+
+export const useLanguage = language => dispatch => {
+  dispatch({
+    type: LANGUAGE_USE,
+    language,
+  });
+
+  dispatch(saveSettings());
+};
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 00e8d74d7..96cf628d6 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -58,7 +58,8 @@ export const loadPending = () => ({
 
 export function updateNotifications(notification, intlMessages, intlLocale) {
   return (dispatch, getState) => {
-    const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true);
+    const activeFilter = getState().getIn(['settings', 'notifications', 'quickFilter', 'active']);
+    const showInColumn = activeFilter === 'all' ? getState().getIn(['settings', 'notifications', 'shows', notification.type], true) : activeFilter === notification.type;
     const showAlert    = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
     const playSound    = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
     const filters      = getFiltersRegex(getState(), { contextType: 'notifications' });
diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js
index 62b5843a9..af9f119c8 100644
--- a/app/javascript/mastodon/components/account.js
+++ b/app/javascript/mastodon/components/account.js
@@ -18,6 +18,8 @@ const messages = defineMessages({
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
   mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' },
   unmute_notifications: { id: 'account.unmute_notifications', defaultMessage: 'Unmute notifications from @{name}' },
+  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
+  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
 });
 
 export default @injectIntl
@@ -33,6 +35,7 @@ class Account extends ImmutablePureComponent {
     hidden: PropTypes.bool,
     actionIcon: PropTypes.string,
     actionTitle: PropTypes.string,
+    defaultAction: PropTypes.string,
     onActionClick: PropTypes.func,
   };
 
@@ -61,7 +64,7 @@ class Account extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, intl, hidden, onActionClick, actionIcon, actionTitle } = this.props;
+    const { account, intl, hidden, onActionClick, actionIcon, actionTitle, defaultAction } = this.props;
 
     if (!account) {
       return <div />;
@@ -105,6 +108,10 @@ class Account extends ImmutablePureComponent {
             {hidingNotificationsButton}
           </Fragment>
         );
+      } else if (defaultAction === 'mute') {
+        buttons = <IconButton icon='volume-off' title={intl.formatMessage(messages.mute, { name: account.get('username') })} onClick={this.handleMute} />;
+      } else if (defaultAction === 'block') {
+        buttons = <IconButton icon='lock' title={intl.formatMessage(messages.block, { name: account.get('username') })} onClick={this.handleBlock} />;
       } else if (!account.get('moved') || following) {
         buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;
       }
diff --git a/app/javascript/mastodon/components/avatar.js b/app/javascript/mastodon/components/avatar.js
index 570505833..12ab7d2df 100644
--- a/app/javascript/mastodon/components/avatar.js
+++ b/app/javascript/mastodon/components/avatar.js
@@ -2,11 +2,12 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { autoPlayGif } from '../initial_state';
+import classNames from 'classnames';
 
 export default class Avatar extends React.PureComponent {
 
   static propTypes = {
-    account: ImmutablePropTypes.map.isRequired,
+    account: ImmutablePropTypes.map,
     size: PropTypes.number.isRequired,
     style: PropTypes.object,
     inline: PropTypes.bool,
@@ -37,15 +38,6 @@ export default class Avatar extends React.PureComponent {
     const { account, size, animate, inline } = this.props;
     const { hovering } = this.state;
 
-    const src = account.get('avatar');
-    const staticSrc = account.get('avatar_static');
-
-    let className = 'account__avatar';
-
-    if (inline) {
-      className = className + ' account__avatar-inline';
-    }
-
     const style = {
       ...this.props.style,
       width: `${size}px`,
@@ -53,15 +45,21 @@ export default class Avatar extends React.PureComponent {
       backgroundSize: `${size}px ${size}px`,
     };
 
-    if (hovering || animate) {
-      style.backgroundImage = `url(${src})`;
-    } else {
-      style.backgroundImage = `url(${staticSrc})`;
+    if (account) {
+      const src = account.get('avatar');
+      const staticSrc = account.get('avatar_static');
+
+      if (hovering || animate) {
+        style.backgroundImage = `url(${src})`;
+      } else {
+        style.backgroundImage = `url(${staticSrc})`;
+      }
     }
 
+
     return (
       <div
-        className={className}
+        className={classNames('account__avatar', { 'account__avatar-inline': inline })}
         onMouseEnter={this.handleMouseEnter}
         onMouseLeave={this.handleMouseLeave}
         style={style}
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 8d917a995..766093226 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -468,7 +468,7 @@ class Status extends ImmutablePureComponent {
       'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
       'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
       'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
-      'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
+      'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
     };
 
     const visibilityIcon = visibilityIconInfo[status.get('visibility')];
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 2830bee29..8e6b9f063 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -82,6 +82,7 @@ class Header extends ImmutablePureComponent {
     onEditAccountNote: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     domain: PropTypes.string.isRequired,
+    hidden: PropTypes.bool,
   };
 
   openEditProfile = () => {
@@ -123,7 +124,7 @@ class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, intl, domain } = this.props;
+    const { account, hidden, intl, domain } = this.props;
 
     if (!account) {
       return null;
@@ -267,21 +268,25 @@ class Header extends ImmutablePureComponent {
             {!suspended && info}
           </div>
 
-          <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />
+          {!(suspended || hidden) && <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />}
         </div>
 
         <div className='account__header__bar'>
           <div className='account__header__tabs'>
             <a className='avatar' href={account.get('url')} rel='noopener noreferrer' target='_blank'>
-              <Avatar account={account} size={90} />
+              <Avatar account={suspended || hidden ? undefined : account} size={90} />
             </a>
 
             <div className='spacer' />
 
             {!suspended && (
               <div className='account__header__tabs__buttons'>
-                {actionBtn}
-                {bellBtn}
+                {!hidden && (
+                  <React.Fragment>
+                    {actionBtn}
+                    {bellBtn}
+                  </React.Fragment>
+                )}
 
                 <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
               </div>
@@ -295,30 +300,30 @@ class Header extends ImmutablePureComponent {
             </h1>
           </div>
 
-          <div className='account__header__extra'>
-            <div className='account__header__bio'>
-              {fields.size > 0 && (
-                <div className='account__header__fields'>
-                  {fields.map((pair, i) => (
-                    <dl key={i}>
-                      <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} className='translate' />
+          {!(suspended || hidden) && (
+            <div className='account__header__extra'>
+              <div className='account__header__bio'>
+                {fields.size > 0 && (
+                  <div className='account__header__fields'>
+                    {fields.map((pair, i) => (
+                      <dl key={i}>
+                        <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} className='translate' />
 
-                      <dd className={`${pair.get('verified_at') ? 'verified' : ''} translate`} title={pair.get('value_plain')}>
-                        {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
-                      </dd>
-                    </dl>
-                  ))}
-                </div>
-              )}
+                        <dd className={`${pair.get('verified_at') ? 'verified' : ''} translate`} title={pair.get('value_plain')}>
+                          {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
+                        </dd>
+                      </dl>
+                    ))}
+                  </div>
+                )}
 
-              {account.get('id') !== me && !suspended && <AccountNoteContainer account={account} />}
+                {account.get('id') !== me && <AccountNoteContainer account={account} />}
 
-              {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content translate' dangerouslySetInnerHTML={content} />}
+                {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content translate' dangerouslySetInnerHTML={content} />}
 
-              <div className='account__header__joined'><FormattedMessage id='account.joined' defaultMessage='Joined {date}' values={{ date: intl.formatDate(account.get('created_at'), { year: 'numeric', month: 'short', day: '2-digit' }) }} /></div>
-            </div>
+                <div className='account__header__joined'><FormattedMessage id='account.joined' defaultMessage='Joined {date}' values={{ date: intl.formatDate(account.get('created_at'), { year: 'numeric', month: 'short', day: '2-digit' }) }} /></div>
+              </div>
 
-            {!suspended && (
               <div className='account__header__extra__links'>
                 <NavLink isActive={this.isStatusesPageActive} activeClassName='active' to={`/@${account.get('acct')}`} title={intl.formatNumber(account.get('statuses_count'))}>
                   <ShortNumber
@@ -341,8 +346,8 @@ class Header extends ImmutablePureComponent {
                   />
                 </NavLink>
               </div>
-            )}
-          </div>
+            </div>
+          )}
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js
index 507b6c895..fab0bc597 100644
--- a/app/javascript/mastodon/features/account_timeline/components/header.js
+++ b/app/javascript/mastodon/features/account_timeline/components/header.js
@@ -24,6 +24,7 @@ export default class Header extends ImmutablePureComponent {
     onAddToList: PropTypes.func.isRequired,
     hideTabs: PropTypes.bool,
     domain: PropTypes.string.isRequired,
+    hidden: PropTypes.bool,
   };
 
   static contextTypes = {
@@ -91,7 +92,7 @@ export default class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, hideTabs } = this.props;
+    const { account, hidden, hideTabs } = this.props;
 
     if (account === null) {
       return null;
@@ -99,7 +100,7 @@ export default class Header extends ImmutablePureComponent {
 
     return (
       <div className='account-timeline__header'>
-        {account.get('moved') && <MovedNote from={account} to={account.get('moved')} />}
+        {(!hidden && account.get('moved')) && <MovedNote from={account} to={account.get('moved')} />}
 
         <InnerHeader
           account={account}
@@ -117,9 +118,10 @@ export default class Header extends ImmutablePureComponent {
           onAddToList={this.handleAddToList}
           onEditAccountNote={this.handleEditAccountNote}
           domain={this.props.domain}
+          hidden={hidden}
         />
 
-        {!hideTabs && (
+        {!(hideTabs || hidden) && (
           <div className='account__section-headline'>
             <NavLink exact to={`/@${account.get('acct')}`}><FormattedMessage id='account.posts' defaultMessage='Posts' /></NavLink>
             <NavLink exact to={`/@${account.get('acct')}/with_replies`}><FormattedMessage id='account.posts_with_replies' defaultMessage='Posts and replies' /></NavLink>
diff --git a/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js b/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js
new file mode 100644
index 000000000..6b025596c
--- /dev/null
+++ b/app/javascript/mastodon/features/account_timeline/components/limited_account_hint.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { revealAccount } from 'mastodon/actions/accounts';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+
+const mapDispatchToProps = (dispatch, { accountId }) => ({
+
+  reveal () {
+    dispatch(revealAccount(accountId));
+  },
+
+});
+
+export default @connect(() => {}, mapDispatchToProps)
+class LimitedAccountHint extends React.PureComponent {
+
+  static propTypes = {
+    accountId: PropTypes.string.isRequired,
+    reveal: PropTypes.func,
+  }
+
+  render () {
+    const { reveal } = this.props;
+
+    return (
+      <div className='limited-account-hint'>
+        <p><FormattedMessage id='limited_account_hint.title' defaultMessage='This profile has been hidden by the moderators of your server.' /></p>
+        <Button onClick={reveal}><FormattedMessage id='limited_account_hint.action' defaultMessage='Show profile anyway' /></Button>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
index b3f8521cb..371794dd7 100644
--- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js
+++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { makeGetAccount } from '../../../selectors';
+import { makeGetAccount, getAccountHidden } from '../../../selectors';
 import Header from '../components/header';
 import {
   followAccount,
@@ -33,6 +33,7 @@ const makeMapStateToProps = () => {
   const mapStateToProps = (state, { accountId }) => ({
     account: getAccount(state, accountId),
     domain: state.getIn(['meta', 'domain']),
+    hidden: getAccountHidden(state, accountId),
   });
 
   return mapStateToProps;
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index 5122aec4e..5b592c5a7 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -16,6 +16,8 @@ import MissingIndicator from 'mastodon/components/missing_indicator';
 import TimelineHint from 'mastodon/components/timeline_hint';
 import { me } from 'mastodon/initial_state';
 import { connectTimeline, disconnectTimeline } from 'mastodon/actions/timelines';
+import LimitedAccountHint from './components/limited_account_hint';
+import { getAccountHidden } from 'mastodon/selectors';
 
 const emptyList = ImmutableList();
 
@@ -40,6 +42,7 @@ const mapStateToProps = (state, { params: { acct, id }, withReplies = false }) =
     isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
     hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
     suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
     blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
   };
 };
@@ -70,6 +73,7 @@ class AccountTimeline extends ImmutablePureComponent {
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
     suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -128,7 +132,7 @@ class AccountTimeline extends ImmutablePureComponent {
   }
 
   render () {
-    const { statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, multiColumn, remote, remoteUrl } = this.props;
+    const { accountId, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, suspended, isAccount, hidden, multiColumn, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -149,8 +153,12 @@ class AccountTimeline extends ImmutablePureComponent {
 
     let emptyMessage;
 
+    const forceEmptyState = suspended || blockedBy || hidden;
+
     if (suspended) {
       emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
     } else if (blockedBy) {
       emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
     } else if (remote && statusIds.isEmpty()) {
@@ -166,14 +174,14 @@ class AccountTimeline extends ImmutablePureComponent {
         <ColumnBackButton multiColumn={multiColumn} />
 
         <StatusList
-          prepend={<HeaderContainer accountId={this.props.accountId} />}
+          prepend={<HeaderContainer accountId={this.props.accountId} hideTabs={forceEmptyState} />}
           alwaysPrepend
           append={remoteMessage}
           scrollKey='account_timeline'
-          statusIds={(suspended || blockedBy) ? emptyList : statusIds}
+          statusIds={forceEmptyState ? emptyList : statusIds}
           featuredStatusIds={featuredStatusIds}
           isLoading={isLoading}
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           onLoadMore={this.handleLoadMore}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js
index 7ec177434..e00f2b60e 100644
--- a/app/javascript/mastodon/features/blocks/index.js
+++ b/app/javascript/mastodon/features/blocks/index.js
@@ -69,7 +69,7 @@ class Blocks extends ImmutablePureComponent {
           bindToDocument={!multiColumn}
         >
           {accountIds.map(id =>
-            <AccountContainer key={id} id={id} />,
+            <AccountContainer key={id} id={id} defaultAction='block' />,
           )}
         </ScrollableList>
       </Column>
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 826d9f504..a6fea42b7 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -15,6 +15,7 @@ import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';
 import PollFormContainer from '../containers/poll_form_container';
 import UploadFormContainer from '../containers/upload_form_container';
 import WarningContainer from '../containers/warning_container';
+import LanguageDropdown from '../containers/language_dropdown_container';
 import { isMobile } from '../../../is_mobile';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { length } from 'stringz';
@@ -205,6 +206,7 @@ class ComposeForm extends ImmutablePureComponent {
   render () {
     const { intl, onPaste, showSearch } = this.props;
     const disabled = this.props.isSubmitting;
+
     let publishText = '';
 
     if (this.props.isEditing) {
@@ -255,6 +257,7 @@ class ComposeForm extends ImmutablePureComponent {
           autoFocus={!showSearch && !isMobile(window.innerWidth)}
         >
           <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />
+
           <div className='compose-form__modifiers'>
             <UploadFormContainer />
             <PollFormContainer />
@@ -267,12 +270,18 @@ class ComposeForm extends ImmutablePureComponent {
             <PollButtonContainer />
             <PrivacyDropdownContainer disabled={this.props.isEditing} />
             <SpoilerButtonContainer />
+            <LanguageDropdown />
+          </div>
+
+          <div className='character-counter__wrapper'>
+            <CharacterCounter max={maxChars} text={this.getFulltextForCharacterCounting()} />
           </div>
-          <div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={this.getFulltextForCharacterCounting()} /></div>
         </div>
 
         <div className='compose-form__publish'>
-          <div className='compose-form__publish-button-wrapper'><Button text={publishText} onClick={this.handleSubmit} disabled={!this.canSubmit()} block /></div>
+          <div className='compose-form__publish-button-wrapper'>
+            <Button text={publishText} onClick={this.handleSubmit} disabled={!this.canSubmit()} block />
+          </div>
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/components/language_dropdown.js b/app/javascript/mastodon/features/compose/components/language_dropdown.js
new file mode 100644
index 000000000..d76490c77
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/components/language_dropdown.js
@@ -0,0 +1,332 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages } from 'react-intl';
+import TextIconButton from './text_icon_button';
+import Overlay from 'react-overlays/lib/Overlay';
+import Motion from 'mastodon/features/ui/util/optional_motion';
+import spring from 'react-motion/lib/spring';
+import { supportsPassiveEvents } from 'detect-passive-events';
+import classNames from 'classnames';
+import { languages as preloadedLanguages } from 'mastodon/initial_state';
+import fuzzysort from 'fuzzysort';
+
+const messages = defineMessages({
+  changeLanguage: { id: 'compose.language.change', defaultMessage: 'Change language' },
+  search: { id: 'compose.language.search', defaultMessage: 'Search languages...' },
+  clear: { id: 'emoji_button.clear', defaultMessage: 'Clear' },
+});
+
+// Copied from emoji-mart for consistency with emoji picker and since
+// they don't export the icons in the package
+const icons = {
+  loupe: (
+    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'>
+      <path d='M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z' />
+    </svg>
+  ),
+
+  delete: (
+    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'>
+      <path d='M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z' />
+    </svg>
+  ),
+};
+
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
+
+class LanguageDropdownMenu extends React.PureComponent {
+
+  static propTypes = {
+    style: PropTypes.object,
+    value: PropTypes.string.isRequired,
+    frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired,
+    placement: PropTypes.string.isRequired,
+    onClose: PropTypes.func.isRequired,
+    onChange: PropTypes.func.isRequired,
+    languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),
+    intl: PropTypes.object,
+  };
+
+  static defaultProps = {
+    languages: preloadedLanguages,
+  };
+
+  state = {
+    mounted: false,
+    searchValue: '',
+  };
+
+  handleDocumentClick = e => {
+    if (this.node && !this.node.contains(e.target)) {
+      this.props.onClose();
+    }
+  }
+
+  componentDidMount () {
+    document.addEventListener('click', this.handleDocumentClick, false);
+    document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+    this.setState({ mounted: true });
+  }
+
+  componentWillUnmount () {
+    document.removeEventListener('click', this.handleDocumentClick, false);
+    document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+  }
+
+  setRef = c => {
+    this.node = c;
+  }
+
+  setListRef = c => {
+    this.listNode = c;
+  }
+
+  handleSearchChange = ({ target }) => {
+    this.setState({ searchValue: target.value });
+  }
+
+  search () {
+    const { languages, value, frequentlyUsedLanguages } = this.props;
+    const { searchValue } = this.state;
+
+    if (searchValue === '') {
+      return [...languages].sort((a, b) => {
+        // Push current selection to the top of the list
+
+        if (a[0] === value) {
+          return -1;
+        } else if (b[0] === value) {
+          return 1;
+        } else {
+          // Sort according to frequently used languages
+
+          const indexOfA = frequentlyUsedLanguages.indexOf(a[0]);
+          const indexOfB = frequentlyUsedLanguages.indexOf(b[0]);
+
+          return ((indexOfA > -1 ? indexOfA : Infinity) - (indexOfB > -1 ? indexOfB : Infinity));
+        }
+      });
+    }
+
+    return fuzzysort.go(searchValue, languages, {
+      keys: ['0', '1', '2'],
+      limit: 5,
+      threshold: -10000,
+    }).map(result => result.obj);
+  }
+
+  frequentlyUsed () {
+    const { languages, value } = this.props;
+    const current = languages.find(lang => lang[0] === value);
+    const results = [];
+
+    if (current) {
+      results.push(current);
+    }
+
+    return results;
+  }
+
+  handleClick = e => {
+    const value = e.currentTarget.getAttribute('data-index');
+
+    e.preventDefault();
+
+    this.props.onClose();
+    this.props.onChange(value);
+  }
+
+  handleKeyDown = e => {
+    const { onClose } = this.props;
+    const index = Array.from(this.listNode.childNodes).findIndex(node => node === e.currentTarget);
+
+    let element = null;
+
+    switch(e.key) {
+    case 'Escape':
+      onClose();
+      break;
+    case 'Enter':
+      this.handleClick(e);
+      break;
+    case 'ArrowDown':
+      element = this.listNode.childNodes[index + 1] || this.listNode.firstChild;
+      break;
+    case 'ArrowUp':
+      element = this.listNode.childNodes[index - 1] || this.listNode.lastChild;
+      break;
+    case 'Tab':
+      if (e.shiftKey) {
+        element = this.listNode.childNodes[index - 1] || this.listNode.lastChild;
+      } else {
+        element = this.listNode.childNodes[index + 1] || this.listNode.firstChild;
+      }
+      break;
+    case 'Home':
+      element = this.listNode.firstChild;
+      break;
+    case 'End':
+      element = this.listNode.lastChild;
+      break;
+    }
+
+    if (element) {
+      element.focus();
+      e.preventDefault();
+      e.stopPropagation();
+    }
+  }
+
+  handleSearchKeyDown = e => {
+    const { onChange, onClose } = this.props;
+    const { searchValue } = this.state;
+
+    let element = null;
+
+    switch(e.key) {
+    case 'Tab':
+    case 'ArrowDown':
+      element = this.listNode.firstChild;
+
+      if (element) {
+        element.focus();
+        e.preventDefault();
+        e.stopPropagation();
+      }
+
+      break;
+    case 'Enter':
+      element = this.listNode.firstChild;
+
+      if (element) {
+        onChange(element.getAttribute('data-index'));
+        onClose();
+      }
+      break;
+    case 'Escape':
+      if (searchValue !== '') {
+        e.preventDefault();
+        this.handleClear();
+      }
+
+      break;
+    }
+  }
+
+  handleClear = () => {
+    this.setState({ searchValue: '' });
+  }
+
+  renderItem = lang => {
+    const { value } = this.props;
+
+    return (
+      <div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
+        <span className='language-dropdown__dropdown__results__item__native-name'>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span>
+      </div>
+    );
+  }
+
+  render () {
+    const { style, placement, intl } = this.props;
+    const { mounted, searchValue } = this.state;
+    const isSearching = searchValue !== '';
+    const results = this.search();
+
+    return (
+      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
+        {({ opacity, scaleX, scaleY }) => (
+          // It should not be transformed when mounting because the resulting
+          // size will be used to determine the coordinate of the menu by
+          // react-overlays
+          <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
+            <div className='emoji-mart-search'>
+              <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} autoFocus />
+              <button className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? icons.loupe : icons.delete}</button>
+            </div>
+
+            <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
+              {results.map(this.renderItem)}
+            </div>
+          </div>
+        )}
+      </Motion>
+    );
+  }
+
+}
+
+export default @injectIntl
+class LanguageDropdown extends React.PureComponent {
+
+  static propTypes = {
+    value: PropTypes.string,
+    frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string),
+    intl: PropTypes.object.isRequired,
+    onChange: PropTypes.func,
+    onClose: PropTypes.func,
+  };
+
+  state = {
+    open: false,
+    placement: 'bottom',
+  };
+
+  handleToggle = ({ target }) => {
+    const { top } = target.getBoundingClientRect();
+
+    if (this.state.open && this.activeElement) {
+      this.activeElement.focus({ preventScroll: true });
+    }
+
+    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
+    this.setState({ open: !this.state.open });
+  }
+
+  handleClose = () => {
+    const { value, onClose } = this.props;
+
+    if (this.state.open && this.activeElement) {
+      this.activeElement.focus({ preventScroll: true });
+    }
+
+    this.setState({ open: false });
+    onClose(value);
+  }
+
+  handleChange = value => {
+    const { onChange } = this.props;
+    onChange(value);
+  }
+
+  render () {
+    const { value, intl, frequentlyUsedLanguages } = this.props;
+    const { open, placement } = this.state;
+
+    return (
+      <div className={classNames('privacy-dropdown', { active: open })}>
+        <div className='privacy-dropdown__value'>
+          <TextIconButton
+            className='privacy-dropdown__value-icon'
+            label={value && value.toUpperCase()}
+            title={intl.formatMessage(messages.changeLanguage)}
+            active={open}
+            onClick={this.handleToggle}
+          />
+        </div>
+
+        <Overlay show={open} placement={placement} target={this}>
+          <LanguageDropdownMenu
+            value={value}
+            frequentlyUsedLanguages={frequentlyUsedLanguages}
+            onClose={this.handleClose}
+            onChange={this.handleChange}
+            placement={placement}
+            intl={intl}
+          />
+        </Overlay>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
index c94db59c5..1f0e998d3 100644
--- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
@@ -16,7 +16,7 @@ const messages = defineMessages({
   unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Visible for all, but opted-out of discovery features' },
   private_short: { id: 'privacy.private.short', defaultMessage: 'Followers only' },
   private_long: { id: 'privacy.private.long', defaultMessage: 'Visible for followers only' },
-  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Only people I mention' },
+  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
   direct_long: { id: 'privacy.direct.long', defaultMessage: 'Visible for mentioned users only' },
   change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },
 });
diff --git a/app/javascript/mastodon/features/compose/components/text_icon_button.js b/app/javascript/mastodon/features/compose/components/text_icon_button.js
index f0b133538..cd644b680 100644
--- a/app/javascript/mastodon/features/compose/components/text_icon_button.js
+++ b/app/javascript/mastodon/features/compose/components/text_icon_button.js
@@ -17,11 +17,6 @@ export default class TextIconButton extends React.PureComponent {
     ariaControls: PropTypes.string,
   };
 
-  handleClick = (e) => {
-    e.preventDefault();
-    this.props.onClick();
-  }
-
   render () {
     const { label, title, active, ariaControls } = this.props;
 
@@ -31,7 +26,7 @@ export default class TextIconButton extends React.PureComponent {
         aria-label={title}
         className={`text-icon-button ${active ? 'active' : ''}`}
         aria-expanded={active}
-        onClick={this.handleClick}
+        onClick={this.props.onClick}
         aria-controls={ariaControls} style={iconStyle}
       >
         {label}
diff --git a/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js
new file mode 100644
index 000000000..2a040a13f
--- /dev/null
+++ b/app/javascript/mastodon/features/compose/containers/language_dropdown_container.js
@@ -0,0 +1,34 @@
+import { connect } from 'react-redux';
+import LanguageDropdown from '../components/language_dropdown';
+import { changeComposeLanguage } from 'mastodon/actions/compose';
+import { useLanguage } from 'mastodon/actions/languages';
+import { createSelector } from 'reselect';
+import { Map as ImmutableMap } from 'immutable';
+
+const getFrequentlyUsedLanguages = createSelector([
+  state => state.getIn(['settings', 'frequentlyUsedLanguages'], ImmutableMap()),
+], languageCounters => (
+  languageCounters.keySeq()
+    .sort((a, b) => languageCounters.get(a) - languageCounters.get(b))
+    .reverse()
+    .toArray()
+));
+
+const mapStateToProps = state => ({
+  frequentlyUsedLanguages: getFrequentlyUsedLanguages(state),
+  value: state.getIn(['compose', 'language']),
+});
+
+const mapDispatchToProps = dispatch => ({
+
+  onChange (value) {
+    dispatch(changeComposeLanguage(value));
+  },
+
+  onClose (value) {
+    dispatch(useLanguage(value));
+  },
+
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(LanguageDropdown);
diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js
index 224e74b3d..5b7f402f8 100644
--- a/app/javascript/mastodon/features/followers/index.js
+++ b/app/javascript/mastodon/features/followers/index.js
@@ -19,6 +19,8 @@ import ColumnBackButton from '../../components/column_back_button';
 import ScrollableList from '../../components/scrollable_list';
 import MissingIndicator from 'mastodon/components/missing_indicator';
 import TimelineHint from 'mastodon/components/timeline_hint';
+import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
+import { getAccountHidden } from 'mastodon/selectors';
 
 const mapStateToProps = (state, { params: { acct, id } }) => {
   const accountId = id || state.getIn(['accounts_map', acct]);
@@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
     accountIds: state.getIn(['user_lists', 'followers', accountId, 'items']),
     hasMore: !!state.getIn(['user_lists', 'followers', accountId, 'next']),
     isLoading: state.getIn(['user_lists', 'followers', accountId, 'isLoading'], true),
+    suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
     blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
   };
 };
@@ -64,6 +68,8 @@ class Followers extends ImmutablePureComponent {
     isLoading: PropTypes.bool,
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
+    suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -101,7 +107,7 @@ class Followers extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
+    const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -121,7 +127,13 @@ class Followers extends ImmutablePureComponent {
 
     let emptyMessage;
 
-    if (blockedBy) {
+    const forceEmptyState = blockedBy || suspended || hidden;
+
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
+    } else if (blockedBy) {
       emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
     } else if (remote && accountIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
@@ -137,7 +149,7 @@ class Followers extends ImmutablePureComponent {
 
         <ScrollableList
           scrollKey='followers'
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           isLoading={isLoading}
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
@@ -146,7 +158,7 @@ class Followers extends ImmutablePureComponent {
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
-          {blockedBy ? [] : accountIds.map(id =>
+          {forceEmptyState ? [] : accountIds.map(id =>
             <AccountContainer key={id} id={id} withNote={false} />,
           )}
         </ScrollableList>
diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js
index aadce1644..143082d76 100644
--- a/app/javascript/mastodon/features/following/index.js
+++ b/app/javascript/mastodon/features/following/index.js
@@ -19,6 +19,8 @@ import ColumnBackButton from '../../components/column_back_button';
 import ScrollableList from '../../components/scrollable_list';
 import MissingIndicator from 'mastodon/components/missing_indicator';
 import TimelineHint from 'mastodon/components/timeline_hint';
+import LimitedAccountHint from '../account_timeline/components/limited_account_hint';
+import { getAccountHidden } from 'mastodon/selectors';
 
 const mapStateToProps = (state, { params: { acct, id } }) => {
   const accountId = id || state.getIn(['accounts_map', acct]);
@@ -37,6 +39,8 @@ const mapStateToProps = (state, { params: { acct, id } }) => {
     accountIds: state.getIn(['user_lists', 'following', accountId, 'items']),
     hasMore: !!state.getIn(['user_lists', 'following', accountId, 'next']),
     isLoading: state.getIn(['user_lists', 'following', accountId, 'isLoading'], true),
+    suspended: state.getIn(['accounts', accountId, 'suspended'], false),
+    hidden: getAccountHidden(state, accountId),
     blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
   };
 };
@@ -64,6 +68,8 @@ class Following extends ImmutablePureComponent {
     isLoading: PropTypes.bool,
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
+    suspended: PropTypes.bool,
+    hidden: PropTypes.bool,
     remote: PropTypes.bool,
     remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
@@ -101,7 +107,7 @@ class Following extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
+    const { accountId, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, suspended, hidden, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -121,7 +127,13 @@ class Following extends ImmutablePureComponent {
 
     let emptyMessage;
 
-    if (blockedBy) {
+    const forceEmptyState = blockedBy || suspended || hidden;
+
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (hidden) {
+      emptyMessage = <LimitedAccountHint accountId={accountId} />;
+    } else if (blockedBy) {
       emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
     } else if (remote && accountIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
@@ -137,7 +149,7 @@ class Following extends ImmutablePureComponent {
 
         <ScrollableList
           scrollKey='following'
-          hasMore={hasMore}
+          hasMore={!forceEmptyState && hasMore}
           isLoading={isLoading}
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.accountId} hideTabs />}
@@ -146,7 +158,7 @@ class Following extends ImmutablePureComponent {
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
-          {blockedBy ? [] : accountIds.map(id =>
+          {forceEmptyState ? [] : accountIds.map(id =>
             <AccountContainer key={id} id={id} withNote={false} />,
           )}
         </ScrollableList>
diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js
index c1d50d194..c21433cc4 100644
--- a/app/javascript/mastodon/features/mutes/index.js
+++ b/app/javascript/mastodon/features/mutes/index.js
@@ -69,7 +69,7 @@ class Mutes extends ImmutablePureComponent {
           bindToDocument={!multiColumn}
         >
           {accountIds.map(id =>
-            <AccountContainer key={id} id={id} />,
+            <AccountContainer key={id} id={id} defaultAction='mute' />,
           )}
         </ScrollableList>
       </Column>
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index c99e01f73..13bce1b83 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -185,7 +185,7 @@ class DetailedStatus extends ImmutablePureComponent {
       'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
       'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
       'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
-      'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
+      'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
     };
 
     const visibilityIcon = visibilityIconInfo[status.get('visibility')];
diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js
index f8a344690..ab87ee427 100644
--- a/app/javascript/mastodon/features/ui/components/boost_modal.js
+++ b/app/javascript/mastodon/features/ui/components/boost_modal.js
@@ -88,7 +88,7 @@ class BoostModal extends ImmutablePureComponent {
       'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
       'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
       'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
-      'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
+      'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
     };
 
     const visibilityIcon = visibilityIconInfo[status.get('visibility')];
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index db047f5f0..e665f4447 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -234,7 +234,7 @@ class ColumnsArea extends ImmutablePureComponent {
             </div>
           </div>
 
-          <div className='columns-area__panels__main'>
+          <div className={`columns-area__panels__main ${floatingActionButton && 'with-fab'}`}>
             <TabsBar key='tabs' />
             {content}
           </div>
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 1307bf23e..51d023c8e 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -28,5 +28,6 @@ export const showTrends = getMeta('trends');
 export const title = getMeta('title');
 export const cropImages = getMeta('crop_images');
 export const disableSwiping = getMeta('disable_swiping');
+export const languages = initialState && initialState.languages;
 
 export default initialState;
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index fe91569bc..650a3b708 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -20,12 +20,12 @@
   "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
   "account.following": "Following",
   "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "Die gebruiker volg nie tans iemand nie.",
   "account.follows_you": "Volg jou",
   "account.hide_reblogs": "Versteek hupstoot vanaf @{name}",
   "account.joined": "{date} aangesluit",
   "account.link_verified_on": "Eienaarskap van die skakel was getoets op {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "Die rekening se privaatheidstatus is gesluit. Die eienaar hersien handmatig wie hom/haar kan volg.",
   "account.media": "Media",
   "account.mention": "Noem @{name}",
   "account.moved_to": "{name} is geskuif na:",
@@ -43,7 +43,7 @@
   "account.unblock_domain": "Ontblok domein {domain}",
   "account.unblock_short": "Ontblok",
   "account.unendorse": "Moenie beklemtoon op profiel nie",
-  "account.unfollow": "Unfollow",
+  "account.unfollow": "Ontvolg",
   "account.unmute": "Ontdemp @{name}",
   "account.unmute_notifications": "Ontdemp kennisgewings vanaf @{name}",
   "account.unmute_short": "Ontdemp",
@@ -57,56 +57,58 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Aankondiging",
   "attachments_list.unprocessed": "(unprocessed)",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
+  "bundle_column_error.retry": "Probeer weer",
+  "bundle_column_error.title": "Netwerk fout",
   "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
+  "bundle_modal_error.message": "Iets het verkeerd gegaan terwyl hierdie komponent besig was om te laai.",
+  "bundle_modal_error.retry": "Probeer weer",
   "column.blocks": "Blocked users",
-  "column.bookmarks": "Bookmarks",
-  "column.community": "Local timeline",
-  "column.conversations": "Conversations",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Blocked domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
+  "column.bookmarks": "Boekmerke",
+  "column.community": "Plaaslike tydlyn",
+  "column.direct": "Direkte boodskappe",
+  "column.directory": "Blaai deur profiele",
+  "column.domain_blocks": "Geblokte domeine",
+  "column.favourites": "Gunstelinge",
+  "column.follow_requests": "Volgversoeke",
+  "column.home": "Tuis",
+  "column.lists": "Lyste",
+  "column.mutes": "Gedempte gebruikers",
+  "column.notifications": "Kennisgewings",
   "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.local_only": "Local only",
+  "column.public": "Gefedereerde tydlyn",
+  "column_back_button.label": "Terug",
+  "column_header.hide_settings": "Versteek instellings",
+  "column_header.moveLeft_settings": "Skuif kolom na links",
+  "column_header.moveRight_settings": "Skuif kolom na regs",
+  "column_header.pin": "Pen vas",
+  "column_header.show_settings": "Wys instellings",
+  "column_header.unpin": "Ontpen",
+  "column_subheading.settings": "Instellings",
+  "community.column_settings.local_only": "Slegs plaaslik",
   "community.column_settings.media_only": "Media only",
-  "community.column_settings.remote_only": "Remote only",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "community.column_settings.remote_only": "Slegs afgeleë",
+  "compose.language.change": "Verander taal",
+  "compose.language.search": "Soek tale...",
+  "compose_form.direct_message_warning_learn_more": "Leer meer",
+  "compose_form.encryption_warning": "Plasings op Mastodon het nie end-tot-end enkripsie nie. Moet nie enige gevaarlike inligting oor Mastodon deel nie.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.lock_disclaimer.lock": "gesluit",
   "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.poll.add_option": "Voeg 'n keuse by",
+  "compose_form.poll.duration": "Duur van peiling",
+  "compose_form.poll.option_placeholder": "Keuse {number}",
+  "compose_form.poll.remove_option": "Verwyder hierdie keuse",
+  "compose_form.poll.switch_to_multiple": "Verander die peiling na verskeie keuses",
+  "compose_form.poll.switch_to_single": "Verander die peiling na 'n enkel keuse",
+  "compose_form.publish": "Toet",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Stoor veranderinge",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
   "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Maak skoon",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Jy het nog nie direkte boodskappe nie. Wanneer jy een stuur of ontvang, sal dit hier verskyn.",
   "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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "om direkte boodskappe kolom oop te maak",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Vertoon profiel in elkgeval",
+  "limited_account_hint.title": "Hierdie profiel is deur moderators van jou bediener versteek.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direkte boodskappe",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Remove poll",
   "privacy.change": "Adjust status privacy",
   "privacy.direct.long": "Visible for mentioned users only",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Slegs genoemde persone",
   "privacy.private.long": "Visible for followers only",
   "privacy.private.short": "Followers-only",
   "privacy.public.long": "Visible for all",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index ac93bf706..1f113213c 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -70,17 +70,17 @@
   "column.blocks": "المُستَخدِمون المَحظورون",
   "column.bookmarks": "الفواصل المرجعية",
   "column.community": "الخيط الزمني المحلي",
-  "column.conversations": "المحادثات",
+  "column.direct": "الرسائل المباشِرة",
   "column.directory": "تَصَفُّحُ المَلفات الشخصية",
-  "column.domain_blocks": "النِّطاقَاتُ المَحظُورَة",
+  "column.domain_blocks": "النطاقات المحظورة",
   "column.favourites": "المُفَضَّلَة",
-  "column.follow_requests": "طَلَبَاتُ المُتَابَعَة",
+  "column.follow_requests": "طلبات المتابعة",
   "column.home": "الرئيسية",
   "column.lists": "القوائم",
   "column.mutes": "المُستَخدِمون المَكتومون",
   "column.notifications": "الإشعارات",
   "column.pins": "المنشورات المُثَبَّتَة",
-  "column.public": "الخَطُّ الزَّمَنِيُّ المُوَحَّد",
+  "column.public": "الخيط الزمني المُوَحَّد",
   "column_back_button.label": "العودة",
   "column_header.hide_settings": "إخفاء الإعدادات",
   "column_header.moveLeft_settings": "نقل العامود إلى اليسار",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "المحلي فقط",
   "community.column_settings.media_only": "الوسائط فقط",
   "community.column_settings.remote_only": "عن بُعد فقط",
+  "compose.language.change": "تغيير اللغة",
+  "compose.language.search": "البحث عن لغة…",
   "compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.",
   "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.",
   "compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
   "compose_form.lock_disclaimer.lock": "مُقفَل",
@@ -104,7 +106,7 @@
   "compose_form.poll.remove_option": "إزالة هذا الخيار",
   "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
   "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
-  "compose_form.publish": "تبويق",
+  "compose_form.publish": "بوّق",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "احفظ التعديلات",
   "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
@@ -130,7 +132,7 @@
   "confirmations.mute.confirm": "أكتم",
   "confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.",
   "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
-  "confirmations.redraft.confirm": "إزالة و إعادة الصياغة",
+  "confirmations.redraft.confirm": "إزالة وإعادة الصياغة",
   "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
   "confirmations.reply.confirm": "رد",
   "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
@@ -147,12 +149,13 @@
   "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
   "embed.preview": "هكذا ما سوف يبدو عليه:",
   "emoji_button.activity": "الأنشطة",
+  "emoji_button.clear": "امسح",
   "emoji_button.custom": "مخصص",
   "emoji_button.flags": "الأعلام",
   "emoji_button.food": "الطعام والشراب",
   "emoji_button.label": "أدرج إيموجي",
   "emoji_button.nature": "الطبيعة",
-  "emoji_button.not_found": "لا إيموجو!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "لا توجد هناك وجوه تعبيرية مطابقة",
   "emoji_button.objects": "أشياء",
   "emoji_button.people": "الناس",
   "emoji_button.recent": "الشائعة الاستخدام",
@@ -166,9 +169,9 @@
   "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
   "empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.",
   "empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
-  "empty_column.conversations": "عندما ترسل أو تستلم منشورًا محصورٌا على الأشخاص المشار إليهم فيه، سيظهر هنا.",
+  "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
   "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!",
   "empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.",
   "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
   "empty_column.follow_recommendations": "يبدو أنه لا يمكن إنشاء أي اقتراحات لك. يمكنك البحث عن أشخاص قد تعرفهم أو استكشاف الوسوم الرائجة.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "للترقية",
   "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة",
   "keyboard_shortcuts.compose": "للتركيز على نافذة تحرير النصوص",
-  "keyboard_shortcuts.conversations": "لفتح عمود المحادثات",
   "keyboard_shortcuts.description": "الوصف",
+  "keyboard_shortcuts.direct": "لفتح عمود الرسائل المباشرة",
   "keyboard_shortcuts.down": "للانتقال إلى أسفل القائمة",
   "keyboard_shortcuts.enter": "لفتح المنشور",
   "keyboard_shortcuts.favourite": "للإضافة إلى المفضلة",
@@ -264,6 +267,8 @@
   "lightbox.expand": "توسيع مربع عرض الصور",
   "lightbox.next": "التالي",
   "lightbox.previous": "العودة",
+  "limited_account_hint.action": "إظهار الملف التعريفي على أي حال",
+  "limited_account_hint.title": "أخف مشرف الخادم هذا الملف التعريفي.",
   "lists.account.add": "أضف إلى القائمة",
   "lists.account.remove": "احذف من القائمة",
   "lists.delete": "احذف القائمة",
@@ -278,8 +283,8 @@
   "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها",
   "lists.subheading": "قوائمك",
   "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}",
-  "loading_indicator.label": "تحميل...",
-  "media_gallery.toggle_visible": "عرض / إخفاء",
+  "loading_indicator.label": "جارٍ التحميل…",
+  "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}",
   "missing_indicator.label": "غير موجود",
   "missing_indicator.sublabel": "تعذر العثور على هذا المورد",
   "mute_modal.duration": "المدة",
@@ -288,10 +293,11 @@
   "navigation_bar.apps": "تطبيقات الأجهزة المحمولة",
   "navigation_bar.blocks": "الحسابات المحجوبة",
   "navigation_bar.bookmarks": "الفواصل المرجعية",
-  "navigation_bar.community_timeline": "الخيط العام المحلي",
-  "navigation_bar.compose": "لتحرير منشور جديد",
+  "navigation_bar.community_timeline": "الخيط المحلي",
+  "navigation_bar.compose": "تحرير منشور جديد",
+  "navigation_bar.direct": "الرسائل المباشِرة",
   "navigation_bar.discover": "اكتشف",
-  "navigation_bar.domain_blocks": "النطاقات المخفية",
+  "navigation_bar.domain_blocks": "النطاقات المحظورة",
   "navigation_bar.edit_profile": "عدّل الملف التعريفي",
   "navigation_bar.explore": "استكشف",
   "navigation_bar.favourites": "المفضلة",
@@ -365,13 +371,13 @@
   "poll_button.add_poll": "إضافة استطلاع للرأي",
   "poll_button.remove_poll": "إزالة استطلاع الرأي",
   "privacy.change": "اضبط خصوصية المنشور",
-  "privacy.direct.long": "أنشر إلى المستخدمين المشار إليهم فقط",
-  "privacy.direct.short": "للمشار إليهم فقط",
+  "privacy.direct.long": "مرئي للمستخدمين المذكورين فقط",
+  "privacy.direct.short": "الأشخاص المشار إليهم فقط",
   "privacy.private.long": "أنشر لمتابعيك فقط",
   "privacy.private.short": "للمتابِعين فقط",
   "privacy.public.long": "مرئي للكل",
   "privacy.public.short": "للعامة",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "مرئي للجميع، ولكن مِن دون ميزات الاكتشاف",
   "privacy.unlisted.short": "غير مدرج",
   "refresh": "أنعِش",
   "regeneration_indicator.label": "جارٍ التحميل…",
@@ -393,8 +399,8 @@
   "report.categories.other": "أخرى",
   "report.categories.spam": "مزعج",
   "report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم",
-  "report.category.subtitle": "Choose the best match",
-  "report.category.title": "Tell us what's going on with this {type}",
+  "report.category.subtitle": "اختر أفضل تطابق",
+  "report.category.title": "وضح لنا ما أمر {type}",
   "report.category.title_account": "ملف تعريفي",
   "report.category.title_status": "منشور",
   "report.close": "تم",
@@ -410,16 +416,16 @@
   "report.reasons.other": "شيء آخر",
   "report.reasons.other_description": "لا تندرج هذه المشكلة ضمن فئات أخرى",
   "report.reasons.spam": "إنها رسالة مزعجة",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.spam_description": "روابط خبيثة أو تفاعل كاذب أو ردود متكررة",
   "report.reasons.violation": "ينتهك قواعد الخادم",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
+  "report.reasons.violation_description": "تعلم أنه ينتهك قواعد محددة",
+  "report.rules.subtitle": "اختر كل ما ينطبق",
   "report.rules.title": "ما هي القواعد المنتهكة؟",
-  "report.statuses.subtitle": "Select all that apply",
+  "report.statuses.subtitle": "اختر كل ما ينطبق",
   "report.statuses.title": "هل توجد مشاركات تدعم صحة هذا البلاغ؟",
   "report.submit": "إرسال",
   "report.target": "ابلغ عن {target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+  "report.thanks.take_action": "يمكنك هنا التحكم في ما يعرض لك على ماستدون:",
   "report.thanks.take_action_actionable": "في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد @{name}:",
   "report.thanks.title": "هل ترغب في مشاهدة هذا؟",
   "report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 3400e3cd1..148527b96 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -70,7 +70,7 @@
   "column.blocks": "Usuarios bloquiaos",
   "column.bookmarks": "Marcadores",
   "column.community": "Llinia temporal llocal",
-  "column.conversations": "Conversations",
+  "column.direct": "Mensaxes direutos",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Dominios anubríos",
   "column.favourites": "Favoritos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Namái multimedia",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Saber más",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Empotra esti estáu nun sitiu web copiando'l códigu d'embaxo.",
   "embed.preview": "Asina ye cómo va vese:",
   "emoji_button.activity": "Actividaes",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Banderes",
   "emoji_button.food": "Comida y bébora",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Entá nun bloquiesti a nengún usuariu.",
   "empty_column.bookmarked_statuses": "Entá nun tienes nengún barritu en Marcadores. Cuando amiestes unu, va amosase equí.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Entá nun tienes nengún mensaxe direutu. Cuando unvies o recibas dalgún, apaez equí.",
   "empty_column.domain_blocks": "Entá nun hai dominios anubríos.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Entá nun tienes nengún barritu en Favoritos. Cuando amiestes unu, va amosase equí.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "pa compartir un toot",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "Enfocar l'área de composición",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descripción",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "pa baxar na llista",
   "keyboard_shortcuts.enter": "p'abrir estaos",
   "keyboard_shortcuts.favourite": "p'amestar a Favoritos",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Amestar a la llista",
   "lists.account.remove": "Desaniciar de la llista",
   "lists.delete": "Desaniciar la llista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Llinia temporal llocal",
   "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Mensaxes direutos",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Dominios anubríos",
   "navigation_bar.edit_profile": "Editar el perfil",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 42cd08f1f..06d4760f0 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -70,7 +70,7 @@
   "column.blocks": "Блокирани потребители",
   "column.bookmarks": "Отметки",
   "column.community": "Локална емисия",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Преглед на профили",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Любими",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Само локално",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Само дистанционно",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Още информация",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Тази публикация няма да бъде изброена под нито един хаштаг, тъй като е скрита. Само публични публикации могат да се търсят по хаштаг.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Ето как ще изглежда:",
   "emoji_button.activity": "Дейност",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Персонализирано",
   "emoji_button.flags": "Знамена",
   "emoji_button.food": "Храна и напитки",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Не сте блокирали потребители все още.",
   "empty_column.bookmarked_statuses": "Все още нямате отметнати публикации. Когато отметнете някоя, тя ще се покаже тук.",
   "empty_column.community": "Локалната емисия е празна. Напишете нещо публично, за да започнете!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Все още нямате любими публикации. Когато поставите някоя в любими, тя ще се покаже тук.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "за споделяне",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "за фокусиране на текстовото пространство за композиране",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Описание",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "за придвижване надолу в списъка",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "за поставяне в любими",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Разгъване на полето за преглед на изображение",
   "lightbox.next": "Напред",
   "lightbox.previous": "Назад",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Добавяне към списък",
   "lists.account.remove": "Премахване от списък",
   "lists.delete": "Изтриване на списък",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Отметки",
   "navigation_bar.community_timeline": "Локална емисия",
   "navigation_bar.compose": "Композиране на нова публикация",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Откриване",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Редактирай профил",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index b009d5964..e89f4690b 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -70,7 +70,7 @@
   "column.blocks": "যাদের ব্লক করা হয়েছে",
   "column.bookmarks": "বুকমার্ক",
   "column.community": "স্থানীয় সময়সারি",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "প্রোফাইল ব্রাউজ করুন",
   "column.domain_blocks": "লুকোনো ডোমেনগুলি",
   "column.favourites": "পছন্দের গুলো",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
   "community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
   "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "আরো জানুন",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "কোনো হ্যাশট্যাগের ভেতরে এই টুটটি থাকবেনা কারণ এটি তালিকাবহির্ভূত। শুধুমাত্র প্রকাশ্য ঠোটগুলো হ্যাশট্যাগের ভেতরে খুঁজে পাওয়া যাবে।",
@@ -147,6 +149,7 @@
   "embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।",
   "embed.preview": "সেটা দেখতে এরকম হবে:",
   "emoji_button.activity": "কার্যকলাপ",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "প্রথা",
   "emoji_button.flags": "পতাকা",
   "emoji_button.food": "খাদ্য ও পানীয়",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।",
   "empty_column.bookmarked_statuses": "আপনার কাছে এখনও কোনও বুকমার্কড টুট নেই। আপনি যখন একটি বুকমার্ক করেন, এটি এখানে প্রদর্শিত হবে।",
   "empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "সমর্থন করতে",
   "keyboard_shortcuts.column": "কোনো কলামএ কোনো লেখা ফোকাস করতে",
   "keyboard_shortcuts.compose": "লেখা সম্পদনার জায়গায় ফোকাস করতে",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "বিবরণ",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "তালিকার ভেতরে নিচে যেতে",
   "keyboard_shortcuts.enter": "অবস্থা দেখতে",
   "keyboard_shortcuts.favourite": "পছন্দের দেখতে",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "পরবর্তী",
   "lightbox.previous": "পূর্ববর্তী",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "তালিকাতে যুক্ত করতে",
   "lists.account.remove": "তালিকা থেকে বাদ দিতে",
   "lists.delete": "তালিকা মুছে ফেলতে",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "বুকমার্ক",
   "navigation_bar.community_timeline": "স্থানীয় সময়রেখা",
   "navigation_bar.compose": "নতুন টুট লিখুন",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "ঘুরে দেখুন",
   "navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
   "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 74d430b50..cbe7fc6cb 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -70,7 +70,7 @@
   "column.blocks": "Implijer·ezed·ien berzet",
   "column.bookmarks": "Sinedoù",
   "column.community": "Red-amzer lec'hel",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Mont a-dreuz ar profiloù",
   "column.domain_blocks": "Domani berzet",
   "column.favourites": "Muiañ-karet",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Nemet lec'hel",
   "community.column_settings.media_only": "Nemet Mediaoù",
   "community.column_settings.remote_only": "Nemet a-bell",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Ne vo ket lakaet an toud-mañ er rolloù gerioù-klik dre mard eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Enkorfit ar statud war ho lec'hienn en ur eilañ ar c'hod dindan.",
   "embed.preview": "Setu penaos e vo diskouezet:",
   "emoji_button.activity": "Obererezh",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Kempennet",
   "emoji_button.flags": "Bannieloù",
   "emoji_button.food": "Boued hag Evaj",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.",
   "empty_column.bookmarked_statuses": "N'ho peus toud ebet enrollet en ho sinedoù c'hoazh. Pa vo ouzhpennet unan ganeoc'h e teuio war wel amañ.",
   "empty_column.community": "Goulo eo ar red-amzer lec'hel. Skrivit'ta un dra evit lakaat tan dezhi !",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "N'ho peus toud muiañ-karet ebet c'hoazh. Pa vo lakaet unan ganeoc'h e vo diskouezet amañ.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "da skignañ",
   "keyboard_shortcuts.column": "Fokus ar bann",
   "keyboard_shortcuts.compose": "Fokus an takad testenn",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Deskrivadur",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Diskennañ er roll",
   "keyboard_shortcuts.enter": "evit digeriñ un toud",
   "keyboard_shortcuts.favourite": "Lakaat an toud evel muiañ-karet",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ledanaat boest hewel ar skeudenn",
   "lightbox.next": "Da-heul",
   "lightbox.previous": "A-raok",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Ouzhpennañ d'al listenn",
   "lists.account.remove": "Lemel kuit eus al listenn",
   "lists.delete": "Dilemel al listenn",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Sinedoù",
   "navigation_bar.community_timeline": "Red-amzer lec'hel",
   "navigation_bar.compose": "Skrivañ un toud nevez",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Dizoleiñ",
   "navigation_bar.domain_blocks": "Domanioù kuzhet",
   "navigation_bar.edit_profile": "Aozañ ar profil",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 16de55828..1072001b4 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,24 +1,24 @@
 {
   "account.account_note_header": "Nota",
-  "account.add_or_remove_from_list": "Afegeix o treu de les llistes",
+  "account.add_or_remove_from_list": "Afegeix o elimina de les llistes",
   "account.badges.bot": "Bot",
   "account.badges.group": "Grup",
   "account.block": "Bloqueja @{name}",
-  "account.block_domain": "Amaga-ho tot de {domain}",
+  "account.block_domain": "Bloqueja el domini {domain}",
   "account.blocked": "Bloquejat",
   "account.browse_more_on_origin_server": "Navega més en el perfil original",
   "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
   "account.direct": "Envia missatge directe a @{name}",
-  "account.disable_notifications": "Deixa de notificar-me les publicacions de @{name}",
+  "account.disable_notifications": "No em notifiquis les publicacions de @{name}",
   "account.domain_blocked": "Domini bloquejat",
   "account.edit_profile": "Edita el perfil",
   "account.enable_notifications": "Notifica’m les publicacions de @{name}",
   "account.endorse": "Recomana en el teu perfil",
   "account.follow": "Segueix",
   "account.followers": "Seguidors",
-  "account.followers.empty": "Encara ningú no segueix aquest usuari.",
+  "account.followers.empty": "Ningú segueix aquest usuari encara.",
   "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
-  "account.following": "Seguits",
+  "account.following": "Seguint",
   "account.following_counter": "{count, plural, other {{counter} Seguint}}",
   "account.follows.empty": "Aquest usuari encara no segueix ningú.",
   "account.follows_you": "Et segueix",
@@ -26,8 +26,8 @@
   "account.joined": "Membre des de {date}",
   "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
   "account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.",
-  "account.media": "Mèdia",
-  "account.mention": "Esmenta @{name}",
+  "account.media": "Multimèdia",
+  "account.mention": "Menciona @{name}",
   "account.moved_to": "{name} s'ha traslladat a:",
   "account.mute": "Silencia @{name}",
   "account.mute_notifications": "Silencia les notificacions de @{name}",
@@ -41,10 +41,10 @@
   "account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}",
   "account.unblock": "Desbloqueja @{name}",
   "account.unblock_domain": "Desbloqueja el domini {domain}",
-  "account.unblock_short": "Desbloqueja",
-  "account.unendorse": "No recomanis en el perfil",
-  "account.unfollow": "Deixa de seguir",
-  "account.unmute": "Deixa de silenciar @{name}",
+  "account.unblock_short": "Desbloquejar",
+  "account.unendorse": "No recomanar en el perfil",
+  "account.unfollow": "Deixar de seguir",
+  "account.unmute": "Deixar de silenciar @{name}",
   "account.unmute_notifications": "Activar notificacions de @{name}",
   "account.unmute_short": "Deixa de silenciar",
   "account_note.placeholder": "Fes clic per afegir una nota",
@@ -62,16 +62,16 @@
   "autosuggest_hashtag.per_week": "{count} per setmana",
   "boost_modal.combo": "Pots prémer {combo} per evitar-ho el pròxim cop",
   "bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
-  "bundle_column_error.retry": "Torna-ho a provar",
+  "bundle_column_error.retry": "Tornar-ho a provar",
   "bundle_column_error.title": "Error de connexió",
   "bundle_modal_error.close": "Tanca",
   "bundle_modal_error.message": "S'ha produït un error en carregar aquest component.",
-  "bundle_modal_error.retry": "Torna-ho a provar",
+  "bundle_modal_error.retry": "Tornar-ho a provar",
   "column.blocks": "Usuaris bloquejats",
   "column.bookmarks": "Marcadors",
   "column.community": "Línia de temps local",
-  "column.conversations": "Converses",
-  "column.directory": "Navega pels perfils",
+  "column.direct": "Missatges directes",
+  "column.directory": "Navegar pels perfils",
   "column.domain_blocks": "Dominis bloquejats",
   "column.favourites": "Favorits",
   "column.follow_requests": "Peticions per a seguir-te",
@@ -92,19 +92,21 @@
   "community.column_settings.local_only": "Només local",
   "community.column_settings.media_only": "Només multimèdia",
   "community.column_settings.remote_only": "Només remot",
+  "compose.language.change": "Canvia d'idioma",
+  "compose.language.search": "Cerca idiomes...",
   "compose_form.direct_message_warning_learn_more": "Més informació",
   "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació perillosa mitjançant Mastodon.",
   "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.",
-  "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges només per a seguidors.",
+  "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.",
   "compose_form.lock_disclaimer.lock": "bloquejat",
   "compose_form.placeholder": "Què et passa pel cap?",
-  "compose_form.poll.add_option": "Afegeix una opció",
+  "compose_form.poll.add_option": "Afegir una opció",
   "compose_form.poll.duration": "Durada de l'enquesta",
   "compose_form.poll.option_placeholder": "Opció {number}",
   "compose_form.poll.remove_option": "Elimina aquesta opció",
   "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
   "compose_form.poll.switch_to_single": "Canvia l’enquesta per permetre una única opció",
-  "compose_form.publish": "Publica",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Desa els canvis",
   "compose_form.sensitive.hide": "{count, plural, one {Marca contingut com a sensible} other {Marca contingut com a sensible}}",
@@ -118,7 +120,7 @@
   "confirmations.block.confirm": "Bloqueja",
   "confirmations.block.message": "Segur que vols bloquejar a {name}?",
   "confirmations.delete.confirm": "Suprimeix",
-  "confirmations.delete.message": "Segur que vols suprimir aquesta publicació?",
+  "confirmations.delete.message": "Segur que vols eliminar la publicació?",
   "confirmations.delete_list.confirm": "Suprimeix",
   "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?",
   "confirmations.discard_edit_media.confirm": "Descarta",
@@ -138,7 +140,7 @@
   "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
   "conversation.delete": "Elimina la conversa",
   "conversation.mark_as_read": "Marca com a llegida",
-  "conversation.open": "Veure conversa",
+  "conversation.open": "Mostra la conversa",
   "conversation.with": "Amb {names}",
   "directory.federated": "Del fedivers conegut",
   "directory.local": "Només de {domain}",
@@ -147,6 +149,7 @@
   "embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.",
   "embed.preview": "Aquí està quin aspecte tindrà:",
   "emoji_button.activity": "Activitat",
+  "emoji_button.clear": "Neteja",
   "emoji_button.custom": "Personalitzat",
   "emoji_button.flags": "Banderes",
   "emoji_button.food": "Menjar i beure",
@@ -161,12 +164,12 @@
   "emoji_button.symbols": "Símbols",
   "emoji_button.travel": "Viatges i llocs",
   "empty_column.account_suspended": "Compte suspès",
-  "empty_column.account_timeline": "Aquí no hi ha publicacions!",
+  "empty_column.account_timeline": "No hi ha publicacions aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Encara no has bloquejat cap usuari.",
   "empty_column.bookmarked_statuses": "Encara no has marcat com publicació com a preferida. Quan en marquis una apareixerà aquí.",
   "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
-  "empty_column.conversations": "Cada vegada que envies o reps una publicació que és només visible per la gent que hi has mencionat en ella, serà mostrada aquí.",
+  "empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis, es mostraran aquí.",
   "empty_column.domain_blocks": "Encara no hi ha dominis bloquejats.",
   "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
   "empty_column.favourited_statuses": "Encara no has marcat cap publicació com a preferida. Quan les marquis, apareixeran aquí.",
@@ -227,14 +230,14 @@
   "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
   "keyboard_shortcuts.back": "Anar enrere",
   "keyboard_shortcuts.blocked": "Obre la llista d'usuaris bloquejats",
-  "keyboard_shortcuts.boost": "Impulsa publicació",
+  "keyboard_shortcuts.boost": "Impulsa la publicació",
   "keyboard_shortcuts.column": "Centra la columna",
   "keyboard_shortcuts.compose": "Centra l'àrea de composició del text",
-  "keyboard_shortcuts.conversations": "per a obrir la columna de converses",
   "keyboard_shortcuts.description": "Descripció",
+  "keyboard_shortcuts.direct": "per obrir la columna de missatges directes",
   "keyboard_shortcuts.down": "Mou-lo avall en la llista",
-  "keyboard_shortcuts.enter": "Obre publicació",
-  "keyboard_shortcuts.favourite": "Afavorir publicació",
+  "keyboard_shortcuts.enter": "Obrir publicació",
+  "keyboard_shortcuts.favourite": "Afavoreix la publicació",
   "keyboard_shortcuts.favourites": "Obre la llista de preferits",
   "keyboard_shortcuts.federated": "Obre la línia de temps federada",
   "keyboard_shortcuts.heading": "Dreceres de teclat",
@@ -242,7 +245,7 @@
   "keyboard_shortcuts.hotkey": "Tecla d'accés directe",
   "keyboard_shortcuts.legend": "Mostra aquesta llegenda",
   "keyboard_shortcuts.local": "Obre la línia de temps local",
-  "keyboard_shortcuts.mention": "Esmenta l'autor",
+  "keyboard_shortcuts.mention": "Mencionar l'autor",
   "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
   "keyboard_shortcuts.my_profile": "Obre el teu perfil",
   "keyboard_shortcuts.notifications": "Obre la columna de notificacions",
@@ -256,7 +259,7 @@
   "keyboard_shortcuts.start": "Obre la columna \"Primers passos\"",
   "keyboard_shortcuts.toggle_hidden": "Mostra/oculta el text marcat com a sensible",
   "keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut multimèdia",
-  "keyboard_shortcuts.toot": "Inicia una nova publicació",
+  "keyboard_shortcuts.toot": "Iniciar una publicació nova",
   "keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
   "keyboard_shortcuts.up": "Moure amunt en la llista",
   "lightbox.close": "Tanca",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Amplia el quadre de visualització de l’imatge",
   "lightbox.next": "Següent",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Mostra el perfil",
+  "limited_account_hint.title": "Aquest perfil ha estat amagat pels moderadors del servidor.",
   "lists.account.add": "Afegeix a la llista",
   "lists.account.remove": "Elimina de la llista",
   "lists.delete": "Esborra la llista",
@@ -289,7 +294,8 @@
   "navigation_bar.blocks": "Usuaris bloquejats",
   "navigation_bar.bookmarks": "Marcadors",
   "navigation_bar.community_timeline": "Línia de temps local",
-  "navigation_bar.compose": "Redacta una nova publicació",
+  "navigation_bar.compose": "Redactar una nova publicació",
+  "navigation_bar.direct": "Missatges directes",
   "navigation_bar.discover": "Descobrir",
   "navigation_bar.domain_blocks": "Dominis bloquejats",
   "navigation_bar.edit_profile": "Edita el perfil",
@@ -301,7 +307,7 @@
   "navigation_bar.info": "Sobre aquest servidor",
   "navigation_bar.keyboard_shortcuts": "Dreceres de teclat",
   "navigation_bar.lists": "Llistes",
-  "navigation_bar.logout": "Tanca la sessió",
+  "navigation_bar.logout": "Tancar sessió",
   "navigation_bar.mutes": "Usuaris silenciats",
   "navigation_bar.personal": "Personal",
   "navigation_bar.pins": "Publicacions fixades",
@@ -312,11 +318,11 @@
   "notification.favourite": "{name} ha afavorit la teva publicació",
   "notification.follow": "{name} et segueix",
   "notification.follow_request": "{name} ha sol·licitat seguir-te",
-  "notification.mention": "{name} t'ha esmentat",
+  "notification.mention": "{name} t'ha mencionat",
   "notification.own_poll": "La teva enquesta ha finalitzat",
   "notification.poll": "Ha finalitzat una enquesta en què has votat",
-  "notification.reblog": "{name} ha impulsat el teu estat",
-  "notification.status": "ha publicat {name}",
+  "notification.reblog": "{name} ha impulsat la teva publicació",
+  "notification.status": "{name} acaba de publicar",
   "notification.update": "{name} ha editat una publicació",
   "notifications.clear": "Esborra les notificacions",
   "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?",
@@ -362,11 +368,11 @@
   "poll.vote": "Vota",
   "poll.voted": "Vas votar per aquesta resposta",
   "poll.votes": "{votes, plural, one {# vot} other {# vots}}",
-  "poll_button.add_poll": "Afegeix una enquesta",
+  "poll_button.add_poll": "Afegir una enquesta",
   "poll_button.remove_poll": "Elimina l'enquesta",
-  "privacy.change": "Ajusta la privacitat de la publicació",
+  "privacy.change": "Canvia la privacitat de la publicació",
   "privacy.direct.long": "Visible només per als usuaris esmentats",
-  "privacy.direct.short": "Només la gent que menciono",
+  "privacy.direct.short": "Només gent mencionada",
   "privacy.private.long": "Visible només per als seguidors",
   "privacy.private.short": "Només seguidors",
   "privacy.public.long": "Visible per tothom",
@@ -440,12 +446,12 @@
   "search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
   "status.admin_account": "Obre l'interfície de moderació per a @{name}",
-  "status.admin_status": "Obre aquesta publicació a la interfície de moderació",
+  "status.admin_status": "Obrir aquesta publicació a la interfície de moderació",
   "status.block": "Bloqueja @{name}",
   "status.bookmark": "Afavoreix",
   "status.cancel_reblog_private": "Desfés l'impuls",
   "status.cannot_reblog": "Aquesta publicació no es pot impulsar",
-  "status.copy": "Copia l'enllaç a l'estat",
+  "status.copy": "Copia l'enllaç a la publicació",
   "status.delete": "Esborra",
   "status.detailed_status": "Visualització detallada de la conversa",
   "status.direct": "Envia missatge directe a @{name}",
@@ -462,7 +468,7 @@
   "status.mention": "Esmenta @{name}",
   "status.more": "Més",
   "status.mute": "Silencia @{name}",
-  "status.mute_conversation": "Silencia conversació",
+  "status.mute_conversation": "Silencia la conversa",
   "status.open": "Amplia la publicació",
   "status.pin": "Fixa en el perfil",
   "status.pinned": "Publicació fixada",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index 5a64eaebb..a642c8a81 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -18,12 +18,12 @@
   "account.followers": "شوێنکەوتووان",
   "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
   "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
-  "account.following": "Following",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following": "دواکەوتن",
+  "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
   "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
   "account.follows_you": "شوێنکەوتووەکانت",
   "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
-  "account.joined": "Joined {date}",
+  "account.joined": "بەشداری {date}",
   "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
   "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
   "account.media": "میدیا",
@@ -41,18 +41,18 @@
   "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
   "account.unblock": "@{name} لاببە",
   "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "لابردنی بەربەست",
   "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
   "account.unfollow": "بەدوادانەچو",
   "account.unmute": "بێدەنگکردنی @{name}",
   "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
-  "account.unmute_short": "Unmute",
+  "account.unmute_short": "بێدەنگی مەکە",
   "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
-  "admin.dashboard.retention.average": "Average",
-  "admin.dashboard.retention.cohort": "Sign-up month",
-  "admin.dashboard.retention.cohort_size": "New users",
+  "admin.dashboard.daily_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی ڕۆژ دوای ناو تۆمارکردن",
+  "admin.dashboard.monthly_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی مانگ دوای ناو تۆمارکردن",
+  "admin.dashboard.retention.average": "ڕێژە",
+  "admin.dashboard.retention.cohort": "چوونەژوورەوەی مانگانە",
+  "admin.dashboard.retention.cohort_size": "ئەندامی نوێ",
   "alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
   "alert.rate_limited.title": "ڕێژەی سنووردار",
   "alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
@@ -70,7 +70,7 @@
   "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
   "column.bookmarks": "نیشانەکان",
   "column.community": "هێڵی کاتی ناوخۆیی",
-  "column.conversations": "Conversations",
+  "column.direct": "نامە ڕاستەوخۆ",
   "column.directory": "گەڕان لە پرۆفایلەکان",
   "column.domain_blocks": "دۆمەینە داخراوەکان",
   "column.favourites": "دڵخوازترینەکان",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "تەنها خۆماڵی",
   "community.column_settings.media_only": "تەنها میدیا",
   "community.column_settings.remote_only": "تەنها بۆ دوور",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
@@ -106,7 +108,7 @@
   "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
   "compose_form.publish": "توت",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
   "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
   "compose_form.sensitive.marked": "وادەی کۆتایی",
   "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە",
@@ -121,8 +123,8 @@
   "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
   "confirmations.delete_list.confirm": "سڕینەوە",
   "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
-  "confirmations.discard_edit_media.confirm": "Discard",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە",
+  "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟",
   "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
   "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
   "confirmations.logout.confirm": "چوونە دەرەوە",
@@ -147,6 +149,7 @@
   "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
   "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
   "emoji_button.activity": "چالاکی",
+  "emoji_button.clear": "ڕوون",
   "emoji_button.custom": "ئاسایی",
   "emoji_button.flags": "ئاڵاکان",
   "emoji_button.food": "خواردن& خواردنەوە",
@@ -160,22 +163,22 @@
   "emoji_button.search_results": "ئەنجامەکانی گەڕان",
   "emoji_button.symbols": "هێماکان",
   "emoji_button.travel": "گەشت & شوێنەکان",
-  "empty_column.account_suspended": "Account suspended",
-  "empty_column.account_timeline": "لێرە هیچ توتەک نییە!",
+  "empty_column.account_suspended": "هەژمار ڕاگیرا",
+  "empty_column.account_timeline": "لێرە هیچ نووسراوە نییە!",
   "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
   "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
   "empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
   "empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "تا ئێستا هیچ نامەیەکی ڕاستەوخۆت نییە. کاتێک یەکێکیان دەنێری یان وەریدەگریت، لێرە دەردەکەوێت.",
   "empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "لە ئێستادا هیچ شتێک ترێند نییە. دواتر سەیری بکە!",
   "empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
   "empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
-  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+  "empty_column.follow_recommendations": "پێدەچێت هیچ پێشنیارێک بۆ تۆ دروست نەکرێت. دەتوانیت هەوڵبدەیت گەڕان بەکاربهێنیت بۆ گەڕان بەدوای ئەو کەسانەی کە ڕەنگە بیانناسیت یان بەدوای هاشتاگە ڕەوتەکاندا بگەڕێیت.",
   "empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
   "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
   "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
-  "empty_column.home.suggestions": "See some suggestions",
+  "empty_column.home.suggestions": "چەند پێشنیارێک ببینە",
   "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
   "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
   "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
@@ -187,15 +190,15 @@
   "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
   "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
   "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
-  "follow_recommendations.done": "Done",
-  "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
-  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "explore.search_results": "ئەنجامەکانی گەڕان",
+  "explore.suggested_follows": "بۆ تۆ",
+  "explore.title": "گەڕان",
+  "explore.trending_links": "هەواڵەکان",
+  "explore.trending_statuses": "نووسراوەکان",
+  "explore.trending_tags": "هاشتاگ",
+  "follow_recommendations.done": "تەواو",
+  "follow_recommendations.heading": "شوێن ئەو کەسانە بکەون کە دەتەوێت پۆستەکان ببینیت لە! لێرەدا چەند پێشنیارێک هەیە.",
+  "follow_recommendations.lead": "بابەتەکانی ئەو کەسانەی کە بەدوایدا دەگەڕێیت بە فەرمانی کرۆنۆلۆجی لە خواردنەکانی ماڵەکەت دەردەکەون. مەترسە لە هەڵەکردن، دەتوانیت بە ئاسانی خەڵک هەڵبکەیت هەر کاتێک!",
   "follow_request.authorize": "ده‌سه‌ڵاتپێدراو",
   "follow_request.reject": "ڕەتکردنەوە",
   "follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
   "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
   "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "وه‌سف",
+  "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
   "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
   "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
   "keyboard_shortcuts.favourite": "بۆ دڵخواز",
@@ -264,6 +267,8 @@
   "lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
   "lightbox.next": "داهاتوو",
   "lightbox.previous": "پێشوو",
+  "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
+  "limited_account_hint.title": "ئەم پرۆفایلییە لەلایەن بەڕێوەبەرانی سێرڤەرەکەتەوە شاراوەتەوە.",
   "lists.account.add": "زیادکردن بۆ لیست",
   "lists.account.remove": "لابردن لە لیست",
   "lists.delete": "سڕینەوەی لیست",
@@ -271,13 +276,13 @@
   "lists.edit.submit": "گۆڕینی ناونیشان",
   "lists.new.create": "زیادکردنی لیست",
   "lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
-  "lists.replies_policy.followed": "Any followed user",
-  "lists.replies_policy.list": "Members of the list",
-  "lists.replies_policy.none": "No one",
+  "lists.replies_policy.followed": "هەر بەکارهێنەرێکی بەدواکەوتوو",
+  "lists.replies_policy.list": "ئەندامانی لیستەکە",
+  "lists.replies_policy.none": "هیچکەس",
   "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
   "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
   "lists.subheading": "لیستەکانت",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, one {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}",
   "loading_indicator.label": "بارکردن...",
   "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
   "missing_indicator.label": "نەدۆزرایەوە",
@@ -290,10 +295,11 @@
   "navigation_bar.bookmarks": "نیشانکراوەکان",
   "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
   "navigation_bar.compose": "نووسینی توتی نوێ",
+  "navigation_bar.direct": "نامە ڕاستەوخۆ",
   "navigation_bar.discover": "دۆزینەوە",
   "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
   "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "گەڕان",
   "navigation_bar.favourites": "دڵخوازەکان",
   "navigation_bar.filters": "وشە کپەکان",
   "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
@@ -308,7 +314,7 @@
   "navigation_bar.preferences": "پەسەندەکان",
   "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
   "navigation_bar.security": "ئاسایش",
-  "notification.admin.sign_up": "{name} signed up",
+  "notification.admin.sign_up": "{name} تۆمارکرا",
   "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
   "notification.follow": "{name} دوای تۆ کەوت",
   "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
@@ -317,15 +323,15 @@
   "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
   "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
   "notification.status": "{name} تازە بڵاوکرایەوە",
-  "notification.update": "{name} edited a post",
+  "notification.update": "{name} پۆستێکی دەستکاریکرد",
   "notifications.clear": "ئاگانامەکان بسڕیەوە",
   "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:",
   "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
   "notifications.column_settings.favourite": "دڵخوازترین:",
   "notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
   "notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
-  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "نیشاندانی شریتی پاڵافتن",
   "notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
   "notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
   "notifications.column_settings.mention": "ئاماژەکان:",
@@ -335,22 +341,22 @@
   "notifications.column_settings.show": "لە ستووندا پیشان بدە",
   "notifications.column_settings.sound": "لێدانی دەنگ",
   "notifications.column_settings.status": "توتەکانی نوێ:",
-  "notifications.column_settings.unread_notifications.category": "Unread notifications",
-  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
-  "notifications.column_settings.update": "Edits:",
+  "notifications.column_settings.unread_notifications.category": "ئاگاداریی نەبینراو",
+  "notifications.column_settings.unread_notifications.highlight": "تیشک بخە سەر ئاگاداری نەخوێنراو",
+  "notifications.column_settings.update": "دەستکاری:",
   "notifications.filter.all": "هەموو",
   "notifications.filter.boosts": "دووبارەتوتەکان",
   "notifications.filter.favourites": "دڵخوازەکان",
-  "notifications.filter.follows": "شوێنکەوتن",
+  "notifications.filter.follows": "بەدواداچوون",
   "notifications.filter.mentions": "ئاماژەکان",
   "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
   "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
-  "notifications.grant_permission": "Grant permission.",
+  "notifications.grant_permission": "مۆڵەت بدە.",
   "notifications.group": "{count} ئاگانامە",
   "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
   "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
   "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications.permission_required": "ئاگادارکردنەوەکانی سەر مێز بەردەست نین چونکە مۆڵەتی پێویست نەدراوە.",
   "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
   "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
   "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
@@ -361,70 +367,70 @@
   "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
   "poll.vote": "دەنگ",
   "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll.votes": "{votes, plural, one {# دەنگ} other {# دەنگ}}",
   "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
   "poll_button.remove_poll": "ده‌نگدان بسڕه‌وه‌‌",
   "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
   "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "تەنها کەسانی باس کراو",
   "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "تەنیا شوێنکەوتووان",
+  "privacy.public.long": "بۆ هەمووان دیارە",
   "privacy.public.short": "گشتی",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە",
   "privacy.unlisted.short": "لە لیست نەکراو",
   "refresh": "نوێکردنەوە",
   "regeneration_indicator.label": "بارکردن…",
   "regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
   "relative_time.days": "{number}ڕۆژ",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
+  "relative_time.full.hours": "{number, plural, one {# کاتژمێر} other {# کاتژمێر}} ماوە",
+  "relative_time.full.just_now": "ئێستا",
+  "relative_time.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}} ماوە",
+  "relative_time.full.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
   "relative_time.hours": "{number}کات",
   "relative_time.just_now": "ئێستا",
   "relative_time.minutes": "{number}کات",
   "relative_time.seconds": "{number}کات",
   "relative_time.today": "ئیمڕۆ",
   "reply_indicator.cancel": "هەڵوەشاندنەوه",
-  "report.block": "Block",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
-  "report.category.subtitle": "Choose the best match",
-  "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
-  "report.category.title_status": "post",
-  "report.close": "Done",
-  "report.comment.title": "Is there anything else you think we should know?",
+  "report.block": "بلۆک",
+  "report.block_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان ناتوانن بابەتەکانتان ببینن یان شوێنتان بکەون. ئەوان دەتوانن بڵێن کە بەربەستکراون.",
+  "report.categories.other": "هی تر",
+  "report.categories.spam": "سپام",
+  "report.categories.violation": "ناوەڕۆک یەک یان زیاتر لە یاساکانی سێرڤەر پێشێل دەکات",
+  "report.category.subtitle": "باشترین هاوتا هەڵبژێرە",
+  "report.category.title": "پێمان بڵێ بە {type} چی ڕوودەدات",
+  "report.category.title_account": "پرۆفایل",
+  "report.category.title_status": "پۆست",
+  "report.close": "تەواو",
+  "report.comment.title": "ئایا هیچ شتێکی تر هەیە کە پێت وایە ئێمە دەبێت بزانین?",
   "report.forward": "ناردن بۆ {target}",
   "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
-  "report.mute": "Mute",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
-  "report.next": "Next",
+  "report.mute": "بێدەنگ",
+  "report.mute_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان هێشتا دەتوانن شوێنتان بکەون و پۆستەکانتان ببینن و نازانن کە ئەوان بێ دەنگن.",
+  "report.next": "دواتر",
   "report.placeholder": "سەرنجەکانی زیاتر",
-  "report.reasons.dislike": "I don't like it",
-  "report.reasons.dislike_description": "It is not something you want to see",
-  "report.reasons.other": "It's something else",
-  "report.reasons.other_description": "The issue does not fit into other categories",
-  "report.reasons.spam": "It's spam",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
-  "report.reasons.violation": "It violates server rules",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
-  "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.reasons.dislike": "حەزم لێی نییە",
+  "report.reasons.dislike_description": "ئەوە شتێک نیە کە دەتەوێت بیبینیت",
+  "report.reasons.other": "شتێکی ترە",
+  "report.reasons.other_description": "کێشەکە ناگونجێت بۆ هاوپۆلەکانی تر",
+  "report.reasons.spam": "ئەوە سپامە",
+  "report.reasons.spam_description": "لینکە خراپەکان، بەشداری ساختە، یان وەڵامدانەوەی دووبارە",
+  "report.reasons.violation": "یاساکانی سێرڤەر پێشێل دەکات",
+  "report.reasons.violation_description": "ئاگاداری ئەوەن کە یاسا تایبەتەکان دەشکێنێت",
+  "report.rules.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+  "report.rules.title": "کام یاسا پێشێل دەکرێت؟",
+  "report.statuses.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+  "report.statuses.title": "ئایا هیچ پۆستێک هەیە کە پشتگیری ئەم ڕاپۆرتە بکات؟",
   "report.submit": "ناردن",
   "report.target": "گوزارشتکردنی{target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.thanks.take_action": "لێرەدا بژاردەکانت بۆ کۆنترۆڵکردنی ئەو شتانە دەخەینەڕوو کە لە ماستۆدۆن دەیبینیت:",
+  "report.thanks.take_action_actionable": "لە کاتێکدا ئێمە پێداچوونەوە بەم بابەتە دەکەین، دەتوانیت ڕێوشوێن بگریتەبەر دژی @{name}:",
+  "report.thanks.title": "ناتەوێت ئەمە ببینیت؟",
+  "report.thanks.title_actionable": "سوپاس بۆ ڕاپۆرتکردن، ئێمە سەیری ئەم بابەتە دەکەین.",
+  "report.unfollow": "بەدوادانەچوو@{name}",
+  "report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.",
   "search.placeholder": "گەڕان",
   "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
   "search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
@@ -433,7 +439,7 @@
   "search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
   "search_popout.tips.user": "بەکارهێنەر",
   "search_results.accounts": "خەڵک",
-  "search_results.all": "All",
+  "search_results.all": "هەموو",
   "search_results.hashtags": "هەشتاگ",
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "توتەکان",
@@ -449,14 +455,14 @@
   "status.delete": "سڕینەوە",
   "status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
   "status.direct": "پەیامی ڕاستەوخۆ @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "دەستکاری",
+  "status.edited": "بەشداری {date}",
+  "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
   "status.embed": "نیشتەجێ بکە",
   "status.favourite": "دڵخواز",
   "status.filtered": "پاڵاوتن",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} دروستکراوە لە{date}",
+  "status.history.edited": "{name} دروستکاریکراوە لە{date}",
   "status.load_more": "زیاتر بار بکە",
   "status.media_hidden": "میدیای شاراوە",
   "status.mention": "ناوبنێ @{name}",
@@ -514,14 +520,14 @@
   "upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.",
   "upload_form.audio_description": "پەیامەکەت بۆ نابیستەکان",
   "upload_form.description": "پەیامەکەت بۆ نابیناکان",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "هیچ وەسفێک زیاد نەکراوە",
   "upload_form.edit": "دەستکاری",
   "upload_form.thumbnail": "گۆڕانی وینۆچکە",
   "upload_form.undo": "بیسڕەوە",
   "upload_form.video_description": "پەیامەکەت بۆ نابیست و نابیناکان",
   "upload_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…",
   "upload_modal.apply": "بیسەپێنە",
-  "upload_modal.applying": "Applying…",
+  "upload_modal.applying": "داواکاری…",
   "upload_modal.choose_image": "وێنە هەڵبژێرە",
   "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
   "upload_modal.detect_text": "نووسینی ناو وێنەکە دەستنیشان بکە",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 770bd71bc..d2db35f16 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -70,7 +70,7 @@
   "column.blocks": "Utilizatori bluccati",
   "column.bookmarks": "Segnalibri",
   "column.community": "Linea pubblica lucale",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Percorre i prufili",
   "column.domain_blocks": "Duminii piattati",
   "column.favourites": "Favuriti",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Solu lucale",
   "community.column_settings.media_only": "Solu media",
   "community.column_settings.remote_only": "Solu distante",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Amparà di più",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Stu statutu ùn hè \"Micca listatu\" è ùn sarà micca listatu indè e circate da hashtag. Per esse vistu in quesse, u statutu deve esse \"Pubblicu\".",
@@ -147,6 +149,7 @@
   "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.",
   "embed.preview": "Hà da parè à quessa:",
   "emoji_button.activity": "Attività",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Persunalizati",
   "emoji_button.flags": "Bandere",
   "emoji_button.food": "Manghjusca è Bienda",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.",
   "empty_column.bookmarked_statuses": "Ùn avete manc'un segnalibru. Quandu aghjunghjerate unu, sarà mustratu quì.",
   "empty_column.community": "Ùn c'hè nunda indè a linea lucale. Scrivete puru qualcosa!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Ùn c'hè manc'un duminiu bluccatu avà.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Ùn avete manc'unu statutu favuritu. Quandu aghjunghjerate unu à i vostri favuriti, sarà mustratu quì.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "sparte",
   "keyboard_shortcuts.column": "fucalizà un statutu indè una colonna",
   "keyboard_shortcuts.compose": "fucalizà nant'à l'area di ridazzione",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descrizzione",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "falà indè a lista",
   "keyboard_shortcuts.enter": "apre u statutu",
   "keyboard_shortcuts.favourite": "aghjunghje à i favuriti",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti",
   "lightbox.next": "Siguente",
   "lightbox.previous": "Pricidente",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Aghjunghje à a lista",
   "lists.account.remove": "Toglie di a lista",
   "lists.delete": "Toglie a lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Segnalibri",
   "navigation_bar.community_timeline": "Linea pubblica lucale",
   "navigation_bar.compose": "Scrive un novu statutu",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Scopre",
   "navigation_bar.domain_blocks": "Duminii piattati",
   "navigation_bar.edit_profile": "Mudificà u prufile",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index df1e750b7..91dda4f44 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokovaní uživatelé",
   "column.bookmarks": "Záložky",
   "column.community": "Místní časová osa",
-  "column.conversations": "Konverzace",
+  "column.direct": "Přímé zprávy",
   "column.directory": "Prozkoumat profily",
   "column.domain_blocks": "Blokované domény",
   "column.favourites": "Oblíbené",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Pouze místní",
   "community.column_settings.media_only": "Pouze média",
   "community.column_settings.remote_only": "Pouze vzdálené",
+  "compose.language.change": "Změnit jazyk",
+  "compose.language.search": "Prohledat jazyky...",
   "compose_form.direct_message_warning_learn_more": "Zjistit více",
   "compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné nebezpečné informace.",
   "compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné příspěvky mohou být vyhledány podle hashtagu.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
   "embed.preview": "Takhle to bude vypadat:",
   "emoji_button.activity": "Aktivita",
+  "emoji_button.clear": "Vyčistit",
   "emoji_button.custom": "Vlastní",
   "emoji_button.flags": "Vlajky",
   "emoji_button.food": "Jídla a nápoje",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.",
   "empty_column.bookmarked_statuses": "Ještě nemáte v záložkách žádné příspěvky. Pokud si do nich nějaký přidáte, zobrazí se zde.",
   "empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
-  "empty_column.conversations": "Jakmile pošlete nebo obdržíte příspěvek, který je viditelný pouze lidem v něm zmíněným, objeví se tady.",
+  "empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.",
   "empty_column.domain_blocks": "Ještě nemáte žádné blokované domény.",
   "empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!",
   "empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené příspěvky. Pokud si nějaký oblíbíte, zobrazí se zde.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Boostnout příspěvek",
   "keyboard_shortcuts.column": "Focus na sloupec",
   "keyboard_shortcuts.compose": "Focus na textové pole nového příspěvku",
-  "keyboard_shortcuts.conversations": "Otevřít sloupec konverzací",
   "keyboard_shortcuts.description": "Popis",
+  "keyboard_shortcuts.direct": "Otevřít sloupec přímých zpráv",
   "keyboard_shortcuts.down": "Posunout dolů v seznamu",
   "keyboard_shortcuts.enter": "Otevřít příspěvek",
   "keyboard_shortcuts.favourite": "Oblíbit příspěvek",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ukázat obrázek v plné velikosti",
   "lightbox.next": "Další",
   "lightbox.previous": "Předchozí",
+  "limited_account_hint.action": "Přesto profil zobrazit",
+  "limited_account_hint.title": "Tento profil byl skryt moderátory vašeho serveru.",
   "lists.account.add": "Přidat do seznamu",
   "lists.account.remove": "Odebrat ze seznamu",
   "lists.delete": "Smazat seznam",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Záložky",
   "navigation_bar.community_timeline": "Místní časová osa",
   "navigation_bar.compose": "Vytvořit nový příspěvek",
+  "navigation_bar.direct": "Přímé zprávy",
   "navigation_bar.discover": "Objevujte",
   "navigation_bar.domain_blocks": "Blokované domény",
   "navigation_bar.edit_profile": "Upravit profil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Odstranit anketu",
   "privacy.change": "Změnit soukromí příspěvku",
   "privacy.direct.long": "Viditelný pouze pro zmíněné uživatele",
-  "privacy.direct.short": "Pouze lidé, které zmíním",
+  "privacy.direct.short": "Jen zmínění lidé",
   "privacy.private.long": "Viditelný pouze pro sledující",
   "privacy.private.short": "Pouze sledující",
   "privacy.public.long": "Viditelný pro všechny",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 7edb1d1cf..2a29cbbfb 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -70,7 +70,7 @@
   "column.blocks": "Defnyddwyr a flociwyd",
   "column.bookmarks": "Tudalnodau",
   "column.community": "Ffrwd lleol",
-  "column.conversations": "Sgyrsiau",
+  "column.direct": "Negeseuon preifat",
   "column.directory": "Pori proffiliau",
   "column.domain_blocks": "Parthau cuddiedig",
   "column.favourites": "Ffefrynnau",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Lleol yn unig",
   "community.column_settings.media_only": "Cyfryngau yn unig",
   "community.column_settings.remote_only": "Anghysbell yn unig",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Dysgu mwy",
   "compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth beryglus dros Mastodon.",
   "compose_form.hashtag_warning": "Ni fydd y post hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond postiadau cyhoeddus gellid chwilio amdanynt drwy hashnod.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
   "embed.preview": "Dyma sut olwg fydd arno:",
   "emoji_button.activity": "Gweithgarwch",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Unigryw",
   "emoji_button.flags": "Baneri",
   "emoji_button.food": "Bwyd a Diod",
@@ -166,10 +169,10 @@
   "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
   "empty_column.bookmarked_statuses": "Nid oes gennych unrhyw dwtiau tudalnodiedig eto. Pan y byddwch yn tudalnodi un, mi fydd yn ymddangos yma.",
   "empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!",
-  "empty_column.conversations": "Unwaith y byddwch chi'n anfon neu'n derbyn post sydd ond yn weladwy i'r bobl a grybwyllir ynddo, bydd yn ymddangos yma.",
+  "empty_column.direct": "Does gennych unrhyw negeseuon preifat eto. Pan byddwch yn anfon neu derbyn un, bydd yn ymddangos yma.",
   "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
   "empty_column.explore_statuses": "Does dim byd yn trendio ar hyn o bryd. Gwiriwch yn ôl yn nes ymlaen!",
-  "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
+  "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff bostiadau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
   "empty_column.favourites": "Does neb wedi hoffi'r post hwn eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.",
   "empty_column.follow_recommendations": "Does dim awgrymiadau yma i chi. Gallwch geisio chwilio am bobl yr ydych yn eu hadnabod neu archwilio hashnodau sy'n trendio.",
   "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, byddent yn ymddangos yma.",
@@ -191,8 +194,8 @@
   "explore.suggested_follows": "I chi",
   "explore.title": "Archwilio",
   "explore.trending_links": "Newyddion",
-  "explore.trending_statuses": "Postiau",
-  "explore.trending_tags": "Hanshnodau",
+  "explore.trending_statuses": "Postiadau",
+  "explore.trending_tags": "Hashnodau",
   "follow_recommendations.done": "Wedi gorffen",
   "follow_recommendations.heading": "Dilynwch y bobl yr hoffech chi weld eu postiadau! Dyma ambell i awgrymiad.",
   "follow_recommendations.lead": "Bydd postiadau gan bobl rydych chi'n eu dilyn yn ymddangos mewn trefn amser ar eich ffrwd cartref. Peidiwch â bod ofn gwneud camgymeriadau, gallwch chi ddad-ddilyn pobl yr un mor hawdd unrhyw bryd!",
@@ -222,7 +225,7 @@
   "home.column_settings.show_replies": "Dangos ymatebion",
   "home.hide_announcements": "Cuddio cyhoeddiadau",
   "home.show_announcements": "Dangos cyhoeddiadau",
-  "intervals.full.days": "{number, plural, one {# ddydd} other {# o ddyddiau}}",
+  "intervals.full.days": "{number, plural, one {# dydd} two {# ddydd} other {# o ddyddiau}}",
   "intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}",
   "intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}",
   "keyboard_shortcuts.back": "i lywio nôl",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "i fŵstio",
   "keyboard_shortcuts.column": "Ffocysu colofn",
   "keyboard_shortcuts.compose": "i ffocysu yr ardal cyfansoddi testun",
-  "keyboard_shortcuts.conversations": "i agor colofn sgyrsiau",
   "keyboard_shortcuts.description": "Disgrifiad",
+  "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat",
   "keyboard_shortcuts.down": "i symud lawr yn y rhestr",
   "keyboard_shortcuts.enter": "Agor post",
   "keyboard_shortcuts.favourite": "i hoffi",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ehangu blwch gweld delwedd",
   "lightbox.next": "Nesaf",
   "lightbox.previous": "Blaenorol",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Ychwanegwch at restr",
   "lists.account.remove": "Dileu o'r rhestr",
   "lists.delete": "Dileu rhestr",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Tudalnodau",
   "navigation_bar.community_timeline": "Ffrwd leol",
   "navigation_bar.compose": "Cyfansoddi post newydd",
+  "navigation_bar.direct": "Negeseuon preifat",
   "navigation_bar.discover": "Darganfod",
   "navigation_bar.domain_blocks": "Parthau cuddiedig",
   "navigation_bar.edit_profile": "Golygu proffil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Tynnu pleidlais",
   "privacy.change": "Addasu preifatrwdd y post",
   "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig",
-  "privacy.direct.short": "Dim ond pobl rwy'n eu crybwyll",
+  "privacy.direct.short": "Pobl sy wedi'u crybwyll yn unig",
   "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig",
   "privacy.private.short": "Dilynwyr yn unig",
   "privacy.public.long": "Gweladwy i bawb",
@@ -376,7 +382,7 @@
   "refresh": "Adnewyddu",
   "regeneration_indicator.label": "Llwytho…",
   "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
-  "relative_time.days": "{number}dydd",
+  "relative_time.days": "{number} dydd",
   "relative_time.full.days": "{number, plural, one {# dydd} other {# o ddyddiau}} yn ôl",
   "relative_time.full.hours": "{number, plural, one {# awr} other {# o oriau}} yn ôl",
   "relative_time.full.just_now": "jyst nawr",
@@ -385,7 +391,7 @@
   "relative_time.hours": "{number} awr",
   "relative_time.just_now": "nawr",
   "relative_time.minutes": "{number} munud",
-  "relative_time.seconds": "{number}eiliad",
+  "relative_time.seconds": "{number} eiliad",
   "relative_time.today": "heddiw",
   "reply_indicator.cancel": "Canslo",
   "report.block": "Blocio",
@@ -434,7 +440,7 @@
   "search_popout.tips.user": "defnyddiwr",
   "search_results.accounts": "Pobl",
   "search_results.all": "Popeth",
-  "search_results.hashtags": "Hanshnodau",
+  "search_results.hashtags": "Hashnodau",
   "search_results.nothing_found": "Methu dod o hyd i unrhyw beth ar gyfer y termau chwilio hyn",
   "search_results.statuses": "Postiadau",
   "search_results.statuses_fts_disabled": "Nid yw chwilio postiadau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
@@ -465,11 +471,11 @@
   "status.mute_conversation": "Tawelu sgwrs",
   "status.open": "Ehangu'r post hwn",
   "status.pin": "Pinio ar y proffil",
-  "status.pinned": "Pinio post",
+  "status.pinned": "Post wedi'i binio",
   "status.read_more": "Darllen mwy",
   "status.reblog": "Hybu",
   "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
-  "status.reblogged_by": "Hybio {name}",
+  "status.reblogged_by": "Hybodd {name}",
   "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
   "status.redraft": "Dileu & ailddrafftio",
   "status.remove_bookmark": "Tynnu'r tudalnod",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index e04a0634c..5a03f86d0 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokerede brugere",
   "column.bookmarks": "Bogmærker",
   "column.community": "Lokal tidslinje",
-  "column.conversations": "Konversationer",
+  "column.direct": "Direkte beskeder",
   "column.directory": "Tjek profiler",
   "column.domain_blocks": "Blokerede domæner",
   "column.favourites": "Favoritter",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Kun lokalt",
   "community.column_settings.media_only": "Kun medier",
   "community.column_settings.remote_only": "Kun udefra",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Få mere at vide",
   "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende krypteret. Del derfor ikke sensitiv information over Mastodon.",
   "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.",
   "embed.preview": "Sådan kommer det til at se ud:",
   "emoji_button.activity": "Aktivitet",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Tilpasset",
   "emoji_button.flags": "Flag",
   "emoji_button.food": "Mad og drikke",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ingen brugere blokeret endnu.",
   "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.",
   "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!",
-  "empty_column.conversations": "Når der sendes eller modtages indlæg, som kun er synligt for personer nævnt heri, vil de dukke op her.",
+  "empty_column.direct": "Der er endnu ingen direkte beskeder. Når en sendes eller modtages, dukker den op hér.",
   "empty_column.domain_blocks": "Ingen blokerede domæner endnu.",
   "empty_column.explore_statuses": "Ingen nye tendensen pt. Tjek igen senere!",
   "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Boost indlæg",
   "keyboard_shortcuts.column": "Fokusér kolonne",
   "keyboard_shortcuts.compose": "Fokusér skriveområdet",
-  "keyboard_shortcuts.conversations": "for at åbne konversationskolonnen",
   "keyboard_shortcuts.description": "Beskrivelse",
+  "keyboard_shortcuts.direct": "for at åbne direkte beskeder-kolonnen",
   "keyboard_shortcuts.down": "Flyt nedad på listen",
   "keyboard_shortcuts.enter": "Åbn indlæg",
   "keyboard_shortcuts.favourite": "Favoritmarkér indlæg",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Udvid billedevisningsfelt",
   "lightbox.next": "Næste",
   "lightbox.previous": "Forrige",
+  "limited_account_hint.action": "Vis profil alligevel",
+  "limited_account_hint.title": "Denne profil er blevet skjult af servermoderatorerne.",
   "lists.account.add": "Føj til liste",
   "lists.account.remove": "Fjern fra liste",
   "lists.delete": "Slet liste",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bogmærker",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.compose": "Skriv nyt indlæg",
+  "navigation_bar.direct": "Direkte beskeder",
   "navigation_bar.discover": "Opdag",
   "navigation_bar.domain_blocks": "Blokerede domæner",
   "navigation_bar.edit_profile": "Redigér profil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Fjern afstemning",
   "privacy.change": "Justér indlægsfortrolighed",
   "privacy.direct.long": "Kun synlig for nævnte brugere",
-  "privacy.direct.short": "Kun personer, jeg nævner",
+  "privacy.direct.short": "Kun nævnte personer",
   "privacy.private.long": "Kun synlig for følgere",
   "privacy.private.short": "Kun følgere",
   "privacy.public.long": "Synlig for alle",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 1a36fa736..66b8cc9ba 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -13,10 +13,10 @@
   "account.domain_blocked": "Domain versteckt",
   "account.edit_profile": "Profil bearbeiten",
   "account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet",
-  "account.endorse": "Im Profil anzeigen",
+  "account.endorse": "Auf Profil hervorheben",
   "account.follow": "Folgen",
   "account.followers": "Follower",
-  "account.followers.empty": "Diesem Profil folgt bislang niemand.",
+  "account.followers.empty": "Diesem Profil folgt noch niemand.",
   "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
   "account.following": "Folgt",
   "account.following_counter": "{count, plural, one {{counter} Folgt} other {{counter} Folgt}}",
@@ -70,7 +70,7 @@
   "column.blocks": "Blockierte Profile",
   "column.bookmarks": "Lesezeichen",
   "column.community": "Lokale Zeitleiste",
-  "column.conversations": "Konversationen",
+  "column.direct": "Mensaxes directas",
   "column.directory": "Profile durchsuchen",
   "column.domain_blocks": "Blockierte Domains",
   "column.favourites": "Favoriten",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Nur lokal",
   "community.column_settings.media_only": "Nur Medien",
   "community.column_settings.remote_only": "Nur entfernt",
+  "compose.language.change": "Sprache ändern",
+  "compose.language.search": "Sprachen durchsuchen...",
   "compose_form.direct_message_warning_learn_more": "Mehr erfahren",
   "compose_form.encryption_warning": "Beiträge auf Mastodon sind nicht Ende-zu-Ende-verschlüsselt. Teile keine sensiblen Informationen über Mastodon.",
   "compose_form.hashtag_warning": "Dieser Beitrag wird nicht durch Hashtags entdeckbar sein, weil er ungelistet ist. Nur öffentliche Beiträge tauchen in Hashtag-Zeitleisten auf.",
@@ -133,7 +135,7 @@
   "confirmations.redraft.confirm": "Löschen und neu erstellen",
   "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Beitrag werden verwaist sein.",
   "confirmations.reply.confirm": "Antworten",
-  "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
+  "confirmations.reply.message": "Wenn du jetzt antwortest wird die gesamte Nachricht verworfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
   "confirmations.unfollow.confirm": "Entfolgen",
   "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?",
   "conversation.delete": "Unterhaltung löschen",
@@ -147,6 +149,7 @@
   "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.",
   "embed.preview": "So wird es aussehen:",
   "emoji_button.activity": "Aktivitäten",
+  "emoji_button.clear": "Leeren",
   "emoji_button.custom": "Eigene",
   "emoji_button.flags": "Flaggen",
   "emoji_button.food": "Essen und Trinken",
@@ -165,8 +168,8 @@
   "empty_column.account_unavailable": "Konto nicht verfügbar",
   "empty_column.blocks": "Du hast keine Profile blockiert.",
   "empty_column.bookmarked_statuses": "Du hast bis jetzt keine Beiträge als Lesezeichen gespeichert. Wenn du einen Beitrag als Lesezeichen speicherst wird er hier erscheinen.",
-  "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!",
-  "empty_column.conversations": "Sobald du einen Beitrag sendest oder empfängst, der nur für die in ihm erwähnten Personen sichtbar ist, wird er hier angezeigt.",
+  "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!",
+  "empty_column.direct": "Du hast noch keine Direktnachrichten. Sobald du eine sendest oder empfängst, wird sie hier zu sehen sein.",
   "empty_column.domain_blocks": "Es sind noch keine Domains versteckt.",
   "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder!",
   "empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.",
@@ -174,7 +177,7 @@
   "empty_column.follow_recommendations": "Es sieht so aus, als könnten keine Vorschläge für dich generiert werden. Du kannst versuchen nach Leuten zu suchen, die du vielleicht kennst oder du kannst angesagte Hashtags erkunden.",
   "empty_column.follow_requests": "Du hast noch keine Folge-Anfragen. Sobald du eine erhältst, wird sie hier angezeigt.",
   "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.",
-  "empty_column.home": "Deine Startseite ist leer! Besuche {public} oder nutze die Suche, um loszulegen und andere Leute zu finden.",
+  "empty_column.home": "Deine Startseite ist leer! Folge mehr Leuten, um sie zu füllen. {suggestions}",
   "empty_column.home.suggestions": "Ein paar Vorschläge ansehen",
   "empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen werden sie hier erscheinen.",
   "empty_column.lists": "Du hast noch keine Listen. Wenn du eine anlegst, wird sie hier angezeigt.",
@@ -198,7 +201,7 @@
   "follow_recommendations.lead": "Beiträge von Personen, denen du folgst, werden in chronologischer Reihenfolge auf deiner Startseite angezeigt. Hab keine Angst, Fehler zu machen, du kannst den Leuten jederzeit wieder entfolgen!",
   "follow_request.authorize": "Erlauben",
   "follow_request.reject": "Ablehnen",
-  "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Mitarbeiter von {domain} gedacht, dass es besser wäre den Follow manuell zu bestätigen.",
+  "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Moderator_innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.",
   "generic.saved": "Gespeichert",
   "getting_started.developers": "Entwickler",
   "getting_started.directory": "Profilverzeichnis",
@@ -225,13 +228,13 @@
   "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}",
   "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}",
   "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}",
-  "keyboard_shortcuts.back": "zurück navigieren",
+  "keyboard_shortcuts.back": "Zurück navigieren",
   "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen",
   "keyboard_shortcuts.boost": "teilen",
   "keyboard_shortcuts.column": "einen Beitrag in einer der Spalten fokussieren",
   "keyboard_shortcuts.compose": "fokussiere das Eingabefeld",
-  "keyboard_shortcuts.conversations": "um die Konversationsspalte zu öffnen",
   "keyboard_shortcuts.description": "Beschreibung",
+  "keyboard_shortcuts.direct": "um Direktnachrichtenspalte zu öffnen",
   "keyboard_shortcuts.down": "sich in der Liste hinunter bewegen",
   "keyboard_shortcuts.enter": "Beitrag öffnen",
   "keyboard_shortcuts.favourite": "um zu favorisieren",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Bildansicht erweitern",
   "lightbox.next": "Weiter",
   "lightbox.previous": "Zurück",
+  "limited_account_hint.action": "Profil trotzdem anzeigen",
+  "limited_account_hint.title": "Dieses Profil wurde von den Moderatoren deines Servers versteckt.",
   "lists.account.add": "Zur Liste hinzufügen",
   "lists.account.remove": "Von der Liste entfernen",
   "lists.delete": "Liste löschen",
@@ -279,7 +284,7 @@
   "lists.subheading": "Deine Listen",
   "load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}",
   "loading_indicator.label": "Wird geladen …",
-  "media_gallery.toggle_visible": "Sichtbarkeit umschalten",
+  "media_gallery.toggle_visible": "{number, plural, one {Bild verbergen} other {Bilder verbergen}}",
   "missing_indicator.label": "Nicht gefunden",
   "missing_indicator.sublabel": "Die Ressource konnte nicht gefunden werden",
   "mute_modal.duration": "Dauer",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Lesezeichen",
   "navigation_bar.community_timeline": "Lokale Zeitleiste",
   "navigation_bar.compose": "Neuen Beitrag verfassen",
+  "navigation_bar.direct": "Direktnachrichten",
   "navigation_bar.discover": "Entdecken",
   "navigation_bar.domain_blocks": "Versteckte Domains",
   "navigation_bar.edit_profile": "Profil bearbeiten",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Umfrage entfernen",
   "privacy.change": "Sichtbarkeit des Beitrags anpassen",
   "privacy.direct.long": "Wird an erwähnte Profile gesendet",
-  "privacy.direct.short": "Nur Leute, die ich erwähne",
+  "privacy.direct.short": "Nur erwähnte Personen",
   "privacy.private.long": "Nur für Folgende sichtbar",
   "privacy.private.short": "Nur Follower",
   "privacy.public.long": "Für alle sichtbar",
@@ -392,23 +398,23 @@
   "report.block_explanation": "Du wirst die Beiträge von diesem Konto nicht sehen. Das Konto wird nicht in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird wissen, dass du das Konto blockiert hast.",
   "report.categories.other": "Andere",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Inhalt verletzt ein oder mehrere Server-Regeln",
-  "report.category.subtitle": "Wähle die beste Zugehörigkeit",
-  "report.category.title": "Sag uns, was mit diesem {type} vor sich geht",
+  "report.categories.violation": "Der Inhalt verletzt eine oder mehrere Server-Regeln",
+  "report.category.subtitle": "Wähle die passendste Kategorie",
+  "report.category.title": "Sag uns, was das Problem mit diesem {type} ist",
   "report.category.title_account": "Profil",
   "report.category.title_status": "Beitrag",
   "report.close": "Fertig",
   "report.comment.title": "Gibt es etwas anderes, was wir wissen sollten?",
   "report.forward": "An {target} weiterleiten",
-  "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?",
+  "report.forward_hint": "Dieses Konto gehört zu einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden?",
   "report.mute": "Stummschalten",
   "report.mute_explanation": "Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immernoch folgen und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stumm geschaltet hast.",
   "report.next": "Weiter",
   "report.placeholder": "Zusätzliche Kommentare",
   "report.reasons.dislike": "Das gefällt mir nicht",
-  "report.reasons.dislike_description": "Das ist nicht etwas, was ihr nicht sehen wollt",
+  "report.reasons.dislike_description": "Es ist etwas, das du nicht sehen willst",
   "report.reasons.other": "Da ist was anderes",
-  "report.reasons.other_description": "Das Problem passt nicht in eine der Kategorien",
+  "report.reasons.other_description": "Das Problem passt nicht in die Kategorien",
   "report.reasons.spam": "Das ist Spam",
   "report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten",
   "report.reasons.violation": "Es verstößt gegen Serverregeln",
@@ -419,10 +425,10 @@
   "report.statuses.title": "Gibt es Beiträge, die diesen Bericht unterstützen?",
   "report.submit": "Absenden",
   "report.target": "{target} melden",
-  "report.thanks.take_action": "Hier sind deine Optionen, die es dir erlauben zu kontrollieren, was du auf Mastodon sehen möchtest:",
+  "report.thanks.take_action": "Das sind deine Möglichkeiten, zu bestimmen, was du auf Mastodon sehen möchtest:",
   "report.thanks.take_action_actionable": "Während wir dies überprüfen, kannst du gegen @{name} vorgehen:",
   "report.thanks.title": "Möchtest du das nicht sehen?",
-  "report.thanks.title_actionable": "Vielen Dank für die Berichterstattung, wir werden uns damit befassen.",
+  "report.thanks.title_actionable": "Vielen Dank für die Meldung, wir werden uns das ansehen.",
   "report.unfollow": "@{name} entfolgen",
   "report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.",
   "search.placeholder": "Suche",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index b699088d4..50f166021 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -75,6 +75,14 @@
       {
         "defaultMessage": "Unmute notifications from @{name}",
         "id": "account.unmute_notifications"
+      },
+      {
+        "defaultMessage": "Mute @{name}",
+        "id": "account.mute"
+      },
+      {
+        "defaultMessage": "Block @{name}",
+        "id": "account.block"
       }
     ],
     "path": "app/javascript/mastodon/components/account.json"
@@ -790,6 +798,19 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "This profile has been hidden by the moderators of your server.",
+        "id": "limited_account_hint.title"
+      },
+      {
+        "defaultMessage": "Show profile anyway",
+        "id": "limited_account_hint.action"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/account_timeline/components/limited_account_hint.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "{name} has moved to:",
         "id": "account.moved_to"
       }
@@ -1239,6 +1260,23 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Change language",
+        "id": "compose.language.change"
+      },
+      {
+        "defaultMessage": "Search languages...",
+        "id": "compose.language.search"
+      },
+      {
+        "defaultMessage": "Clear",
+        "id": "emoji_button.clear"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/compose/components/language_dropdown.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Edit profile",
         "id": "navigation_bar.edit_profile"
       }
@@ -1326,7 +1364,7 @@
         "id": "privacy.private.long"
       },
       {
-        "defaultMessage": "Only people I mention",
+        "defaultMessage": "Mentioned people only",
         "id": "privacy.direct.short"
       },
       {
@@ -1508,7 +1546,7 @@
         "id": "compose_form.hashtag_warning"
       },
       {
-        "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+        "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
         "id": "compose_form.encryption_warning"
       },
       {
@@ -1616,12 +1654,20 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Conversations",
-        "id": "column.conversations"
+        "defaultMessage": "Direct messages",
+        "id": "column.direct"
+      },
+      {
+        "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+        "id": "compose_form.encryption_warning"
+      },
+      {
+        "defaultMessage": "Learn more",
+        "id": "compose_form.direct_message_warning_learn_more"
       },
       {
-        "defaultMessage": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
-        "id": "empty_column.conversations"
+        "defaultMessage": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+        "id": "empty_column.direct"
       }
     ],
     "path": "app/javascript/mastodon/features/direct_timeline/index.json"
@@ -1881,6 +1927,10 @@
         "id": "timeline_hint.resources.followers"
       },
       {
+        "defaultMessage": "Account suspended",
+        "id": "empty_column.account_suspended"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -1898,6 +1948,10 @@
         "id": "timeline_hint.resources.follows"
       },
       {
+        "defaultMessage": "Account suspended",
+        "id": "empty_column.account_suspended"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -1965,8 +2019,8 @@
         "id": "navigation_bar.explore"
       },
       {
-        "defaultMessage": "Conversations",
-        "id": "column.conversations"
+        "defaultMessage": "Direct messages",
+        "id": "navigation_bar.direct"
       },
       {
         "defaultMessage": "Bookmarks",
@@ -2222,8 +2276,8 @@
         "id": "keyboard_shortcuts.federated"
       },
       {
-        "defaultMessage": "to open conversations column",
-        "id": "keyboard_shortcuts.conversations"
+        "defaultMessage": "to open direct messages column",
+        "id": "keyboard_shortcuts.direct"
       },
       {
         "defaultMessage": "to open \"get started\" column",
@@ -3526,8 +3580,8 @@
         "id": "tabs_bar.federated_timeline"
       },
       {
-        "defaultMessage": "Conversations",
-        "id": "column.conversations"
+        "defaultMessage": "Direct messages",
+        "id": "navigation_bar.direct"
       },
       {
         "defaultMessage": "Favourites",
@@ -3670,4 +3724,4 @@
     ],
     "path": "app/javascript/mastodon/features/video/index.json"
   }
-]
\ No newline at end of file
+]
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 5a6af8291..f9f62b9cb 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -70,7 +70,7 @@
   "column.blocks": "Αποκλεισμένοι χρήστες",
   "column.bookmarks": "Σελιδοδείκτες",
   "column.community": "Τοπική ροή",
-  "column.conversations": "Συνομιλίες",
+  "column.direct": "Προσωπικά μηνύματα",
   "column.directory": "Δες προφίλ",
   "column.domain_blocks": "Κρυμμένοι τομείς",
   "column.favourites": "Αγαπημένα",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Τοπικά μόνο",
   "community.column_settings.media_only": "Μόνο πολυμέσα",
   "community.column_settings.remote_only": "Απομακρυσμένα μόνο",
+  "compose.language.change": "Αλλαγή γλώσσας",
+  "compose.language.search": "Αναζήτηση γλωσσών...",
   "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα",
   "compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μην μοιράζεστε επικίνδυνες πληροφορίες μέσω του Mastodon.",
   "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.",
   "embed.preview": "Ορίστε πως θα φαίνεται:",
   "emoji_button.activity": "Δραστηριότητα",
+  "emoji_button.clear": "Καθαρισμός",
   "emoji_button.custom": "Προσαρμοσμένα",
   "emoji_button.flags": "Σημαίες",
   "emoji_button.food": "Φαγητά & Ποτά",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.",
   "empty_column.bookmarked_statuses": "Δεν έχεις κανένα αποθηκευμένο τουτ ακόμα. Μόλις αποθηκεύσεις κάποιο, θα εμφανιστεί εδώ.",
   "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!",
-  "empty_column.conversations": "Μόλις στείλετε ή λάβετε μια δημοσίευση που είναι ορατή μόνο σε άτομα που αναφέρονται σε αυτή, θα εμφανιστεί εδώ.",
+  "empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.",
   "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Δεν έχεις κανένα αγαπημένο τουτ ακόμα. Μόλις αγαπήσεις κάποιο, θα εμφανιστεί εδώ.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "προώθηση",
   "keyboard_shortcuts.column": "εμφάνιση της κατάστασης σε μια από τις στήλες",
   "keyboard_shortcuts.compose": "εστίαση στην περιοχή συγγραφής",
-  "keyboard_shortcuts.conversations": "για να ανοίξετε στήλη συνομιλιών",
   "keyboard_shortcuts.description": "Περιγραφή",
+  "keyboard_shortcuts.direct": "άνοιγμα στήλης προσωπικών μηνυμάτων",
   "keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα",
   "keyboard_shortcuts.enter": "εμφάνιση κατάστασης",
   "keyboard_shortcuts.favourite": "σημείωση ως αγαπημένο",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας",
   "lightbox.next": "Επόμενο",
   "lightbox.previous": "Προηγούμενο",
+  "limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως",
+  "limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή σας.",
   "lists.account.add": "Πρόσθεσε στη λίστα",
   "lists.account.remove": "Βγάλε από τη λίστα",
   "lists.delete": "Διαγραφή λίστας",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Σελιδοδείκτες",
   "navigation_bar.community_timeline": "Τοπική ροή",
   "navigation_bar.compose": "Γράψε νέο τουτ",
+  "navigation_bar.direct": "Προσωπικά μηνύματα",
   "navigation_bar.discover": "Ανακάλυψη",
   "navigation_bar.domain_blocks": "Κρυμμένοι τομείς",
   "navigation_bar.edit_profile": "Επεξεργασία προφίλ",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Αφαίρεση δημοσκόπησης",
   "privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης",
   "privacy.direct.long": "Δημοσίευση μόνο σε όσους και όσες αναφέρονται",
-  "privacy.direct.short": "Μόνο άτομα που αναφέρω",
+  "privacy.direct.short": "Αναφερόμενα άτομα μόνο",
   "privacy.private.long": "Δημοσίευση μόνο στους ακόλουθους",
   "privacy.private.short": "Μόνο ακόλουθοι",
   "privacy.public.long": "Ορατό σε όλους",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
new file mode 100644
index 000000000..51f8463cd
--- /dev/null
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -0,0 +1,549 @@
+{
+  "account.account_note_header": "Note",
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Block domain {domain}",
+  "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Domain blocked",
+  "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.following": "Following",
+  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.joined": "Joined {date}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Posts",
+  "account.posts_with_replies": "Posts and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unblock domain {domain}",
+  "account.unblock_short": "Unblock",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.unmute_short": "Unmute",
+  "account_note.placeholder": "Click to add a note",
+  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.retention.average": "Average",
+  "admin.dashboard.retention.cohort": "Sign-up month",
+  "admin.dashboard.retention.cohort_size": "New users",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
+  "attachments_list.unprocessed": "(unprocessed)",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Close",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Try again",
+  "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Blocked domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned post",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.local_only": "Local only",
+  "community.column_settings.media_only": "Media only",
+  "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.save_changes": "Save changes",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.discard_edit_media.confirm": "Discard",
+  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No matching emojis found",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_suspended": "Account suspended",
+  "empty_column.account_timeline": "No posts found",
+  "empty_column.account_unavailable": "Profile unavailable",
+  "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.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.",
+  "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+  "empty_column.home.suggestions": "See some suggestions",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
+  "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
+  "follow_recommendations.done": "Done",
+  "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "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.",
+  "generic.saved": "Saved",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "home.hide_announcements": "Hide announcements",
+  "home.show_announcements": "Show announcements",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.pinned": "to open pinned posts list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new post",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.followed": "Any followed user",
+  "lists.replies_policy.list": "Members of the list",
+  "lists.replies_policy.none": "No one",
+  "lists.replies_policy.title": "Show replies to:",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.explore": "Explore",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned posts",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.admin.sign_up": "{name} signed up",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
+  "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New posts:",
+  "notifications.column_settings.unread_notifications.category": "Unread notifications",
+  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
+  "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "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.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll.voted": "You voted for this answer",
+  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Visible for mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Visible for followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Visible for all",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.just_now": "just now",
+  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "relative_time.today": "today",
+  "reply_indicator.cancel": "Cancel",
+  "report.block": "Block",
+  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+  "report.categories.other": "Other",
+  "report.categories.spam": "Spam",
+  "report.categories.violation": "Content violates one or more server rules",
+  "report.category.subtitle": "Choose the best match",
+  "report.category.title": "Tell us what's going on with this {type}",
+  "report.category.title_account": "profile",
+  "report.category.title_status": "post",
+  "report.close": "Done",
+  "report.comment.title": "Is there anything else you think we should know?",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.mute": "Mute",
+  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.next": "Next",
+  "report.placeholder": "Type or paste additional comments",
+  "report.reasons.dislike": "I don't like it",
+  "report.reasons.dislike_description": "It is not something you want to see",
+  "report.reasons.other": "It's something else",
+  "report.reasons.other_description": "The issue does not fit into other categories",
+  "report.reasons.spam": "It's spam",
+  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.violation": "It violates server rules",
+  "report.reasons.violation_description": "You are aware that it breaks specific rules",
+  "report.rules.subtitle": "Select all that apply",
+  "report.rules.title": "Which rules are being violated?",
+  "report.statuses.subtitle": "Select all that apply",
+  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.submit": "Submit report",
+  "report.target": "Report {target}",
+  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.title": "Don't want to see this?",
+  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+  "report.unfollow": "Unfollow @{name}",
+  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "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": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.all": "All",
+  "search_results.hashtags": "Hashtags",
+  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.statuses": "Posts",
+  "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.bookmark": "Bookmark",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.edit": "Edit",
+  "status.edited": "Edited {date}",
+  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.history.created": "{name} created {date}",
+  "status.history.edited": "{name} edited {date}",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned post",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost with original visibility",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older posts",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add images, a video or an audio file",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.description_missing": "No description added",
+  "upload_form.edit": "Edit",
+  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.undo": "Delete",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.applying": "Applying…",
+  "upload_modal.choose_image": "Choose image",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.download": "Download file",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 4804eefa2..a630f50c7 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -96,8 +96,10 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media Only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
   "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
@@ -151,6 +153,7 @@
   "embed.instructions": "Embed this post on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -170,7 +173,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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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.",
@@ -234,8 +237,8 @@
   "keyboard_shortcuts.boost": "Boost post",
   "keyboard_shortcuts.column": "Focus column",
   "keyboard_shortcuts.compose": "Focus compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Move down in the list",
   "keyboard_shortcuts.enter": "Open post",
   "keyboard_shortcuts.favourite": "Favourite post",
@@ -268,6 +271,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -294,6 +299,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Blocked domains",
   "navigation_bar.edit_profile": "Edit profile",
@@ -371,7 +377,7 @@
   "poll_button.remove_poll": "Remove poll",
   "privacy.change": "Change post privacy",
   "privacy.direct.long": "Visible for mentioned users only",
-  "privacy.direct.short": "Only people I mention",
+  "privacy.direct.short": "Mentioned people only",
   "privacy.private.long": "Visible for followers only",
   "privacy.private.short": "Followers only",
   "privacy.public.long": "Visible for all",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 315c416db..917994561 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -18,7 +18,7 @@
   "account.followers": "Sekvantoj",
   "account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
   "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
-  "account.following": "Following",
+  "account.following": "Sekvantaj",
   "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
   "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
   "account.follows_you": "Sekvas vin",
@@ -70,7 +70,7 @@
   "column.blocks": "Blokitaj uzantoj",
   "column.bookmarks": "Legosignoj",
   "column.community": "Loka templinio",
-  "column.conversations": "Conversations",
+  "column.direct": "Rektaj mesaĝoj",
   "column.directory": "Trarigardi profilojn",
   "column.domain_blocks": "Blokitaj domajnoj",
   "column.favourites": "Stelumoj",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Nur loka",
   "community.column_settings.media_only": "Nur aŭdovidaĵoj",
   "community.column_settings.remote_only": "Nur malproksima",
+  "compose.language.change": "Ŝanĝi lingvon",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Lerni pli",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.",
   "embed.preview": "Ĝi aperos tiel:",
   "emoji_button.activity": "Agadoj",
+  "emoji_button.clear": "Forviŝi",
   "emoji_button.custom": "Propraj",
   "emoji_button.flags": "Flagoj",
   "emoji_button.food": "Manĝi kaj trinki",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.",
   "empty_column.bookmarked_statuses": "Vi ankoraŭ ne aldonis mesaĝon al viaj legosignoj. Kiam vi aldonos iun, tiu aperos ĉi tie.",
   "empty_column.community": "La loka templinio estas malplena. Skribu ion por plenigi ĝin!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
   "empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!",
   "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, tiu aperos ĉi tie.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "diskonigi",
   "keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj",
   "keyboard_shortcuts.compose": "enfokusigi la tekstujon",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Priskribo",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "iri suben en la listo",
   "keyboard_shortcuts.enter": "malfermi mesaĝon",
   "keyboard_shortcuts.favourite": "stelumi",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Pligrandigi bildan vidkeston",
   "lightbox.next": "Sekva",
   "lightbox.previous": "Antaŭa",
+  "limited_account_hint.action": "Montru profilon ĉiukaze",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Aldoni al la listo",
   "lists.account.remove": "Forigi de la listo",
   "lists.delete": "Forigi la liston",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Legosignoj",
   "navigation_bar.community_timeline": "Loka templinio",
   "navigation_bar.compose": "Skribi novan mesaĝon",
+  "navigation_bar.direct": "Rektaj mesaĝoj",
   "navigation_bar.discover": "Esplori",
   "navigation_bar.domain_blocks": "Blokitaj domajnoj",
   "navigation_bar.edit_profile": "Redakti profilon",
@@ -325,7 +331,7 @@
   "notifications.column_settings.favourite": "Stelumoj:",
   "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
   "notifications.column_settings.filter_bar.category": "Rapida filtra breto",
-  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "Montru filtrilon",
   "notifications.column_settings.follow": "Novaj sekvantoj:",
   "notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
   "notifications.column_settings.mention": "Mencioj:",
@@ -368,8 +374,8 @@
   "privacy.direct.long": "Videbla nur al menciitaj uzantoj",
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Videbla nur al viaj sekvantoj",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Nur abonantoj",
+  "privacy.public.long": "Videbla por ĉiuj",
   "privacy.public.short": "Publika",
   "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
   "privacy.unlisted.short": "Nelistigita",
@@ -402,7 +408,7 @@
   "report.forward": "Plusendi al {target}",
   "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?",
   "report.mute": "Silentigi",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.mute_explanation": "Vi ne vidos iliajn afiŝojn. Ili ankoraŭ povas sekvi vin kaj vidi viajn afiŝojn, kaj ne scios ke si estas silentigitaj.",
   "report.next": "Sekva",
   "report.placeholder": "Pliaj komentoj",
   "report.reasons.dislike": "Mi ne ŝatas ĝin",
@@ -414,7 +420,7 @@
   "report.reasons.violation": "Ĝi malrespektas servilajn regulojn",
   "report.reasons.violation_description": "You are aware that it breaks specific rules",
   "report.rules.subtitle": "Elektu ĉiujn, kiuj validas",
-  "report.rules.title": "Which rules are being violated?",
+  "report.rules.title": "Kiuj reguloj estas malobservataj?",
   "report.statuses.subtitle": "Elektu ĉiujn, kiuj validas",
   "report.statuses.title": "Are there any posts that back up this report?",
   "report.submit": "Sendi",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 1eac00cff..6f5ebee70 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -18,7 +18,7 @@
   "account.followers": "Seguidores",
   "account.followers.empty": "Todavía nadie sigue a este usuario.",
   "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
-  "account.following": "Siguiendo",
+  "account.following": "Seguimientos",
   "account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
   "account.follows.empty": "Todavía este usuario no sigue a nadie.",
   "account.follows_you": "Te sigue",
@@ -70,7 +70,7 @@
   "column.blocks": "Usuarios bloqueados",
   "column.bookmarks": "Marcadores",
   "column.community": "Línea temporal local",
-  "column.conversations": "Conversaciones",
+  "column.direct": "Mensajes directos",
   "column.directory": "Explorar perfiles",
   "column.domain_blocks": "Dominios bloqueados",
   "column.favourites": "Favoritos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Sólo local",
   "community.column_settings.media_only": "Sólo medios",
   "community.column_settings.remote_only": "Sólo remoto",
+  "compose.language.change": "Cambiar idioma",
+  "compose.language.search": "Buscar idiomas…",
   "compose_form.direct_message_warning_learn_more": "Aprendé más",
   "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información sensible al usar Mastodon.",
   "compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.",
   "embed.preview": "Así es cómo se verá:",
   "emoji_button.activity": "Actividad",
+  "emoji_button.clear": "Limpiar",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Banderas",
   "emoji_button.food": "Comida y bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.",
   "empty_column.bookmarked_statuses": "Todavía no tenés mensajes guardados en \"Marcadores\". Cuando guardés uno en \"Marcadores\", se mostrará acá.",
   "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!",
-  "empty_column.conversations": "Una vez que enviés o recibás un mensaje que sólo sea visible para la gente mencionada en él, aparecerá aquí.",
+  "empty_column.direct": "Todavía no tenés ningún mensaje directo. Cuando enviés o recibás uno, se mostrará acá.",
   "empty_column.domain_blocks": "Todavía no hay dominios bloqueados.",
   "empty_column.explore_statuses": "No hay nada en tendencia ahora mismo. ¡Volvé a revisar más tarde!",
   "empty_column.favourited_statuses": "Todavía no tenés mensajes favoritos. Cuando marqués uno como favorito, se mostrará acá.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Adherir al mensaje",
   "keyboard_shortcuts.column": "Enfocar columna",
   "keyboard_shortcuts.compose": "Enfocar el área de texto de redacción",
-  "keyboard_shortcuts.conversations": "para abrir la columna de conversaciones",
   "keyboard_shortcuts.description": "Descripción",
+  "keyboard_shortcuts.direct": "para abrir columna de mensajes directos",
   "keyboard_shortcuts.down": "Bajar en la lista",
   "keyboard_shortcuts.enter": "Abrir mensaje",
   "keyboard_shortcuts.favourite": "Marcar mensaje como favorito",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expandir cuadro de vista de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Mostrar perfil de todos modos",
+  "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de tu servidor.",
   "lists.account.add": "Agregar a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Eliminar lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Línea temporal local",
   "navigation_bar.compose": "Redactar un nuevo mensaje",
+  "navigation_bar.direct": "Mensajes directos",
   "navigation_bar.discover": "Descubrir",
   "navigation_bar.domain_blocks": "Dominios bloqueados",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Quitar encuesta",
   "privacy.change": "Configurar privacidad del mensaje",
   "privacy.direct.long": "Visible sólo para los usuarios mencionados",
-  "privacy.direct.short": "Sólo a las cuentas que menciono",
+  "privacy.direct.short": "Sólo cuentas mencionadas",
   "privacy.private.long": "Visible sólo para los seguidores",
   "privacy.private.short": "Sólo para seguidores",
   "privacy.public.long": "Visible para todos",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index c51ed52a6..bb18bfa95 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -70,7 +70,7 @@
   "column.blocks": "Usuarios bloqueados",
   "column.bookmarks": "Marcadores",
   "column.community": "Línea de tiempo local",
-  "column.conversations": "Conversations",
+  "column.direct": "Mensajes directos",
   "column.directory": "Buscar perfiles",
   "column.domain_blocks": "Dominios ocultados",
   "column.favourites": "Favoritos",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "Solo local",
   "community.column_settings.media_only": "Solo media",
   "community.column_settings.remote_only": "Solo remoto",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Aprender mas",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información confidencial en Mastodon.",
   "compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
   "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
   "compose_form.lock_disclaimer.lock": "bloqueado",
@@ -147,6 +149,7 @@
   "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
   "embed.preview": "Así es como se verá:",
   "emoji_button.activity": "Actividad",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Marcas",
   "emoji_button.food": "Comida y bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
   "empty_column.bookmarked_statuses": "Aún no tienes ningún toot guardado como marcador. Cuando guardes uno, se mostrará aquí.",
   "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
   "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
   "empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!",
   "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "retootear",
   "keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
   "keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descripción",
+  "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos",
   "keyboard_shortcuts.down": "mover hacia abajo en la lista",
   "keyboard_shortcuts.enter": "abrir estado",
   "keyboard_shortcuts.favourite": "añadir a favoritos",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expandir cuadro de visualización de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Añadir a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Borrar lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Historia local",
   "navigation_bar.compose": "Escribir un nuevo toot",
+  "navigation_bar.direct": "Mensajes directos",
   "navigation_bar.discover": "Descubrir",
   "navigation_bar.domain_blocks": "Dominios ocultos",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -366,12 +372,12 @@
   "poll_button.remove_poll": "Eliminar encuesta",
   "privacy.change": "Ajustar privacidad",
   "privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Sólo cuentas mencionadas",
   "privacy.private.long": "Sólo mostrar a seguidores",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Solo seguidores",
+  "privacy.public.long": "Visible para todos",
   "privacy.public.short": "Público",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento",
   "privacy.unlisted.short": "No listado",
   "refresh": "Actualizar",
   "regeneration_indicator.label": "Cargando…",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 510d84baa..48d8a2faa 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -4,7 +4,7 @@
   "account.badges.bot": "Bot",
   "account.badges.group": "Grupo",
   "account.block": "Bloquear a @{name}",
-  "account.block_domain": "Ocultar todo de {domain}",
+  "account.block_domain": "Bloquear dominio {domain}",
   "account.blocked": "Bloqueado",
   "account.browse_more_on_origin_server": "Ver más en el perfil original",
   "account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
@@ -70,7 +70,7 @@
   "column.blocks": "Usuarios bloqueados",
   "column.bookmarks": "Marcadores",
   "column.community": "Línea de tiempo local",
-  "column.conversations": "Conversaciones",
+  "column.direct": "Mensajes directos",
   "column.directory": "Buscar perfiles",
   "column.domain_blocks": "Dominios ocultados",
   "column.favourites": "Favoritos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Solo local",
   "community.column_settings.media_only": "Solo media",
   "community.column_settings.remote_only": "Solo remoto",
+  "compose.language.change": "Cambiar idioma",
+  "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Aprender más",
   "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No comparta ninguna información confidencial en Mastodon.",
   "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag porque no está listada. Sólo las publicaciones públicas se pueden buscar por hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
   "embed.preview": "Así es como se verá:",
   "emoji_button.activity": "Actividad",
+  "emoji_button.clear": "Limpiar",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Marcas",
   "emoji_button.food": "Comida y bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
   "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.",
   "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
-  "empty_column.conversations": "Una vez que envíe o reciba un mensaje que solo sea visible para la gente mencionada en él, aparecerá aquí.",
+  "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
   "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
   "empty_column.explore_statuses": "Nada está en tendencia en este momento. ¡Revisa más tarde!",
   "empty_column.favourited_statuses": "Aún no tienes publicaciones favoritas. Cuando marques una como favorita, aparecerá aquí.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Retootear",
   "keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
   "keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
-  "keyboard_shortcuts.conversations": "para abrir la columna de conversaciones",
   "keyboard_shortcuts.description": "Descripción",
+  "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos",
   "keyboard_shortcuts.down": "mover hacia abajo en la lista",
   "keyboard_shortcuts.enter": "abrir estado",
   "keyboard_shortcuts.favourite": "añadir a favoritos",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expandir cuadro de visualización de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Mostrar perfil de todos modos",
+  "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de tu servidor.",
   "lists.account.add": "Añadir a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Borrar lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Línea de tiempo local",
   "navigation_bar.compose": "Escribir nueva publicación",
+  "navigation_bar.direct": "Mensajes directos",
   "navigation_bar.discover": "Descubrir",
   "navigation_bar.domain_blocks": "Dominios ocultos",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Eliminar encuesta",
   "privacy.change": "Ajustar privacidad",
   "privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
-  "privacy.direct.short": "Solo la gente que yo menciono",
+  "privacy.direct.short": "Sólo cuentas mencionadas",
   "privacy.private.long": "Sólo mostrar a seguidores",
   "privacy.private.short": "Solo seguidores",
   "privacy.public.long": "Visible para todos",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index ca40ff370..e7c153681 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Märge",
   "account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest",
   "account.badges.bot": "Robot",
   "account.badges.group": "Grupp",
@@ -8,7 +8,7 @@
   "account.blocked": "Blokeeritud",
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Tühista jälgimistaotlus",
-  "account.direct": "Otsesõnum @{name}",
+  "account.direct": "Saada otsesõnum @{name}'ile",
   "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domeen peidetud",
   "account.edit_profile": "Muuda profiili",
@@ -17,28 +17,28 @@
   "account.follow": "Jälgi",
   "account.followers": "Jälgijad",
   "account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.followers_counter": "{count, plural, one {{counter} jälgija} other {{counter} jälgijat}}",
   "account.following": "Following",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}",
   "account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
   "account.follows_you": "Jälgib Teid",
   "account.hide_reblogs": "Peida upitused kasutajalt @{name}",
-  "account.joined": "Joined {date}",
+  "account.joined": "Liitus {date}",
   "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
   "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
   "account.media": "Meedia",
-  "account.mention": "Maini @{name}",
+  "account.mention": "Maini @{name}'i",
   "account.moved_to": "{name} on kolinud:",
   "account.mute": "Vaigista @{name}",
   "account.mute_notifications": "Vaigista teated kasutajalt @{name}",
   "account.muted": "Vaigistatud",
-  "account.posts": "Tuututused",
-  "account.posts_with_replies": "Tuututused ja vastused",
+  "account.posts": "Postitused",
+  "account.posts_with_replies": "Postitused ja vastused",
   "account.report": "Raporteeri @{name}",
   "account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
   "account.share": "Jaga @{name} profiili",
   "account.show_reblogs": "Näita kasutaja @{name} upitusi",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}",
   "account.unblock": "Eemalda blokeering @{name}",
   "account.unblock_domain": "Tee {domain} nähtavaks",
   "account.unblock_short": "Unblock",
@@ -47,7 +47,7 @@
   "account.unmute": "Ära vaigista @{name}",
   "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
   "account.unmute_short": "Unmute",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klõpsa märkme lisamiseks",
   "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
   "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
   "admin.dashboard.retention.average": "Average",
@@ -70,7 +70,7 @@
   "column.blocks": "Blokeeritud kasutajad",
   "column.bookmarks": "Järjehoidjad",
   "column.community": "Kohalik ajajoon",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Sirvi profiile",
   "column.domain_blocks": "Peidetud domeenid",
   "column.favourites": "Lemmikud",
@@ -92,19 +92,21 @@
   "community.column_settings.local_only": "Ainult kohalik",
   "community.column_settings.media_only": "Ainult meedia",
   "community.column_settings.remote_only": "Ainult kaug",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Vaata veel",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.",
   "compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab Teid jälgida ja näha Teie ainult-jälgijatele postitusi.",
   "compose_form.lock_disclaimer.lock": "lukus",
-  "compose_form.placeholder": "Millest mõtlete?",
+  "compose_form.placeholder": "Millest mõtled?",
   "compose_form.poll.add_option": "Lisa valik",
   "compose_form.poll.duration": "Küsitluse kestus",
   "compose_form.poll.option_placeholder": "Valik {number}",
   "compose_form.poll.remove_option": "Eemalda see valik",
   "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
   "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
-  "compose_form.publish": "Tuut",
+  "compose_form.publish": "Tuututa",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Märgista meedia tundlikuks",
@@ -147,9 +149,10 @@
   "embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.",
   "embed.preview": "Nii näeb see välja:",
   "emoji_button.activity": "Tegevus",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Mugandatud",
   "emoji_button.flags": "Lipud",
-  "emoji_button.food": "Toit & Jook",
+  "emoji_button.food": "Toit & jook",
   "emoji_button.label": "Sisesta emoji",
   "emoji_button.nature": "Loodus",
   "emoji_button.not_found": "Ei ole emojosi!! (╯°□°)╯︵ ┻━┻",
@@ -159,20 +162,20 @@
   "emoji_button.search": "Otsi...",
   "emoji_button.search_results": "Otsitulemused",
   "emoji_button.symbols": "Sümbolid",
-  "emoji_button.travel": "Reisimine & Kohad",
+  "emoji_button.travel": "Reisimine & kohad",
   "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Siin tuute ei ole!",
   "empty_column.account_unavailable": "Profiil pole saadaval",
   "empty_column.blocks": "Sa ei ole veel ühtegi kasutajat blokeerinud.",
   "empty_column.bookmarked_statuses": "Teil pole veel järjehoidjatesse lisatud tuututusi. Kui lisate mõne, näete neid siin.",
   "empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "Ükski postitus pole hetkel populaarne. Tule hiljem tagasi!",
   "empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.",
   "empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
   "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
-  "empty_column.follow_requests": "Teil pole veel ühtegi jälgimise taotlust. Kui saate mõne, näete neid siin.",
+  "empty_column.follow_requests": "Teil pole hetkel ühtegi jälgimistaotlust. Kui saate mõne, näete neid siin.",
   "empty_column.hashtag": "Selle sildiga pole veel midagi.",
   "empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.",
   "empty_column.home.suggestions": "See some suggestions",
@@ -187,12 +190,12 @@
   "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
   "errors.unexpected_crash.report_issue": "Teavita veast",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
+  "explore.search_results": "Otsingutulemused",
+  "explore.suggested_follows": "Sinu jaoks",
+  "explore.title": "Avasta",
+  "explore.trending_links": "Uudised",
+  "explore.trending_statuses": "Postitused",
+  "explore.trending_tags": "Sildid",
   "follow_recommendations.done": "Done",
   "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
   "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -230,10 +233,10 @@
   "keyboard_shortcuts.boost": "upitamiseks",
   "keyboard_shortcuts.column": "fokuseerimaks staatust ühele tulpadest",
   "keyboard_shortcuts.compose": "fokuseerimaks tekstikoostamise alale",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Kirjeldus",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "liikumaks nimstus alla",
-  "keyboard_shortcuts.enter": "staatuse avamiseks",
+  "keyboard_shortcuts.enter": "Ava postitus",
   "keyboard_shortcuts.favourite": "lemmikuks märkimiseks",
   "keyboard_shortcuts.favourites": "avamaks lemmikute nimistut",
   "keyboard_shortcuts.federated": "avamaks föderatsiooni ajajoont",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Järgmine",
   "lightbox.previous": "Eelmine",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Lisa nimistusse",
   "lists.account.remove": "Eemalda nimistust",
   "lists.delete": "Kustuta nimistu",
@@ -279,21 +284,22 @@
   "lists.subheading": "Teie nimistud",
   "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
   "loading_indicator.label": "Laeb..",
-  "media_gallery.toggle_visible": "Lülita nähtavus",
+  "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}",
   "missing_indicator.label": "Ei leitud",
   "missing_indicator.sublabel": "Seda ressurssi ei leitud",
   "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
   "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.apps": "Mobiilrakendused",
+  "navigation_bar.apps": "Mobiilirakendused",
   "navigation_bar.blocks": "Blokeeritud kasutajad",
   "navigation_bar.bookmarks": "Järjehoidjad",
   "navigation_bar.community_timeline": "Kohalik ajajoon",
   "navigation_bar.compose": "Koosta uus tuut",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Avasta",
   "navigation_bar.domain_blocks": "Peidetud domeenid",
   "navigation_bar.edit_profile": "Muuda profiili",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "Avasta",
   "navigation_bar.favourites": "Lemmikud",
   "navigation_bar.filters": "Vaigistatud sõnad",
   "navigation_bar.follow_requests": "Jälgimistaotlused",
@@ -358,13 +364,13 @@
   "poll.closed": "Suletud",
   "poll.refresh": "Värskenda",
   "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
-  "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}",
+  "poll.total_votes": "{count, plural, one {# hääl} other {# häält}}",
   "poll.vote": "Hääleta",
   "poll.voted": "Teie hääletasite selle poolt",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll.votes": "{votes, plural, one {# hääl} other {# häält}}",
   "poll_button.add_poll": "Lisa küsitlus",
   "poll_button.remove_poll": "Eemalda küsitlus",
-  "privacy.change": "Muuda staatuse privaatsust",
+  "privacy.change": "Muuda postituse nähtavust",
   "privacy.direct.long": "Postita ainult mainitud kasutajatele",
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Postita ainult jälgijatele",
@@ -378,7 +384,7 @@
   "regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
   "relative_time.days": "{number}p",
   "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi",
   "relative_time.full.just_now": "just now",
   "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
   "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
@@ -433,7 +439,7 @@
   "search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid",
   "search_popout.tips.user": "kasutaja",
   "search_results.accounts": "Inimesed",
-  "search_results.all": "All",
+  "search_results.all": "Kõik",
   "search_results.hashtags": "Sildid",
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "Tuudid",
@@ -445,10 +451,10 @@
   "status.bookmark": "Järjehoidja",
   "status.cancel_reblog_private": "Äraupita",
   "status.cannot_reblog": "Seda postitust ei saa upitada",
-  "status.copy": "Kopeeri link staatusesse",
+  "status.copy": "Kopeeri postituse link",
   "status.delete": "Kustuta",
   "status.detailed_status": "Detailne vestluskuva",
-  "status.direct": "Otsesõnum @{name}",
+  "status.direct": "Saada otsesõnum @{name}'ile",
   "status.edit": "Edit",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
@@ -457,13 +463,13 @@
   "status.filtered": "Filtreeritud",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
-  "status.load_more": "Lae veel",
+  "status.load_more": "Lae rohkem",
   "status.media_hidden": "Meedia peidetud",
-  "status.mention": "Mainimine @{name}",
+  "status.mention": "Maini @{name}'i",
   "status.more": "Veel",
   "status.mute": "Vaigista @{name}",
   "status.mute_conversation": "Vaigista vestlus",
-  "status.open": "Laienda see staatus",
+  "status.open": "Laienda see postitus",
   "status.pin": "Kinnita profiilile",
   "status.pinned": "Kinnitatud tuut",
   "status.read_more": "Loe veel",
@@ -475,7 +481,7 @@
   "status.remove_bookmark": "Eemalda järjehoidja",
   "status.reply": "Vasta",
   "status.replyAll": "Vasta lõimele",
-  "status.report": "Raport @{name}",
+  "status.report": "Raporteeri @{name}",
   "status.sensitive_warning": "Tundlik sisu",
   "status.share": "Jaga",
   "status.show_less": "Näita vähem",
@@ -493,17 +499,17 @@
   "tabs_bar.local_timeline": "Kohalik",
   "tabs_bar.notifications": "Teated",
   "tabs_bar.search": "Otsi",
-  "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} left",
-  "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} left",
-  "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left",
+  "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud",
+  "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} jäänud",
+  "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} jäänud",
   "time_remaining.moments": "Hetked jäänud",
-  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
+  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} jäänud",
   "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
   "timeline_hint.resources.followers": "Followers",
   "timeline_hint.resources.follows": "Follows",
   "timeline_hint.resources.statuses": "Older toots",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Praegu populaarne",
+  "trends.trending_now": "Hetkel populaarne",
   "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 119395b2f..4ab0c44be 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokeatutako erabiltzaileak",
   "column.bookmarks": "Laster-markak",
   "column.community": "Denbora-lerro lokala",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Arakatu profilak",
   "column.domain_blocks": "Ezkutatutako domeinuak",
   "column.favourites": "Gogokoak",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Lokala soilik",
   "community.column_settings.media_only": "Multimedia besterik ez",
   "community.column_settings.remote_only": "Urrunekoa soilik",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Bidalketa hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan bidalketa publikoak besterik ez dira agertzen.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.",
   "embed.preview": "Hau da izango duen itxura:",
   "emoji_button.activity": "Jarduera",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Pertsonalizatua",
   "emoji_button.flags": "Banderak",
   "emoji_button.food": "Janari eta edaria",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.",
   "empty_column.bookmarked_statuses": "Oraindik ez dituzu bidalketa laster-markatutarik. Bat laster-markatzerakoan, hemen agertuko da.",
   "empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
   "empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!",
   "empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogokoren bat duzunean hemen agertuko da.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Bultzatu bidalketa",
   "keyboard_shortcuts.column": "mezu bat zutabe batean fokatzea",
   "keyboard_shortcuts.compose": "testua konposatzeko arean fokatzea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Deskripzioa",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "zerrendan behera mugitzea",
   "keyboard_shortcuts.enter": "Ireki bidalketa",
   "keyboard_shortcuts.favourite": "Egin gogoko bidalketa",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Zabaldu irudia ikusteko kaxa",
   "lightbox.next": "Hurrengoa",
   "lightbox.previous": "Aurrekoa",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Gehitu zerrendara",
   "lists.account.remove": "Kendu zerrendatik",
   "lists.delete": "Ezabatu zerrenda",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Laster-markak",
   "navigation_bar.community_timeline": "Denbora-lerro lokala",
   "navigation_bar.compose": "Idatzi bidalketa berria",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Aurkitu",
   "navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
   "navigation_bar.edit_profile": "Aldatu profila",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index ae74607ab..5ae0872ca 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -70,7 +70,7 @@
   "column.blocks": "کاربران مسدود شده",
   "column.bookmarks": "نشانک‌ها",
   "column.community": "خط زمانی محلّی",
-  "column.conversations": "Conversations",
+  "column.direct": "پیام‌های مستقیم",
   "column.directory": "مرور نمایه‌ها",
   "column.domain_blocks": "دامنه‌های مسدود شده",
   "column.favourites": "پسندیده‌ها",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "فقط محلّی",
   "community.column_settings.media_only": "فقط رسانه",
   "community.column_settings.remote_only": "تنها دوردست",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "فرسته‌های ماستودون رمزگذاری سرتاسری نشده‌اند. هیچ اطّلاعات خطرناکی را روی ماستودون هم‌رسانی نکنید.",
   "compose_form.hashtag_warning": "از آن‌جا که این فرسته فهرست نشده است، در نتایج جست‌وجوی هشتگ‌ها پیدا نخواهد شد. تنها فرسته‌های عمومی را می‌توان با جست‌وجوی هشتگ یافت.",
   "compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی می‌تواند پی‌گیرتان شده و فرسته‌های ویژهٔ پی‌گیرانتان را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل‌شده",
@@ -147,6 +149,7 @@
   "embed.instructions": "برای جاسازی این فرسته در سایت خودتان، کد زیر را رونوشت کنید.",
   "embed.preview": "این گونه دیده خواهد شد:",
   "emoji_button.activity": "فعالیت",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "سفارشی",
   "emoji_button.flags": "پرچم‌ها",
   "emoji_button.food": "غذا و نوشیدنی",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.",
   "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانه‌گذاری شده‌ای ندارید. هنگامی که فرسته‌ای را نشانه‌گذاری کنید، این‌جا نشان داده خواهد شد.",
   "empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید این‌جا نشان داده خواهد شد.",
   "empty_column.domain_blocks": "هنوز هیچ دامنه‌ای مسدود نشده است.",
   "empty_column.explore_statuses": "الآن چیزی پرطرفدار نیست. بعداً دوباره بررسی کنید!",
   "empty_column.favourited_statuses": "شما هنوز هیچ فرسته‌ای را نپسندیده‌اید. هنگامی که فرسته‌ای را بپسندید، این‌جا نشان داده خواهد شد.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "تقویت فرسته",
   "keyboard_shortcuts.column": "برای تمرکز روی یک فرسته در یکی از ستون‌ها",
   "keyboard_shortcuts.compose": "تمرکز روی محیط نوشتن",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "توضیح",
+  "keyboard_shortcuts.direct": "برای گشودن ستون پیغام‌های مستقیم",
   "keyboard_shortcuts.down": "پایین بردن در سیاهه",
   "keyboard_shortcuts.enter": "گشودن فرسته",
   "keyboard_shortcuts.favourite": "پسندیدن فرسته",
@@ -264,6 +267,8 @@
   "lightbox.expand": "گسترش جعبهٔ نمایش تصویر",
   "lightbox.next": "بعدی",
   "lightbox.previous": "قبلی",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "افزودن به سیاهه",
   "lists.account.remove": "برداشتن از سیاهه",
   "lists.delete": "حذف سیاهه",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "نشانک‌ها",
   "navigation_bar.community_timeline": "خط زمانی محلّی",
   "navigation_bar.compose": "نوشتن فرستهٔ تازه",
+  "navigation_bar.direct": "پیام‌های مستقیم",
   "navigation_bar.discover": "گشت و گذار",
   "navigation_bar.domain_blocks": "دامنه‌های مسدود شده",
   "navigation_bar.edit_profile": "ویرایش نمایه",
@@ -365,13 +371,13 @@
   "poll_button.add_poll": "افزودن نظرسنجی",
   "poll_button.remove_poll": "برداشتن نظرسنجی",
   "privacy.change": "تغییر محرمانگی فرسته",
-  "privacy.direct.long": "فقط برای کاربران نام‌برده نمایان است",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.long": "نمایان فقط برای کاربران اشاره شده",
+  "privacy.direct.short": "فقط افراد اشاره شده",
   "privacy.private.long": "نمایان فقط برای پی‌گیرندگان",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "فقط پی‌گیرندگان",
+  "privacy.public.long": "نمایان برای همه",
   "privacy.public.short": "عمومی",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "نمایان برای همه، ولی خارج از قابلیت‌های کشف",
   "privacy.unlisted.short": "فهرست نشده",
   "refresh": "نوسازی",
   "regeneration_indicator.label": "در حال بار شدن…",
@@ -514,7 +520,7 @@
   "upload_error.poll": "بارگذاری پرونده در نظرسنجی‌ها مجاز نیست.",
   "upload_form.audio_description": "برای ناشنوایان توصیفش کنید",
   "upload_form.description": "برای کم‌بینایان توصیفش کنید",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "شرحی افزوده نشده",
   "upload_form.edit": "ویرایش",
   "upload_form.thumbnail": "تغییر بندانگشتی",
   "upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index e18e3b763..9db683eb1 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -70,7 +70,7 @@
   "column.blocks": "Estetyt käyttäjät",
   "column.bookmarks": "Kirjanmerkit",
   "column.community": "Paikallinen aikajana",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Selaa profiileja",
   "column.domain_blocks": "Piilotetut verkkotunnukset",
   "column.favourites": "Suosikit",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Vain paikalliset",
   "community.column_settings.media_only": "Vain media",
   "community.column_settings.remote_only": "Vain etäkäyttö",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Lisätietoja",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Tätä julkaisua listata minkään hastagin alle, koska se on listaamaton. Ainoastaan julkisia julkaisuja etsiä hastageilla.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
   "embed.preview": "Se tulee näyttämään tältä:",
   "emoji_button.activity": "Aktiviteetit",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Mukautetut",
   "emoji_button.flags": "Liput",
   "emoji_button.food": "Ruoka ja juoma",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.",
   "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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Yhtään verkko-osoitetta ei ole vielä estetty.",
   "empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!",
   "empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Buustaa viestiä",
   "keyboard_shortcuts.column": "Kohdista sarakkeeseen",
   "keyboard_shortcuts.compose": "siirry tekstinsyöttöön",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Kuvaus",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Siirry listassa alaspäin",
   "keyboard_shortcuts.enter": "Avaa julkaisu",
   "keyboard_shortcuts.favourite": "Lisää suosikkeihin",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Laajenna kuvan näkymälaatikko",
   "lightbox.next": "Seuraava",
   "lightbox.previous": "Edellinen",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Lisää listaan",
   "lists.account.remove": "Poista listasta",
   "lists.delete": "Poista lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Kirjanmerkit",
   "navigation_bar.community_timeline": "Paikallinen aikajana",
   "navigation_bar.compose": "Luo uusi viesti",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Löydä uutta",
   "navigation_bar.domain_blocks": "Estetyt verkkotunnukset",
   "navigation_bar.edit_profile": "Muokkaa profiilia",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index c7762fcef..1958cb98d 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -1,25 +1,25 @@
 {
   "account.account_note_header": "Note",
   "account.add_or_remove_from_list": "Ajouter ou retirer des listes",
-  "account.badges.bot": "Robot",
+  "account.badges.bot": "Bot",
   "account.badges.group": "Groupe",
   "account.block": "Bloquer @{name}",
   "account.block_domain": "Bloquer le domaine {domain}",
-  "account.blocked": "Bloqué",
+  "account.blocked": "Bloqué·e",
   "account.browse_more_on_origin_server": "Parcourir davantage sur le profil original",
   "account.cancel_follow_request": "Annuler la demande de suivi",
   "account.direct": "Envoyer un message direct à @{name}",
-  "account.disable_notifications": "Arrêter de me notifier quand @{name} publie",
+  "account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose",
   "account.domain_blocked": "Domaine bloqué",
   "account.edit_profile": "Modifier le profil",
-  "account.enable_notifications": "Me notifier quand @{name} publie",
+  "account.enable_notifications": "Me notifier quand @{name} publie quelque chose",
   "account.endorse": "Recommander sur votre profil",
   "account.follow": "Suivre",
-  "account.followers": "Abonnés",
+  "account.followers": "Abonné·e·s",
   "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
   "account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}",
   "account.following": "Abonnements",
-  "account.following_counter": "{count, plural, other {{counter} Abonnements}}",
+  "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}",
   "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
   "account.follows_you": "Vous suit",
   "account.hide_reblogs": "Masquer les partages de @{name}",
@@ -30,12 +30,12 @@
   "account.mention": "Mentionner @{name}",
   "account.moved_to": "{name} a déménagé vers :",
   "account.mute": "Masquer @{name}",
-  "account.mute_notifications": "Ignorer les notifications de @{name}",
+  "account.mute_notifications": "Masquer les notifications de @{name}",
   "account.muted": "Masqué·e",
   "account.posts": "Messages",
   "account.posts_with_replies": "Messages et réponses",
   "account.report": "Signaler @{name}",
-  "account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
+  "account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
   "account.share": "Partager le profil de @{name}",
   "account.show_reblogs": "Afficher les partages de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}",
@@ -48,8 +48,8 @@
   "account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
   "account.unmute_short": "Ne plus masquer",
   "account_note.placeholder": "Cliquez pour ajouter une note",
-  "admin.dashboard.daily_retention": "Taux de maintien des utilisateur·rice·s par jour après inscription",
-  "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding",
+  "admin.dashboard.daily_retention": "Taux de rétention des utilisateur·rice·s par jour après inscription",
+  "admin.dashboard.monthly_retention": "Taux de rétention des utilisateur·rice·s par mois après inscription",
   "admin.dashboard.retention.average": "Moyenne",
   "admin.dashboard.retention.cohort": "Mois d'inscription",
   "admin.dashboard.retention.cohort_size": "Nouveaux utilisateurs",
@@ -70,7 +70,7 @@
   "column.blocks": "Comptes bloqués",
   "column.bookmarks": "Marque-pages",
   "column.community": "Fil public local",
-  "column.conversations": "Conversations",
+  "column.direct": "Messages directs",
   "column.directory": "Parcourir les profils",
   "column.domain_blocks": "Domaines bloqués",
   "column.favourites": "Favoris",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local seulement",
   "community.column_settings.media_only": "Média uniquement",
   "community.column_settings.remote_only": "Distant seulement",
+  "compose.language.change": "Changer de langue",
+  "compose.language.search": "Rechercher des langues …",
   "compose_form.direct_message_warning_learn_more": "En savoir plus",
   "compose_form.encryption_warning": "Les messages sur Mastodon ne sont pas chiffrés de bout en bout. Ne partagez aucune information confidentielle sur Mastodon.",
   "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.",
@@ -146,10 +148,11 @@
   "directory.recently_active": "Actif·ve·s récemment",
   "embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.",
   "embed.preview": "Il apparaîtra comme cela :",
-  "emoji_button.activity": "Activité",
+  "emoji_button.activity": "Activités",
+  "emoji_button.clear": "Effacer",
   "emoji_button.custom": "Personnalisés",
   "emoji_button.flags": "Drapeaux",
-  "emoji_button.food": "Nourriture & Boisson",
+  "emoji_button.food": "Nourriture et boisson",
   "emoji_button.label": "Insérer un émoji",
   "emoji_button.nature": "Nature",
   "emoji_button.not_found": "Aucun émoji correspondant n'a été trouvé",
@@ -159,14 +162,14 @@
   "emoji_button.search": "Recherche...",
   "emoji_button.search_results": "Résultats de la recherche",
   "emoji_button.symbols": "Symboles",
-  "emoji_button.travel": "Lieux & Voyages",
+  "emoji_button.travel": "Voyage et lieux",
   "empty_column.account_suspended": "Compte suspendu",
   "empty_column.account_timeline": "Aucun message ici !",
   "empty_column.account_unavailable": "Profil non disponible",
   "empty_column.blocks": "Vous n’avez bloqué aucun compte pour le moment.",
   "empty_column.bookmarked_statuses": "Vous n'avez pas de message en marque-page. Lorsque vous en ajouterez un, il apparaîtra ici.",
   "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !",
-  "empty_column.conversations": "Une fois que vous avez envoyé ou reçu un message qui ne sera visible que par les personnes mentionnées, il apparaîtra ici.",
+  "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
   "empty_column.domain_blocks": "Il n’y a aucun domaine bloqué pour le moment.",
   "empty_column.explore_statuses": "Rien n'est en tendance pour le moment. Revenez plus tard !",
   "empty_column.favourited_statuses": "Vous n’avez pas encore de message en favori. Lorsque vous en ajouterez un, il apparaîtra ici.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Partager le message",
   "keyboard_shortcuts.column": "Se placer dans une colonne",
   "keyboard_shortcuts.compose": "Se placer dans la zone de rédaction",
-  "keyboard_shortcuts.conversations": "pour ouvrir la colonne des conversations",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages directs",
   "keyboard_shortcuts.down": "Descendre dans la liste",
   "keyboard_shortcuts.enter": "Ouvrir le message",
   "keyboard_shortcuts.favourite": "Ajouter le message aux favoris",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Agrandir la fenêtre de visualisation des images",
   "lightbox.next": "Suivant",
   "lightbox.previous": "Précédent",
+  "limited_account_hint.action": "Afficher le profil quand même",
+  "limited_account_hint.title": "Ce profil a été masqué par la modération de votre serveur.",
   "lists.account.add": "Ajouter à la liste",
   "lists.account.remove": "Supprimer de la liste",
   "lists.delete": "Supprimer la liste",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marque-pages",
   "navigation_bar.community_timeline": "Fil public local",
   "navigation_bar.compose": "Rédiger un nouveau message",
+  "navigation_bar.direct": "Messages directs",
   "navigation_bar.discover": "Découvrir",
   "navigation_bar.domain_blocks": "Domaines bloqués",
   "navigation_bar.edit_profile": "Modifier le profil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Supprimer le sondage",
   "privacy.change": "Ajuster la confidentialité du message",
   "privacy.direct.long": "Visible uniquement par les comptes mentionnés",
-  "privacy.direct.short": "Seulement les personnes mentionnées",
+  "privacy.direct.short": "Personnes mentionnées uniquement",
   "privacy.private.long": "Visible uniquement par vos abonné·e·s",
   "privacy.private.short": "Abonné·e·s uniquement",
   "privacy.public.long": "Visible pour tous",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 6370cd9d6..f56e6d5fa 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -70,7 +70,7 @@
   "column.blocks": "Cuntais choiscthe",
   "column.bookmarks": "Leabharmharcanna",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Gníomhaíocht",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Bia ⁊ Ól",
@@ -166,7 +169,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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Cuir an phróifíl in eagar",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index be1b10025..4294cee84 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -50,7 +50,7 @@
   "account_note.placeholder": "Briog airson nòta a chur ris",
   "admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha",
   "admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos",
-  "admin.dashboard.retention.average": "Cuibheasach",
+  "admin.dashboard.retention.average": "Średnia",
   "admin.dashboard.retention.cohort": "Mìos a’ chlàraidh",
   "admin.dashboard.retention.cohort_size": "Cleachdaichean ùra",
   "alert.rate_limited.message": "Feuch ris a-rithist às dèidh {retry_time, time, medium}.",
@@ -59,7 +59,7 @@
   "alert.unexpected.title": "Oich!",
   "announcement.announcement": "Brath-fios",
   "attachments_list.unprocessed": "(gun phròiseasadh)",
-  "autosuggest_hashtag.per_week": "{count} gach seachdain",
+  "autosuggest_hashtag.per_week": "{count} san t-seachdain",
   "boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras",
   "bundle_column_error.body": "Chaidh rudeigin cearr nuair a dh’fheuch sinn ris a’ cho-phàirt seo a luchdadh.",
   "bundle_column_error.retry": "Feuch ris a-rithist",
@@ -70,7 +70,7 @@
   "column.blocks": "Cleachdaichean bacte",
   "column.bookmarks": "Comharran-lìn",
   "column.community": "Loidhne-ama ionadail",
-  "column.conversations": "Còmhraidhean",
+  "column.direct": "Teachdaireachdan dìreach",
   "column.directory": "Rùraich sna pròifilean",
   "column.domain_blocks": "Àrainnean bacte",
   "column.favourites": "Na h-annsachdan",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Feadhainn ionadail a-mhàin",
   "community.column_settings.media_only": "Meadhanan a-mhàin",
   "community.column_settings.remote_only": "Feadhainn chèin a-mhàin",
+  "compose.language.change": "Atharraich an cànan",
+  "compose.language.search": "Lorg cànan…",
   "compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh",
   "compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh cunnartach idir le Mastodon.",
   "compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais on a tha e falaichte o liostaichean. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.",
   "embed.preview": "Seo an coltas a bhios air:",
   "emoji_button.activity": "Gnìomhachd",
+  "emoji_button.clear": "Falamhaich",
   "emoji_button.custom": "Gnàthaichte",
   "emoji_button.flags": "Brataichean",
   "emoji_button.food": "Biadh ⁊ deoch",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Cha do bhac thu cleachdaiche sam bith fhathast.",
   "empty_column.bookmarked_statuses": "Chan eil comharra-lìn ri post agad fhathast. Nuair a nì thu comharra-lìn de dh’fhear, nochdaidh e an-seo.",
   "empty_column.community": "Tha an loidhne-ama ionadail falamh. Sgrìobh rudeigin gu poblach airson toiseach-tòiseachaidh a dhèanamh!",
-  "empty_column.conversations": "Nuair a chuireas no gheibh thu post nach fhaic ach an fheadhainn le iomradh orra ann, nochdaidh e an-seo.",
+  "empty_column.direct": "Chan eil teachdaireachd dhìreach agad fhathast. Nuair a chuireas no a gheibh thu tè, nochdaidh i an-seo.",
   "empty_column.domain_blocks": "Cha deach àrainn sam bith a bhacadh fhathast.",
   "empty_column.explore_statuses": "Chan eil dad a’ treandadh an-dràsta fhèin. Thoir sùil a-rithist an ceann greis!",
   "empty_column.favourited_statuses": "Chan eil annsachd air post agad fhathast. Nuair a nì thu annsachd de dh’fhear, nochdaidh e an-seo.",
@@ -203,7 +206,7 @@
   "getting_started.developers": "Luchd-leasachaidh",
   "getting_started.directory": "Eòlaire nam pròifil",
   "getting_started.documentation": "Docamaideadh",
-  "getting_started.heading": "Dèan toiseach-tòiseachaidh",
+  "getting_started.heading": "Toiseach",
   "getting_started.invite": "Thoir cuireadh do dhaoine",
   "getting_started.open_source_notice": "’S e bathar-bog le bun-tùs fosgailte a th’ ann am Mastodon. ’S urrainn dhut cuideachadh leis no aithris a dhèanamh air duilgheadasan air GitHub fo {github}.",
   "getting_started.security": "Roghainnean a’ chunntais",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Brosnaich post",
   "keyboard_shortcuts.column": "Cuir am fòcas air colbh",
   "keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh",
-  "keyboard_shortcuts.conversations": "a dh’fhosgladh colbh nan còmhraidhean",
   "keyboard_shortcuts.description": "Tuairisgeul",
+  "keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan teachdaireachdan dìreach",
   "keyboard_shortcuts.down": "Gluais sìos air an liosta",
   "keyboard_shortcuts.enter": "Fosgail post",
   "keyboard_shortcuts.favourite": "Cuir post ris na h-annsachdan",
@@ -253,7 +256,7 @@
   "keyboard_shortcuts.requests": "Fosgail liosta nan iarrtasan leantainn",
   "keyboard_shortcuts.search": "Cuir am fòcas air a’ bhàr-luirg",
   "keyboard_shortcuts.spoilers": "Seall/Falaich raon an rabhaidh susbainte",
-  "keyboard_shortcuts.start": "Fosgail an colbh “dèan toiseach-tòiseachaidh”",
+  "keyboard_shortcuts.start": "Fosgail an colbh “Toiseach”",
   "keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte",
   "keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan",
   "keyboard_shortcuts.toot": "Tòisich air post ùr",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Leudaich bogsa sealladh an deilbh",
   "lightbox.next": "Air adhart",
   "lightbox.previous": "Air ais",
+  "limited_account_hint.action": "Seall a’ phròifil co-dhiù",
+  "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir an fhrithealaiche agad.",
   "lists.account.add": "Cuir ris an liosta",
   "lists.account.remove": "Thoir air falbh on liosta",
   "lists.delete": "Sguab às an liosta",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Comharran-lìn",
   "navigation_bar.community_timeline": "Loidhne-ama ionadail",
   "navigation_bar.compose": "Sgrìobh post ùr",
+  "navigation_bar.direct": "Teachdaireachdan dìreach",
   "navigation_bar.discover": "Rùraich",
   "navigation_bar.domain_blocks": "Àrainnean bacte",
   "navigation_bar.edit_profile": "Deasaich a’ phròifil",
@@ -316,7 +322,7 @@
   "notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch",
   "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
   "notification.reblog": "Bhrosnaich {name} am post agad",
-  "notification.status": "Tha {name} air rud a phostadh",
+  "notification.status": "Phostaich {name} rud",
   "notification.update": "Dheasaich {name} post",
   "notifications.clear": "Falamhaich na brathan",
   "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd",
   "privacy.change": "Cuir gleus air prìobhaideachd a’ phuist",
   "privacy.direct.long": "Chan fhaic ach na cleachdaichean le iomradh orra seo",
-  "privacy.direct.short": "Daoine air an dug mi iomradh a-mhàin",
+  "privacy.direct.short": "An fheadhainn le iomradh orra a-mhàin",
   "privacy.private.long": "Chan fhaic ach na daoine a tha a’ leantainn ort seo",
   "privacy.private.short": "Luchd-leantainn a-mhàin",
   "privacy.public.long": "Chì a h-uile duine e",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 114d90335..3a158ec76 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -70,7 +70,7 @@
   "column.blocks": "Usuarias bloqueadas",
   "column.bookmarks": "Marcadores",
   "column.community": "Cronoloxía local",
-  "column.conversations": "Conversas",
+  "column.direct": "Mensaxes directas",
   "column.directory": "Procurar perfís",
   "column.domain_blocks": "Dominios agochados",
   "column.favourites": "Favoritos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Só local",
   "community.column_settings.media_only": "Só multimedia",
   "community.column_settings.remote_only": "Só remoto",
+  "compose.language.change": "Elixe o idioma",
+  "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Coñecer máis",
   "compose_form.encryption_warning": "As publicacións en Mastodon non están cifradas de extremo-a-extremo. Non compartas información sensible en Mastodon.",
   "compose_form.hashtag_warning": "Esta publicación non aparecerá baixo ningún cancelo (hashtag) porque non está listada. Só se poden procurar publicacións públicas por cancelos.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Engade esta publicación ó teu sitio web copiando o seguinte código.",
   "embed.preview": "Así será mostrado:",
   "emoji_button.activity": "Actividade",
+  "emoji_button.clear": "Limpar",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Marcas",
   "emoji_button.food": "Comida e Bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.",
   "empty_column.bookmarked_statuses": "Aínda non marcaches ningunha publicación. Cando o fagas, aparecerán aquí.",
   "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!",
-  "empty_column.conversations": "Aquí verás as publicacións que envíes ou recibas é só son visibles para as persoas mencionadas.",
+  "empty_column.direct": "Aínda non tes mensaxes directas. Cando envíes ou recibas unha, amosarase aquí.",
   "empty_column.domain_blocks": "Aínda non hai dominios agochados.",
   "empty_column.explore_statuses": "Non hai temas en voga. Volve máis tarde!",
   "empty_column.favourited_statuses": "Aínda non tes publicacións favoritas. Cando che guste algunha, aparecerá aquí.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Promover publicación",
   "keyboard_shortcuts.column": "Destacar unha columna",
   "keyboard_shortcuts.compose": "Por o cursor na área de escritura",
-  "keyboard_shortcuts.conversations": "para abrir a columna das conversas",
   "keyboard_shortcuts.description": "Descrición",
+  "keyboard_shortcuts.direct": "para abrir a columna de mensaxes directas",
   "keyboard_shortcuts.down": "Para mover cara abaixo na listaxe",
   "keyboard_shortcuts.enter": "Para abrir publicación",
   "keyboard_shortcuts.favourite": "Para engadir a favoritos",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expandir a caixa de vista da imaxe",
   "lightbox.next": "Seguinte",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Mostrar perfil igualmente",
+  "limited_account_hint.title": "Este perfil foi agochado pola moderación do teu servidor.",
   "lists.account.add": "Engadir á listaxe",
   "lists.account.remove": "Eliminar da listaxe",
   "lists.delete": "Eliminar listaxe",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Cronoloxía local",
   "navigation_bar.compose": "Escribir unha nova publicación",
+  "navigation_bar.direct": "Mensaxes directas",
   "navigation_bar.discover": "Descubrir",
   "navigation_bar.domain_blocks": "Dominios agochados",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Eliminar enquisa",
   "privacy.change": "Axustar privacidade",
   "privacy.direct.long": "Só para as usuarias mencionadas",
-  "privacy.direct.short": "Só para persoas mencionadas",
+  "privacy.direct.short": "Só persoas mencionadas",
   "privacy.private.long": "Só para os seguidoras",
   "privacy.private.short": "Só para seguidoras",
   "privacy.public.long": "Visible por todas",
@@ -408,11 +414,11 @@
   "report.reasons.dislike": "Non me gusta",
   "report.reasons.dislike_description": "Non é algo que queiras ver",
   "report.reasons.other": "É outra cousa",
-  "report.reasons.other_description": "O asunto non cae dentro de outras categorías",
+  "report.reasons.other_description": "O problema non cae dentro de outras categorías",
   "report.reasons.spam": "É spam",
   "report.reasons.spam_description": "Ligazóns perigosas, relacións falsas, ou respostas repetitivas",
   "report.reasons.violation": "Viola as regras do servidor",
-  "report.reasons.violation_description": "Daste conta de que quebra unhas normas en concreto",
+  "report.reasons.violation_description": "Décheste conta de que quebra unhas normas en concreto",
   "report.rules.subtitle": "Elixe todo o que sexa de aplicación",
   "report.rules.title": "Que regras foron incumpridas?",
   "report.statuses.subtitle": "Elixe todo o que corresponda",
@@ -455,8 +461,8 @@
   "status.embed": "Incrustar",
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
-  "status.history.created": "{name} creado o {date}",
-  "status.history.edited": "{name} editado o {date}",
+  "status.history.created": "{name} creouno o {date}",
+  "status.history.edited": "{name} editouno o {date}",
   "status.load_more": "Cargar máis",
   "status.media_hidden": "Contido multimedia agochado",
   "status.mention": "Mencionar @{name}",
@@ -493,11 +499,11 @@
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notificacións",
   "tabs_bar.search": "Procurar",
-  "time_remaining.days": "{number, plural, one {# día} other {# días}} restantes",
-  "time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restantes",
-  "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes",
-  "time_remaining.moments": "Momentos restantes",
-  "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes",
+  "time_remaining.days": "Remata en {number, plural, one {# día} other {# días}}",
+  "time_remaining.hours": "Remata en {number, plural, one {# hora} other {# horas}}",
+  "time_remaining.minutes": "Remata en {number, plural, one {# minuto} other {# minutos}}",
+  "time_remaining.moments": "A piques de rematar",
+  "time_remaining.seconds": "Remata en {number, plural, one {# segundo} other {# segundos}}",
   "timeline_hint.remote_resource_not_displayed": "Non se mostran {resource} desde outros servidores.",
   "timeline_hint.resources.followers": "Seguidoras",
   "timeline_hint.resources.follows": "Seguindo",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index efa740656..3dcb7c9c7 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -1,24 +1,24 @@
 {
-  "account.account_note_header": "ההודעה שלך ל@{name}",
+  "account.account_note_header": "הערה",
   "account.add_or_remove_from_list": "הוסף או הסר מהרשימות",
   "account.badges.bot": "בוט",
   "account.badges.group": "קבוצה",
-  "account.block": "חסימת @{name}",
-  "account.block_domain": "להסתיר הכל מהקהילה {domain}",
+  "account.block": "חסמי את @{name}",
+  "account.block_domain": "חסמו את שם המתחם (דומיין) {domain}",
   "account.blocked": "חסום",
-  "account.browse_more_on_origin_server": "המשך לגלוש בפרופיל המקורי",
+  "account.browse_more_on_origin_server": "ראה יותר בפרופיל המקורי",
   "account.cancel_follow_request": "בטל בקשת מעקב",
-  "account.direct": "Direct Message @{name}",
+  "account.direct": "הודעה ישירה ל@{name}",
   "account.disable_notifications": "הפסק לשלוח לי התראות כש@{name} מפרסמים",
-  "account.domain_blocked": "הדומיין חסוי",
+  "account.domain_blocked": "הדומיין חסום",
   "account.edit_profile": "עריכת פרופיל",
-  "account.enable_notifications": "שלח לי התראות כש@{name} מפרסמים",
-  "account.endorse": "הצג בפרופיל",
-  "account.follow": "מעקב",
+  "account.enable_notifications": "שלח לי התראות כש@{name} מפרסם",
+  "account.endorse": "קדם את החשבון בפרופיל",
+  "account.follow": "עקוב",
   "account.followers": "עוקבים",
   "account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
   "account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
-  "account.following": "Following",
+  "account.following": "נעקבים",
   "account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}",
   "account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
   "account.follows_you": "במעקב אחריך",
@@ -30,28 +30,28 @@
   "account.mention": "אזכור של @{name}",
   "account.moved_to": "החשבון {name} הועבר אל:",
   "account.mute": "להשתיק את @{name}",
-  "account.mute_notifications": "להסתיר התראות מאת @{name}",
+  "account.mute_notifications": "להסתיר התראות מ @{name}",
   "account.muted": "מושתק",
-  "account.posts": "הודעות",
-  "account.posts_with_replies": "Toots with replies",
-  "account.report": "לדווח על @{name}",
-  "account.requested": "בהמתנה לאישור",
-  "account.share": "לשתף את הפרופיל של @{name}",
-  "account.show_reblogs": "להראות הדהודים מאת @{name}",
+  "account.posts": "חצרוצים",
+  "account.posts_with_replies": "חצרוצים ותגובות",
+  "account.report": "דווח על @{name}",
+  "account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב",
+  "account.share": "שתף את הפרופיל של @{name}",
+  "account.show_reblogs": "הצג הדהודים מאת @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
-  "account.unblock": "הסרת חסימה מעל @{name}",
-  "account.unblock_domain": "הסר חסימה מקהילת {domain}",
-  "account.unblock_short": "Unblock",
-  "account.unendorse": "לא להציג בפרופיל",
+  "account.unblock": "הסר את החסימה של @{name}",
+  "account.unblock_domain": "הסראת שם המתחם {domain}",
+  "account.unblock_short": "הסר חסימה",
+  "account.unendorse": "אל תקדם בפרופיל",
   "account.unfollow": "הפסקת מעקב",
   "account.unmute": "הפסקת השתקת @{name}",
-  "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
-  "account.unmute_short": "Unmute",
-  "account_note.placeholder": "ללא הערה",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "account.unmute_notifications": "להפסיק השתקת הודעות מ @{name}",
+  "account.unmute_short": "ביטול השתקה",
+  "account_note.placeholder": "יש ללחוץ כדי להוסיף הערות",
+  "admin.dashboard.daily_retention": "קצב שימור משתמשים (פר יום) אחרי ההרשמה",
+  "admin.dashboard.monthly_retention": "קצב שימור משתמשים (פר חודש) אחרי ההרשמה",
   "admin.dashboard.retention.average": "ממוצע",
-  "admin.dashboard.retention.cohort": "Sign-up month",
+  "admin.dashboard.retention.cohort": "חודש רישום",
   "admin.dashboard.retention.cohort_size": "משתמשים חדשים",
   "alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.",
   "alert.rate_limited.title": "מגבלות מיכסה",
@@ -70,7 +70,7 @@
   "column.blocks": "חסימות",
   "column.bookmarks": "סימניות",
   "column.community": "ציר זמן מקומי",
-  "column.conversations": "Conversations",
+  "column.direct": "הודעות ישירות",
   "column.directory": "גלוש פרופילים",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "חיבובים",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "מקומי בלבד",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "מרחוק בלבד",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "מידע נוסף",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "חצרוצים במסטודון אינם מוצפנים מקצה לקצה. לעולם אל תחלקו מידע רגיש דרך מסטודון.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
   "compose_form.lock_disclaimer.lock": "נעול",
@@ -105,11 +107,11 @@
   "compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר",
   "compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר",
   "compose_form.publish": "ללחוש",
-  "compose_form.publish_loud": "לחצרץ!",
-  "compose_form.save_changes": "Save changes",
-  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
-  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
-  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.save_changes": "שמירת שינויים",
+  "compose_form.sensitive.hide": "{count, plural, one {סימון מידע כרגיש} other {סימון מידע כרגיש}}",
+  "compose_form.sensitive.marked": "{count, plural, one {מידע מסומן כרגיש} other {מידע מסומן כרגיש}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {מידע לא מסומן כרגיש} other {מידע לא מסומן כרגיש}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "אזהרת תוכן",
@@ -121,14 +123,14 @@
   "confirmations.delete.message": "למחוק את ההודעה?",
   "confirmations.delete_list.confirm": "למחוק",
   "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?",
-  "confirmations.discard_edit_media.confirm": "Discard",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.discard_edit_media.confirm": "השלך",
+  "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?",
   "confirmations.domain_block.confirm": "הסתר קהילה שלמה",
   "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.",
   "confirmations.logout.confirm": "להתנתק",
   "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
   "confirmations.mute.confirm": "להשתיק",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "זה יסתיר חצרוצים שלהם וחצרוצים המזכירים אותם, אבל עדיין יתיר להם לראות פוסטים שלך ולעקוב אחריך.",
   "confirmations.mute.message": "להשתיק את {name}?",
   "confirmations.redraft.confirm": "מחק וערוך מחדש",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
@@ -140,13 +142,14 @@
   "conversation.mark_as_read": "סמן כנקרא",
   "conversation.open": "צפו בשיחה",
   "conversation.with": "עם {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
+  "directory.federated": "מהפדרציה הידועה",
+  "directory.local": "מ- {domain} בלבד",
+  "directory.new_arrivals": "חדשים כאן",
   "directory.recently_active": "פעילים לאחרונה",
   "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.",
   "embed.preview": "דוגמא כיצד זה יראה:",
   "emoji_button.activity": "פעילות",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "מיוחדים",
   "emoji_button.flags": "דגלים",
   "emoji_button.food": "אוכל ושתיה",
@@ -166,109 +169,111 @@
   "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.follow_recommendations": "נראה שלא ניתן לייצר המלצות עבורך. נסה/י להשתמש בחיפוש כדי למצוא אנשים מוכרים או לבדוק את הנושאים החמים.",
+  "empty_column.follow_requests": "אין לך שום בקשות מעקב עדיין. לכשיתקבלו כאלה, הן תופענה כאן.",
   "empty_column.hashtag": "אין כלום בהאשתג הזה עדיין.",
-  "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים.",
-  "empty_column.home.suggestions": "See some suggestions",
+  "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים. {suggestions}",
+  "empty_column.home.suggestions": "ראה/י כמה הצעות",
   "empty_column.list": "אין עדיין מאום ברשימה.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.",
+  "empty_column.mutes": "עוד לא השתקת שום משתמש.",
   "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.",
   "empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
-  "follow_recommendations.done": "Done",
-  "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
-  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "error.unexpected_crash.explanation": "עקב תקלה בקוד שלנו או בעיית תאימות דפדפן, לא ניתן להציג דף זה כראוי.",
+  "error.unexpected_crash.explanation_addons": "לא ניתן להציג דף זה כראוי. הבעיה נגרמת כנראה עקב תוסף דפדפן או כלי תרגום אוטומטי.",
+  "error.unexpected_crash.next_steps": "נסה/י לרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.",
+  "error.unexpected_crash.next_steps_addons": "נסה/י להסיר אותם ולרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.",
+  "errors.unexpected_crash.copy_stacktrace": "להעתיק את הקוד ללוח הכתיבה",
+  "errors.unexpected_crash.report_issue": "דווח על בעיה",
+  "explore.search_results": "תוצאות חיפוש",
+  "explore.suggested_follows": "עבורך",
+  "explore.title": "סיור",
+  "explore.trending_links": "חדשות",
+  "explore.trending_statuses": "חצרוצים",
+  "explore.trending_tags": "האשטאגים",
+  "follow_recommendations.done": "בוצע",
+  "follow_recommendations.heading": "עקב/י אחרי אנשים שתרצה/י לראות את חצרוציהם! הנה כמה הצעות.",
+  "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.",
-  "generic.saved": "Saved",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "follow_requests.unlocked_explanation": "למרות שחשבונך אינו נעול, צוות {domain} חושב שאולי כדאי לוודא את בקשות המעקב האלה ידנית.",
+  "generic.saved": "נשמר",
+  "getting_started.developers": "מפתחות",
+  "getting_started.directory": "ספריית פרופילים",
+  "getting_started.documentation": "תיעוד",
   "getting_started.heading": "בואו נתחיל",
-  "getting_started.invite": "Invite people",
+  "getting_started.invite": "להזמין אנשים",
   "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.",
   "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "getting_started.terms": "תנאי שימוש",
+  "hashtag.column_header.tag_mode.all": "ו- {additional}",
+  "hashtag.column_header.tag_mode.any": "או {additional}",
+  "hashtag.column_header.tag_mode.none": "ללא {additional}",
+  "hashtag.column_settings.select.no_options_message": "לא נמצאו הצעות",
+  "hashtag.column_settings.select.placeholder": "הזן תגי הקבצה…",
+  "hashtag.column_settings.tag_mode.all": "כל אלה",
+  "hashtag.column_settings.tag_mode.any": "כל אלה",
+  "hashtag.column_settings.tag_mode.none": "אפאחד מאלה",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "למתחילים",
   "home.column_settings.show_reblogs": "הצגת הדהודים",
   "home.column_settings.show_replies": "הצגת תגובות",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "home.hide_announcements": "הסתר הכרזות",
+  "home.show_announcements": "הצג הכרזות",
+  "intervals.full.days": "{number, plural, one {# יום} other {# ימים}}",
+  "intervals.full.hours": "{number, plural, one {# שעה} other {# שעות}}",
+  "intervals.full.minutes": "{number, plural, one {# דקה} other {# דקות}}",
   "keyboard_shortcuts.back": "ניווט חזרה",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.blocked": "פתיחת רשימת חסומים",
   "keyboard_shortcuts.boost": "להדהד",
   "keyboard_shortcuts.column": "להתמקד בהודעה באחד מהטורים",
   "keyboard_shortcuts.compose": "להתמקד בתיבת חיבור ההודעות",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "תיאור",
+  "keyboard_shortcuts.direct": "לפתיחת טור הודעות ישירות",
   "keyboard_shortcuts.down": "לנוע במורד הרשימה",
-  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.enter": "פתח חצרוץ",
   "keyboard_shortcuts.favourite": "לחבב",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.favourites": "פתיחת רשימת מועדפים",
+  "keyboard_shortcuts.federated": "פתיחת ציר זמן בין-קהילתי",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.home": "פתיחת ציר זמן אישי",
   "keyboard_shortcuts.hotkey": "מקש קיצור",
   "keyboard_shortcuts.legend": "להציג את הפירוש",
-  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.local": "פתיחת ציר זמן קהילתי",
   "keyboard_shortcuts.mention": "לאזכר את המחבר(ת)",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.open_media": "to open media",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.muted": "פתיחת רשימת משתמשים מושתקים",
+  "keyboard_shortcuts.my_profile": "פתיחת הפרופיל שלך",
+  "keyboard_shortcuts.notifications": "פתיחת טור התראות",
+  "keyboard_shortcuts.open_media": "פתיחת מדיה",
+  "keyboard_shortcuts.pinned": "פתיחת רשימת חצרותים מוצמדים",
+  "keyboard_shortcuts.profile": "פתח את פרופיל המשתמש",
   "keyboard_shortcuts.reply": "לענות",
-  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.requests": "פתיחת רשימת בקשות מעקב",
   "keyboard_shortcuts.search": "להתמקד בחלון החיפוש",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "הצגת/הסתרת שדה אזהרת תוכן (CW)",
   "keyboard_shortcuts.start": "to open \"get started\" column",
-  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toggle_hidden": "הצגת/הסתרת טקסט מוסתר מאחורי אזהרת תוכן",
+  "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה",
   "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש",
   "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
   "keyboard_shortcuts.up": "לנוע במעלה הרשימה",
   "lightbox.close": "סגירה",
-  "lightbox.compress": "Compress image view box",
-  "lightbox.expand": "Expand image view box",
+  "lightbox.compress": "דחיסת קופסת צפייה בתמונה",
+  "lightbox.expand": "הרחבת קופסת צפייה בתמונה",
   "lightbox.next": "הלאה",
   "lightbox.previous": "הקודם",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "הוסף לרשימה",
   "lists.account.remove": "הסר מרשימה",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
+  "lists.delete": "מחיקת רשימה",
+  "lists.edit": "עריכת רשימה",
+  "lists.edit.submit": "שנה/י כותרת",
   "lists.new.create": "הוספת רשימה",
   "lists.new.title_placeholder": "כותרת הרשימה החדשה",
   "lists.replies_policy.followed": "משתמשים שאני עוקב אחריהם",
@@ -277,7 +282,7 @@
   "lists.replies_policy.title": "הצג תגובות ל:",
   "lists.search": "חיפוש בין אנשים שאני עוקב\\ת אחריהם",
   "lists.subheading": "הרשימות שלך",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, one {# פריט חדש} other {# פריטים חדשים}}",
   "loading_indicator.label": "טוען...",
   "media_gallery.toggle_visible": "נראה\\בלתי נראה",
   "missing_indicator.label": "לא נמצא",
@@ -285,146 +290,147 @@
   "mute_modal.duration": "משך הזמן",
   "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
   "mute_modal.indefinite": "ללא תאריך סיום",
-  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.apps": "יישומונים לנייד",
   "navigation_bar.blocks": "חסימות",
-  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.bookmarks": "סימניות",
   "navigation_bar.community_timeline": "ציר זמן מקומי",
   "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.discover": "Discover",
+  "navigation_bar.direct": "הודעות ישירות",
+  "navigation_bar.discover": "גלה",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "עריכת פרופיל",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "חקור",
   "navigation_bar.favourites": "חיבובים",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "מילים מושתקות",
   "navigation_bar.follow_requests": "בקשות מעקב",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "נעקבים ועוקבים",
   "navigation_bar.info": "מידע נוסף",
   "navigation_bar.keyboard_shortcuts": "קיצורי מקלדת",
-  "navigation_bar.lists": "Lists",
+  "navigation_bar.lists": "רשימות",
   "navigation_bar.logout": "יציאה",
   "navigation_bar.mutes": "השתקות",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "אישי",
   "navigation_bar.pins": "חיצרוצים מקובעים",
   "navigation_bar.preferences": "העדפות",
   "navigation_bar.public_timeline": "ציר זמן בין-קהילתי",
-  "navigation_bar.security": "Security",
-  "notification.admin.sign_up": "{name} signed up",
+  "navigation_bar.security": "בטיחות",
+  "notification.admin.sign_up": "{name} נרשמו",
   "notification.favourite": "חצרוצך חובב על ידי {name}",
   "notification.follow": "{name} במעקב אחרייך",
-  "notification.follow_request": "{name} has requested to follow you",
+  "notification.follow_request": "{name} ביקשו לעקוב אחריך",
   "notification.mention": "אוזכרת על ידי {name}",
-  "notification.own_poll": "Your poll has ended",
-  "notification.poll": "A poll you have voted in has ended",
+  "notification.own_poll": "הסקר שלך הסתיים",
+  "notification.poll": "סקר שהצבעת בו הסתיים",
   "notification.reblog": "חצרוצך הודהד על ידי {name}",
-  "notification.status": "{name} just posted",
+  "notification.status": "{name} הרגע פרסמו",
   "notification.update": "{name} ערכו פוסט",
   "notifications.clear": "הסרת התראות",
   "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.admin.sign_up": "הרשמות חדשות:",
   "notifications.column_settings.alert": "התראות לשולחן העבודה",
   "notifications.column_settings.favourite": "מחובבים:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.filter_bar.advanced": "הצג את כל הקטגוריות",
+  "notifications.column_settings.filter_bar.category": "שורת סינון מהיר",
+  "notifications.column_settings.filter_bar.show_bar": "הצג שורת סינון",
   "notifications.column_settings.follow": "עוקבים חדשים:",
-  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.follow_request": "בקשות מעקב חדשות:",
   "notifications.column_settings.mention": "פניות:",
-  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.poll": "תוצאות סקר:",
   "notifications.column_settings.push": "הודעות בדחיפה",
   "notifications.column_settings.reblog": "הדהודים:",
   "notifications.column_settings.show": "הצגה בטור",
   "notifications.column_settings.sound": "שמע מופעל",
   "notifications.column_settings.status": "New toots:",
-  "notifications.column_settings.unread_notifications.category": "Unread notifications",
-  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.unread_notifications.category": "התראות שלא נקראו",
+  "notifications.column_settings.unread_notifications.highlight": "הבלט התראות שלא נקראו",
   "notifications.column_settings.update": "שינויים:",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.filter.statuses": "Updates from people you follow",
-  "notifications.grant_permission": "Grant permission.",
-  "notifications.group": "{count} notifications",
-  "notifications.mark_as_read": "Mark every notification as read",
-  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
-  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
-  "notifications_permission_banner.enable": "Enable desktop notifications",
-  "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.title": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "notifications.filter.all": "הכל",
+  "notifications.filter.boosts": "הדהודים",
+  "notifications.filter.favourites": "חיבובים",
+  "notifications.filter.follows": "נעקבים",
+  "notifications.filter.mentions": "אזכורים",
+  "notifications.filter.polls": "תוצאות סקר",
+  "notifications.filter.statuses": "עדכונים מאנשים במעקב",
+  "notifications.grant_permission": "מתן הרשאה.",
+  "notifications.group": "{count} התראות",
+  "notifications.mark_as_read": "סימון כל ההודעות כנקראו",
+  "notifications.permission_denied": "לא ניתן להציג התראות מסך כיוון כיוון שהרשאות דפדפן נשללו בעבר",
+  "notifications.permission_denied_alert": "לא ניתן לאפשר נוטיפיקציות מסך שכן הדפדפן סורב הרשאה בעבר",
+  "notifications.permission_required": "לא ניתן לאפשר נוטיפיקציות מסך כיוון שהרשאה דרושה לא ניתנה.",
+  "notifications_permission_banner.enable": "לאפשר נוטיפיקציות מסך",
+  "notifications_permission_banner.how_to_control": "כדי לקבל הודעות גם כאשר מסטודון סגור יש לאפשר נוטיפיקציות מסך. ניתן לשלוט בדיוק איזה סוג של אינטראקציות יביא לנוטיפיקציות מסך דרך כפתור ה- {icon} מרגע שהן מאופשרות.",
+  "notifications_permission_banner.title": "לעולם אל תחמיץ דבר",
+  "picture_in_picture.restore": "החזירי למקומו",
+  "poll.closed": "סגור",
+  "poll.refresh": "רענון",
+  "poll.total_people": "{count, plural, one {# איש/אישה} other {# אנשים}}",
+  "poll.total_votes": "{count, plural, one {# קול} other {# קולות}}",
+  "poll.vote": "קול",
+  "poll.voted": "הצבעת לתשובה זו",
+  "poll.votes": "{votes, plural, one {# קול} other {# קולות}}",
+  "poll_button.add_poll": "הוספת סקר",
+  "poll_button.remove_poll": "הסרת סקר",
   "privacy.change": "שינוי פרטיות ההודעה",
   "privacy.direct.long": "הצג רק למי שהודעה זו פונה אליו",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "אנשים מוזכרים בלבד",
   "privacy.private.long": "הצג לעוקבים בלבד",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "עוקבים בלבד",
+  "privacy.public.long": "גלוי לכל",
   "privacy.public.short": "פומבי",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי גילוי",
   "privacy.unlisted.short": "לא לפיד הכללי",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
-  "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
-  "relative_time.hours": "{number}h",
+  "refresh": "רענון",
+  "regeneration_indicator.label": "טוען…",
+  "regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!",
+  "relative_time.days": "{number} ימים",
+  "relative_time.full.days": "לפני {number, plural, one {# יום} other {# ימים}}",
+  "relative_time.full.hours": "לפני {number, plural, one {# שעה} other {# שעות}}",
+  "relative_time.full.just_now": "ממש עכשיו",
+  "relative_time.full.minutes": "לפני {number, plural, one {# דקה} other {# דקות}}",
+  "relative_time.full.seconds": "לפני {number, plural, one {# שניה} other {# שניות}}",
+  "relative_time.hours": "{number} שעות",
   "relative_time.just_now": "כרגע",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
-  "relative_time.today": "today",
+  "relative_time.minutes": "{number} דקות",
+  "relative_time.seconds": "{number} שניות",
+  "relative_time.today": "היום",
   "reply_indicator.cancel": "ביטול",
-  "report.block": "Block",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
-  "report.category.subtitle": "Choose the best match",
-  "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
-  "report.category.title_status": "post",
-  "report.close": "Done",
-  "report.comment.title": "Is there anything else you think we should know?",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.mute": "Mute",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
-  "report.next": "Next",
+  "report.block": "לחסום",
+  "report.block_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם לא יוכלו לראות את חצרוציך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.",
+  "report.categories.other": "אחר",
+  "report.categories.spam": "ספאם",
+  "report.categories.violation": "התוכן מפר אחד או יותר מחוקי השרת",
+  "report.category.subtitle": "בחר/י את המתאים ביותר",
+  "report.category.title": "ספר/י לנו מה קורה עם ה-{type} הזה",
+  "report.category.title_account": "פרופיל",
+  "report.category.title_status": "חצרוץ",
+  "report.close": "בוצע",
+  "report.comment.title": "האם יש דבר נוסף שלדעתך חשוב שנדע?",
+  "report.forward": "קדם ל-{target}",
+  "report.forward_hint": "חשבון זה הוא משרת אחר. האם לשלוח בנוסף עותק אנונימי לשם?",
+  "report.mute": "להשתיק",
+  "report.mute_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם עדיין יוכלו לעקוב אחריך ולראות את חצרוציך ולא ידעו שהם מושתקים.",
+  "report.next": "הבא",
   "report.placeholder": "הערות נוספות",
-  "report.reasons.dislike": "I don't like it",
-  "report.reasons.dislike_description": "It is not something you want to see",
-  "report.reasons.other": "It's something else",
-  "report.reasons.other_description": "The issue does not fit into other categories",
-  "report.reasons.spam": "It's spam",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
-  "report.reasons.violation": "It violates server rules",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
-  "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.reasons.dislike": "אני לא אוהב את זה",
+  "report.reasons.dislike_description": "זה לא משהו שתרצה/י לראות",
+  "report.reasons.other": "זה משהו אחר",
+  "report.reasons.other_description": "הבעיה לא מתאימה לקטגוריות אחרות",
+  "report.reasons.spam": "זה ספאם",
+  "report.reasons.spam_description": "קישורים מרושעים, התייחסות מזוייפת או תגובות חוזרות",
+  "report.reasons.violation": "מפר את חוקי השרת",
+  "report.reasons.violation_description": "את/ה מודע/ת לכך שזה מפר חוקים ספציפיים",
+  "report.rules.subtitle": "בחר/י את כל המתאימים",
+  "report.rules.title": "אילו חוקים מופרים?",
+  "report.statuses.subtitle": "בחר/י את כל המתאימים",
+  "report.statuses.title": "האם ישנם חצרוצים התומכים בדיווח זה?",
   "report.submit": "שליחה",
-  "report.target": "דיווח",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.target": "דיווח על {target}",
+  "report.thanks.take_action": "הנה כמה אפשרויות לשליטה בתצוגת מסטודון:",
+  "report.thanks.take_action_actionable": "בזמן שאנו בוחנות את הדיווח, ניתן לפעול כנגד @{name}:",
+  "report.thanks.title": "לא מעוניין/ת לראות את זה?",
+  "report.thanks.title_actionable": "תודה על הדיווח, נבדוק את העניין.",
+  "report.unfollow": "הפסיקו לעקוב אחרי @{name}",
+  "report.unfollow_explanation": "אתם עוקבים אחרי החשבון הזה. כדי להפסיק לראות את הפרסומים שלו בפיד הבית שלכם, הפסיקו לעקוב אחריהם.",
   "search.placeholder": "חיפוש",
   "search_popout.search_format": "מבנה חיפוש מתקדם",
   "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.",
@@ -432,112 +438,112 @@
   "search_popout.tips.status": "status",
   "search_popout.tips.text": "טקסט פשוט מחזיר כינויים, שמות משתמש והאשתגים",
   "search_popout.tips.user": "משתמש(ת)",
-  "search_results.accounts": "People",
-  "search_results.all": "All",
-  "search_results.hashtags": "Hashtags",
-  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.accounts": "אנשים",
+  "search_results.all": "כל התוצאות",
+  "search_results.hashtags": "האשתגיות",
+  "search_results.nothing_found": "לא נמצא דבר עבור תנאי חיפוש אלה",
   "search_results.statuses": "Toots",
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}",
-  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_account": "פתח/י ממשק ניהול עבור @{name}",
   "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.bookmark": "Bookmark",
-  "status.cancel_reblog_private": "Unboost",
+  "status.block": "חסימת @{name}",
+  "status.bookmark": "סימניה",
+  "status.cancel_reblog_private": "הסרת הדהוד",
   "status.cannot_reblog": "לא ניתן להדהד הודעה זו",
   "status.copy": "Copy link to status",
   "status.delete": "מחיקה",
-  "status.detailed_status": "Detailed conversation view",
+  "status.detailed_status": "תצוגת שיחה מפורטת",
   "status.direct": "הודעה ישירה ל@{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "עריכה",
+  "status.edited": "נערך ב{date}",
+  "status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}",
   "status.embed": "הטמעה",
   "status.favourite": "חיבוב",
-  "status.filtered": "Filtered",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.filtered": "סונן",
+  "status.history.created": "{name} יצר/ה {date}",
+  "status.history.edited": "{name} ערך/ה {date}",
   "status.load_more": "עוד",
   "status.media_hidden": "מדיה מוסתרת",
   "status.mention": "פניה אל @{name}",
   "status.more": "עוד",
-  "status.mute": "Mute @{name}",
+  "status.mute": "להשתיק את @{name}",
   "status.mute_conversation": "השתקת שיחה",
   "status.open": "הרחבת הודעה",
   "status.pin": "לקבע באודות",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
+  "status.read_more": "לקרוא עוד",
   "status.reblog": "הדהוד",
-  "status.reblog_private": "Boost with original visibility",
+  "status.reblog_private": "להדהד ברמת הנראות המקורית",
   "status.reblogged_by": "הודהד על ידי {name}",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
-  "status.remove_bookmark": "Remove bookmark",
+  "status.redraft": "מחיקה ועריכה מחדש",
+  "status.remove_bookmark": "הסרת סימניה",
   "status.reply": "תגובה",
   "status.replyAll": "תגובה לכולם",
   "status.report": "דיווח על @{name}",
   "status.sensitive_warning": "תוכן רגיש",
   "status.share": "שיתוף",
   "status.show_less": "הראה פחות",
-  "status.show_less_all": "Show less for all",
+  "status.show_less_all": "להציג פחות מהכל",
   "status.show_more": "הראה יותר",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.show_more_all": "להציג יותר מהכל",
+  "status.show_thread": "להציג סיב",
+  "status.uncached_media_warning": "לא זמין",
   "status.unmute_conversation": "הסרת השתקת שיחה",
   "status.unpin": "לשחרר מקיבוע באודות",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "להתעלם מהצעה",
+  "suggestions.header": "ייתכן שזה יעניין אותך…",
   "tabs_bar.federated_timeline": "ציר זמן בין-קהילתי",
   "tabs_bar.home": "בבית",
   "tabs_bar.local_timeline": "ציר זמן מקומי",
   "tabs_bar.notifications": "התראות",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
+  "tabs_bar.search": "חיפוש",
+  "time_remaining.days": "נותרו {number, plural, one {# יום} other {# ימים}}",
+  "time_remaining.hours": "נותרו {number, plural, one {# שעה} other {# שעות}}",
+  "time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}",
+  "time_remaining.moments": "רגעים נותרו",
+  "time_remaining.seconds": "נותרו {number, plural, one {# שניה} other {# שניות}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} משרתים אחרים לא מוצגים.",
+  "timeline_hint.resources.followers": "עוקבים",
+  "timeline_hint.resources.follows": "נעקבים",
   "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Trending now",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} אחד/ת מדבר/ת} other {{counter} אנשים מדברים}}",
+  "trends.trending_now": "נושאים חמים",
   "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count} מליארד",
+  "units.short.million": "{count} מליון",
+  "units.short.thousand": "{count} אלפים",
   "upload_area.title": "ניתן להעלות על ידי Drag & drop",
   "upload_button.label": "הוספת מדיה",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_error.limit": "קובץ להעלאה חורג מנפח מותר.",
+  "upload_error.poll": "לא ניתן להעלות קובץ עם סקר.",
+  "upload_form.audio_description": "תאר/י עבור לקויי שמיעה",
   "upload_form.description": "תיאור לכבדי ראיה",
-  "upload_form.description_missing": "No description added",
-  "upload_form.edit": "Edit",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.description_missing": "לא הוסף תיאור",
+  "upload_form.edit": "עריכה",
+  "upload_form.thumbnail": "שנה/י תמונה ממוזערת",
   "upload_form.undo": "ביטול",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.applying": "Applying…",
-  "upload_modal.choose_image": "Choose image",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preparing_ocr": "Preparing OCR…",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_form.video_description": "תאר/י עבור לקויי שמיעה ולקויי ראייה",
+  "upload_modal.analyzing_picture": "מנתח תמונה…",
+  "upload_modal.apply": "החל",
+  "upload_modal.applying": "מחיל…",
+  "upload_modal.choose_image": "בחר/י תמונה",
+  "upload_modal.description_placeholder": "דג סקרן שט בים מאוכזב ולפתע מצא חברה",
+  "upload_modal.detect_text": "זהה טקסט מתמונה",
+  "upload_modal.edit_media": "עריכת מדיה",
+  "upload_modal.hint": "הקליקי או גררי את המעגל על גבי התצוגה המקדימה על מנת לבחור בנקודת המוקד שתראה תמיד בכל התמונות הממוזערות.",
+  "upload_modal.preparing_ocr": "מכין OCR…",
+  "upload_modal.preview_label": "תצוגה ({ratio})",
   "upload_progress.label": "עולה...",
   "video.close": "סגירת וידאו",
-  "video.download": "Download file",
+  "video.download": "הורדת קובץ",
   "video.exit_fullscreen": "יציאה ממסך מלא",
   "video.expand": "להרחיב וידאו",
-  "video.fullscreen": "Full screen",
+  "video.fullscreen": "מסך מלא",
   "video.hide": "להסתיר וידאו",
   "video.mute": "השתקת צליל",
-  "video.pause": "Pause",
+  "video.pause": "השהיה",
   "video.play": "ניגון",
   "video.unmute": "החזרת צליל"
 }
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index d208cf51e..b347784af 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -9,21 +9,21 @@
   "account.browse_more_on_origin_server": "मूल प्रोफ़ाइल पर अधिक ब्राउज़ करें",
   "account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
   "account.direct": "प्रत्यक्ष संदेश @{name}",
-  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो",
   "account.domain_blocked": "छिपा हुआ डोमेन",
   "account.edit_profile": "प्रोफ़ाइल संपादित करें",
-  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.enable_notifications": "जब @{name} पोस्ट मौजूद हो सूचित करें",
   "account.endorse": "प्रोफ़ाइल पर दिखाए",
   "account.follow": "फॉलो करें",
   "account.followers": "फॉलोवर",
   "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
   "account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}",
-  "account.following": "Following",
+  "account.following": "फॉलोइंग",
   "account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}",
   "account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
   "account.follows_you": "आपको फॉलो करता है",
   "account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
-  "account.joined": "Joined {date}",
+  "account.joined": "शामिल हुये {date}",
   "account.link_verified_on": "इस लिंक का स्वामित्व {date} को चेक किया गया था",
   "account.locked_info": "यह खाता गोपनीयता स्थिति लॉक करने के लिए सेट है। मालिक मैन्युअल रूप से समीक्षा करता है कि कौन उनको फॉलो कर सकता है।",
   "account.media": "मीडिया",
@@ -41,24 +41,24 @@
   "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}",
   "account.unblock": "@{name} को अनब्लॉक करें",
   "account.unblock_domain": "{domain} दिखाए",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "अनब्लॉक",
   "account.unendorse": "प्रोफ़ाइल पर न दिखाए",
   "account.unfollow": "अनफॉलो करें",
   "account.unmute": "अनम्यूट @{name}",
   "account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
-  "account.unmute_short": "Unmute",
+  "account.unmute_short": "अनम्यूट",
   "account_note.placeholder": "नोट्स जोड़ने के लिए क्लिक करें",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
-  "admin.dashboard.retention.average": "Average",
-  "admin.dashboard.retention.cohort": "Sign-up month",
-  "admin.dashboard.retention.cohort_size": "New users",
+  "admin.dashboard.daily_retention": "साईन-अप के बाद उपयोगकर्ता के रिटेंशन दर",
+  "admin.dashboard.monthly_retention": "साईन-अप के बाद उपयोगकर्ता के महीने तक रिटेंशन दर",
+  "admin.dashboard.retention.average": "औसत",
+  "admin.dashboard.retention.cohort": "साईन-अप महिना",
+  "admin.dashboard.retention.cohort_size": "नये उपयोगकर्ता",
   "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें",
   "alert.rate_limited.title": "सीमित दर",
   "alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
   "alert.unexpected.title": "उफ़!",
   "announcement.announcement": "घोषणा",
-  "attachments_list.unprocessed": "(unprocessed)",
+  "attachments_list.unprocessed": "(असंसाधित)",
   "autosuggest_hashtag.per_week": "{count} हर सप्ताह",
   "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
   "bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
@@ -70,7 +70,7 @@
   "column.blocks": "ब्लॉक्ड यूज़र्स",
   "column.bookmarks": "पुस्तकचिह्न:",
   "column.community": "लोकल टाइम्लाइन",
-  "column.conversations": "Conversations",
+  "column.direct": "सीधा संदेश",
   "column.directory": "प्रोफाइल्स खोजें",
   "column.domain_blocks": "छुपे डोमेन्स",
   "column.favourites": "पसंदीदा",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "स्थानीय ही",
   "community.column_settings.media_only": "सिर्फ़ मीडिया",
   "community.column_settings.remote_only": "केवल सुदूर",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "और जानें",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "मास्टोडॉन पर पोस्ट एन्ड-टू-एन्ड एन्क्रिप्टेड नहीं है",
   "compose_form.hashtag_warning": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।",
   "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।",
   "compose_form.lock_disclaimer.lock": "लॉक्ड",
@@ -106,7 +108,7 @@
   "compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
   "compose_form.publish": "टूट्",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "परिवर्तनों को सहेजें",
   "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
   "compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है",
   "compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है",
@@ -121,8 +123,8 @@
   "confirmations.delete.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं?",
   "confirmations.delete_list.confirm": "मिटाए",
   "confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?",
-  "confirmations.discard_edit_media.confirm": "Discard",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.discard_edit_media.confirm": "डिस्कार्ड",
+  "confirmations.discard_edit_media.message": "लिस्ट में जोड़ें",
   "confirmations.domain_block.confirm": "संपूर्ण डोमेन छिपाएं",
   "confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।",
   "confirmations.logout.confirm": "लॉग आउट करें",
@@ -147,6 +149,7 @@
   "embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें",
   "embed.preview": "यह ऐसा दिखेगा :",
   "emoji_button.activity": "गतिविधि",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "निजीकृत",
   "emoji_button.flags": "झंडे",
   "emoji_button.food": "भोजन एवं पेय",
@@ -160,15 +163,15 @@
   "emoji_button.search_results": "खोज परिणाम",
   "emoji_button.symbols": "प्रतीक",
   "emoji_button.travel": "यात्रा एवं स्थान",
-  "empty_column.account_suspended": "Account suspended",
+  "empty_column.account_suspended": "खाता निलंबित",
   "empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!",
   "empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं",
   "empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।",
   "empty_column.bookmarked_statuses": "आपके पास अभी तक कोई बुकमार्क नहीं है। जब आप एक बुकमार्क करते हैं, तो यह यहां दिखाई देगा।",
   "empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "आपके पास अभी तक कोई सीधा संदेश नहीं है, जब आप भेजेंगे या प्राप्त करेंगे तो ये यहाँ दिखेगा |",
   "empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "कुछ भी अभी ट्रैंडिंग नहीं है, कुछ देर बाद जांचे!",
   "empty_column.favourited_statuses": "आपके पास अभी कोई भी चहिता टूट नहीं है. जब आप किसी टूट को पसंद (स्टार) करेंगे, तब वो यहाँ दिखेगा।",
   "empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।",
   "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "बढ़ावा देने के लिए",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "कंपोज़ टेक्स्ट-एरिया पर ध्यान केंद्रित करने के लिए",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "विवरण",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "सूची में शामिल करने के लिए",
   "keyboard_shortcuts.enter": "स्टेटस खोलने के लिए",
   "keyboard_shortcuts.favourite": "पसंदीदा के लिए",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "अगला",
   "lightbox.previous": "पिछला",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "सूची से निकालें",
   "lists.delete": "सूची हटाएँ",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "पुस्तकचिह्न:",
   "navigation_bar.community_timeline": "लोकल टाइम्लाइन",
   "navigation_bar.compose": "नया टूट् लिखें",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "खोजें",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 16434ea46..4096c98d0 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokirani korisnici",
   "column.bookmarks": "Knjižne oznake",
   "column.community": "Lokalna vremenska crta",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Pregledavanje profila",
   "column.domain_blocks": "Blokirane domene",
   "column.favourites": "Favoriti",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Samo lokalno",
   "community.column_settings.media_only": "Samo medijski sadržaj",
   "community.column_settings.remote_only": "Samo udaljeno",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Saznajte više",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Ovaj toot neće biti prikazan ni pod jednim hashtagom jer je postavljen kao neprikazan. Samo javni tootovi mogu biti pretraživani pomoći hashtagova.",
@@ -122,7 +124,7 @@
   "confirmations.delete_list.confirm": "Obriši",
   "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?",
   "confirmations.discard_edit_media.confirm": "Odbaciti",
-  "confirmations.discard_edit_media.message": "Niste spremili promjene u opisu medija ili u predpregledu, svejedno ih odbaciti?",
+  "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?",
   "confirmations.domain_block.confirm": "Blokiraj cijelu domenu",
   "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.",
   "confirmations.logout.confirm": "Odjavi se",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Evo kako će izgledati:",
   "emoji_button.activity": "Aktivnost",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Prilagođeno",
   "emoji_button.flags": "Zastave",
   "emoji_button.food": "Hrana i piće",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Još niste blokirali nikoga.",
   "empty_column.bookmarked_statuses": "Još nemaš niti jedan označeni toot. Kada označiš jedan, prikazad će se ovdje.",
   "empty_column.community": "Lokalna vremenska crta je prazna. Napišite nešto javno da biste pokrenuli stvari!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Još nema blokiranih domena.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "za boostanje",
   "keyboard_shortcuts.column": "za fokusiranje na toot u jednom od stupaca",
   "keyboard_shortcuts.compose": "za fokusiranje na tekstualni okvir za stvaranje",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Opis",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "za pomak dolje na listi",
   "keyboard_shortcuts.enter": "za otvaranje toota",
   "keyboard_shortcuts.favourite": "za označavanje favoritom",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sljedeće",
   "lightbox.previous": "Prethodno",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Dodaj na listu",
   "lists.account.remove": "Ukloni s liste",
   "lists.delete": "Izbriši listu",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalna vremenska crta",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Istraživanje",
   "navigation_bar.domain_blocks": "Blokirane domene",
   "navigation_bar.edit_profile": "Uredi profil",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index ccf0dd3fd..b22778e71 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -70,7 +70,7 @@
   "column.blocks": "Letiltott felhasználók",
   "column.bookmarks": "Könyvjelzők",
   "column.community": "Helyi idővonal",
-  "column.conversations": "Beszélgetések",
+  "column.direct": "Közvetlen üzenetek",
   "column.directory": "Profilok böngészése",
   "column.domain_blocks": "Rejtett domainek",
   "column.favourites": "Kedvencek",
@@ -86,12 +86,14 @@
   "column_header.moveLeft_settings": "Oszlop elmozdítása balra",
   "column_header.moveRight_settings": "Oszlop elmozdítása jobbra",
   "column_header.pin": "Kitűzés",
-  "column_header.show_settings": "Beállítások mutatása",
+  "column_header.show_settings": "Beállítások megjelenítése",
   "column_header.unpin": "Kitűzés eltávolítása",
   "column_subheading.settings": "Beállítások",
   "community.column_settings.local_only": "Csak helyi",
   "community.column_settings.media_only": "Csak média",
   "community.column_settings.remote_only": "Csak távoli",
+  "compose.language.change": "Nyelv megváltoztatása",
+  "compose.language.search": "Nyelv keresése...",
   "compose_form.direct_message_warning_learn_more": "Tudj meg többet",
   "compose_form.encryption_warning": "A bejegyzések a Mastodonon nem használnak végpontok közötti titkosítást. Ne ossz meg érzékeny információt Mastodonon.",
   "compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel listázatlan. Csak a nyilvános bejegyzések kereshetők hashtaggel.",
@@ -110,8 +112,8 @@
   "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": "A szöveg figyelmeztetés mögé van rejtve",
-  "compose_form.spoiler.unmarked": "A szöveg nem rejtett",
+  "compose_form.spoiler.marked": "Tartalmi figyelmeztetés törlése",
+  "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása",
   "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést",
   "confirmation_modal.cancel": "Mégse",
   "confirmations.block.block_and_report": "Letiltás és jelentés",
@@ -147,6 +149,7 @@
   "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",
+  "emoji_button.clear": "Törlés",
   "emoji_button.custom": "Egyéni",
   "emoji_button.flags": "Zászlók",
   "emoji_button.food": "Étel és Ital",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Még senkit sem tiltottál le.",
   "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.conversations": "Ha olyan bejegyzést küldesz vagy fogadsz, melyet csak az abban megemlítettek látnak, itt fog megjelenni.",
+  "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.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.",
@@ -219,9 +222,9 @@
   "hashtag.column_settings.tag_toggle": "Új címkék felvétele ehhez az oszlophoz",
   "home.column_settings.basic": "Alapvető",
   "home.column_settings.show_reblogs": "Megtolások mutatása",
-  "home.column_settings.show_replies": "Válaszok mutatása",
+  "home.column_settings.show_replies": "Válaszok megjelenítése",
   "home.hide_announcements": "Közlemények elrejtése",
-  "home.show_announcements": "Közlemények mutatása",
+  "home.show_announcements": "Közlemények megjelenítése",
   "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}}",
@@ -230,8 +233,8 @@
   "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.conversations": "beszélgetések megnyitá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.enter": "Bejegyzés megnyitása",
   "keyboard_shortcuts.favourite": "Bejegyzés kedvencnek jelölése",
@@ -252,10 +255,10 @@
   "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.spoilers": "CW mező mutatása/elrejtése",
+  "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 mutatása/elrejtése",
-  "keyboard_shortcuts.toggle_sensitivity": "média mutatása/elrejtése",
+  "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott 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",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Képnézet kinagyítá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 kiszolgálód 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",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Könyvjelzők",
   "navigation_bar.community_timeline": "Helyi idővonal",
   "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.edit_profile": "Profil szerkesztése",
@@ -323,7 +329,7 @@
   "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 mutatása",
+  "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.follow": "Új követők:",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Szavazás törlése",
   "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 a megemlítettek",
+  "privacy.direct.short": "Csak megemlítetteknek",
   "privacy.private.long": "Csak követőknek látható",
   "privacy.private.short": "Csak követők",
   "privacy.public.long": "Mindenki számára látható",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index c7ba3b852..1285403fc 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -70,7 +70,7 @@
   "column.blocks": "Արգելափակուած օգտատէրեր",
   "column.bookmarks": "Էջանիշեր",
   "column.community": "Տեղական հոսք",
-  "column.conversations": "Զրոյցներ",
+  "column.direct": "Հասցէագրուած",
   "column.directory": "Զննել անձնական էջերը",
   "column.domain_blocks": "Թաքցուած տիրոյթները",
   "column.favourites": "Հաւանածներ",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "Միայն տեղական",
   "community.column_settings.media_only": "Միայն մեդիա",
   "community.column_settings.remote_only": "Միայն հեռակայ",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Մաստոդոնում գրառումները ծայրից-ծայր գաղտնագրուող չեն։ Գաղտնիք պարունակող նամակներ մի ուղարկէք։",
   "compose_form.hashtag_warning": "Այս գրառումը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։",
   "compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
@@ -147,6 +149,7 @@
   "embed.instructions": "Այս գրառումը քո կայքում ներդնելու համար կարող ես պատճէնել ներքեւի կոդը։",
   "embed.preview": "Ահա, թէ ինչ տեսք կունենայ այն՝",
   "emoji_button.activity": "Զբաղմունքներ",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Յատուկ",
   "emoji_button.flags": "Դրօշներ",
   "emoji_button.food": "Կերուխում",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
   "empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշուած գրառում։ Երբ էջանշես, դրանք կը երեւան այստեղ։",
   "empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն կերեւայ այստեղ։",
   "empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած գրառում։ Երբ հաւանես, դրանք կերեւան այստեղ։",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "տարածելու համար",
   "keyboard_shortcuts.column": "սիւներից մէկի վրայ սեւեռուելու համար",
   "keyboard_shortcuts.compose": "շարադրման տիրոյթին սեւեռուելու համար",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Նկարագրութիւն",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "ցանկով ներքեւ շարժուելու համար",
   "keyboard_shortcuts.enter": "Գրառումը բացելու համար",
   "keyboard_shortcuts.favourite": "հաւանելու համար",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Բացել պատկերի դիտման պատուհանը",
   "lightbox.next": "Յաջորդ",
   "lightbox.previous": "Նախորդ",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Աւելացնել ցանկին",
   "lists.account.remove": "Հանել ցանկից",
   "lists.delete": "Ջնջել ցանկը",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Էջանիշեր",
   "navigation_bar.community_timeline": "Տեղական հոսք",
   "navigation_bar.compose": "Ստեղծել նոր գրառում",
+  "navigation_bar.direct": "Հասցէագրուած նամակներ",
   "navigation_bar.discover": "Բացայայտել",
   "navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
   "navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Հեռացնել հարցումը",
   "privacy.change": "Կարգաւորել գրառման գաղտնիութիւնը",
   "privacy.direct.long": "Կը տեսնեն միայն նշուած օգտատէրերը",
-  "privacy.direct.short": "Միայն նշածս մարդիկ",
+  "privacy.direct.short": "Direct",
   "privacy.private.long": "Կը տեսնեն միայն հետեւորդները",
   "privacy.private.short": "Միայն հետեւողները",
   "privacy.public.long": "Տեսանելի բոլորին",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index c093688e4..ada2876dd 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -70,7 +70,7 @@
   "column.blocks": "Pengguna yang diblokir",
   "column.bookmarks": "Markah",
   "column.community": "Linimasa Lokal",
-  "column.conversations": "Percakapan",
+  "column.direct": "Pesan langsung",
   "column.directory": "Jelajahi profil",
   "column.domain_blocks": "Topik tersembunyi",
   "column.favourites": "Favorit",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Hanya lokal",
   "community.column_settings.media_only": "Hanya media",
   "community.column_settings.remote_only": "Hanya jarak jauh",
+  "compose.language.change": "Ganti bahasa",
+  "compose.language.search": "Telusuri bahasa...",
   "compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
   "compose_form.encryption_warning": "Kiriman di Mastodon tidak dienkripsi end-to-end. Jangan bagikan informasi rahasial melalui Mastodon.",
   "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah diatur sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Sematkan kiriman ini di website anda dengan menyalin kode di bawah ini.",
   "embed.preview": "Tampilan akan seperti ini nantinya:",
   "emoji_button.activity": "Aktivitas",
+  "emoji_button.clear": "Hapus",
   "emoji_button.custom": "Kustom",
   "emoji_button.flags": "Bendera",
   "emoji_button.food": "Makanan & Minuman",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Anda belum memblokir siapapun.",
   "empty_column.bookmarked_statuses": "Anda belum memiliki toot termarkah. Saat Anda menandainya sebagai markah, ia akan muncul di sini.",
   "empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!",
-  "empty_column.conversations": "Saat Anda mengirim atau menerima kiriman yang hanya terlihat oleh orang yang disebutkan, itu akan muncul di sini.",
+  "empty_column.direct": "Anda belum memiliki pesan langsung. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.",
   "empty_column.domain_blocks": "Tidak ada topik tersembunyi.",
   "empty_column.explore_statuses": "Tidak ada yang sedang tren pada saat ini. Silakan mengecek lagi nanti!",
   "empty_column.favourited_statuses": "Anda belum memiliki toot favorit. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "untuk menyebarkan",
   "keyboard_shortcuts.column": "untuk fokus kepada sebuah status di sebuah kolom",
   "keyboard_shortcuts.compose": "untuk fokus ke area penulisan",
-  "keyboard_shortcuts.conversations": "untuk membuka kolom percakapan",
   "keyboard_shortcuts.description": "Deskripsi",
+  "keyboard_shortcuts.direct": "untuk membuka kolom pesan langsung",
   "keyboard_shortcuts.down": "untuk pindah ke bawah dalam sebuah daftar",
   "keyboard_shortcuts.enter": "untuk membuka status",
   "keyboard_shortcuts.favourite": "untuk memfavoritkan",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Besarkan kotak tampilan gambar",
   "lightbox.next": "Selanjutnya",
   "lightbox.previous": "Sebelumnya",
+  "limited_account_hint.action": "Tetap tampilkan profil",
+  "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator server Anda.",
   "lists.account.add": "Tambah ke daftar",
   "lists.account.remove": "Hapus dari daftar",
   "lists.delete": "Hapus daftar",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Markah",
   "navigation_bar.community_timeline": "Linimasa lokal",
   "navigation_bar.compose": "Tulis toot baru",
+  "navigation_bar.direct": "Pesan langsung",
   "navigation_bar.discover": "Temukan",
   "navigation_bar.domain_blocks": "Domain tersembunyi",
   "navigation_bar.edit_profile": "Ubah profil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Hapus japat",
   "privacy.change": "Tentukan privasi status",
   "privacy.direct.long": "Kirim hanya ke pengguna yang disebut",
-  "privacy.direct.short": "Hanya orang yang saya sebut",
+  "privacy.direct.short": "Orang yang disebutkan saja",
   "privacy.private.long": "Kirim postingan hanya kepada pengikut",
   "privacy.private.short": "Pengikut saja",
   "privacy.public.long": "Terlihat oleh semua",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index d0ce09335..bb13779f3 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -6,7 +6,7 @@
   "account.block": "Blokusar @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Restriktita",
-  "account.browse_more_on_origin_server": "Videz plu che originala profilo",
+  "account.browse_more_on_origin_server": "Videz pluse che originala profilo",
   "account.cancel_follow_request": "Removez sequodemando",
   "account.direct": "Direct Message @{name}",
   "account.disable_notifications": "Cesez avizar me kande @{name} postas",
@@ -48,8 +48,8 @@
   "account.unmute_notifications": "Desilencigez avizi de @{name}",
   "account.unmute_short": "Desilencigez",
   "account_note.placeholder": "Click to add a note",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Dia uzantoretenseso pos registro",
+  "admin.dashboard.monthly_retention": "Monata uzantoreteneso pos registro",
   "admin.dashboard.retention.average": "Averajo",
   "admin.dashboard.retention.cohort": "Registromonato",
   "admin.dashboard.retention.cohort_size": "Nova uzanti",
@@ -68,170 +68,173 @@
   "bundle_modal_error.message": "Nulo ne functionis dum chargar ca kompozaj.",
   "bundle_modal_error.retry": "Probez itere",
   "column.blocks": "Blokusita uzeri",
-  "column.bookmarks": "Bookmarks",
+  "column.bookmarks": "Libromarki",
   "column.community": "Lokala tempolineo",
-  "column.conversations": "Conversations",
-  "column.directory": "Browse profiles",
+  "column.direct": "Direta mesaji",
+  "column.directory": "Videz profili",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Favorati",
   "column.follow_requests": "Demandi di sequado",
   "column.home": "Hemo",
-  "column.lists": "Lists",
+  "column.lists": "Listi",
   "column.mutes": "Celita uzeri",
   "column.notifications": "Savigi",
   "column.pins": "Pinned toot",
   "column.public": "Federata tempolineo",
   "column_back_button.label": "Retro",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.local_only": "Local only",
+  "column_header.hide_settings": "Celez ajusti",
+  "column_header.moveLeft_settings": "Movez kolumno a la sinistro",
+  "column_header.moveRight_settings": "Movez kolumno a la dextro",
+  "column_header.pin": "Pinglagez",
+  "column_header.show_settings": "Montrez ajusti",
+  "column_header.unpin": "Depinglagez",
+  "column_subheading.settings": "Ajusti",
+  "community.column_settings.local_only": "Lokala nur",
   "community.column_settings.media_only": "Media only",
-  "community.column_settings.remote_only": "Remote only",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "community.column_settings.remote_only": "Fora nur",
+  "compose.language.change": "Chanjez linguo",
+  "compose.language.search": "Trovez linguo...",
+  "compose_form.direct_message_warning_learn_more": "Lernez pluse",
+  "compose_form.encryption_warning": "Posti di Mastodon ne intersequante chifrigesas. Ne partigez irga danjera informo che Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.lock_disclaimer": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.",
+  "compose_form.lock_disclaimer.lock": "klefagesas",
   "compose_form.placeholder": "Quo esas en tua spirito?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.add_option": "Insertez selekto",
+  "compose_form.poll.duration": "Votpostoduro",
+  "compose_form.poll.option_placeholder": "Selektato {number}",
+  "compose_form.poll.remove_option": "Efacez ca selektajo",
+  "compose_form.poll.switch_to_multiple": "Chanjez votposto por permisar multiselektaji",
+  "compose_form.poll.switch_to_single": "Chanjez votposto por permisar una selektajo",
   "compose_form.publish": "Siflar",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
-  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
-  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
-  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.save_changes": "Sparez chanji",
+  "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}",
+  "compose_form.sensitive.marked": "{count, plural,one {Medii markizesis quale privata} other {Medii markizesis quale privata}}",
+  "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markizesis quale privata} other {Medii ne markizesis quale privata}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Averto di kontenajo",
-  "confirmation_modal.cancel": "Cancel",
-  "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmation_modal.cancel": "Anulez",
+  "confirmations.block.block_and_report": "Restriktez e Raportizez",
+  "confirmations.block.confirm": "Restriktez",
+  "confirmations.block.message": "Ka vu certe volas restrikar {name}?",
+  "confirmations.delete.confirm": "Efacez",
   "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.discard_edit_media.confirm": "Discard",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.delete_list.confirm": "Efacez",
+  "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?",
+  "confirmations.discard_edit_media.confirm": "Efacez",
+  "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?",
   "confirmations.domain_block.confirm": "Hide entire domain",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.logout.confirm": "Ekirez",
+  "confirmations.logout.message": "Ka tu certe volas ekirar?",
+  "confirmations.mute.confirm": "Silencigez",
+  "confirmations.mute.explanation": "Co celigos posti de oli e posti quo mencionas oli, ma ol ankore permisas oli vidar vua posti e sequar vu.",
+  "confirmations.mute.message": "Ka vu certe volas silencigar {name}?",
+  "confirmations.redraft.confirm": "Efacez e riskisez",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "confirmations.reply.confirm": "Respondez",
+  "confirmations.reply.message": "Respondar nun remplos mesajo quon vu nun igas. Ka vu certe volas durar?",
+  "confirmations.unfollow.confirm": "Desequez",
+  "confirmations.unfollow.message": "Ka vu certe volas desequar {name}?",
+  "conversation.delete": "Efacez konverso",
+  "conversation.mark_as_read": "Markizez quale lektita",
+  "conversation.open": "Videz konverso",
+  "conversation.with": "Kun {names}",
+  "directory.federated": "De savita fediverso",
+  "directory.local": "De {domain} nur",
+  "directory.new_arrivals": "Nova venanti",
+  "directory.recently_active": "Recenta aktivo",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
+  "embed.preview": "Co esas quon ol semblos tale:",
+  "emoji_button.activity": "Ago",
+  "emoji_button.clear": "Efacez",
+  "emoji_button.custom": "Kustumizato",
+  "emoji_button.flags": "Flagi",
+  "emoji_button.food": "Manjajo & Drinkajo",
   "emoji_button.label": "Insertar emoji",
-  "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No matching emojis found",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_suspended": "Account suspended",
+  "emoji_button.nature": "Naturo",
+  "emoji_button.not_found": "Nula tala parigata emojii",
+  "emoji_button.objects": "Kozi",
+  "emoji_button.people": "Personi",
+  "emoji_button.recent": "Ofta uzato",
+  "emoji_button.search": "Trovez...",
+  "emoji_button.search_results": "Trovuri",
+  "emoji_button.symbols": "Simboli",
+  "emoji_button.travel": "Vizito & Plasi",
+  "empty_column.account_suspended": "Konto restriktesis",
   "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.account_unavailable": "Profilo esas nedisponebla",
+  "empty_column.blocks": "Vu ne restriktis irga uzanti til nun.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Vu ne havas irga direta mesaji til nun. Kande vu sendas o ganas, ol montresos hike.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.explore_statuses": "Nulo esas tendenca nun. Videz itere pose!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.follow_recommendations": "Semblas tale nula sugestato povas facesar por vu. Vu povas probar trovar personi quon vu forsan konocas o exploras tendenca hashtagi.",
+  "empty_column.follow_requests": "Vu ne havas irga sequodemandi til nun. Kande vu ganas talo, ol montresos hike.",
   "empty_column.hashtag": "Esas ankore nulo en ta gretovorto.",
   "empty_column.home": "Tu sequas ankore nulu. Vizitez {public} od uzez la serchilo por komencar e renkontrar altra uzeri.",
-  "empty_column.home.suggestions": "See some suggestions",
+  "empty_column.home.suggestions": "Videz ula sugestati",
   "empty_column.list": "There is nothing in this list yet.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.lists": "Vu ne havas irga listi til nun. Kande vu kreas talo, ol montresos hike.",
+  "empty_column.mutes": "Vu ne silencigis irga uzanti til nun.",
   "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.",
   "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
-  "follow_recommendations.done": "Done",
-  "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
-  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "error.unexpected_crash.explanation": "Pro eroro en nia kodexo o vidilkonciliebloproblemo, ca pagino ne povas korekte montresar.",
+  "error.unexpected_crash.explanation_addons": "Ca pagino ne povas korekte montresar. Ca eroro posible kauzigesas vidilplusajo o automata tradukutensili.",
+  "error.unexpected_crash.next_steps": "Probez rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
+  "error.unexpected_crash.next_steps_addons": "Probez desaktivigar e rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopiez amastraso a klipplanko",
+  "errors.unexpected_crash.report_issue": "Reportigez problemo",
+  "explore.search_results": "Trovuri",
+  "explore.suggested_follows": "Por vu",
+  "explore.title": "Explorez",
+  "explore.trending_links": "Niuz",
+  "explore.trending_statuses": "Posti",
+  "explore.trending_tags": "Hashtagi",
+  "follow_recommendations.done": "Fina",
+  "follow_recommendations.heading": "Sequez personi quo igas posti quon vu volas vidar! Hike esas ula sugestati.",
+  "follow_recommendations.lead": "Posti de personi quon vu sequas kronologiale montresos en vua hemniuzeto. Ne timas igar erori, vu povas desequar personi tam same facila irgatempe!",
   "follow_request.authorize": "Yurizar",
   "follow_request.reject": "Refuzar",
-  "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.",
-  "generic.saved": "Saved",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "follow_requests.unlocked_explanation": "Quankam vua konto ne klefklozesis, la {domain} laborero pensas ke vu forsan volas kontralar sequodemandi de ca konti manuale.",
+  "generic.saved": "Sparesis",
+  "getting_started.developers": "Developeri",
+  "getting_started.directory": "Profilcheflisto",
+  "getting_started.documentation": "Dokumentajo",
   "getting_started.heading": "Debuto",
-  "getting_started.invite": "Invite people",
+  "getting_started.invite": "Invitez personi",
   "getting_started.open_source_notice": "Mastodon esas programaro kun apertita kodexo. Tu povas kontributar o signalar problemi en GitHub ye {github}.",
   "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "getting_started.terms": "Servkondicioni",
+  "hashtag.column_header.tag_mode.all": "e {additional}",
+  "hashtag.column_header.tag_mode.any": "o {additional}",
+  "hashtag.column_header.tag_mode.none": "sen {additional}",
+  "hashtag.column_settings.select.no_options_message": "Nula sugestati",
+  "hashtag.column_settings.select.placeholder": "Insertez hashtagi…",
+  "hashtag.column_settings.tag_mode.all": "Omna co",
+  "hashtag.column_settings.tag_mode.any": "Irga co",
+  "hashtag.column_settings.tag_mode.none": "Nula co",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Simpla",
   "home.column_settings.show_reblogs": "Montrar repeti",
   "home.column_settings.show_replies": "Montrar respondi",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "home.hide_announcements": "Celez anunci",
+  "home.show_announcements": "Montrez anunci",
+  "intervals.full.days": "{number, plural, one {# dio} other {# dii}}",
+  "intervals.full.hours": "{number, plural, one {# horo} other {# hori}}",
+  "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}",
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
-  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.description": "Deskripto",
+  "keyboard_shortcuts.direct": "apertar kolumno di direta mesaji",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -239,7 +242,7 @@
   "keyboard_shortcuts.federated": "to open federated timeline",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
   "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.hotkey": "Rapidklavo",
   "keyboard_shortcuts.legend": "to display this legend",
   "keyboard_shortcuts.local": "to open local timeline",
   "keyboard_shortcuts.mention": "to mention author",
@@ -260,284 +263,287 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Klozar",
-  "lightbox.compress": "Compress image view box",
-  "lightbox.expand": "Expand image view box",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.followed": "Any followed user",
-  "lists.replies_policy.list": "Members of the list",
-  "lists.replies_policy.none": "No one",
-  "lists.replies_policy.title": "Show replies to:",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "lightbox.compress": "Kompresez imajvidbuxo",
+  "lightbox.expand": "Expansez imajvidbuxo",
+  "lightbox.next": "Nexta",
+  "lightbox.previous": "Antea",
+  "limited_account_hint.action": "Jus montrez profilo",
+  "limited_account_hint.title": "Ca profilo celesas da jerero di vua servilo.",
+  "lists.account.add": "Insertez a listo",
+  "lists.account.remove": "Efacez de listo",
+  "lists.delete": "Efacez listo",
+  "lists.edit": "Modifikez listo",
+  "lists.edit.submit": "Chanjez titulo",
+  "lists.new.create": "Insertez listo",
+  "lists.new.title_placeholder": "Nova listotitulo",
+  "lists.replies_policy.followed": "Irga sequita uzanto",
+  "lists.replies_policy.list": "Membro di listo",
+  "lists.replies_policy.none": "Nulu",
+  "lists.replies_policy.title": "Montrez respondi a:",
+  "lists.search": "Trovez inter personi quon vu sequas",
+  "lists.subheading": "Vua listi",
+  "load_pending": "{count, plural, one {# nova kozo} other {# nova kozi}}",
   "loading_indicator.label": "Kargante...",
   "media_gallery.toggle_visible": "Chanjar videbleso",
   "missing_indicator.label": "Ne trovita",
-  "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.duration": "Duration",
-  "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.apps": "Mobile apps",
+  "missing_indicator.sublabel": "Ca moyeno ne existas",
+  "mute_modal.duration": "Durado",
+  "mute_modal.hide_notifications": "Celez avizi de ca uzanto?",
+  "mute_modal.indefinite": "Nedefinitiva",
+  "navigation_bar.apps": "Smartfonsoftwari",
   "navigation_bar.blocks": "Blokusita uzeri",
-  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.bookmarks": "Libromarki",
   "navigation_bar.community_timeline": "Lokala tempolineo",
   "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.discover": "Discover",
+  "navigation_bar.direct": "Direta mesaji",
+  "navigation_bar.discover": "Deskovrez",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Modifikar profilo",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "Explorez",
   "navigation_bar.favourites": "Favorati",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "Silencigita vorti",
   "navigation_bar.follow_requests": "Demandi di sequado",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "Sequati e sequanti",
   "navigation_bar.info": "Detaloza informi",
   "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
-  "navigation_bar.lists": "Lists",
+  "navigation_bar.lists": "Listi",
   "navigation_bar.logout": "Ekirar",
   "navigation_bar.mutes": "Celita uzeri",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "Personala",
   "navigation_bar.pins": "Pinned toots",
   "navigation_bar.preferences": "Preferi",
   "navigation_bar.public_timeline": "Federata tempolineo",
-  "navigation_bar.security": "Security",
-  "notification.admin.sign_up": "{name} signed up",
+  "navigation_bar.security": "Sekureso",
+  "notification.admin.sign_up": "{name} registresis",
   "notification.favourite": "{name} favorizis tua mesajo",
   "notification.follow": "{name} sequeskis tu",
-  "notification.follow_request": "{name} has requested to follow you",
+  "notification.follow_request": "{name} demandas sequar vu",
   "notification.mention": "{name} mencionis tu",
-  "notification.own_poll": "Your poll has ended",
-  "notification.poll": "A poll you have voted in has ended",
+  "notification.own_poll": "Vua votposto finigis",
+  "notification.poll": "Votposto quo havas vua voto finigis",
   "notification.reblog": "{name} repetis tua mesajo",
-  "notification.status": "{name} just posted",
-  "notification.update": "{name} edited a post",
+  "notification.status": "{name} nove postigis",
+  "notification.update": "{name} modifikis posto",
   "notifications.clear": "Efacar savigi",
   "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
-  "notifications.column_settings.alert": "Surtabla savigi",
+  "notifications.column_settings.admin.sign_up": "Nova registranti:",
+  "notifications.column_settings.alert": "Desktopavizi",
   "notifications.column_settings.favourite": "Favorati:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.filter_bar.advanced": "Montrez omna kategorii",
+  "notifications.column_settings.filter_bar.category": "Rapidfiltrobaro",
+  "notifications.column_settings.filter_bar.show_bar": "Montrez filtrobaro",
   "notifications.column_settings.follow": "Nova sequanti:",
-  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.follow_request": "Nova sequodemandi:",
   "notifications.column_settings.mention": "Mencioni:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.poll": "Votpostorezulti:",
+  "notifications.column_settings.push": "Pulsavizi",
   "notifications.column_settings.reblog": "Repeti:",
   "notifications.column_settings.show": "Montrar en kolumno",
   "notifications.column_settings.sound": "Plear sono",
   "notifications.column_settings.status": "New toots:",
-  "notifications.column_settings.unread_notifications.category": "Unread notifications",
-  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
-  "notifications.column_settings.update": "Edits:",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.filter.statuses": "Updates from people you follow",
-  "notifications.grant_permission": "Grant permission.",
-  "notifications.group": "{count} notifications",
-  "notifications.mark_as_read": "Mark every notification as read",
-  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
-  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
-  "notifications_permission_banner.enable": "Enable desktop notifications",
-  "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.title": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "notifications.column_settings.unread_notifications.category": "Nelektita avizi",
+  "notifications.column_settings.unread_notifications.highlight": "Briligez nelektita avizi",
+  "notifications.column_settings.update": "Modifikati:",
+  "notifications.filter.all": "Omna",
+  "notifications.filter.boosts": "Busti",
+  "notifications.filter.favourites": "Favorati",
+  "notifications.filter.follows": "Sequati",
+  "notifications.filter.mentions": "Mencioni",
+  "notifications.filter.polls": "Votpostorezulti",
+  "notifications.filter.statuses": "Niuz de personi quon vu sequas",
+  "notifications.grant_permission": "Donez permiso.",
+  "notifications.group": "{count} avizi",
+  "notifications.mark_as_read": "Markizez singla avizi quale lektita",
+  "notifications.permission_denied": "Desktopavizi esas nedisplonebla pro antea refuzita vidilpermisdemando",
+  "notifications.permission_denied_alert": "Desktopavizi ne povas aktivigesar pro ke vidilpermiso refuzesis",
+  "notifications.permission_required": "Desktopavizi esas nedisplonebla pro ke bezonata permiso ne donesis.",
+  "notifications_permission_banner.enable": "Aktivigez desktopavizi",
+  "notifications_permission_banner.how_to_control": "Por ganar avizi kande Mastodon ne esas apertita, aktivigez dekstopavizi. Vu povas precize regularar quale interakti facas deskstopavizi tra la supera {icon} butono pos oli aktivigesis.",
+  "notifications_permission_banner.title": "Irga kozo ne pasas vu",
+  "picture_in_picture.restore": "Retropozez",
+  "poll.closed": "Klozita",
+  "poll.refresh": "Rifreshez",
+  "poll.total_people": "{count, plural, one {# persono} other {# personi}}",
+  "poll.total_votes": "{count, plural, one {# voto} other {# voti}}",
+  "poll.vote": "Votez",
+  "poll.voted": "Vu ja votis ca respondo",
+  "poll.votes": "{votes, plural, one {# voto} other {# voti}}",
+  "poll_button.add_poll": "Insertez votposto",
+  "poll_button.remove_poll": "Efacez votposto",
   "privacy.change": "Aranjar privateso di mesaji",
   "privacy.direct.long": "Sendar nur a mencionata uzeri",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Mencionita personi nur",
   "privacy.private.long": "Sendar nur a sequanti",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Sequanti nur",
+  "privacy.public.long": "Videbla da omnu",
   "privacy.public.short": "Publike",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "Videbla da omnu ma voluntala ne inkluzas deskovrotraiti",
   "privacy.unlisted.short": "Ne enlistigota",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "refresh": "Rifreshez",
+  "regeneration_indicator.label": "Chargas…",
+  "regeneration_indicator.sublabel": "Vua hemniuzeto preparesas!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# dio} other {# dii}} ante nun",
+  "relative_time.full.hours": "{number, plural, one {# horo} other {# hori}} ante nun",
+  "relative_time.full.just_now": "jus nun",
+  "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} ante nun",
+  "relative_time.full.seconds": "{number, plural, one {# sekundo} other {# sekundi}} ante nun",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "nun",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "relative_time.today": "today",
+  "relative_time.today": "hodie",
   "reply_indicator.cancel": "Nihiligar",
-  "report.block": "Block",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
-  "report.category.subtitle": "Choose the best match",
-  "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
-  "report.category.title_status": "post",
-  "report.close": "Done",
-  "report.comment.title": "Is there anything else you think we should know?",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.mute": "Mute",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
-  "report.next": "Next",
+  "report.block": "Restriktez",
+  "report.block_explanation": "Vu ne vidos olia posti. Oli ne povas vidar vua posti o sequar vu. Oli savos ke oli restriktesis.",
+  "report.categories.other": "Altra",
+  "report.categories.spam": "Spamo",
+  "report.categories.violation": "Kontenaj nesequas servilregulo",
+  "report.category.subtitle": "Selektez maxim bona parigato",
+  "report.category.title": "Savigez ni pri quo eventas kun ca {type}",
+  "report.category.title_account": "profilo",
+  "report.category.title_status": "posto",
+  "report.close": "Fina",
+  "report.comment.title": "Ka altra irgo quon vu pensas ke ni debas savar?",
+  "report.forward": "Sendez a {target}",
+  "report.forward_hint": "La konto esas de altra servilo. Vu volas sendar raportkopiur sen nomo ibe anke?",
+  "report.mute": "Silencigez",
+  "report.mute_explanation": "Vu ne vidos olia posti. Oli povas ankore sequar vu e vidar vua posti e ne savar ke oli silencigesis.",
+  "report.next": "Nexta",
   "report.placeholder": "Plusa komenti",
-  "report.reasons.dislike": "I don't like it",
-  "report.reasons.dislike_description": "It is not something you want to see",
-  "report.reasons.other": "It's something else",
-  "report.reasons.other_description": "The issue does not fit into other categories",
-  "report.reasons.spam": "It's spam",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
-  "report.reasons.violation": "It violates server rules",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
-  "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.reasons.dislike": "Me ne amas",
+  "report.reasons.dislike_description": "Ol ne esas olo quon vu volas vidar",
+  "report.reasons.other": "Ol esas altra ulo",
+  "report.reasons.other_description": "La problemo ne fitas a altra kategorii",
+  "report.reasons.spam": "Ol esas spamo",
+  "report.reasons.spam_description": "Mala ligili, falsa interago o repetiva repliki",
+  "report.reasons.violation": "Ol nesequas servilreguli",
+  "report.reasons.violation_description": "Vu remarkas ke ol nesequas partikulara reguli",
+  "report.rules.subtitle": "Selektez relatata omno",
+  "report.rules.title": "Quala reguli nesequesas?",
+  "report.statuses.subtitle": "Selektez relatata omno",
+  "report.statuses.title": "Ka existas irga posti quo suportas ca raporto?",
   "report.submit": "Sendar",
   "report.target": "Denuncante",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.thanks.take_action": "Co esas vua opcioni por regularar quo vu vidas che Mastodon:",
+  "report.thanks.take_action_actionable": "Dum ke ni kontrolas co, vu povas demarshar kontra @{name}:",
+  "report.thanks.title": "Ka vu ne volas vidar co?",
+  "report.thanks.title_actionable": "Danko por raportizar, ni kontrolos co.",
+  "report.unfollow": "Desequez @{name}",
+  "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto pluse, desequez oli.",
   "search.placeholder": "Serchez",
-  "search_popout.search_format": "Advanced search format",
+  "search_popout.search_format": "Avancata trovformato",
   "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": "hashtag",
+  "search_popout.tips.hashtag": "hashtago",
   "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.all": "All",
-  "search_results.hashtags": "Hashtags",
-  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_popout.tips.text": "Simpla textoretrovenuri quo parigas trovnomi, uzantonomi e hashtagi",
+  "search_popout.tips.user": "uzanto",
+  "search_results.accounts": "Personi",
+  "search_results.all": "Omna",
+  "search_results.hashtags": "Hashtagi",
+  "search_results.nothing_found": "Ne povas ganar irgo per ca trovvorti",
   "search_results.statuses": "Toots",
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
-  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_account": "Apertez jerintervizajo por @{name}",
   "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.bookmark": "Bookmark",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
+  "status.block": "Restriktez @{name}",
+  "status.bookmark": "Libromarko",
+  "status.cancel_reblog_private": "Debustez",
+  "status.cannot_reblog": "Ca posto ne povas bustesas",
   "status.copy": "Copy link to status",
   "status.delete": "Efacar",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
-  "status.embed": "Embed",
+  "status.detailed_status": "Detala konversvido",
+  "status.direct": "Direta mesajigez @{name}",
+  "status.edit": "Modifikez",
+  "status.edited": "Modifikesis ye {date}",
+  "status.edited_x_times": "Modifikesis {count, plural, one {{count} foyo} other {{count} foyi}}",
+  "status.embed": "Eninsertez",
   "status.favourite": "Favorizar",
-  "status.filtered": "Filtered",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.filtered": "Filtrita",
+  "status.history.created": "{name} kreis ye {date}",
+  "status.history.edited": "{name} modifikis ye {date}",
   "status.load_more": "Kargar pluse",
   "status.media_hidden": "Kontenajo celita",
   "status.mention": "Mencionar @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
+  "status.more": "Pluse",
+  "status.mute": "Silencigez @{name}",
+  "status.mute_conversation": "Silencigez konverso",
   "status.open": "Detaligar ca mesajo",
-  "status.pin": "Pin on profile",
+  "status.pin": "Pinglagez che profilo",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
+  "status.read_more": "Lektez pluse",
   "status.reblog": "Repetar",
-  "status.reblog_private": "Boost with original visibility",
+  "status.reblog_private": "Bustez kun originala videbleso",
   "status.reblogged_by": "{name} repetita",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
-  "status.remove_bookmark": "Remove bookmark",
+  "status.redraft": "Efacez e riskisigez",
+  "status.remove_bookmark": "Efacez libromarko",
   "status.reply": "Respondar",
   "status.replyAll": "Respondar a filo",
   "status.report": "Denuncar @{name}",
   "status.sensitive_warning": "Trubliva kontenajo",
-  "status.share": "Share",
+  "status.share": "Partigez",
   "status.show_less": "Montrar mine",
-  "status.show_less_all": "Show less for all",
+  "status.show_less_all": "Montrez min por omno",
   "status.show_more": "Montrar plue",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
-  "status.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "status.show_more_all": "Montrez pluse por omno",
+  "status.show_thread": "Montrez postaro",
+  "status.uncached_media_warning": "Nedisplonebla",
+  "status.unmute_conversation": "Desilencigez konverso",
+  "status.unpin": "Depinglagez de profilo",
+  "suggestions.dismiss": "Desklozez sugestajo",
+  "suggestions.header": "Vu forsan havas intereso pri…",
   "tabs_bar.federated_timeline": "Federata",
   "tabs_bar.home": "Hemo",
   "tabs_bar.local_timeline": "Lokala",
   "tabs_bar.notifications": "Savigi",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
+  "tabs_bar.search": "Trovez",
+  "time_remaining.days": "{number, plural, one {# dio} other {# dii}} restas",
+  "time_remaining.hours": "{number, plural, one {# horo} other {# hori}} restas",
+  "time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} restas",
+  "time_remaining.moments": "Poka sekundi restas",
+  "time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundi}} restas",
+  "timeline_hint.remote_resource_not_displayed": "{resource} de altra servili ne montresas.",
+  "timeline_hint.resources.followers": "Sequanti",
+  "timeline_hint.resources.follows": "Sequati",
   "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Trending now",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "units.short.billion": "{count}B",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personi}} parolas",
+  "trends.trending_now": "Tendencigas nun",
+  "ui.beforeunload": "Vua skisato perdesos se vu ekiras Mastodon.",
+  "units.short.billion": "{count}G",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Tranar faligar por kargar",
   "upload_button.label": "Adjuntar kontenajo",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
-  "upload_form.description": "Describe for the visually impaired",
-  "upload_form.description_missing": "No description added",
-  "upload_form.edit": "Edit",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_error.limit": "Failadcharglimito ecesesis.",
+  "upload_error.poll": "Failadchargo ne permisesas kun votposti.",
+  "upload_form.audio_description": "Deskriptez por personi kun audnekapableso",
+  "upload_form.description": "Deskriptez por personi kun vidnekapableso",
+  "upload_form.description_missing": "Deskriptajo ne insertesis",
+  "upload_form.edit": "Modifikez",
+  "upload_form.thumbnail": "Chanjez imajeto",
   "upload_form.undo": "Desfacar",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.applying": "Applying…",
-  "upload_modal.choose_image": "Choose image",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preparing_ocr": "Preparing OCR…",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_form.video_description": "Deskriptez por personi kun audnekapableso o vidnekapableso",
+  "upload_modal.analyzing_picture": "Analizas imajo…",
+  "upload_modal.apply": "Aplikez",
+  "upload_modal.applying": "Aplikas…",
+  "upload_modal.choose_image": "Selektez imajo",
+  "upload_modal.description_placeholder": "Rapida bruna foxo saltas super la indolenta hundo",
+  "upload_modal.detect_text": "Deskovrez texto de imajo",
+  "upload_modal.edit_media": "Modifikez medii",
+  "upload_modal.hint": "Kliktez o tirez cirklo che prevido por selektar centrala punto quo sempre montresas kun omna imajeti.",
+  "upload_modal.preparing_ocr": "Preparas OCR…",
+  "upload_modal.preview_label": "Previdez ({ratio})",
   "upload_progress.label": "Kargante...",
-  "video.close": "Close video",
-  "video.download": "Download file",
-  "video.exit_fullscreen": "Exit full screen",
-  "video.expand": "Expand video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
-  "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "video.close": "Klozez video",
+  "video.download": "Deschargez failo",
+  "video.exit_fullscreen": "Ekirez plena skreno",
+  "video.expand": "Expansez video",
+  "video.fullscreen": "Plena skreno",
+  "video.hide": "Celez video",
+  "video.mute": "Silencigez sono",
+  "video.pause": "Pauzez",
+  "video.play": "Pleez",
+  "video.unmute": "Desilencigez sono"
 }
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 053c18fcf..845d0f8d5 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -70,7 +70,7 @@
   "column.blocks": "Útilokaðir notendur",
   "column.bookmarks": "Bókamerki",
   "column.community": "Staðvær tímalína",
-  "column.conversations": "Samtöl",
+  "column.direct": "Bein skilaboð",
   "column.directory": "Vafra notandasnið",
   "column.domain_blocks": "Útilokuð lén",
   "column.favourites": "Eftirlæti",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Einungis staðvært",
   "community.column_settings.media_only": "Einungis myndskrár",
   "community.column_settings.remote_only": "Einungis fjartengt",
+  "compose.language.change": "Skipta um tungumál",
+  "compose.language.search": "Leita að tungumálum...",
   "compose_form.direct_message_warning_learn_more": "Kanna nánar",
   "compose_form.encryption_warning": "Færslur á Mastodon eru ekki enda-í-enda dulritaðar. Ekki deila viðkvæmum upplýsingum á Mastodon.",
   "compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.",
   "embed.preview": "Svona mun þetta líta út:",
   "emoji_button.activity": "Virkni",
+  "emoji_button.clear": "Hreinsa",
   "emoji_button.custom": "Sérsniðin",
   "emoji_button.flags": "Flögg",
   "emoji_button.food": "Matur og drykkur",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.",
   "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.",
   "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!",
-  "empty_column.conversations": "Þegar þú hefur sent eða móttekið færslu sem er aðeins sýnileg fólki sem nefnt er í henni þá birtist hún hér.",
+  "empty_column.direct": "Þú átt ennþá engin bein skilaboð. Þegar þú sendir eða tekur á móti slíkum skilaboðum, munu þau birtast hér.",
   "empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.",
   "empty_column.explore_statuses": "Ekkert er á uppleið í augnablikinu. Athugaðu aftur síðar!",
   "empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Endurbirta færslu",
   "keyboard_shortcuts.column": "Setja virkni í dálk",
   "keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit",
-  "keyboard_shortcuts.conversations": "að opna samtalsdálka",
   "keyboard_shortcuts.description": "Lýsing",
+  "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum",
   "keyboard_shortcuts.down": "Fara neðar í listanum",
   "keyboard_shortcuts.enter": "Opna færslu",
   "keyboard_shortcuts.favourite": "Eftirlætisfærsla",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Fletta út myndskoðunarreit",
   "lightbox.next": "Næsta",
   "lightbox.previous": "Fyrra",
+  "limited_account_hint.action": "Birta notandasniðið samt",
+  "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum netþjónsins þíns.",
   "lists.account.add": "Bæta á lista",
   "lists.account.remove": "Fjarlægja af lista",
   "lists.delete": "Eyða lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bókamerki",
   "navigation_bar.community_timeline": "Staðvær tímalína",
   "navigation_bar.compose": "Semja nýja færslu",
+  "navigation_bar.direct": "Bein skilaboð",
   "navigation_bar.discover": "Uppgötva",
   "navigation_bar.domain_blocks": "Útilokuð lén",
   "navigation_bar.edit_profile": "Breyta notandasniði",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Fjarlægja könnun",
   "privacy.change": "Aðlaga gagnaleynd færslu",
   "privacy.direct.long": "Senda einungis á notendur sem minnst er á",
-  "privacy.direct.short": "Aðeins fólk sem ég minnist á",
+  "privacy.direct.short": "Aðeins fólk sem minnst er á",
   "privacy.private.long": "Senda einungis á fylgjendur",
   "privacy.private.short": "Einungis fylgjendur",
   "privacy.public.long": "Sýnilegt fyrir alla",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 8e881e284..46e509b07 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -70,7 +70,7 @@
   "column.blocks": "Utenti bloccati",
   "column.bookmarks": "Segnalibri",
   "column.community": "Timeline locale",
-  "column.conversations": "Conversazioni",
+  "column.direct": "Messaggi diretti",
   "column.directory": "Sfoglia profili",
   "column.domain_blocks": "Domini bloccati",
   "column.favourites": "Preferiti",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Solo Locale",
   "community.column_settings.media_only": "Solo Media",
   "community.column_settings.remote_only": "Solo Remoto",
+  "compose.language.change": "Cambia lingua",
+  "compose.language.search": "Ricerca lingue...",
   "compose_form.direct_message_warning_learn_more": "Scopri di più",
   "compose_form.encryption_warning": "I messaggi su Mastodon non sono crittografati end-to-end. Non condividere alcuna informazione sensibile su Mastodon.",
   "compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Incorpora questo post sul tuo sito web copiando il codice sotto.",
   "embed.preview": "Ecco come apparirà:",
   "emoji_button.activity": "Attività",
+  "emoji_button.clear": "Cancella",
   "emoji_button.custom": "Personalizzato",
   "emoji_button.flags": "Bandiere",
   "emoji_button.food": "Cibo & Bevande",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Non hai ancora bloccato alcun utente.",
   "empty_column.bookmarked_statuses": "Non hai ancora segnato alcun post. Quando ne segni uno, sarà mostrato qui.",
   "empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
-  "empty_column.conversations": "Quando invii o ricevi un post visibile solo alle persone citate in esso, apparirà qui.",
+  "empty_column.direct": "Non hai ancora nessun messaggio diretto. Quando ne manderai o riceverai qualcuno, apparirà qui.",
   "empty_column.domain_blocks": "Non vi sono domini nascosti.",
   "empty_column.explore_statuses": "Nulla è in tendenza in questo momento. Riprova più tardi!",
   "empty_column.favourited_statuses": "Non hai ancora segnato nessun post come apprezzato. Quando lo farai, comparirà qui.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Condividi il post",
   "keyboard_shortcuts.column": "per portare il focus su uno status in una delle colonne",
   "keyboard_shortcuts.compose": "per portare il focus nell'area di composizione",
-  "keyboard_shortcuts.conversations": "per aprire la colonna conversazioni",
   "keyboard_shortcuts.description": "Descrizione",
+  "keyboard_shortcuts.direct": "per aprire la colonna dei messaggi diretti",
   "keyboard_shortcuts.down": "Spostati in basso nella lista",
   "keyboard_shortcuts.enter": "Apri il post",
   "keyboard_shortcuts.favourite": "Apprezza post",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Espandi casella di visualizzazione immagine",
   "lightbox.next": "Successivo",
   "lightbox.previous": "Precedente",
+  "limited_account_hint.action": "Mostra comunque il profilo",
+  "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori del tuo server.",
   "lists.account.add": "Aggiungi alla lista",
   "lists.account.remove": "Togli dalla lista",
   "lists.delete": "Elimina lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Segnalibri",
   "navigation_bar.community_timeline": "Timeline locale",
   "navigation_bar.compose": "Componi nuovo toot",
+  "navigation_bar.direct": "Messaggi diretti",
   "navigation_bar.discover": "Scopri",
   "navigation_bar.domain_blocks": "Domini nascosti",
   "navigation_bar.edit_profile": "Modifica profilo",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Rimuovi sondaggio",
   "privacy.change": "Modifica privacy del post",
   "privacy.direct.long": "Invia solo a utenti menzionati",
-  "privacy.direct.short": "Solo le persone che menziono",
+  "privacy.direct.short": "Solo persone citate",
   "privacy.private.long": "Invia solo ai follower",
   "privacy.private.short": "Solo i seguaci",
   "privacy.public.long": "Visibile a tutti",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 075acab5d..72084d49d 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -70,7 +70,7 @@
   "column.blocks": "ブロックしたユーザー",
   "column.bookmarks": "ブックマーク",
   "column.community": "ローカルタイムライン",
-  "column.conversations": "会話",
+  "column.direct": "ダイレクトメッセージ",
   "column.directory": "ディレクトリ",
   "column.domain_blocks": "ブロックしたドメイン",
   "column.favourites": "お気に入り",
@@ -96,6 +96,8 @@
   "community.column_settings.local_only": "ローカルのみ表示",
   "community.column_settings.media_only": "メディアのみ表示",
   "community.column_settings.remote_only": "リモートのみ表示",
+  "compose.language.change": "言語を変更",
+  "compose.language.search": "言語を検索...",
   "compose_form.direct_message_warning_learn_more": "もっと詳しく",
   "compose_form.encryption_warning": "Mastodonの投稿はエンドツーエンド暗号化に対応していません。安全に送受信されるべき情報をMastodonで共有しないでください。",
   "compose_form.hashtag_warning": "この投稿は公開設定ではないのでハッシュタグの一覧に表示されません。公開投稿だけがハッシュタグで検索できます。",
@@ -151,6 +153,7 @@
   "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。",
   "embed.preview": "表示例:",
   "emoji_button.activity": "活動",
+  "emoji_button.clear": "クリア",
   "emoji_button.custom": "カスタム絵文字",
   "emoji_button.flags": "国旗",
   "emoji_button.food": "食べ物",
@@ -170,7 +173,7 @@
   "empty_column.blocks": "まだ誰もブロックしていません。",
   "empty_column.bookmarked_statuses": "まだ何もブックマーク登録していません。ブックマーク登録するとここに表示されます。",
   "empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!",
-  "empty_column.conversations": "メンションした相手にだけ表示されるメッセージを一度でも送受信した場合、ここに表示されます。",
+  "empty_column.direct": "ダイレクトメッセージはまだありません。ダイレクトメッセージをやりとりすると、ここに表示されます。",
   "empty_column.domain_blocks": "ブロックしているドメインはありません。",
   "empty_column.explore_statuses": "まだ何もありません。後で確認してください。",
   "empty_column.favourited_statuses": "まだ何もお気に入り登録していません。お気に入り登録するとここに表示されます。",
@@ -234,8 +237,8 @@
   "keyboard_shortcuts.boost": "ブースト",
   "keyboard_shortcuts.column": "左からn番目のカラムの最新に移動",
   "keyboard_shortcuts.compose": "投稿の入力欄に移動",
-  "keyboard_shortcuts.conversations": "会話カラムを開く",
   "keyboard_shortcuts.description": "説明",
+  "keyboard_shortcuts.direct": "ダイレクトメッセージのカラムを開く",
   "keyboard_shortcuts.down": "カラム内一つ下に移動",
   "keyboard_shortcuts.enter": "投稿の詳細を表示",
   "keyboard_shortcuts.favourite": "お気に入り",
@@ -268,6 +271,8 @@
   "lightbox.expand": "画像ビューボックスを開く",
   "lightbox.next": "次",
   "lightbox.previous": "前",
+  "limited_account_hint.action": "構わず表示する",
+  "limited_account_hint.title": "このプロフィールはサーバーのモデレーターによって非表示になっています。",
   "lists.account.add": "リストに追加",
   "lists.account.remove": "リストから外す",
   "lists.delete": "リストを削除",
@@ -294,6 +299,7 @@
   "navigation_bar.bookmarks": "ブックマーク",
   "navigation_bar.community_timeline": "ローカルタイムライン",
   "navigation_bar.compose": "投稿の新規作成",
+  "navigation_bar.direct": "ダイレクトメッセージ",
   "navigation_bar.discover": "見つける",
   "navigation_bar.domain_blocks": "ブロックしたドメイン",
   "navigation_bar.edit_profile": "プロフィールを編集",
@@ -370,8 +376,8 @@
   "poll_button.add_poll": "アンケートを追加",
   "poll_button.remove_poll": "アンケートを削除",
   "privacy.change": "公開範囲を変更",
-  "privacy.direct.long": "送信した相手のみ閲覧可",
-  "privacy.direct.short": "メンションした相手のみ",
+  "privacy.direct.long": "指定された相手のみ閲覧可",
+  "privacy.direct.short": "指定された相手のみ",
   "privacy.private.long": "フォロワーのみ閲覧可",
   "privacy.private.short": "フォロワーのみ",
   "privacy.public.long": "誰でも閲覧可",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 6b5fa5c97..2ded9c350 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -70,7 +70,7 @@
   "column.blocks": "დაბლოკილი მომხმარებლები",
   "column.bookmarks": "Bookmarks",
   "column.community": "ლოკალური თაიმლაინი",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "დამალული დომენები",
   "column.favourites": "ფავორიტები",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "მხოლოდ მედია",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "გაიგე მეტი",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "ეს ტუტი არ მოექცევა ჰეშტეგების ქვეს, რამეთუ ის არაა მითითებული. მხოლოდ ღია ტუტები მოიძებნება ჰეშტეგით.",
@@ -147,6 +149,7 @@
   "embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.",
   "embed.preview": "ესაა თუ როგორც გამოჩნდება:",
   "emoji_button.activity": "აქტივობა",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "პერსონალიზირებული",
   "emoji_button.flags": "დროშები",
   "emoji_button.food": "საჭმელი და სასლმელი",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "ლოკალური თაიმლაინი ცარიელია. დაწერეთ რაიმე ღიად ან ქენით რაიმე სხვა!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "დასაბუსტად",
   "keyboard_shortcuts.column": "ერთ-ერთი სვეტში სტატუსზე ფოკუსირებისთვის",
   "keyboard_shortcuts.compose": "შედგენის ტექსტ-არეაზე ფოკუსირებისთვის",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "აღწერილობა",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "სიაში ქვემოთ გადასაადგილებლად",
   "keyboard_shortcuts.enter": "სტატუსის გასახსნელად",
   "keyboard_shortcuts.favourite": "ფავორიტად ქცევისთვის",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "შემდეგი",
   "lightbox.previous": "წინა",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "სიაში დამატება",
   "lists.account.remove": "სიიდან ამოშლა",
   "lists.delete": "სიის წაშლა",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "ლოკალური თაიმლაინი",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "აღმოაჩინე",
   "navigation_bar.domain_blocks": "დამალული დომენები",
   "navigation_bar.edit_profile": "შეცვალე პროფილი",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 48a1d6fa8..37c4c9d0b 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -70,7 +70,7 @@
   "column.blocks": "Imiḍanen yettusḥebsen",
   "column.bookmarks": "Ticraḍ",
   "column.community": "Tasuddemt tadigant",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Inig deg imaɣnuten",
   "column.domain_blocks": "Taɣulin yeffren",
   "column.favourites": "Ismenyifen",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Adigan kan",
   "community.column_settings.media_only": "Allal n teywalt kan",
   "community.column_settings.remote_only": "Anmeggag kan",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Issin ugar",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.",
   "embed.preview": "Akka ara d-iban:",
   "emoji_button.activity": "Aqeddic",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Udmawan",
   "emoji_button.flags": "Innayen",
   "emoji_button.food": "Tegwella & Tissit",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
   "empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
   "empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Ulac ula yiwet n tjewwaqt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "i beṭṭu tikelt-nniḍen",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Aglam",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "i kennu ɣer wadda n tebdart",
   "keyboard_shortcuts.enter": "i tildin n tsuffeɣt",
   "keyboard_shortcuts.favourite": "akken ad ternuḍ ɣer yismenyifen",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
   "lightbox.next": "Γer zdat",
   "lightbox.previous": "Γer deffir",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Rnu ɣer tebdart",
   "lists.account.remove": "Kkes seg tebdart",
   "lists.delete": "Kkes tabdart",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Ticraḍ",
   "navigation_bar.community_timeline": "Tasuddemt tadigant",
   "navigation_bar.compose": "Aru tajewwiqt tamaynut",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Ẓer",
   "navigation_bar.domain_blocks": "Tiɣula yeffren",
   "navigation_bar.edit_profile": "Ẓreg amaɣnu",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index fd9074afd..659c45db4 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -70,7 +70,7 @@
   "column.blocks": "Бұғатталғандар",
   "column.bookmarks": "Бетбелгілер",
   "column.community": "Жергілікті желі",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Профильдерді аралау",
   "column.domain_blocks": "Жасырылған домендер",
   "column.favourites": "Таңдаулылар",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Тек жергілікті",
   "community.column_settings.media_only": "Тек медиа",
   "community.column_settings.remote_only": "Тек сыртқы",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Көбірек білу",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Бұл пост іздеуде хэштегпен шықпайды, өйткені ол бәріне ашық емес. Тек ашық жазбаларды ғана хэштег арқылы іздеп табуға болады.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Төмендегі кодты көшіріп алу арқылы жазбаны басқа сайттарға да орналастыра аласыз.",
   "embed.preview": "Былай көрінетін болады:",
   "emoji_button.activity": "Белсенділік",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Жеке",
   "emoji_button.flags": "Тулар",
   "emoji_button.food": "Тамақ",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ешкімді бұғаттамағансыз.",
   "empty_column.bookmarked_statuses": "Ешқандай жазба Бетбелгілер тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
   "empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Бұғатталған домен жоқ.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Ешқандай жазба 'Таңдаулылар' тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "жазба бөлісу",
   "keyboard_shortcuts.column": "бағандардағы жазбаны оқу",
   "keyboard_shortcuts.compose": "пост жазу",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Сипаттама",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "тізімде төмен түсу",
   "keyboard_shortcuts.enter": "жазбаны ашу",
   "keyboard_shortcuts.favourite": "таңдаулыға қосу",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Келесі",
   "lightbox.previous": "Алдыңғы",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Тізімге қосу",
   "lists.account.remove": "Тізімнен шығару",
   "lists.delete": "Тізімді өшіру",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Бетбелгілер",
   "navigation_bar.community_timeline": "Жергілікті желі",
   "navigation_bar.compose": "Жаңа жазба бастау",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "шарлау",
   "navigation_bar.domain_blocks": "Жабық домендер",
   "navigation_bar.edit_profile": "Профиль түзету",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 222a62164..af99045bb 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 4af91f569..37b7eb672 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -16,11 +16,11 @@
   "account.endorse": "프로필에 추천하기",
   "account.follow": "팔로우",
   "account.followers": "팔로워",
-  "account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.",
+  "account.followers.empty": "아직 아무도 이 사용자를 팔로우하고 있지 않습니다.",
   "account.followers_counter": "{counter} 팔로워",
   "account.following": "팔로잉",
   "account.following_counter": "{counter} 팔로잉",
-  "account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.",
+  "account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.",
   "account.follows_you": "날 팔로우합니다",
   "account.hide_reblogs": "@{name}의 부스트를 숨기기",
   "account.joined": "{date}에 가입함",
@@ -28,7 +28,7 @@
   "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로워를 승인합니다.",
   "account.media": "미디어",
   "account.mention": "@{name}에게 글쓰기",
-  "account.moved_to": "{name}는 계정을 이동했습니다:",
+  "account.moved_to": "{name} 님은 계정을 이동했습니다:",
   "account.mute": "@{name} 뮤트",
   "account.mute_notifications": "@{name}의 알림을 뮤트",
   "account.muted": "뮤트 됨",
@@ -70,7 +70,7 @@
   "column.blocks": "차단한 사용자",
   "column.bookmarks": "보관함",
   "column.community": "로컬 타임라인",
-  "column.conversations": "대화",
+  "column.direct": "다이렉트 메시지",
   "column.directory": "프로필 둘러보기",
   "column.domain_blocks": "차단한 도메인",
   "column.favourites": "좋아요",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "로컬만",
   "community.column_settings.media_only": "미디어만",
   "community.column_settings.remote_only": "원격만",
+  "compose.language.change": "언어 변경",
+  "compose.language.search": "언어 검색...",
   "compose_form.direct_message_warning_learn_more": "더 알아보기",
-  "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니아. 위험한 정보를 마스토돈을 통해 전달하지 마세요.",
+  "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니다. 위험한 정보를 마스토돈을 통해 전달하지 마세요.",
   "compose_form.hashtag_warning": "이 게시물은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색 될 수 있습니다.",
   "compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.",
   "compose_form.lock_disclaimer.lock": "비공개",
@@ -147,6 +149,7 @@
   "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.",
   "embed.preview": "다음과 같이 표시됩니다:",
   "emoji_button.activity": "활동",
+  "emoji_button.clear": "지우기",
   "emoji_button.custom": "커스텀",
   "emoji_button.flags": "깃발",
   "emoji_button.food": "음식과 마실것",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "아직 아무도 차단하지 않았습니다.",
   "empty_column.bookmarked_statuses": "아직 보관한 게시물이 없습니다. 게시물을 보관하면 여기에 나타납니다.",
   "empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!",
-  "empty_column.conversations": "멘션한 사람만 볼 수 있는 게시물을 보내거나 받은 경우에, 여기에 나타납니다.",
+  "empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.",
   "empty_column.domain_blocks": "아직 차단한 도메인이 없습니다.",
   "empty_column.explore_statuses": "아직 유행하는 것이 없습니다. 나중에 다시 확인하세요!",
   "empty_column.favourited_statuses": "아직 마음에 들어한 게시물이 없습니다. 게시물을 좋아요 하면 여기에 나타납니다.",
@@ -180,7 +183,7 @@
   "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.",
   "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.",
   "empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.",
-  "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요",
+  "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 사용자를 팔로우 해서 채워보세요",
   "error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 올바르게 표시할 수 없습니다.",
   "error.unexpected_crash.explanation_addons": "이 페이지는 올바르게 보여질 수 없습니다. 브라우저 애드온이나 자동 번역 도구 등으로 인해 발생된 에러일 수 있습니다.",
   "error.unexpected_crash.next_steps": "페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
@@ -226,12 +229,12 @@
   "intervals.full.hours": "{number} 시간",
   "intervals.full.minutes": "{number} 분",
   "keyboard_shortcuts.back": "뒤로가기",
-  "keyboard_shortcuts.blocked": "차단한 유저 리스트 열기",
+  "keyboard_shortcuts.blocked": "차단된 사용자 목록 열기",
   "keyboard_shortcuts.boost": "게시물 부스트",
   "keyboard_shortcuts.column": "해당 컬럼에 포커스",
   "keyboard_shortcuts.compose": "작성창에 포커스",
-  "keyboard_shortcuts.conversations": "대화 컬럼 열기",
   "keyboard_shortcuts.description": "설명",
+  "keyboard_shortcuts.direct": "다이렉트 메시지 컬럼 열기",
   "keyboard_shortcuts.down": "리스트에서 아래로 이동",
   "keyboard_shortcuts.enter": "게시물 열기",
   "keyboard_shortcuts.favourite": "관심글 지정",
@@ -243,7 +246,7 @@
   "keyboard_shortcuts.legend": "이 개요 표시",
   "keyboard_shortcuts.local": "로컬 타임라인 열기",
   "keyboard_shortcuts.mention": "작성자에게 멘션",
-  "keyboard_shortcuts.muted": "뮤트 된 유저 리스트 열기",
+  "keyboard_shortcuts.muted": "뮤트된 사용자 목록 열기",
   "keyboard_shortcuts.my_profile": "내 프로필 열기",
   "keyboard_shortcuts.notifications": "알림 컬럼 열기",
   "keyboard_shortcuts.open_media": "미디어 열기",
@@ -264,6 +267,8 @@
   "lightbox.expand": "이미지 박스 확장",
   "lightbox.next": "다음",
   "lightbox.previous": "이전",
+  "limited_account_hint.action": "그래도 프로필 보기",
+  "limited_account_hint.title": "이 프로필은 서버 운영진에 의해 숨겨진 상태입니다.",
   "lists.account.add": "리스트에 추가",
   "lists.account.remove": "리스트에서 제거",
   "lists.delete": "리스트 삭제",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "보관함",
   "navigation_bar.community_timeline": "로컬 타임라인",
   "navigation_bar.compose": "새 게시물 작성",
+  "navigation_bar.direct": "다이렉트 메시지",
   "navigation_bar.discover": "발견하기",
   "navigation_bar.domain_blocks": "차단한 도메인",
   "navigation_bar.edit_profile": "프로필 편집",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "투표 삭제",
   "privacy.change": "게시물의 프라이버시 설정을 변경",
   "privacy.direct.long": "멘션한 사용자에게만 공개",
-  "privacy.direct.short": "내가 멘션한 사람만",
+  "privacy.direct.short": "멘션한 사람들만",
   "privacy.private.long": "팔로워에게만 공개",
   "privacy.private.short": "팔로워 전용",
   "privacy.public.long": "모두가 볼 수 있음",
@@ -427,11 +433,11 @@
   "report.unfollow_explanation": "당신을 이 계정을 팔로우 하고 있습니다. 홈 피드에서 게시물을 보지 않으려면, 팔로우를 해제하세요.",
   "search.placeholder": "검색",
   "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.user": "유저",
+  "search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 사용자명 그리고 해시태그를 표시합니다",
+  "search_popout.tips.user": "사용자",
   "search_results.accounts": "사람",
   "search_results.all": "전부",
   "search_results.hashtags": "해시태그",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 02df9eff6..6470e50ca 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -70,7 +70,7 @@
   "column.blocks": "Bikarhênerên astengkirî",
   "column.bookmarks": "Şûnpel",
   "column.community": "Demnameya herêmî",
-  "column.conversations": "Axaftin",
+  "column.direct": "Peyamên rasterast",
   "column.directory": "Li profîlan bigere",
   "column.domain_blocks": "Navperên astengkirî",
   "column.favourites": "Bijarte",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Tenê herêmî",
   "community.column_settings.media_only": "Tenê media",
   "community.column_settings.remote_only": "Tenê ji dûr ve",
+  "compose.language.change": "Ziman biguherîne",
+  "compose.language.search": "Li zimanan bigere...",
   "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
   "compose_form.encryption_warning": "Şandiyên li ser Mastodon dawî-bi-dawî ne şîfrekirî ne. Li ser Mastodon zanyariyên talûke parve neke.",
   "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
   "embed.preview": "Wa ye wê wusa xuya bike:",
   "emoji_button.activity": "Çalakî",
+  "emoji_button.clear": "Pak bike",
   "emoji_button.custom": "Kesanekirî",
   "emoji_button.flags": "Nîşankirî",
   "emoji_button.food": "Xwarin û vexwarin",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Te tu bikarhêner asteng nekiriye.",
   "empty_column.bookmarked_statuses": "Hîn tu peyamên şûnpelkirî tuneye. Gava ku hûn yek şûnpel bikin, ew ê li vir xûya bike.",
   "empty_column.community": "Demnameya herêmî vala ye. Tiştek ji raya giştî re binivsînin da ku rûpel biherike!",
-  "empty_column.conversations": "Dema tu şandiyekê bişîninî an jî bistînî ku tenê ji kesên qalkirî re xuyabar in, ew ê li vir xuya bibe.",
+  "empty_column.direct": "Hêj peyameke te yê rasterast tuneye. Gava ku tu yekî bişeynî an jî bigirî, ew ê li vir xûya bike.",
   "empty_column.domain_blocks": "Hê jî navperên hatine asteng kirin tune ne.",
   "empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!",
   "empty_column.favourited_statuses": "Hîn tu peyamên te yên bijare tunene. Gava ku te yekî bijart, ew ê li vir xûya bike.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Şandiyê bilind bike",
   "keyboard_shortcuts.column": "Stûna balkişandinê",
   "keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
-  "keyboard_shortcuts.conversations": "ji bo vekirina stûna axaftinan",
   "keyboard_shortcuts.description": "Danasîn",
+  "keyboard_shortcuts.direct": "ji bo vekirina stûnê peyamên rasterast",
   "keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
   "keyboard_shortcuts.enter": "Şandiyê veke",
   "keyboard_shortcuts.favourite": "Şandiya bijarte",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
   "lightbox.next": "Pêş",
   "lightbox.previous": "Paş",
+  "limited_account_hint.action": "Bi heman awayî profîlê nîşan bide",
+  "limited_account_hint.title": "Ev profîl ji aliyê çavêriya li ser rajekarê te hatiye veşartin.",
   "lists.account.add": "Tevlî rêzokê bike",
   "lists.account.remove": "Ji rêzokê rake",
   "lists.delete": "Rêzokê jê bibe",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Şûnpel",
   "navigation_bar.community_timeline": "Demnameya herêmî",
   "navigation_bar.compose": "Şandiyeke nû binivsîne",
+  "navigation_bar.direct": "Peyamên rasterast",
   "navigation_bar.discover": "Vekolê",
   "navigation_bar.domain_blocks": "Navparên astengkirî",
   "navigation_bar.edit_profile": "Profîl serrast bike",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Rapirsî yê rake",
   "privacy.change": "Nepênîtiya şandiyan biguherîne",
   "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
-  "privacy.direct.short": "Tenê mirovên ku min qalkirî",
+  "privacy.direct.short": "Tenê kesên qalkirî",
   "privacy.private.long": "Tenê bo şopîneran xuyabar e",
   "privacy.private.short": "Tenê şopîneran",
   "privacy.public.long": "Ji bo hemûyan xuyabar e",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 7aa686a7a..555b39da5 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -70,7 +70,7 @@
   "column.blocks": "Devnydhyoryon lettys",
   "column.bookmarks": "Folennosow",
   "column.community": "Amserlin leel",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Peuri profilys",
   "column.domain_blocks": "Gorfarthow lettys",
   "column.favourites": "Re drudh",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Leel hepken",
   "community.column_settings.media_only": "Myski hepken",
   "community.column_settings.remote_only": "A-bell hepken",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Dyski moy",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Ny vydh an post ma diskwedhys yn-dann vòlnos vyth awos y vos mes a rol. Ny yllir hwilas saw poblow postek dre vòlnos.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Stagewgh an post ma a-berth yn agas gwiasva ow tasskrifa'n kod a-wòles.",
   "embed.preview": "Ottomma fatel hevel:",
   "emoji_button.activity": "Gwrians",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "A-vusur",
   "emoji_button.flags": "Baneryow",
   "emoji_button.food": "Bòs & Diwes",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ny wrussowgh lettya devnydhyoryon vyth hwath.",
   "empty_column.bookmarked_statuses": "Nyns eus dhywgh postow gans folennos hwath. Pan wrewgh gorra onan, ev a wra omdhiskwedhes omma.",
   "empty_column.community": "An amserlin leel yw gwag. Skrifewgh neppytn yn poblek dh'y lonchya!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Nyns eus gorfarthow lettys hwath.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Nyns eus dhywgh postow drudh hwath. Pan wrewgh merkya onan vel drudh, ev a wra omdhiskwedhes omma.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Kenertha post",
   "keyboard_shortcuts.column": "Fogella koloven",
   "keyboard_shortcuts.compose": "Fogella tekstva gomposya",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Deskrifans",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Movya war-nans y'n rol",
   "keyboard_shortcuts.enter": "Ygeri post",
   "keyboard_shortcuts.favourite": "Merkya post vel drudh",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Efani kist a weles aven",
   "lightbox.next": "Nessa",
   "lightbox.previous": "Kynsa",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Keworra dhe rol",
   "lists.account.remove": "Removya a rol",
   "lists.delete": "Dilea rol",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Folennosow",
   "navigation_bar.community_timeline": "Amserlin leel",
   "navigation_bar.compose": "Komposya post nowydh",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Diskudha",
   "navigation_bar.domain_blocks": "Gorfarthow lettys",
   "navigation_bar.edit_profile": "Golegi profil",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index ade4933f9..a37b946b4 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Mėgstamiausi",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 3bfb7532a..7ef2c2c6f 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -70,7 +70,7 @@
   "column.blocks": "Bloķētie lietotāji",
   "column.bookmarks": "Grāmatzīmes",
   "column.community": "Vietējā ziņu līnija",
-  "column.conversations": "Sarunas",
+  "column.direct": "Privātie ziņojumi",
   "column.directory": "Pārlūkot profilus",
   "column.domain_blocks": "Bloķētie domēni",
   "column.favourites": "Izlase",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Tikai vietējie",
   "community.column_settings.media_only": "Tikai mediji",
   "community.column_settings.remote_only": "Tikai attālinātie",
+  "compose.language.change": "Mainīt valodu",
+  "compose.language.search": "Meklēt valodas...",
   "compose_form.direct_message_warning_learn_more": "Uzzināt vairāk",
   "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar bīstamu informāciju caur Mastodon.",
   "compose_form.hashtag_warning": "Ziņojumu nebūs iespējams atrast zem haštagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespējams meklēt pēc tiem.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzmo kodu.",
   "embed.preview": "Tas izskatīsies šādi:",
   "emoji_button.activity": "Aktivitāte",
+  "emoji_button.clear": "Notīrīt",
   "emoji_button.custom": "Pielāgots",
   "emoji_button.flags": "Karogi",
   "emoji_button.food": "Ēdieni un dzērieni",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Patreiz tu neesi nevienu bloķējis.",
   "empty_column.bookmarked_statuses": "Patreiz tev nav neviena grāmatzīmēm pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.",
   "empty_column.community": "Vietējā ziņu lenta ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!",
-  "empty_column.conversations": "Kad nosūtīsi vai saņemsi ziņu, kas ir redzama tikai tajā minētajām personām, tā tiks parādīta šeit.",
+  "empty_column.direct": "Patrez tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.",
   "empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
   "empty_column.explore_statuses": "Pašlaik nekas nav tendēts. Pārbaudiet vēlāk!",
   "empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Palielināt ziņu",
   "keyboard_shortcuts.column": "Fokusēt kolonnu",
   "keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku",
-  "keyboard_shortcuts.conversations": "lai atvērtu sarunu kolonnu",
   "keyboard_shortcuts.description": "Apraksts",
+  "keyboard_shortcuts.direct": "lai atvērtu privāto ziņojumu kolonnu",
   "keyboard_shortcuts.down": "Pārvietot sarakstā uz leju",
   "keyboard_shortcuts.enter": "Atvērt ziņu",
   "keyboard_shortcuts.favourite": "Pievienot izlasei",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Paplašināt attēla ietvaru",
   "lightbox.next": "Tālāk",
   "lightbox.previous": "Iepriekš",
+  "limited_account_hint.action": "Tik un tā rādīt profilu",
+  "limited_account_hint.title": "Tava servera moderatori ir paslēpuši šo profilu.",
   "lists.account.add": "Pievienot sarakstam",
   "lists.account.remove": "Noņemt no saraksta",
   "lists.delete": "Dzēst sarakstu",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Grāmatzīmes",
   "navigation_bar.community_timeline": "Vietējā ziņu lenta",
   "navigation_bar.compose": "Veidot jaunu ziņu",
+  "navigation_bar.direct": "Privātie ziņojumi",
   "navigation_bar.discover": "Atklāt",
   "navigation_bar.domain_blocks": "Bloķētie domēni",
   "navigation_bar.edit_profile": "Rediģēt profilu",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Noņemt aptauju",
   "privacy.change": "Mainīt ziņas privātumu",
   "privacy.direct.long": "Redzams tikai pieminētajiem lietotājiem",
-  "privacy.direct.short": "Tikai cilvēki, kurus es pieminu",
+  "privacy.direct.short": "Tikai minētie cilvēki",
   "privacy.private.long": "Redzams tikai sekotājiem",
   "privacy.private.short": "Tikai sekotājiem",
   "privacy.public.long": "Redzama visiem",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 72bb52adf..df7d84d4b 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -70,7 +70,7 @@
   "column.blocks": "Блокирани корисници",
   "column.bookmarks": "Bookmarks",
   "column.community": "Локална временска зона",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Види профили",
   "column.domain_blocks": "Скриени домеини",
   "column.favourites": "Омилени",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Само медиа",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Научи повеќе",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Активност",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Храна &amp; Пијалаци",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Немате сеуште блокирано корисници.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Локалниот времеплов е празен. Објавете нешто јавно за да може да почне шоуто!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Немате сокриени домеини уште.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Уреди профил",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index a1db3f5a5..69267f652 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -70,7 +70,7 @@
   "column.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
   "column.bookmarks": "ബുക്ക്മാർക്കുകൾ",
   "column.community": "പ്രാദേശികമായ സമയരേഖ",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "പ്രൊഫൈലുകൾ മറിച്ചുനോക്കുക",
   "column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ",
   "column.favourites": "പ്രിയപ്പെട്ടവ",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "പ്രാദേശികം മാത്രം",
   "community.column_settings.media_only": "മാധ്യമങ്ങൾ മാത്രം",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.",
@@ -147,6 +149,7 @@
   "embed.instructions": "ചുവടെയുള്ള കോഡ് പകർത്തിക്കൊണ്ട് നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ ഈ ടൂട്ട് ഉൾച്ചേർക്കുക.",
   "embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:",
   "emoji_button.activity": "പ്രവര്‍ത്തനം",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "സ്വന്തമായ ഭേദഗതി",
   "emoji_button.flags": "കൊടികൾ",
   "emoji_button.food": "ഭക്ഷണവും പാനീയവും",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.",
   "empty_column.bookmarked_statuses": "നിങ്ങൾക് ഇതുവരെ അടയാളപ്പെടുത്തിയ ടൂട്ടുകൾ ഇല്ല. അടയാളപ്പെടുത്തിയാൽ അത് ഇവിടെ വരും.",
   "empty_column.community": "പ്രാദേശികമായ സമയരേഖ ശൂന്യമാണ്. എന്തെങ്കിലും പരസ്യമായി എഴുതി തുടക്കം കുറിക്കു!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "ബൂസ്റ്റ് ചെയ്യുക",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "വിവരണം",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "ടൂട്ട് എടുക്കാൻ",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "അടുത്തത്",
   "lightbox.previous": "പുറകോട്ട്",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക",
   "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക",
   "lists.delete": "പട്ടിക ഒഴിവാക്കുക",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ",
   "navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ",
   "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "കണ്ടെത്തുക",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 9c3500443..6728c0999 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -70,7 +70,7 @@
   "column.blocks": "ब्लॉक केलेले खातेधारक",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "गुप्त डोमेन्स",
   "column.favourites": "आवडते",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "केवळ मीडिया",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "अधिक जाणून घ्या",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 0c6996463..4cb6437f4 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -70,7 +70,7 @@
   "column.blocks": "Pengguna yang disekat",
   "column.bookmarks": "Tanda buku",
   "column.community": "Garis masa tempatan",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Layari profil",
   "column.domain_blocks": "Domain disekat",
   "column.favourites": "Kegemaran",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Tempatan sahaja",
   "community.column_settings.media_only": "Media sahaja",
   "community.column_settings.remote_only": "Jauh sahaja",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Hantaran ini tidak akan disenaraikan di bawah mana-mana tanda pagar kerana ia tidak tersenarai. Hanya hantaran awam sahaja boleh dicari menggunakan tanda pagar.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.",
   "embed.preview": "Begini rupanya nanti:",
   "emoji_button.activity": "Aktiviti",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Tersuai",
   "emoji_button.flags": "Bendera",
   "emoji_button.food": "Makanan & Minuman",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Anda belum menyekat sesiapa.",
   "empty_column.bookmarked_statuses": "Anda belum ada hantaran yang ditanda buku. Apabila anda menanda buku sesuatu, ia akan muncul di sini.",
   "empty_column.community": "Garis masa tempatan kosong. Tulislah secara awam untuk memulakan sesuatu!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Belum ada domain yang disekat.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Anda belum ada hantaran yang digemari. Apabila anda menggemari sesuatu, ia akan muncul di sini.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "Tumpu pada lajur",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Keterangan",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "Buka hantaran",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Besarkan kotak paparan imej",
   "lightbox.next": "Seterusnya",
   "lightbox.previous": "Sebelumnya",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Tambah ke senarai",
   "lists.account.remove": "Buang daripada senarai",
   "lists.delete": "Padam senarai",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Tanda buku",
   "navigation_bar.community_timeline": "Garis masa tempatan",
   "navigation_bar.compose": "Karang hantaran baharu",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Teroka",
   "navigation_bar.domain_blocks": "Domain disekat",
   "navigation_bar.edit_profile": "Sunting profil",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index ef09ca5e6..c2b611904 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -70,7 +70,7 @@
   "column.blocks": "Geblokkeerde gebruikers",
   "column.bookmarks": "Bladwijzers",
   "column.community": "Lokale tijdlijn",
-  "column.conversations": "Gesprekken",
+  "column.direct": "Direct messages",
   "column.directory": "Gebruikersgids",
   "column.domain_blocks": "Geblokkeerde domeinen",
   "column.favourites": "Favorieten",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Alleen lokaal",
   "community.column_settings.media_only": "Alleen media",
   "community.column_settings.remote_only": "Alleen andere servers",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Meer leren",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare berichten kunnen via hashtags gevonden worden.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.",
   "embed.preview": "Zo komt het eruit te zien:",
   "emoji_button.activity": "Activiteiten",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Lokale emoji’s",
   "emoji_button.flags": "Vlaggen",
   "emoji_button.food": "Eten en drinken",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
   "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
   "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.",
   "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
   "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Bericht boosten",
   "keyboard_shortcuts.column": "Op één van de kolommen focussen",
   "keyboard_shortcuts.compose": "Tekstveld om een bericht te schrijven focussen",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Omschrijving",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Naar beneden in de lijst bewegen",
   "keyboard_shortcuts.enter": "Volledig bericht tonen",
   "keyboard_shortcuts.favourite": "Aan jouw favorieten toevoegen",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Afbeelding groot weergeven",
   "lightbox.next": "Volgende",
   "lightbox.previous": "Vorige",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Aan lijst toevoegen",
   "lists.account.remove": "Uit lijst verwijderen",
   "lists.delete": "Lijst verwijderen",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bladwijzers",
   "navigation_bar.community_timeline": "Lokale tijdlijn",
   "navigation_bar.compose": "Nieuw bericht schrijven",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Ontdekken",
   "navigation_bar.domain_blocks": "Geblokkeerde domeinen",
   "navigation_bar.edit_profile": "Profiel bewerken",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Poll verwijderen",
   "privacy.change": "Zichtbaarheid van bericht aanpassen",
   "privacy.direct.long": "Alleen aan vermelde gebruikers tonen",
-  "privacy.direct.short": "Alleen gebruikers die ik noem",
+  "privacy.direct.short": "Direct",
   "privacy.private.long": "Alleen aan volgers tonen",
   "privacy.private.short": "Alleen volgers",
   "privacy.public.long": "Voor iedereen zichtbaar",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 521403c51..24a4e98b7 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokkerte brukarar",
   "column.bookmarks": "Bokmerke",
   "column.community": "Lokal tidsline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Sjå gjennom profilar",
   "column.domain_blocks": "Gøymde domene",
   "column.favourites": "Favorittar",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Berre lokalt",
   "community.column_settings.media_only": "Berre media",
   "community.column_settings.remote_only": "Berre eksternt",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Lær meir",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Dette tutet vert ikkje oppført under nokon emneknagg sidan det ikkje er oppført. Berre offentlege tut kan verta søkt etter med emneknagg.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden under.",
   "embed.preview": "Slik bid det å sjå ut:",
   "emoji_button.activity": "Aktivitet",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Eige",
   "emoji_button.flags": "Flagg",
   "emoji_button.food": "Mat & drikke",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.",
   "empty_column.bookmarked_statuses": "Du har ikkje nokon bokmerkte tut enno. Når du bokmerkjer eit, dukkar det opp her.",
   "empty_column.community": "Den lokale samtiden er tom. Skriv noko offentleg å få ballen til å rulle!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Det er ingen gøymde domene ennå.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Du har ingen favoritt-tut ennå. Når du merkjer ein som favoritt, så dukkar det opp her.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "for å framheva",
   "keyboard_shortcuts.column": "for å fokusera på ein status i ei av kolonnane",
   "keyboard_shortcuts.compose": "for å fokusera tekstfeltet for skriving",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Skildring",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "for å flytta seg opp og ned i lista",
   "keyboard_shortcuts.enter": "for å opna status",
   "keyboard_shortcuts.favourite": "for å merkja som favoritt",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ekspander bildevisning boks",
   "lightbox.next": "Neste",
   "lightbox.previous": "Førre",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Legg til i liste",
   "lists.account.remove": "Fjern frå liste",
   "lists.delete": "Slett liste",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bokmerke",
   "navigation_bar.community_timeline": "Lokal tidsline",
   "navigation_bar.compose": "Lag eit nytt tut",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Oppdag",
   "navigation_bar.domain_blocks": "Skjulte domene",
   "navigation_bar.edit_profile": "Rediger profil",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 707564404..78d145f55 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokkerte brukere",
   "column.bookmarks": "Bokmerker",
   "column.community": "Lokal tidslinje",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Bla gjennom profiler",
   "column.domain_blocks": "Skjulte domener",
   "column.favourites": "Likt",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Kun lokalt",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Kun eksternt",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Lær mer",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Denne tuten blir ikke listet under noen emneknagger da den er ulistet. Kun offentlige tuter kan søktes etter med emneknagg.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.",
   "embed.preview": "Slik kommer det til å se ut:",
   "emoji_button.activity": "Aktivitet",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Tilpasset",
   "emoji_button.flags": "Flagg",
   "emoji_button.food": "Mat og drikke",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Du har ikke blokkert noen brukere enda.",
   "empty_column.bookmarked_statuses": "Du har ikke bokmerket noen tuter enda. Når du bokmerker en, vil den dukke opp her.",
   "empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Det er ingen skjulte domener enda.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Du har ikke likt noen tuter enda. Når du liker en, vil den dukke opp her.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "å fremheve",
   "keyboard_shortcuts.column": "å fokusere en status i en av kolonnene",
   "keyboard_shortcuts.compose": "å fokusere komponeringsfeltet",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Beskrivelse",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "for å flytte ned i listen",
   "keyboard_shortcuts.enter": "å åpne status",
   "keyboard_shortcuts.favourite": "for å favorittmarkere",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ekspander bildevisning boks",
   "lightbox.next": "Neste",
   "lightbox.previous": "Forrige",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Legg til i listen",
   "lists.account.remove": "Fjern fra listen",
   "lists.delete": "Slett listen",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bokmerker",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.compose": "Skriv en ny tut",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Oppdag",
   "navigation_bar.domain_blocks": "Skjulte domener",
   "navigation_bar.edit_profile": "Rediger profil",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index e13c68c3f..c2041d10d 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -70,7 +70,7 @@
   "column.blocks": "Personas blocadas",
   "column.bookmarks": "Marcadors",
   "column.community": "Flux public local",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Percórrer los perfils",
   "column.domain_blocks": "Domenis resconduts",
   "column.favourites": "Favorits",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Sonque local",
   "community.column_settings.media_only": "Solament los mèdias",
   "community.column_settings.remote_only": "Sonque alonhat",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Ne saber mai",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pòt pas cercar que los tuts publics per etiqueta.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.",
   "embed.preview": "Semblarà aquò :",
   "emoji_button.activity": "Activitats",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Personalizats",
   "emoji_button.flags": "Drapèus",
   "emoji_button.food": "Beure e manjar",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Avètz pas blocat degun pel moment.",
   "empty_column.bookmarked_statuses": "Avètz pas cap de tuts marcats pel moment. Quand ne marquetz un, serà mostrat aquí.",
   "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "I a pas encara cap de domeni amagat.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Avètz pas encara cap de tut favorit. Quand n’auretz un, apareisserà aquí.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "partejar",
   "keyboard_shortcuts.column": "centrar un estatut a una colomna",
   "keyboard_shortcuts.compose": "anar al camp tèxte",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "descripcion",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "far davalar dins la lista",
   "keyboard_shortcuts.enter": "dobrir los estatuts",
   "keyboard_shortcuts.favourite": "apondre als favorits",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge",
   "lightbox.next": "Seguent",
   "lightbox.previous": "Precedent",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Ajustar a la lista",
   "lists.account.remove": "Levar de la lista",
   "lists.delete": "Suprimir la lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcadors",
   "navigation_bar.community_timeline": "Flux public local",
   "navigation_bar.compose": "Escriure un nòu tut",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Trobar",
   "navigation_bar.domain_blocks": "Domenis resconduts",
   "navigation_bar.edit_profile": "Modificar lo perfil",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 09d473ef4..7b041a208 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 978c3b840..5f410bbf5 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -70,7 +70,7 @@
   "column.blocks": "Zablokowani użytkownicy",
   "column.bookmarks": "Zakładki",
   "column.community": "Lokalna oś czasu",
-  "column.conversations": "Konwersacje",
+  "column.direct": "Wiadomości bezpośrednie",
   "column.directory": "Przeglądaj profile",
   "column.domain_blocks": "Ukryte domeny",
   "column.favourites": "Ulubione",
@@ -96,6 +96,8 @@
   "community.column_settings.local_only": "Tylko Lokalne",
   "community.column_settings.media_only": "Tylko zawartość multimedialna",
   "community.column_settings.remote_only": "Tylko Zdalne",
+  "compose.language.change": "Zmień język",
+  "compose.language.search": "Szukaj języków...",
   "compose_form.direct_message_warning_learn_more": "Dowiedz się więcej",
   "compose_form.encryption_warning": "Posty na Mastodon nie są szyfrowane end-to-end. Nie udostępniaj żadnych wrażliwych informacji przez Mastodon.",
   "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hasztagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hasztagów.",
@@ -151,6 +153,7 @@
   "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.",
   "embed.preview": "Tak będzie to wyglądać:",
   "emoji_button.activity": "Aktywność",
+  "emoji_button.clear": "Wyczyść",
   "emoji_button.custom": "Niestandardowe",
   "emoji_button.flags": "Flagi",
   "emoji_button.food": "Żywność i napoje",
@@ -170,7 +173,7 @@
   "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.",
   "empty_column.bookmarked_statuses": "Nie dodałeś(-aś) żadnego wpisu do zakładek. Kiedy to zrobisz, pojawi się on tutaj.",
   "empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
-  "empty_column.conversations": "Gdy wyślesz lub otrzymasz wpis, który jest widoczny tylko dla osób w nim wymienionych, pojawi się on tutaj.",
+  "empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.",
   "empty_column.domain_blocks": "Brak ukrytych domen.",
   "empty_column.explore_statuses": "Nic nie jest w tej chwili popularne. Sprawdź później!",
   "empty_column.favourited_statuses": "Nie dodałeś(-aś) żadnego wpisu do ulubionych. Kiedy to zrobisz, pojawi się on tutaj.",
@@ -234,8 +237,8 @@
   "keyboard_shortcuts.boost": "aby podbić wpis",
   "keyboard_shortcuts.column": "aby przejść do wpisu z jednej z kolumn",
   "keyboard_shortcuts.compose": "aby przejść do pola tworzenia wpisu",
-  "keyboard_shortcuts.conversations": "aby otworzyć kolumnę konwersacji",
   "keyboard_shortcuts.description": "Opis",
+  "keyboard_shortcuts.direct": "aby otworzyć kolumnę wiadomości bezpośrednich",
   "keyboard_shortcuts.down": "aby przejść na dół listy",
   "keyboard_shortcuts.enter": "aby otworzyć wpis",
   "keyboard_shortcuts.favourite": "aby dodać do ulubionych",
@@ -268,6 +271,8 @@
   "lightbox.expand": "Rozwiń pole widoku obrazu",
   "lightbox.next": "Następne",
   "lightbox.previous": "Poprzednie",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Dodaj do listy",
   "lists.account.remove": "Usunąć z listy",
   "lists.delete": "Usuń listę",
@@ -294,6 +299,7 @@
   "navigation_bar.bookmarks": "Zakładki",
   "navigation_bar.community_timeline": "Lokalna oś czasu",
   "navigation_bar.compose": "Utwórz nowy wpis",
+  "navigation_bar.direct": "Wiadomości bezpośrednie",
   "navigation_bar.discover": "Odkrywaj",
   "navigation_bar.domain_blocks": "Ukryte domeny",
   "navigation_bar.edit_profile": "Edytuj profil",
@@ -371,7 +377,7 @@
   "poll_button.remove_poll": "Usuń głosowanie",
   "privacy.change": "Dostosuj widoczność wpisów",
   "privacy.direct.long": "Widoczny tylko dla wspomnianych",
-  "privacy.direct.short": "Tylko wspominane osoby",
+  "privacy.direct.short": "Tylko wspomniane osoby",
   "privacy.private.long": "Widoczny tylko dla osób, które Cię śledzą",
   "privacy.private.short": "Tylko śledzący",
   "privacy.public.long": "Widoczne dla każdego",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index c7f6238d0..be00f883c 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -70,7 +70,7 @@
   "column.blocks": "Usuários bloqueados",
   "column.bookmarks": "Salvos",
   "column.community": "Linha local",
-  "column.conversations": "Conversations",
+  "column.direct": "Mensagens diretas",
   "column.directory": "Explorar perfis",
   "column.domain_blocks": "Domínios bloqueados",
   "column.favourites": "Favoritos",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "Somente local",
   "community.column_settings.media_only": "Somente mídia",
   "community.column_settings.remote_only": "Somente global",
+  "compose.language.change": "Alterar idioma",
+  "compose.language.search": "Pesquisar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Saiba mais",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Postagens no Mastodon não são criptografados de ponta a ponta. Não compartilhe nenhuma informação perigosa sobre o Mastodon.",
   "compose_form.hashtag_warning": "Este toot não aparecerá em nenhuma hashtag porque está como não-listado. Somente toots públicos podem ser pesquisados por hashtag.",
   "compose_form.lock_disclaimer": "Seu perfil não está {locked}. Qualquer um pode te seguir e ver os toots privados.",
   "compose_form.lock_disclaimer.lock": "trancado",
@@ -147,6 +149,7 @@
   "embed.instructions": "Incorpore este toot no seu site ao copiar o código abaixo.",
   "embed.preview": "Aqui está como vai ficar:",
   "emoji_button.activity": "Atividade",
+  "emoji_button.clear": "Limpar",
   "emoji_button.custom": "Personalizados",
   "emoji_button.flags": "Bandeiras",
   "emoji_button.food": "Comida e Bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Nada aqui.",
   "empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar um toot, ele aparecerá aqui.",
   "empty_column.community": "A linha local está vazia. Publique algo para começar!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Você ainda não tem mensagens diretas. Quando você enviar ou receber uma, será exibida aqui.",
   "empty_column.domain_blocks": "Nada aqui.",
   "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
   "empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "dar boost",
   "keyboard_shortcuts.column": "focar na coluna",
   "keyboard_shortcuts.compose": "focar no compositor",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descrição",
+  "keyboard_shortcuts.direct": "para abrir a coluna de mensagens diretas",
   "keyboard_shortcuts.down": "mover para baixo",
   "keyboard_shortcuts.enter": "abrir toot",
   "keyboard_shortcuts.favourite": "favoritar toot",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Abrir imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Exibir perfil mesmo assim",
+  "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Excluir lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Salvos",
   "navigation_bar.community_timeline": "Linha do tempo local",
   "navigation_bar.compose": "Compor novo toot",
+  "navigation_bar.direct": "Mensagens diretas",
   "navigation_bar.discover": "Descobrir",
   "navigation_bar.domain_blocks": "Domínios bloqueados",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -337,7 +343,7 @@
   "notifications.column_settings.status": "Novos toots:",
   "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
   "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
-  "notifications.column_settings.update": "Edits:",
+  "notifications.column_settings.update": "Editar:",
   "notifications.filter.all": "Tudo",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
@@ -366,22 +372,22 @@
   "poll_button.remove_poll": "Remover enquete",
   "privacy.change": "Alterar privacidade do toot",
   "privacy.direct.long": "Postar só para usuários mencionados",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Apenas pessoas mencionadas",
   "privacy.private.long": "Postar só para seguidores",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Apenas seguidores",
+  "privacy.public.long": "Visível para todos",
   "privacy.public.short": "Público",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "Visível para todos, mas desativou os recursos de descoberta",
   "privacy.unlisted.short": "Não-listado",
   "refresh": "Atualizar",
   "regeneration_indicator.label": "Carregando…",
   "regeneration_indicator.sublabel": "Sua página inicial está sendo preparada!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.days": "{number, plural, one {# dia} other {# dias}} atrás",
+  "relative_time.full.hours": "{number, plural, one {# hora} other {# horas}} atrás",
   "relative_time.full.just_now": "agora mesmo",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minutos}} atrás",
+  "relative_time.full.seconds": "{number, plural, one {# segundo} other {# segundos}} atrás",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "agora",
   "relative_time.minutes": "{number}m",
@@ -451,7 +457,7 @@
   "status.direct": "Enviar toot direto para @{name}",
   "status.edit": "Editar",
   "status.edited": "Editado em {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}",
   "status.embed": "Incorporar",
   "status.favourite": "Favoritar",
   "status.filtered": "Filtrado",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index f36683346..89e6a68ee 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -70,7 +70,7 @@
   "column.blocks": "Utilizadores Bloqueados",
   "column.bookmarks": "Itens salvos",
   "column.community": "Cronologia local",
-  "column.conversations": "Conversações",
+  "column.direct": "Mensagens diretas",
   "column.directory": "Procurar perfis",
   "column.domain_blocks": "Domínios escondidos",
   "column.favourites": "Favoritos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local apenas",
   "community.column_settings.media_only": "Somente media",
   "community.column_settings.remote_only": "Remoto apenas",
+  "compose.language.change": "Alterar idioma",
+  "compose.language.search": "Pesquisar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Conhecer mais",
   "compose_form.encryption_warning": "As publicações no Mastodon não são criptografadas de ponta a ponta. Não partilhe nenhuma informação sensível através do Mastodon.",
   "compose_form.hashtag_warning": "Este toot não será listado em nenhuma hashtag por ser não listado. Apenas toots públics podem ser pesquisados por hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.",
   "embed.preview": "Podes ver aqui como irá ficar:",
   "emoji_button.activity": "Actividade",
+  "emoji_button.clear": "Limpar",
   "emoji_button.custom": "Personalizar",
   "emoji_button.flags": "Bandeiras",
   "emoji_button.food": "Comida & Bebida",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.",
   "empty_column.bookmarked_statuses": "Ainda não adicionou nenhum toot aos Itens salvos. Quando adicionar, eles serão exibidos aqui.",
   "empty_column.community": "A timeline local está vazia. Escreve algo publicamente para começar!",
-  "empty_column.conversations": "Quando enviar ou receber uma publicação que seja visível apenas para as pessoas nela mencionadas, ela aparecerá aqui.",
+  "empty_column.direct": "Ainda não tem qualquer mensagem direta. Quando enviar ou receber alguma, ela irá aparecer aqui.",
   "empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.",
   "empty_column.explore_statuses": "Nada em destaque por agora. Volte mais tarde!",
   "empty_column.favourited_statuses": "Ainda não tens quaisquer toots favoritos. Quando tiveres algum, ele irá aparecer aqui.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "para partilhar",
   "keyboard_shortcuts.column": "para focar uma publicação numa das colunas",
   "keyboard_shortcuts.compose": "para focar na área de publicação",
-  "keyboard_shortcuts.conversations": "para abrir a coluna de conversações",
   "keyboard_shortcuts.description": "Descrição",
+  "keyboard_shortcuts.direct": "para abrir a coluna das mensagens diretas",
   "keyboard_shortcuts.down": "para mover para baixo na lista",
   "keyboard_shortcuts.enter": "para expandir uma publicação",
   "keyboard_shortcuts.favourite": "para adicionar aos favoritos",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expandir caixa de visualização de imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
+  "limited_account_hint.action": "Exibir perfil mesmo assim",
+  "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Eliminar lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Itens salvos",
   "navigation_bar.community_timeline": "Cronologia local",
   "navigation_bar.compose": "Escrever novo toot",
+  "navigation_bar.direct": "Mensagens diretas",
   "navigation_bar.discover": "Descobrir",
   "navigation_bar.domain_blocks": "Domínios escondidos",
   "navigation_bar.edit_profile": "Editar perfil",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Remover votação",
   "privacy.change": "Ajustar a privacidade da publicação",
   "privacy.direct.long": "Apenas para utilizadores mencionados",
-  "privacy.direct.short": "Apenas pessoas que menciono",
+  "privacy.direct.short": "Apenas pessoas mencionadas",
   "privacy.private.long": "Apenas para os seguidores",
   "privacy.private.short": "Apenas seguidores",
   "privacy.public.long": "Visível para todos",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 5a0932f5b..0756608ab 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -70,7 +70,7 @@
   "column.blocks": "Utilizatori blocați",
   "column.bookmarks": "Marcaje",
   "column.community": "Cronologie locală",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Explorează profiluri",
   "column.domain_blocks": "Domenii blocate",
   "column.favourites": "Favorite",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Doar local",
   "community.column_settings.media_only": "Doar media",
   "community.column_settings.remote_only": "Doar la distanţă",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Află mai multe",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Această postare nu va fi listată sub niciun hashtag deoarece este nelistată. Doar postările publice pot fi căutate cu un hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Integrează această postare în site-ul tău copiind codul de mai jos.",
   "embed.preview": "Iată cum va arăta:",
   "emoji_button.activity": "Activități",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Personalizați",
   "emoji_button.flags": "Steaguri",
   "emoji_button.food": "Alimente și băuturi",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Momentan nu ai blocat niciun utilizator.",
   "empty_column.bookmarked_statuses": "Momentan nu ai nicio postare marcată. Când vei marca una, va apărea aici.",
   "empty_column.community": "Nu există nimic în cronologia locală. Postează ceva public pentru a sparge gheața!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Momentan nu există domenii blocate.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Momentan nu ai nicio postare favorită. Când vei adăuga una, va apărea aici.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Distribuie postarea",
   "keyboard_shortcuts.column": "Focalizează pe coloană",
   "keyboard_shortcuts.compose": "Focalizează pe zona de text",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descriere",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "Coboară în listă",
   "keyboard_shortcuts.enter": "Deschide postarea",
   "keyboard_shortcuts.favourite": "Adaugă postarea la favorite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Deschide panoul de vizualizare a imaginilor",
   "lightbox.next": "Înainte",
   "lightbox.previous": "Înapoi",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Adaugă în listă",
   "lists.account.remove": "Elimină din listă",
   "lists.delete": "Șterge lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Marcaje",
   "navigation_bar.community_timeline": "Cronologie locală",
   "navigation_bar.compose": "Compune o nouă postare",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Descoperă",
   "navigation_bar.domain_blocks": "Domenii blocate",
   "navigation_bar.edit_profile": "Modifică profilul",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 57ae4db85..0fa0fbd91 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -70,7 +70,7 @@
   "column.blocks": "Заблокированные пользователи",
   "column.bookmarks": "Закладки",
   "column.community": "Локальная лента",
-  "column.conversations": "Диалоги",
+  "column.direct": "Личные сообщения",
   "column.directory": "Просмотр профилей",
   "column.domain_blocks": "Заблокированные домены",
   "column.favourites": "Избранное",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Только локальные",
   "community.column_settings.media_only": "Только с медиафайлами",
   "community.column_settings.remote_only": "Только удалённые",
+  "compose.language.change": "Изменить язык",
+  "compose.language.search": "Поиск языков...",
   "compose_form.direct_message_warning_learn_more": "Подробнее",
   "compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь потенциально опасной информацией.",
   "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
@@ -122,7 +124,7 @@
   "confirmations.delete_list.confirm": "Удалить",
   "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
   "confirmations.discard_edit_media.confirm": "Отменить",
-  "confirmations.discard_edit_media.message": "У вас имеются несохранённые изменения превью и описания медиафайла, отменить их?",
+  "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?",
   "confirmations.domain_block.confirm": "Да, заблокировать узел",
   "confirmations.domain_block.message": "Вы точно уверены, что хотите скрыть все посты с узла {domain}? В большинстве случаев пары блокировок и скрытий вполне достаточно.\n\nПри блокировке узла, вы перестанете получать уведомления оттуда, все посты будут скрыты из публичных лент, а подписчики убраны.",
   "confirmations.logout.confirm": "Выйти",
@@ -147,6 +149,7 @@
   "embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:",
   "embed.preview": "Так это будет выглядеть:",
   "emoji_button.activity": "Занятия",
+  "emoji_button.clear": "Очистить",
   "emoji_button.custom": "С этого узла",
   "emoji_button.flags": "Флаги",
   "emoji_button.food": "Еда и напитки",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Вы ещё никого не заблокировали.",
   "empty_column.bookmarked_statuses": "У вас пока нет постов в закладках. Как добавите один, он отобразится здесь.",
   "empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!",
-  "empty_column.conversations": "Здесь отображаются адресованные посты. Как только вы отправите или получите один, он отобразится здесь.",
+  "empty_column.direct": "У вас пока нет личных сообщений. Как только вы отправите или получите одно, оно появится здесь.",
   "empty_column.domain_blocks": "Скрытых доменов пока нет.",
   "empty_column.explore_statuses": "Нет актуального. Проверьте позже!",
   "empty_column.favourited_statuses": "Вы не добавили ни один пост в «Избранное». Как только вы это сделаете, он появится здесь.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "продвинуть пост",
   "keyboard_shortcuts.column": "фокус на одном из столбцов",
   "keyboard_shortcuts.compose": "фокус на поле ввода",
-  "keyboard_shortcuts.conversations": "открыть колонку диалогов",
   "keyboard_shortcuts.description": "Описание",
+  "keyboard_shortcuts.direct": "чтобы открыть колонку с личными сообщениями",
   "keyboard_shortcuts.down": "вниз по списку",
   "keyboard_shortcuts.enter": "открыть пост",
   "keyboard_shortcuts.favourite": "в избранное",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Развернуть окно просмотра изображений",
   "lightbox.next": "Далее",
   "lightbox.previous": "Назад",
+  "limited_account_hint.action": "Все равно показать профиль",
+  "limited_account_hint.title": "Этот профиль был скрыт модераторами вашего сервера.",
   "lists.account.add": "Добавить в список",
   "lists.account.remove": "Убрать из списка",
   "lists.delete": "Удалить список",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Закладки",
   "navigation_bar.community_timeline": "Локальная лента",
   "navigation_bar.compose": "Создать новый пост",
+  "navigation_bar.direct": "Личные сообщения",
   "navigation_bar.discover": "Изучайте",
   "navigation_bar.domain_blocks": "Скрытые домены",
   "navigation_bar.edit_profile": "Изменить профиль",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Удалить опрос",
   "privacy.change": "Изменить видимость поста",
   "privacy.direct.long": "Показать только упомянутым",
-  "privacy.direct.short": "Для упомянутых",
+  "privacy.direct.short": "Только упомянутые",
   "privacy.private.long": "Показать только подписчикам",
   "privacy.private.short": "Для подписчиков",
   "privacy.public.long": "Виден всем",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index ed5dc9ebd..fef1913cf 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -70,7 +70,7 @@
   "column.blocks": "निषिद्धभोक्तारः",
   "column.bookmarks": "पुटचिह्नानि",
   "column.community": "स्थानीयसमयतालिका",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "व्यक्तित्वानि दृश्यन्ताम्",
   "column.domain_blocks": "निषिद्धप्रदेशाः",
   "column.favourites": "प्रियाः",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "केवलं स्थानीयम्",
   "community.column_settings.media_only": "सामग्री केवलम्",
   "community.column_settings.remote_only": "दर्गमः केवलम्",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "अधिकं ज्ञायताम्",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "न कस्मिन्नपि प्रचलितवस्तुषु सूचितमिदं दौत्यम् । केवलं सार्वजनिकदौत्यानि प्रचलितवस्तुचिह्नेन अन्वेषयितुं शक्यते ।",
@@ -147,6 +149,7 @@
   "embed.instructions": "दौत्यमेतत् स्वीयजालस्थाने स्थापयितुमधो लिखितो विध्यादेशो युज्यताम्",
   "embed.preview": "अत्रैवं दृश्यते तत्:",
   "emoji_button.activity": "आचरणम्",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "स्वीयानुकूलम्",
   "emoji_button.flags": "ध्वजाः",
   "emoji_button.food": "भोजनं पेयञ्च",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "नैकोऽप्युपभोक्ता निषिद्धो वर्तते",
   "empty_column.bookmarked_statuses": "नैकमपि पुटचिह्नयुक्तदौत्यानि सन्ति । यदा भविष्यति तदत्र दृश्यते ।",
   "empty_column.community": "स्थानीयसमयतालिका रिक्ता । सार्वजनिकत्वेनाऽत्र किमपि लिख्यताम् ।",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "न निषिद्धप्रदेशाः सन्ति ।",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "न प्रियदौत्यानि सन्ति । यदा प्रीतिरित्यङ्क्यतेऽत्र दृश्यते ।",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index fe6dd22cf..4c3c485c6 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -70,7 +70,7 @@
   "column.blocks": "Persones blocadas",
   "column.bookmarks": "Sinnalibros",
   "column.community": "Lìnia de tempus locale",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Nàviga in is profilos",
   "column.domain_blocks": "Domìnios blocados",
   "column.favourites": "Preferidos",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Isceti locale",
   "community.column_settings.media_only": "Isceti multimediale",
   "community.column_settings.remote_only": "Isceti remotu",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Àteras informatziones",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est listada. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Inserta custa publicatzione in su situ web tuo copiende su còdighe de suta.",
   "embed.preview": "At a aparèssere aici:",
   "emoji_button.activity": "Atividade",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Personalizadu",
   "emoji_button.flags": "Banderas",
   "emoji_button.food": "Mandigòngiu e bufòngiu",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "No as blocadu ancora nemos.",
   "empty_column.bookmarked_statuses": "Non tenes ancora peruna publicatzione in is marcadores. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.",
   "empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Non tenes ancora peruna publicatzione in is preferidos. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "pro cumpartzire",
   "keyboard_shortcuts.column": "pro atzentrare una publicatzione in una de is colunnas",
   "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Descritzione",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista",
   "keyboard_shortcuts.enter": "pro abèrrere una publicatzione",
   "keyboard_shortcuts.favourite": "pro marcare comente a preferidu",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines",
   "lightbox.next": "Imbeniente",
   "lightbox.previous": "Pretzedente",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Agiunghe a sa lista",
   "lists.account.remove": "Boga dae sa lista",
   "lists.delete": "Cantzella sa lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Sinnalibros",
   "navigation_bar.community_timeline": "Lìnia de tempus locale",
   "navigation_bar.compose": "Cumpone una publicatzione noa",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Iscoberi",
   "navigation_bar.domain_blocks": "Domìnios blocados",
   "navigation_bar.edit_profile": "Modìfica profilu",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 1190bbe00..4c63e0eb4 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -70,7 +70,7 @@
   "column.blocks": "අවහිර කළ පරිශීලකයින්",
   "column.bookmarks": "පොත් යොමු",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "පැතිකඩයන් පිරික්සන්න",
   "column.domain_blocks": "අවහිර කළ වසම්",
   "column.favourites": "ප්‍රියතමයන්",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "ස්ථානීයව පමණයි",
   "community.column_settings.media_only": "මාධ්‍ය පමණයි",
   "community.column_settings.remote_only": "දුරස්ථව පමණයි",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "තව දැනගන්න",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "ක්‍රියාකාරකම",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "අභිරුචි",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "ආහාර සහ පාන",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු අවහිර කර නැත.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "අවහිර කළ වසම් නොමැත.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "සවිස්තරය",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "ඊළඟ",
   "lightbox.previous": "පෙර",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "ලැයිස්තුවට එකතු කරන්න",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "පොත් යොමු",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index aee720837..48d67de4c 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokovaní užívatelia",
   "column.bookmarks": "Záložky",
   "column.community": "Miestna časová os",
-  "column.conversations": "Conversations",
+  "column.direct": "Priame správy",
   "column.directory": "Prehľadávaj profily",
   "column.domain_blocks": "Skryté domény",
   "column.favourites": "Obľúbené",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Iba miestna",
   "community.column_settings.media_only": "Iba médiá",
   "community.column_settings.remote_only": "Iba odľahlé",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Zisti viac",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.",
   "embed.preview": "Tu je ako to bude vyzerať:",
   "emoji_button.activity": "Aktivita",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Vlastné",
   "emoji_button.flags": "Vlajky",
   "emoji_button.food": "Jedlá a nápoje",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Ešte si nikoho nezablokoval/a.",
   "empty_column.bookmarked_statuses": "Ešte nemáš žiadné záložky. Keď si pridáš príspevok k záložkám, zobrazí sa tu.",
   "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "Vyzdvihni príspevok",
   "keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov",
   "keyboard_shortcuts.compose": "zameraj sa na písaciu plochu",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Popis",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "posunúť sa dole v zozname",
   "keyboard_shortcuts.enter": "Otvor príspevok",
   "keyboard_shortcuts.favourite": "pridaj do obľúbených",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Rozšíriť náhľad obrázku",
   "lightbox.next": "Ďalšie",
   "lightbox.previous": "Predchádzajúci",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Pridaj do zoznamu",
   "lists.account.remove": "Odober zo zoznamu",
   "lists.delete": "Vymaž list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Záložky",
   "navigation_bar.community_timeline": "Miestna časová os",
   "navigation_bar.compose": "Napíš nový príspevok",
+  "navigation_bar.direct": "Priame správy",
   "navigation_bar.discover": "Objavuj",
   "navigation_bar.domain_blocks": "Skryté domény",
   "navigation_bar.edit_profile": "Uprav profil",
@@ -455,8 +461,8 @@
   "status.embed": "Vložiť",
   "status.favourite": "Páči sa mi",
   "status.filtered": "Filtrované",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} vytvoril/a {date}",
+  "status.history.edited": "{name} upravil/a {date}",
   "status.load_more": "Ukáž viac",
   "status.media_hidden": "Skryté médiá",
   "status.mention": "Spomeň @{name}",
@@ -514,7 +520,7 @@
   "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
   "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",
   "upload_form.description": "Opis pre slabo vidiacich",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "Nepridaný žiadny popis",
   "upload_form.edit": "Uprav",
   "upload_form.thumbnail": "Zmeniť miniatúru",
   "upload_form.undo": "Vymaž",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 23061d152..b094abfff 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -18,11 +18,11 @@
   "account.followers": "Sledilci",
   "account.followers.empty": "Nihče ne sledi temu uporabniku.",
   "account.followers_counter": "{count, plural, one {ima {count} sledilca} two {ima {count} sledilca} few {ima {count} sledilcev} other {ima {count} sledilce}}",
-  "account.following": "Following",
+  "account.following": "Sledim",
   "account.following_counter": "{count, plural, one {sledi {count} osebi} two {sledi {count} osebama} few {sledi {count} osebam} other {sledi {count} osebam}}",
   "account.follows.empty": "Ta uporabnik še ne sledi nikomur.",
   "account.follows_you": "Vam sledi",
-  "account.hide_reblogs": "Skrij spodbude od @{name}",
+  "account.hide_reblogs": "Skrij izpostavitve od @{name}",
   "account.joined": "Pridružen/a {date}",
   "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}",
   "account.locked_info": "Stanje zasebnosti računa je nastavljeno na zaklenjeno. Lastnik ročno pregleda, kdo ga lahko spremlja.",
@@ -32,12 +32,12 @@
   "account.mute": "Utišaj @{name}",
   "account.mute_notifications": "Utišaj obvestila od @{name}",
   "account.muted": "Utišan",
-  "account.posts": "Tuti",
-  "account.posts_with_replies": "Tuti in odgovori",
+  "account.posts": "Objave",
+  "account.posts_with_replies": "Objave in odgovori",
   "account.report": "Prijavi @{name}",
   "account.requested": "Čakanje na odobritev. Kliknite, da prekličete prošnjo za sledenje",
   "account.share": "Delite profil osebe @{name}",
-  "account.show_reblogs": "Pokaži spodbude osebe @{name}",
+  "account.show_reblogs": "Pokaži izpostavitve osebe @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "Odblokiraj @{name}",
   "account.unblock_domain": "Razkrij {domain}",
@@ -70,7 +70,7 @@
   "column.blocks": "Blokirani uporabniki",
   "column.bookmarks": "Zaznamki",
   "column.community": "Lokalna časovnica",
-  "column.conversations": "Conversations",
+  "column.direct": "Neposredna sporočila",
   "column.directory": "Prebrskaj profile",
   "column.domain_blocks": "Skrite domene",
   "column.favourites": "Priljubljene",
@@ -79,7 +79,7 @@
   "column.lists": "Seznami",
   "column.mutes": "Utišani uporabniki",
   "column.notifications": "Obvestila",
-  "column.pins": "Pripeti tuti",
+  "column.pins": "Pripete objave",
   "column.public": "Združena časovnica",
   "column_back_button.label": "Nazaj",
   "column_header.hide_settings": "Skrij nastavitve",
@@ -92,9 +92,11 @@
   "community.column_settings.local_only": "Samo krajevno",
   "community.column_settings.media_only": "Samo mediji",
   "community.column_settings.remote_only": "Samo oddaljeno",
-  "compose_form.direct_message_warning_learn_more": "Nauči se več",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Ta tut ne bo naveden pod nobenim ključnikom, ker ni javen. Samo javne tute lahko iščete s ključniki.",
+  "compose.language.change": "Spremeni jezik",
+  "compose.language.search": "Poišči jezik ...",
+  "compose_form.direct_message_warning_learn_more": "Izvej več",
+  "compose_form.encryption_warning": "Objave na Mastodonu niso šifrirane od kraja do kraja. Prek Mastodona ne delite nobenih občutljivih informacij.",
+  "compose_form.hashtag_warning": "Ta objava ne bo navedena pod nobenim ključnikom, ker ni javen. Samo javne objave lahko iščete s ključniki.",
   "compose_form.lock_disclaimer": "Vaš račun ni {locked}. Vsakdo vam lahko sledi in si ogleda objave, ki so namenjene samo sledilcem.",
   "compose_form.lock_disclaimer.lock": "zaklenjen",
   "compose_form.placeholder": "O čem razmišljaš?",
@@ -104,7 +106,7 @@
   "compose_form.poll.remove_option": "Odstrani to izbiro",
   "compose_form.poll.switch_to_multiple": "Spremenite anketo, da omogočite več izbir",
   "compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro",
-  "compose_form.publish": "Tutni",
+  "compose_form.publish": "Objavi",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Shrani spremembe",
   "compose_form.sensitive.hide": "Označi medij kot občutljiv",
@@ -118,7 +120,7 @@
   "confirmations.block.confirm": "Blokiraj",
   "confirmations.block.message": "Ali ste prepričani, da želite blokirati {name}?",
   "confirmations.delete.confirm": "Izbriši",
-  "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to stanje?",
+  "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to objavo?",
   "confirmations.delete_list.confirm": "Izbriši",
   "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?",
   "confirmations.discard_edit_media.confirm": "Opusti",
@@ -131,7 +133,7 @@
   "confirmations.mute.explanation": "S tem boste skrili objave pred njimi in objave, ki jih omenjajo, še vedno pa bodo lahko videli vaše objave in vam sledili.",
   "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?",
   "confirmations.redraft.confirm": "Izbriši in preoblikuj",
-  "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in spodbude bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.",
+  "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in izpostavitve bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.",
   "confirmations.reply.confirm": "Odgovori",
   "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?",
   "confirmations.unfollow.confirm": "Prenehaj slediti",
@@ -147,6 +149,7 @@
   "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.",
   "embed.preview": "Tako bo izgledalo:",
   "emoji_button.activity": "Dejavnost",
+  "emoji_button.clear": "Počisti",
   "emoji_button.custom": "Po meri",
   "emoji_button.flags": "Zastave",
   "emoji_button.food": "Hrana in Pijača",
@@ -161,16 +164,16 @@
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Potovanja in Kraji",
   "empty_column.account_suspended": "Račun je suspendiran",
-  "empty_column.account_timeline": "Tukaj ni tutov!",
+  "empty_column.account_timeline": "Tukaj ni objav!",
   "empty_column.account_unavailable": "Profil ni na voljo",
   "empty_column.blocks": "Niste še blokirali nobenega uporabnika.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokalna časovnica je prazna. Napišite nekaj javnega, da se bo žoga zakotalila!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga boste poslali ali prejeli, se bo prikazal tukaj.",
   "empty_column.domain_blocks": "Še vedno ni skritih domen.",
   "empty_column.explore_statuses": "Trenutno ni nič v trendu. Preverite znova kasneje!",
-  "empty_column.favourited_statuses": "Nimate priljubljenih tutov. Ko boste vzljubili kakšnega, se bo prikazal tukaj.",
-  "empty_column.favourites": "Nihče še ni vzljubil tega tuta. Ko ga bo nekdo, se bo pojavil tukaj.",
+  "empty_column.favourited_statuses": "Nimate priljubljenih objav. Ko boste vzljubili kakšno, bo prikazana tukaj.",
+  "empty_column.favourites": "Nihče še ni vzljubil te objave. Ko jo bo nekdo, se bo pojavila tukaj.",
   "empty_column.follow_recommendations": "Kaže, da za vas ni mogoče pripraviti nobenih predlogov. Poskusite uporabiti iskanje, da poiščete osebe, ki jih poznate, ali raziščete ključnike, ki so v trendu.",
   "empty_column.follow_requests": "Nimate prošenj za sledenje. Ko boste prejeli kakšno, se bo prikazala tukaj.",
   "empty_column.hashtag": "V tem ključniku še ni nič.",
@@ -218,7 +221,7 @@
   "hashtag.column_settings.tag_mode.none": "Nič od naštetega",
   "hashtag.column_settings.tag_toggle": "Za ta stolpec vključi dodatne oznake",
   "home.column_settings.basic": "Osnovno",
-  "home.column_settings.show_reblogs": "Pokaži spodbude",
+  "home.column_settings.show_reblogs": "Pokaži izpostavitve",
   "home.column_settings.show_replies": "Pokaži odgovore",
   "home.hide_announcements": "Skrij objave",
   "home.show_announcements": "Prikaži objave",
@@ -227,11 +230,11 @@
   "intervals.full.minutes": "{number, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}",
   "keyboard_shortcuts.back": "pojdi nazaj",
   "keyboard_shortcuts.blocked": "odpri seznam blokiranih uporabnikov",
-  "keyboard_shortcuts.boost": "spodbudi",
+  "keyboard_shortcuts.boost": "Izpostavi objavo",
   "keyboard_shortcuts.column": "fokusiraj na status v enemu od stolpcev",
   "keyboard_shortcuts.compose": "fokusiraj na območje za sestavljanje besedila",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Opis",
+  "keyboard_shortcuts.direct": "odpri stolpec za neposredna sporočila",
   "keyboard_shortcuts.down": "premakni se navzdol po seznamu",
   "keyboard_shortcuts.enter": "odpri status",
   "keyboard_shortcuts.favourite": "vzljubi",
@@ -241,13 +244,13 @@
   "keyboard_shortcuts.home": "odpri domačo časovnico",
   "keyboard_shortcuts.hotkey": "Hitra tipka",
   "keyboard_shortcuts.legend": "pokaži to legendo",
-  "keyboard_shortcuts.local": "odpri lokalno časovnico",
+  "keyboard_shortcuts.local": "Odpri krajevno časovnico",
   "keyboard_shortcuts.mention": "omeni avtorja",
   "keyboard_shortcuts.muted": "odpri seznam utišanih uporabnikov",
   "keyboard_shortcuts.my_profile": "odpri svoj profil",
   "keyboard_shortcuts.notifications": "odpri stolpec z obvestili",
   "keyboard_shortcuts.open_media": "to open media",
-  "keyboard_shortcuts.pinned": "odpri seznam pripetih tutov",
+  "keyboard_shortcuts.pinned": "Odpri seznam pripetih objav",
   "keyboard_shortcuts.profile": "odpri avtorjev profil",
   "keyboard_shortcuts.reply": "odgovori",
   "keyboard_shortcuts.requests": "odpri seznam s prošnjami za sledenje",
@@ -256,7 +259,7 @@
   "keyboard_shortcuts.start": "odpri stolpec \"začni\"",
   "keyboard_shortcuts.toggle_hidden": "prikaži/skrij besedilo za CW",
   "keyboard_shortcuts.toggle_sensitivity": "prikaži/skrij medije",
-  "keyboard_shortcuts.toot": "začni povsem nov tut",
+  "keyboard_shortcuts.toot": "Začni povsem novo objavo",
   "keyboard_shortcuts.unfocus": "odfokusiraj območje za sestavljanje besedila/iskanje",
   "keyboard_shortcuts.up": "premakni se navzgor po seznamu",
   "lightbox.close": "Zapri",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Razširi ogledno polje slike",
   "lightbox.next": "Naslednji",
   "lightbox.previous": "Prejšnji",
+  "limited_account_hint.action": "Vseeno pokaži profil",
+  "limited_account_hint.title": "Profil so moderatorji vašega strežnika skrili.",
   "lists.account.add": "Dodaj na seznam",
   "lists.account.remove": "Odstrani s seznama",
   "lists.delete": "Izbriši seznam",
@@ -289,7 +294,8 @@
   "navigation_bar.blocks": "Blokirani uporabniki",
   "navigation_bar.bookmarks": "Zaznamki",
   "navigation_bar.community_timeline": "Lokalna časovnica",
-  "navigation_bar.compose": "Sestavi nov tut",
+  "navigation_bar.compose": "Sestavi novo objavo",
+  "navigation_bar.direct": "Neposredna sporočila",
   "navigation_bar.discover": "Odkrijte",
   "navigation_bar.domain_blocks": "Skrite domene",
   "navigation_bar.edit_profile": "Uredi profil",
@@ -304,7 +310,7 @@
   "navigation_bar.logout": "Odjava",
   "navigation_bar.mutes": "Utišani uporabniki",
   "navigation_bar.personal": "Osebno",
-  "navigation_bar.pins": "Pripeti tuti",
+  "navigation_bar.pins": "Pripete objave",
   "navigation_bar.preferences": "Nastavitve",
   "navigation_bar.public_timeline": "Združena časovnica",
   "navigation_bar.security": "Varnost",
@@ -315,7 +321,7 @@
   "notification.mention": "{name} vas je omenil/a",
   "notification.own_poll": "Vaša anketa se je končala",
   "notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo",
-  "notification.reblog": "{name} je spodbudil/a vaš status",
+  "notification.reblog": "{name} je izpostavila/a vašo objavo",
   "notification.status": "{name} je pravkar objavil/a",
   "notification.update": "{name} je uredil(a) objavo",
   "notifications.clear": "Počisti obvestila",
@@ -331,7 +337,7 @@
   "notifications.column_settings.mention": "Omembe:",
   "notifications.column_settings.poll": "Rezultati glasovanja:",
   "notifications.column_settings.push": "Potisna obvestila",
-  "notifications.column_settings.reblog": "Spodbude:",
+  "notifications.column_settings.reblog": "Izpostavitve:",
   "notifications.column_settings.show": "Prikaži v stolpcu",
   "notifications.column_settings.sound": "Predvajaj zvok",
   "notifications.column_settings.status": "New toots:",
@@ -339,7 +345,7 @@
   "notifications.column_settings.unread_notifications.highlight": "Poudari neprebrana obvestila",
   "notifications.column_settings.update": "Urejanja:",
   "notifications.filter.all": "Vse",
-  "notifications.filter.boosts": "Spodbude",
+  "notifications.filter.boosts": "Izpostavitev",
   "notifications.filter.favourites": "Priljubljeni",
   "notifications.filter.follows": "Sledi",
   "notifications.filter.mentions": "Omembe",
@@ -366,12 +372,12 @@
   "poll_button.remove_poll": "Odstrani anketo",
   "privacy.change": "Prilagodi zasebnost statusa",
   "privacy.direct.long": "Objavi samo omenjenim uporabnikom",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Samo omenjeni",
   "privacy.private.long": "Objavi samo sledilcem",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Samo sledilci",
+  "privacy.public.long": "Vidno vsem",
   "privacy.public.short": "Javno",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "Vidno za vse, vendar izključeno iz funkcionalnosti odkrivanja",
   "privacy.unlisted.short": "Ni prikazano",
   "refresh": "Osveži",
   "regeneration_indicator.label": "Nalaganje…",
@@ -427,24 +433,24 @@
   "report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.",
   "search.placeholder": "Iskanje",
   "search_popout.search_format": "Napredna oblika iskanja",
-  "search_popout.tips.full_text": "Enostavno besedilo vrne statuse, ki ste jih napisali, vzljubili, spodbudili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.",
+  "search_popout.tips.full_text": "Enostavno besedilo vrne objave, ki ste jih napisali, vzljubili, izpostavili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.",
   "search_popout.tips.hashtag": "ključnik",
-  "search_popout.tips.status": "stanje",
+  "search_popout.tips.status": "objava",
   "search_popout.tips.text": "Enostavno besedilo vrne ujemajoča se prikazna imena, uporabniška imena in ključnike",
   "search_popout.tips.user": "uporabnik",
   "search_results.accounts": "Ljudje",
   "search_results.all": "Vse",
   "search_results.hashtags": "Ključniki",
   "search_results.nothing_found": "Za ta iskalni niz ni zadetkov",
-  "search_results.statuses": "Tuti",
-  "search_results.statuses_fts_disabled": "Iskanje tutov po njihovi vsebini ni omogočeno na tem strežniku Mastodon.",
+  "search_results.statuses": "Objave",
+  "search_results.statuses_fts_disabled": "Iskanje objav po njihovi vsebini ni omogočeno na tem strežniku Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {rezultat} other {rezultatov}}",
   "status.admin_account": "Odpri vmesnik za moderiranje za @{name}",
   "status.admin_status": "Odpri status v vmesniku za moderiranje",
   "status.block": "Blokiraj @{name}",
   "status.bookmark": "Dodaj med zaznamke",
-  "status.cancel_reblog_private": "Prekini spodbudo",
-  "status.cannot_reblog": "Te objave ni mogoče spodbuditi",
+  "status.cancel_reblog_private": "Prekliči izpostavitev",
+  "status.cannot_reblog": "Te objave ni mogoče izpostaviti",
   "status.copy": "Kopiraj povezavo do statusa",
   "status.delete": "Izbriši",
   "status.detailed_status": "Podroben pogled pogovora",
@@ -465,12 +471,12 @@
   "status.mute_conversation": "Utišaj pogovor",
   "status.open": "Razširi ta status",
   "status.pin": "Pripni na profil",
-  "status.pinned": "Pripeti tut",
+  "status.pinned": "Pripeta objava",
   "status.read_more": "Preberi več",
-  "status.reblog": "Spodbudi",
-  "status.reblog_private": "Spodbudi izvirnemu občinstvu",
-  "status.reblogged_by": "{name} spodbuja",
-  "status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.",
+  "status.reblog": "Izpostavi",
+  "status.reblog_private": "Izpostavi z izvirno vidljivostjo",
+  "status.reblogged_by": "{name} je izpostavil/a",
+  "status.reblogs.empty": "Nihče še ni izpostavil te objave. Ko se bo to zgodilo, se bodo pojavile tukaj.",
   "status.redraft": "Izbriši in preoblikuj",
   "status.remove_bookmark": "Odstrani zaznamek",
   "status.reply": "Odgovori",
@@ -490,7 +496,7 @@
   "suggestions.header": "Morda bi vas zanimalo…",
   "tabs_bar.federated_timeline": "Združeno",
   "tabs_bar.home": "Domov",
-  "tabs_bar.local_timeline": "Lokalno",
+  "tabs_bar.local_timeline": "Krajevno",
   "tabs_bar.notifications": "Obvestila",
   "tabs_bar.search": "Iskanje",
   "time_remaining.days": "{number, plural, one {# dan} other {# dni}} je ostalo",
@@ -514,7 +520,7 @@
   "upload_error.poll": "Prenos datoteke z anketami ni dovoljen.",
   "upload_form.audio_description": "Opiši za osebe z okvaro sluha",
   "upload_form.description": "Opišite za slabovidne",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "Noben opis ni bil dodan",
   "upload_form.edit": "Uredi",
   "upload_form.thumbnail": "Spremeni sličico",
   "upload_form.undo": "Izbriši",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 3535d4ea2..2112e0f0c 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -70,7 +70,7 @@
   "column.blocks": "Përdorues të bllokuar",
   "column.bookmarks": "Faqerojtës",
   "column.community": "Rrjedhë kohore vendore",
-  "column.conversations": "Biseda",
+  "column.direct": "Mesazhe të drejtpërdrejtë",
   "column.directory": "Shfletoni profile",
   "column.domain_blocks": "Përkatësi të bllokuara",
   "column.favourites": "Të parapëlqyer",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Vetëm vendore",
   "community.column_settings.media_only": "Vetëm Media",
   "community.column_settings.remote_only": "Vetëm të largëta",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Mësoni më tepër",
   "compose_form.encryption_warning": "Postimet në Mastodon nuk fshehtëzohen skaj-më-skaj. Mos ndani me të tjerë gjëra me spec në Mastodon.",
   "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.",
   "embed.preview": "Ja si do të duket:",
   "emoji_button.activity": "Veprimtari",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Vetjak",
   "emoji_button.flags": "Flamuj",
   "emoji_button.food": "Ushqim & Pije",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.",
   "empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.",
   "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
-  "empty_column.conversations": "Pasi të dërgoni ose merrni një postim që është i dukshëm vetëm për personat e përmendur në të, do të shfaqet këtu.",
+  "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejtë. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
   "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
   "empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!",
   "empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "për përforcim",
   "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat",
   "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve",
-  "keyboard_shortcuts.conversations": "për të hapur shtyllë bisedash",
   "keyboard_shortcuts.description": "Përshkrim",
+  "keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë",
   "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë",
   "keyboard_shortcuts.enter": "për hapje gjendjeje",
   "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave",
   "lightbox.next": "Pasuesja",
   "lightbox.previous": "E mëparshmja",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Shto në listë",
   "lists.account.remove": "Hiqe nga lista",
   "lists.delete": "Fshije listën",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Faqerojtës",
   "navigation_bar.community_timeline": "Rrjedhë kohore vendore",
   "navigation_bar.compose": "Hartoni mesazh të ri",
+  "navigation_bar.direct": "Mesazhe të drejtpërdrejtë",
   "navigation_bar.discover": "Zbuloni",
   "navigation_bar.domain_blocks": "Përkatësi të bllokuara",
   "navigation_bar.edit_profile": "Përpunoni profilin",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Hiqe pyetësorin",
   "privacy.change": "Rregulloni privatësi mesazhesh",
   "privacy.direct.long": "I dukshëm vetëm për përdorues të përmendur",
-  "privacy.direct.short": "Vetëm persona që përmend",
+  "privacy.direct.short": "Vetëm për personat e përmendur",
   "privacy.private.long": "I dukshëm vetëm për ndjekës",
   "privacy.private.short": "Vetëm ndjekës",
   "privacy.public.long": "I dukshëm për të tërë",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index e732873c4..b4e992a07 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blokirani korisnici",
   "column.bookmarks": "Bookmarks",
   "column.community": "Lokalna lajna",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Hidden domains",
   "column.favourites": "Omiljeni",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.",
   "embed.preview": "Ovako će da izgleda:",
   "emoji_button.activity": "Aktivnost",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Proizvoljno",
   "emoji_button.flags": "Zastave",
   "emoji_button.food": "Hrana & piće",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokalna lajna je prazna. Napišite nešto javno da lajna produva!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "da podržite",
   "keyboard_shortcuts.column": "da se prebacite na status u jednoj od kolona",
   "keyboard_shortcuts.compose": "da se prebacite na pisanje novog tuta",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Opis",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "da se pomerite na dole u listi",
   "keyboard_shortcuts.enter": "da otvorite status",
   "keyboard_shortcuts.favourite": "da označite kao omiljeno",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sledeći",
   "lightbox.previous": "Prethodni",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Dodaj na listu",
   "lists.account.remove": "Ukloni sa liste",
   "lists.delete": "Obriši listu",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalna lajna",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Izmeni profil",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 15f8640c6..159628b6c 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -70,7 +70,7 @@
   "column.blocks": "Блокирани корисници",
   "column.bookmarks": "Обележивачи",
   "column.community": "Локална временска линија",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Претражи налоге",
   "column.domain_blocks": "Скривени домени",
   "column.favourites": "Омиљене",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Само локално",
   "community.column_settings.media_only": "Само Медији",
   "community.column_settings.remote_only": "Само удаљено",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Сазнајте више",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Ова труба неће бити излистана под било којом тарабом јер је сакривена. Само јавне трубе могу бити претражене тарабом.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.",
   "embed.preview": "Овако ће да изгледа:",
   "emoji_button.activity": "Активност",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Произвољно",
   "emoji_button.flags": "Заставе",
   "emoji_button.food": "Храна и пиће",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Још увек немате блокираних корисника.",
   "empty_column.bookmarked_statuses": "Још увек немате обележене трубе. Када их обележите, појавиће се овде.",
   "empty_column.community": "Локална временска линија је празна. Напишите нешто јавно да започнете!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "Још увек нема сакривених домена.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Још увек немате труба које су вам се свиделе. Када вам се једна свиди, појавиће се овде.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "да подржите",
   "keyboard_shortcuts.column": "да се пребаците на статус у једној од колона",
   "keyboard_shortcuts.compose": "да се пребаците на писање новог тута",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Опис",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "да се померите на доле у листи",
   "keyboard_shortcuts.enter": "да отворите статус",
   "keyboard_shortcuts.favourite": "да означите као омиљено",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Увећај преглед слике",
   "lightbox.next": "Следећи",
   "lightbox.previous": "Претходни",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Додај на листу",
   "lists.account.remove": "Уклони са листе",
   "lists.delete": "Обриши листу",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Маркери",
   "navigation_bar.community_timeline": "Локална временска линија",
   "navigation_bar.compose": "Саставите нову трубу",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Откриј",
   "navigation_bar.domain_blocks": "Сакривени домени",
   "navigation_bar.edit_profile": "Измени налог",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 1fd9d2fd2..436dc5b18 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blockerade användare",
   "column.bookmarks": "Bokmärken",
   "column.community": "Lokal tidslinje",
-  "column.conversations": "Konversationer",
+  "column.direct": "Direktmeddelanden",
   "column.directory": "Bläddra bland profiler",
   "column.domain_blocks": "Dolda domäner",
   "column.favourites": "Favoriter",
@@ -80,7 +80,7 @@
   "column.mutes": "Tystade användare",
   "column.notifications": "Aviseringar",
   "column.pins": "Nålade toots",
-  "column.public": "Förenad tidslinje",
+  "column.public": "Federerad tidslinje",
   "column_back_button.label": "Tillbaka",
   "column_header.hide_settings": "Dölj inställningar",
   "column_header.moveLeft_settings": "Flytta kolumnen åt vänster",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Endast lokalt",
   "community.column_settings.media_only": "Endast media",
   "community.column_settings.remote_only": "Endast fjärr",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Lär dig mer",
   "compose_form.encryption_warning": "Inlägg på Mastodon är inte end-to-end-krypterade. Dela inte någon känslig information över Mastodon.",
   "compose_form.hashtag_warning": "Denna toot kommer inte att visas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Lägg in denna status på din webbplats genom att kopiera koden nedan.",
   "embed.preview": "Så här kommer det att se ut:",
   "emoji_button.activity": "Aktivitet",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Anpassad",
   "emoji_button.flags": "Flaggor",
   "emoji_button.food": "Mat & dryck",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Du har ännu ej blockerat några användare.",
   "empty_column.bookmarked_statuses": "Du har inte bokmärkt några tutar än. När du gör ett bokmärke kommer det synas här.",
   "empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "Du har inga direktmeddelanden. När du skickar eller tar emot ett direktmeddelande kommer det att visas här.",
   "empty_column.domain_blocks": "Det finns ännu inga dolda domäner.",
   "empty_column.explore_statuses": "Ingenting är trendigt just nu. Kom tillbaka senare!",
   "empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den visas här.",
@@ -230,13 +233,13 @@
   "keyboard_shortcuts.boost": "för att knuffa",
   "keyboard_shortcuts.column": "för att fokusera en status i en av kolumnerna",
   "keyboard_shortcuts.compose": "för att fokusera skrivfältet",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Beskrivning",
+  "keyboard_shortcuts.direct": "för att öppna Direktmeddelanden",
   "keyboard_shortcuts.down": "för att flytta nedåt i listan",
   "keyboard_shortcuts.enter": "för att öppna en status",
   "keyboard_shortcuts.favourite": "för att sätta som favorit",
   "keyboard_shortcuts.favourites": "för att öppna Favoriter",
-  "keyboard_shortcuts.federated": "för att öppna Förenad tidslinje",
+  "keyboard_shortcuts.federated": "Öppna federerad tidslinje",
   "keyboard_shortcuts.heading": "Tangentbordsgenvägar",
   "keyboard_shortcuts.home": "för att öppna Hem-tidslinjen",
   "keyboard_shortcuts.hotkey": "Kommando",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Utöka bildvyrutan",
   "lightbox.next": "Nästa",
   "lightbox.previous": "Tidigare",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Lägg till i lista",
   "lists.account.remove": "Ta bort från lista",
   "lists.delete": "Radera lista",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bokmärken",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.compose": "Författa ny toot",
+  "navigation_bar.direct": "Direktmeddelanden",
   "navigation_bar.discover": "Upptäck",
   "navigation_bar.domain_blocks": "Dolda domäner",
   "navigation_bar.edit_profile": "Redigera profil",
@@ -306,7 +312,7 @@
   "navigation_bar.personal": "Personligt",
   "navigation_bar.pins": "Nålade inlägg (toots)",
   "navigation_bar.preferences": "Inställningar",
-  "navigation_bar.public_timeline": "Förenad tidslinje",
+  "navigation_bar.public_timeline": "Federerad tidslinje",
   "navigation_bar.security": "Säkerhet",
   "notification.admin.sign_up": "{name} registrerade sig",
   "notification.favourite": "{name} favoriserade din status",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Ta bort omröstning",
   "privacy.change": "Justera sekretess",
   "privacy.direct.long": "Skicka endast till nämnda användare",
-  "privacy.direct.short": "Bara personer jag nämner",
+  "privacy.direct.short": "Direct",
   "privacy.private.long": "Endast synligt för följare",
   "privacy.private.short": "Endast följare",
   "privacy.public.long": "Synlig för alla",
@@ -488,7 +494,7 @@
   "status.unpin": "Ångra fäst i profil",
   "suggestions.dismiss": "Avfärda förslag",
   "suggestions.header": "Du kanske är intresserad av…",
-  "tabs_bar.federated_timeline": "Förenad",
+  "tabs_bar.federated_timeline": "Federerad",
   "tabs_bar.home": "Hem",
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Aviseringar",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 09d473ef4..7b041a208 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index e8c9757ad..43508be01 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -70,7 +70,7 @@
   "column.blocks": "தடுக்கப்பட்ட பயனர்கள்",
   "column.bookmarks": "அடையாளக்குறிகள்",
   "column.community": "சுய நிகழ்வு காலவரிசை",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "சுயவிவரங்களை உலாவு",
   "column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்",
   "column.favourites": "பிடித்தவைகள்",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "அருகிலிருந்து மட்டுமே",
   "community.column_settings.media_only": "படங்கள் மட்டுமே",
   "community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "மேலும் அறிய",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "இது ஒரு பட்டியலிடப்படாத டூட் என்பதால் எந்த ஹேஷ்டேகின் கீழும் வராது. ஹேஷ்டேகின் மூலம் பொதுவில் உள்ள டூட்டுகளை மட்டுமே தேட முடியும்.",
@@ -147,6 +149,7 @@
   "embed.instructions": "இந்தப் பதிவை உங்கள் வலைதளத்தில் பொதிக்கக் கீழே உள்ள வரிகளை காப்பி செய்யவும்.",
   "embed.preview": "பார்க்க இப்படி இருக்கும்:",
   "emoji_button.activity": "செயல்பாடு",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "தனிப்பயன்",
   "emoji_button.flags": "கொடிகள்",
   "emoji_button.food": "உணவு மற்றும் பானம்",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.",
   "empty_column.bookmarked_statuses": "உங்களிடம் அடையாளக்குறியிட்ட டூட்டுகள் எவையும் இல்லை. அடையாளக்குறியிட்ட பிறகு அவை இங்கே காட்டப்படும்.",
   "empty_column.community": "உங்கள் மாஸ்டடான் முச்சந்தியில் யாரும் இல்லை. எதையேனும் எழுதி ஆட்டத்தைத் துவக்குங்கள்!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "தடுக்கப்பட்டக் களங்கள் இதுவரை இல்லை.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "உங்களுக்குப் பிடித்த டூட்டுகள் இதுவரை இல்லை. ஒரு டூட்டில் நீங்கள் விருப்பக்குறி இட்டால், அது இங்கே காண்பிக்கப்படும்.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "பகிர",
   "keyboard_shortcuts.column": "ஏதேனும் ஒரு நெடுவரிசையில் உள்ள டூட்டுல் கவனம் செலுத்த",
   "keyboard_shortcuts.compose": "பதிவு எழுதும் பெட்டியில் கவனம் செலுத்த",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "விவரம்",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "பட்டியலின் கீழே செல்ல",
   "keyboard_shortcuts.enter": "டூட்டைத் திறக்க",
   "keyboard_shortcuts.favourite": "விருப்பக்குறி இட",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "அடுத்த",
   "lightbox.previous": "சென்ற",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "பட்டியலில் சேர்",
   "lists.account.remove": "பட்டியலில் இருந்து அகற்று",
   "lists.delete": "பட்டியலை நீக்கு",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "அடையாளக்குறிகள்",
   "navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு",
   "navigation_bar.compose": "புதியவற்றை எழுதுக toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "கண்டு பிடி",
   "navigation_bar.domain_blocks": "மறைந்த களங்கள்",
   "navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index d76b9a451..2bc2a29da 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 8eb92f7ad..a25a019fb 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -70,7 +70,7 @@
   "column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
   "column.bookmarks": "Bookmarks",
   "column.community": "స్థానిక కాలక్రమం",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "దాచిన డొమైన్లు",
   "column.favourites": "ఇష్టపడినవి",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "మీడియా మాత్రమే",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "మరింత తెలుసుకోండి",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "ఈ టూట్ అన్లిస్టెడ్ కాబట్టి ఏ హాష్ ట్యాగ్ క్రిందకూ రాదు. పబ్లిక్ టూట్ లను మాత్రమే హాష్ ట్యాగ్ ద్వారా శోధించవచ్చు.",
@@ -147,6 +149,7 @@
   "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.",
   "embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:",
   "emoji_button.activity": "కార్యకలాపాలు",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "అనుకూలీకరించిన",
   "emoji_button.flags": "ఫ్లాగ్స్",
   "emoji_button.food": "ఆహారం & పానీయం",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "మీకు ఇష్టపడిన టూట్లు ఇంకా ఎమీ లేవు. మీరు ఒకదానిని ఇష్టపడినప్పుడు, అది ఇక్కడ కనిపిస్తుంది.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "బూస్ట్ చేయడానికి",
   "keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి",
   "keyboard_shortcuts.compose": "కంపోజ్ టెక్స్ట్ఏరియా పై దృష్టి పెట్టడానికి",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "జాబితాలో క్రిందికి వెళ్ళడానికి",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "ఇష్టపడడానికి",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "తరువాత",
   "lightbox.previous": "మునుపటి",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "జాబితాకు జోడించు",
   "lists.account.remove": "జాబితా నుండి తొలగించు",
   "lists.delete": "జాబితాను తొలగించు",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "స్థానిక కాలక్రమం",
   "navigation_bar.compose": "కొత్త టూట్ను రాయండి",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "కనుగొను",
   "navigation_bar.domain_blocks": "దాచిన డొమైన్లు",
   "navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 423d3efd4..84faa0a1c 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -70,7 +70,7 @@
   "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
   "column.bookmarks": "ที่คั่นหน้า",
   "column.community": "เส้นเวลาในเซิร์ฟเวอร์",
-  "column.conversations": "การสนทนา",
+  "column.direct": "ข้อความโดยตรง",
   "column.directory": "เรียกดูโปรไฟล์",
   "column.domain_blocks": "โดเมนที่ปิดกั้นอยู่",
   "column.favourites": "รายการโปรด",
@@ -92,8 +92,10 @@
   "community.column_settings.local_only": "ในเซิร์ฟเวอร์เท่านั้น",
   "community.column_settings.media_only": "สื่อเท่านั้น",
   "community.column_settings.remote_only": "ระยะไกลเท่านั้น",
+  "compose.language.change": "เปลี่ยนภาษา",
+  "compose.language.search": "ค้นหาภาษา...",
   "compose_form.direct_message_warning_learn_more": "เรียนรู้เพิ่มเติม",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "โพสต์ใน Mastodon ไม่ได้เข้ารหัสแบบต้นทางถึงปลายทาง อย่าแบ่งปันข้อมูลที่เป็นอันตรายใด ๆ ผ่าน Mastodon",
   "compose_form.hashtag_warning": "จะไม่แสดงรายการโพสต์นี้ภายใต้แฮชแท็กใด ๆ เนื่องจากไม่อยู่ในรายการ เฉพาะโพสต์สาธารณะเท่านั้นที่สามารถค้นหาได้โดยแฮชแท็ก",
   "compose_form.lock_disclaimer": "บัญชีของคุณไม่ได้ {locked} ใครก็ตามสามารถติดตามคุณเพื่อดูโพสต์สำหรับผู้ติดตามเท่านั้นของคุณ",
   "compose_form.lock_disclaimer.lock": "ล็อคอยู่",
@@ -147,6 +149,7 @@
   "embed.instructions": "ฝังโพสต์นี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง",
   "embed.preview": "นี่คือลักษณะที่จะปรากฏ:",
   "emoji_button.activity": "กิจกรรม",
+  "emoji_button.clear": "ล้าง",
   "emoji_button.custom": "กำหนดเอง",
   "emoji_button.flags": "ธง",
   "emoji_button.food": "อาหารและเครื่องดื่ม",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ",
   "empty_column.bookmarked_statuses": "คุณยังไม่มีโพสต์ที่เพิ่มที่คั่นหน้าไว้ใด ๆ เมื่อคุณเพิ่มที่คั่นหน้าโพสต์ โพสต์จะปรากฏที่นี่",
   "empty_column.community": "เส้นเวลาในเซิร์ฟเวอร์ว่างเปล่า เขียนบางอย่างเป็นสาธารณะเพื่อเริ่มต้น!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "คุณยังไม่มีข้อความโดยตรงใด ๆ เมื่อคุณส่งหรือรับข้อความ ข้อความจะปรากฏที่นี่",
   "empty_column.domain_blocks": "ยังไม่มีโดเมนที่ปิดกั้นอยู่",
   "empty_column.explore_statuses": "ไม่มีสิ่งใดที่กำลังนิยมในตอนนี้ กลับมาตรวจสอบในภายหลัง!",
   "empty_column.favourited_statuses": "คุณยังไม่มีโพสต์ที่ชื่นชอบใด ๆ เมื่อคุณชื่นชอบโพสต์ โพสต์จะปรากฏที่นี่",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "ดันโพสต์",
   "keyboard_shortcuts.column": "โฟกัสคอลัมน์",
   "keyboard_shortcuts.compose": "โฟกัสพื้นที่เขียนข้อความ",
-  "keyboard_shortcuts.conversations": "เพื่อเปิดคอลัมน์การสนทนา",
   "keyboard_shortcuts.description": "คำอธิบาย",
+  "keyboard_shortcuts.direct": "เพื่อเปิดคอลัมน์ข้อความโดยตรง",
   "keyboard_shortcuts.down": "ย้ายลงในรายการ",
   "keyboard_shortcuts.enter": "เปิดโพสต์",
   "keyboard_shortcuts.favourite": "ชื่นชอบโพสต์",
@@ -264,6 +267,8 @@
   "lightbox.expand": "ขยายกล่องดูภาพ",
   "lightbox.next": "ถัดไป",
   "lightbox.previous": "ก่อนหน้า",
+  "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "เพิ่มไปยังรายการ",
   "lists.account.remove": "เอาออกจากรายการ",
   "lists.delete": "ลบรายการ",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "ที่คั่นหน้า",
   "navigation_bar.community_timeline": "เส้นเวลาในเซิร์ฟเวอร์",
   "navigation_bar.compose": "เขียนโพสต์ใหม่",
+  "navigation_bar.direct": "ข้อความโดยตรง",
   "navigation_bar.discover": "ค้นพบ",
   "navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่",
   "navigation_bar.edit_profile": "แก้ไขโปรไฟล์",
@@ -348,9 +354,9 @@
   "notifications.grant_permission": "ให้สิทธิอนุญาต",
   "notifications.group": "{count} การแจ้งเตือน",
   "notifications.mark_as_read": "ทำเครื่องหมายทุกการแจ้งเตือนว่าอ่านแล้ว",
-  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
-  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications.permission_denied": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากมีการปฏิเสธคำขอสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้",
+  "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.title": "ไม่พลาดสิ่งใด",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก",
   "privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์",
   "privacy.direct.long": "ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น",
-  "privacy.direct.short": "เฉพาะผู้คนที่ฉันกล่าวถึงเท่านั้น",
+  "privacy.direct.short": "ผู้คนที่กล่าวถึงเท่านั้น",
   "privacy.private.long": "ปรากฏแก่ผู้ติดตามเท่านั้น",
   "privacy.private.short": "ผู้ติดตามเท่านั้น",
   "privacy.public.long": "ปรากฏแก่ทั้งหมด",
@@ -512,13 +518,13 @@
   "upload_button.label": "เพิ่มไฟล์ภาพ, วิดีโอ หรือเสียง",
   "upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์",
   "upload_error.poll": "ไม่อนุญาตให้อัปโหลดไฟล์กับการลงคะแนน",
-  "upload_form.audio_description": "อธิบายสำหรับผู้สูญเสียการได้ยิน",
+  "upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน",
   "upload_form.description": "อธิบายสำหรับผู้บกพร่องทางการมองเห็น",
   "upload_form.description_missing": "ไม่มีการเพิ่มคำอธิบาย",
   "upload_form.edit": "แก้ไข",
   "upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ",
   "upload_form.undo": "ลบ",
-  "upload_form.video_description": "อธิบายสำหรับผู้สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
+  "upload_form.video_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
   "upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
   "upload_modal.apply": "นำไปใช้",
   "upload_modal.applying": "กำลังนำไปใช้…",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index bc0e8f721..f98574e11 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -70,7 +70,7 @@
   "column.blocks": "Engellenen kullanıcılar",
   "column.bookmarks": "Yer İmleri",
   "column.community": "Yerel zaman tüneli",
-  "column.conversations": "Sohbetler",
+  "column.direct": "Doğrudan iletiler",
   "column.directory": "Profillere göz at",
   "column.domain_blocks": "Engellenen alan adları",
   "column.favourites": "Favoriler",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Sadece yerel",
   "community.column_settings.media_only": "Sadece medya",
   "community.column_settings.remote_only": "Sadece uzak",
+  "compose.language.change": "Dili değiştir",
+  "compose.language.search": "Dilleri ara...",
   "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edinin",
   "compose_form.encryption_warning": "Mastodondaki gönderiler uçtan uca şifrelemeli değildir. Mastodon üzerinden hassas olabilecek bir bilginizi paylaşmayın.",
   "compose_form.hashtag_warning": "Bu gönderi liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık gönderiler etiketlerde bulunabilir.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.",
   "embed.preview": "İşte nasıl görüneceği:",
   "emoji_button.activity": "Aktivite",
+  "emoji_button.clear": "Temizle",
   "emoji_button.custom": "Özel",
   "emoji_button.flags": "Bayraklar",
   "emoji_button.food": "Yiyecek ve İçecek",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Henüz herhangi bir kullanıcıyı engellemedin.",
   "empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.",
   "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
-  "empty_column.conversations": "Sadece bahsedilen kişilere özel gönderi paylaştığında veya bu gizlilik seçeneğinde bir gönderi aldığında bu sayfada gözükecek.",
+  "empty_column.direct": "Henüz doğrudan iletiniz yok. Bir tane gönderdiğinizde veya aldığınız burada listelenecekler.",
   "empty_column.domain_blocks": "Henüz engellenmiş bir alan adı yok.",
   "empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!",
   "empty_column.favourited_statuses": "Favori tootun yok. Favori tootun olduğunda burada görünür.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "gönderiyi boostla",
   "keyboard_shortcuts.column": "sütunlardan birindeki duruma odaklanmak için",
   "keyboard_shortcuts.compose": "yazma alanına odaklanmak için",
-  "keyboard_shortcuts.conversations": "sohbetler sütununu açmak için",
   "keyboard_shortcuts.description": "Açıklama",
+  "keyboard_shortcuts.direct": "doğrudan iletiler sütununu açmak için",
   "keyboard_shortcuts.down": "listede aşağıya inmek için",
   "keyboard_shortcuts.enter": "gönderiyi aç",
   "keyboard_shortcuts.favourite": "gönderiyi favorilerine ekle",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Resim görüntüleme kutusunu genişlet",
   "lightbox.next": "Sonraki",
   "lightbox.previous": "Önceki",
+  "limited_account_hint.action": "Yine de profili göster",
+  "limited_account_hint.title": "Bu profil sunucunuzun moderatörleri tarafından gizlendi.",
   "lists.account.add": "Listeye ekle",
   "lists.account.remove": "Listeden kaldır",
   "lists.delete": "Listeyi sil",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Yer İmleri",
   "navigation_bar.community_timeline": "Yerel Zaman Tüneli",
   "navigation_bar.compose": "Yeni gönderi yaz",
+  "navigation_bar.direct": "Doğrudan iletiler",
   "navigation_bar.discover": "Keşfet",
   "navigation_bar.domain_blocks": "Engellenen alan adları",
   "navigation_bar.edit_profile": "Profili düzenle",
@@ -315,7 +321,7 @@
   "notification.mention": "{name} senden bahsetti",
   "notification.own_poll": "Anketiniz sona erdi",
   "notification.poll": "Oy verdiğiniz bir anket sona erdi",
-  "notification.reblog": "{name} gönderini teşvik etti",
+  "notification.reblog": "{name} gönderini boostladı",
   "notification.status": "{name} az önce gönderdi",
   "notification.update": "{name} bir gönderiyi düzenledi",
   "notifications.clear": "Bildirimleri temizle",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Anketi kaldır",
   "privacy.change": "Gönderi gizliliğini değiştir",
   "privacy.direct.long": "Sadece bahsedilen kullanıcılar için görünür",
-  "privacy.direct.short": "Sadece bahsettiğim kişiler",
+  "privacy.direct.short": "Sadece bahsedilen kişiler",
   "privacy.private.long": "Sadece takipçiler için görünür",
   "privacy.private.short": "Sadece takipçiler",
   "privacy.public.long": "Herkese açık",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index bd20b1efe..e05804d93 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -7,13 +7,13 @@
   "account.block_domain": "{domain} доменын блоклау",
   "account.blocked": "Блокланган",
   "account.browse_more_on_origin_server": "Тулырак оригинал профилендә карап була",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "Язылуга сорауны бетерү",
   "account.direct": "@{name} өчен яңа хат",
-  "account.disable_notifications": "Stop notifying me when @{name} posts",
-  "account.domain_blocked": "Domain blocked",
+  "account.disable_notifications": "@{name} язулары өчен белдерүләр сүндерү",
+  "account.domain_blocked": "Домен блокланган",
   "account.edit_profile": "Профильны үзгәртү",
   "account.enable_notifications": "@{name} язулары өчен белдерүләр яндыру",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Профильдә рекомендацияләү",
   "account.follow": "Языл",
   "account.followers": "Язылучылар",
   "account.followers.empty": "Әле беркем дә язылмаган.",
@@ -23,12 +23,12 @@
   "account.follows.empty": "Беркемгә дә язылмаган әле.",
   "account.follows_you": "Сезгә язылган",
   "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.joined": "Joined {date}",
+  "account.joined": "{date} көнендә теркәлде",
   "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "Бу - ябык аккаунт. Аны язылучылар гына күрә ала.",
   "account.media": "Медиа",
   "account.mention": "@{name} искәртү",
-  "account.moved_to": "{name} has moved to:",
+  "account.moved_to": "{name} монда күчте:",
   "account.mute": "Mute @{name}",
   "account.mute_notifications": "Mute notifications from @{name}",
   "account.muted": "Muted",
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Кыстыргычлар",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Активлык",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Куелган",
   "emoji_button.flags": "Байраклар",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Тасвирлама",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Киләсе",
   "lightbox.previous": "Алдагы",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Исемлектән бетерергә",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Кыстыргычлар",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Профильны үзгәртү",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 09d473ef4..7b041a208 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -70,7 +70,7 @@
   "column.blocks": "Blocked users",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "Favourites",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Local only",
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Flags",
   "emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Edit profile",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 16d4e0b3b..d7e8a446f 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -6,30 +6,30 @@
   "account.block": "Заблокувати @{name}",
   "account.block_domain": "Заблокувати домен {domain}",
   "account.blocked": "Заблоковані",
-  "account.browse_more_on_origin_server": "Переглянути більше в оригіналі",
+  "account.browse_more_on_origin_server": "Переглянути більше в оригінальному профілі",
   "account.cancel_follow_request": "Скасувати запит на підписку",
-  "account.direct": "Пряме повідомлення @{name}",
+  "account.direct": "Надіслати пряме повідомлення @{name}",
   "account.disable_notifications": "Не повідомляти мене про дописи @{name}",
-  "account.domain_blocked": "Домен приховано",
+  "account.domain_blocked": "Домен заблоковано",
   "account.edit_profile": "Редагувати профіль",
   "account.enable_notifications": "Повідомляти мене про дописи @{name}",
-  "account.endorse": "Публікувати у профілі",
+  "account.endorse": "Рекомендувати у профілі",
   "account.follow": "Підписатися",
   "account.followers": "Підписники",
-  "account.followers.empty": "Ніхто ще не підписався на цього користувача.",
-  "account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}",
-  "account.following": "Стежите",
-  "account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}",
+  "account.followers.empty": "Ніхто ще не підписаний на цього користувача.",
+  "account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписника} many {{counter} підписників} other {{counter} підписники}}",
+  "account.following": "Ви стежите",
+  "account.following_counter": "{count, plural, one {{counter} підписка} few {{counter} підписки} many {{counter} підписок} other {{counter} підписки}}",
   "account.follows.empty": "Цей користувач ще ні на кого не підписався.",
-  "account.follows_you": "Підписаний(-а) на вас",
-  "account.hide_reblogs": "Сховати передмухи від @{name}",
-  "account.joined": "Долучення {date}",
+  "account.follows_you": "Підписані на вас",
+  "account.hide_reblogs": "Сховати поширення від @{name}",
+  "account.joined": "Долучилися {date}",
   "account.link_verified_on": "Права власності на це посилання були перевірені {date}",
-  "account.locked_info": "Статус конфіденційності цього облікового запису встановлено у заблокований. Власник вручну переглядає, хто може за ним стежити.",
+  "account.locked_info": "Це закритий обліковий запис. Власник вручну обирає, хто може на нього підписуватися.",
   "account.media": "Медіа",
   "account.mention": "Згадати @{name}",
   "account.moved_to": "{name} переїхав на:",
-  "account.mute": "Нехтувати @{name}",
+  "account.mute": "Приховати @{name}",
   "account.mute_notifications": "Не показувати сповіщення від @{name}",
   "account.muted": "Нехтується",
   "account.posts": "Дмухи",
@@ -48,38 +48,38 @@
   "account.unmute_notifications": "Показувати сповіщення від @{name}",
   "account.unmute_short": "Не нехтувати",
   "account_note.placeholder": "Коментарі відсутні",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Щоденний показник утримання користувачів після реєстрації",
+  "admin.dashboard.monthly_retention": "Щомісячний показник утримання користувачів після реєстрації",
   "admin.dashboard.retention.average": "Середнє",
   "admin.dashboard.retention.cohort": "Місяць реєстрації",
   "admin.dashboard.retention.cohort_size": "Нові користувачі",
   "alert.rate_limited.message": "Спробуйте ще раз через {retry_time, time, medium}.",
   "alert.rate_limited.title": "Швидкість обмежена",
-  "alert.unexpected.message": "Трапилась неочікувана помилка.",
+  "alert.unexpected.message": "Сталася неочікувана помилка.",
   "alert.unexpected.title": "Ой!",
   "announcement.announcement": "Оголошення",
   "attachments_list.unprocessed": "(не оброблено)",
   "autosuggest_hashtag.per_week": "{count} в тиждень",
   "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
-  "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.",
+  "bundle_column_error.body": "Щось пішло не так під час завантаження цього компоненту.",
   "bundle_column_error.retry": "Спробуйте ще раз",
   "bundle_column_error.title": "Помилка мережі",
   "bundle_modal_error.close": "Закрити",
-  "bundle_modal_error.message": "Щось пішло не так під час завантаження компоненту.",
+  "bundle_modal_error.message": "Щось пішло не так під час завантаження цього компоненту.",
   "bundle_modal_error.retry": "Спробувати ще раз",
   "column.blocks": "Заблоковані користувачі",
   "column.bookmarks": "Закладки",
   "column.community": "Локальна стрічка",
-  "column.conversations": "Бесіди",
+  "column.direct": "Прямі повідомлення",
   "column.directory": "Переглянути профілі",
-  "column.domain_blocks": "Приховані домени",
+  "column.domain_blocks": "Заблоковані домени",
   "column.favourites": "Вподобане",
   "column.follow_requests": "Запити на підписку",
   "column.home": "Головна",
   "column.lists": "Списки",
   "column.mutes": "Нехтувані користувачі",
   "column.notifications": "Сповіщення",
-  "column.pins": "Закріплені дмухи",
+  "column.pins": "Закріплені дописи",
   "column.public": "Глобальна стрічка",
   "column_back_button.label": "Назад",
   "column_header.hide_settings": "Приховати налаштування",
@@ -89,22 +89,24 @@
   "column_header.show_settings": "Показати налаштування",
   "column_header.unpin": "Відкріпити",
   "column_subheading.settings": "Налаштування",
-  "community.column_settings.local_only": "Тільки локальні",
-  "community.column_settings.media_only": "Тільки медіа",
-  "community.column_settings.remote_only": "Тільки видалені",
+  "community.column_settings.local_only": "Лише локальні",
+  "community.column_settings.media_only": "Лише з медіа",
+  "community.column_settings.remote_only": "Лише віддалені",
+  "compose.language.change": "Змінити мову",
+  "compose.language.search": "Шукати мови...",
   "compose_form.direct_message_warning_learn_more": "Дізнатися більше",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Цей дмух не буде відображений у жодній стрічці хештеґу, оскільки він прихований. Тільки публічні дмухи можуть бути знайдені за хештеґом.",
-  "compose_form.lock_disclaimer": "Ваш акаунт не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші приватні пости.",
+  "compose_form.encryption_warning": "Дописи на Mastodon не захищені шифруванням. Не поширюйте жодну потенційно небезпечну інформацію.",
+  "compose_form.hashtag_warning": "Цей допис не буде зображений у жодній стрічці гештеґу, оскільки він прихований. Тільки публічні дописи можуть бути знайдені за гештеґом.",
+  "compose_form.lock_disclaimer": "Ваш обліковий запис не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші дописи для підписників.",
   "compose_form.lock_disclaimer.lock": "приватний",
   "compose_form.placeholder": "Що у вас на думці?",
   "compose_form.poll.add_option": "Додати варіант",
   "compose_form.poll.duration": "Тривалість опитування",
   "compose_form.poll.option_placeholder": "Варіант {number}",
   "compose_form.poll.remove_option": "Видалити цей варіант",
-  "compose_form.poll.switch_to_multiple": "Перемкнути у режим вибору декількох відповідей",
+  "compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей",
   "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
-  "compose_form.publish": "Дмухнути",
+  "compose_form.publish": "Надіслати",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Зберегти зміни",
   "compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
@@ -123,67 +125,68 @@
   "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?",
   "confirmations.discard_edit_media.confirm": "Відкинути",
   "confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?",
-  "confirmations.domain_block.confirm": "Сховати весь домен",
-  "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або нехтувати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.",
+  "confirmations.domain_block.confirm": "Заблокувати весь домен",
+  "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.",
   "confirmations.logout.confirm": "Вийти",
   "confirmations.logout.message": "Ви впевнені, що хочете вийти?",
   "confirmations.mute.confirm": "Нехтуавти",
   "confirmations.mute.explanation": "Це сховає дописи від них і дописи зі згадками про них, проте вони все одно матимуть змогу бачити ваші дописи й підписуватися на вас.",
-  "confirmations.mute.message": "Ви впевнені, що хочете нехтувати {name}?",
-  "confirmations.redraft.confirm": "Видалити та перестворити",
-  "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.",
+  "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": "Видалити цю бесіду",
+  "conversation.delete": "Видалити бесіду",
   "conversation.mark_as_read": "Позначити як прочитане",
   "conversation.open": "Переглянути бесіду",
   "conversation.with": "З {names}",
   "directory.federated": "З відомого федесвіту",
-  "directory.local": "Тільки з домену {domain}",
+  "directory.local": "Лише з домену {domain}",
   "directory.new_arrivals": "Нові надходження",
-  "directory.recently_active": "Активні нещодавно",
-  "embed.instructions": "Вбудуйте цей статус до вашого вебсайту, скопіювавши код нижче.",
+  "directory.recently_active": "Нещодавно активні",
+  "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
   "embed.preview": "Ось як він виглядатиме:",
-  "emoji_button.activity": "Заняття",
-  "emoji_button.custom": "Особливі",
+  "emoji_button.activity": "Діяльність",
+  "emoji_button.clear": "Очистити",
+  "emoji_button.custom": "Власні",
   "emoji_button.flags": "Прапори",
   "emoji_button.food": "Їжа та напої",
-  "emoji_button.label": "Вставити емодзі",
+  "emoji_button.label": "Вставити емоджі",
   "emoji_button.nature": "Природа",
-  "emoji_button.not_found": "Немає емодзі!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Немає емоджі!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Предмети",
   "emoji_button.people": "Люди",
   "emoji_button.recent": "Часто використовувані",
   "emoji_button.search": "Шукати...",
   "emoji_button.search_results": "Результати пошуку",
   "emoji_button.symbols": "Символи",
-  "emoji_button.travel": "Подорожі",
+  "emoji_button.travel": "Подорожі та місця",
   "empty_column.account_suspended": "Обліковий запис заблоковано",
-  "empty_column.account_timeline": "Тут дмухалок немає!",
+  "empty_column.account_timeline": "Тут немає дописів!",
   "empty_column.account_unavailable": "Профіль недоступний",
   "empty_column.blocks": "Ви ще не заблокували жодного користувача.",
-  "empty_column.bookmarked_statuses": "У вас ще немає дмухів у закладках. Коли ви щось додасте до заклкдок, воно з'явиться тут.",
+  "empty_column.bookmarked_statuses": "У вас ще немає дописів у закладках. Коли ви щось додасте до закладок, воно з'явиться тут.",
   "empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви щось отримаєте чи надішлете, воно з'явиться тут.",
   "empty_column.domain_blocks": "Тут поки немає прихованих доменів.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
-  "empty_column.favourited_statuses": "У вас ще немає вподобаних дмухів. Коли ви щось вподобаєте, воно з'явиться тут.",
-  "empty_column.favourites": "Ніхто ще не вподобав цього дмуху. Коли хтось це зробить, вони з'являться тут.",
-  "empty_column.follow_recommendations": "Схоже, для вас не буде створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати або переглянути популярні хештеґи.",
+  "empty_column.explore_statuses": "Нема нічого популярного. Подивіться пізніше!",
+  "empty_column.favourited_statuses": "У вас ще немає вподобаних дописів. Коли ви щось вподобаєте, воно з'явиться тут.",
+  "empty_column.favourites": "Ніхто ще не вподобав цей допис. Коли хтось це зробить, він з'явиться тут.",
+  "empty_column.follow_recommendations": "Схоже, для вас не було створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати, або переглянути популярні гештеґи.",
   "empty_column.follow_requests": "У вас ще немає запитів на підписку. Коли ви їх отримаєте, вони з'являться тут.",
-  "empty_column.hashtag": "Дописів з цим хештегом поки не існує.",
-  "empty_column.home": "Ви поки ні на кого не підписані. Погортайте {public}, або скористуйтесь пошуком, щоб освоїтися та познайомитися з іншими користувачами.",
+  "empty_column.hashtag": "Дописів з цим гештеґом поки не існує.",
+  "empty_column.home": "Ваша стрічка порожня! Підпишіться на інших, щоб її заповнити. {suggestions}",
   "empty_column.home.suggestions": "Переглянути пропозиції",
-  "empty_column.list": "Немає нічого в цьому списку. Коли його учасники дмухнуть нові статуси, вони з'являться тут.",
+  "empty_column.list": "Цей список порожній. Коли його учасники додадуть нові дописи, вони з'являться тут.",
   "empty_column.lists": "У вас ще немає списків. Коли ви їх створите, вони з'являться тут.",
   "empty_column.mutes": "Ви ще не нехтуєте жодного користувача.",
   "empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.",
-  "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку",
-  "error.unexpected_crash.explanation": "Ця сторінка не може бути коректно відображена через баґ у нашому коді або через проблему сумісності браузера.",
+  "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших серверів, щоб заповнити стрічку",
+  "error.unexpected_crash.explanation": "Через помилку у нашому коді або несумісність браузера, ця сторінка не може бути зображена коректно.",
   "error.unexpected_crash.explanation_addons": "Неможливо правильно показати цю сторінку. Ймовірно, цю помилку викликано додатком браузера або автоматичним засобом перекладу.",
-  "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний додаток.",
+  "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний застосунок.",
   "error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
   "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
   "errors.unexpected_crash.report_issue": "Повідомити про проблему",
@@ -203,53 +206,53 @@
   "getting_started.developers": "Розробникам",
   "getting_started.directory": "Каталог профілів",
   "getting_started.documentation": "Документація",
-  "getting_started.heading": "Ласкаво просимо",
-  "getting_started.invite": "Запросіть людей",
-  "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проекту, або повідомити про проблеми на GitHub за адресою {github}.",
-  "getting_started.security": "Безпека",
+  "getting_started.heading": "Розпочати",
+  "getting_started.invite": "Запросити людей",
+  "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проєкту, або повідомити про проблеми на GitHub: {github}.",
+  "getting_started.security": "Налаштування облікового запису",
   "getting_started.terms": "Умови використання",
   "hashtag.column_header.tag_mode.all": "та {additional}",
   "hashtag.column_header.tag_mode.any": "або {additional}",
   "hashtag.column_header.tag_mode.none": "без {additional}",
-  "hashtag.column_settings.select.no_options_message": "Не знайдено пропозицій",
-  "hashtag.column_settings.select.placeholder": "Введіть хештеґи…",
-  "hashtag.column_settings.tag_mode.all": "Усі ці",
-  "hashtag.column_settings.tag_mode.any": "Який-небудь з цих",
-  "hashtag.column_settings.tag_mode.none": "Жоден з цих",
-  "hashtag.column_settings.tag_toggle": "Додайте додаткові теґи до цього стовпчика",
+  "hashtag.column_settings.select.no_options_message": "Пропозицій не знайдено",
+  "hashtag.column_settings.select.placeholder": "Введіть гештеґи…",
+  "hashtag.column_settings.tag_mode.all": "Усе зі списку",
+  "hashtag.column_settings.tag_mode.any": "Який-небудь зі списку",
+  "hashtag.column_settings.tag_mode.none": "Жоден зі списку",
+  "hashtag.column_settings.tag_toggle": "Додати додаткові теґи до цього стовпчика",
   "home.column_settings.basic": "Основні",
-  "home.column_settings.show_reblogs": "Показувати передмухи",
+  "home.column_settings.show_reblogs": "Показувати поширення",
   "home.column_settings.show_replies": "Показувати відповіді",
   "home.hide_announcements": "Приховати оголошення",
   "home.show_announcements": "Показати оголошення",
   "intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}",
   "intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}",
   "intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
-  "keyboard_shortcuts.back": "переходити назад",
-  "keyboard_shortcuts.blocked": "відкрити список заблокованих користувачів",
-  "keyboard_shortcuts.boost": "передмухувати",
-  "keyboard_shortcuts.column": "фокусуватися на одній з колонок",
-  "keyboard_shortcuts.compose": "фокусуватися на полі введення",
-  "keyboard_shortcuts.conversations": "to open conversations column",
+  "keyboard_shortcuts.back": "Перейти назад",
+  "keyboard_shortcuts.blocked": "Відкрити список заблокованих користувачів",
+  "keyboard_shortcuts.boost": "Поширити допис",
+  "keyboard_shortcuts.column": "Фокусуватися на одній з колонок",
+  "keyboard_shortcuts.compose": "Фокусуватися на полі введення",
   "keyboard_shortcuts.description": "Опис",
-  "keyboard_shortcuts.down": "рухатися вниз стрічкою",
-  "keyboard_shortcuts.enter": "відкрити статус",
-  "keyboard_shortcuts.favourite": "вподобати",
-  "keyboard_shortcuts.favourites": "відкрити список улюбленого",
-  "keyboard_shortcuts.federated": "відкрити глобальну стрічку",
-  "keyboard_shortcuts.heading": "Гарячі клавіші",
-  "keyboard_shortcuts.home": "відкрити домашню стрічку",
+  "keyboard_shortcuts.direct": "щоб відкрити колонку прямих повідомлень",
+  "keyboard_shortcuts.down": "Рухатися вниз стрічкою",
+  "keyboard_shortcuts.enter": "Відкрити допис",
+  "keyboard_shortcuts.favourite": "Вподобати допис",
+  "keyboard_shortcuts.favourites": "Відкрити список вподобаного",
+  "keyboard_shortcuts.federated": "Відкрити глобальну стрічку",
+  "keyboard_shortcuts.heading": "Комбінації клавіш",
+  "keyboard_shortcuts.home": "Відкрити домашню стрічку",
   "keyboard_shortcuts.hotkey": "Гаряча клавіша",
-  "keyboard_shortcuts.legend": "показати підказку",
-  "keyboard_shortcuts.local": "відкрити локальну стрічку",
-  "keyboard_shortcuts.mention": "згадати автора",
+  "keyboard_shortcuts.legend": "Показати легенду",
+  "keyboard_shortcuts.local": "Відкрити локальну стрічку",
+  "keyboard_shortcuts.mention": "Згадати автора",
   "keyboard_shortcuts.muted": "Відкрити список нехтуваних користувачів",
-  "keyboard_shortcuts.my_profile": "відкрити ваш профіль",
-  "keyboard_shortcuts.notifications": "відкрити колонку сповіщень",
-  "keyboard_shortcuts.open_media": "відкрити медіа",
-  "keyboard_shortcuts.pinned": "відкрити список закріплених дмухів",
-  "keyboard_shortcuts.profile": "відкрити профіль автора",
-  "keyboard_shortcuts.reply": "відповісти",
+  "keyboard_shortcuts.my_profile": "Відкрити ваш профіль",
+  "keyboard_shortcuts.notifications": "Відкрити колонку сповіщень",
+  "keyboard_shortcuts.open_media": "Відкрити медіа",
+  "keyboard_shortcuts.pinned": "Відкрити список закріплених дописів",
+  "keyboard_shortcuts.profile": "Відкрити профіль автора",
+  "keyboard_shortcuts.reply": "Відповісти",
   "keyboard_shortcuts.requests": "відкрити список бажаючих підписатися",
   "keyboard_shortcuts.search": "сфокусуватися на пошуку",
   "keyboard_shortcuts.spoilers": "показати/приховати поле CW",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Розгорнути поле перегляду зображень",
   "lightbox.next": "Далі",
   "lightbox.previous": "Назад",
+  "limited_account_hint.action": "Усе одно показати профіль",
+  "limited_account_hint.title": "Цей профіль прихований модераторами вашого сервера.",
   "lists.account.add": "Додати до списку",
   "lists.account.remove": "Видалити зі списку",
   "lists.delete": "Видалити список",
@@ -285,41 +290,42 @@
   "mute_modal.duration": "Тривалість",
   "mute_modal.hide_notifications": "Сховати сповіщення від користувача?",
   "mute_modal.indefinite": "Не визначено",
-  "navigation_bar.apps": "Мобільні додатки",
+  "navigation_bar.apps": "Мобільні застосунки",
   "navigation_bar.blocks": "Заблоковані користувачі",
   "navigation_bar.bookmarks": "Закладки",
   "navigation_bar.community_timeline": "Локальна стрічка",
-  "navigation_bar.compose": "Написати новий дмух",
-  "navigation_bar.discover": "Знайти",
-  "navigation_bar.domain_blocks": "Приховані домени",
+  "navigation_bar.compose": "Написати новий допис",
+  "navigation_bar.direct": "Прямі повідомлення",
+  "navigation_bar.discover": "Дослідити",
+  "navigation_bar.domain_blocks": "Заблоковані домени",
   "navigation_bar.edit_profile": "Редагувати профіль",
   "navigation_bar.explore": "Огляд",
   "navigation_bar.favourites": "Вподобане",
   "navigation_bar.filters": "Приховані слова",
   "navigation_bar.follow_requests": "Запити на підписку",
-  "navigation_bar.follows_and_followers": "Підписки і підписники",
-  "navigation_bar.info": "Про сайт",
+  "navigation_bar.follows_and_followers": "Підписки та підписники",
+  "navigation_bar.info": "Про цей сервер",
   "navigation_bar.keyboard_shortcuts": "Гарячі клавіші",
   "navigation_bar.lists": "Списки",
   "navigation_bar.logout": "Вийти",
   "navigation_bar.mutes": "Нехтувані користувачі",
   "navigation_bar.personal": "Особисте",
-  "navigation_bar.pins": "Закріплені дмухи",
+  "navigation_bar.pins": "Закріплені дописи",
   "navigation_bar.preferences": "Налаштування",
   "navigation_bar.public_timeline": "Глобальна стрічка",
   "navigation_bar.security": "Безпека",
-  "notification.admin.sign_up": "{name} приєднується",
-  "notification.favourite": "{name} вподобав(-ла) ваш допис",
-  "notification.follow": "{name} підписався(-лась) на вас",
-  "notification.follow_request": "{name} відправив(-ла) запит на підписку",
-  "notification.mention": "{name} згадав(-ла) вас",
+  "notification.admin.sign_up": "{name} приєдналися",
+  "notification.favourite": "{name} вподобали ваш допис",
+  "notification.follow": "{name} підписалися на вас",
+  "notification.follow_request": "{name} відправили запит на підписку",
+  "notification.mention": "{name} згадали вас",
   "notification.own_poll": "Ваше опитування завершено",
   "notification.poll": "Опитування, у якому ви голосували, закінчилося",
-  "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
+  "notification.reblog": "{name} поширили ваш допис",
   "notification.status": "{name} щойно дописує",
   "notification.update": "{name} змінює допис",
   "notifications.clear": "Очистити сповіщення",
-  "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
+  "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?",
   "notifications.column_settings.admin.sign_up": "Нові реєстрації:",
   "notifications.column_settings.alert": "Сповіщення на комп'ютері",
   "notifications.column_settings.favourite": "Вподобане:",
@@ -360,22 +366,22 @@
   "poll.total_people": "{count, plural, one {# особа} other {# осіб}}",
   "poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}",
   "poll.vote": "Проголосувати",
-  "poll.voted": "Ви голосували за цю відповідь",
+  "poll.voted": "Ви проголосували за цю відповідь",
   "poll.votes": "{votes, plural, one {# голос} few {# голоси} many {# голосів} other {# голоса}}",
   "poll_button.add_poll": "Додати опитування",
   "poll_button.remove_poll": "Видалити опитування",
   "privacy.change": "Змінити видимість допису",
   "privacy.direct.long": "Показати тільки згаданим користувачам",
-  "privacy.direct.short": "Лише люди, яких я згадую",
+  "privacy.direct.short": "Лише згадані люди",
   "privacy.private.long": "Показати тільки підписникам",
   "privacy.private.short": "Тільки для підписників",
-  "privacy.public.long": "Visible for all",
+  "privacy.public.long": "Видимий для всіх",
   "privacy.public.short": "Публічно",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.long": "Видимий для всіх, але не через можливості виявлення",
   "privacy.unlisted.short": "Прихований",
   "refresh": "Оновити",
   "regeneration_indicator.label": "Завантаження…",
-  "regeneration_indicator.sublabel": "Ваша домашня стрічка готується!",
+  "regeneration_indicator.sublabel": "Хвилинку, ми готуємо вашу стрічку!",
   "relative_time.days": "{number}д",
   "relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому",
   "relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому",
@@ -389,16 +395,16 @@
   "relative_time.today": "сьогодні",
   "reply_indicator.cancel": "Відмінити",
   "report.block": "Заблокувати",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+  "report.block_explanation": "Ви не будете бачити дописи цього користувача, а вони не зможуть бачити ваші дописи або підписуватися на вас. Вони будуть бачити, що ви їх заблокували.",
   "report.categories.other": "Інше",
   "report.categories.spam": "Спам",
   "report.categories.violation": "Контент порушує одне або кілька правил сервера",
   "report.category.subtitle": "Оберіть найкращий збіг",
-  "report.category.title": "Tell us what's going on with this {type}",
+  "report.category.title": "Розкажіть нам, що не так з цим {type}",
   "report.category.title_account": "профіль",
   "report.category.title_status": "допис",
   "report.close": "Готово",
-  "report.comment.title": "Is there anything else you think we should know?",
+  "report.comment.title": "Чи є щось, що нам потрібно знати?",
   "report.forward": "Надіслати до {target}",
   "report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?",
   "report.mute": "Нехтувати",
@@ -406,25 +412,25 @@
   "report.next": "Далі",
   "report.placeholder": "Додаткові коментарі",
   "report.reasons.dislike": "Мені це не подобається",
-  "report.reasons.dislike_description": "It is not something you want to see",
+  "report.reasons.dislike_description": "Вам би не хотілося це бачити",
   "report.reasons.other": "Це щось інше",
-  "report.reasons.other_description": "The issue does not fit into other categories",
+  "report.reasons.other_description": "Ця проблема не відповідає жодній іншій категорії",
   "report.reasons.spam": "Це спам",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.spam_description": "Шкідливі посилання, фальшиві взаємодії, або повідомлення, що повторюються",
   "report.reasons.violation": "Порушує правила сервера",
   "report.reasons.violation_description": "Ви впевнені, що це порушує певні правила",
   "report.rules.subtitle": "Виберіть усі варіанти, що підходять",
   "report.rules.title": "Які правила порушено?",
   "report.statuses.subtitle": "Виберіть усі варіанти, що підходять",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.statuses.title": "Чи є дописи, які належать до цієї скарги?",
   "report.submit": "Відправити",
   "report.target": "Скаржимося на {target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.take_action": "Ось ваші варіанти управління тим, що ви бачите в Mastodon:",
+  "report.thanks.take_action_actionable": "Поки ми переглядаємо це, ви можете вжити власних заходів проти @{name}:",
   "report.thanks.title": "Не хочете це бачити?",
   "report.thanks.title_actionable": "Дякуємо за скаргу, ми розглянемо її.",
   "report.unfollow": "Відписатися від @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.unfollow_explanation": "Ви підписані на цього користувача. Щоб більше не бачити їхні дописи у вашій стрічці, відпишіться від них.",
   "search.placeholder": "Пошук",
   "search_popout.search_format": "Розширений формат пошуку",
   "search_popout.tips.full_text": "Пошук за текстом знаходить статуси, які ви написали, вподобали, передмухнули, або в яких вас згадували. Також він знаходить імена користувачів, реальні імена та хештеґи.",
@@ -437,7 +443,7 @@
   "search_results.hashtags": "Хештеґи",
   "search_results.nothing_found": "Нічого не вдалося знайти за цими пошуковими термінами",
   "search_results.statuses": "Дмухів",
-  "search_results.statuses_fts_disabled": "Пошук дмухів за вмістом недоступний на цьому сервері Mastodon.",
+  "search_results.statuses_fts_disabled": "Пошук дописів за вмістом недоступний на даному сервері Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}",
   "status.admin_account": "Відкрити інтерфейс модерації для @{name}",
   "status.admin_status": "Відкрити цей статус в інтерфейсі модерації",
@@ -461,8 +467,8 @@
   "status.media_hidden": "Медіа приховано",
   "status.mention": "Згадати @{name}",
   "status.more": "Більше",
-  "status.mute": "Нехтувати @{name}",
-  "status.mute_conversation": "Нехтувати діалог",
+  "status.mute": "Приховати @{name}",
+  "status.mute_conversation": "Ігнорувати діалог",
   "status.open": "Розгорнути допис",
   "status.pin": "Закріпити у профілі",
   "status.pinned": "Закріплений дмух",
@@ -484,7 +490,7 @@
   "status.show_more_all": "Показувати більше для всіх",
   "status.show_thread": "Показати ланцюжок",
   "status.uncached_media_warning": "Недоступно",
-  "status.unmute_conversation": "Не нехтувати діалог",
+  "status.unmute_conversation": "Не ігнорувати діалог",
   "status.unpin": "Відкріпити від профілю",
   "suggestions.dismiss": "Відхилити пропозицію",
   "suggestions.header": "Вас може зацікавити…",
@@ -498,42 +504,42 @@
   "time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
   "time_remaining.moments": "Залишилось секунд",
   "time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}",
-  "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не відображається.",
+  "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не зображується.",
   "timeline_hint.resources.followers": "Підписники",
   "timeline_hint.resources.follows": "Підписки",
-  "timeline_hint.resources.statuses": "Старіші дмухи",
+  "timeline_hint.resources.statuses": "Попередні дописи",
   "trends.counter_by_accounts": "{count, plural, one {{counter} особа обговорює} few {{counter} особи обговорюють} many {{counter} осіб обговорюють} other {{counter} особи обговорюють}}",
   "trends.trending_now": "Актуальні",
   "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.",
-  "units.short.billion": "{count} млрд",
-  "units.short.million": "{count} млн",
-  "units.short.thousand": "{count} тис",
+  "units.short.billion": "{count} млрд.",
+  "units.short.million": "{count} млн.",
+  "units.short.thousand": "{count} тис.",
   "upload_area.title": "Перетягніть сюди, щоб завантажити",
-  "upload_button.label": "Додати медіа",
+  "upload_button.label": "Додати зображення, відео або аудіо",
   "upload_error.limit": "Ліміт завантаження файлів перевищено.",
   "upload_error.poll": "Не можна завантажувати файли до опитувань.",
   "upload_form.audio_description": "Опишіть для людей із вадами слуху",
   "upload_form.description": "Опишіть для людей з вадами зору",
-  "upload_form.description_missing": "Опису не додано",
+  "upload_form.description_missing": "Немає опису",
   "upload_form.edit": "Змінити",
   "upload_form.thumbnail": "Змінити мініатюру",
   "upload_form.undo": "Видалити",
   "upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
-  "upload_modal.analyzing_picture": "Аналізуємо малюнок…",
+  "upload_modal.analyzing_picture": "Аналізуємо зображення…",
   "upload_modal.apply": "Застосувати",
   "upload_modal.applying": "Застосування…",
   "upload_modal.choose_image": "Вибрати зображення",
   "upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах",
-  "upload_modal.detect_text": "Виявити текст на малюнку",
+  "upload_modal.detect_text": "Виявити текст на зображенні",
   "upload_modal.edit_media": "Редагувати медіа",
-  "upload_modal.hint": "Клацніть або перетягніть коло на превью, щоб обрати точку, яку буде завжди видно на мініатюрах.",
+  "upload_modal.hint": "Клацніть або перетягніть коло на превʼю, щоб обрати точку, яку буде завжди видно на мініатюрах.",
   "upload_modal.preparing_ocr": "Підготовка OCR…",
   "upload_modal.preview_label": "Переглянути ({ratio})",
   "upload_progress.label": "Завантаження...",
   "video.close": "Закрити відео",
-  "video.download": "Завантаження файла",
+  "video.download": "Завантажити файл",
   "video.exit_fullscreen": "Вийти з повноекранного режиму",
-  "video.expand": "Розширити відео",
+  "video.expand": "Розгорнути відео",
   "video.fullscreen": "На весь екран",
   "video.hide": "Приховати відео",
   "video.mute": "Вимкнути звук",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index 42728af0f..d5ed07a9c 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -70,7 +70,7 @@
   "column.blocks": "مسدود صارفین",
   "column.bookmarks": "بُک مارکس",
   "column.community": "مقامی زمانی جدول",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "مشخصات کا مطالعہ کریں",
   "column.domain_blocks": "پوشیدہ ڈومین",
   "column.favourites": "پسندیدہ",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "صرف مقامی",
   "community.column_settings.media_only": "وسائل فقط",
   "community.column_settings.remote_only": "صرف خارجی",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "مزید جانیں",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "چونکہ یہ ٹوٹ غیر مندرجہ ہے لہذا یہ کسی بھی ہیش ٹیگ کے تحت درج نہیں کیا جائے گا. ہیش ٹیگ کے تحت صرف \nعمومی ٹوٹ تلاش کئے جا سکتے ہیں.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "یہ اس طرح نظر آئے گا:",
   "emoji_button.activity": "سرگرمی",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "حسب منشا",
   "emoji_button.flags": "پرچم",
   "emoji_button.food": "عذا و مشروب",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "آپ نے ابھی کسی صارف کو مسدود نہیں کیا ہے.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "مقامی جدول خالی ہے. کچھ تحریر کریں تاکہ بات آگے بڑھے!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "ابھی تک کوئی چھپا ہوا ڈومین نہیں ہے.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "آپ کا کوئی پسندیدہ ٹوٹ نہیں ہے. جب آپ پسند کریں گے، یہاں نظر آئےگا.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "بُک مارکس",
   "navigation_bar.community_timeline": "مقامی ٹائم لائن",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "دریافت کریں",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "پروفائل میں ترمیم کریں",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 6692d2b21..e4e7c233b 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -70,7 +70,7 @@
   "column.blocks": "Người đã chặn",
   "column.bookmarks": "Đã lưu",
   "column.community": "Máy chủ của bạn",
-  "column.conversations": "Thảo luận",
+  "column.direct": "Nhắn riêng",
   "column.directory": "Tìm người cùng sở thích",
   "column.domain_blocks": "Máy chủ đã chặn",
   "column.favourites": "Thích",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "Chỉ máy chủ của bạn",
   "community.column_settings.media_only": "Chỉ xem media",
   "community.column_settings.remote_only": "Chỉ người dùng ở máy chủ khác",
+  "compose.language.change": "Đổi ngôn ngữ",
+  "compose.language.search": "Tìm ngôn ngữ...",
   "compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm",
   "compose_form.encryption_warning": "Các tút trên Mastodon không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào qua Mastodon.",
   "compose_form.hashtag_warning": "Tút này sẽ không xuất hiện công khai. Chỉ những tút công khai mới có thể được tìm kiếm thông qua hashtag.",
@@ -118,7 +120,7 @@
   "confirmations.block.confirm": "Chặn",
   "confirmations.block.message": "Bạn có thật sự muốn chặn {name}?",
   "confirmations.delete.confirm": "Xóa bỏ",
-  "confirmations.delete.message": "Bạn \bthật sự muốn xóa tút này?",
+  "confirmations.delete.message": "Bạn thật sự muốn xóa tút này?",
   "confirmations.delete_list.confirm": "Xóa bỏ",
   "confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?",
   "confirmations.discard_edit_media.confirm": "Bỏ qua",
@@ -147,6 +149,7 @@
   "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.",
   "embed.preview": "Nó sẽ hiển thị như vầy:",
   "emoji_button.activity": "Hoạt động",
+  "emoji_button.clear": "Xóa",
   "emoji_button.custom": "Độc đáo",
   "emoji_button.flags": "Cờ",
   "emoji_button.food": "Ăn uống",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "Bạn chưa chặn bất cứ ai.",
   "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.",
   "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!",
-  "empty_column.conversations": "Khi bạn gửi hoặc nhận một tút chỉ hiển thị với những người được nhắc đến trong đó, tút đó sẽ hiển thị ở đây.",
+  "empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.",
   "empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.",
   "empty_column.explore_statuses": "Chưa có xu hướng nào. Kiểm tra lại sau!",
   "empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "đăng lại",
   "keyboard_shortcuts.column": "mở các mục",
   "keyboard_shortcuts.compose": "mở khung soạn tút",
-  "keyboard_shortcuts.conversations": "mở mục thảo luận",
   "keyboard_shortcuts.description": "Mô tả",
+  "keyboard_shortcuts.direct": "để mở cột tin nhắn",
   "keyboard_shortcuts.down": "di chuyển xuống dưới danh sách",
   "keyboard_shortcuts.enter": "viết tút mới",
   "keyboard_shortcuts.favourite": "thích",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Phóng to hình",
   "lightbox.next": "Tiếp",
   "lightbox.previous": "Trước",
+  "limited_account_hint.action": "Vẫn cứ xem",
+  "limited_account_hint.title": "Người này bị ẩn bởi kiểm duyệt viên máy chủ.",
   "lists.account.add": "Thêm vào danh sách",
   "lists.account.remove": "Xóa khỏi danh sách",
   "lists.delete": "Xóa danh sách",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Đã lưu",
   "navigation_bar.community_timeline": "Cộng đồng",
   "navigation_bar.compose": "Viết tút mới",
+  "navigation_bar.direct": "Tin nhắn",
   "navigation_bar.discover": "Khám phá",
   "navigation_bar.domain_blocks": "Máy chủ đã ẩn",
   "navigation_bar.edit_profile": "Sửa hồ sơ",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "Hủy cuộc bình chọn",
   "privacy.change": "Thay đổi quyền riêng tư",
   "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
-  "privacy.direct.short": "Chỉ người tôi nhắc đến",
+  "privacy.direct.short": "Chỉ người được nhắc",
   "privacy.private.long": "Dành riêng cho người theo dõi",
   "privacy.private.short": "Chỉ người theo dõi",
   "privacy.public.long": "Hiển thị với mọi người",
diff --git a/app/javascript/mastodon/locales/whitelist_en-GB.json b/app/javascript/mastodon/locales/whitelist_en-GB.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_en-GB.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index a6ddaab09..02b0ed563 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -70,7 +70,7 @@
   "column.blocks": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⴳⴷⵍⵏⵉⵏ",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
   "column.favourites": "ⵜⵓⴼⵓⵜⵉⵏ",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "ⵖⴰⵙ ⴰⴷⵖⴰⵔⴰⵏ",
   "community.column_settings.media_only": "ⵖⴰⵙ ⵉⵙⵏⵖⵎⵉⵙⵏ",
   "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
@@ -147,6 +149,7 @@
   "embed.instructions": "Embed this status on your website by copying the code below.",
   "embed.preview": "Here is what it will look like:",
   "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "ⵉⵛⵏⵢⴰⵍⵏ",
   "emoji_button.food": "ⵓⵜⵛⵉ & ⵜⵉⵙⵙⵉ",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots 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.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages 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 toots yet. When you favourite one, it will show up here.",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ",
   "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ",
   "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 0195dee2e..d4b7db72a 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -24,19 +24,19 @@
   "account.follows_you": "关注了你",
   "account.hide_reblogs": "隐藏来自 @{name} 的转贴",
   "account.joined": "加入于 {date}",
-  "account.link_verified_on": "此链接的所有权已在 {date} 被检查",
-  "account.locked_info": "此账户已锁嘟。账户所有者会手动审核关注申请。",
+  "account.link_verified_on": "此链接的所有权已在 {date} 检查",
+  "account.locked_info": "此账户已锁嘟。账户所有者会手动审核关注者。",
   "account.media": "媒体",
   "account.mention": "提及 @{name}",
   "account.moved_to": "{name} 已经迁移到:",
   "account.mute": "隐藏 @{name}",
   "account.mute_notifications": "隐藏来自 @{name} 的通知",
   "account.muted": "已隐藏",
-  "account.posts": "帖子",
-  "account.posts_with_replies": "帖子和回复",
+  "account.posts": "嘟文",
+  "account.posts_with_replies": "嘟文和回复",
   "account.report": "举报 @{name}",
-  "account.requested": "正在等待对方通过关注申请。点击以取消发送关注申请",
-  "account.share": "分享 @{name} 的用户简介",
+  "account.requested": "正在等待对方同意。点击以取消发送关注请求",
+  "account.share": "分享 @{name} 的个人资料页",
   "account.show_reblogs": "显示来自 @{name} 的转嘟",
   "account.statuses_counter": "{counter} 条嘟文",
   "account.unblock": "取消屏蔽 @{name}",
@@ -46,7 +46,7 @@
   "account.unfollow": "取消关注",
   "account.unmute": "不再隐藏 @{name}",
   "account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
-  "account.unmute_short": "取消静音",
+  "account.unmute_short": "恢复消息提醒",
   "account_note.placeholder": "点击添加备注",
   "admin.dashboard.daily_retention": "注册后用户留存率(按日计算)",
   "admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)",
@@ -68,19 +68,19 @@
   "bundle_modal_error.message": "载入这个组件时发生了错误。",
   "bundle_modal_error.retry": "重试",
   "column.blocks": "已屏蔽的用户",
-  "column.bookmarks": "收藏夹",
+  "column.bookmarks": "书签",
   "column.community": "本站时间轴",
-  "column.conversations": "会话",
+  "column.direct": "私信",
   "column.directory": "浏览用户资料",
   "column.domain_blocks": "已屏蔽的域名",
   "column.favourites": "喜欢",
-  "column.follow_requests": "关注申请",
+  "column.follow_requests": "关注请求",
   "column.home": "主页",
   "column.lists": "列表",
   "column.mutes": "已隐藏的用户",
   "column.notifications": "通知",
-  "column.pins": "置顶帖子",
-  "column.public": "跨站时间轴",
+  "column.pins": "置顶嘟文",
+  "column.public": "跨站公共时间轴",
   "column_back_button.label": "返回",
   "column_header.hide_settings": "隐藏设置",
   "column_header.moveLeft_settings": "将此栏左移",
@@ -89,14 +89,16 @@
   "column_header.show_settings": "显示设置",
   "column_header.unpin": "取消置顶",
   "column_subheading.settings": "设置",
-  "community.column_settings.local_only": "仅在本站显示",
+  "community.column_settings.local_only": "仅限本站",
   "community.column_settings.media_only": "仅限媒体",
   "community.column_settings.remote_only": "仅限外部",
-  "compose_form.direct_message_warning_learn_more": "了解更多",
+  "compose.language.change": "更改语言",
+  "compose.language.search": "搜索语言...",
+  "compose_form.direct_message_warning_learn_more": "了解详情",
   "compose_form.encryption_warning": "Mastodon 上的嘟文并未端到端加密。请不要在 Mastodon 上分享敏感信息。",
-  "compose_form.hashtag_warning": "此帖子被设置为“不公开”,因此它不会出现在任何话题标签的列表下。只有公开帖子才能通过话题标签进行搜索。",
-  "compose_form.lock_disclaimer": "你的账号没有{locked}。任何人在关注你后都能立即查看仅关注者可见的帖子。",
-  "compose_form.lock_disclaimer.lock": "锁嘟",
+  "compose_form.hashtag_warning": "这条嘟文被设置为“不公开”,因此它不会出现在任何话题标签的列表下。只有公开的嘟文才能通过话题标签进行搜索。",
+  "compose_form.lock_disclaimer": "你的帐户没有{locked}。任何人都可以在关注你后立即查看仅关注者可见的嘟文。",
+  "compose_form.lock_disclaimer.lock": "开启保护",
   "compose_form.placeholder": "在想些什么?",
   "compose_form.poll.add_option": "添加一个选项",
   "compose_form.poll.duration": "投票持续时间",
@@ -107,46 +109,47 @@
   "compose_form.publish": "嘟嘟",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "保存更改",
-  "compose_form.sensitive.hide": "将媒体标记为敏感内容",
-  "compose_form.sensitive.marked": "媒体已被标记为敏感内容",
+  "compose_form.sensitive.hide": "{count, plural, one {将媒体标记为敏感内容} other {将媒体标记为敏感内容}}",
+  "compose_form.sensitive.marked": "{count, plural, one {媒体已被标记为敏感内容} other {媒体已被标记为敏感内容}}",
   "compose_form.sensitive.unmarked": "媒体未被标记为敏感内容",
   "compose_form.spoiler.marked": "移除内容警告",
   "compose_form.spoiler.unmarked": "添加内容警告",
-  "compose_form.spoiler_placeholder": "在此处写下内容警告",
+  "compose_form.spoiler_placeholder": "写下你的警告",
   "confirmation_modal.cancel": "取消",
   "confirmations.block.block_and_report": "屏蔽与举报",
   "confirmations.block.confirm": "屏蔽",
   "confirmations.block.message": "你确定要屏蔽 {name} 吗?",
   "confirmations.delete.confirm": "删除",
-  "confirmations.delete.message": "你确定要删除这个帖子吗?",
+  "confirmations.delete.message": "你确定要删除这条嘟文吗?",
   "confirmations.delete_list.confirm": "删除",
   "confirmations.delete_list.message": "你确定要永久删除此列表吗?",
   "confirmations.discard_edit_media.confirm": "丢弃",
-  "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然要丢弃它们吗?",
-  "confirmations.domain_block.confirm": "隐藏所有来自此域名的内容",
-  "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该域名的内容将不再出现在你的公共时间轴或通知列表里。来自该域名的关注者将会被移除。",
+  "confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然丢弃它们吗?",
+  "confirmations.domain_block.confirm": "屏蔽整个域名",
+  "confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。",
   "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.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。",
   "confirmations.reply.confirm": "回复",
-  "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。仍要继续吗?",
+  "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?",
   "confirmations.unfollow.confirm": "取消关注",
   "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
   "conversation.delete": "删除对话",
   "conversation.mark_as_read": "标记为已读",
   "conversation.open": "查看对话",
   "conversation.with": "与 {names}",
-  "directory.federated": "来自联邦宇宙的已知部分",
+  "directory.federated": "来自已知联邦宇宙",
   "directory.local": "仅来自 {domain}",
-  "directory.new_arrivals": "新用户",
+  "directory.new_arrivals": "新来者",
   "directory.recently_active": "最近活跃",
-  "embed.instructions": "要在你的网站上嵌入此嘟文,请复制以下代码。",
+  "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。",
   "embed.preview": "它会像这样显示出来:",
   "emoji_button.activity": "活动",
+  "emoji_button.clear": "清除",
   "emoji_button.custom": "自定义",
   "emoji_button.flags": "旗帜",
   "emoji_button.food": "食物和饮料",
@@ -156,31 +159,31 @@
   "emoji_button.objects": "物体",
   "emoji_button.people": "人物",
   "emoji_button.recent": "常用",
-  "emoji_button.search": "搜索……",
+  "emoji_button.search": "搜索…",
   "emoji_button.search_results": "搜索结果",
   "emoji_button.symbols": "符号",
   "emoji_button.travel": "旅行和地点",
   "empty_column.account_suspended": "账户已停用",
-  "empty_column.account_timeline": "这里没有帖子!",
-  "empty_column.account_unavailable": "用户资料不可用",
+  "empty_column.account_timeline": "这里没有嘟文!",
+  "empty_column.account_unavailable": "个人资料不可用",
   "empty_column.blocks": "你还未屏蔽任何用户。",
-  "empty_column.bookmarked_statuses": "你还未将任何帖子加入收藏夹。在你加入收藏夹后,帖子将显示在此。",
+  "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加过书签。在你添加书签后,嘟文就会显示在这里。",
   "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!",
-  "empty_column.conversations": "发送或收到仅对提及对象可见的嘟文后,就会显示在这里。",
-  "empty_column.domain_blocks": "目前没有被隐藏的站点。",
+  "empty_column.direct": "你还未使用过私信。当你发出或者收到私信时,它将显示在此。",
+  "empty_column.domain_blocks": "暂且没有被屏蔽的站点。",
   "empty_column.explore_statuses": "目前没有热门话题,稍后再来看看吧!",
-  "empty_column.favourited_statuses": "你还未喜欢过任何帖子。当你喜欢帖子时,它将显示在此。",
+  "empty_column.favourited_statuses": "你还没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
   "empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
   "empty_column.follow_recommendations": "似乎无法为你生成任何建议。你可以尝试使用搜索寻找你可能知道的人或探索热门标签。",
-  "empty_column.follow_requests": "你没有收到新的关注申请。收到后将显示在此。",
+  "empty_column.follow_requests": "你没有收到新的关注请求。收到后将显示在此。",
   "empty_column.hashtag": "这个话题标签下暂时没有内容。",
   "empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}",
   "empty_column.home.suggestions": "查看一些建议",
-  "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会显示在这里。",
-  "empty_column.lists": "你还没有创建过列表。你创建的列表会显示在这里。",
+  "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的新嘟文将会在这里显示。",
+  "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。",
   "empty_column.mutes": "你没有隐藏任何用户。",
   "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
-  "empty_column.public": "这里什么都没有!写一些公开帖子,或者关注来自其他服务器的用户后,这里就会有嘟文出现了",
+  "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
   "error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
   "error.unexpected_crash.explanation_addons": "此页面无法正确显示,这个错误很可能是由浏览器附加组件或自动翻译工具造成的。",
   "error.unexpected_crash.next_steps": "刷新一下页面试试。如果没用,你可以换个浏览器或者用本地应用。",
@@ -190,15 +193,15 @@
   "explore.search_results": "搜索结果",
   "explore.suggested_follows": "为你推荐",
   "explore.title": "探索",
-  "explore.trending_links": "新闻",
-  "explore.trending_statuses": "帖子",
+  "explore.trending_links": "最新消息",
+  "explore.trending_statuses": "嘟文",
   "explore.trending_tags": "话题标签",
   "follow_recommendations.done": "完成",
   "follow_recommendations.heading": "关注你感兴趣的用户!这里有一些推荐。",
-  "follow_recommendations.lead": "你关注的人的帖子将按时间顺序显示在你的主页。 别担心,你可以随时取消关注!",
+  "follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你可以随时取消关注!",
   "follow_request.authorize": "授权",
   "follow_request.reject": "拒绝",
-  "follow_requests.unlocked_explanation": "虽然你没有锁嘟,但是 {domain} 的管理人员觉得你可能想人工审核这些账号的关注申请。",
+  "follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的工作人员认为你也许会想手动审核审核这些账号的关注请求。",
   "generic.saved": "已保存",
   "getting_started.developers": "开发",
   "getting_started.directory": "用户目录",
@@ -212,7 +215,7 @@
   "hashtag.column_header.tag_mode.any": "或是 {additional}",
   "hashtag.column_header.tag_mode.none": "而不用 {additional}",
   "hashtag.column_settings.select.no_options_message": "没有找到建议",
-  "hashtag.column_settings.select.placeholder": "输入话题标签……",
+  "hashtag.column_settings.select.placeholder": "输入话题标签…",
   "hashtag.column_settings.tag_mode.all": "全部",
   "hashtag.column_settings.tag_mode.any": "任一",
   "hashtag.column_settings.tag_mode.none": "无一",
@@ -226,37 +229,37 @@
   "intervals.full.hours": "{number} 小时",
   "intervals.full.minutes": "{number} 分钟",
   "keyboard_shortcuts.back": "返回上一页",
-  "keyboard_shortcuts.blocked": "打开已屏蔽用户列表",
+  "keyboard_shortcuts.blocked": "打开被屏蔽用户列表",
   "keyboard_shortcuts.boost": "转嘟",
   "keyboard_shortcuts.column": "选择某栏",
   "keyboard_shortcuts.compose": "选择输入框",
-  "keyboard_shortcuts.conversations": "打开对话栏",
   "keyboard_shortcuts.description": "说明",
+  "keyboard_shortcuts.direct": "打开私信栏",
   "keyboard_shortcuts.down": "在列表中让光标下移",
-  "keyboard_shortcuts.enter": "展开帖子",
-  "keyboard_shortcuts.favourite": "喜欢帖子",
-  "keyboard_shortcuts.favourites": "打开喜欢的帖子列表",
+  "keyboard_shortcuts.enter": "展开嘟文",
+  "keyboard_shortcuts.favourite": "喜欢嘟文",
+  "keyboard_shortcuts.favourites": "打开喜欢的嘟文列表",
   "keyboard_shortcuts.federated": "打开跨站时间轴",
   "keyboard_shortcuts.heading": "快捷键列表",
   "keyboard_shortcuts.home": "打开主页时间轴",
   "keyboard_shortcuts.hotkey": "快捷键",
   "keyboard_shortcuts.legend": "显示此列表",
   "keyboard_shortcuts.local": "打开本站时间轴",
-  "keyboard_shortcuts.mention": "提及作者",
-  "keyboard_shortcuts.muted": "打开已隐藏用户列表",
+  "keyboard_shortcuts.mention": "提及嘟文作者",
+  "keyboard_shortcuts.muted": "打开已静音的用户列表",
   "keyboard_shortcuts.my_profile": "打开你的个人资料",
   "keyboard_shortcuts.notifications": "打开通知栏",
   "keyboard_shortcuts.open_media": "打开媒体",
-  "keyboard_shortcuts.pinned": "打开置顶帖子列表",
+  "keyboard_shortcuts.pinned": "打开置顶嘟文列表",
   "keyboard_shortcuts.profile": "打开作者的个人资料",
-  "keyboard_shortcuts.reply": "回复帖子",
-  "keyboard_shortcuts.requests": "打开关注申请列表",
+  "keyboard_shortcuts.reply": "回复嘟文",
+  "keyboard_shortcuts.requests": "打开关注请求列表",
   "keyboard_shortcuts.search": "选择搜索框",
   "keyboard_shortcuts.spoilers": "显示或隐藏被折叠的正文",
   "keyboard_shortcuts.start": "打开“开始使用”栏",
   "keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文",
   "keyboard_shortcuts.toggle_sensitivity": "显示/隐藏媒体",
-  "keyboard_shortcuts.toot": "发布新帖子",
+  "keyboard_shortcuts.toot": "发送新嘟文",
   "keyboard_shortcuts.unfocus": "取消输入/搜索",
   "keyboard_shortcuts.up": "在列表中让光标上移",
   "lightbox.close": "关闭",
@@ -264,6 +267,8 @@
   "lightbox.expand": "放大查看图片",
   "lightbox.next": "下一个",
   "lightbox.previous": "上一个",
+  "limited_account_hint.action": "仍然显示个人资料",
+  "limited_account_hint.title": "此个人资料已被服务器监察员隐藏。",
   "lists.account.add": "添加到列表",
   "lists.account.remove": "从列表中移除",
   "lists.delete": "删除列表",
@@ -283,41 +288,42 @@
   "missing_indicator.label": "找不到内容",
   "missing_indicator.sublabel": "无法找到此资源",
   "mute_modal.duration": "持续时长",
-  "mute_modal.hide_notifications": "是否同时隐藏来自这个用户的通知?",
+  "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?",
   "mute_modal.indefinite": "无期限",
   "navigation_bar.apps": "移动应用",
   "navigation_bar.blocks": "已屏蔽的用户",
-  "navigation_bar.bookmarks": "收藏夹",
+  "navigation_bar.bookmarks": "书签",
   "navigation_bar.community_timeline": "本站时间轴",
-  "navigation_bar.compose": "撰写新帖子",
+  "navigation_bar.compose": "撰写新嘟文",
+  "navigation_bar.direct": "私信",
   "navigation_bar.discover": "发现",
   "navigation_bar.domain_blocks": "已屏蔽的域名",
   "navigation_bar.edit_profile": "修改个人资料",
   "navigation_bar.explore": "探索",
   "navigation_bar.favourites": "喜欢",
   "navigation_bar.filters": "隐藏关键词",
-  "navigation_bar.follow_requests": "关注申请",
+  "navigation_bar.follow_requests": "关注请求",
   "navigation_bar.follows_and_followers": "关注管理",
-  "navigation_bar.info": "关于此服务",
+  "navigation_bar.info": "关于本站",
   "navigation_bar.keyboard_shortcuts": "快捷键列表",
   "navigation_bar.lists": "列表",
   "navigation_bar.logout": "登出",
   "navigation_bar.mutes": "已隐藏的用户",
   "navigation_bar.personal": "个人",
-  "navigation_bar.pins": "置顶帖子",
-  "navigation_bar.preferences": "偏好",
-  "navigation_bar.public_timeline": "跨站时间轴",
+  "navigation_bar.pins": "置顶嘟文",
+  "navigation_bar.preferences": "首选项",
+  "navigation_bar.public_timeline": "跨站公共时间轴",
   "navigation_bar.security": "安全",
-  "notification.admin.sign_up": "{name} 已被注册",
-  "notification.favourite": "{name} 喜欢了你的帖子",
+  "notification.admin.sign_up": "{name} 注册了",
+  "notification.favourite": "{name} 喜欢了你的嘟文",
   "notification.follow": "{name} 开始关注你",
   "notification.follow_request": "{name} 向你发送了关注请求",
   "notification.mention": "{name} 提及了你",
   "notification.own_poll": "你的投票已经结束",
   "notification.poll": "你参与的一个投票已经结束",
-  "notification.reblog": "{name} 转发了你的帖子",
-  "notification.status": "{name} 刚刚发帖",
-  "notification.update": "{name} 编辑了帖子",
+  "notification.reblog": "{name} 转嘟了你的嘟文",
+  "notification.status": "{name} 刚刚发嘟",
+  "notification.update": "{name} 编辑了嘟文",
   "notifications.clear": "清空通知列表",
   "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
   "notifications.column_settings.admin.sign_up": "新注册:",
@@ -327,19 +333,19 @@
   "notifications.column_settings.filter_bar.category": "快速过滤栏",
   "notifications.column_settings.filter_bar.show_bar": "显示过滤栏",
   "notifications.column_settings.follow": "新关注者:",
-  "notifications.column_settings.follow_request": "新关注申请:",
+  "notifications.column_settings.follow_request": "新关注请求:",
   "notifications.column_settings.mention": "提及:",
   "notifications.column_settings.poll": "投票结果:",
   "notifications.column_settings.push": "推送通知",
-  "notifications.column_settings.reblog": "转发:",
+  "notifications.column_settings.reblog": "转嘟:",
   "notifications.column_settings.show": "在通知栏显示",
   "notifications.column_settings.sound": "播放音效",
-  "notifications.column_settings.status": "新帖:",
+  "notifications.column_settings.status": "新嘟文:",
   "notifications.column_settings.unread_notifications.category": "未读通知",
   "notifications.column_settings.unread_notifications.highlight": "高亮显示未读通知",
   "notifications.column_settings.update": "编辑:",
   "notifications.filter.all": "全部",
-  "notifications.filter.boosts": "转发",
+  "notifications.filter.boosts": "转嘟",
   "notifications.filter.favourites": "喜欢",
   "notifications.filter.follows": "关注",
   "notifications.filter.mentions": "提及",
@@ -348,9 +354,9 @@
   "notifications.grant_permission": "授予权限",
   "notifications.group": "{count} 条通知",
   "notifications.mark_as_read": "将所有通知标为已读",
-  "notifications.permission_denied": "由于权限不可用,无法启用桌面通知。",
+  "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。",
   "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败",
-  "notifications.permission_required": "未授予所需权限,所以桌面通知不可用",
+  "notifications.permission_required": "所需权限未被授予,所以桌面通知不可用",
   "notifications_permission_banner.enable": "启用桌面通知",
   "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。你可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。",
   "notifications_permission_banner.title": "精彩不容错过",
@@ -364,15 +370,15 @@
   "poll.votes": "{votes, plural, one {# 票} other {# 票}}",
   "poll_button.add_poll": "发起投票",
   "poll_button.remove_poll": "移除投票",
-  "privacy.change": "设置帖子的可见范围",
+  "privacy.change": "设置嘟文的可见范围",
   "privacy.direct.long": "只有被提及的用户能看到",
-  "privacy.direct.short": "仅对提及的人可见",
+  "privacy.direct.short": "仅提到的人",
   "privacy.private.long": "仅关注者可见",
   "privacy.private.short": "仅对关注者可见",
   "privacy.public.long": "所有人可见",
   "privacy.public.short": "公开",
   "privacy.unlisted.long": "对所有人可见,但不加入探索功能",
-  "privacy.unlisted.short": "非公开",
+  "privacy.unlisted.short": "不公开",
   "refresh": "刷新",
   "regeneration_indicator.label": "加载中……",
   "regeneration_indicator.sublabel": "你的主页动态正在准备中!",
@@ -389,20 +395,20 @@
   "relative_time.today": "今天",
   "reply_indicator.cancel": "取消",
   "report.block": "屏蔽",
-  "report.block_explanation": "你将看不到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断他们被屏蔽了。",
+  "report.block_explanation": "你将无法看到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断出他们被屏蔽了。",
   "report.categories.other": "其他",
   "report.categories.spam": "垃圾信息",
   "report.categories.violation": "内容违反一条或多条服务器规则",
   "report.category.subtitle": "选择最佳匹配",
   "report.category.title": "告诉我们这个 {type} 的情况",
   "report.category.title_account": "个人资料",
-  "report.category.title_status": "帖子",
+  "report.category.title_status": "嘟文",
   "report.close": "完成",
   "report.comment.title": "还有什么你认为我们应该知道的吗?",
   "report.forward": "转发举报至 {target}",
   "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?",
-  "report.mute": "静音",
-  "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的帖子,但他们不会知道他们被静音了。",
+  "report.mute": "隐藏",
+  "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的嘟文,但他们不会知道你忽略了来自他们的信息。",
   "report.next": "下一步",
   "report.placeholder": "备注",
   "report.reasons.dislike": "我不喜欢它",
@@ -429,14 +435,14 @@
   "search_popout.search_format": "高级搜索格式",
   "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的帖子,以及其他用户公开的用户名、昵称和话题标签。",
   "search_popout.tips.hashtag": "话题标签",
-  "search_popout.tips.status": "帖子",
+  "search_popout.tips.status": "嘟文",
   "search_popout.tips.text": "输入关键词检索昵称、用户名和话题标签",
   "search_popout.tips.user": "用户",
   "search_results.accounts": "用户",
   "search_results.all": "全部",
   "search_results.hashtags": "话题标签",
   "search_results.nothing_found": "无法找到符合这些搜索词的任何内容",
-  "search_results.statuses": "帖子",
+  "search_results.statuses": "嘟文",
   "search_results.statuses_fts_disabled": "此 Mastodon 服务器未启用帖子内容搜索。",
   "search_results.total": "共 {count, number} 个结果",
   "status.admin_account": "打开 @{name} 的管理界面",
@@ -444,8 +450,8 @@
   "status.block": "屏蔽 @{name}",
   "status.bookmark": "添加到书签",
   "status.cancel_reblog_private": "取消转贴",
-  "status.cannot_reblog": "此贴不允许被转贴",
-  "status.copy": "复制帖子链接",
+  "status.cannot_reblog": "这条嘟文不允许被转嘟",
+  "status.copy": "复制嘟文链接",
   "status.delete": "删除",
   "status.detailed_status": "详细的对话视图",
   "status.direct": "私信 @{name}",
@@ -462,15 +468,15 @@
   "status.mention": "提及 @{name}",
   "status.more": "更多",
   "status.mute": "隐藏 @{name}",
-  "status.mute_conversation": "将此对话静音",
-  "status.open": "展开此贴",
+  "status.mute_conversation": "禁用此对话的消息提醒",
+  "status.open": "展开嘟文",
   "status.pin": "在个人资料页面置顶",
-  "status.pinned": "置顶帖子",
+  "status.pinned": "置顶嘟文",
   "status.read_more": "查看更多",
-  "status.reblog": "转贴",
-  "status.reblog_private": "转贴(可见者不变)",
-  "status.reblogged_by": "{name} 转贴了",
-  "status.reblogs.empty": "没有人转贴过此贴。如果有人转贴了将显示在此。",
+  "status.reblog": "转嘟",
+  "status.reblog_private": "转嘟(可见者不变)",
+  "status.reblogged_by": "{name} 转嘟了",
+  "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。",
   "status.redraft": "删除并重新编辑",
   "status.remove_bookmark": "移除书签",
   "status.reply": "回复",
@@ -484,7 +490,7 @@
   "status.show_more_all": "显示全部内容",
   "status.show_thread": "显示全部对话",
   "status.uncached_media_warning": "暂不可用",
-  "status.unmute_conversation": "将此对话解除静音",
+  "status.unmute_conversation": "恢复此对话的通知提醒",
   "status.unpin": "在个人资料页面取消置顶",
   "suggestions.dismiss": "关闭建议",
   "suggestions.header": "你可能会感兴趣…",
@@ -501,7 +507,7 @@
   "timeline_hint.remote_resource_not_displayed": "不会显示来自其它服务器的 {resource}",
   "timeline_hint.resources.followers": "关注者",
   "timeline_hint.resources.follows": "关注",
-  "timeline_hint.resources.statuses": "更早的帖子",
+  "timeline_hint.resources.statuses": "更早的嘟文",
   "trends.counter_by_accounts": "{count, plural, one {{counter} 人} other {{counter} 人}}正在讨论",
   "trends.trending_now": "现在流行",
   "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会丢失。",
@@ -539,5 +545,5 @@
   "video.mute": "静音",
   "video.pause": "暂停",
   "video.play": "播放",
-  "video.unmute": "取消静音"
+  "video.unmute": "解除禁音"
 }
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 45e030833..dc0b794dd 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -70,7 +70,7 @@
   "column.blocks": "封鎖名單",
   "column.bookmarks": "書籤",
   "column.community": "本站時間軸",
-  "column.conversations": "Conversations",
+  "column.direct": "Direct messages",
   "column.directory": "瀏覽個人資料",
   "column.domain_blocks": "封鎖的服務站",
   "column.favourites": "最愛的文章",
@@ -92,6 +92,8 @@
   "community.column_settings.local_only": "只顯示本站",
   "community.column_settings.media_only": "只顯示多媒體",
   "community.column_settings.remote_only": "只顯示外站",
+  "compose.language.change": "Change language",
+  "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "了解更多",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。",
@@ -147,6 +149,7 @@
   "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。",
   "embed.preview": "看上去會是這樣:",
   "emoji_button.activity": "活動",
+  "emoji_button.clear": "Clear",
   "emoji_button.custom": "自訂",
   "emoji_button.flags": "旗幟",
   "emoji_button.food": "飲飲食食",
@@ -166,7 +169,7 @@
   "empty_column.blocks": "你還沒有封鎖任何使用者。",
   "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。",
   "empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!",
-  "empty_column.conversations": "Once you send or receive a post that's only visible to people mentioned in it, it will show up here.",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "尚未隱藏任何網域。",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "轉推",
   "keyboard_shortcuts.column": "把標示移動到其中一列",
   "keyboard_shortcuts.compose": "把標示移動到文字輸入區",
-  "keyboard_shortcuts.conversations": "to open conversations column",
   "keyboard_shortcuts.description": "描述",
+  "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "在列表往下移動",
   "keyboard_shortcuts.enter": "打開文章",
   "keyboard_shortcuts.favourite": "收藏文章",
@@ -264,6 +267,8 @@
   "lightbox.expand": "擴大檢視",
   "lightbox.next": "下一頁",
   "lightbox.previous": "上一頁",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "新增到列表",
   "lists.account.remove": "從列表刪除",
   "lists.delete": "刪除列表",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "書籤",
   "navigation_bar.community_timeline": "本站時間軸",
   "navigation_bar.compose": "撰寫新文章",
+  "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "探索",
   "navigation_bar.domain_blocks": "封鎖的服務站",
   "navigation_bar.edit_profile": "修改個人資料",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 811e998bb..17d0b9998 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -25,7 +25,7 @@
   "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
   "account.joined": "加入於 {date}",
   "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限",
-  "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳戶的人。",
+  "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳號的人。",
   "account.media": "媒體",
   "account.mention": "提及 @{name}",
   "account.moved_to": "{name} 已遷移至:",
@@ -70,7 +70,7 @@
   "column.blocks": "已封鎖的使用者",
   "column.bookmarks": "書籤",
   "column.community": "本站時間軸",
-  "column.conversations": "對話",
+  "column.direct": "私訊",
   "column.directory": "瀏覽個人檔案",
   "column.domain_blocks": "已封鎖的網域",
   "column.favourites": "最愛",
@@ -92,10 +92,12 @@
   "community.column_settings.local_only": "只有本站",
   "community.column_settings.media_only": "只有媒體",
   "community.column_settings.remote_only": "只有遠端",
+  "compose.language.change": "變更語言",
+  "compose.language.search": "搜尋語言...",
   "compose_form.direct_message_warning_learn_more": "了解更多",
   "compose_form.encryption_warning": "Mastodon 上的嘟文並未端到端加密。請不要透過 Mastodon 分享任何敏感資訊。",
   "compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不會被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤找到。",
-  "compose_form.lock_disclaimer": "您的帳戶尚未 {locked}。任何人都能關注您並看到您設定成只有跟隨者能看的嘟文。",
+  "compose_form.lock_disclaimer": "您的帳號尚未 {locked}。任何人皆能跟隨您並看到您設定成只有跟隨者能看的嘟文。",
   "compose_form.lock_disclaimer.lock": "上鎖",
   "compose_form.placeholder": "正在想些什麼嗎?",
   "compose_form.poll.add_option": "新增選項",
@@ -124,7 +126,7 @@
   "confirmations.discard_edit_media.confirm": "捨棄",
   "confirmations.discard_edit_media.message": "您在媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?",
   "confirmations.domain_block.confirm": "隱藏整個域名",
-  "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳帳戶能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。",
+  "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳號能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。",
   "confirmations.logout.confirm": "登出",
   "confirmations.logout.message": "您確定要登出嗎?",
   "confirmations.mute.confirm": "靜音",
@@ -147,6 +149,7 @@
   "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。",
   "embed.preview": "它將顯示成這樣:",
   "emoji_button.activity": "活動",
+  "emoji_button.clear": "清除",
   "emoji_button.custom": "自訂",
   "emoji_button.flags": "旗幟",
   "emoji_button.food": "食物 & 飲料",
@@ -160,13 +163,13 @@
   "emoji_button.search_results": "搜尋結果",
   "emoji_button.symbols": "符號",
   "emoji_button.travel": "旅遊與地點",
-  "empty_column.account_suspended": "帳戶被暫停",
+  "empty_column.account_suspended": "帳號被暫停",
   "empty_column.account_timeline": "這裡還沒有嘟文!",
   "empty_column.account_unavailable": "無法取得個人檔案",
   "empty_column.blocks": "您還沒有封鎖任何使用者。",
   "empty_column.bookmarked_statuses": "您還沒建立任何書籤。當您建立書簽時,它將於此顯示。",
   "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!",
-  "empty_column.conversations": "一旦您傳送或收到僅對其中提到之人可見的嘟文,就會在這邊顯示。",
+  "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
   "empty_column.domain_blocks": "尚未封鎖任何網域。",
   "empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!",
   "empty_column.favourited_statuses": "您還沒加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。",
@@ -198,7 +201,7 @@
   "follow_recommendations.lead": "來自您跟隨的人之嘟文將會按時間順序顯示在您的首頁時間軸上。不要害怕犯錯,您隨時都可以取消跟隨其他人!",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
-  "follow_requests.unlocked_explanation": "即便您的帳戶未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳戶的跟隨請求。",
+  "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳號的跟隨請求。",
   "generic.saved": "已儲存",
   "getting_started.developers": "開發者",
   "getting_started.directory": "個人檔案目錄",
@@ -206,7 +209,7 @@
   "getting_started.heading": "開始使用",
   "getting_started.invite": "邀請使用者",
   "getting_started.open_source_notice": "Mastodon 是開源軟體。您可以在 GitHub {github} 上貢獻或是回報問題。",
-  "getting_started.security": "帳戶安全性設定",
+  "getting_started.security": "帳號安全性設定",
   "getting_started.terms": "服務條款",
   "hashtag.column_header.tag_mode.all": "以及 {additional}",
   "hashtag.column_header.tag_mode.any": "或是 {additional}",
@@ -230,8 +233,8 @@
   "keyboard_shortcuts.boost": "轉嘟",
   "keyboard_shortcuts.column": "將焦點放在其中一欄的嘟文",
   "keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊",
-  "keyboard_shortcuts.conversations": "開啟對話欄",
   "keyboard_shortcuts.description": "說明",
+  "keyboard_shortcuts.direct": "開啟私訊欄",
   "keyboard_shortcuts.down": "在列表中往下移動",
   "keyboard_shortcuts.enter": "檢視嘟文",
   "keyboard_shortcuts.favourite": "加到最愛",
@@ -264,6 +267,8 @@
   "lightbox.expand": "展開圖片檢視框",
   "lightbox.next": "下一步",
   "lightbox.previous": "上一步",
+  "limited_account_hint.action": "一律顯示個人檔案",
+  "limited_account_hint.title": "此個人檔案已被您伺服器的管理員隱藏。",
   "lists.account.add": "新增至列表",
   "lists.account.remove": "從列表中移除",
   "lists.delete": "刪除列表",
@@ -290,6 +295,7 @@
   "navigation_bar.bookmarks": "書籤",
   "navigation_bar.community_timeline": "本站時間軸",
   "navigation_bar.compose": "撰寫新嘟文",
+  "navigation_bar.direct": "私訊",
   "navigation_bar.discover": "探索",
   "navigation_bar.domain_blocks": "隱藏的網域",
   "navigation_bar.edit_profile": "編輯個人檔案",
@@ -366,7 +372,7 @@
   "poll_button.remove_poll": "移除投票",
   "privacy.change": "調整嘟文隱私狀態",
   "privacy.direct.long": "只有被提及的使用者能看到",
-  "privacy.direct.short": "僅限於我提及的人",
+  "privacy.direct.short": "僅限提及的人",
   "privacy.private.long": "只有跟隨您的使用者能看到",
   "privacy.private.short": "僅限跟隨者",
   "privacy.public.long": "對所有人可見",
@@ -400,7 +406,7 @@
   "report.close": "已完成",
   "report.comment.title": "有什麼其他您想讓我們知道的嗎?",
   "report.forward": "轉寄到 {target}",
-  "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?",
+  "report.forward_hint": "這個帳號屬於其他伺服器。要向該伺服器發送匿名的檢舉訊息嗎?",
   "report.mute": "靜音",
   "report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及察看您的嘟文,並且不會知道他們已被靜音。",
   "report.next": "繼續",
@@ -427,10 +433,10 @@
   "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁時間軸再見到他們的嘟文,請取消跟隨。",
   "search.placeholder": "搜尋",
   "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": "全部",
diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js
index 530ed8e60..b5589668c 100644
--- a/app/javascript/mastodon/reducers/accounts.js
+++ b/app/javascript/mastodon/reducers/accounts.js
@@ -1,4 +1,5 @@
-import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
+import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'mastodon/actions/importer';
+import { ACCOUNT_REVEAL } from 'mastodon/actions/accounts';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
 const initialState = ImmutableMap();
@@ -10,6 +11,8 @@ const normalizeAccount = (state, account) => {
   delete account.following_count;
   delete account.statuses_count;
 
+  account.hidden = state.getIn([account.id, 'hidden']) === false ? false : account.limited;
+
   return state.set(account.id, fromJS(account));
 };
 
@@ -27,6 +30,8 @@ export default function accounts(state = initialState, action) {
     return normalizeAccount(state, action.account);
   case ACCOUNTS_IMPORT:
     return normalizeAccounts(state, action.accounts);
+  case ACCOUNT_REVEAL:
+    return state.setIn([action.id, 'hidden'], false);
   default:
     return state;
   }
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index ea882a71f..d7478c33d 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -28,6 +28,7 @@ import {
   COMPOSE_SPOILERNESS_CHANGE,
   COMPOSE_SPOILER_TEXT_CHANGE,
   COMPOSE_VISIBILITY_CHANGE,
+  COMPOSE_LANGUAGE_CHANGE,
   COMPOSE_COMPOSING_CHANGE,
   COMPOSE_EMOJI_INSERT,
   COMPOSE_UPLOAD_CHANGE_REQUEST,
@@ -79,6 +80,7 @@ const initialState = ImmutableMap({
   suggestions: ImmutableList(),
   default_privacy: 'public',
   default_sensitive: false,
+  default_language: 'en',
   resetFileKey: Math.floor((Math.random() * 0x10000)),
   idempotencyKey: null,
   tagHistory: ImmutableList(),
@@ -117,7 +119,8 @@ function clearAll(state) {
     map.set('is_changing_upload', false);
     map.set('in_reply_to', null);
     map.set('privacy', state.get('default_privacy'));
-    map.set('sensitive', false);
+    map.set('sensitive', state.get('default_sensitive'));
+    map.set('language', state.get('default_language'));
     map.update('media_attachments', list => list.clear());
     map.set('poll', null);
     map.set('idempotencyKey', uuid());
@@ -440,6 +443,7 @@ export default function compose(state = initialState, action) {
       map.set('caretPosition', null);
       map.set('idempotencyKey', uuid());
       map.set('sensitive', action.status.get('sensitive'));
+      map.set('language', action.status.get('language'));
 
       if (action.status.get('spoiler_text').length > 0) {
         map.set('spoiler', true);
@@ -468,6 +472,7 @@ export default function compose(state = initialState, action) {
       map.set('caretPosition', null);
       map.set('idempotencyKey', uuid());
       map.set('sensitive', action.status.get('sensitive'));
+      map.set('language', action.status.get('language'));
 
       if (action.spoiler_text.length > 0) {
         map.set('spoiler', true);
@@ -497,6 +502,8 @@ export default function compose(state = initialState, action) {
     return state.updateIn(['poll', 'options'], options => options.delete(action.index));
   case COMPOSE_POLL_SETTINGS_CHANGE:
     return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple));
+  case COMPOSE_LANGUAGE_CHANGE:
+    return state.set('language', action.language);
   default:
     return state;
   }
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 39639f3dc..afffce917 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -3,6 +3,7 @@ import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications';
 import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
 import { STORE_HYDRATE } from '../actions/store';
 import { EMOJI_USE } from '../actions/emojis';
+import { LANGUAGE_USE } from '../actions/languages';
 import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 import uuid from '../uuid';
@@ -129,6 +130,8 @@ const changeColumnParams = (state, uuid, path, value) => {
 
 const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false);
 
+const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false);
+
 const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
 
 export default function settings(state = initialState, action) {
@@ -154,6 +157,8 @@ export default function settings(state = initialState, action) {
     return changeColumnParams(state, action.uuid, action.path, action.value);
   case EMOJI_USE:
     return updateFrequentEmojis(state, action.emoji);
+  case LANGUAGE_USE:
+    return updateFrequentLanguages(state, action.language);
   case SETTING_SAVE:
     return state.set('saved', true);
   case LIST_FETCH_FAIL:
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index 1e19db65d..3121774b3 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -175,3 +175,11 @@ export const getAccountGallery = createSelector([
 
   return medias;
 });
+
+export const getAccountHidden = createSelector([
+  (state, id) => state.getIn(['accounts', id, 'hidden']),
+  (state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']),
+  (state, id) => id === me,
+], (hidden, followingOrRequested, isSelf) => {
+  return hidden && !(isSelf || followingOrRequested);
+});
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index ed49333b9..c56338e23 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -330,6 +330,7 @@ html {
 .actions-modal ul li:not(:empty) a:focus button,
 .actions-modal ul li:not(:empty) a:hover,
 .actions-modal ul li:not(:empty) a:hover button,
+.language-dropdown__dropdown__results__item.active,
 .admin-wrapper .sidebar ul .simple-navigation-active-leaf a,
 .simple_form .block-button,
 .simple_form .button,
@@ -337,6 +338,14 @@ html {
   color: $white;
 }
 
+.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
+  color: lighten($ui-base-color, 8%);
+}
+
+.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
+  color: darken($ui-base-color, 12%);
+}
+
 .dropdown-menu__separator,
 .dropdown-menu__item.edited-timestamp__history__item,
 .dropdown-menu__container__header,
@@ -371,12 +380,13 @@ html {
   border: 1px solid lighten($ui-base-color, 8%);
 }
 
-.reactions-bar__item {
-  &:hover,
-  &:focus,
-  &:active {
-    background-color: $ui-base-color;
-  }
+.reactions-bar__item:hover,
+.reactions-bar__item:focus,
+.reactions-bar__item:active,
+.language-dropdown__dropdown__results__item:hover,
+.language-dropdown__dropdown__results__item:focus,
+.language-dropdown__dropdown__results__item:active {
+  background-color: $ui-base-color;
 }
 
 .reactions-bar__item.active {
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 694f5e928..71d6653d0 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -2469,6 +2469,10 @@ a.account__display-name {
   .columns-area__panels__pane--compositional {
     display: none;
   }
+
+  .with-fab .scrollable .item-list:last-child {
+    padding-bottom: 5.25rem;
+  }
 }
 
 @media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {
@@ -4033,6 +4037,15 @@ a.status-card.compact:hover {
   vertical-align: middle;
 }
 
+.limited-account-hint {
+  p {
+    color: $secondary-text-color;
+    font-size: 15px;
+    font-weight: 500;
+    margin-bottom: 20px;
+  }
+}
+
 .empty-column-indicator,
 .error-column,
 .follow_requests-unlocked_explanation {
@@ -4336,7 +4349,6 @@ a.status-card.compact:hover {
   background: $simple-background-color;
   box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
   border-radius: 4px;
-  margin-left: 40px;
   overflow: hidden;
   z-index: 2;
 
@@ -4437,6 +4449,71 @@ a.status-card.compact:hover {
   }
 }
 
+.language-dropdown {
+  &__dropdown {
+    position: absolute;
+    background: $simple-background-color;
+    box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
+    border-radius: 4px;
+    overflow: hidden;
+    z-index: 2;
+
+    &.top {
+      transform-origin: 50% 100%;
+    }
+
+    &.bottom {
+      transform-origin: 50% 0;
+    }
+
+    .emoji-mart-search {
+      padding-right: 10px;
+    }
+
+    .emoji-mart-search-icon {
+      right: 10px + 5px;
+    }
+
+    .emoji-mart-scroll {
+      padding: 0 10px 10px;
+    }
+
+    &__results {
+      &__item {
+        cursor: pointer;
+        color: $inverted-text-color;
+        font-weight: 500;
+        padding: 10px;
+        border-radius: 4px;
+
+        &:focus,
+        &:active,
+        &:hover {
+          background: $ui-secondary-color;
+        }
+
+        &__common-name {
+          color: $darker-text-color;
+        }
+
+        &.active {
+          background: $ui-highlight-color;
+          color: $primary-text-color;
+          outline: 0;
+
+          .language-dropdown__dropdown__results__item__common-name {
+            color: $secondary-text-color;
+          }
+
+          &:hover {
+            background: lighten($ui-highlight-color, 4%);
+          }
+        }
+      }
+    }
+  }
+}
+
 .search {
   position: relative;
 }
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 3c51a7a51..7ff06ea39 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -3,6 +3,7 @@
 class ActivityPub::Activity
   include JsonLdHelper
   include Redisable
+  include Lockable
 
   SUPPORTED_TYPES = %w(Note Question).freeze
   CONVERTED_TYPES = %w(Image Audio Video Article Page Event).freeze
@@ -157,22 +158,6 @@ class ActivityPub::Activity
     end
   end
 
-  def lock_or_return(key, expire_after = 2.hours.seconds)
-    yield if redis.set(key, true, nx: true, ex: expire_after)
-  ensure
-    redis.del(key)
-  end
-
-  def lock_or_fail(key, expire_after = 15.minutes.seconds)
-    RedisLock.acquire({ redis: redis, key: key, autorelease: expire_after }) do |lock|
-      if lock.acquired?
-        yield
-      else
-        raise Mastodon::RaceConditionError
-      end
-    end
-  end
-
   def fetch?
     !@options[:delivery]
   end
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 0674b1083..e6674be8a 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -4,7 +4,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
   def perform
     return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
 
-    lock_or_fail("announce:#{@object['id']}") do
+    with_lock("announce:#{value_or_id(@object)}") do
       original_status = status_from_object
 
       return reject_payload! if original_status.nil? || !announceable?(original_status)
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 09fe08d45..ebae12973 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -47,7 +47,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   def create_status
     return reject_payload! if unsupported_object_type? || invalid_origin?(object_uri) || tombstone_exists? || !related_to_local_activity?
 
-    lock_or_fail("create:#{object_uri}") do
+    with_lock("create:#{object_uri}") do
       return if delete_arrived_first?(object_uri) || poll_vote?
 
       @status = find_existing_status
@@ -315,7 +315,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     poll = replied_to_status.preloadable_poll
     already_voted = true
 
-    lock_or_fail("vote:#{replied_to_status.poll_id}:#{@account.id}") do
+    with_lock("vote:#{replied_to_status.poll_id}:#{@account.id}") do
       already_voted = poll.votes.where(account: @account).exists?
       poll.votes.create!(account: @account, choice: poll.options.index(@object['name']), uri: object_uri)
     end
diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb
index f5ef863f3..871eb3966 100644
--- a/app/lib/activitypub/activity/delete.rb
+++ b/app/lib/activitypub/activity/delete.rb
@@ -12,7 +12,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
   private
 
   def delete_person
-    lock_or_return("delete_in_progress:#{@account.id}") do
+    with_lock("delete_in_progress:#{@account.id}", autorelease: 2.hours, raise_on_failure: false) do
       DeleteAccountService.new.call(@account, reserve_username: false, skip_activitypub: true)
     end
   end
@@ -20,14 +20,14 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
   def delete_note
     return if object_uri.nil?
 
-    lock_or_return("delete_status_in_progress:#{object_uri}", 5.minutes.seconds) do
+    with_lock("delete_status_in_progress:#{object_uri}", raise_on_failure: false) do
       unless invalid_origin?(object_uri)
         # This lock ensures a concurrent `ActivityPub::Activity::Create` either
         # does not create a status at all, or has finished saving it to the
         # database before we try to load it.
         # Without the lock, `delete_later!` could be called after `delete_arrived_first?`
         # and `Status.find` before `Status.create!`
-        lock_or_fail("create:#{object_uri}") { delete_later!(object_uri) }
+        with_lock("create:#{object_uri}") { delete_later!(object_uri) }
 
         Tombstone.find_or_create_by(uri: object_uri, account: @account)
       end
diff --git a/app/lib/advanced_text_formatter.rb b/app/lib/advanced_text_formatter.rb
index 728400819..dcaf34b91 100644
--- a/app/lib/advanced_text_formatter.rb
+++ b/app/lib/advanced_text_formatter.rb
@@ -8,7 +8,7 @@ class AdvancedTextFormatter < TextFormatter
     end
 
     def block_code(code, _language)
-      <<~HTML.squish
+      <<~HTML
         <pre><code>#{ERB::Util.h(code).gsub("\n", '<br/>')}</code></pre>
       HTML
     end
diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb
index a1fea6430..d61ec0e6e 100644
--- a/app/lib/application_extension.rb
+++ b/app/lib/application_extension.rb
@@ -12,4 +12,8 @@ module ApplicationExtension
   def most_recently_used_access_token
     @most_recently_used_access_token ||= access_tokens.where.not(last_used_at: nil).order(last_used_at: :desc).first
   end
+
+  def confirmation_redirect_uri
+    redirect_uri.lines.first.strip
+  end
 end
diff --git a/app/lib/emoji_formatter.rb b/app/lib/emoji_formatter.rb
index f808f3a22..194849c23 100644
--- a/app/lib/emoji_formatter.rb
+++ b/app/lib/emoji_formatter.rb
@@ -11,6 +11,7 @@ class EmojiFormatter
   # @param [Array<CustomEmoji>] custom_emojis
   # @param [Hash] options
   # @option options [Boolean] :animate
+  # @option options [String] :style
   def initialize(html, custom_emojis, options = {})
     raise ArgumentError unless html.html_safe?
 
@@ -85,14 +86,29 @@ class EmojiFormatter
   def image_for_emoji(shortcode, emoji)
     original_url, static_url = emoji
 
-    if animate?
-      image_tag(original_url, draggable: false, class: 'emojione', alt: ":#{shortcode}:", title: ":#{shortcode}:")
-    else
-      image_tag(original_url, draggable: false, class: 'emojione custom-emoji', alt: ":#{shortcode}:", title: ":#{shortcode}:", data: { original: original_url, static: static_url })
-    end
+    image_tag(
+      animate? ? original_url : static_url,
+      image_attributes.merge(alt: ":#{shortcode}:", title: ":#{shortcode}:", data: image_data_attributes(original_url, static_url))
+    )
+  end
+
+  def image_attributes
+    { rel: 'emoji', draggable: false, width: 16, height: 16, class: image_class_names, style: image_style }
+  end
+
+  def image_data_attributes(original_url, static_url)
+    { original: original_url, static: static_url } unless animate?
+  end
+
+  def image_class_names
+    animate? ? 'emojione' : 'emojione custom-emoji'
+  end
+
+  def image_style
+    @options[:style]
   end
 
   def animate?
-    @options[:animate]
+    @options[:animate] || @options.key?(:style)
   end
 end
diff --git a/app/lib/importer/accounts_index_importer.rb b/app/lib/importer/accounts_index_importer.rb
new file mode 100644
index 000000000..792a31b1b
--- /dev/null
+++ b/app/lib/importer/accounts_index_importer.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class Importer::AccountsIndexImporter < Importer::BaseImporter
+  def import!
+    scope.includes(:account_stat).find_in_batches(batch_size: @batch_size) do |tmp|
+      in_work_unit(tmp) do |accounts|
+        bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: accounts).bulk_body
+
+        indexed = bulk.select { |entry| entry[:index] }.size
+        deleted = bulk.select { |entry| entry[:delete] }.size
+
+        Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+        [indexed, deleted]
+      end
+    end
+
+    wait!
+  end
+
+  private
+
+  def index
+    AccountsIndex
+  end
+
+  def scope
+    Account.searchable
+  end
+end
diff --git a/app/lib/importer/base_importer.rb b/app/lib/importer/base_importer.rb
new file mode 100644
index 000000000..ea522c600
--- /dev/null
+++ b/app/lib/importer/base_importer.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+class Importer::BaseImporter
+  # @param [Integer] batch_size
+  # @param [Concurrent::ThreadPoolExecutor] executor
+  def initialize(batch_size:, executor:)
+    @batch_size = batch_size
+    @executor   = executor
+    @wait_for   = Concurrent::Set.new
+  end
+
+  # Callback to run when a concurrent work unit completes
+  # @param [Proc]
+  def on_progress(&block)
+    @on_progress = block
+  end
+
+  # Callback to run when a concurrent work unit fails
+  # @param [Proc]
+  def on_failure(&block)
+    @on_failure = block
+  end
+
+  # Reduce resource usage during and improve speed of indexing
+  def optimize_for_import!
+    Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: -1 } }
+  end
+
+  # Restore original index settings
+  def optimize_for_search!
+    Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: index.settings_hash[:settings][:index][:refresh_interval] } }
+  end
+
+  # Estimate the amount of documents that would be indexed. Not exact!
+  # @returns [Integer]
+  def estimate!
+    ActiveRecord::Base.connection_pool.with_connection { |connection| connection.select_one("SELECT reltuples AS estimate FROM pg_class WHERE relname = '#{index.adapter.target.table_name}'")['estimate'].to_i }
+  end
+
+  # Import data from the database into the index
+  def import!
+    raise NotImplementedError
+  end
+
+  # Remove documents from the index that no longer exist in the database
+  def clean_up!
+    index.scroll_batches do |documents|
+      ids           = documents.map { |doc| doc['_id'] }
+      existence_map = index.adapter.target.where(id: ids).pluck(:id).each_with_object({}) { |id, map| map[id.to_s] = true }
+      tmp           = ids.reject { |id| existence_map[id] }
+
+      next if tmp.empty?
+
+      in_work_unit(tmp) do |deleted_ids|
+        bulk = Chewy::Index::Import::BulkBuilder.new(index, delete: deleted_ids).bulk_body
+
+        Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+        [0, bulk.size]
+      end
+    end
+
+    wait!
+  end
+
+  protected
+
+  def in_work_unit(*args, &block)
+    work_unit = Concurrent::Promises.future_on(@executor, *args, &block)
+
+    work_unit.on_fulfillment!(&@on_progress)
+    work_unit.on_rejection!(&@on_failure)
+    work_unit.on_resolution! { @wait_for.delete(work_unit) }
+
+    @wait_for << work_unit
+  rescue Concurrent::RejectedExecutionError
+    sleep(0.1) && retry # Backpressure
+  end
+
+  def wait!
+    Concurrent::Promises.zip(*@wait_for).wait
+  end
+
+  def index
+    raise NotImplementedError
+  end
+end
diff --git a/app/lib/importer/statuses_index_importer.rb b/app/lib/importer/statuses_index_importer.rb
new file mode 100644
index 000000000..7c6532560
--- /dev/null
+++ b/app/lib/importer/statuses_index_importer.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+class Importer::StatusesIndexImporter < Importer::BaseImporter
+  def import!
+    # The idea is that instead of iterating over all statuses in the database
+    # and calculating the searchable_by for each of them (majority of which
+    # would be empty), we approach the index from the other end
+
+    scopes.each do |scope|
+      # We could be tempted to keep track of status IDs we have already processed
+      # from a different scope to avoid indexing them multiple times, but that
+      # could end up being a very large array
+
+      scope.find_in_batches(batch_size: @batch_size) do |tmp|
+        in_work_unit(tmp.map(&:status_id)) do |status_ids|
+          bulk = ActiveRecord::Base.connection_pool.with_connection do
+            Chewy::Index::Import::BulkBuilder.new(index, to_index: Status.includes(:media_attachments, :preloadable_poll).where(id: status_ids)).bulk_body
+          end
+
+          indexed = 0
+          deleted = 0
+
+          # We can't use the delete_if proc to do the filtering because delete_if
+          # is called before rendering the data and we need to filter based
+          # on the results of the filter, so this filtering happens here instead
+          bulk.map! do |entry|
+            new_entry = begin
+              if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank?
+                { delete: entry[:index].except(:data) }
+              else
+                entry
+              end
+            end
+
+            if new_entry[:index]
+              indexed += 1
+            else
+              deleted += 1
+            end
+
+            new_entry
+          end
+
+          Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+          [indexed, deleted]
+        end
+      end
+    end
+
+    wait!
+  end
+
+  private
+
+  def index
+    StatusesIndex
+  end
+
+  def scopes
+    [
+      local_statuses_scope,
+      local_mentions_scope,
+      local_favourites_scope,
+      local_votes_scope,
+      local_bookmarks_scope,
+    ]
+  end
+
+  def local_mentions_scope
+    Mention.where(account: Account.local, silent: false).select(:id, :status_id)
+  end
+
+  def local_favourites_scope
+    Favourite.where(account: Account.local).select(:id, :status_id)
+  end
+
+  def local_bookmarks_scope
+    Bookmark.select(:id, :status_id)
+  end
+
+  def local_votes_scope
+    Poll.joins(:votes).where(votes: { account: Account.local }).select('polls.id, polls.status_id')
+  end
+
+  def local_statuses_scope
+    Status.local.select('id, coalesce(reblog_of_id, id) as status_id')
+  end
+end
diff --git a/app/lib/importer/tags_index_importer.rb b/app/lib/importer/tags_index_importer.rb
new file mode 100644
index 000000000..f5bd8f052
--- /dev/null
+++ b/app/lib/importer/tags_index_importer.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Importer::TagsIndexImporter < Importer::BaseImporter
+  def import!
+    index.adapter.default_scope.find_in_batches(batch_size: @batch_size) do |tmp|
+      in_work_unit(tmp) do |tags|
+        bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: tags).bulk_body
+
+        indexed = bulk.select { |entry| entry[:index] }.size
+        deleted = bulk.select { |entry| entry[:delete] }.size
+
+        Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+        [indexed, deleted]
+      end
+    end
+
+    wait!
+  end
+
+  private
+
+  def index
+    TagsIndex
+  end
+end
diff --git a/app/lib/rss/builder.rb b/app/lib/rss/builder.rb
new file mode 100644
index 000000000..a9b3f08c5
--- /dev/null
+++ b/app/lib/rss/builder.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class RSS::Builder
+  attr_reader :dsl
+
+  def self.build
+    new.tap do |builder|
+      yield builder.dsl
+    end.to_xml
+  end
+
+  def initialize
+    @dsl = RSS::Channel.new
+  end
+
+  def to_xml
+    ('<?xml version="1.0" encoding="UTF-8"?>'.dup << Ox.dump(wrap_in_document, effort: :tolerant)).force_encoding('UTF-8')
+  end
+
+  private
+
+  def wrap_in_document
+    Ox::Document.new(version: '1.0').tap do |document|
+      document << Ox::Element.new('rss').tap do |rss|
+        rss['version']        = '2.0'
+        rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0'
+        rss['xmlns:media']    = 'http://search.yahoo.com/mrss/'
+
+        rss << @dsl.to_element
+      end
+    end
+  end
+end
diff --git a/app/lib/rss/channel.rb b/app/lib/rss/channel.rb
new file mode 100644
index 000000000..1dba94e47
--- /dev/null
+++ b/app/lib/rss/channel.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class RSS::Channel < RSS::Element
+  def initialize
+    super()
+
+    @root = create_element('channel')
+  end
+
+  def title(str)
+    append_element('title', str)
+  end
+
+  def link(str)
+    append_element('link', str)
+  end
+
+  def last_build_date(date)
+    append_element('lastBuildDate', date.to_formatted_s(:rfc822))
+  end
+
+  def image(url, title, link)
+    append_element('image') do |image|
+      image << create_element('url', url)
+      image << create_element('title', title)
+      image << create_element('link', link)
+    end
+  end
+
+  def description(str)
+    append_element('description', str)
+  end
+
+  def generator(str)
+    append_element('generator', str)
+  end
+
+  def icon(str)
+    append_element('webfeeds:icon', str)
+  end
+
+  def logo(str)
+    append_element('webfeeds:logo', str)
+  end
+
+  def item(&block)
+    @root << RSS::Item.with(&block)
+  end
+end
diff --git a/app/lib/rss/element.rb b/app/lib/rss/element.rb
new file mode 100644
index 000000000..7142fa039
--- /dev/null
+++ b/app/lib/rss/element.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RSS::Element
+  def self.with(*args, &block)
+    new(*args).tap(&block).to_element
+  end
+
+  def create_element(name, content = nil)
+    Ox::Element.new(name).tap do |element|
+      yield element if block_given?
+      element << content if content.present?
+    end
+  end
+
+  def append_element(name, content = nil)
+    @root << create_element(name, content).tap do |element|
+      yield element if block_given?
+    end
+  end
+
+  def to_element
+    @root
+  end
+end
diff --git a/app/lib/rss/item.rb b/app/lib/rss/item.rb
new file mode 100644
index 000000000..c02991ace
--- /dev/null
+++ b/app/lib/rss/item.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class RSS::Item < RSS::Element
+  def initialize
+    super()
+
+    @root = create_element('item')
+  end
+
+  def title(str)
+    append_element('title', str)
+  end
+
+  def link(str)
+    append_element('guid', str) do |guid|
+      guid['isPermaLink'] = 'true'
+    end
+
+    append_element('link', str)
+  end
+
+  def pub_date(date)
+    append_element('pubDate', date.to_formatted_s(:rfc822))
+  end
+
+  def description(str)
+    append_element('description', str)
+  end
+
+  def category(str)
+    append_element('category', str)
+  end
+
+  def enclosure(url, type, size)
+    append_element('enclosure') do |enclosure|
+      enclosure['url']    = url
+      enclosure['length'] = size
+      enclosure['type']   = type
+    end
+  end
+
+  def media_content(url, type, size, &block)
+    @root << RSS::MediaContent.with(url, type, size, &block)
+  end
+end
diff --git a/app/lib/rss/media_content.rb b/app/lib/rss/media_content.rb
new file mode 100644
index 000000000..f281fe29e
--- /dev/null
+++ b/app/lib/rss/media_content.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class RSS::MediaContent < RSS::Element
+  def initialize(url, type, size)
+    super()
+
+    @root = create_element('media:content') do |content|
+      content['url']      = url
+      content['type']     = type
+      content['fileSize'] = size
+    end
+  end
+
+  def medium(str)
+    @root['medium'] = str
+  end
+
+  def rating(str)
+    append_element('media:rating', str) do |rating|
+      rating['scheme'] = 'urn:simple'
+    end
+  end
+
+  def description(str)
+    append_element('media:description', str) do |description|
+      description['type'] = 'plain'
+    end
+  end
+
+  def thumbnail(str)
+    append_element('media:thumbnail') do |thumbnail|
+      thumbnail['url'] = str
+    end
+  end
+end
diff --git a/app/lib/rss/serializer.rb b/app/lib/rss/serializer.rb
deleted file mode 100644
index d44e94221..000000000
--- a/app/lib/rss/serializer.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::Serializer
-  include FormattingHelper
-
-  private
-
-  def render_statuses(builder, statuses)
-    statuses.each do |status|
-      builder.item do |item|
-        item.title(status_title(status))
-            .link(ActivityPub::TagManager.instance.url_for(status))
-            .pub_date(status.created_at)
-            .description(status_description(status))
-
-        status.ordered_media_attachments.each do |media|
-          item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size)
-        end
-      end
-    end
-  end
-
-  def status_title(status)
-    preview = status.proper.spoiler_text.presence || status.proper.text
-
-    if preview.length > 30 || preview[0, 30].include?("\n")
-      preview = preview[0, 30]
-      preview = preview[0, preview.index("\n").presence || 30] + '…'
-    end
-
-    preview = "#{status.proper.spoiler_text.present? ? 'CW ' : ''}“#{preview}”#{status.proper.sensitive? ? ' (sensitive)' : ''}"
-
-    if status.reblog?
-      "#{status.account.acct} boosted #{status.reblog.account.acct}: #{preview}"
-    else
-      "#{status.account.acct}: #{preview}"
-    end
-  end
-
-  def status_description(status)
-    if status.proper.spoiler_text?
-      status.proper.spoiler_text
-    else
-      html = status_content_format(status.proper).to_str
-      after_html = ''
-
-      if status.proper.preloadable_poll
-        poll_options_html = status.proper.preloadable_poll.options.map { |o| "[ ] #{o}" }.join('<br />')
-        after_html = "<p>#{poll_options_html}</p>"
-      end
-
-      "#{html}#{after_html}"
-    end
-  end
-end
diff --git a/app/lib/rss_builder.rb b/app/lib/rss_builder.rb
deleted file mode 100644
index 63ddba2e8..000000000
--- a/app/lib/rss_builder.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# frozen_string_literal: true
-
-class RSSBuilder
-  class ItemBuilder
-    def initialize
-      @item = Ox::Element.new('item')
-    end
-
-    def title(str)
-      @item << (Ox::Element.new('title') << str)
-
-      self
-    end
-
-    def link(str)
-      @item << Ox::Element.new('guid').tap do |guid|
-        guid['isPermalink'] = 'true'
-        guid << str
-      end
-
-      @item << (Ox::Element.new('link') << str)
-
-      self
-    end
-
-    def pub_date(date)
-      @item << (Ox::Element.new('pubDate') << date.to_formatted_s(:rfc822))
-
-      self
-    end
-
-    def description(str)
-      @item << (Ox::Element.new('description') << str)
-
-      self
-    end
-
-    def enclosure(url, type, size)
-      @item << Ox::Element.new('enclosure').tap do |enclosure|
-        enclosure['url']    = url
-        enclosure['length'] = size
-        enclosure['type']   = type
-      end
-
-      self
-    end
-
-    def to_element
-      @item
-    end
-  end
-
-  def initialize
-    @document = Ox::Document.new(version: '1.0')
-    @channel  = Ox::Element.new('channel')
-
-    @document << (rss << @channel)
-  end
-
-  def title(str)
-    @channel << (Ox::Element.new('title') << str)
-
-    self
-  end
-
-  def link(str)
-    @channel << (Ox::Element.new('link') << str)
-
-    self
-  end
-
-  def image(str)
-    @channel << Ox::Element.new('image').tap do |image|
-      image << (Ox::Element.new('url') << str)
-      image << (Ox::Element.new('title') << '')
-      image << (Ox::Element.new('link') << '')
-    end
-
-    @channel << (Ox::Element.new('webfeeds:icon') << str)
-
-    self
-  end
-
-  def cover(str)
-    @channel << Ox::Element.new('webfeeds:cover').tap do |cover|
-      cover['image'] = str
-    end
-
-    self
-  end
-
-  def logo(str)
-    @channel << (Ox::Element.new('webfeeds:logo') << str)
-
-    self
-  end
-
-  def accent_color(str)
-    @channel << (Ox::Element.new('webfeeds:accentColor') << str)
-
-    self
-  end
-
-  def description(str)
-    @channel << (Ox::Element.new('description') << str)
-
-    self
-  end
-
-  def item
-    @channel << ItemBuilder.new.tap do |item|
-      yield item
-    end.to_element
-
-    self
-  end
-
-  def to_xml
-    ('<?xml version="1.0" encoding="UTF-8"?>' + Ox.dump(@document, effort: :tolerant)).force_encoding('UTF-8')
-  end
-
-  private
-
-  def rss
-    Ox::Element.new('rss').tap do |rss|
-      rss['version']        = '2.0'
-      rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0'
-    end
-  end
-end
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index d339e078c..1d70ed36a 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -34,7 +34,6 @@ class UserSettingsDecorator
     user.settings['noindex']             = noindex_preference if change?('setting_noindex')
     user.settings['flavour']             = flavour_preference if change?('setting_flavour')
     user.settings['skin']                = skin_preference if change?('setting_skin')
-    user.settings['hide_network']        = hide_network_preference if change?('setting_hide_network')
     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')
@@ -118,10 +117,6 @@ class UserSettingsDecorator
     settings['setting_skin']
   end
 
-  def hide_network_preference
-    boolean_cast_setting 'setting_hide_network'
-  end
-
   def show_application_preference
     boolean_cast_setting 'setting_show_application'
   end
diff --git a/app/models/account.rb b/app/models/account.rb
index 068ee7ae9..7c81e07d9 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -79,7 +79,7 @@ class Account < ApplicationRecord
 
   MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
   MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i
-  MAX_FIELDS = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
+  DEFAULT_FIELDS_SIZE = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
 
   enum protocol: [:ostatus, :activitypub]
   enum suspension_origin: [:local, :remote], _prefix: true
@@ -95,7 +95,7 @@ class Account < ApplicationRecord
   validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? }
   validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? }
   validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? }
-  validates :fields, length: { maximum: MAX_FIELDS }, if: -> { local? && will_save_change_to_fields? }
+  validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
 
   scope :remote, -> { where.not(domain: nil) }
   scope :local, -> { where(domain: nil) }
@@ -113,7 +113,8 @@ class Account < ApplicationRecord
   scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
   scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
   scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
-  scope :searchable, -> { without_suspended.where(moved_to_account_id: nil) }
+  scope :without_unapproved, -> { left_outer_joins(:user).remote.or(left_outer_joins(:user).merge(User.approved.confirmed)) }
+  scope :searchable, -> { without_unapproved.without_suspended.where(moved_to_account_id: nil) }
   scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).left_outer_joins(:account_stat) }
   scope :followable_by, ->(account) { joins(arel_table.join(Follow.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(Follow.arel_table[:target_account_id]).and(Follow.arel_table[:account_id].eq(account.id))).join_sources).where(Follow.arel_table[:id].eq(nil)).joins(arel_table.join(FollowRequest.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(FollowRequest.arel_table[:target_account_id]).and(FollowRequest.arel_table[:account_id].eq(account.id))).join_sources).where(FollowRequest.arel_table[:id].eq(nil)) }
   scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc, accounts.id desc')) }
@@ -197,7 +198,7 @@ class Account < ApplicationRecord
   end
 
   def searchable?
-    !(suspended? || moved?)
+    !(suspended? || moved?) && (!local? || (approved? && confirmed?))
   end
 
   def possibly_stale?
@@ -329,12 +330,12 @@ class Account < ApplicationRecord
   end
 
   def build_fields
-    return if fields.size >= MAX_FIELDS
+    return if fields.size >= DEFAULT_FIELDS_SIZE
 
     tmp = self[:fields] || []
     tmp = [] if tmp.is_a?(Hash)
 
-    (MAX_FIELDS - tmp.size).times do
+    (DEFAULT_FIELDS_SIZE - tmp.size).times do
       tmp << { name: '', value: '' }
     end
 
@@ -463,9 +464,11 @@ class Account < ApplicationRecord
           accounts.*,
           ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
         FROM accounts
+        LEFT JOIN users ON accounts.id = users.account_id
         WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
           AND accounts.suspended_at IS NULL
           AND accounts.moved_to_account_id IS NULL
+          AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
         ORDER BY rank DESC
         LIMIT :limit OFFSET :offset
       SQL
@@ -541,9 +544,11 @@ class Account < ApplicationRecord
             (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
           FROM accounts
           LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id)
+          LEFT JOIN users ON accounts.id = users.account_id
           WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
             AND accounts.suspended_at IS NULL
             AND accounts.moved_to_account_id IS NULL
+            AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
           GROUP BY accounts.id
           ORDER BY rank DESC
           LIMIT :limit OFFSET :offset
diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb
index ded32c9c6..06291c9f3 100644
--- a/app/models/account_migration.rb
+++ b/app/models/account_migration.rb
@@ -15,6 +15,7 @@
 
 class AccountMigration < ApplicationRecord
   include Redisable
+  include Lockable
 
   COOLDOWN_PERIOD = 30.days.freeze
 
@@ -41,12 +42,8 @@ class AccountMigration < ApplicationRecord
 
     return false unless errors.empty?
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        save
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("account_migration:#{account.id}") do
+      save
     end
   end
 
@@ -83,8 +80,4 @@ class AccountMigration < ApplicationRecord
   def validate_migration_cooldown
     errors.add(:base, I18n.t('migrations.errors.on_cooldown')) if account.migrations.within_cooldown.exists?
   end
-
-  def lock_options
-    { redis: redis, key: "account_migration:#{account.id}" }
-  end
 end
diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb
index b49827267..a5d71a5b8 100644
--- a/app/models/account_stat.rb
+++ b/app/models/account_stat.rb
@@ -20,4 +20,16 @@ class AccountStat < ApplicationRecord
   belongs_to :account, inverse_of: :account_stat
 
   update_index('accounts', :account)
+
+  def following_count
+    [attributes['following_count'], 0].max
+  end
+
+  def followers_count
+    [attributes['followers_count'], 0].max
+  end
+
+  def statuses_count
+    [attributes['statuses_count'], 0].max
+  end
 end
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index 850ea6d82..aed3bc0c7 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -92,6 +92,10 @@ class Admin::AccountAction
       text: text_for_warning,
       status_ids: status_ids
     )
+
+    # A log entry is only interesting if the warning contains
+    # custom text from someone. Otherwise it's just noise.
+    log_action(:create, @warning) if @warning.text.present? && type == 'none'
   end
 
   def process_reports!
@@ -160,8 +164,8 @@ class Admin::AccountAction
 
   def reports
     @reports ||= begin
-      if type == 'none' && with_report?
-        [report]
+      if type == 'none'
+        with_report? ? [report] : []
       else
         Report.where(target_account: target_account).unresolved
       end
diff --git a/app/models/admin/import.rb b/app/models/admin/import.rb
new file mode 100644
index 000000000..c305be237
--- /dev/null
+++ b/app/models/admin/import.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# A non-activerecord helper class for csv upload
+class Admin::Import
+  extend ActiveModel::Callbacks
+  include ActiveModel::Model
+  include Paperclip::Glue
+
+  FILE_TYPES = %w(text/plain text/csv application/csv).freeze
+
+  # Paperclip required callbacks
+  define_model_callbacks :save, only: [:after]
+  define_model_callbacks :destroy, only: [:before, :after]
+
+  attr_accessor :data_file_name, :data_content_type
+
+  has_attached_file :data
+  validates_attachment_content_type :data, content_type: FILE_TYPES
+  validates_attachment_presence :data
+  validates_with AdminImportValidator, on: :create
+
+  def save
+    run_callbacks :save
+  end
+
+  def destroy
+    run_callbacks :destroy
+  end
+end
diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb
index 631af183c..7bf6fa6da 100644
--- a/app/models/admin/status_batch_action.rb
+++ b/app/models/admin/status_batch_action.rb
@@ -103,7 +103,7 @@ class Admin::StatusBatchAction
 
   def handle_report!
     @report = Report.new(report_params) unless with_report?
-    @report.status_ids = (@report.status_ids + status_ids.map(&:to_i)).uniq
+    @report.status_ids = (@report.status_ids + allowed_status_ids).uniq
     @report.save!
 
     @report_id = @report.id
@@ -135,4 +135,8 @@ class Admin::StatusBatchAction
   def report_params
     { account: current_account, target_account: target_account }
   end
+
+  def allowed_status_ids
+    AccountStatusesFilter.new(@report.target_account, current_account).results.with_discarded.where(id: status_ids).pluck(:id)
+  end
 end
diff --git a/app/models/concerns/lockable.rb b/app/models/concerns/lockable.rb
new file mode 100644
index 000000000..55a9714ca
--- /dev/null
+++ b/app/models/concerns/lockable.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Lockable
+  # @param [String] lock_name
+  # @param [ActiveSupport::Duration] autorelease Automatically release the lock after this time
+  # @param [Boolean] raise_on_failure Raise an error if a lock cannot be acquired, or fail silently
+  # @raise [Mastodon::RaceConditionError]
+  def with_lock(lock_name, autorelease: 15.minutes, raise_on_failure: true)
+    with_redis do |redis|
+      RedisLock.acquire(redis: redis, key: "lock:#{lock_name}", autorelease: autorelease.seconds) do |lock|
+        if lock.acquired?
+          yield
+        elsif raise_on_failure
+          raise Mastodon::RaceConditionError, "Could not acquire lock for #{lock_name}, try again later"
+        end
+      end
+    end
+  end
+end
diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb
index 8d76b6b82..0dad3abb2 100644
--- a/app/models/concerns/redisable.rb
+++ b/app/models/concerns/redisable.rb
@@ -1,11 +1,11 @@
 # frozen_string_literal: true
 
 module Redisable
-  extend ActiveSupport::Concern
-
-  private
-
   def redis
     Thread.current[:redis] ||= RedisConfiguration.pool.checkout
   end
+
+  def with_redis(&block)
+    RedisConfiguration.with(&block)
+  end
 end
diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb
index 4b0a89c18..2e14fce25 100644
--- a/app/models/domain_allow.rb
+++ b/app/models/domain_allow.rb
@@ -23,6 +23,10 @@ class DomainAllow < ApplicationRecord
       !rule_for(domain).nil?
     end
 
+    def allowed_domains
+      select(:domain)
+    end
+
     def rule_for(domain)
       return if domain.blank?
 
diff --git a/app/models/form/domain_block_batch.rb b/app/models/form/domain_block_batch.rb
new file mode 100644
index 000000000..39012df51
--- /dev/null
+++ b/app/models/form/domain_block_batch.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class Form::DomainBlockBatch
+  include ActiveModel::Model
+  include Authorization
+  include AccountableConcern
+
+  attr_accessor :domain_blocks_attributes, :action, :current_account
+
+  def save
+    case action
+    when 'save'
+      save!
+    end
+  end
+
+  private
+
+  def domain_blocks
+    @domain_blocks ||= domain_blocks_attributes.values.filter_map do |attributes|
+      DomainBlock.new(attributes.without('enabled')) if ActiveModel::Type::Boolean.new.cast(attributes['enabled'])
+    end
+  end
+
+  def save!
+    domain_blocks.each do |domain_block|
+      authorize(domain_block, :create?)
+      next if DomainBlock.rule_for(domain_block.domain).present?
+
+      domain_block.save!
+      DomainBlockWorker.perform_async(domain_block.id)
+      log_action :create, domain_block
+    end
+  end
+end
diff --git a/app/models/mute.rb b/app/models/mute.rb
index fe8b6f42c..578345ef6 100644
--- a/app/models/mute.rb
+++ b/app/models/mute.rb
@@ -6,7 +6,6 @@
 #  id                 :bigint(8)        not null, primary key
 #  created_at         :datetime         not null
 #  updated_at         :datetime         not null
-#  hide_notifications :boolean          default(TRUE), not null
 #  account_id         :bigint(8)        not null
 #  target_account_id  :bigint(8)        not null
 #  hide_notifications :boolean          default(TRUE), not null
diff --git a/app/models/poll.rb b/app/models/poll.rb
index ba08309a1..1a326e452 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -39,13 +39,12 @@ class Poll < ApplicationRecord
 
   before_validation :prepare_options, if: :local?
   before_validation :prepare_votes_count
-
-  after_initialize :prepare_cached_tallies
+  before_validation :prepare_cached_tallies
 
   after_commit :reset_parent_cache, on: :update
 
   def loaded_options
-    options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) }
+    options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? (cached_tallies[key] || 0) : nil) }
   end
 
   def possibly_stale?
diff --git a/app/models/status.rb b/app/models/status.rb
index 75b464a70..3efa23ae2 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -322,10 +322,6 @@ class Status < ApplicationRecord
       visibilities.keys - %w(direct limited)
     end
 
-    def in_chosen_languages(account)
-      where(language: nil).or where(language: account.chosen_languages)
-    end
-
     def as_direct_timeline(account, limit = 20, max_id = nil, since_id = nil, cache_ids = false)
       # direct timeline is mix of direct message from_me and to_me.
       # 2 queries are executed with pagination.
@@ -515,7 +511,7 @@ class Status < ApplicationRecord
   end
 
   def set_poll_id
-    update_column(:poll_id, poll.id) unless poll.nil?
+    update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present?
   end
 
   def set_visibility
diff --git a/app/models/status_stat.rb b/app/models/status_stat.rb
index 024c467e7..437861d1c 100644
--- a/app/models/status_stat.rb
+++ b/app/models/status_stat.rb
@@ -17,6 +17,18 @@ class StatusStat < ApplicationRecord
 
   after_commit :reset_parent_cache
 
+  def replies_count
+    [attributes['replies_count'], 0].max
+  end
+
+  def reblogs_count
+    [attributes['reblogs_count'], 0].max
+  end
+
+  def favourites_count
+    [attributes['favourites_count'], 0].max
+  end
+
   private
 
   def reset_parent_cache
diff --git a/app/models/trends.rb b/app/models/trends.rb
index 0be900b04..0fff66a9f 100644
--- a/app/models/trends.rb
+++ b/app/models/trends.rb
@@ -33,8 +33,8 @@ module Trends
     statuses_requiring_review = statuses.request_review
 
     User.staff.includes(:account).find_each do |user|
-      links    = user.allows_trending_tags_review_emails? ? links_requiring_review : []
-      tags     = user.allows_trending_links_review_emails? ? tags_requiring_review : []
+      links    = user.allows_trending_links_review_emails? ? links_requiring_review : []
+      tags     = user.allows_trending_tags_review_emails? ? tags_requiring_review : []
       statuses = user.allows_trending_statuses_review_emails? ? statuses_requiring_review : []
       next if links.empty? && tags.empty? && statuses.empty?
 
diff --git a/app/models/trends/history.rb b/app/models/trends/history.rb
index 608e33792..74723e35c 100644
--- a/app/models/trends/history.rb
+++ b/app/models/trends/history.rb
@@ -11,11 +11,11 @@ class Trends::History
     end
 
     def uses
-      redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum
+      with_redis { |redis| redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum }
     end
 
     def accounts
-      redis.pfcount(*@days.map { |day| day.key_for(:accounts) })
+      with_redis { |redis| redis.pfcount(*@days.map { |day| day.key_for(:accounts) }) }
     end
   end
 
@@ -33,19 +33,21 @@ class Trends::History
     attr_reader :day
 
     def accounts
-      redis.pfcount(key_for(:accounts))
+      with_redis { |redis| redis.pfcount(key_for(:accounts)) }
     end
 
     def uses
-      redis.get(key_for(:uses))&.to_i || 0
+      with_redis { |redis| redis.get(key_for(:uses))&.to_i || 0 }
     end
 
     def add(account_id)
-      redis.pipelined do
-        redis.incrby(key_for(:uses), 1)
-        redis.pfadd(key_for(:accounts), account_id)
-        redis.expire(key_for(:uses), EXPIRE_AFTER)
-        redis.expire(key_for(:accounts), EXPIRE_AFTER)
+      with_redis do |redis|
+        redis.pipelined do |pipeline|
+          pipeline.incrby(key_for(:uses), 1)
+          pipeline.pfadd(key_for(:accounts), account_id)
+          pipeline.expire(key_for(:uses), EXPIRE_AFTER)
+          pipeline.expire(key_for(:accounts), EXPIRE_AFTER)
+        end
       end
     end
 
diff --git a/app/models/user.rb b/app/models/user.rb
index b38de74b8..f7a35eeb5 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -53,6 +53,7 @@ class User < ApplicationRecord
   include Settings::Extend
   include UserRoles
   include Redisable
+  include LanguagesHelper
 
   # 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
@@ -248,7 +249,7 @@ class User < ApplicationRecord
   end
 
   def preferred_posting_language
-    settings.default_language || locale
+    valid_locale_cascade(settings.default_language, locale)
   end
 
   def setting_default_privacy
diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb
index d3a3b36c0..75d95a90b 100644
--- a/app/policies/status_policy.rb
+++ b/app/policies/status_policy.rb
@@ -97,7 +97,7 @@ class StatusPolicy < ApplicationPolicy
   def author
     record.account
   end
-  
+
   def local_only?
     record.local_only?
   end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index a0f1ebd0a..3e85faa92 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -44,15 +44,6 @@ class InstancePresenter
     Mastodon::Version
   end
 
-  def commit_hash
-    current_release_file = Pathname.new('CURRENT_RELEASE').expand_path
-    if current_release_file.file?
-      IO.read(current_release_file).strip!
-    else
-      ''
-    end
-  end
-
   def source_url
     Mastodon::Version.source_url
   end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index a05164641..5eab02dbc 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -3,7 +3,8 @@
 class InitialStateSerializer < ActiveModel::Serializer
   attributes :meta, :compose, :accounts,
              :media_attachments, :settings,
-             :max_toot_chars, :poll_limits
+             :max_toot_chars, :poll_limits,
+             :languages
 
   has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
 
@@ -76,6 +77,7 @@ class InitialStateSerializer < ActiveModel::Serializer
       store[:me]                = object.current_account.id.to_s
       store[:default_privacy]   = object.visibility || object.current_account.user.setting_default_privacy
       store[:default_sensitive] = object.current_account.user.setting_default_sensitive
+      store[:default_language]  = object.current_account.user.preferred_posting_language
     end
 
     store[:text] = object.text if object.text
@@ -94,6 +96,10 @@ class InitialStateSerializer < ActiveModel::Serializer
     { accept_content_types: MediaAttachment.supported_file_extensions + MediaAttachment.supported_mime_types }
   end
 
+  def languages
+    LanguagesHelper::SUPPORTED_LOCALES.map { |(key, value)| [key, value[0], value[1]] }
+  end
+
   private
 
   def instance_presenter
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index 113e0cca7..e644a3f91 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -13,6 +13,7 @@ class REST::AccountSerializer < ActiveModel::Serializer
   has_many :emojis, serializer: REST::CustomEmojiSerializer
 
   attribute :suspended, if: :suspended?
+  attribute :silenced, key: :limited, if: :silenced?
 
   class FieldSerializer < ActiveModel::Serializer
     include FormattingHelper
@@ -102,7 +103,11 @@ class REST::AccountSerializer < ActiveModel::Serializer
     object.suspended?
   end
 
-  delegate :suspended?, to: :object
+  def silenced
+    object.silenced?
+  end
+
+  delegate :suspended?, :silenced?, to: :object
 
   def moved_and_not_nested?
     object.moved? && object.moved_to_account.moved_to_account_id.nil?
diff --git a/app/serializers/rest/preferences_serializer.rb b/app/serializers/rest/preferences_serializer.rb
index 119f0e06d..874bd990d 100644
--- a/app/serializers/rest/preferences_serializer.rb
+++ b/app/serializers/rest/preferences_serializer.rb
@@ -17,7 +17,7 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
   end
 
   def posting_default_language
-    object.user.setting_default_language.presence
+    object.user.preferred_posting_language
   end
 
   def reading_default_sensitive_media
diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb
deleted file mode 100644
index 81e24af0d..000000000
--- a/app/serializers/rss/account_serializer.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::AccountSerializer < RSS::Serializer
-  include ActionView::Helpers::NumberHelper
-  include AccountsHelper
-  include RoutingHelper
-
-  def render(account, statuses, tag)
-    builder = RSSBuilder.new
-
-    builder.title("#{display_name(account)} (@#{account.local_username_and_domain})")
-           .description(account_description(account))
-           .link(tag.present? ? short_account_tag_url(account, tag) : short_account_url(account))
-           .logo(full_pack_url('media/images/logo.svg'))
-           .accent_color('2b90d9')
-
-    builder.image(full_asset_url(account.avatar.url(:original))) if account.avatar?
-    builder.cover(full_asset_url(account.header.url(:original))) if account.header?
-
-    render_statuses(builder, statuses)
-
-    builder.to_xml
-  end
-
-  def self.render(account, statuses, tag)
-    new.render(account, statuses, tag)
-  end
-end
diff --git a/app/serializers/rss/tag_serializer.rb b/app/serializers/rss/tag_serializer.rb
deleted file mode 100644
index e549ac367..000000000
--- a/app/serializers/rss/tag_serializer.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::TagSerializer < RSS::Serializer
-  include ActionView::Helpers::NumberHelper
-  include ActionView::Helpers::SanitizeHelper
-  include RoutingHelper
-
-  def render(tag, statuses)
-    builder = RSSBuilder.new
-
-    builder.title("##{tag.name}")
-           .description(strip_tags(I18n.t('about.about_hashtag_html', hashtag: tag.name)))
-           .link(tag_url(tag))
-           .logo(full_pack_url('media/images/logo.svg'))
-           .accent_color('2b90d9')
-
-    render_statuses(builder, statuses)
-
-    builder.to_xml
-  end
-
-  def self.render(tag, statuses)
-    new.render(tag, statuses)
-  end
-end
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index 9672b3d2b..803098245 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -30,6 +30,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService
     end
 
     return if activity_json.nil? || object_uri.nil? || !trustworthy_attribution?(@json['id'], actor_uri)
+    return ActivityPub::TagManager.instance.uri_to_resource(object_uri, Status) if ActivityPub::TagManager.instance.local_uri?(object_uri)
 
     actor = account_from_uri(actor_uri)
 
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 5649153ee..4449a5427 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -4,6 +4,7 @@ class ActivityPub::ProcessAccountService < BaseService
   include JsonLdHelper
   include DomainControlHelper
   include Redisable
+  include Lockable
 
   # Should be called with confirmed valid JSON
   # and WebFinger-resolved username and domain
@@ -17,22 +18,18 @@ class ActivityPub::ProcessAccountService < BaseService
     @domain      = domain
     @collections = {}
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        @account            = Account.remote.find_by(uri: @uri) if @options[:only_key]
-        @account          ||= Account.find_remote(@username, @domain)
-        @old_public_key     = @account&.public_key
-        @old_protocol       = @account&.protocol
-        @suspension_changed = false
-
-        create_account if @account.nil?
-        update_account
-        process_tags
-
-        process_duplicate_accounts! if @options[:verified_webfinger]
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("process_account:#{@uri}") do
+      @account            = Account.remote.find_by(uri: @uri) if @options[:only_key]
+      @account          ||= Account.find_remote(@username, @domain)
+      @old_public_key     = @account&.public_key
+      @old_protocol       = @account&.protocol
+      @suspension_changed = false
+
+      create_account if @account.nil?
+      update_account
+      process_tags
+
+      process_duplicate_accounts! if @options[:verified_webfinger]
     end
 
     return if @account.nil?
@@ -289,10 +286,6 @@ class ActivityPub::ProcessAccountService < BaseService
     !@old_protocol.nil? && @old_protocol != @account.protocol
   end
 
-  def lock_options
-    { redis: redis, key: "process_account:#{@uri}", autorelease: 15.minutes.seconds }
-  end
-
   def process_tags
     return if @json['tag'].blank?
 
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index fb6e44c6d..addd5fc27 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -3,6 +3,7 @@
 class ActivityPub::ProcessStatusUpdateService < BaseService
   include JsonLdHelper
   include Redisable
+  include Lockable
 
   def call(status, json)
     raise ArgumentError, 'Status has unsaved changes' if status.changed?
@@ -33,41 +34,32 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
     last_edit_date = @status.edited_at.presence || @status.created_at
 
     # Only allow processing one create/update per status at a time
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        Status.transaction do
-          record_previous_edit!
-          update_media_attachments!
-          update_poll!
-          update_immediate_attributes!
-          update_metadata!
-          create_edits!
-        end
+    with_lock("create:#{@uri}") do
+      Status.transaction do
+        record_previous_edit!
+        update_media_attachments!
+        update_poll!
+        update_immediate_attributes!
+        update_metadata!
+        create_edits!
+      end
 
-        queue_poll_notifications!
+      queue_poll_notifications!
 
-        next unless significant_changes?
+      next unless significant_changes?
 
-        reset_preview_card!
-        broadcast_updates!
-      else
-        raise Mastodon::RaceConditionError
-      end
+      reset_preview_card!
+      broadcast_updates!
     end
 
     forward_activity! if significant_changes? && @status_parser.edited_at > last_edit_date
   end
 
   def handle_implicit_update!
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        update_poll!(allow_significant_changes: false)
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("create:#{@uri}") do
+      update_poll!(allow_significant_changes: false)
+      queue_poll_notifications!
     end
-
-    queue_poll_notifications!
   end
 
   def update_media_attachments!
@@ -241,10 +233,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
     equals_or_includes_any?(@json['type'], %w(Note Question))
   end
 
-  def lock_options
-    { redis: redis, key: "create:#{@uri}", autorelease: 15.minutes.seconds }
-  end
-
   def record_previous_edit!
     @previous_edit = @status.build_snapshot(at_time: @status.created_at, rate_limit: false) if @status.edits.empty?
   end
diff --git a/app/services/appeal_service.rb b/app/services/appeal_service.rb
index 1397c50f5..cef9be05f 100644
--- a/app/services/appeal_service.rb
+++ b/app/services/appeal_service.rb
@@ -14,7 +14,8 @@ class AppealService < BaseService
   private
 
   def create_appeal!
-    @appeal = @strike.create_appeal!(
+    @appeal = Appeal.create!(
+      strike: @strike,
       text: @text,
       account: @strike.target_account
     )
diff --git a/app/services/approve_appeal_service.rb b/app/services/approve_appeal_service.rb
index 37a08b46e..96aaaa7d0 100644
--- a/app/services/approve_appeal_service.rb
+++ b/app/services/approve_appeal_service.rb
@@ -52,8 +52,9 @@ class ApproveAppealService < BaseService
   end
 
   def undo_mark_statuses_as_sensitive!
+    representative_account = Account.representative
     @strike.statuses.includes(:media_attachments).each do |status|
-      UpdateStatusService.new.call(status, @current_account.id, sensitive: false) if status.with_media?
+      UpdateStatusService.new.call(status, representative_account.id, sensitive: false) if status.with_media?
     end
   end
 
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 868796a6b..e5b5b730e 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -2,6 +2,7 @@
 
 class FetchLinkCardService < BaseService
   include Redisable
+  include Lockable
 
   URL_PATTERN = %r{
     (#{Twitter::TwitterText::Regex[:valid_url_preceding_chars]})                                                                #   $1 preceding chars
@@ -22,13 +23,9 @@ class FetchLinkCardService < BaseService
 
     @url = @original_url.to_s
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        @card = PreviewCard.find_by(url: @url)
-        process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image?
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("fetch:#{@original_url}") do
+      @card = PreviewCard.find_by(url: @url)
+      process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image?
     end
 
     attach_card if @card&.persisted?
@@ -155,8 +152,4 @@ class FetchLinkCardService < BaseService
     @card.assign_attributes(link_details_extractor.to_preview_card_attributes)
     @card.save_with_optional_image! unless @card.title.blank? && @card.html.blank?
   end
-
-  def lock_options
-    { redis: redis, key: "fetch:#{@original_url}", autorelease: 15.minutes.seconds }
-  end
 end
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 9d239fc65..8c63b611d 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -37,6 +37,9 @@ class ProcessMentionsService < BaseService
 
       mentioned_account = Account.find_remote(username, domain)
 
+      # Unapproved and unconfirmed accounts should not be mentionable
+      next if mentioned_account&.local? && !(mentioned_account.user_confirmed? && mentioned_account.user_approved?)
+
       # If the account cannot be found or isn't the right protocol,
       # first try to resolve it
       if mention_undeliverable?(mentioned_account)
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index c31d89776..97afc3f61 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -3,6 +3,7 @@
 class RemoveStatusService < BaseService
   include Redisable
   include Payloadable
+  include Lockable
 
   # Delete a status
   # @param   [Status] status
@@ -17,38 +18,34 @@ class RemoveStatusService < BaseService
     @account  = status.account
     @options  = options
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        @status.discard
-
-        remove_from_self if @account.local?
-        remove_from_followers
-        remove_from_lists
-
-        # There is no reason to send out Undo activities when the
-        # cause is that the original object has been removed, since
-        # original object being removed implicitly removes reblogs
-        # of it. The Delete activity of the original is forwarded
-        # separately.
-        remove_from_remote_reach if @account.local? && !@options[:original_removed]
-
-        # Since reblogs don't mention anyone, don't get reblogged,
-        # favourited and don't contain their own media attachments
-        # or hashtags, this can be skipped
-        unless @status.reblog?
-          remove_from_mentions
-          remove_reblogs
-          remove_from_hashtags
-          remove_from_public
-          remove_from_media if @status.with_media?
-          remove_from_direct if status.direct_visibility?
-          remove_media
-        end
-
-        @status.destroy! if permanently?
-      else
-        raise Mastodon::RaceConditionError
+    with_lock("distribute:#{@status.id}") do
+      @status.discard
+
+      remove_from_self if @account.local?
+      remove_from_followers
+      remove_from_lists
+
+      # There is no reason to send out Undo activities when the
+      # cause is that the original object has been removed, since
+      # original object being removed implicitly removes reblogs
+      # of it. The Delete activity of the original is forwarded
+      # separately.
+      remove_from_remote_reach if @account.local? && !@options[:original_removed]
+
+      # Since reblogs don't mention anyone, don't get reblogged,
+      # favourited and don't contain their own media attachments
+      # or hashtags, this can be skipped
+      unless @status.reblog?
+        remove_from_mentions
+        remove_reblogs
+        remove_from_hashtags
+        remove_from_public
+        remove_from_media if @status.with_media?
+        remove_from_direct if status.direct_visibility?
+        remove_media
       end
+
+      @status.destroy! if permanently?
     end
   end
 
@@ -152,8 +149,4 @@ class RemoveStatusService < BaseService
   def permanently?
     @options[:immediate] || !(@options[:preserve] || @status.reported?)
   end
-
-  def lock_options
-    { redis: redis, key: "distribute:#{@status.id}", autorelease: 5.minutes.seconds }
-  end
 end
diff --git a/app/services/report_service.rb b/app/services/report_service.rb
index 9d784c341..d251bb33f 100644
--- a/app/services/report_service.rb
+++ b/app/services/report_service.rb
@@ -57,7 +57,7 @@ class ReportService < BaseService
   end
 
   def reported_status_ids
-    @target_account.statuses.with_discarded.find(Array(@status_ids)).pluck(:id)
+    AccountStatusesFilter.new(@target_account, @source_account).results.with_discarded.find(Array(@status_ids)).pluck(:id)
   end
 
   def payload
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 387e2e09b..b55e45409 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -5,6 +5,7 @@ class ResolveAccountService < BaseService
   include DomainControlHelper
   include WebfingerHelper
   include Redisable
+  include Lockable
 
   # Find or create an account record for a remote user. When creating,
   # look up the user's webfinger and fetch ActivityPub data
@@ -108,12 +109,8 @@ class ResolveAccountService < BaseService
   def fetch_account!
     return unless activitypub_ready?
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url)
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("resolve:#{@username}@#{@domain}") do
+      @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url)
     end
 
     @account
@@ -146,8 +143,4 @@ class ResolveAccountService < BaseService
     @account.suspend!(origin: :remote)
     AccountDeletionWorker.perform_async(@account.id, { 'reserve_username' => false, 'skip_activitypub' => true })
   end
-
-  def lock_options
-    { redis: redis, key: "resolve:#{@username}@#{@domain}", autorelease: 15.minutes.seconds }
-  end
 end
diff --git a/app/services/unfollow_service.rb b/app/services/unfollow_service.rb
index 151f3674f..d83a60e4e 100644
--- a/app/services/unfollow_service.rb
+++ b/app/services/unfollow_service.rb
@@ -2,6 +2,8 @@
 
 class UnfollowService < BaseService
   include Payloadable
+  include Redisable
+  include Lockable
 
   # Unfollow and notify the remote user
   # @param [Account] source_account Where to unfollow from
@@ -13,7 +15,9 @@ class UnfollowService < BaseService
     @target_account = target_account
     @options        = options
 
-    unfollow! || undo_follow_request!
+    with_lock("relationship:#{[source_account.id, target_account.id].sort.join(':')}") do
+      unfollow! || undo_follow_request!
+    end
   end
 
   private
diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb
index 878a2188d..0a39d7f26 100644
--- a/app/services/verify_link_service.rb
+++ b/app/services/verify_link_service.rb
@@ -28,7 +28,7 @@ class VerifyLinkService < BaseService
 
     links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
 
-    if links.any? { |link| link['href'] == @link_back }
+    if links.any? { |link| link['href'].downcase == @link_back.downcase }
       true
     elsif links.empty?
       false
diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb
index b77812970..114ec285c 100644
--- a/app/services/vote_service.rb
+++ b/app/services/vote_service.rb
@@ -4,8 +4,11 @@ class VoteService < BaseService
   include Authorization
   include Payloadable
   include Redisable
+  include Lockable
 
   def call(account, poll, choices)
+    return if choices.empty?
+
     authorize_with account, poll, :vote?
 
     @account = account
@@ -15,17 +18,13 @@ class VoteService < BaseService
 
     already_voted = true
 
-    RedisLock.acquire(lock_options) do |lock|
-      if lock.acquired?
-        already_voted = @poll.votes.where(account: @account).exists?
+    with_lock("vote:#{@poll.id}:#{@account.id}") do
+      already_voted = @poll.votes.where(account: @account).exists?
 
-        ApplicationRecord.transaction do
-          @choices.each do |choice|
-            @votes << @poll.votes.create!(account: @account, choice: Integer(choice))
-          end
+      ApplicationRecord.transaction do
+        @choices.each do |choice|
+          @votes << @poll.votes.create!(account: @account, choice: Integer(choice))
         end
-      else
-        raise Mastodon::RaceConditionError
       end
     end
 
@@ -76,8 +75,4 @@ class VoteService < BaseService
     @poll.reload
     retry
   end
-
-  def lock_options
-    { redis: redis, key: "vote:#{@poll.id}:#{@account.id}" }
-  end
 end
diff --git a/app/validators/admin_import_validator.rb b/app/validators/admin_import_validator.rb
new file mode 100644
index 000000000..338ceb3a7
--- /dev/null
+++ b/app/validators/admin_import_validator.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AdminImportValidator < ActiveModel::Validator
+  FIRST_HEADER = '#domain'
+
+  def validate(import)
+    return if import.type.blank? || import.data.blank?
+
+    # We parse because newlines could be part of individual rows. This
+    # runs on create so we should be reading the local file here before
+    # it is uploaded to object storage or moved anywhere...
+    csv_data = CSV.parse(import.data.queued_for_write[:original].read)
+
+    row_count  = csv_data.size
+    row_count -= 1 if csv_data.first&.first == FIRST_HEADER
+
+    import.errors.add(:data, I18n.t('imports.errors.over_rows_processing_limit', count: Admin::DomainBlocksController::ROWS_PROCESSING_LIMIT)) if row_count > Admin::DomainBlocksController::ROWS_PROCESSING_LIMIT
+  end
+end
diff --git a/app/validators/status_pin_validator.rb b/app/validators/status_pin_validator.rb
index 35a101f1d..9466a81fe 100644
--- a/app/validators/status_pin_validator.rb
+++ b/app/validators/status_pin_validator.rb
@@ -2,7 +2,7 @@
 
 class StatusPinValidator < ActiveModel::Validator
   MAX_PINNED = (ENV['MAX_PINNED_TOOTS'] || 5).to_i
-  
+
   def validate(pin)
     pin.errors.add(:base, I18n.t('statuses.pin_errors.reblog')) if pin.status.reblog?
     pin.errors.add(:base, I18n.t('statuses.pin_errors.ownership')) if pin.account_id != pin.status.account_id
diff --git a/app/views/accounts/show.rss.ruby b/app/views/accounts/show.rss.ruby
new file mode 100644
index 000000000..73c1c51e0
--- /dev/null
+++ b/app/views/accounts/show.rss.ruby
@@ -0,0 +1,37 @@
+RSS::Builder.build do |doc|
+  doc.title(display_name(@account))
+  doc.description(I18n.t('rss.descriptions.account', acct: @account.local_username_and_domain))
+  doc.link(params[:tag].present? ? short_account_tag_url(@account, params[:tag]) : short_account_url(@account))
+  doc.image(full_asset_url(@account.avatar.url(:original)), display_name(@account), params[:tag].present? ? short_account_tag_url(@account, params[:tag]) : short_account_url(@account))
+  doc.last_build_date(@statuses.first.created_at) if @statuses.any?
+  doc.icon(full_asset_url(@account.avatar.url(:original)))
+  doc.logo(full_pack_url('media/images/logo_transparent_white.svg'))
+  doc.generator("Mastodon v#{Mastodon::Version.to_s}")
+
+  @statuses.each do |status|
+    doc.item do |item|
+      item.title(l(status.created_at))
+      item.link(ActivityPub::TagManager.instance.url_for(status))
+      item.pub_date(status.created_at)
+      item.description(rss_status_content_format(status))
+
+      if status.ordered_media_attachments.first&.audio?
+        media = status.ordered_media_attachments.first
+        item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size)
+      end
+
+      status.ordered_media_attachments.each do |media|
+        item.media_content(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) do |media_content|
+          media_content.medium(media.gifv? ? 'image' : media.type.to_s)
+          media_content.rating(status.sensitive? ? 'adult' : 'nonadult')
+          media_content.description(media.description) if media.description.present?
+          media_content.thumbnail(media.thumbnail.url(:original, false)) if media.thumbnail?
+        end
+      end
+
+      status.tags.each do |tag|
+        item.category(tag.name)
+      end
+    end
+  end
+end
diff --git a/app/views/admin/custom_emojis/new.html.haml b/app/views/admin/custom_emojis/new.html.haml
index 95996dec8..1ea931a2f 100644
--- a/app/views/admin/custom_emojis/new.html.haml
+++ b/app/views/admin/custom_emojis/new.html.haml
@@ -7,7 +7,7 @@
   .fields-group
     = f.input :shortcode, wrapper: :with_label, label: t('admin.custom_emojis.shortcode'), hint: t('admin.custom_emojis.shortcode_hint')
   .fields-group
-    = f.input :image, wrapper: :with_label, input_html: { accept: CustomEmoji::IMAGE_MIME_TYPES.join(' ') }, hint: t('admin.custom_emojis.image_hint', size: number_to_human_size(CustomEmoji::LIMIT))
+    = f.input :image, wrapper: :with_label, input_html: { accept: CustomEmoji::IMAGE_MIME_TYPES.join(' ') }, hint: t('admin.custom_emojis.image_hint', size: number_to_human_size(CustomEmoji::LOCAL_LIMIT))
 
   .actions
     = f.button :button, t('admin.custom_emojis.upload'), type: :submit
diff --git a/app/views/admin/export_domain_allows/new.html.haml b/app/views/admin/export_domain_allows/new.html.haml
new file mode 100644
index 000000000..dc0cf8c52
--- /dev/null
+++ b/app/views/admin/export_domain_allows/new.html.haml
@@ -0,0 +1,10 @@
+- content_for :page_title do
+  = t('.title')
+
+= simple_form_for @import, url: import_admin_export_domain_allows_path, html: { multipart: true } do |f|
+  .fields-row
+    .fields-group.fields-row__column.fields-row__column-6
+      = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data'), as: :file
+
+  .actions
+    = f.button :button, t('imports.upload'), type: :submit
diff --git a/app/views/admin/export_domain_blocks/_domain_block.html.haml b/app/views/admin/export_domain_blocks/_domain_block.html.haml
new file mode 100644
index 000000000..5d4b6c4d0
--- /dev/null
+++ b/app/views/admin/export_domain_blocks/_domain_block.html.haml
@@ -0,0 +1,27 @@
+- existing_relationships ||= false
+
+.batch-table__row{ class: [existing_relationships && 'batch-table__row--attention'] }
+  %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
+    = f.check_box :enabled, checked: !existing_relationships
+  .batch-table__row__content.pending-account
+    .pending-account__header
+      %strong
+        = f.object.domain
+      = f.hidden_field :domain
+      = f.hidden_field :severity
+      = f.hidden_field :reject_media
+      = f.hidden_field :reject_reports
+      = f.hidden_field :obfuscate
+      = f.hidden_field :private_comment
+      = f.hidden_field :public_comment
+
+      %br/
+
+      = f.object.policies.map { |policy| t(policy, scope: 'admin.instances.content_policies.policies') }.join(' • ')
+      - if f.object.public_comment.present?
+        •
+        = f.object.public_comment
+      - if existing_relationships
+        •
+        = fa_icon 'warning fw'
+        = t('admin.export_domain_blocks.import.existing_relationships_warning')
diff --git a/app/views/admin/export_domain_blocks/import.html.haml b/app/views/admin/export_domain_blocks/import.html.haml
new file mode 100644
index 000000000..01add232d
--- /dev/null
+++ b/app/views/admin/export_domain_blocks/import.html.haml
@@ -0,0 +1,21 @@
+- content_for :page_title do
+  = t('admin.export_domain_blocks.import.title')
+
+%p= t('admin.export_domain_blocks.import.description_html')
+
+- if defined?(@global_private_comment) && @global_private_comment.present?
+  %p= t('admin.export_domain_blocks.import.private_comment_description_html', comment: @global_private_comment)
+
+= form_for(@form, url: batch_admin_domain_blocks_path) do |f|
+  .batch-table
+    .batch-table__toolbar
+      %label.batch-table__toolbar__select.batch-checkbox-all
+        = check_box_tag :batch_checkbox_all, nil, false
+      .batch-table__toolbar__actions
+        = f.button safe_join([fa_icon('copy'), t('admin.domain_blocks.import')]), name: :save, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
+    .batch-table__body
+      - if @domain_blocks.empty?
+        = nothing_here 'nothing-here--under-tabs'
+      - else
+        = f.simple_fields_for :domain_blocks, @domain_blocks do |ff|
+          = render 'domain_block', f: ff, existing_relationships: @warning_domains.include?(ff.object.domain)
diff --git a/app/views/admin/export_domain_blocks/new.html.haml b/app/views/admin/export_domain_blocks/new.html.haml
new file mode 100644
index 000000000..0291aeed7
--- /dev/null
+++ b/app/views/admin/export_domain_blocks/new.html.haml
@@ -0,0 +1,10 @@
+- content_for :page_title do
+  = t('.title')
+
+= simple_form_for @import, url: import_admin_export_domain_blocks_path, html: { multipart: true } do |f|
+  .fields-row
+    .fields-group.fields-row__column.fields-row__column-6
+      = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data'), as: :file
+
+  .actions
+    = f.button :button, t('imports.upload'), type: :submit
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index ee1b3d0ce..abb2d8c0e 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -4,8 +4,12 @@
 - content_for :heading_actions do
   - if whitelist_mode?
     = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button', id: 'add-instance-button'
+    = link_to t('admin.domain_allows.export'), export_admin_export_domain_allows_path(format: :csv), class: 'button'
+    = link_to t('admin.domain_allows.import'), new_admin_export_domain_allow_path, class: 'button'
   - else
     = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button', id: 'add-instance-button'
+    = link_to t('admin.domain_blocks.export'), export_admin_export_domain_blocks_path(format: :csv), class: 'button'
+    = link_to t('admin.domain_blocks.import'), new_admin_export_domain_block_path, class: 'button'
 
 .filters
   .filter-subset
diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml
index 0b71e14a3..1be50331a 100644
--- a/app/views/disputes/strikes/show.html.haml
+++ b/app/views/disputes/strikes/show.html.haml
@@ -3,8 +3,8 @@
 
 - content_for :heading_actions do
   - if @appeal.persisted?
-    = link_to t('admin.accounts.approve'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal)
-    = link_to t('admin.accounts.reject'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal)
+    = link_to t('disputes.strikes.approve_appeal'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal)
+    = link_to t('disputes.strikes.reject_appeal'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal)
 
 - if @strike.overruled?
   %p.hint
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index 7b672bda7..6192f293a 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -65,6 +65,6 @@
       - elsif status.private_visibility? || status.limited_visibility?
         = fa_icon 'lock fw'
       - else
-        = fa_icon 'envelope fw'
+        = fa_icon 'at fw'
     = link_to remote_interaction_path(status, type: :favourite), class: 'status__action-bar-button icon-button modal-button' do
       = fa_icon 'star fw'
diff --git a/app/views/tags/show.rss.ruby b/app/views/tags/show.rss.ruby
new file mode 100644
index 000000000..f4481b81c
--- /dev/null
+++ b/app/views/tags/show.rss.ruby
@@ -0,0 +1,35 @@
+RSS::Builder.build do |doc|
+  doc.title("##{@tag.name}")
+  doc.description(I18n.t('rss.descriptions.tag', hashtag: @tag.name))
+  doc.link(tag_url(@tag))
+  doc.last_build_date(@statuses.first.created_at) if @statuses.any?
+  doc.logo(full_pack_url('media/images/logo_transparent_white.svg'))
+  doc.generator("Mastodon v#{Mastodon::Version.to_s}")
+
+  @statuses.each do |status|
+    doc.item do |item|
+      item.title(l(status.created_at))
+      item.link(ActivityPub::TagManager.instance.url_for(status))
+      item.pub_date(status.created_at)
+      item.description(rss_status_content_format(status))
+
+      if status.ordered_media_attachments.first&.audio?
+        media = status.ordered_media_attachments.first
+        item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size)
+      end
+
+      status.ordered_media_attachments.each do |media|
+        item.media_content(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) do |media_content|
+          media_content.medium(media.gifv? ? 'image' : media.type.to_s)
+          media_content.rating(status.sensitive? ? 'adult' : 'nonadult')
+          media_content.description(media.description) if media.description.present?
+          media_content.thumbnail(media.thumbnail.url(:original, false)) if media.thumbnail?
+        end
+      end
+
+      status.tags.each do |tag|
+        item.category(tag.name)
+      end
+    end
+  end
+end
diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb
index 474b4daaf..59cdbc7b2 100644
--- a/app/workers/distribution_worker.rb
+++ b/app/workers/distribution_worker.rb
@@ -3,14 +3,11 @@
 class DistributionWorker
   include Sidekiq::Worker
   include Redisable
+  include Lockable
 
   def perform(status_id, options = {})
-    RedisLock.acquire(redis: redis, key: "distribute:#{status_id}", autorelease: 5.minutes.seconds) do |lock|
-      if lock.acquired?
-        FanOutOnWriteService.new.call(Status.find(status_id), **options.symbolize_keys)
-      else
-        raise Mastodon::RaceConditionError
-      end
+    with_lock("distribute:#{status_id}") do
+      FanOutOnWriteService.new.call(Status.find(status_id), **options.symbolize_keys)
     end
   rescue ActiveRecord::RecordNotFound
     true
diff --git a/app/workers/scheduler/indexing_scheduler.rb b/app/workers/scheduler/indexing_scheduler.rb
new file mode 100644
index 000000000..3a6f47a29
--- /dev/null
+++ b/app/workers/scheduler/indexing_scheduler.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Scheduler::IndexingScheduler
+  include Sidekiq::Worker
+  include Redisable
+
+  sidekiq_options retry: 0
+
+  def perform
+    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) }
+        end
+      end
+    end
+  end
+
+  def indexes
+    [AccountsIndex, TagsIndex, StatusesIndex]
+  end
+end
diff --git a/chart/templates/configmap-env.yaml b/chart/templates/configmap-env.yaml
index 5e0620998..aa242684f 100644
--- a/chart/templates/configmap-env.yaml
+++ b/chart/templates/configmap-env.yaml
@@ -83,6 +83,9 @@ data:
   SMTP_TLS: {{ .Values.mastodon.smtp.tls | quote }}
   {{- end }}
   STREAMING_CLUSTER_NUM: {{ .Values.mastodon.streaming.workers | quote }}
+  {{- if .Values.mastodon.streaming.base_url }}
+  STREAMING_API_BASE_URL: {{ .Values.mastodon.streaming.base_url | quote }}
+  {{- end }}
   {{- if .Values.externalAuth.oidc.enabled }}
   OIDC_ENABLED: {{ .Values.externalAuth.oidc.enabled | quote }}
   OIDC_DISPLAY_NAME: {{ .Values.externalAuth.oidc.display_name }}
@@ -300,4 +303,4 @@ data:
   {{- if .Values.externalAuth.ldap.uid_conversion.replace }}
   LDAP_UID_CONVERSION_REPLACE: {{ .Values.externalAuth.ldap.uid_conversion.replace }}
   {{- end }}
-  {{- end }}
\ No newline at end of file
+  {{- end }}
diff --git a/chart/values.yaml b/chart/values.yaml
index ef105f625..2cfa3484b 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -8,7 +8,7 @@ image:
   # built from the most recent commit
   #
   # tag: latest
-  tag: v3.5.1
+  tag: v3.5.2
   # use `Always` when using `latest` tag
   pullPolicy: IfNotPresent
 
@@ -83,6 +83,9 @@ mastodon:
     # the node running the pod, which is unrelated to the resources allocated to
     # the pod by k8s
     workers: 1
+    # The base url for streaming can be set if the streaming API is deployed to
+    # a different domain/subdomain.
+    # base_url: wws://streaming.example.com
   web:
     port: 3000
 
diff --git a/config/application.rb b/config/application.rb
index 5a42e8797..5b571fc32 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -38,7 +38,7 @@ require_relative '../lib/mastodon/version'
 require_relative '../lib/mastodon/rack_middleware'
 require_relative '../lib/devise/two_factor_ldap_authenticatable'
 require_relative '../lib/devise/two_factor_pam_authenticatable'
-require_relative '../lib/chewy/strategy/custom_sidekiq'
+require_relative '../lib/chewy/strategy/mastodon'
 require_relative '../lib/webpacker/manifest_extensions'
 require_relative '../lib/webpacker/helper_extensions'
 require_relative '../lib/rails/engine_extensions'
diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb
index f303fc54d..752fc3c6d 100644
--- a/config/initializers/chewy.rb
+++ b/config/initializers/chewy.rb
@@ -13,15 +13,14 @@ Chewy.settings = {
   journal: false,
   user: user,
   password: password,
-  sidekiq: { queue: 'pull' },
 }
 
 # We use our own async strategy even outside the request-response
 # cycle, which takes care of checking if Elasticsearch is enabled
 # or not. However, mind that for the Rails console, the :urgent
 # strategy is set automatically with no way to override it.
-Chewy.root_strategy              = :custom_sidekiq
-Chewy.request_strategy           = :custom_sidekiq
+Chewy.root_strategy              = :mastodon
+Chewy.request_strategy           = :mastodon
 Chewy.use_after_commit_callbacks = false
 
 module Chewy
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index f78db8653..84b649f5c 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -128,6 +128,13 @@ Doorkeeper.configure do
   #
   force_ssl_in_redirect_uri false
 
+  # Specify what redirect URI's you want to block during Application creation.
+  # Any redirect URI is whitelisted by default.
+  #
+  # You can use this option in order to forbid URI's with 'javascript' scheme
+  # for example.
+  forbid_redirect_uri { |uri| %w[data vbscript javascript].include?(uri.scheme.to_s.downcase) }
+
   # Specify what grant flows are enabled in array of Strings. The valid
   # strings and the flows they enable are:
   #
diff --git a/config/locales-glitch/en.yml b/config/locales-glitch/en.yml
index 3b554f4a2..78933f54e 100644
--- a/config/locales-glitch/en.yml
+++ b/config/locales-glitch/en.yml
@@ -4,6 +4,26 @@ en:
     custom_emojis:
       batch_copy_error: 'An error occurred when copying some of the selected emoji: %{message}'
       batch_error: 'An error occurred: %{message}'
+    domain_allows:
+      export: Export
+      import: Import
+    domain_blocks:
+      export: Export
+      import: Import
+    export_domain_allows:
+      new:
+        title: Import domain allows
+      no_file: No file selected
+    export_domain_blocks:
+      import:
+        description_html: You are about to import a list of domain blocks. Please review this list very carefully, especially if you have not authored this list yourself.
+        existing_relationships_warning: Existing follow relationships
+        private_comment_description_html: 'To help you track where imported blocks come from, imported blocks will be created with the following private comment: <q>%{comment}</q>'
+        private_comment_template: Imported from %{source} on %{date}
+        title: Import domain blocks
+      new:
+        title: Import domain blocks
+      no_file: No file selected
     settings:
       captcha_enabled:
         desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration.<br>Users that have been invited through a limited-use invite will not need to solve a CAPTCHA
diff --git a/config/locales-glitch/simple_form.ko.yml b/config/locales-glitch/simple_form.ko.yml
index cd9910337..f5575ed4c 100644
--- a/config/locales-glitch/simple_form.ko.yml
+++ b/config/locales-glitch/simple_form.ko.yml
@@ -18,3 +18,7 @@ ko:
         setting_hide_followers_count: 내 팔로워 수 숨기기
         setting_skin: 스킨
         setting_system_emoji_font: 에모지에 시스템 기본 폰트 적용하기 (글리치 풍미에만 적용됨)
+      notification_emails:
+        trending_tag: 새로 유행중인 해시태그에 대한 리뷰가 필요할 때
+        trending_link: 새로 유행중인 링크에 대한 리뷰가 필요할 때
+        trending_status: 새로 유행중인 게시물에 대한 리뷰가 필요할 때
diff --git a/config/locales/activerecord.af.yml b/config/locales/activerecord.af.yml
index 252f9fd5a..8882df613 100644
--- a/config/locales/activerecord.af.yml
+++ b/config/locales/activerecord.af.yml
@@ -1 +1,32 @@
+---
 af:
+  activerecord:
+    attributes:
+      poll:
+        expires_at: Sperdatum
+        options: Keuses
+      user:
+        agreement: Diensooreenkoms
+        email: E-pos adres
+        locale: Plaaslik
+        password: Wagwoord
+      user/account:
+        username: Gebruikersnaam
+      user/invite_request:
+        text: Rede
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: moet slegs letters, nommers en onderstrepe bevat
+              reserved: is gereserveer
+        status:
+          attributes:
+            reblog:
+              taken: van plasing bestaan reeds
+        user:
+          attributes:
+            email:
+              blocked: maak gebruik van 'n e-pos verskaffer wat nie toegelaat word nie
+              unreachable: blyk nie te bestaan nie
diff --git a/config/locales/activerecord.ckb.yml b/config/locales/activerecord.ckb.yml
index 8da0598a1..0dc0fd7a3 100644
--- a/config/locales/activerecord.ckb.yml
+++ b/config/locales/activerecord.ckb.yml
@@ -5,13 +5,28 @@ ckb:
       poll:
         expires_at: وادەی کۆتایی
         options: هەڵبژاردنەکان
+      user:
+        agreement: ڕێکەوتنی خزمەتگوزاری
+        email: ناونیشانی ئیمەیڵ
+        locale: ناوچەیی
+        password: تێپەڕوشە
+      user/account:
+        username: ناوی بەکارهێنەر
+      user/invite_request:
+        text: هۆکار
     errors:
       models:
         account:
           attributes:
             username:
               invalid: تەنها پیت، ژمارە و ژێرەوە
+              reserved: تەرخان کراوە
         status:
           attributes:
             reblog:
               taken: لە بار بوونی هەیە
+        user:
+          attributes:
+            email:
+              blocked: دابینکەرێکی ئیمەیڵی ڕێگەپێنەدراو بەکاردەهێنێت
+              unreachable: پێناچێت بوونی هەبێت
diff --git a/config/locales/activerecord.he.yml b/config/locales/activerecord.he.yml
index e3b363efc..5dc8ddc96 100644
--- a/config/locales/activerecord.he.yml
+++ b/config/locales/activerecord.he.yml
@@ -1,13 +1,32 @@
 ---
 he:
   activerecord:
+    attributes:
+      poll:
+        expires_at: מועד אחרון
+        options: ברירות
+      user:
+        agreement: הסכם שירות
+        email: כתובת דוא"ל
+        locale: הגדרות אזוריות
+        password: סיסמא
+      user/account:
+        username: שם משתמש/ת
+      user/invite_request:
+        text: סיבה
     errors:
       models:
         account:
           attributes:
             username:
               invalid: ספרות, אותיות לטיניות וקו תחתי בלבד
+              reserved: שמור
         status:
           attributes:
             reblog:
               taken: של החצרוץ כבר קיים
+        user:
+          attributes:
+            email:
+              blocked: עושה שימוש בספק דוא"ל אסור
+              unreachable: נראה שלא קיים
diff --git a/config/locales/af.yml b/config/locales/af.yml
index 4afb11de5..bc54cfdfd 100644
--- a/config/locales/af.yml
+++ b/config/locales/af.yml
@@ -1,5 +1,21 @@
 ---
 af:
+  about:
+    contact_unavailable: NVT
+    continue_to_web: Gaan voort na web toepassing
+    discover_users: Verken gebruikers
+    documentation: Dokumentasie
+    federation_hint_html: Met 'n rekening op %{instance} sal jy in staat wees om mense op enige Mastodon en federasie bediener te volg.
+    get_apps: Probeer 'n mobiele toepassing
+    hosted_on: Mastodon gehuisves op %{domain}
+  admin:
+    trends:
+      only_allowed: Slegs toegelate
+      trending: Gewild
+  disputes:
+    strikes:
+      approve_appeal: Aanvaar appêl
+      reject_appeal: Verwerp appêl
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
@@ -10,3 +26,11 @@ af:
     '429': Too many requests
     '500': 
     '503': The page could not be served due to a temporary server failure.
+  rss:
+    content_warning: 'Inhoud waarskuwing:'
+    descriptions:
+      account: Publieke plasings vanaf @%{acct}
+      tag: 'Publieke plasings met die #%{hashtag} etiket'
+  strikes:
+    errors:
+      too_late: Dit is te laat om hierdie staking te appelleer
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index aba42bb43..d4cc81f1b 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -295,6 +295,7 @@ ar:
         update_domain_block: تحديث كتلة النطاق
         update_status: تحديث الحالة
       actions:
+        approve_user_html: قبل %{name} تسجيل %{target}
         assigned_to_self_report_html: قام %{name} بتعيين التقرير %{target} لأنفسهم
         change_email_user_html: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target}
         confirm_user_html: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}"
@@ -324,6 +325,7 @@ ar:
         enable_user_html: قام %{name} بتنشيط تسجيل الدخول للمستخدم %{target}
         memorialize_account_html: قام %{name} بتحويل حساب %{target} إلى صفحة تذكارية
         promote_user_html: قام %{name} بترويج المستخدم %{target}
+        reject_user_html: رفض %{name} تسجيل %{target}
         remove_avatar_user_html: قام %{name} بإزالة صورة %{target} الرمزية
         reopen_report_html: قام %{name} بإعادة فتح الشكوى %{target}
         reset_password_user_html: قام %{name} بإعادة تعيين كلمة مرور المستخدم %{target}
@@ -378,6 +380,7 @@ ar:
       enable: تفعيل
       enabled: مُشغَّل
       enabled_msg: تم تنشيط ذاك الإيموجي بنجاح
+      image_hint: ملف PNG أو GIF لا يتعدى %{size}
       list: القائمة
       listed: مُدرَج
       new:
@@ -468,16 +471,20 @@ ar:
       back_to_limited: محدود
       back_to_warning: تحذير
       by_domain: النطاق
+      confirm_purge: هل أنت متأكد من أنك تريد حذف البيانات من هذا النطاق بشكل دائم؟
       content_policies:
         comment: ملاحظة داخلية
+        description_html: يمكنك تحديد سياسات المحتوى التي سيتم تطبيقها على جميع حسابات هذا النطاق وأي من نطاقاته الفرعية.
         policies:
           reject_media: رفض الوسائط
           reject_reports: رفض الشكاوى
+          silence: كتم
         policy: القواعد
         reason: السبب العلني
         title: سياسات المحتوى
       dashboard:
         instance_accounts_dimension: الحسابات الأكثر متابعة
+        instance_accounts_measure: حسابات مخزنة
         instance_languages_dimension: اللغات الأكثر استخدامًا
       delivery:
         all: الكل
@@ -489,6 +496,13 @@ ar:
       delivery_error_days: أيام أخطاء التوصيل
       delivery_error_hint: إذا كان التوصيل غير ممكناً لـ%{count} يوم، فستوضع عليها علامة {غير قابلة للتسليم} تلقائياً.
       empty: لم يتم العثور على نطاقات.
+      known_accounts:
+        few: "%{count} حسابات معروفة"
+        many: "%{count} حسابًا معروفًا"
+        one: حساب %{count} معروف
+        other: "%{count} حساب معروف"
+        two: حسابان %{count} معروفان
+        zero: "%{count} حسابًا معروفًا"
       moderation:
         all: كافتها
         limited: محدود
@@ -558,6 +572,8 @@ ar:
           zero: "%{count} ملاحظات"
       action_log: سجل المراجعة
       action_taken_by: تم اتخاذ الإجراء مِن طرف
+      actions:
+        resolve_description_html: ولن يُتخذ أي إجراء ضد الحساب المبلّغ عنه، ولن تسلَّط عليه أية عقوبة، وسوف يُغلق التقرير.
       add_to_report: أضف المزيد إلى التقرير
       are_you_sure: هل أنت متأكد ؟
       assign_to_self: عين لي
@@ -566,6 +582,7 @@ ar:
       category: الفئة
       comment:
         none: لا شيء
+      comment_description_html: 'لتوفير المزيد من المعلومات، كتب %{name}:'
       created_at: ذكرت
       delete_and_resolve: احذف المنشورات
       forwarded: أُعيد توجيهه
@@ -581,6 +598,7 @@ ar:
         delete: حذف
         placeholder: قم بوصف الإجراءات التي تم اتخاذها أو أي تحديثات أخرى ذات علاقة...
         title: الملاحظات
+      remote_user_placeholder: المستخدم البعيد من %{instance}
       reopen: إعادة فتح الشكوى
       report: 'الشكوى #%{id}'
       reported_account: حساب مُبلّغ عنه
@@ -708,6 +726,8 @@ ar:
       title: منشورات الحساب
       with_media: تحتوي على وسائط
     strikes:
+      actions:
+        suspend: قام %{name} بتعليق حساب %{target}
       appeal_approved: طُعِن فيه
       appeal_pending: طعن قيد المراجعة
     system_checks:
@@ -762,6 +782,7 @@ ar:
         usable: يمكن استخدامه
         usage_comparison: تم استخدامه %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس
       title: المتداوَلة
+      trending: المتداولة
     warning_presets:
       add_new: إضافة واحد جديد
       delete: حذف
@@ -940,9 +961,11 @@ ar:
       appealed_msg: تم تقديم طعنك. إذا تمت الموافقة عليه، سيتم إبلاغك.
       appeals:
         submit: تقديم طعن
+      approve_appeal: الموافقة على الطعن
       associated_report: التقرير المتربط
       created_at: بتاريخ
       recipient: موجّه إلى
+      reject_appeal: رفض الطعن
       status: 'المنشور #%{id}'
       title: "%{action} في %{date}"
       title_actions:
@@ -1260,6 +1283,10 @@ ar:
     reply:
       proceed: المواصلة إلى الرد
       prompt: 'ترغب في الرد على هذا المنشور:'
+  rss:
+    content_warning: 'تحذير عن المحتوى:'
+    descriptions:
+      account: منشورات للعلن مِن @%{acct}
   scheduled_statuses:
     over_daily_limit: لقد تجاوزتَ حد الـ %{limit} منشورات مُبَرمَجة مسموح بها اليوم
     over_total_limit: لقد بلغت حد الـ %{limit} مِن المنشورات المبرمَجة
@@ -1326,6 +1353,7 @@ ar:
     profile: الملف التعريفي
     relationships: المتابِعون والمتابَعون
     statuses_cleanup: الحذف الآلي للمنشورات
+    strikes: عقوبات الإشراف
     two_factor_authentication: المُصادقة بخُطوَتَيْن
     webauthn_authentication: مفاتيح الأمان
   statuses:
@@ -1368,6 +1396,7 @@ ar:
     open_in_web: افتح في الويب
     over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها
     pin_errors:
+      direct: لا يمكن تثبيت المنشورات التي يراها فقط المتسخدمون المشار إليهم
       limit: لقد بلغت الحد الأقصى للمنشورات المثبتة
       ownership: لا يمكن تثبيت منشور نشره شخص آخر
       reblog: لا يمكن تثبيت ترقية
@@ -1564,7 +1593,10 @@ ar:
       title: المغادرة بأرشيف الحساب
     suspicious_sign_in:
       change_password: غيّر كلمتك السرية
+      details: 'فيما يلي تفاصيل تسجيل الدخول:'
+      explanation: لقد اكتشفنا تسجيل دخول إلى حسابك من عنوان IP جديد.
       subject: تم النفاذ عبر حسابك من خلال عنوان إيبي جديد
+      title: تسجيل دخول جديد
     warning:
       appeal: تقديم طعن
       appeal_description: إذا كنت تعتقد أن هذا خطأ، يمكنك تقديم طعن إلى فريق %{instance}.
@@ -1572,11 +1604,15 @@ ar:
         spam: مزعج
         violation: ينتهك المحتوى المبادئ التوجيهية التالية للمجتمع
       explanation:
+        delete_statuses: لوحظ أنّ بعض منشوراتك تخالف واحدة أو أكثر من المبادئ التوجيهية للمجتمع وقد تم إزالتها إثر ذلك من قِبل مشرفي %{instance}.
+        disable: تم إيقاف حسابك، لكن ملفك الشخصي وكافة بياناتك لا زالت سليمة. يمكنك طلب نسخة احتياطية من بياناتك وتغيير إعدادات حسابك أو حذفه.
         sensitive: من الآن فصاعدا، سيتم وضع علامة على جميع ملفات الوسائط التي يتم تحميلها على أنها حساسة وستكون مخفية خلف تحذير يُنقر.
         silence: لا يزال بإمكانك استخدام حسابك ولكن فقط الأشخاص الذين يتابعونك فقط يمكنهم رؤية منشوراتك على هذا الخادم، وقد يتم استبعادك من ميزات الاكتشاف المختلفة. قد يتبعك آخرون على كل حال يدوياً.
+        suspend: لم يعد بإمكانك استخدام حسابك، والوصول إلى ملفك الشخصي والبيانات الأخرى. لا يزال بإمكانك تسجيل الدخول لطلب نسخة احتياطية من بياناتك حتى تتم إزالة البيانات بالكامل في غضون 30 يوما. ولكننا سنحتفظ ببعض البيانات الأساسية لمنعك من التهرب من عقوبة تعليق الحساب.
       reason: 'السبب:'
       statuses: 'المنشورات المذكورة:'
       subject:
+        delete_statuses: تم إزالة منشوراتك على %{acct}
         disable: تم تجميد حسابك %{acct}
         none: تحذير إلى %{acct}
         silence: إنّ حسابك %{acct} محدود
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 48895f860..a9bcbbdf7 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -220,6 +220,8 @@ ast:
   disputes:
     strikes:
       appeal_rejected: Refugóse l'apellación
+      approve_appeal: Aprobar l'apellación
+      reject_appeal: Refugar l'apellación
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Nun tienes permisu pa ver esta páxina.
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 3e1c1c6b7..0017ee42e 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -17,15 +17,15 @@ ca:
     contact_missing: No configurat
     contact_unavailable: N/D
     continue_to_web: Continua a l'aplicació web
-    discover_users: Descobreix usuaris
+    discover_users: Descobrir usuaris
     documentation: Documentació
     federation_hint_html: Amb un compte de %{instance}, podràs seguir persones de qualsevol servidor Mastodon i de molts més.
-    get_apps: Prova una aplicació mòbil
+    get_apps: Provar una aplicació mòbil
     hosted_on: Mastodon allotjat a %{domain}
     instance_actor_flash: |
       Aquest compte és un actor virtual usat per representar el servidor i no qualsevol usuari individual.
       Es fa servir per a propòsits de federació i no s'ha de ser bloquejar si no voleu bloquejar tota la instància. En aquest cas, hauríeu d'utilitzar un bloqueig de domini.
-    learn_more: Més informació
+    learn_more: Aprèn més
     logged_in_as_html: Actualment has iniciat sessió com a %{username}.
     logout_before_registering: Ja has iniciat sessió.
     privacy_policy: Política de privadesa
@@ -73,7 +73,7 @@ ca:
     moved_html: "%{name} s'ha mogut a %{new_profile_link}:"
     network_hidden: Aquesta informació no està disponible
     nothing_here: No hi ha res aquí!
-    people_followed_by: Usuaris seguits per %{name}
+    people_followed_by: Persones seguides per %{name}
     people_who_follow: Usuaris que segueixen %{name}
     pin_errors:
       following: Has d'estar seguint la persona que vulguis avalar
@@ -231,7 +231,7 @@ ca:
       whitelisted: Llista blanca
     action_logs:
       action_types:
-        approve_appeal: Aprova Apel·lació
+        approve_appeal: Aprova l'apel·lació
         approve_user: Aprova l'usuari
         assigned_to_self_report: Assigna l'informe
         change_email_user: Canvia l'adreça electrònica per l'usuari
@@ -263,7 +263,7 @@ ca:
         enable_user: Activa l'usuari
         memorialize_account: Memoritza el compte
         promote_user: Promou l'usuari
-        reject_appeal: Rebutja Apel·lació
+        reject_appeal: Rebutja l'apel·lació
         reject_user: Rebutja l'usuari
         remove_avatar_user: Eliminar avatar
         reopen_report: Reobre l'informe
@@ -415,7 +415,7 @@ ca:
       website: Lloc web
     disputes:
       appeals:
-        empty: Cap apel·lació trobada.
+        empty: No s'ha trobat cap apel·lació.
         title: Apel·lacions
     domain_allows:
       add_new: Dominis autoritzats
@@ -911,7 +911,7 @@ ca:
     settings: 'Canvia les preferències de correu: %{link}'
     view: 'Visualització:'
     view_profile: Mostra el perfil
-    view_status: Mostra l'estat
+    view_status: Mostra la publicació
   applications:
     created: L'aplicació s'ha creat correctament
     destroyed: L'aplicació s'ha suprimit correctament
@@ -1031,15 +1031,17 @@ ca:
       action_taken: Acció presa
       appeal: Apel·lació
       appeal_approved: L'acció ha estat apel·lada amb èxit i ja no és vàlida
-      appeal_rejected: L'apel·lació ha estat rebutjada
-      appeal_submitted_at: Apel·lació tramesa
-      appealed_msg: La teva apel·lació ha estat emesa. Si és aprovada, seràs notificat.
+      appeal_rejected: S'ha rebutjat l'apel·lació
+      appeal_submitted_at: Apel·lació enviada
+      appealed_msg: La teva apel·lació s'ha enviat. Et notificarem si s'aprova.
       appeals:
-        submit: Apel·lació emesa
+        submit: Envia l'apel·lació
+      approve_appeal: Aprova l'apel·lació
       associated_report: Informe associat
       created_at: Datada
       description_html: Aquestes son accions preses contra el teu compte i avisos que se t'han enviat per l'equip de %{instance}.
       recipient: Dirigida a
+      reject_appeal: Rebutja l'apel·lació
       status: 'Publicació #%{id}'
       status_removed: Publicació ja esborrada del sistema
       title: "%{action} del %{date}"
@@ -1052,7 +1054,7 @@ ca:
         silence: Limitació del compte
         suspend: Suspensió del compte
       your_appeal_approved: La teva apel·lació s'ha aprovat
-      your_appeal_pending: Has tramés una apel·lació
+      your_appeal_pending: Has enviat una apel·lació
       your_appeal_rejected: La teva apel·lació ha estat rebutjada
   domain_validator:
     invalid_domain: no es un nom de domini vàlid
@@ -1124,7 +1126,7 @@ ca:
     delete: Esborra
     none: Cap
     order_by: Ordena per
-    save_changes: Desar els canvis
+    save_changes: Desa els canvis
     today: avui
     validation_errors:
       one: Alguna cosa no va bé! Si us plau, revisa l'error
@@ -1150,7 +1152,7 @@ ca:
     upload: Carrega
   in_memoriam_html: En Memòria.
   invites:
-    delete: Desactivar
+    delete: Desactiva
     expired: Caducat
     expires_in:
       '1800': 30 minuts
@@ -1354,6 +1356,11 @@ ca:
   reports:
     errors:
       invalid_rules: no fa referència a normes vàlides
+  rss:
+    content_warning: 'Avís de contingut:'
+    descriptions:
+      account: Publicacions des de @%{acct}
+      tag: 'Publicacions etiquetades #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Has superat el límit de %{limit} publicacions programades per a avui
     over_total_limit: Has superat el límit de %{limit} publicacions programades
@@ -1399,14 +1406,14 @@ ca:
     revoke: Revoca
     revoke_success: S'ha revocat la sessió amb èxit
     title: Sessions
-    view_authentication_history: Veure l'historial d'autenticació del teu compte
+    view_authentication_history: Mostra l'historial d'autenticació del compte
   settings:
     account: Compte
     account_settings: Configuració del compte
     aliases: Àlies de compte
     appearance: Aparença
     authorized_apps: Aplicacions autoritzades
-    back: Tornar a Mastodon
+    back: Torna a Mastodon
     delete: Eliminació del compte
     development: Desenvolupament
     edit_profile: Edita el perfil
@@ -1474,7 +1481,7 @@ ca:
       unlisted: No llistat
       unlisted_long: Tothom ho pot veure, però no es mostra en les línies de temps públiques
   statuses_cleanup:
-    enabled: Esborrar automàticament publicacions antigues
+    enabled: Esborra automàticament publicacions antigues
     enabled_hint: Suprimeix automàticament les teves publicacions quan arribin a un llindar d’edat especificat, tret que coincideixin amb una de les excepcions següents
     exceptions: Excepcions
     explanation: Com que suprimir publicacions és una operació cara, es fa lentament amb el pas del temps i quan el servidor no està ocupat. Per aquest motiu, és possible que les teves publicacions se suprimeixin un temps després d’assolir el llindar d’edat.
@@ -1503,7 +1510,7 @@ ca:
       '604800': 1 setmana
       '63113904': 2 anys
       '7889238': 3 mesos
-    min_age_label: Llindar d'edat
+    min_age_label: Antiguitat
     min_favs: Mantenir les publicacions afavorides més de
     min_favs_hint: No suprimeix cap de les teves publicacions que hagin rebut més d'aquesta quantitat de favorits. Deixa-ho en blanc per suprimir publicacions independentment del nombre de favorits que tinguin
     min_reblogs: Mantenir les publicacions impulsades més de
@@ -1512,6 +1519,9 @@ ca:
     pinned: Publicació fixada
     reblogged: ha impulsat
     sensitive_content: Contingut sensible
+  strikes:
+    errors:
+      too_late: És massa tard per a apel·lar aquesta acció
   tags:
     does_not_match_previous_name: no coincideix amb el nom anterior
   terms:
@@ -1624,11 +1634,11 @@ ca:
   user_mailer:
     appeal_approved:
       action: Ves al teu compte
-      explanation: La apel·lació a la acció contra el teu compte del %{strike_date} que has tramés el %{appeal_date} ha estat aprovada. El teu compte està un cop més al dia.
-      subject: La teva apel·lació de %{date} ha estat aprovada
+      explanation: L'apel·lació a l'acció contra el teu compte del %{strike_date} que has enviat el %{appeal_date} ha estat aprovada. El teu compte torna a estar en bon estat.
+      subject: La teva apel·lació del %{date} ha estat aprovada
       title: Apel·lació aprovada
     appeal_rejected:
-      explanation: La apel·lació a la acció contra el teu compte del %{strike_date} que has tramés el %{appeal_date} ha estat rebutjada.
+      explanation: L'apel·lació a l'acció contra el teu compte del %{strike_date} que has enviat el %{appeal_date} ha estat rebutjada.
       subject: La teva apel·lació del %{date} ha estat rebutjada
       title: Apel·lació rebutjada
     backup_ready:
@@ -1643,8 +1653,8 @@ ca:
       subject: El teu compte ha estat accedit des d'una nova adreça IP
       title: Un nou inici de sessió
     warning:
-      appeal: Trametre una apel·lació
-      appeal_description: Si creus que això és un error pots emetre una apel·lació al equip de %{instance}.
+      appeal: Envia una apel·lació
+      appeal_description: Si creus que això és un error, pots enviar una apel·lació a l'equip de %{instance}.
       categories:
         spam: Contingut brossa
         violation: El contingut viola les següents guies de la comunitat
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index 14ff930fe..ee0f31344 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -7,6 +7,7 @@ ckb:
     active_count_after: چالاک
     active_footnote: بەکارهێنەرانی چالاکی مانگانە (MAU)
     administered_by: 'بەڕێوەبراو لەلایەن:'
+    api: API
     apps: ئەپەکانی مۆبایل
     apps_platforms: بەکارهێنانی ماستۆدۆن لە iOS، ئەندرۆید و سەکۆکانی تر
     browse_directory: گەڕان لە ڕێبەرێکی پرۆفایل و پاڵاوتن بەپێی بەرژەوەندیەکان
@@ -24,13 +25,17 @@ ckb:
       ئەم هەژمارەیە ئەکتەرێکی خەیاڵی بەکارهاتووە بۆ نوێنەرایەتی کردنی خودی ڕاژەکە و نەک هیچ بەکارهێنەرێکی تاک.
       بۆ مەبەستی فیدراسیۆن بەکاردێت و نابێت بلۆک بکرێت مەگەر دەتەوێت هەموو نمونەکە بلۆک بکەیت، کە لە حاڵەتەش دا پێویستە بلۆکی دۆمەین بەکاربهێنیت.
     learn_more: زیاتر فێربه
+    logged_in_as_html: لە ئێستادا تۆ وەک %{username} چوویتە ژوورەوە.
+    logout_before_registering: تۆ پێشتر چوویتە ژوورەوە.
     privacy_policy: ڕامیاری تایبەتێتی
+    rules: یاساکانی سێرڤەر
+    rules_html: 'لە خوارەوە کورتەیەک لەو یاسایانە دەخەینەڕوو کە پێویستە پەیڕەوی لێبکەیت ئەگەر بتەوێت ئەکاونتێکت هەبێت لەسەر ئەم سێرڤەرەی ماستۆدۆن:'
     see_whats_happening: بزانە چی ڕوودەدات
     server_stats: 'زانیاری ڕاژەکار:'
     source_code: کۆدی سەرچاوە
     status_count_after:
       one: دۆخ
-      other: دۆخەکان
+      other: پۆست
     status_count_before: لە لایەن یەکەوە
     tagline: دوای هاوڕێکان بکەوە و ئەوانەی نوێ بدۆزیەوە
     terms: مەرجەکانی خزمەتگوزاری
@@ -59,6 +64,7 @@ ckb:
       one: شوێنکەوتوو
       other: شوێن‌کەوتووان
     following: شوێن‌کەوتووی
+    instance_actor_flash: ئەم ئەکاونتە ئەکتەرێکی مەجازییە کە بەکاردێت بۆ نوێنەرایەتیکردنی خودی سێرڤەرەکە نەک هیچ بەکارهێنەرێکی تاکەکەسی. بۆ مەبەستی فیدراسیۆن بەکاردێت و نابێت ڕابگیرێت.
     joined: بەشداری %{date}
     last_active: دوا چالاکی
     link_verified_on: خاوەنداریەتی ئەم لینکە لە %{date} چێک کراوە
@@ -107,11 +113,13 @@ ckb:
       confirm: پشتڕاستی بکەوە
       confirmed: پشتڕاست کرا
       confirming: پشتڕاستکردنەوە
+      custom: ڕاسپێراو
       delete: سڕینەوەی داتا
       deleted: سڕینەوە
       demote: پلە نزمکرایەوە
       destroyed_msg: دراوەکانی %{username} لە ڕیزی سڕینەوەن
       disable: بەستن
+      disable_sign_in_token_auth: ڕەسەنایەتی نیشانەی ئیمەیڵ لەکاربخە
       disable_two_factor_authentication: لەکارخستنی 2FA
       disabled: بەستوو
       display_name: ناوی پیشاندان
@@ -120,12 +128,14 @@ ckb:
       email: پۆستی ئەلکترۆنی
       email_status: دۆخی ئیمەیڵ
       enable: چالاک کردن
+      enable_sign_in_token_auth: ڕەسەنایەتی نیشانەی ئیمەیڵ چالاک بکە
       enabled: چالاککراوە
       enabled_msg: هەژمارە %{username} بە سەرکەوتوویی سنووردار کرا
       followers: شوێنکەوتوان
       follows: شوێنکەوتوان
       header: سەرپەڕە
       inbox_url: نیشانی هاتنەژوور
+      invite_request_text: هۆکارەکانی بەشداریکردن
       invited_by: هاتۆتە ژورەوە لە لایەن
       ip: ئای‌پی
       joined: ئەندام بوو لە
@@ -153,6 +163,7 @@ ckb:
       not_subscribed: بەشدار نەبوو
       pending: پێداچوونەوەی چاوەڕوان
       perform_full_suspension: ڕاگرتن
+      previous_strikes: مانگرتنەکانی پێشوو
       promote: بەرزکردنەوە
       protocol: پرۆتۆکۆل
       public: گشتی
@@ -181,6 +192,9 @@ ckb:
       search: گەڕان
       search_same_email_domain: بەکارهێنەرانی دیکە بە ئیمەیلی یەکسان
       search_same_ip: بەکارهێنەرانی تر بەهەمان ئای پی
+      security_measures:
+        only_password: تەنها وشەی نهێنی
+        password_and_2fa: وشەی نهێنی و 2FA
       sensitive: هەستیار
       sensitized: وەک هەستیار نیشان کراوە
       shared_inbox_url: بەستەری سندوقی هاوبەشکراو
@@ -209,6 +223,8 @@ ckb:
       whitelisted: پێرستی ڕێپێدراو
     action_logs:
       action_types:
+        approve_appeal: پەسەندکردنی تانەدان
+        approve_user: پەسەندکردنی بەکارهێنەر
         assigned_to_self_report: تەرخانکردنی گوزارشت
         change_email_user: گۆڕینی ئیمەیڵ بۆ بەکارهێنەر
         confirm_user: دڵنیابوون لە بەکارهێنەر
@@ -219,21 +235,28 @@ ckb:
         create_domain_block: دروستکردنی بلۆکی دۆمەین
         create_email_domain_block: دروستکردنی بلۆکی دۆمەینی ئیمەیڵ
         create_ip_block: دروستکردنی یاسای IP
+        create_unavailable_domain: دروستکردنی دۆمەینی بەردەست نییە
         demote_user: دابەزاندنی ئاستی بەکارهێنەر
         destroy_announcement: سڕینەوەی راگەیەندراو
         destroy_custom_emoji: سڕینەوەی ئێمۆمۆجی تایبەتمەند
         destroy_domain_allow: سڕینەوەی ڕێپێدان بە دۆمەین
         destroy_domain_block: سڕینەوەی بلۆکی دۆمەین
         destroy_email_domain_block: سڕینەوەی بلۆکی دۆمەینی ئیمەیڵ
+        destroy_instance: پاککردنەوەی دۆمەین
         destroy_ip_block: سڕینەوەی یاسای IP
         destroy_status: دۆخ بسڕەوە
+        destroy_unavailable_domain: دۆمەینی بەردەست نییە بسڕەوە
         disable_2fa_user: لەکارخستنی 2FA
         disable_custom_emoji: سڕینەوەی ئێمۆمۆجی تایبەتمەند
+        disable_sign_in_token_auth_user: ڕەسەنایەتی نیشانەی ئیمەیڵ بۆ بەکارهێنەر لەکاربخە
         disable_user: بەکارهێنەر لە کاربخە
         enable_custom_emoji: ئیمۆمۆجی تایبەتمەند چالاک بکە
+        enable_sign_in_token_auth_user: ڕەسەنایەتی نیشانەی ئیمەیڵ بۆ بەکارهێنەر چالاک بکە
         enable_user: چالاککردنی بەکارهێنەر
         memorialize_account: هەژماری بیرکەوتنەوە
         promote_user: بەرزکردنەوەی بەکارهێنەر
+        reject_appeal: تانەدان ڕەتبکەرەوە
+        reject_user: بەکارهێنەر ڕەت بکەرەوە
         remove_avatar_user: لابردنی وێنۆجکە
         reopen_report: دووبارە کردنەوەی گوزارشت
         reset_password_user: گەڕانەوەی تێپەڕوشە
@@ -242,12 +265,16 @@ ckb:
         silence_account: هەژماری بێدەنگی
         suspend_account: ڕاگرتنی هەژمارە
         unassigned_report: گوزارشتی دیارینەکراو
+        unblock_email_account: ناونیشانی ئیمەیڵەکە بلۆک بکەرەوە
         unsensitive_account: میدیاکە لە هەژمارەکەت وەک هەستیار نیشانە مەکە
         unsilence_account: هەژماری بێ دەنگ
         unsuspend_account: هەژماری هەڵنەوەستێنراو
         update_announcement: بەڕۆژکردنەوەی راگەیەندراو
         update_custom_emoji: بەڕۆژکردنی ئێمۆمۆجی دڵخواز
+        update_domain_block: نوێکردنەوەی بلۆکی دۆمەین
         update_status: بەڕۆژکردنی دۆخ
+      actions:
+        update_status_html: "%{name} پۆستی نوێکراوە لەلایەن %{target}"
       deleted_status: "(نووسراوە سڕاوە)"
       empty: هیچ لاگی کارنەدۆزرایەوە.
       filter_by_action: فلتەر کردن بە کردار
@@ -262,10 +289,12 @@ ckb:
       new:
         create: دروستکردنی راگەیەندراو
         title: ڕاگەیاندنی نوێ
+      publish: بڵاوی بکەوە
       published_msg: بانگەوازەکە بە سەرکەوتوویی بڵاو کرایەوە!
       scheduled_for: خشتەکراوە بۆ %{time}
       scheduled_msg: ڕاگەیاندنی خشتەی بۆ بڵاوکردنەوە!
       title: ڕاگه یه نراوەکان
+      unpublish: بڵاونەکردنەوە
       unpublished_msg: بانگەواز بە سەرکەوتوویی بڵاونەکرایەوە!
       updated_msg: بانگەوازەکە بە سەرکەوتوویی نوێکرایەوە!
     custom_emojis:
@@ -285,6 +314,7 @@ ckb:
       enable: چالاککردن
       enabled: چالاککراوە
       enabled_msg: ئەو ئیمۆجییە بە سەرکەوتووانە چالاک کرا
+      image_hint: PNG یا GIF بۆ %{size}
       list: پێرست
       listed: پێرستکراوە
       new:
@@ -301,11 +331,25 @@ ckb:
       updated_msg: ئیمۆجی بە سەرکەوتوویی نوێکرایەوە!
       upload: بارکردن
     dashboard:
+      active_users: بەکارهێنەرانی چالاک
+      interactions: پیکداچوونەوەکان
+      media_storage: هەمارگەی میدیا
+      new_users: ئەندامی نوێ
+      opened_reports: ڕاپۆرتەکان کرانەوە
+      resolved_reports: ڕاپۆرتەکان چارەسەر کران
       software: نەرمەکالا
+      sources: سەرچاوەی ناو تۆمارکردن
       space: بەکارهێنانی بۆشایی
       title: داشبۆرد
+      top_languages: زمانە چالاکەکانی سەرەوە
+      top_servers: سەرەکیترین سێرڤەرە چالاکەکان
+      website: ماڵپەڕ
+    disputes:
+      appeals:
+        empty: هیچ تانەیەک نەدۆزراوەتەوە.
+        title: تانەدان
     domain_allows:
-      add_new: ڕێپێدان بە دۆمەین
+      add_new: ڕێگە بە فیدراسیۆن بدە لەگەڵ دۆمەین
       created_msg: دۆمەین بە سەرکەوتوویی رێگەی پێدرا
       destroyed_msg: دۆمەین لە پێرستی رێگەی پێدرا لابرا
       undo: لابردن لە پێرستی ڕێپێدراو
@@ -325,6 +369,8 @@ ckb:
           silence: بێدەنگ
           suspend: ڕاگرتن
         title: بلۆکی دۆمەینی نوێ
+      obfuscate: ناوی دۆمەینەکە تەمومژاوی بکە
+      obfuscate_hint: ناوی دۆمەینەکە لە لیستی ریکلامەکاندا بەشێکی تەمومژاوی بکە لیستی سنووردارکردنی دۆمەینەکە چالاک کراوە
       private_comment: لێدوانی تایبەت
       private_comment_hint: لێدوان دەربارەی سنوورداری ئەم دۆمەینە بۆ بەکارهێنانی ناوخۆیی لەلایەن مۆدەرەکان.
       public_comment: سەرنجی گشتی
@@ -339,26 +385,87 @@ ckb:
       add_new: زیادکردنی نوێ
       created_msg: بە سەرکەوتوویی دۆمەینی ئیمەیڵ بلۆک کرا
       delete: سڕینەوە
+      dns:
+        types:
+          mx: تۆماری MX
       domain: دۆمەین
       new:
         create: زیادکردنی دۆمەین
+        resolve: چارەسەرکردنی دۆمەین
         title: بلۆککردنی دۆمەینی ئیمەیڵی نوێ
+      no_email_domain_block_selected: هیچ بلۆکێکی دۆمەینی ئیمەیڵ نەگۆڕدرا چونکە هیچیان هەڵنەبژێردرابوون
+      resolved_dns_records_hint_html: ناوی دۆمەینەکە چارەسەر دەبێت بۆ ئەم دۆمەینانەی خوارەوەی MX، کە لە کۆتاییدا بەرپرسیارن لە وەرگرتنی ئیمەیڵ. ڕێگریکردن لە دۆمەینی MX ڕێگری دەکات لە ناو تۆمارکردن لە هەر ناونیشانێکی ئیمەیڵەوە کە هەمان دۆمەینی MX بەکاردەهێنێت، تەنانەت ئەگەر ناوی دۆمەینی بینراو جیاواز بێت. <strong>ئاگاداربە کە دابینکەرانی ئیمەیڵی سەرەکی بلۆک نەکەیت.</strong>
+      resolved_through_html: لە ڕێگەی %{domain} چارەسەر دەکرێت
       title: دۆمەینە بلۆککراوەکانی ئیمەیڵ
+    follow_recommendations:
+      description_html: "<strong>پەیڕەوکردنی پێشنیارەکان یارمەتی بەکارهێنەرانی نوێ دەدەن بە خێرایی ناوەڕۆکی سەرنجڕاکێش بدۆزنەوە</strong>. کاتێک بەکارهێنەرێک ئەوەندە کارلێکی لەگەڵ کەسانی دیکە نەکردووە کە پێشنیاری بەدواداچوونی کەسی پێکبهێنێت، لەبری ئەوە ئەم ئەکاونتانە پێشنیار دەکرێن. ئەوان ڕۆژانە لە تێکەڵەیەک لە ئەکاونتەکانەوە دووبارە حیساب دەکرێنەوە کە بەرزترین پەیوەندییەکانی ئەم دواییە و بەرزترین ژمارەی فۆڵۆوەری ناوخۆیی بۆ زمانێکی دیاریکراویان هەیە."
+      language: بۆ زمان
+      status: دۆخ
+      suppress: سەرکوتکردنی پێشنیاری شوێنکەوتن
+      suppressed: سەرکوت کراوە
+      title: پێشنیارەکان جێبەجێ بکە
+      unsuppress: گەڕاندنەوە بەدواداچوون بۆ پێشنیارەکان
     instances:
+      availability:
+        failure_threshold_reached: ئاستی شکست گەیشتە %{date}.
+        no_failures_recorded: هیچ شکستێک لە تۆماردا نییە.
+        title: بەردەست بوونی
+        warning: دوایین هەوڵ بۆ پەیوەندیکردن بەم سێرڤەرە سەرکەوتوو نەبوو
+      back_to_all: هەمووی
+      back_to_limited: سنووردار
+      back_to_warning: ئاگاداری
       by_domain: دۆمەین
+      confirm_purge: ئایا دڵنیای کە دەتەوێت بۆ هەمیشە زانیارییەکان لەم دۆمەینە بسڕیتەوە?
+      content_policies:
+        comment: تێبینی ناوخۆیی
+        description_html: دەتوانیت سیاسەتی ناوەڕۆک پێناسە بکەیت کە بۆ هەموو ئەکاونتەکان لەم دۆمەین و هەر یەکێک لە دۆمەینەکانی لاوەکییەوە جێبەجێ دەکرێن.
+        policies:
+          reject_media: میدیا ڕەت بکەرەوە
+          reject_reports: گوزارشتەکان ڕەت بکەوە
+          silence: سنوور
+          suspend: ڕاگرتن
+        policy: سیاسەت
+        reason: هۆکاری گشتی
+        title: سیاسەتەکانی ناوەڕۆک
+      dashboard:
+        instance_accounts_dimension: زۆرترین هەژمارەی بەدواداچوو
+        instance_accounts_measure: هەژمارەی هەڵگیراوەکان
+        instance_followers_measure: شوێنکەوتووانمان لەوێ
+        instance_follows_measure: شوێنکەوتووانمان لێرە
+        instance_languages_dimension: زمانە سەرەکییەکان
+        instance_media_attachments_measure: هاوپێچەکانی میدیای هەڵگیراو
+        instance_reports_measure: گوزارشت له باره یان
+        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:
+        one: "%{count} ئەژمێری ناسراو"
+        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:
@@ -403,38 +510,73 @@ ckb:
     report_notes:
       created_msg: تێبینی ڕاپۆرت کردن بە سەرکەوتوویی دروست کرا!
       destroyed_msg: تێبینی گوزارشت بە سەرکەوتوویی سڕاوەتەوە!
+      today_at: ئەمڕۆ لە %{time}
     reports:
       account:
         notes:
           one: "%{count} یاداشت"
-          other: "%{count} یاداشت"
+          other: "%{count} تێبینی"
+      action_log: لۆگی وردبینی
       action_taken_by: کردەوە لە لایەن
+      actions:
+        delete_description_html: ئەو پۆستانەی کە ڕاپۆرت کراون دەسڕدرێنەوە و مانگرتنێک تۆمار دەکرێت بۆ ئەوەی یارمەتیت بدات لەسەر پێشێلکارییەکانی داهاتوو لەلایەن هەمان ئەکاونتەوە زیاد بکەیت.
+        mark_as_sensitive_description_html: میدیاکان لە پۆستە ڕاپۆرتکراوەکاندا وەک هەستیار نیشانە دەکرێن و مانگرتنێک تۆمار دەکرێت بۆ ئەوەی یارمەتیت بدات لەسەر پێشێلکارییەکانی داهاتوو لەلایەن هەمان ئەکاونتەوە زیاد بکەیت.
+        other_description_html: بژاردەی زیاتر ببینە بۆ کۆنترۆڵکردنی هەڵسوکەوتی ئەکاونتەکە و خۆکارکردنی پەیوەندی بۆ ئەژمێری ڕاپۆرتکراو.
+        resolve_description_html: هیچ ئیجرائاتێک لە دژی ئەو حسابە ڕاپۆرت کراوە ناگیرێتەبەر، هیچ مانگرتنێک تۆمار ناکرێت، ڕاپۆرتەکەش دادەخرێت.
+        silence_description_html: پرۆفایلەکە تەنها بۆ ئەو کەسانە دیار دەبێت کە پێشتر فۆڵۆوی دەکەن یان بە دەست سەیری دەکەن، ئەمەش گەیشتنەکەی بە توندی سنووردار دەکات. هەمیشە دەتوانرێت بگەڕێندرێتەوە.
+        suspend_description_html: پرۆفایلەکە و هەموو ناوەڕۆکەکانی دەستڕاگەیشتنیان پێناگات تا لە کۆتاییدا دەسڕدرێتەوە. کارلێککردن لەگەڵ ئەکاونتەکەدا مەحاڵ دەبێت. لە ماوەی ٣٠ ڕۆژدا دەگەڕێتەوە.
+      actions_description_html: بڕیار بدە کام رێوشوێن بگیرێتەبەر بۆ چارەسەرکردنی ئەم راپۆرتە. ئەگەر تۆ ڕێوشوێنی سزادان لە دژی ئەژمێری ڕاپۆرتکراو بگریتەبەر، ئاگادارکردنەوەیەکی ئیمەیڵیان بۆ دەنێردرێت، تەنها کاتێک نەبێت کە پۆلی <strong>سپام</strong> هەڵبژێردرابێت.
+      add_to_report: زیاتر زیاد بکە بۆ ڕاپۆرت
       are_you_sure: دڵنیای?
       assign_to_self: دیاریکردن بۆ من
       assigned: بەڕێوەبەری بەرپرس
       by_target_domain: دۆمەینی هەژمارەی گوزارشتدراو
+      category: جۆر
+      category_description_html: هۆکاری ڕاپۆرتکردنی ئەم ئەکاونتە و/یان ناوەڕۆکە لە پەیوەندی لەگەڵ ئەکاونتی ڕاپۆرتکراودا ئاماژەی پێدەکرێت
       comment:
         none: هیچ
+      comment_description_html: 'بۆ پێدانی زانیاری زیاتر %{name} نووسیویەتی:'
       created_at: گوزارشتکرا
+      delete_and_resolve: پۆستەکان بسڕەوە
+      forwarded: پێشکەش دەکرێت
+      forwarded_to: پێشکەش دەکرێت بۆ %{domain}
       mark_as_resolved: نیشانەی بکە وەک چارەسەرکراو
+      mark_as_sensitive: نیشانەکردن وەک هەستیار
       mark_as_unresolved: نیشانەکردن وەک چارەسەرنەکراوە
+      no_one_assigned: هیچکەس
       notes:
         create: زیادکردنی تێبینی
         create_and_resolve: چارەسەر کردن لەگەڵ تێبینی
         create_and_unresolve: دووبارە کردنەوەی بە تێبینی
         delete: سڕینەوە
         placeholder: باسی ئەو کردارانە بکە کە ئەنجام دراون، یان هەر نوێکردنەوەیەکی پەیوەندیداری ت...
+        title: تێبینی
+      notes_description_html: بینین و تێبینی بۆ بەڕێوەبەرانی تر و خودی داهاتووتان بەجێبهێڵە
+      quick_actions_description_html: 'کارێکی خێرا ئەنجام بدە یان بچۆرە خوارەوە بۆ بینینی ناوەڕۆکی ڕاپۆرتکراو:'
+      remote_user_placeholder: بەکارهێنەری دوور لە %{instance}
       reopen: دووبارە کردنەوەی گوزارشت
       report: 'گوزارشت #%{id}'
       reported_account: گوزارشتی هەژمارە
       reported_by: گوزارشت لە لایەن
       resolved: چارەسەرکرا
       resolved_msg: گوزارشتکردن بە سەرکەوتوویی چارەسەر کرا!
+      skip_to_actions: باز بدە بۆ کردارەکان
       status: دۆخ
+      statuses: ناوەڕۆکی ڕاپۆرتکراو
+      statuses_description_html: ناوەڕۆکی توڕەکەر لە پەیوەندی لەگەڵ ئەکاونتی ڕاپۆرتکراودا ئاماژەی پێدەکرێت
+      target_origin: سەرچاوەی ئەکاونتی ڕاپۆرتکراو
       title: گوزارشتکرا
       unassign: دیارینەکراوە
       unresolved: چارەسەر نەکراوە
       updated_at: نوێکرایەوە
+      view_profile: نیشاندانی پڕۆفایل
+    rules:
+      add_new: یاسا زیاد بکە
+      delete: سڕینەوە
+      description_html: لە کاتێکدا زۆربەیان بانگەشەی ئەوە دەکەن کە مەرجەکانی خزمەتگوزارییان خوێندووەتەوە و ڕازین، بەزۆری خەڵک تا دوای سەرهەڵدانی کێشەیەک ناخوێننەوە. <strong>ئاسانتر بکە بۆ بینینی یاساکانی سێرڤەرەکەت بە چاوێک بە دابینکردنی لە لیستی خاڵە فیشەکییە تەختەکاندا.</strong> هەوڵبدە یاسا تاکەکەسییەکان کورت و سادە بن، بەڵام هەوڵبدە دابەشیان نەکەیت بۆ چەندین بابەتی جیاواز.
+      edit: یاسای دەستکاریکردن
+      empty: هێشتا هیچ یاسایەکی سێرڤەر پێناسە نەکراوە.
+      title: یاساکانی سێرڤەر
     settings:
       activity_api_enabled:
         desc_html: ژماردنی دۆخی بڵاوکراوە ی ناوخۆیی و بەکارهێنەرە چالاکەکان و تۆماری نوێ لە سەتڵی هەفتانە
@@ -483,6 +625,8 @@ ckb:
         min_invite_role:
           disabled: هیچکەس
           title: ڕێپێدانی بانگهێشتەکان لەلایەن
+        require_invite_text:
+          desc_html: کاتێک تۆمارکردنەکان پێویستیان بە ڕەزامەندی دەستی هەیە، "بۆچی دەتەوێت بەشداری بکەیت؟" نووسینی دەق ئیجبارییە نەک ئیختیاری
       registrations_mode:
         modes:
           approved: پەسەندکردنی داواکراو بۆ ناوتۆمارکردن
@@ -569,6 +713,7 @@ ckb:
     toot_layout: لۆی توت
   application_mailer:
     notification_preferences: گۆڕینی پەسەندکراوەکانی ئیمەیڵ
+    salutation: "%{name},"
     settings: 'گۆڕینی پەسەندکراوەکانی ئیمەیڵ: %{link}'
     view: 'نیشاندان:'
     view_profile: پرۆفایل نیشان بدە
@@ -598,11 +743,15 @@ ckb:
     invalid_reset_password_token: وشەی نهێنی دووبارە ڕێکبخەوە دروست نیە یان بەسەرچووە. تکایە داوایەکی نوێ بکە.
     link_to_otp: کۆدی دوو فاکتەر لە تەلەفۆنەکەت یان کۆدی چاککردنەوە تێبنووسە
     link_to_webauth: بەکارهێنانی ئامێری کلیلی پاراستن
+    log_in_with: بڕۆ ژوورەوە ڵەگەڵ
     login: چوونەژوورەوە
     logout: چوونەدەرەوە
     migrate_account: گواستنەوە بۆ ئەژمێرێکی تر
     migrate_account_html: ئەگەر دەتەوێت ئەم هەژمارە دووبارە ئاڕاستە بکەیت بۆ ئەژمێرێکی تر، دەتوانیت <href="%{path}"> کرتەیەک لێرە بکەی </a>.
     or_log_in_with: یان چوونە ژوورەوە بە
+    providers:
+      cas: CAS
+      saml: SAML
     register: خۆ تۆمارکردن
     registration_closed: "%{instance} ئەندامانی نوێ قبووڵ ناکات"
     resend_confirmation: دووبارە ناردنی ڕێنماییەکانی دووپاتکردنەوە
@@ -616,8 +765,11 @@ ckb:
     status:
       account_status: دۆخی هەژمارە
       confirming: چاوەڕوانی دڵنیاکردنەوەی ئیمەیڵ بۆ تەواوکردن.
+      functional: هەژمارەکەت بەتەواوی کاردەکات.
       pending: ئەپلیکەیشەنەکەت چاوەڕوانی پێداچوونەوەیە لەلایەن ستافەکەمانەوە. لەوانەیە ئەمە هەندێک کاتی بخایەنێت ئەگەر ئەۆپەکەت پەسەند کرا، ئیمەیڵت پێدەگات.
       redirecting_to: هەژمارەکەت ناچالاکە لەبەرئەوەی ئێستا دووبارە ئاڕاستەدەکرێتەوە بۆ %{acct}.
+      view_strikes: بینینی لێدانەکانی ڕابردوو لە دژی ئەکاونتەکەت
+    too_fast: فۆڕم زۆر خێرا پێشکەش کراوە، دووبارە هەوڵبدەرەوە.
     trouble_logging_in: کێشە ت هەیە بۆ چوونە ژوورەوە?
     use_security_key: کلیلی ئاسایش بەکاربهێنە
   authorize_follow:
@@ -641,15 +793,24 @@ ckb:
     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}کات"
-      about_x_years: "%{count}ساڵ"
-      almost_x_years: "%{count}ساڵ"
+      about_x_hours: "%{count}ک"
+      about_x_months: "%{count}ما"
+      about_x_years: "%{count}س"
+      almost_x_years: "%{count}س"
       half_a_minute: ئێستا
+      less_than_x_minutes: "%{count}م"
       less_than_x_seconds: ئێستا
-      over_x_years: "%{count}ساڵ"
-      x_days: "%{count}ڕۆژ"
+      over_x_years: "%{count}س"
+      x_days: "%{count}ڕ"
+      x_minutes: "%{count}خ"
+      x_months: "%{count}ما"
+      x_seconds: "%{count}چ"
   deletes:
     challenge_not_passed: ئەو زانیاریانەی تێنووست کردووە ڕاست نەبوو
     confirm_password: تێپەڕوشەی ئێستات تێبنووسە بۆ سەلماندنی ناسنامەکەت
@@ -671,6 +832,10 @@ ckb:
     directory: ڕێنیشاندەرێکی پرۆفایل
     explanation: دۆزینەوەی بەکارهێنەران لەسەر بنەمای بەرژەوەندییەکانیان
     explore_mastodon: گەڕان لە %{title}
+  disputes:
+    strikes:
+      title_actions:
+        none: ئاگاداری
   domain_validator:
     invalid_domain: ناوی دۆمەین بڕوادار نییە
   errors:
@@ -1154,6 +1319,7 @@ ckb:
       title:
         disable: هەژمارە بەستراوە
         none: ئاگاداری
+        sensitive: هەژمارە وەک هەستیار نیشان کراوە
         silence: هەژماری سنووردار
         suspend: هەژمار ڕاگیرا
     welcome:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 717bb5614..61997886a 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1070,10 +1070,12 @@ cs:
       appealed_msg: Vaše odvolání bylo podáno. Pokud bude schváleno, budete informováni.
       appeals:
         submit: Podat odvolání
+      approve_appeal: Schválit odvolání
       associated_report: Přidružené hlášení
       created_at: Datováno
       description_html: Toto jsou kroky podniknuté proti vašemu účtu a varování, která vám byla poslána personálem %{instance}.
       recipient: Adresováno
+      reject_appeal: Zamítnout odvolání
       status: 'Příspěvek #%{id}'
       status_removed: Příspěvek už byl ze systému odstraněn
       title: "%{action} ze dne %{date}"
@@ -1396,6 +1398,11 @@ cs:
   reports:
     errors:
       invalid_rules: neodkazuje na platná pravidla
+  rss:
+    content_warning: 'Varování o obsahu:'
+    descriptions:
+      account: Veřejné příspěvky od @%{acct}
+      tag: 'Veřejné příspěvky s hashtagem #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Překročili jste limit %{limit} příspěvků naplánovaných na tento den
     over_total_limit: Překročili jste limit %{limit} naplánovaných příspěvků
@@ -1566,6 +1573,9 @@ cs:
     pinned: Připnutý příspěvek
     reblogged: boostnul
     sensitive_content: Citlivý obsah
+  strikes:
+    errors:
+      too_late: Na odvolání proti tomuto prohřešku už je pozdě
   tags:
     does_not_match_previous_name: se neshoduje s předchozím názvem
   terms:
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 1b788574e..306df5979 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -7,6 +7,7 @@ cy:
     active_count_after: yn weithredol
     active_footnote: Defnyddwyr Gweithredol Misol (DGM)
     administered_by: 'Gweinyddir gan:'
+    api: API
     apps: Apiau symudol
     apps_platforms: Defnyddio Mastodon o iOS, Android a phlatfformau eraill
     browse_directory: Pori cyfeiriadur proffil a hidlo wrth diddordebau
@@ -24,7 +25,7 @@ cy:
     instance_actor_flash: |
       Mae'r cyfrif hwn yn actor rhithwir a ddefnyddir i gynrychioli'r gweinydd ei hun ac nid unrhyw ddefnyddiwr unigol.
       Fe'i defnyddir at ddibenion ffederasiwn ac ni ddylid ei rwystro oni bai eich bod am rwystro'r achos cyfan, ac os felly dylech ddefnyddio bloc parth.
-    learn_more: Dysu mwy
+    learn_more: Dysgu mwy
     logged_in_as_html: Rydych chi wedi mewngofnodi fel %{username}.
     logout_before_registering: Rydych chi eisoes wedi mewngofnodi.
     privacy_policy: Polisi preifatrwydd
@@ -40,7 +41,7 @@ cy:
       other: statwsau
       two: statwsau
       zero: statwsau
-    status_count_before: Ysgriffennwyd gan
+    status_count_before: Ysgrifennwyd gan
     tagline: Dilyn ffrindiau a darganfod rhai newydd
     terms: Telerau gwasanaeth
     unavailable_content: Cynnwys nad yw ar gael
@@ -76,6 +77,7 @@ cy:
       two: Dilynwyr
       zero: Dilynwyr
     following: Yn dilyn
+    instance_actor_flash: Mae'r cyfrif hwn yn actor rhithwir a ddefnyddir i gynrychioli'r gweinydd ei hun ac nid unrhyw ddefnyddiwr unigol. Fe'i defnyddir at ddibenion ffederasiwn ac ni ddylid ei atal.
     joined: Ymunodd %{date}
     last_active: diweddaraf
     link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date}
@@ -94,8 +96,8 @@ cy:
       other: Tŵtiau
       two: Tŵtiau
       zero: Tŵtiau
-    posts_tab_heading: Tŵtiau
-    posts_with_replies: Tŵtiau ac atebion
+    posts_tab_heading: Postiadau
+    posts_with_replies: Postiadau ac atebion
     roles:
       admin: Gweinyddwr
       bot: Bot
@@ -114,6 +116,7 @@ cy:
     accounts:
       add_email_domain_block: Cosbrestru parth e-bost
       approve: Cymeradwyo
+      approved_msg: Wedi llwyddo cymeradwyo cais cofrestru %{username}
       are_you_sure: Ydych chi'n siŵr?
       avatar: Afatar
       by_domain: Parth
@@ -127,10 +130,13 @@ cy:
       confirm: Cadarnhau
       confirmed: Cadarnhawyd
       confirming: Cadarnhau
+      custom: Arbennig
       delete: Dileu data
       deleted: Wedi dileu
       demote: Diraddio
+      destroyed_msg: Mae data %{username} bellach mewn ciw i gael ei ddileu yn fuan
       disable: Diffodd
+      disable_sign_in_token_auth: Analluogi dilysu tocynnau e-bost
       disable_two_factor_authentication: Diffodd 2FA
       disabled: Wedi ei ddiffodd
       display_name: Enw arddangos
@@ -139,11 +145,14 @@ cy:
       email: E-bost
       email_status: Statws E-bost
       enable: Galluogi
+      enable_sign_in_token_auth: Galluogi dilysu tocynnau e-bost
       enabled: Wedi ei alluogi
+      enabled_msg: Wedi dadrewi cyfrif %{username} yn llwyddianus
       followers: Dilynwyr
       follows: Yn dilyn
       header: Pennawd
       inbox_url: URL Mewnflwch
+      invite_request_text: Rhesymau dros ymuno
       invited_by: Gwahoddwyd gan
       ip: IP
       joined: Ymunodd
@@ -154,7 +163,9 @@ cy:
         title: Lleoliad
       login_status: Statws mewngofnodi
       media_attachments: Atodiadau
-      memorialize: Troi yn gofeb
+      memorialize: Creu cyfrif coffa
+      memorialized: Wedi troi'n gyfrif coffa
+      memorialized_msg: Llwyddodd i droi %{username} yn gyfrif coffa
       moderation:
         active: Yn weithredol
         all: Popeth
@@ -169,12 +180,15 @@ cy:
       not_subscribed: Heb danysgrifio
       pending: Yn aros am adolygiad
       perform_full_suspension: Atal
+      previous_strikes: Rhybuddion blaenorol
       promote: Hyrwyddo
       protocol: Protocol
       public: Cyhoeddus
       push_subscription_expires: Tanysgrifiad gwthiadwy yn dod i ben
       redownload: Adnewyddu proffil
+      redownloaded_msg: Adnewyddwyd proffil %{username} o'r gweinydd gwreiddiol
       reject: Gwrthod
+      rejected_msg: Wedi gwrthod cais cofrestru %{username}
       remove_avatar: Dileu afatar
       remove_header: Dileu pennawd
       resend_confirmation:
@@ -249,6 +263,8 @@ cy:
         update_announcement: Diweddaru Cyhoeddiad
         update_custom_emoji: Diweddaru Emoji Addasiedig
         update_status: Diweddaru Statws
+      actions:
+        memorialize_account_html: Newidodd %{name} gyfrif %{target} i dudalen goffa
       deleted_status: "(statws wedi ei ddileu)"
       empty: Dim logiau ar gael.
       filter_by_action: Hidlo wrth weithred
@@ -347,6 +363,8 @@ cy:
         title: Cofnod newydd yng nghosbrestr e-byst
       title: Cosbrestr e-bost
     instances:
+      back_to_all: Popeth
+      back_to_warning: Rhybudd
       by_domain: Parth
       delivery_available: Mae'r cyflenwad ar gael
       moderation:
@@ -663,8 +681,12 @@ cy:
       username_unavailable: Ni fydd eich enw defnyddiwr ar gael
   directories:
     directory: Cyfeiriadur proffil
-    explanation: Darganfod defnyddwyr yn seiliedig ar eu diddordebau
+    explanation: Darganfod defnyddwyr yn ôl eu diddordebau
     explore_mastodon: Archwilio %{title}
+  disputes:
+    strikes:
+      approve_appeal: Cymeradwyo'r apêl
+      reject_appeal: Gwrthod yr apêl
   domain_validator:
     invalid_domain: ddim yn enw parth dilys
   errors:
@@ -756,7 +778,7 @@ cy:
       following: Rhestr dilyn
       muting: Rhestr tawelu
     upload: Uwchlwytho
-  in_memoriam_html: Mewn Cofiad.
+  in_memoriam_html: Er cof.
   invites:
     delete: Dadactifadu
     expired: Wedi darfod
@@ -863,6 +885,8 @@ cy:
       body: 'Cafodd eich statws ei fŵstio gan %{name}:'
       subject: Bŵstiodd %{name} eich statws
       title: Hwb newydd
+    status:
+      subject: "%{name} newydd ei bostio"
   notifications:
     email_events: Digwyddiadau ar gyfer hysbysiadau e-bost
     email_events_hint: 'Dewis digwyddiadau hoffech derbyn hysbysiadau ar eu cyfer:'
@@ -1036,6 +1060,7 @@ cy:
         zero: "%{count} pleidlais"
       vote: Pleidleisio
     show_more: Dangos mwy
+    show_older: Dangos pethau hŷn
     show_thread: Dangos edefyn
     sign_in_to_participate: Mengofnodwch i gymryd rhan yn y sgwrs
     visibilities:
@@ -1049,6 +1074,9 @@ cy:
     pinned: Tŵt wedi'i binio
     reblogged: hybwyd
     sensitive_content: Cynnwys sensitif
+  strikes:
+    errors:
+      too_late: Mae'n rhy hwyr i apelio yn erbyn y rhybudd hwn
   tags:
     does_not_match_previous_name: ddim yn cyfateb i'r enw blaenorol
   terms:
@@ -1187,5 +1215,5 @@ cy:
     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 a dolen iddi gynnwys dolen yn ôl i''ch proffil Mastodon. <strong>Rhaid</strong> i''r ddolen yn ôl gael nodwedd <code>rel="fi"</code>. Nid oes ots beth yw cynnwys testun y ddolen. Dyma enghraifft:'
+    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:'
     verification: Dilysu
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 28c009ef3..698e772f4 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -517,6 +517,7 @@ da:
       delivery:
         all: Alle
         clear: Ryd leveringsfejl
+        failing: Fejler
         restart: Genstart levering
         stop: Stop levering
         unavailable: Utilgængelig
@@ -843,7 +844,7 @@ da:
           one: Brugt af én person den seneste uge
           other: Brugt af %{count} personer den seneste uge
       title: Trends
-      trending: Populært
+      trending: Populære
     warning_presets:
       add_new: Tilføj ny
       delete: Slet
@@ -1035,10 +1036,12 @@ da:
       appealed_msg: Din appel er indgivet. Godkendes den, underrettes du.
       appeals:
         submit: Indgiv appel
+      approve_appeal: Godkend appel
       associated_report: Tilknyttet anmeldelse
       created_at: Dateret
       description_html: Disse er implementerede handlinger for din konto, samt advarsler tilsendt dig af %{instance}-personalet.
       recipient: Adresseret til
+      reject_appeal: Afvis appel
       status: 'Indlæg #%{id}'
       status_removed: Indlæg allerede fjernet fra system
       title: "%{action} pr. %{date}"
@@ -1353,6 +1356,11 @@ da:
   reports:
     errors:
       invalid_rules: refererer ikke til gyldige regler
+  rss:
+    content_warning: 'Indholdsadvarsel:'
+    descriptions:
+      account: Offentlige indlæg fra @%{acct}
+      tag: 'Offentlige indlæg tagget #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået
     over_total_limit: Grænsen på %{limit} planlagte indlæg er nået
@@ -1511,6 +1519,9 @@ da:
     pinned: Fastgjort indlæg
     reblogged: boostet
     sensitive_content: Sensitivt indhold
+  strikes:
+    errors:
+      too_late: Det er for sent at appellere denne advarsel
   tags:
     does_not_match_previous_name: matcher ikke det foregående navn
   terms:
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 26e914fe7..58be571a8 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -441,7 +441,7 @@ de:
       obfuscate: Domainname verschleiern
       obfuscate_hint: Den Domainnamen in der Liste teilweise verschleiern, wenn die Liste der Domänenbeschränkungen aktiviert ist
       private_comment: Privater Kommentar
-      private_comment_hint: Kommentar zu dieser Domain-Beschränkung für die interne Nutzung durch die Moderatoren.
+      private_comment_hint: Kommentar zu dieser Domain-Beschränkung für die interne Nutzung durch die Moderator_innen.
       public_comment: Öffentlicher Kommentar
       public_comment_hint: Kommentar zu dieser Domain-Beschränkung für die allgemeine Öffentlichkeit, wenn das Veröffentlichen der Blockliste aktiviert ist.
       reject_media: Mediendateien ablehnen
@@ -607,7 +607,7 @@ de:
       add_to_report: Mehr zur Meldung hinzufügen
       are_you_sure: Bist du dir sicher?
       assign_to_self: Mir zuweisen
-      assigned: Zugewiesener Moderator
+      assigned: Zugewiesene_r Moderator_in
       by_target_domain: Domain des gemeldeten Kontos
       category: Kategorie
       category_description_html: Der Grund, warum dieses Konto und/oder der Inhalt gemeldet wurden, wird in der Kommunikation mit dem gemeldeten Konto zitiert
@@ -629,7 +629,7 @@ de:
         delete: Löschen
         placeholder: Beschreibe, welche Maßnahmen ergriffen wurden oder irgendwelche andere Neuigkeiten…
         title: Notizen
-      notes_description_html: Zeige und hinterlasse Notizen an andere Moderatoren und dein zukünftiges Selbst
+      notes_description_html: Zeige und hinterlasse Notizen an andere Moderator_innen und dein zukünftiges Ich
       quick_actions_description_html: 'Führe eine schnelle Aktion aus oder scrolle nach unten, um gemeldete Inhalte zu sehen:'
       remote_user_placeholder: der entfernte Benutzer von %{instance}
       reopen: Meldung wieder eröffnen
@@ -802,6 +802,7 @@ de:
           other: In der letzten Woche von %{count} Personen geteilt
         title: Angesagte Links
         usage_comparison: Heute %{today} mal geteilt, gestern %{yesterday} mal
+      only_allowed: Nur Erlaubte
       pending_review: Überprüfung ausstehend
       preview_card_providers:
         allowed: Links von diesem Herausgeber können angesagt sein
@@ -843,6 +844,7 @@ de:
           one: In der letzten Woche von einer Person genutzt
           other: In der letzten Woche von %{count} Personen genutzt
       title: Trends
+      trending: Häufig diskutiert
     warning_presets:
       add_new: Neu hinzufügen
       delete: Löschen
@@ -1034,10 +1036,12 @@ de:
       appealed_msg: Dein Einspruch wurde abgesendet. Wenn er angenommen wird, wirst du benachrichtigt.
       appeals:
         submit: Einspruch erheben
+      approve_appeal: Einspruch annehmen
       associated_report: Zugehöriger Bericht
       created_at: Datum
       description_html: Dies sind Aktionen gegen dein Konto und Warnungen, die von den Mitarbeitern von %{instance} an dich gesendet wurden.
       recipient: Adressiert an
+      reject_appeal: Einspruch ablehnen
       status: 'Beitrag #%{id}'
       status_removed: Beitrag bereits vom System entfernt
       title: "%{action} vom %{date}"
@@ -1070,7 +1074,7 @@ de:
     '503': Die Seite konnte wegen eines temporären Serverfehlers nicht angezeigt werden.
     noscript_html: Bitte aktiviere JavaScript, um die Mastodon-Web-Anwendung zu verwenden. Alternativ kannst du auch eine der <a href="%{apps_path}">nativen Mastodon-Anwendungen</a> für deine Plattform probieren.
   existing_username_validator:
-    not_found: kann lokalen Benutzer nicht mit diesem Nuternamen finden
+    not_found: kann lokalen Benutzer nicht mit diesem Nutzernamen finden
     not_found_multiple: kann %{usernames} nicht finden
   exports:
     archive_takeout:
@@ -1325,7 +1329,7 @@ de:
     last_active: Zuletzt aktiv
     most_recent: Neuste
     moved: Umgezogen
-    mutual: Bekannt
+    mutual: Gegenseitig
     primary: Primär
     relationship: Beziehung
     remove_selected_domains: Entferne alle Follower von den ausgewählten Domains
@@ -1352,6 +1356,11 @@ de:
   reports:
     errors:
       invalid_rules: verweist nicht auf gültige Regeln
+  rss:
+    content_warning: 'Inhaltswarnung:'
+    descriptions:
+      account: Öffentliche Beiträge von @%{acct}
+      tag: 'Öffentliche Beiträge mit dem Tag #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Du hast das Limit für geplante Beiträge, dass %{limit} beträgt, für heute erreicht
     over_total_limit: Du hast das Limit für geplante Beiträge, dass %{limit} beträgt, erreicht
@@ -1475,7 +1484,7 @@ de:
     enabled: Automatisch alte Beiträge löschen
     enabled_hint: Löscht automatisch deine Beiträge, sobald sie einen bestimmten Altersgrenzwert erreicht haben, es sei denn, sie entsprechen einer der folgenden Ausnahmen
     exceptions: Ausnahmen
-    explanation: Da das Löschen von Beiträgen eine kostspielige Operation ist, geschieht dies langsam im Laufe der Zeit, wenn der Server sonst nicht beschäftigt ist. Aus diesem Grund können deine Beiträge gelöscht werden, eine Weile nachdem sie die Altersgrenze erreicht haben.
+    explanation: Damit Mastodon nicht durch das Löschen von Beiträgen ausgebremst wird, wartet der Server damit bis wenig los ist. Aus diesem Grund werden deine Beiträge ggf. erst einige Zeit nach Erreichen der Altersgrenze gelöscht.
     ignore_favs: Favoriten ignorieren
     ignore_reblogs: Boosts ignorieren
     interaction_exceptions: Ausnahmen basierend auf Interaktionen
@@ -1510,6 +1519,9 @@ de:
     pinned: Angehefteter Beitrag
     reblogged: teilte
     sensitive_content: NSFW
+  strikes:
+    errors:
+      too_late: Es ist zu spät, um gegen diese Verwarnung Einspruch zu erheben
   tags:
     does_not_match_previous_name: entspricht nicht dem vorherigen Namen
   terms:
@@ -1644,14 +1656,14 @@ de:
       title: Eine neue Anmeldung
     warning:
       appeal: Einspruch einsenden
-      appeal_description: Wenn du glaubst, dass dies ein Fehler ist, kannst du einen Einspruch an die Mitarbeiter von %{instance} senden.
+      appeal_description: Wenn du glaubst, dass es sich um einen Fehler handelt, kannst du einen Einspruch an die Administration von %{instance} senden.
       categories:
         spam: Spam
         violation: Inhalt verletzt die folgenden Community-Richtlinien
       explanation:
-        delete_statuses: Einige deiner Beiträge wurden als Verstoß gegen eine oder mehrere Communityrichtlinien erkannt und von den Moderatoren von %{instance} entfernt.
+        delete_statuses: Einige deiner Beiträge wurden als Verstoß gegen eine oder mehrere Communityrichtlinien erkannt und von den Moderator_innen von %{instance} entfernt.
         disable: Du kannst dein Konto nicht mehr verwenden, aber dein Profil und andere Daten bleiben unversehrt. Du kannst ein Backup deiner Daten anfordern, die Kontoeinstellungen ändern oder dein Konto löschen.
-        mark_statuses_as_sensitive: Einige deiner Beiträge wurden von den Moderatoren von %{instance} als NSFW markiert. Das bedeutet, dass die Nutzer die Medien in den Beiträgen antippen müssen, bevor eine Vorschau angezeigt wird. Du kannst Medien in Zukunft als NSFW markieren, wenn du Beiträge verfasst.
+        mark_statuses_as_sensitive: Einige deiner Beiträge wurden von den Moderator_innen von %{instance} als NSFW markiert. Das bedeutet, dass die Nutzer die Medien in den Beiträgen antippen müssen, bevor eine Vorschau angezeigt wird. Du kannst Medien in Zukunft als NSFW markieren, wenn du Beiträge verfasst.
         sensitive: Von nun an werden alle deine hochgeladenen Mediendateien als sensibel markiert und hinter einer Warnung versteckt.
         silence: Solange dein Konto limitiert ist, können nur die Leute, die dir bereits folgen, deine Beiträge auf dem Server sehen und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen.
         suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und andere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um ein Backup deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten speichern, um zu verhindern, dass du die Sperrung umgehst.
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index c94d996fc..e15ff7677 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -23,7 +23,7 @@ ca:
         action: Verifica l'adreça de correu
         action_with_app: Confirma i torna a %{app}
         explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic d'activar-lo. Si no ho has fet tu, ignora aquest correu electrònic.
-        explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Un cop confirmis la teva adreça de correu electrònic, revisarem la teva sol·licitud. Pots iniciar la sessió per canviar els detalls o eliminar el teu compte, però no pots accedir a la majoria de les funcions fins que s'hagi aprovat. Si es rebutja la teva sol·licitud, les teves dades s’eliminaran, de manera que no se t’exigirà cap més acció. Si no has estat tu qui ha fet aquesta sol·licitud, ignora aquest correu electrònic, si us plau.
+        explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Revisarem la sol·licitud quan confirmis la teva adreça de correu electrònic. Pots iniciar la sessió per canviar els detalls o eliminar el teu compte, però no pots accedir a la majoria de les funcions fins que s'hagi aprovat. Si es rebutja la sol·licitud, les teves dades s’eliminaran, de manera que no se t’exigirà cap acció més. Si tu no has fet aquesta sol·licitud, ignora aquest correu electrònic.
         extra_html: Si us plau, consulta també a <a href="%{terms_path}"> les regles del servidor</a> i a <a href="%{policy_path}"> les nostres condicions de servei</a>.
         subject: 'Mastodon: instruccions de confirmació per a %{instance}'
         title: Verifica l'adreça de correu
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index 0bb52d8e2..7ea022992 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -92,7 +92,7 @@ gl:
       signed_up_but_inactive: A túa conta foi rexistada. Porén aínda non está activada.
       signed_up_but_locked: A túa conta foi rexistada. Porén está bloqueada.
       signed_up_but_pending: Unha mensaxe cunha ligazón de confirmación foi enviada ó teu enderezo de email. Após premer na ligazón, revisaremos a túa aplicación. Serás notificado se a túa conta é aprobada.
-      signed_up_but_unconfirmed: Unha mensaxe cunha ligazón de confirmación foi enviada ó teu email. Por favor, segue esa ligazón para activar a túa conta. Comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
+      signed_up_but_unconfirmed: Enviouse unha mensaxe cunha ligazón de confirmación ao teu email. Por favor, preme nesa ligazón para activar a túa conta. Comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
       update_needs_confirmation: Actualizaches a túa conta de xeito correcto, pero precisamos verificar o teu novo enderezo de email. Por favor, revisa o teu email e segue a ligazón para confirmar o teu novo enderezo de email. Comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
       updated: A túa conta foi actualizada de xeito correcto.
     sessions:
diff --git a/config/locales/devise.he.yml b/config/locales/devise.he.yml
index be8af6f9e..63bb3aedd 100644
--- a/config/locales/devise.he.yml
+++ b/config/locales/devise.he.yml
@@ -2,8 +2,8 @@
 he:
   devise:
     confirmations:
-      confirmed: כתובת הדוא"ל אומתה בהצלחה.
-      send_instructions: נשלח אליך דוא"ל עם הוראות לאימות כתובת הדוא"ל שאמור להתקבל בדקות הקרובות. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
+      confirmed: כתובת הדוא"ל שלך אומתה בהצלחה.
+      send_instructions: נשלח אליך דוא"ל עם הוראות לאימות כתובת הדוא"ל שאמור להתקבל בדקות הקרובות. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה.
       send_paranoid_instructions: אם כתובת הדוא"ל שלך קיימת במסד הנתונים, יתקבל בדקות הקרובות דוא"ל עם הוראות לאימות כתובתך. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
     failure:
       already_authenticated: חשבון זה כבר מחובר.
@@ -12,18 +12,71 @@ he:
       last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון.
       locked: חשבון זה נעול.
       not_found_in_database: "%{authentication_keys} או סיסמא לא נכונים."
+      pending: חשבונך נמצא עדיין בבדיקה.
       timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך.
       unauthenticated: יש להרשם או להכנס לחשבון על מנת להמשיך.
       unconfirmed: יש לאמת את כתובת הדוא"ל על מנת להמשיך.
     mailer:
       confirmation_instructions:
+        action: אימות כתובת דוא״ל
+        action_with_app: אישור וחזרה ל-%{app}
+        explanation: יצרת חשבון ב-%{host} עם כתובת דוא"ל זו. רק קליק יחיד נותר כדי להפעילו. אם לא את/ה יצרת את החשבון, בבקשה התעלם/י מהדוא"ל הזה.
+        explanation_when_pending: הוגשה בקשה להזמנה ל-%{host} עם כתובת דוא"ל זו. ברגע שתאשר/י את כתובת הדוא"ל נבחן את בקשתך. ניתן להכנס לאתר על מנת לשנות פרטים או למחוק את החשבון, אבל לא ניתן לגשת לרוב הפעילויות לפני שהחשבון יאושר. אם בקשתך תדחה, המידע שלך יימחק ולא יידרש ממך כל פעולה נוספת. אם בקשה זו לא הגיעה ממך, אנא התעלם/י מדוא"ל זה.
+        extra_html: בנוסף, אנא עיין/י ב<a href="%{terms_path}">חוקי השרת</a> וב<a href="%{policy_path}">תנאי השירות</a>.
         subject: 'מסטודון: הוראות אימות %{instance}'
+        title: אימות כתובת דוא״ל
+      email_changed:
+        explanation: 'כתובת הדוא"ל של חשבונך שונתה ל:'
+        extra: אם לא שינית את כתובת הדוא"ל שלך, יכול להיות שמישהו השתלט על חשבונך. נא לשנות את הסיסמא מיידית או ליצור קשר עם מנהלי השרת אם ננעלת מחוץ לחשבון.
+        subject: 'מסטודון: כתובת הדוא"ל שונתה'
+        title: כתובת דוא״ל חדשה
       password_change:
+        explanation: הסיסמא לחשבונך שונתה.
+        extra: אם לא שינית את סיסמתך, יכול להיות שמישהו השתלט על חשבונך. נא לשנות את הסיסמא מיידית או ליצור קשר עם מנהלי השרת אם ננעלת מחוץ לחשבון.
         subject: 'מסטודון: הסיסמא שונתה'
+        title: הסיסמא שונתה
+      reconfirmation_instructions:
+        explanation: נא לאמת את הכתובת הדוא"ל החדשה על מנת לשנותה.
+        extra: אם שינוי זה לא בוצע על ידך, נא להתעלם מדוא"ל זה. כתובת הדוא"ל של חשבון המסטודון שלך לא תשונה אלא אם תלחץ הקישורית לעיל.
+        subject: 'מסטודון: נא לאשר כתובת דוא"ל עבור %{instance}'
+        title: אימות כתובת דוא״ל
       reset_password_instructions:
+        action: שינוי סיסמא
+        explanation: ביקשת סיסמא חדשה לחשבון.
+        extra: אם לא ביקשת את זה, נא להתעלם מדוא"ל זה. סיסמתך לא תשתנה עוד שתלחץ הקישורית לעיל ותיוצר סיסמא חדשה.
         subject: 'מסטודון: הוראות לאיפוס סיסמא'
+        title: איפוס סיסמה
+      two_factor_disabled:
+        explanation: האימות הדו-גורמי לחשבונך בוטל. ניתן עתה להכנס לחשבון עם כתובת דוא"ל וסיסמא בלבד.
+        subject: 'מסטודון: אימות דו גורמי מושבת'
+        title: אימות דו-גורמי הושעה
+      two_factor_enabled:
+        explanation: אימות דו-גורמי הופעל בחשבונך. עתה על מנת להכנס לחשבון נדרש אסימון המיוצר על אפליקציית ה-TOTP המצומדת.
+        subject: 'מסטודון: אימות דו גורמי הופעל'
+        title: אימות דו־גורמי הופעל
+      two_factor_recovery_codes_changed:
+        explanation: צפני האיחזור הקודמים בוטלו, וחדשים נוצרו.
+        subject: 'מסטודון: צפני אחזור דו-גורמי יוצרו מחדש'
+        title: צפני אחזור דו-גורמי השתנו
       unlock_instructions:
         subject: 'מסטודון: הוראות לביטול נעילה'
+      webauthn_credential:
+        added:
+          explanation: מפתח האבטחה הבא הוסף לחשבונך
+          subject: 'מסטודון: מפתח אבטחה חדש'
+          title: מפתח אבטחה חדש הוסף
+        deleted:
+          explanation: מפתח האבטחה הבא נמחק מחשבונך
+          subject: 'מסטודון: מפתח האבטחה נמחק'
+          title: אחד ממפתחות האבטחה שלך נמחק
+      webauthn_disabled:
+        explanation: בוטלה האפשרות לאמת את חשבונך בעזרת מפתחות אבטחה. כניסה לחשבון אפשרית עכשיו רק בעזרת אסימון שיוצר באפליקציית ה-TOTP המצומדת.
+        subject: 'מסטודון: אימות בעזרת מפתחות אבטחה הושעה'
+        title: מפתחות אבטחה הושעו
+      webauthn_enabled:
+        explanation: אימות בעזרת מפתחות אבטחה הופעלו עבור חשבונך. ניתן עתה להשתמש במפתח האבטחה שלך על מנת להכנס לחשבון.
+        subject: 'מסטודון: אימות בעזרת מפתח אבטחה אופשר'
+        title: מפתחות אבטחה אופשרו
     omniauth_callbacks:
       failure: 'לא ניתן לאמת את חשבונך מ־%{kind} מהסיבה: "%{reason}".'
       success: נכשל אימות מחשבון %{kind}.
@@ -38,6 +91,7 @@ he:
       signed_up: ברוכים הבאים! נרשמת בהצלחה.
       signed_up_but_inactive: נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך עוד לא הופעל.
       signed_up_but_locked: נרשמת בהצלחה. למרות זאת לא הצליחה הכניסה לחשבון מאחר וחשבונך נעול.
+      signed_up_but_pending: מסר עם קישורית אישור נשלח לכתובת הדוא"ל שלך. אחרי לחיצה על הקישורית, נבחן את בקשתך. הודעה תמסר אם בקשתך תתקבל.
       signed_up_but_unconfirmed: דוא"ל עם קישורית לאימות נשלך לכתובתך. נא לעקוב אחר הקישורית על מנת להפעיל את החשבון. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
       update_needs_confirmation: עדכת את חשבונך בהצלחה, אך יש צורך לאמת את כתובת הדוא"ל החדשה שלך. נא לבדוק בחשבון הדוא"ל לקבלת קישורית אימות על מנת לאמת את הכתובת החדשה. יש לבדוק את תיבת הספאם ליתר בטחון אם ההודעה לא הגיעה תוך דקות ספורות.
       updated: חשבונך עודכן בהצלחה.
diff --git a/config/locales/devise.io.yml b/config/locales/devise.io.yml
index fce061a65..7d5668c92 100644
--- a/config/locales/devise.io.yml
+++ b/config/locales/devise.io.yml
@@ -12,18 +12,71 @@ io:
       last_attempt: Tu ankore povas probar unfoye ante ke tua konto esos extingita.
       locked: Tua konto esas extingita.
       not_found_in_database: Nejusta %{authentication_keys}.
+      pending: Vua konti ankore kontrolesas.
       timeout: Tua kunsido expiris. Voluntez rienirar por durar.
       unauthenticated: Tu devas enirar o membreskar por durar.
       unconfirmed: Tu devas konfirmar tua konto por durar.
     mailer:
       confirmation_instructions:
+        action: Verifikez retpostadreso
+        action_with_app: Konfirmez e retrovenez a %{app}
+        explanation: Vu kreis konto che %{host} per ca retpostadreso. Vu povas facile aktivigar lu. Se vu ne agis lu, ignorez ca retposto.
+        explanation_when_pending: Vu aplikis por ganar invito a %{host} per ca retpostkonto. Pos vu konfirmas vua retpostkonto, ni kontrolos vua apliko. Vu povas enirar por chanjar vua detali o efacar vua konto, ma vu ne povas acesar maxim de funcioni til vua konto aprobesas. Se vua apliko refuzesas, vua informi efacesos, do plusa ago ne bezonesos de vu. Se vu ne agis lu, ignorez ca retposto.
+        extra_html: Anke videz <a href="%{terms_path}">reguli di la servilo</a> e <a href="%{policy_path}">nia servokondicioni</a>.
         subject: Instrucioni por konfirmar %{instance}
+        title: Verifikez retpostadreso
+      email_changed:
+        explanation: 'Retpostadreso di vua konto chanjesas a:'
+        extra: Se vu ne chanjesis vua retpostadreso, nulu posible acesis vua konto. Chanjez vua pasvorto quik o kontaktez serviladministratero se vu ne povas enirar vua konto.
+        subject: 'Mastodon: Retpostadreso chanjesis'
+        title: Nova retpostadreso
       password_change:
+        explanation: La pasvorto di vua konto chanjesis.
+        extra: Se vu ne chanjesis vua pasvorto, nulu posible acesis vua konto. Chanjez vua pasvorto quik o kontaktez serviladministratero se vu ne povas enirar vua konto.
         subject: Tua pasvorto chanjesis senprobleme.
+        title: Pasvorto chanjesis
+      reconfirmation_instructions:
+        explanation: Konfirmez la nova adreso por chanjar vua retpostadreso.
+        extra: Se ca chanjo ne komencesis da vu, ignorez ca retposto. La retpostadreso por konto di Mastodon ne chanjesos til vu acesas la supera ligilo.
+        subject: 'Mastodon: Konfirmez retpostadreso por %{instance}'
+        title: Verifikez retpostadreso
       reset_password_instructions:
+        action: Chanjez pasvorto
+        explanation: Vu demandis nova pasvorto por vua konto.
+        extra: Se vu ne demandas co, ignorez ca retposto. Vua pasvorto ne chanjesas til vu acesas la supera ligilo e kreas novo.
         subject: Instrucioni por chanjar la pasvorto
+        title: Richanjo di pasvorto
+      two_factor_disabled:
+        explanation: 2-faktorverifiko por vua konto deaktivigesis. Eniro esas nun posible per nur retpostadreso e pasvorto.
+        subject: 'Mastodon: 2-faktorverifiko deaktivigesis'
+        title: 2FA deaktivigesis
+      two_factor_enabled:
+        explanation: 2-faktorverifiko aktivigesis por vua konto. Fisho quo facesis da parigita softwaro TOTP bezonesos por eniro.
+        subject: 'Mastodon: 2-faktorverifiko aktivigesis'
+        title: 2FA aktivigesis
+      two_factor_recovery_codes_changed:
+        explanation: Antea rigankodexi devalidesis e novo facesis.
+        subject: 'Mastodon: 2-faktorrigankodexi rifacesis'
+        title: 2FA-rigankodexi chanjesis
       unlock_instructions:
         subject: Instructioni por riacendar la konto
+      webauthn_credential:
+        added:
+          explanation: Ca sekurklefo insertesis a vua konto
+          subject: 'Mastodon: Nova sekurklefo'
+          title: Nova sekurklefo insertesis
+        deleted:
+          explanation: Ca sekurklefo efacesis de vua konto
+          subject: 'Mastodon: Sekurklefo efacesis'
+          title: 1 de vua sekurklefi efacesis
+      webauthn_disabled:
+        explanation: Verifiko per sekurklefi deaktivigesis por vua konto. Eniro nun esas posibla per nur ficho quo facesis da parita softwaro TOTP.
+        subject: 'Mastodon: Verifiko per sekurklefi deaktivigesis'
+        title: Sekurklefi deaktivigesis
+      webauthn_enabled:
+        explanation: Sekurklefverifiko aktivigesis por vua konto. Vua sekurklefo nun povas uzesar por eniro.
+        subject: 'Mastodon: Sekurklefverifiko aktivigesis'
+        title: Sekurklefi aktivigesis
     omniauth_callbacks:
       failure: 'Ni ne povis autentikigar tu per %{kind}: ''%{reason}''.'
       success: Autentikigita senprobleme per %{kind}.
@@ -31,12 +84,14 @@ io:
       no_token: Tu ne povas irar a ta pagino per altra voyo kam retpost-mesajo por chanjar pasvorto. Se tu venas de tala retpost-mesajo, kontrolez ke tu uzis la tota URL.
       send_instructions: Tu recevos retpost-mesajo kun instrucioni por chanjar tua pasvorto pos kelka minuti.
       send_paranoid_instructions: Se tua retpost-adreso existas en nia datumbazo, tu recevos ligilo por chanjar tua pasvorto per retpost-mesajo.
+      updated: Vua konto sucese chanjesis. Vu nun eniras.
       updated_not_active: Tua pasvorto redaktesis senprobleme.
     registrations:
       destroyed: Til! Tua konto efacesis senprobleme. Ni esperas rividar tu balde.
       signed_up: Bonveno! Tu membreskis senprobleme.
       signed_up_but_inactive: Tu bone membreskis, ma tu ankore ne povas enirar pro ke tua konto ne konfirmesis.
       signed_up_but_locked: Tu bone membreskis, ma tu ne povas enirar pro ke tua konto extingesis.
+      signed_up_but_pending: Mesajo kun konfirmoligilo sendesis a vua retpostadreso. Pos vu kliktas la ligilo, ni kontrolos vua apliko. Vu notifikesos se ol aprobesas.
       signed_up_but_unconfirmed: Retpost-mesajo kun tua ligilo por konfirmar tua konto sendesis a tua retpost-adreso. Voluntez uzar ta ligilo por konfirmar tua konto.
       update_needs_confirmation: Tu vone aktualigis tua konto, ma ni bezonas kontrolar tua nova retpost-adreso. Voluntez kontrolar tua retpost-mesaji ed uzar la ligilo por konfirmar tua nova retpost-adreso.
       updated: Tua konto aktualigesis senprobleme.
diff --git a/config/locales/devise.ru.yml b/config/locales/devise.ru.yml
index ada7867f2..d2903ce23 100644
--- a/config/locales/devise.ru.yml
+++ b/config/locales/devise.ru.yml
@@ -57,7 +57,7 @@ ru:
       two_factor_recovery_codes_changed:
         explanation: Предыдущие резервные коды были аннулированы и созданы новые.
         subject: 'Mastodon: Резервные коды двуфакторной авторизации обновлены'
-        title: Резервные коды 2ФА изменены
+        title: Коды восстановления 2FA изменены
       unlock_instructions:
         subject: 'Mastodon: Инструкция по разблокировке'
       webauthn_credential:
diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml
index 287ea49c5..e46500796 100644
--- a/config/locales/devise.th.yml
+++ b/config/locales/devise.th.yml
@@ -21,7 +21,7 @@ th:
         action: ยืนยันที่อยู่อีเมล
         action_with_app: ยืนยันแล้วกลับไปยัง %{app}
         explanation: คุณได้สร้างบัญชีใน %{host} ด้วยที่อยู่อีเมลนี้ คุณเหลืออีกคลิกเดียวเพื่อเปิดใช้งานบัญชี หากนี่ไม่ใช่คุณ โปรดเพิกเฉยต่ออีเมลนี้
-        explanation_when_pending: คุณได้สมัครเพื่อขอคำเชิญสู่ %{host} ด้วยที่อยู่อีเมลนี้ เมื่อคุณยืนยันที่อยู่อีเมลของคุณ เราจะตรวจทานใบสมัครของคุณ คุณสามารถเข้าสู่ระบบเพื่อเปลี่ยนรายละเอียดของคุณหรือลบบัญชีของคุณ แต่คุณไม่สามารถเข้าถึงฟังก์ชันส่วนใหญ่ได้จนกว่าจะมีการอนุมัติบัญชีของคุณ หากมีการปฏิเสธใบสมัครของคุณ จะเอาข้อมูลของคุณออก ดังนั้นจึงไม่ต้องมีการกระทำเพิ่มเติมจากคุณ หากนี่ไม่ใช่คุณ โปรดเพิกเฉยต่ออีเมลนี้
+        explanation_when_pending: คุณได้สมัครเพื่อขอคำเชิญสู่ %{host} ด้วยที่อยู่อีเมลนี้ เมื่อคุณยืนยันที่อยู่อีเมลของคุณ เราจะตรวจทานใบสมัครของคุณ คุณสามารถเข้าสู่ระบบเพื่อเปลี่ยนรายละเอียดของคุณหรือลบบัญชีของคุณ แต่คุณไม่สามารถเข้าถึงฟังก์ชันส่วนใหญ่ได้จนกว่าจะมีการอนุมัติบัญชีของคุณ หากมีการปฏิเสธใบสมัครของคุณ จะเอาข้อมูลของคุณออก ดังนั้นจึงไม่ต้องการการกระทำเพิ่มเติมจากคุณ หากนี่ไม่ใช่คุณ โปรดเพิกเฉยต่ออีเมลนี้
         extra_html: นอกจากนี้โปรดตรวจสอบ <a href="%{terms_path}">กฎของเซิร์ฟเวอร์</a> และ <a href="%{policy_path}">เงื่อนไขการให้บริการของเรา</a>
         subject: 'Mastodon: คำแนะนำการยืนยันสำหรับ %{instance}'
         title: ยืนยันที่อยู่อีเมล
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index 910c77e8a..0d9e6a56a 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -7,12 +7,12 @@ zh-TW:
       send_paranoid_instructions: 如果您的電子信箱存在於我們的資料庫,您將會在幾分鐘內收到確認信。若未收到請檢查垃圾郵件資料夾。
     failure:
       already_authenticated: 您已登入。
-      inactive: 您的帳戶尚未啟用。
+      inactive: 您的帳號尚未啟用。
       invalid: 無效的 %{authentication_keys} 或密碼。
-      last_attempt: 在帳戶鎖定前,您還有最後一次嘗試機會。
-      locked: 已鎖定您的帳戶。
+      last_attempt: 在帳號鎖定前,您還有最後一次嘗試機會。
+      locked: 已鎖定您的帳號。
       not_found_in_database: 無效的 %{authentication_keys} 或密碼。
-      pending: 您的帳戶仍在審核中。
+      pending: 您的帳號仍在審核中。
       timeout: 登入階段逾時。請重新登入以繼續。
       unauthenticated: 您必須先登入或註冊才能繼續使用。
       unconfirmed: 您必須先確認電子信箱才能繼續使用。
@@ -20,38 +20,38 @@ zh-TW:
       confirmation_instructions:
         action: 驗證電子信箱地址
         action_with_app: 確認並返回 %{app}
-        explanation: 您已經在 %{host} 上以此電子信箱地址建立了一支帳戶。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。
-        explanation_when_pending: 您使用此電子信箱地址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請。您可以登入以改變您的細節或刪除您的帳戶,但直到您的帳戶被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。
+        explanation: 您已經在 %{host} 上以此電子信箱地址建立了一支帳號。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。
+        explanation_when_pending: 您使用此電子信箱地址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請。您可以登入以改變您的細節或刪除您的帳號,但直到您的帳戶被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。
         extra_html: 同時也請看看<a href="%{terms_path}">伺服器規則</a>與<a href="%{policy_path}">服務條款</a>。
         subject: Mastodon:%{instance} 確認說明
         title: 驗證電子信箱地址
       email_changed:
-        explanation: 您帳戶的電子信箱地址將變更為:
-        extra: 若您未變更電子信箱,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。
+        explanation: 您帳號的電子信箱地址將變更為:
+        extra: 若您未變更電子信箱,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更密碼,或當帳號被鎖定時,請聯絡伺服器的管理員。
         subject: Mastodon:已變更電子信箱
         title: 新電子信箱地址
       password_change:
-        explanation: 您帳戶的密碼已變更。
-        extra: 若您未變更密碼,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。
+        explanation: 您帳號的密碼已變更。
+        extra: 若您未變更密碼,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更密碼,或若帳號被鎖定時,請聯絡伺服器的管理員。
         subject: Mastodon:已變更密碼
         title: 密碼已變更
       reconfirmation_instructions:
         explanation: 請確認新的電子信箱地址以變更。
-        extra: 若此次變更不是由您開啟的,請忽略此信件。Mastodon 帳戶的電子信箱地址在您存取上面的連結前不會變更。
+        extra: 若此次變更不是由您開啟的,請忽略此信件。Mastodon 帳號的電子信箱地址在您存取上面的連結前不會變更。
         subject: Mastodon:確認 %{instance} 的電子信箱地址
         title: 驗證電子信箱地址
       reset_password_instructions:
         action: 變更密碼
-        explanation: 您已請求帳戶的新密碼。
+        explanation: 您已請求帳號的新密碼。
         extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新密碼前不會變更。
         subject: Mastodon:重設密碼指引
         title: 重設密碼
       two_factor_disabled:
-        explanation: 您帳戶的兩步驟驗證已停用。現在只能使用電子信箱及密碼登入。
+        explanation: 您帳號的兩步驟驗證已停用。現在只使用電子信箱及密碼登入。
         subject: Mastodon:已停用兩步驟驗證
         title: 已停用 2FA
       two_factor_enabled:
-        explanation: 已對您的帳戶啟用兩步驟驗證。登入時將需要配對之 TOTP 應用程式所產生的 Token。
+        explanation: 已對您的帳號啟用兩步驟驗證。登入時將需要配對之 TOTP 應用程式所產生的 Token。
         subject: Mastodon:已啟用兩步驟驗證
         title: 已啟用 2FA
       two_factor_recovery_codes_changed:
@@ -62,11 +62,11 @@ zh-TW:
         subject: Mastodon:解鎖指引
       webauthn_credential:
         added:
-          explanation: 下面的安全密鑰已經新增至您的帳戶
+          explanation: 以下的安全密鑰已經新增至您的帳號
           subject: Mastodon:新安全密鑰
           title: 已新增新安全密鑰
         deleted:
-          explanation: 以下的安全密鑰已經從您的帳戶中移除
+          explanation: 以下的安全密鑰已經從您的帳號中移除
           subject: Mastodon:安全密鑰已移除
           title: 您的一支安全密鑰已經被移除
       webauthn_disabled:
@@ -101,8 +101,8 @@ zh-TW:
       signed_out: 已成功登出。
     unlocks:
       send_instructions: 幾分鐘後您將收到解鎖帳戶的指引信件。若未收到請檢查垃圾郵件資料夾。
-      send_paranoid_instructions: 若此帳戶存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
-      unlocked: 已解鎖您的帳戶,請登入繼續。
+      send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
+      unlocked: 已解鎖您的帳號,請登入繼續。
   errors:
     messages:
       already_confirmed: 已經確認,請嘗試登入
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index 07314684d..9019b0fd9 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -60,6 +60,7 @@ ar:
       error:
         title: حدث هناك خطأ
       new:
+        prompt_html: يريد %{client_name} الإذن للوصول إلى حسابك. إنه تطبيق طرف ثالث. <strong>إذا كنت لا تثق فيه، فلا ينبغي أن تأذن له بذلك.</strong>
         review_permissions: مراجعة الصلاحيات
         title: إذن بالتصريح
       show:
diff --git a/config/locales/doorkeeper.ckb.yml b/config/locales/doorkeeper.ckb.yml
index f9a688279..3262cc17f 100644
--- a/config/locales/doorkeeper.ckb.yml
+++ b/config/locales/doorkeeper.ckb.yml
@@ -60,6 +60,8 @@ ckb:
       error:
         title: هەڵەیەک ڕوویدا
       new:
+        prompt_html: "%{client_name} حەز دەکات مۆڵەت بدرێت بۆ چوونە ناو ئەکاونتەکەت. ئەپڵیکەیشنێکی لایەنی سێیەمە. <strong>ئەگەر متمانەت پێی نییە، ئەوا نابێت ڕێگەی پێبدەیت.</strong>"
+        review_permissions: پێداچوونەوە بە مۆڵەتەکاندا بکە
         title: ڕێپێدان پێویستە
       show:
         title: کۆپیکردنی کۆدی ئەم رێپێدانە و لکاندنی بە بەرنامەکە.
@@ -69,6 +71,12 @@ ckb:
       confirmations:
         revoke: ئایا دڵنیایت?
       index:
+        authorized_at: ڕێگەپێدراوە لە %{date}
+        description_html: ئەمانە ئەو بەرنامانەن کە دەتوانن بە بەکارهێنانی API بچنە ناو ئەکاونتەکەتەوە. ئەگەر بەرنامەیەک هەبێت کە لێرەدا نایناسیتەوە، یان بەرنامەیەک هەڵسوکەوتی خراپ دەکات، دەتوانیت دەستڕاگەیشتنەکەی هەڵبوەشێنیتەوە.
+        last_used_at: دوایین جار لە %{date} بەکارهاتووە
+        never_used: هه‌رگیز به‌كارنه‌هاتووه‌
+        scopes: مۆڵەتەکان
+        superapp: ناوخۆیی
         title: بەرنامە ڕێگەپێدراوەکانت
     errors:
       messages:
@@ -77,6 +85,10 @@ ckb:
         invalid_client: سەلماندنی کڕیار سەرکەوتوو نەبوو بەهۆی کڕیاری نەناسراوەوە، هیچ ڕەسەنایەتی سەلماندنێکی کلایەنت لەخۆوە نەدەگرێت، یان شێوازی سەلماندنی پەسەند نەکراو.
         invalid_grant: بەخشین مۆڵەتی دابینکراو نایاساییە، بەسەرچووە، هەڵوەشاندنەوەیە، ناگونجێلەگەڵ ئاراستەی URI بەکارهاتوو لە داواکاری ڕێپێدان، یان دەرچووە بۆ کڕیارێکی تر.
         invalid_redirect_uri: Uri دووبارە ئاڕاستەکردنەوەکە لەخۆدەگرێت دروست نیە.
+        invalid_request:
+          missing_param: 'پارامێتری پێویست نەماوە: %{value}.'
+          request_not_authorized: داواکاری پێویستە ڕێگەپێدراو بێت. پارامێتری پێویست بۆ ڕێگەدان بە داواکاری نەماوە یان نادروستە.
+          unknown: داواکارییەکە پارامێتەرێکی پێویستی تێدا نییە، بەهای پارامێتەرێکی پشتگیری نەکراو لەخۆدەگرێت، یان بە شێوەیەکی تر خراپە.
         invalid_resource_owner: بڕواپێدانەکانی خاوەنی سەرچاوەی دابینکراو دروست نیە، یان ناتوانرێت خاوەنی سەرچاوە بدۆزرێتەوە
         invalid_scope: بواری داواکراو نادروستە، نەناسراو، یان تێکچووە.
         invalid_token:
@@ -100,10 +112,38 @@ ckb:
       authorized_applications:
         destroy:
           notice: بەرنامە هەڵوەشێنڕا.
+    grouped_scopes:
+      access:
+        read: دەستڕاگەیشتن بە تەنها خوێندنەوە
+        read/write: دەستڕاگەیشتن بە خوێندنەوە و نووسین
+        write: دەستڕاگەیشتن بە تەنها نووسین
+      title:
+        accounts: هەژمارەکان
+        admin/accounts: بەڕێوەبردنی ژمێریارییەکان
+        admin/all: هەموو ئەرکە کارگێڕییەکان
+        admin/reports: بەڕێوەبردنی ڕاپۆرتەکان
+        all: هەمووی
+        blocks: بلۆک
+        bookmarks: نیشانەکان
+        conversations: گفتوگۆکان
+        crypto: کۆدکردنی کۆتایی بۆ کۆتایی
+        favourites: دڵخوازەکان
+        filters: پاڵێوراوەکان
+        follow: پەیوەندیەکان
+        follows: بەدواداچووان
+        lists: پێرستەکان
+        media: هاوپێچەکانی میدیا
+        mutes: بێ دەنگ
+        notifications: ئاگادارییەکان
+        push: پاڵ بە ئاگادارکردنەوەکانەوە بنێ
+        reports: ڕاپۆرتەکان
+        search: گەڕان
+        statuses: نووسراوەکان
     layouts:
       admin:
         nav:
           applications: بەرنامەکان
+          oauth2_provider: دابینکەری OAuth2
       application:
         title: داوای ڕێپێدانی OAuth
     scopes:
@@ -113,6 +153,7 @@ ckb:
       admin:write: دەستکاری هەموو داتاکان بکە لەسەر ڕاژەکار
       admin:write:accounts: ئەنجامدانی کاری میانڕەوی لەسەر هەژمارەکان
       admin:write:reports: ئەنجامدانی کاری میانڕەوی لەسەر گوزارشتەکان
+      crypto: کۆدکردنی کۆتایی بۆ کۆتایی بەکاربهێنە
       follow: دەستکاریکردنی پەیوەندییەکانی هەژمارەی بەکارهێنەر
       push: وەرگرتنی ئاگانامەکانی پاڵنان
       read: هەموو دراوەکانی هەژمارەکەت بخوێنەوە
@@ -132,6 +173,7 @@ ckb:
       write:accounts: دەستکاری پرۆفایلەکەت بکە
       write:blocks: بلۆک کردنی هەژمارەکەی دۆمەینەکان
       write:bookmarks: بارەکانی نیشانکەر
+      write:conversations: بێدەنگکردن و سڕینەوەی گفتوگۆکان
       write:favourites: دۆخی دڵخوازەکان
       write:filters: پاڵێوەر دروست بکە
       write:follows: دوای خەڵک بکەوە
diff --git a/config/locales/doorkeeper.en-GB.yml b/config/locales/doorkeeper.en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales/doorkeeper.en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml
index ba4c43122..1584fddf0 100644
--- a/config/locales/doorkeeper.eo.yml
+++ b/config/locales/doorkeeper.eo.yml
@@ -104,6 +104,14 @@ eo:
       authorized_applications:
         destroy:
           notice: Aplikaĵo malrajtigita.
+    grouped_scopes:
+      title:
+        blocks: Blokita
+        bookmarks: Legosignoj
+        lists: Listoj
+        mutes: Silentigitaj
+        search: Serĉi
+        statuses: Afiŝoj
     layouts:
       admin:
         nav:
diff --git a/config/locales/doorkeeper.he.yml b/config/locales/doorkeeper.he.yml
index cbbef63b1..e2f0c3401 100644
--- a/config/locales/doorkeeper.he.yml
+++ b/config/locales/doorkeeper.he.yml
@@ -3,7 +3,7 @@ he:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: שם
+        name: שם יישום
         redirect_uri: קישורית הפניה
         scopes: תחומים
         website: אתר יישום
@@ -38,6 +38,7 @@ he:
         application: יישום
         callback_url: כתובת גישה חוזרת (Callback URL)
         delete: למחוק
+        empty: אין לך אפליקציות.
         name: שם
         new: ישום חדש
         scopes: תחומים
@@ -48,7 +49,7 @@ he:
       show:
         actions: פעולות
         application_id: זהות ישום
-        callback_urls: כתובות לקריאה חוזרת (Callback URLs)
+        callback_urls: קישורית Callback
         scopes: תחומים
         secret: סוד
         title: 'ישום: %{name}'
@@ -59,6 +60,8 @@ he:
       error:
         title: התרחשה שגיאה
       new:
+        prompt_html: "%{client_name} מעוניין בהרשאה לגשת לחשבונך. זוהי אפליקציית צד-שלישי. <strong>אם יש סיבה לא לבטוח בה, נא לא לאשר.</strong>"
+        review_permissions: עיון בהרשאות
         title: נדרשת הרשאה
       show:
         title: יש להעתיק את קוד ההרשאה הזה ולהדביקו ביישום שביקש אותו.
@@ -68,6 +71,12 @@ he:
       confirmations:
         revoke: בטוח?
       index:
+        authorized_at: אושר ב-%{date}
+        description_html: אלה אפליקציות שיכולות לגשת לחשבונך בעזרת הממשק. אם ישנן כאן אפליקציות שאינך מזהה, או אפליקציה שאינה פועלת כראוי, ניתן להסיר את הגישה שלה.
+        last_used_at: נראה לאחרונה ב-%{date}
+        never_used: מעולם לא היה בשימוש
+        scopes: הרשאות
+        superapp: פנימי
         title: ישומיך המאושרים
     errors:
       messages:
@@ -76,6 +85,10 @@ he:
         invalid_client: הרשאת הלקוח נכשלה עקב לקוח שאינו ידוע, חוסר בהרשאת לקוח או שיטת הרשאה שאינה נתמכת.
         invalid_grant: חוזה ההרשאה המצורף אינו חוקי, אינו תקף, מבוטל, או שאינו מתאים לקישורית ההפניה שבשימוש על ידי בקשת ההרשאה, או שהופק על ידי לקוח אחר.
         invalid_redirect_uri: קישורית ההפניה המצורפת אינה חוקית.
+        invalid_request:
+          missing_param: 'חסר פרמטר נדרש: %{value}.'
+          request_not_authorized: יש לאשר את הבקשה. פרמטר הנדרש על מנת לאשר את הבקשה חסר או לקוי.
+          unknown: הבקשה חסרה פרמטר נדרש, כוללת ערך שלא נתמך או לקויה בדרך אחרת.
         invalid_resource_owner: הרשאות בעלי המשאב שהוזנו אינן חוקיות, או שלא ניתן למצוא את בעלי המשאב
         invalid_scope: התחום המבוקש אינו חוקי, אינו ידוע, או שתצורותו שגויה.
         invalid_token:
@@ -99,6 +112,33 @@ he:
       authorized_applications:
         destroy:
           notice: הישום בוטל.
+    grouped_scopes:
+      access:
+        read: גישה לקריאה בלבד
+        read/write: גישה לקריאה ולכתיבה
+        write: גישה לכתיבה בלבד
+      title:
+        accounts: חשבונות
+        admin/accounts: חשבונות ניהול
+        admin/all: כל פעולות האדמין
+        admin/reports: ניהול דיווחים
+        all: הכל
+        blocks: חסימות
+        bookmarks: סימניות
+        conversations: שיחות
+        crypto: הצפנה מקצה לקצה
+        favourites: חיבובים
+        filters: מסננים
+        follow: יחסים
+        follows: נעקבים
+        lists: רשימות
+        media: קבצי מדיה מצורפים
+        mutes: השתקות
+        notifications: התראות
+        push: התראות בדחיפה
+        reports: דיווחים
+        search: חיפוש
+        statuses: חצרוצים
     layouts:
       admin:
         nav:
@@ -107,6 +147,39 @@ he:
       application:
         title: נדרשת הרשאת OAuth
     scopes:
+      admin:read: לקרוא את כל המידע על השרת
+      admin:read:accounts: לקרוא מידע רגיש בכל החשבונות
+      admin:read:reports: לקרוא מידע רגיש בכל הדוחות וכל החשבונות המדווחים
+      admin:write: לשנות את כל המידע על השרת
+      admin:write:accounts: ביצוע פעולות הנהלה על חשבונות
+      admin:write:reports: ביצוע פעולות הנהלה על חשבונות
+      crypto: שימוש בהצפנה מקצה לקצה
       follow: לעקוב, לחסום, להסיר חסימה ולהפסיק לעקוב אחרי חשבונות
+      push: קבלת התראות בדחיפה
       read: לקרוא את המידע שבחשבונך
+      read:accounts: צפיה במידע על חשבונות
+      read:blocks: צפייה בחסימות
+      read:bookmarks: צפייה בסימניות
+      read:favourites: צפייה בחיבובים
+      read:filters: צפייה במסננים
+      read:follows: צפייה בנעקבים
+      read:lists: צפיה ברשימותיך
+      read:mutes: צפיה במושתקיך
+      read:notifications: צפיה בהתראותיך
+      read:reports: צפיה בדוחותיך
+      read:search: חיפוש מטעם עצמך
+      read:statuses: צפיה בכל החצרוצים
       write: להפיץ הודעות בשמך
+      write:accounts: שינוי הפרופיל שלך
+      write:blocks: חסימת חשבונות ודומיינים
+      write:bookmarks: סימון חצרוצים
+      write:conversations: השתקת ומחיקת שיחות
+      write:favourites: חצרוצים מחובבים
+      write:filters: יצירת מסננים
+      write:follows: עקיבה אחר אנשים
+      write:lists: יצירת רשימות
+      write:media: העלאת קבצי מדיה
+      write:mutes: השתקת אנשים ושיחות
+      write:notifications: ניקוי התראותיך
+      write:reports: דיווח על אנשים אחרים
+      write:statuses: פרסום חצרוצים
diff --git a/config/locales/doorkeeper.io.yml b/config/locales/doorkeeper.io.yml
index 0e03ab79f..4d41f9e93 100644
--- a/config/locales/doorkeeper.io.yml
+++ b/config/locales/doorkeeper.io.yml
@@ -4,7 +4,7 @@ io:
     attributes:
       doorkeeper/application:
         name: Nomo
-        redirect_uri: URI di plussendo
+        redirect_uri: Ridirektoligilo
         scopes: Skopi
         website: Apliksito
     errors:
@@ -40,67 +40,67 @@ io:
         delete: Efacez
         empty: Vu ne havas apliki.
         name: Nomo
-        new: New Application
+        new: Nova apliko
         scopes: Skopi
         show: Montrez
         title: Vua apliki
       new:
-        title: New Application
+        title: Nova apliko
       show:
         actions: Agi
-        application_id: Application Id
+        application_id: Klientoklefo
         callback_urls: Callback urls
         scopes: Skopi
-        secret: Secret
+        secret: Klientosekreto
         title: 'Apliko: %{name}'
     authorizations:
       buttons:
-        authorize: Permisez
+        authorize: Yurizar
         deny: Despermisez
       error:
         title: Eroro eventis
       new:
-        prompt_html: "%{client_name} volas permiso por acesar vua konti. Ol esas externa apliko. <strong>Se vu ne fidas, lore vu debas ne permisar.</strong>"
+        prompt_html: "%{client_name} volas permiso por acesar vua konti. Ol esas externa softwaro. <strong>Se vu ne fidas, lore vu debas ne yurizar.</strong>"
         review_permissions: Kontrolez permisi
-        title: Permiso bezonesas
+        title: Yurizo bezonesas
       show:
-        title: Kopiez ca permisnumero e glutinez adsur la apliko.
+        title: Kopiez ca yurizkodexo e glutinez a la apliko.
     authorized_applications:
       buttons:
         revoke: Deaprobez
       confirmations:
         revoke: Ka vu esas certa?
       index:
-        authorized_at: Permisesis ye %{date}
-        description_html: Co esas apliki quo povas acesar vua konto per API. Se existas apliki quon vu ne rikonocas hike, o apliko misfuncionas, vu povas desaprobar ola aceso.
+        authorized_at: Yurizesis ye %{date}
+        description_html: Co esas softwari quo povas acesar vua konto per API. Se existas softwari quon vu ne rikonocas hike, o softwari misfuncionas, vu povas desaprobar ola aceso.
         last_used_at: Antee uzesis ye %{date}
         never_used: Nulaloke uzesas
         scopes: Permisi
         superapp: Interna
-        title: Vua permisita apliki
+        title: Vua yurizita softwari
     errors:
       messages:
-        access_denied: Resursproprietanto o permisservilo refuzis la demando.
-        credential_flow_not_configured: Resursproprietantpasvortidentesesofluo faliis pro ke Doorkeeper.configure.resource_owner_from_credentials ne ajustesis.
+        access_denied: Moyenproprietanto o yurizservilo refuzis la demando.
+        credential_flow_not_configured: Moyenproprietantpasvortidentesesofluo faliis pro ke Doorkeeper.configure.resource_owner_from_credentials ne ajustesis.
         invalid_client: Klientpermiso falias pro nesavita kliento, neinkluzita klientpermiso o nesuportita permismetodo.
-        invalid_grant: Provizita permiso esis nevalida, expiris, deaprobesis, ne parigas uzita ridirektoligilo dum permisdemando o facesis a altra kliento.
+        invalid_grant: Provizita yurizo esis nevalida, expiris, deaprobesis, ne parigas uzita ridirektoligilo dum yurizdemando o facesis a altra kliento.
         invalid_redirect_uri: La inkluzita ridirektoligilo esas nevalida.
         invalid_request:
           missing_param: 'Bezonita parametro: %{value}.'
-          request_not_authorized: Demando bezonas permisesar. Bezonita parametro por permisar demando ne existas o esas nevalida.
+          request_not_authorized: Demando bezonas yurizesar. Bezonita parametro por yurizar demando ne existas o esas nevalida.
           unknown: La demando ne havas bezonita parametro, inkluzas nesuportita parametro o malformesas.
-        invalid_resource_owner: Provizita resursproprietantidenteso esas nevalida o resursproprietanto ne existas
+        invalid_resource_owner: Provizita Moyenproprietantidenteso esas nevalida o moyenproprietanto ne existas
         invalid_scope: La demandita skopo esas nevalida, nesavata o malformata.
         invalid_token:
           expired: La acesficho expiris
           revoked: Acesficho deaprobesis
           unknown: Acesficho esas nevalida
-        resource_owner_authenticator_not_configured: Resursproprietanto falias trovar pro ke Doorkeeper.configure.resource_owner_authenticator ne ajustesis.
-        server_error: Permisservilo trovas neanticipata situeso quo preventas ol finar la demando.
-        temporarily_unavailable: Permisservilo nu ne povas direktar la demando pro provizora eceso o servilmanteno.
-        unauthorized_client: La kliento ne permisesis agar ca demando per ca metodo.
-        unsupported_grant_type: Permisprovizontipo ne suportesas da permisservilo.
-        unsupported_response_type: La permisservilo ne suportas ca responsotipo.
+        resource_owner_authenticator_not_configured: Moyenproprietanto falias trovar pro ke Doorkeeper.configure.resource_owner_authenticator ne ajustesis.
+        server_error: Yurizservilo trovas neanticipata situeso quo preventas ol finar la demando.
+        temporarily_unavailable: Yurizservilo nu ne povas direktar la demando pro provizora eceso o servilmanteno.
+        unauthorized_client: La kliento ne yurizesis agar ca demando per ca metodo.
+        unsupported_grant_type: Yurizprovizontipo ne suportesas da yurizservilo.
+        unsupported_response_type: La yurizservilo ne suportas ca responstipo.
     flash:
       applications:
         create:
@@ -111,7 +111,7 @@ io:
           notice: Apliko novigesis.
       authorized_applications:
         destroy:
-          notice: Apliko aprobesis.
+          notice: Apliko deaprobesis.
     grouped_scopes:
       access:
         read: Lekto-nura aceso
@@ -136,7 +136,7 @@ io:
         mutes: Silencigati
         notifications: Avizi
         push: Pulsavizi
-        reports: Raportigi
+        reports: Raporti
         search: Trovez
         statuses: Posti
     layouts:
@@ -145,14 +145,14 @@ io:
           applications: Apliki
           oauth2_provider: Provizanto di OAuth2
       application:
-        title: Permiso di OAuth bezonesas
+        title: Yurizo di OAuth bezonesas
     scopes:
       admin:read: lektez omna informi di la servilo
       admin:read:accounts: lektez privata informo di omna konti
-      admin:read:reports: lektez privata informo di omna raportigo e raportigita konti
+      admin:read:reports: lektez privata informo di omna raporti e raportizita konti
       admin:write: modifikez omna informi di la servilo
       admin:write:accounts: jerez konti
-      admin:write:reports: jerez raportigi
+      admin:write:reports: jerez raporti
       crypto: uzas intersequanta chifro
       follow: follow, block, unblock and unfollow accounts
       push: ganez vua pulsavizi
@@ -178,8 +178,8 @@ io:
       write:filters: kreez filtrili
       write:follows: sequez personi
       write:lists: kreez listi
-      write:media: chargez medifaili
+      write:media: adchargez mediifaili
       write:mutes: silencigez personi e konversi
       write:notifications: efacez vua avizi
-      write:reports: raportigez altra omni
+      write:reports: raportizez altra omni
       write:statuses: publikigez posti
diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml
index 93cd0c55a..684b993ab 100644
--- a/config/locales/doorkeeper.pt-BR.yml
+++ b/config/locales/doorkeeper.pt-BR.yml
@@ -70,6 +70,7 @@ pt-BR:
       confirmations:
         revoke: Você tem certeza?
       index:
+        authorized_at: Autorizado em %{date}
         never_used: Nunca usado
         scopes: Permissões
         superapp: Interno
@@ -140,6 +141,7 @@ pt-BR:
       admin:write: alterar todos os dados no servidor
       admin:write:accounts: executar ações de moderação em contas
       admin:write:reports: executar ações de moderação em denúncias
+      crypto: usar criptografia de ponta-a-ponta
       follow: alterar o relacionamento das contas
       push: receber notificações push
       read: ler todos os dados da sua conta
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
index a772f081a..ff0e48720 100644
--- a/config/locales/doorkeeper.ru.yml
+++ b/config/locales/doorkeeper.ru.yml
@@ -3,7 +3,7 @@ ru:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Название
+        name: Название приложения
         redirect_uri: URI перенаправления
         scopes: Разрешения
         website: Веб-сайт приложения
@@ -36,7 +36,7 @@ ru:
         scopes: Разделяйте список разрешений пробелами. Оставьте незаполненным для использования разрешений по умолчанию.
       index:
         application: Приложение
-        callback_url: URL обратной связи
+        callback_url: URL-адреса обратного вызова
         delete: Удалить
         empty: У вас нет созданных приложений.
         name: Название
@@ -48,8 +48,8 @@ ru:
         title: Создание приложения
       show:
         actions: Действия
-        application_id: Id приложения
-        callback_urls: Callback urls
+        application_id: Ключ клиента
+        callback_urls: URL-адреса обратного вызова
         scopes: Разрешения
         secret: Секрет
         title: 'Приложение: %{name}'
@@ -118,7 +118,9 @@ ru:
         write: Доступ только для записи
       title:
         accounts: Учётные записи
+        admin/accounts: Управление учётными записями
         admin/all: Все административные функции
+        admin/reports: Управление отчётами
         all: Все
         blocks: Блокировки
         bookmarks: Закладки
@@ -150,6 +152,7 @@ ru:
       admin:write: модифицировать все данные на сервере
       admin:write:accounts: производить модерацию учётных записей
       admin:write:reports: производить модерацию жалоб
+      crypto: использ. сквозное шифрование
       follow: управлять подписками и списком блокировок
       push: получать push-уведомления
       read: просматривать данные вашей учётной записи
diff --git a/config/locales/doorkeeper.sl.yml b/config/locales/doorkeeper.sl.yml
index d75752c8d..5267b7fa2 100644
--- a/config/locales/doorkeeper.sl.yml
+++ b/config/locales/doorkeeper.sl.yml
@@ -168,13 +168,13 @@ sl:
       read:notifications: oglejte si svoja obvestila
       read:reports: oglejte si svoje prijave
       read:search: iščite v svojem imenu
-      read:statuses: oglejte si vsa stanja
+      read:statuses: oglejte si vse objave
       write: spremenite vse podatke svojega računa
       write:accounts: spremenite svoj profil
       write:blocks: blokirajte račune in domene
       write:bookmarks: objave zaznamkov
       write:conversations: utišaj in izbriši pogovore
-      write:favourites: priljubljena stanja
+      write:favourites: priljubljene objave
       write:filters: ustvari filtre
       write:follows: sledi osebam
       write:lists: ustvarite sezname
@@ -182,4 +182,4 @@ sl:
       write:mutes: utišaj osebe in pogovore
       write:notifications: počisti svoja obvestila
       write:reports: prijavi druge osebe
-      write:statuses: objavi stanja
+      write:statuses: objavi objave
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index b608be384..5c1e1582f 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -62,7 +62,7 @@ th:
       new:
         prompt_html: "%{client_name} ต้องการสิทธิอนุญาตเพื่อเข้าถึงบัญชีของคุณ แอปพลิเคชันเป็นแอปพลิเคชันจากบุคคลที่สาม <strong>หากคุณไม่เชื่อถือแอปพลิเคชัน คุณไม่ควรอนุญาตแอปพลิเคชัน</strong>"
         review_permissions: ตรวจทานสิทธิอนุญาต
-        title: ต้องมีการอนุญาต
+        title: ต้องการการอนุญาต
       show:
         title: คัดลอกรหัสการอนุญาตนี้แล้ววางลงในแอปพลิเคชัน
     authorized_applications:
@@ -81,6 +81,7 @@ th:
     errors:
       messages:
         access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ
+        invalid_redirect_uri: URI การเปลี่ยนเส้นทางที่รวมอยู่ไม่ถูกต้อง
         invalid_request:
           missing_param: 'พารามิเตอร์ที่จำเป็นขาดหายไป: %{value}'
         invalid_scope: ขอบเขตที่ขอไม่ถูกต้อง ไม่รู้จัก หรือผิดรูปแบบ
@@ -135,7 +136,7 @@ th:
           applications: แอปพลิเคชัน
           oauth2_provider: ผู้ให้บริการ OAuth2
       application:
-        title: ต้องมีการอนุญาต OAuth
+        title: ต้องการการอนุญาต OAuth
     scopes:
       admin:read: อ่านข้อมูลทั้งหมดในเซิร์ฟเวอร์
       admin:read:accounts: อ่านข้อมูลที่ละเอียดอ่อนของบัญชีทั้งหมด
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index e04ba9e0b..79b09cdb2 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -3,10 +3,10 @@ uk:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Назва додатку
+        name: Назва застосунку
         redirect_uri: URI перенаправлення
         scopes: Рамки
-        website: Веб-сайт додатку
+        website: Вебсайт застосунку
     errors:
       models:
         doorkeeper/application:
@@ -60,6 +60,7 @@ uk:
       error:
         title: Сталася помилка
       new:
+        prompt_html: "%{client_name} хоче отримати доступ до вашого облікового запису. Це сторонній застосунок. <strong>Якщо ви йому не довіряєте, не варто авторизувати його.</strong>"
         review_permissions: Переглянути дозволи
         title: Необхідна авторизація
       show:
@@ -71,6 +72,7 @@ uk:
         revoke: Ви впевнені?
       index:
         authorized_at: Авторизовано %{date}
+        description_html: Це застосунки, які мають доступ до вашого облікового запису через API. Якщо тут є застосунки, які Ви не розпізнаєте, або програма працює неправильно, ви можете відкликати їхній доступ.
         last_used_at: Востаннє використано %{date}
         never_used: Ніколи не використовувалися
         scopes: Дозволи
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index f612ac067..b4d680185 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -133,7 +133,7 @@ zh-CN:
         follows: 关注
         lists: 列表
         media: 媒体文件
-        mutes: 静音
+        mutes: 已被隐藏的
         notifications: 通知
         push: 推送通知
         reports: 报告
diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml
index 9a777c28b..e8a699d85 100644
--- a/config/locales/doorkeeper.zh-TW.yml
+++ b/config/locales/doorkeeper.zh-TW.yml
@@ -43,7 +43,7 @@ zh-TW:
         new: 新增應用程式
         scopes: 範圍
         show: 顯示
-        title: 你的應用程式
+        title: 您的應用程式
       new:
         title: 新增應用程式
       show:
@@ -148,35 +148,35 @@ zh-TW:
         title: 需要 OAuth 授權
     scopes:
       admin:read: 讀取伺服器的所有資料
-      admin:read:accounts: 讀取所有帳戶的敏感資訊
-      admin:read:reports: 讀取所有回報 / 被回報之帳戶的敏感資訊
+      admin:read:accounts: 讀取所有帳號的敏感資訊
+      admin:read:reports: 讀取所有回報 / 被回報之帳號的敏感資訊
       admin:write: 修改伺服器的所有資料
-      admin:write:accounts: 對帳戶進行仲裁管理動作
+      admin:write:accounts: 對帳號進行仲裁管理動作
       admin:write:reports: 對報告進行仲裁管理動作
       crypto: 使用端到端加密
-      follow: 修改帳戶關係
-      push: 接收帳戶的推播通知
-      read: 讀取您所有的帳戶資料
-      read:accounts: 檢視帳戶資訊
+      follow: 修改帳號關係
+      push: 接收帳號的推播通知
+      read: 讀取您所有的帳號資料
+      read:accounts: 檢視帳號資訊
       read:blocks: 檢視您的封鎖名單
       read:bookmarks: 檢視您的書籤
-      read:favourites: 檢視您的收藏項目
+      read:favourites: 檢視您收藏的最愛
       read:filters: 檢視您的過濾條件
-      read:follows: 檢視您關注的人
+      read:follows: 檢視您跟隨的人
       read:lists: 檢視您的名單
       read:mutes: 檢視您靜音的人
       read:notifications: 檢視您的通知
       read:reports: 檢視您的檢舉
-      read:search: 以你的身份搜尋
+      read:search: 以您的身份搜尋
       read:statuses: 檢視所有嘟文
-      write: 修改您帳戶的所有資料
+      write: 修改您帳號的所有資料
       write:accounts: 修改您的個人檔案
-      write:blocks: 封鎖帳戶及站台
+      write:blocks: 封鎖帳號及站台
       write:bookmarks: 書籤狀態
       write:conversations: 靜音及刪除對話
-      write:favourites: 收藏嘟文
+      write:favourites: 加到最愛
       write:filters: 建立過濾條件
-      write:follows: 關注其他人
+      write:follows: 跟隨其他人
       write:lists: 建立名單
       write:media: 上傳媒體檔案
       write:mutes: 靜音使用者及對話
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 71b07a24d..c8cdf2d20 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -762,6 +762,10 @@ el:
     directory: Κατάλογος λογαριασμών
     explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους
     explore_mastodon: Εξερεύνησε το %{title}
+  disputes:
+    strikes:
+      approve_appeal: Έγκριση έφεσης
+      reject_appeal: Απόρριψη έφεσης
   domain_validator:
     invalid_domain: δεν είναι έγκυρο όνομα τομέα
   errors:
@@ -1043,6 +1047,8 @@ el:
   reports:
     errors:
       invalid_rules: δεν παραπέμπει σε έγκυρους κανόνες
+  rss:
+    content_warning: 'Προειδοποίηση περιεχομένου:'
   scheduled_statuses:
     over_daily_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ για εκείνη τη μέρα
     over_total_limit: Έχεις υπερβεί το όριο των %{limit} προγραμματισμένων τουτ
diff --git a/config/locales/en.yml b/config/locales/en.yml
index a90409a7c..fc0ec6e3e 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1036,10 +1036,12 @@ en:
       appealed_msg: Your appeal has been submitted. If it is approved, you will be notified.
       appeals:
         submit: Submit appeal
+      approve_appeal: Approve appeal
       associated_report: Associated report
       created_at: Dated
       description_html: These are actions taken against your account and warnings that have been sent to you by the staff of %{instance}.
       recipient: Addressed to
+      reject_appeal: Reject appeal
       status: 'Post #%{id}'
       status_removed: Post already removed from system
       title: "%{action} from %{date}"
@@ -1355,6 +1357,11 @@ en:
   reports:
     errors:
       invalid_rules: does not reference valid rules
+  rss:
+    content_warning: 'Content warning:'
+    descriptions:
+      account: Public posts from @%{acct}
+      tag: 'Public posts tagged #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: You have exceeded the limit of %{limit} scheduled posts for today
     over_total_limit: You have exceeded the limit of %{limit} scheduled posts
@@ -1513,6 +1520,9 @@ en:
     pinned: Pinned post
     reblogged: boosted
     sensitive_content: Sensitive content
+  strikes:
+    errors:
+      too_late: It is too late to appeal this strike
   tags:
     does_not_match_previous_name: does not match the previous name
   terms:
@@ -1523,7 +1533,7 @@ en:
       <ul>
         <li><em>Basic account information</em>: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.</li>
         <li><em>Posts, following and other public information</em>: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.</li>
-        <li><em>Direct and followers-only posts</em>: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. <em>Please keep in mind that the operators of the server and any receiving server may view such messages</em>, and that recipients may screenshot, copy or otherwise re-share them. <em>Do not share any dangerous information over Mastodon.</em></li>
+        <li><em>Direct and followers-only posts</em>: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. <em>Please keep in mind that the operators of the server and any receiving server may view such messages</em>, and that recipients may screenshot, copy or otherwise re-share them. <em>Do not share any sensitive information over Mastodon.</em></li>
         <li><em>IPs and other metadata</em>: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.</li>
       </ul>
 
@@ -1594,7 +1604,7 @@ en:
 
       <p>If we decide to change our privacy policy, we will post those changes on this page.</p>
 
-      <p>This document is CC-BY-SA. It was last updated March 7, 2018.</p>
+      <p>This document is CC-BY-SA. It was last updated May 26, 2022.</p>
 
       <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} Terms of Service and Privacy Policy"
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index d7e08e9a5..2ab3692b2 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -104,6 +104,7 @@ eo:
       confirm: Konfirmi
       confirmed: Konfirmita
       confirming: Konfirmante
+      custom: Kutimo
       delete: Forigi datumojn
       deleted: Forigita
       demote: Degradi
@@ -185,6 +186,7 @@ eo:
       silenced: Silentigita
       statuses: Mesaĝoj
       subscribe: Aboni
+      suspend: Haltigu
       suspended: Haltigita
       title: Kontoj
       unblock_email: Malbloki retpoŝtadresojn
@@ -398,6 +400,7 @@ eo:
       content_policies:
         policies:
           reject_reports: Malakcepti raportojn
+          silence: Kaŝu
         policy: Politiko
       dashboard:
         instance_accounts_dimension: Plej sekvataj kontoj
@@ -416,6 +419,7 @@ eo:
         title: Kontrolo
       private_comment: Privata komento
       public_comment: Publika komento
+      purge: Purigu
       title: Federacio
       total_blocked_by_us: Blokitaj de ni
       total_followed_by_them: Sekvataj de ili
@@ -643,6 +647,7 @@ eo:
           tag_servers_measure: malsamaj serviloj
         not_usable: Ne povas esti uzata
         title: Tendencantaj kradvortoj
+      title: Tendencoj
     warning_presets:
       add_new: Aldoni novan
       delete: Forigi
@@ -789,8 +794,10 @@ eo:
     explore_mastodon: Esplori %{title}
   disputes:
     strikes:
+      created_at: Datita
       title_actions:
         delete_statuses: Forigo de afiŝo
+        none: Averto
   domain_validator:
     invalid_domain: ne estas valida domajna nomo
   errors:
@@ -861,6 +868,7 @@ eo:
     changes_saved_msg: Ŝanĝoj sukcese konservitaj!
     copy: Kopii
     delete: Forigi
+    none: Neniu
     order_by: Ordigi de
     save_changes: Konservi ŝanĝojn
     today: hodiaŭ
@@ -951,6 +959,9 @@ eo:
       new_followers_summary:
         one: Ankaŭ, vi ekhavis novan sekvanton en via foresto! Jej!
         other: Ankaŭ, vi ekhavis %{count} novajn sekvantojn en via foresto! Mirinde!
+      subject:
+        one: "1 nova sciigo ekde via lasta vizito 🐘"
+        other: "%{count} novaj sciigoj ekde via lasta vizito 🐘"
       title: En via foresto…
     favourite:
       body: "%{name} stelumis vian mesaĝon:"
@@ -1180,7 +1191,7 @@ eo:
       '2629746': 1 monato
       '31556952': 1 jaro
       '5259492': 2 monatoj
-      '604800': 1 week
+      '604800': 1 semajno
       '63113904': 2 jaroj
       '7889238': 3 monatoj
   stream_entries:
@@ -1199,6 +1210,7 @@ eo:
     formats:
       default: "%Y-%m-%d %H:%M"
       month: "%b %Y"
+      time: "%H:%M"
   two_factor_authentication:
     add: Aldoni
     disable: Malebligi
@@ -1219,6 +1231,9 @@ eo:
       subject: Via arkivo estas preta por elŝutado
       title: Arkiva elŝuto
     warning:
+      categories:
+        spam: Spamo
+      reason: 'Kialo:'
       subject:
         disable: Via konto %{acct} estas frostigita
         none: Averto por %{acct}
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 98b790487..beefc4193 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -802,6 +802,7 @@ es-AR:
           other: Compartido por %{count} personas durante la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado con la/s %{yesterday} vez/veces de ayer
+      only_allowed: Sólo permitidas
       pending_review: Revisión pendiente
       preview_card_providers:
         allowed: Los enlaces de este medio pueden ser tendencia
@@ -843,6 +844,7 @@ es-AR:
           one: Usada por una persona durante la última semana
           other: Usada por %{count} personas durante la última semana
       title: Tendencias
+      trending: En tendencia
     warning_presets:
       add_new: Agregar nuevo
       delete: Eliminar
@@ -1034,10 +1036,12 @@ es-AR:
       appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
       appeals:
         submit: Enviar apelación
+      approve_appeal: Aprobar apelación
       associated_report: Denuncia asociada
       created_at: Con fecha
       description_html: Estas son acciones tomadas contra tu cuenta y las advertencias que te han sido enviadas por el equipo de %{instance}.
       recipient: Dirigida a
+      reject_appeal: Rechazar apelación
       status: 'Mensaje #%{id}'
       status_removed: Mensaje ya eliminado del sistema
       title: "%{action} de %{date}"
@@ -1352,6 +1356,11 @@ es-AR:
   reports:
     errors:
       invalid_rules: no hace referencia a reglas válidas
+  rss:
+    content_warning: 'Advertencia de contenido:'
+    descriptions:
+      account: Mensajes públicos de @%{acct}
+      tag: 'Mensajes públicos etiquetados #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Superaste el límite de %{limit} mensajes programados para ese día
     over_total_limit: Superaste el límite de %{limit} mensajes programados
@@ -1510,6 +1519,9 @@ es-AR:
     pinned: Mensaje fijado
     reblogged: adhirió a este mensaje
     sensitive_content: Contenido sensible
+  strikes:
+    errors:
+      too_late: Es demasiado tarde para apelar este incumplimiento
   tags:
     does_not_match_previous_name: no coincide con el nombre anterior
   terms:
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 32c2f702c..5b1b04100 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -802,6 +802,7 @@ es-MX:
           other: Compartido por %{count} personas durante la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado a %{yesterday} ayer
+      only_allowed: Sólo las permitidas
       pending_review: Revisión pendiente
       preview_card_providers:
         allowed: Los enlaces de este editor pueden ser tendencia
@@ -843,6 +844,7 @@ es-MX:
           one: Usada por una persona durante la última semana
           other: Usada por %{count} personas durante la última semana
       title: Tendencias
+      trending: En tendencia
     warning_presets:
       add_new: Añadir nuevo
       delete: Borrar
@@ -1034,10 +1036,12 @@ es-MX:
       appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
       appeals:
         submit: Enviar apelación
+      approve_appeal: Aprobar apelación
       associated_report: Informe asociado
       created_at: Con fecha
       description_html: Estas son las acciones emprendidas contra tu cuenta y las advertencias que te han sido enviadas por el personal de %{instance}.
       recipient: Dirigida a
+      reject_appeal: Rechazar apelación
       status: 'Publicación #%{id}'
       status_removed: Publicación ya eliminada del sistema
       title: "%{action} del %{date}"
@@ -1352,6 +1356,11 @@ es-MX:
   reports:
     errors:
       invalid_rules: no hace referencia a reglas válidas
+  rss:
+    content_warning: 'Advertencia de contenido:'
+    descriptions:
+      account: Publicaciones públicas de @%{acct}
+      tag: 'Publicaciones públicas etiquetadas con #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Ha superado el límite de %{limit} toots programados para ese día
     over_total_limit: Ha superado el límite de %{limit} toots programados
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 8988ddadc..8abd8212f 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -802,7 +802,7 @@ es:
           other: Compartido por %{count} personas durante la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado con %{yesterday} ayer
-      only_allowed: Sólo permitido
+      only_allowed: Sólo las permitidas
       pending_review: Revisión pendiente
       preview_card_providers:
         allowed: Los enlaces de este medio pueden ser tendencia
@@ -1036,10 +1036,12 @@ es:
       appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
       appeals:
         submit: Enviar apelación
+      approve_appeal: Aprobar apelación
       associated_report: Informe asociado
       created_at: Con fecha
       description_html: Estas son las acciones emprendidas contra tu cuenta y las advertencias que te han sido enviadas por el personal de %{instance}.
       recipient: Dirigida a
+      reject_appeal: Rechazar apelación
       status: 'Publicación #%{id}'
       status_removed: Publicación ya eliminada del sistema
       title: "%{action} del %{date}"
@@ -1354,6 +1356,11 @@ es:
   reports:
     errors:
       invalid_rules: no hace referencia a reglas válidas
+  rss:
+    content_warning: 'Advertencia de contenido:'
+    descriptions:
+      account: Publicaciones públicas de @%{acct}
+      tag: 'Publicaciones públicas etiquetadas con #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Ha superado el límite de %{limit} publicaciones programadas para ese día
     over_total_limit: Ha superado el límite de %{limit} publicaciones programadas
@@ -1512,6 +1519,9 @@ es:
     pinned: Publicación fijada
     reblogged: retooteado
     sensitive_content: Contenido sensible
+  strikes:
+    errors:
+      too_late: Es demasiado tarde para apelar esta amonestación
   tags:
     does_not_match_previous_name: no coincide con el nombre anterior
   terms:
diff --git a/config/locales/et.yml b/config/locales/et.yml
index e08b091b1..3c48bad5b 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -7,7 +7,8 @@ et:
     active_count_after: aktiivne
     active_footnote: Igakuiselt aktiivseid kasutajaid (MAU)
     administered_by: 'Administraator:'
-    apps: Mobiilrakendused
+    api: API
+    apps: Mobiilirakendused
     apps_platforms: Kasuta Mastodoni iOS-is, Androidis ja teistel platvormidel
     browse_directory: Sirvi profiilide kataloogi ja filtreeri huvide alusel
     browse_local_posts: Sirvi reaalajas voogu avalikest postitustest sellest serverist
@@ -25,19 +26,22 @@ et:
       Seda kasutatakse föderatiivsetel põhjustel ning seda ei tohiks blokeerida, välja arvatud juhul, kui soovite blokeerida tervet serverit, kuid sellel juhul soovitame hoopis kasutada domeeni blokeerimist.
     learn_more: Lisateave
     privacy_policy: Privaatsuspoliitika
+    rules: Serveri reeglid
+    rules_html: 'Järgneb kokkuvõte reeglitest, mida pead järgima, kui lood endale siin Mastodoni serveris konto:'
     see_whats_happening: Vaata, mis toimub
     server_stats: 'Serveri statistika:'
     source_code: Lähtekood
     status_count_after:
-      one: staatust
+      one: postitust
       other: staatuseid
-    status_count_before: Kes omavad
+    status_count_before: Kes on avaldanud
     tagline: Jälgi sõpru ja leia uusi
     terms: Kasutustingimused
     unavailable_content: Sisu pole saadaval
     unavailable_content_description:
       reason: Põhjus
       rejecting_media: 'Meedia failid sellelt serverilt ei töödelda ega salvestata ning mitte ühtegi eelvaadet ei kuvata, mis nõuab manuaalselt vajutust originaalfailile:'
+      rejecting_media_title: Filtreeritud meediaga
       silenced: 'Postitused nendelt serveritelt peidetakse avalikes ajajoontes ja vestlustes ning mitte ühtegi teavitust ei tehta nende kasutajate tegevustest, välja arvatud juhul, kui Te neid jälgite:'
       suspended: 'Mitte mingeid andmeid nendelt serveritelt ei töödelda, salvestata ega vahetata, tehes igasuguse interaktsiooni või kirjavahetuse kasutajatega nendelt serveritelt võimatuks:'
     unavailable_content_html: Mastodon tavaliselt lubab Teil vaadata sisu ning suhelda kasutajatega üks kõik millisest teisest serverist fediversumis. Need on erandid, mis on paika pandud sellel kindlal serveril.
@@ -67,10 +71,10 @@ et:
     pin_errors:
       following: Te peate juba olema selle kasutaja jälgija, keda te heaks kiidate
     posts:
-      one: Tuututus
-      other: Tuututused
-    posts_tab_heading: Tuututused
-    posts_with_replies: Tuututused ja vastused
+      one: Postitus
+      other: Postitused
+    posts_tab_heading: Postitused
+    posts_with_replies: Postitused ja vastused
     roles:
       admin: Administraator
       bot: Robot
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index bfb06e3ee..bc515fe5e 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -887,7 +887,7 @@ eu:
       cas: CAS
       saml: SAML
     register: Eman izena
-    registration_closed: "%{instance} instantziak ez ditu kide berriak onartzen"
+    registration_closed: "%{instance} instantziak ez du kide berririk onartzen"
     resend_confirmation: Birbidali berresteko argibideak
     reset_password: Berrezarri pasahitza
     security: Segurtasuna
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 566cfc4b7..05a1ce434 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -368,6 +368,7 @@ fa:
       enable: به کار انداختن
       enabled: فعال
       enabled_msg: این شکلک با موفقیت فعال شد
+      image_hint: پی‌ان‌چی یا جیف تا %{size}
       list: فهرست
       listed: فهرست شده
       new:
@@ -450,6 +451,9 @@ fa:
       add_new: افزودن تازه
       created_msg: مسدودسازی دامین ایمیل با موفقیت ساخته شد
       delete: پاک‌کردن
+      dns:
+        types:
+          mx: رکورد MX
       domain: دامین
       new:
         create: ساختن مسدودسازی
@@ -464,11 +468,28 @@ fa:
       title: پیشنهادهای پی‌گیری
       unsuppress: بازگردانی پیشنهادهای پی‌گیری
     instances:
+      availability:
+        no_failures_recorded: هیچ شکستی در سابقه نیست.
+        title: موجود بودن
       back_to_all: همه
       back_to_limited: محدود
       back_to_warning: هشدار
       by_domain: دامین
       confirm_purge: آیا مطمئن هستید می‌خواهید داده را از این دامنه برای همیشه پاک کنید؟
+      content_policies:
+        comment: یادداشت داخلی
+        policies:
+          silence: کران
+          suspend: تعلیق
+        policy: سیاست
+        reason: دلیل عمومی
+        title: سیاست‌های محتوا
+      dashboard:
+        instance_accounts_dimension: حساب‌های پیش‌تر پی‌گیری شده
+        instance_followers_measure: پی‌گیرندگانمان در آن‌جا
+        instance_follows_measure: پی‌گیرندگانشان در این‌جا
+        instance_languages_dimension: زبان‌های برتر
+        instance_reports_measure: گزارش‌ها درباره‌شان
       delivery:
         all: همه
         clear: پاک کردن خطاهای تحول محتوا
@@ -722,6 +743,8 @@ fa:
       preview_card_providers:
         title: ناشران
       rejected: رد شده
+      statuses:
+        title: فرسته‌های داغ
       tags:
         current_score: امتیاز کنونی %{score}
         dashboard:
@@ -758,6 +781,9 @@ fa:
     new_trends:
       new_trending_links:
         no_approved_links: در حال حاضر هیچ پیوند پرطرفداری پذیرفته نشده است.
+        title: پیوندهای داغ
+      new_trending_statuses:
+        title: فرسته‌های داغ
   aliases:
     add_new: ساختن نام مستعار
     created_msg: نام مستعار تازه با موفقیت ساخته شد. الان می‌توانید انتقال از حساب قدیمی را آغاز کنید.
@@ -1082,6 +1108,9 @@ fa:
     carry_mutes_over_text: این کاربر از %{acct} که خموشش کرده‌اید، جابه‌جا شد.
     copy_account_note_text: 'این کاربر از %{acct} جابه‌جا شده است. یادداشت‌های پیشینتان درباره‌اش این‌هاست:'
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} ثبت نام کرد"
     digest:
       action: دیدن تمامی آگاهی‌ها
       body: خلاصه‌ای از پیغام‌هایی که از زمان آخرین بازدید شما در %{since} فرستاده شد
@@ -1287,6 +1316,7 @@ fa:
     open_in_web: گشودن در وب
     over_character_limit: از حد مجاز %{max} حرف فراتر رفتید
     pin_errors:
+      direct: فرسته‌هایی که فقط برای کاربران اشاره شده نمایانند نمی‌توانند سنجاق شوند
       limit: از این بیشتر نمی‌شود نوشته‌های ثابت داشت
       ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد
       reblog: تقویت را نمی‌توان سنجاق کرد
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 63fce2af6..3fcd67bb2 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -802,7 +802,7 @@ fr:
           other: Partagé par %{count} personnes au cours de la dernière semaine
         title: Liens tendances
         usage_comparison: Partagé %{today} fois aujourd'hui, comparé à %{yesterday} hier
-      only_allowed: Seuls autorisés
+      only_allowed: Autorisées seulement
       pending_review: En attente de révision
       preview_card_providers:
         allowed: Les liens de cet éditeur peuvent être tendance
@@ -1036,10 +1036,12 @@ fr:
       appealed_msg: Votre demande d'appel a été soumise. Si elle est approuvée, vous en serez informé·e.
       appeals:
         submit: Faire appel
+      approve_appeal: Approuver l’appel
       associated_report: Rapport associé
       created_at: En date du
       description_html: Ce sont les mesures prises contre votre compte et les avertissements qui vous ont été envoyés par les responsables de %{instance}.
       recipient: Adressé à
+      reject_appeal: Rejeter l’appel
       status: 'Message #%{id}'
       status_removed: Message déjà supprimé du système
       title: "%{action} du %{date}"
@@ -1354,6 +1356,11 @@ fr:
   reports:
     errors:
       invalid_rules: ne fait pas référence à des règles valides
+  rss:
+    content_warning: 'Avertissement de contenu :'
+    descriptions:
+      account: Messages publics de @%{acct}
+      tag: 'Messages publics taggés #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Vous avez dépassé la limite de %{limit} messages planifiés par jour
     over_total_limit: Vous avez dépassé la limite de %{limit} messages planifiés
@@ -1447,7 +1454,7 @@ fr:
     open_in_web: Ouvrir sur le web
     over_character_limit: limite de %{max} caractères dépassée
     pin_errors:
-      direct: Les messages qui ne sont visibles que pour les utilisateurs mentionnés ne peuvent pas être épinglés
+      direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés
       limit: Vous avez déjà épinglé le nombre maximum de messages
       ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
       reblog: Un partage ne peut pas être épinglé
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index f46ba4f8f..450134bbc 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -832,6 +832,7 @@ gd:
           two: Chaidh a cho-roinneadh le %{count} rè na seachdain seo chaidh
         title: Ceanglaichean a’ treandadh
         usage_comparison: Chaidh a cho-roinneadh %{today} tura(i)s an-diugh an coimeas ri %{yesterday} an-dè
+      only_allowed: An fheadhainn cheadaichte a-mhàin
       pending_review: A’ feitheamh air lèirmheas
       preview_card_providers:
         allowed: Faodaidh ceanglaichean on fhoillsichear seo treandadh
@@ -877,6 +878,7 @@ gd:
           other: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
           two: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
       title: Treandaichean
+      trending: A’ treandadh
     warning_presets:
       add_new: Cuir fear ùr ris
       delete: Sguab às
@@ -1068,10 +1070,12 @@ gd:
       appealed_msg: Chaidh an t-ath-thagradh agad a chur a-null. Ma thèid aontachadh ris, gheibh thu brath mu dhèidhinn.
       appeals:
         submit: Cuir a-null an t-ath-thagradh
+      approve_appeal: Zatwierdź odwołanie
       associated_report: An gearan co-cheangailte
       created_at: Ceann-là
       description_html: Seo na gnìomhan a chaidh a ghabhail an aghaidh a’ chunntais agad agus na rabhaidhean a chaidh a chur thugad le luchd-obrach %{instance}.
       recipient: Faightear
+      reject_appeal: Diùlt an t-ath-thagradh
       status: 'Post #%{id}'
       status_removed: Chaidh am post a thoirt air falbh on t-siostam mu thràth
       title: "%{action} o %{date}"
@@ -1394,6 +1398,11 @@ gd:
   reports:
     errors:
       invalid_rules: gun iomradh air riaghailtean dligheach
+  rss:
+    content_warning: 'Rabhadh susbainte:'
+    descriptions:
+      account: Postaichean poblach o @%{acct}
+      tag: 'Postaichean poblach le taga #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Chaidh thu thar na crìoch de %{limit} post(aichean) sgeidealaichte an-diugh
     over_total_limit: Chaidh thu thar na crìoch de %{limit} post(aichean) sgeidealaichte
@@ -1564,6 +1573,9 @@ gd:
     pinned: Post prìnichte
     reblogged: "’ga bhrosnachadh"
     sensitive_content: Susbaint fhrionasach
+  strikes:
+    errors:
+      too_late: Tha e ro anmoch airson an rabhadh seo ath-thagradh
   tags:
     does_not_match_previous_name: "– chan eil seo a-rèir an ainm roimhe"
   terms:
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index a183c6436..93634adcd 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -931,7 +931,7 @@ gl:
       prefix_invited_by_user: "@%{name} convídate a que te unas a este servidor Mastodon!"
       prefix_sign_up: Rexístrate agora en Mastodon!
       suffix: Ao abrir unha conta, poderás seguir a xente, actualizacións das publicacións e intercambiar mensaxes coas usuarias de calquera servidor de Mastodon e moito máis!
-    didnt_get_confirmation: Non recibeu as instruccións de confirmación?
+    didnt_get_confirmation: Non recibiches as instruccións de confirmación?
     dont_have_your_security_key: "¿Non tes a túa chave de seguridade?"
     forgot_password: Esqueceu o contrasinal?
     invalid_reset_password_token: O testemuño para restablecer o contrasinal non é válido ou caducou. Por favor solicite un novo.
@@ -953,8 +953,8 @@ gl:
     security: Seguranza
     set_new_password: Estabelecer novo contrasinal
     setup:
-      email_below_hint_html: Se o enderezo inferior non é correcto, pode cambialo aquí e recibir un correo de confirmación.
-      email_settings_hint_html: Enviouse un correo de confirmación a %{email}. Se o enderezo non é correcto pode cambialo nos axustes da conta.
+      email_below_hint_html: Se o enderezo inferior non é correcto, podes cambialo aquí e recibir un correo de confirmación.
+      email_settings_hint_html: Enviouse un correo de confirmación a %{email}. Se o enderezo non é correcto podes cambialo nos axustes da conta.
       title: Axustes
     status:
       account_status: Estado da conta
@@ -1036,10 +1036,12 @@ gl:
       appealed_msg: A túa apelación foi enviada. Se é aprobada recibirás unha notificación.
       appeals:
         submit: Enviar apelación
+      approve_appeal: Aprobar apelación
       associated_report: Denuncia asociada
       created_at: Data
       description_html: Estas son as accións tomadas contra a túa conta e os avisos que che enviou a administración de %{instance}.
       recipient: Entregada a
+      reject_appeal: Rexeitar apelación
       status: 'Publicación #%{id}'
       status_removed: A publicación xa foi eliminada do sistema
       title: "%{action} o %{date}"
@@ -1354,6 +1356,11 @@ gl:
   reports:
     errors:
       invalid_rules: non fai referencia a regras válidas
+  rss:
+    content_warning: 'Aviso sobre o contido:'
+    descriptions:
+      account: Publicacións públicas de @%{acct}
+      tag: 'Publicacións públicas con #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Excedeches o límite de %{limit} publicacións programadas para ese día
     over_total_limit: Excedeches o límite de %{limit} publicacións programadas
@@ -1512,6 +1519,9 @@ gl:
     pinned: Publicación fixada
     reblogged: promoveu
     sensitive_content: Contido sensible
+  strikes:
+    errors:
+      too_late: É demasiado tarde para recurrir este aviso
   tags:
     does_not_match_previous_name: non concorda co nome anterior
   terms:
diff --git a/config/locales/he.yml b/config/locales/he.yml
index d20fec3f7..2d0cf8ae9 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -4,43 +4,131 @@ he:
     about_hashtag_html: אלו סטטוסים פומביים המתוייגים בתור<strong>#%{hashtag}</strong>. ניתן להגיב, להדהד או לחבב אותם אם יש לך חשבון בכל מקום בפדרציה.
     about_mastodon_html: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
     about_this: אודות שרת זה
+    active_count_after: פעיל
+    active_footnote: משתמשים פעילים חודשית (MAU)
+    administered_by: 'מנוהל ע"י:'
+    api: ממשק
     apps: יישומונים לנייד
+    apps_platforms: שימוש במסטודון מ-iOS, אנדרואיד ופלטפורמות אחרות
+    browse_directory: עיון בספריית פרופילים וסינון לפי תחומי עניין
+    browse_local_posts: עיון בפיד חי של חצרוצים פומביים בשרת זה
+    browse_public_posts: עיון בפיד חי של חצרוצים פומביים בשרת זה
     contact: יצירת קשר
     contact_missing: ללא הגדרה
     contact_unavailable: לא רלוונטי/חסר
+    continue_to_web: להמשיך לאפליקציית ווב
+    discover_users: גילוי משתמשים
     documentation: תיעוד
+    federation_hint_html: עם חשבון ב-%{instance} ניתן לעקוב אחרי אנשים בכל שרת מסטודון ומעבר.
+    get_apps: נסה/י יישומון לנייד
     hosted_on: מסטודון שיושב בכתובת %{domain}
+    instance_actor_flash: |
+      חשבון זה הינו פועל וירטואלי המשמש לייצוג השרת עצמו ולא משתמש ספציפי.
+      הוא משמש למטרת פדרציה ואין לחסום אותו אלא למטרת חסימת המופע כולו, ובמקרה כזה עדיף להשתמש בחסימת מופע.
     learn_more: מידע נוסף
+    logged_in_as_html: הנך מחובר/ת כרגע כ-%{username}.
+    logout_before_registering: חשבון זה כבר מחובר.
+    privacy_policy: מדיניות פרטיות
+    rules: כללי השרת
+    rules_html: 'להלן סיכום הכללים שעליך לעקוב אחריהם על מנת להשתמש בחשבון בשרת מסטודון זה:'
+    see_whats_happening: מה קורה כעת
+    server_stats: 'סטטיסטיקות שרת:'
     source_code: קוד מקור
+    status_count_after:
+      many: חצרוצים
+      one: חצרוץ
+      other: חצרוצים
+      two: חצרוצים
     status_count_before: שכתבו
+    tagline: מעקב אחרי חברים וגילוי חדשים
+    terms: תנאי שימוש
+    unavailable_content: שרתים מוגבלים
+    unavailable_content_description:
+      domain: שרת
+      reason: סיבה
+      rejecting_media: 'קבצי מדיה משרתים אלה לא יעובדו או ישמרו, ותמונות ממוזערות לא יוצגו. נדרשת הקלקה ידנית על מנת לצפות בקובץ המקורי:'
+      rejecting_media_title: מדיה מסוננת
+      silenced: 'חצרוצים משרתים אלה יוסתרו מפידים ושיחות פומביים, ושום התראות לא ינתנו על אינטראקציות עם משתמשיהם, אלא אם הינך במעקב אחריהם:'
+      silenced_title: שרתים מוגבלים
+      suspended: 'שום מידע עם שרתים אלה לא יעובד, יישמר או יוחלף, מה שהופך כל תקשורת עם משתמשיהם לבלתי אפשרית:'
+      suspended_title: שרתים מושעים
+    unavailable_content_html: ככלל מסטודון מאפשר לך לצפות בתוכן ולתקשר עם משתמשים בכל שרת בפדרציה. אלו הם היוצאים מן הכלל שהוגדרו עבור שרת זה.
+    user_count_after:
+      many: משתמשים
+      one: משתמש
+      other: משתמשים
+      two: משתמשים
     user_count_before: ביתם של
     what_is_mastodon: מה זה מסטודון?
   accounts:
+    choices_html: 'בחירותיו/ה של %{name}:'
+    endorsements_hint: תוכל/י להמליץ על אנשים לעקוב אחריהם דרך ממשק הווב, והם יופיעו כאן.
+    featured_tags_hint: תוכל/י להציג האשתגיות ספציפיות והן תופענה כאן.
     follow: לעקוב
+    followers:
+      many: עוקבים
+      one: עוקב
+      other: עוקבים
+      two: עוקבים
     following: נעקבים
+    instance_actor_flash: חשבון זה הינו פועל וירטואלי המשמש לייצוג השרת עצמו ולא אף משתמש ספציפי. הוא משמש למטרות פדרציה ואין להשעותו.
+    joined: הצטרף/ה ב-%{date}
+    last_active: פעילות אחרונה
+    link_verified_on: בעלות על קישורית זו נבדקה לאחרונה ב-%{date}
     media: מדיה
     moved_html: "%{name} עבר(ה) אל %{new_profile_link}:"
+    network_hidden: מידע זה אינו זמין
     nothing_here: אין פה שום דבר!
     people_followed_by: הנעקבים של %{name}
     people_who_follow: העוקבים של %{name}
+    pin_errors:
+      following: עליך לעקוב אחרי חשבון לפני שניתן יהיה להמליץ עליו
+    posts:
+      many: חצרוצים
+      one: חצרוץ
+      other: חצרוצים
+      two: חצרוצים
+    posts_tab_heading: חצרוצים
     posts_with_replies: חצרוצים ותגובות
     roles:
       admin: מנהל
+      bot: בוט
+      group: קבוצה
       moderator: מנחה
+    unavailable: פרופיל לא זמין
     unfollow: הפסקת מעקב
   admin:
+    account_actions:
+      action: בצע/י פעולה
+      title: ביצוע פעולות הנהלה על %{acct}
     account_moderation_notes:
       create: ליצור
       created_msg: הודעת מנחה נוצרה בהצלחה!
       destroyed_msg: הודעת מנחה נמחקה בהצלחה!
     accounts:
+      add_email_domain_block: חסמו לגמרי את שם המתחם (דומיין) של הדוא"ל
+      approve: אשר
+      approved_msg: בקשת %{username} להירשם אושרה בהצלחה
       are_you_sure: בטוח?
+      avatar: יַצְגָן
       by_domain: שם מתחם
+      change_email:
+        changed_msg: כתובת הדוא"ל המשוייכת לחשבון שונתה בהצלחה !
+        current_email: כתובת דוא"ל נוכחית
+        label: שינוי כתובת דוא"ל משוייכת לחשבון
+        new_email: כתובת דוא"ל חדשה
+        submit: שלחי בקשה לשינוי דוא"ל
+        title: שינוי כתובת דוא"ל עבור המשתמש.ת %{username}
       confirm: אישור
       confirmed: אושר
       confirming: המאשר
+      custom: התאמה אישית
+      delete: מחיקת חשבון
+      deleted: מחוקים
       demote: הורדה בדרגה
+      destroyed_msg: הנתונים של %{username} נכנסו לתור המחיקה וצפויים להימחק באופן מיידי
       disable: לחסום
+      disable_sign_in_token_auth: השעיית הזדהות באמצעות אסימון בדוא"ל של משתמש
       disable_two_factor_authentication: ביטול הזדהות דו-שלבית
       disabled: נחסם
       display_name: שם לתצוגה
@@ -49,11 +137,17 @@ he:
       email: דוא"ל
       email_status: סטטוס דוא"ל
       enable: לאפשר
+      enable_sign_in_token_auth: הפעלת אסימון הזדהות בדוא"ל של משתמש
       enabled: מאופשר
+      enabled_msg: ביטול השעית החשבון של %{username} בוצע בהצלחה
       followers: עוקבים
       follows: נעקבים
+      header: כותרת
       inbox_url: כתובת תיבה נכנסת
+      invite_request_text: סיבות להצטרפות
+      invited_by: הוזמן על ידי
       ip: כתובת IP
+      joined: תאריך הצטרפות
       location:
         all: הכל
         local: מקומי
@@ -62,20 +156,40 @@ he:
       login_status: מצב חיבור
       media_attachments: תוספות מדיה
       memorialize: הפוך לדף זכרון
+      memorialized: מונצחים
+      memorialized_msg: החשבון %{username} הונצח בהצלחה
       moderation:
+        active: פעילים
         all: הכל
+        pending: בהמתנה
         suspended: מושהים
         title: ניהול קהילה
       moderation_notes: הודעות מנחה
       most_recent_activity: פעילות עדכנית
       most_recent_ip: כתובות אחרונות
+      no_account_selected: לא בוצעו שינויים בחשבונות ל שכן לא נבחרו חשבונות
+      no_limits_imposed: לא הוטלו הגבלות
       not_subscribed: לא רשום
+      pending: ממתינים לסקירה
       perform_full_suspension: ביצוע השעייה מלאה
+      previous_strikes: פסילות קודמות
+      previous_strikes_description_html:
+        many: לחשבון הזה יש <strong>%{count}</strong> פסילות.
+        one: לחשבון הזה פסילה <strong>אחת</strong>.
+        other: לחשבון הזה <strong>%{count}</strong> פסילות.
+        two: לחשבון הזה <strong>%{count}</strong> פסילות.
       promote: להעלות בדרגה
       protocol: פרטיכל
       public: פומבי
       push_subscription_expires: הרשמה להודעות בדחיפה פגה
       redownload: לקריאה מחדש של האווטאר
+      redownloaded_msg: הפרופיל של %{username} רוענן בהצלחה מהמקור
+      reject: דחויים
+      rejected_msg: בקשת ההרשמה של %{username} נדחתה בהצלחה
+      remove_avatar: הסרת תמונת פרופיל
+      remove_header: הסרת כותרת
+      removed_avatar_msg: תמונת הפרופיל של %{username} הוסרה בהצלחה
+      removed_header_msg: תמונת הראשה של %{username} הוסרה בהצלחה
       resend_confirmation:
         already_confirmed: משתמש זה כבר אושר
         send: שלח מחדש דוא"ל אימות
@@ -87,113 +201,830 @@ he:
       roles:
         admin: מנהל מערכת
         moderator: מנחה דיונים
+        staff: צוות
         user: משתמש(ת)
       search: חיפוש
+      search_same_email_domain: משתמשים אחרים מאותו דומיין דוא"ל
+      search_same_ip: משתמשים אחרים מאותה כתובת IP
+      security_measures:
+        only_password: סיסמא בלבד
+        password_and_2fa: סיסמא ואימות דו-גורמי
+      sensitive: מאולצים לרגישות
+      sensitized: מסומנים כרגישים
       shared_inbox_url: תיבה משותפת לדואר נכנס
       show:
         created_reports: דיווחים מאת חשבון זה
         targeted_reports: דיווחים נגד חשבון זה
       silence: השתקה
+      silenced: מוגבלים
       statuses: הודעות
       strikes: עבירות קודמות
       subscribe: הרשמה
       suspend: השעייה
+      suspended: מושעים
+      suspension_irreversible: המידע בחשבון זה נמחק באופן בלתי הפיך. ניתן להסיר את ההשעיה מהחשבון על מנת להחזיר אותו למצב שמיש, אבל שום מידע שהיה בבעלותו לא ישוחזר.
+      suspension_reversible_hint_html: חשבון זה הושעה, והמידע בו יוסר במלואו בתאריך %{date}. עד אז, ניתן לשחזר את החשבון ללא תופעות לוואי שליליות. אם ברצונך להסיר את כל המידע בחשבון באופן מידי, ניתן לעשות כן להלן.
       title: חשבונות
+      unblock_email: ביטול חסימת כתובת דוא"ל
+      unblocked_email_msg: הסרת חסימה מכתובת הדוא"ל של %{username} בוצעה בהצלחה
+      unconfirmed_email: כתובת דוא"ל לא מאומתת
+      undo_sensitized: בטל רגישות לכח
       undo_silenced: ביטול השתקה
       undo_suspension: ביטול השעייה
+      unsilenced_msg: ביטול הגבלה לחשבונו של %{username} בוצע בהצלחה
       unsubscribe: הפסקת הרשמה
+      unsuspended_msg: הסרת השעיה מהחשבון של %{username} בוצעה בהצלחה
       username: שם משתמש
+      view_domain: צפיה בסיכום שרת
+      warn: אזהרה
       web: רשת
+      whitelisted: מותר לפדרציה
+    action_logs:
+      action_types:
+        approve_appeal: אישור ערעור
+        approve_user: אישור משתמש
+        assigned_to_self_report: הקצאת דו"ח
+        change_email_user: שינוי כתובת דוא"ל למשתמש
+        confirm_user: אשר משתמש
+        create_account_warning: יצירת אזהרה
+        create_announcement: יצירת הכרזה
+        create_custom_emoji: יצירת אמוג'י מיוחד
+        create_domain_allow: יצירת דומיין מותר
+        create_domain_block: יצירת דומיין חסום
+        create_email_domain_block: יצירת חסימת דומיין דוא"ל
+        create_ip_block: יצירת כלל IP
+        create_unavailable_domain: יצירת דומיין בלתי זמין
+        demote_user: הורדת משתמש בדרגה
+        destroy_announcement: מחיקת הכרזה
+        destroy_custom_emoji: מחיקת אמוג'י יחודי
+        destroy_domain_allow: מחיקת דומיין מותר
+        destroy_domain_block: מחיקת דומיין חסום
+        destroy_email_domain_block: מחיקת חסימת דומיין דוא"ל
+        destroy_instance: טיהור דומיין
+        destroy_ip_block: מחיקת כלל IP
+        destroy_status: מחיקת חצרוץ
+        destroy_unavailable_domain: מחיקת דומיין בלתי זמין
+        disable_2fa_user: השעיית זיהוי דו-גורמי
+        disable_custom_emoji: השעיית אמוג'י מיוחד
+        disable_sign_in_token_auth_user: השעיית אסימון הזדהות בדוא"ל של משתמש
+        disable_user: השעיית משתמש
+        enable_custom_emoji: הפעלת אמוג'י מיוחד
+        enable_sign_in_token_auth_user: הפעלת אסימון הזדהות בדוא"ל של משתמש
+        enable_user: אפשור משתמש
+        memorialize_account: הנצחת חשבון
+        promote_user: קידום משתמש
+        reject_appeal: דחיית ערעור
+        reject_user: דחיית משתמש
+        remove_avatar_user: הסרת תמונת פרופיל
+        reopen_report: פתיחת דו"ח מחדש
+        reset_password_user: איפוס סיסמא
+        resolve_report: פתירת דו"ח
+        sensitive_account: חשבון רגיש לכח
+        silence_account: הגבלת חשבון
+        suspend_account: השעיית חשבון
+        unassigned_report: ביטול הקצאת דו"ח
+        unblock_email_account: ביטול חסימת כתובת דוא"ל
+        unsensitive_account: ביטול Force-Sensitive לחשבון
+        unsilence_account: ביטול השתקת חשבון
+        unsuspend_account: ביטול השעיית חשבון
+        update_announcement: עדכון הכרזה
+        update_custom_emoji: עדכון סמלון מותאם אישית
+        update_domain_block: עדכון חסימת שם מתחם
+        update_status: סטטוס עדכון
+      actions:
+        approve_appeal_html: "%{name} אישר/ה ערעור על החלטת מנהלי הקהילה מ-%{target}"
+        approve_user_html: "%{name} אישר/ה הרשמה מ-%{target}"
+        assigned_to_self_report_html: '%{name} הקצה/תה דו"ח %{target} לעצמם'
+        change_email_user_html: '%{name} שינה/תה את כתובת הדוא"ל של המשתמש %{target}'
+        confirm_user_html: '%{name} אישר/ה את כותבת הדו"אל של המשתמש %{target}'
+        create_account_warning_html: "%{name} שלח/ה אזהרה ל %{target}"
+        create_announcement_html: "%{name} יצר/ה הכרזה חדשה %{target}"
+        create_custom_emoji_html: "%{name} העלו אמוג'י חדש %{target}"
+        create_domain_allow_html: "%{name} אישר/ה פדרציה עם הדומיין %{target}"
+        create_domain_block_html: "%{name} חסם/ה את הדומיין %{target}"
+        create_email_domain_block_html: '%{name} חסם/ה את דומיין הדוא"ל %{target}'
+        create_ip_block_html: "%{name} יצר/ה כלל עבור IP %{target}"
+        create_unavailable_domain_html: "%{name} הפסיק/ה משלוח לדומיין %{target}"
+        demote_user_html: "%{name} הוריד/ה בדרגה את המשתמש %{target}"
+        destroy_announcement_html: "%{name} מחק/ה את ההכרזה %{target}"
+        destroy_custom_emoji_html: "%{name} השמיד/ה את האמוג'י %{target}"
+        destroy_domain_allow_html: "%{name} לא התיר/ה פדרציה עם הדומיין %{target}"
+        destroy_domain_block_html: "%{name} הסיר/ה חסימה מהדומיין %{target}"
+        destroy_email_domain_block_html: '%{name} הסיר/ה חסימה מדומיין הדוא"ל %{target}'
+        destroy_instance_html: "%{name} טיהר/ה את הדומיין %{target}"
+        destroy_ip_block_html: "%{name} מחק/ה את הכלל עבור IP %{target}"
+        destroy_status_html: "%{name} הסיר/ה חצרוץ מאת %{target}"
+        destroy_unavailable_domain_html: "%{name} התחיל/ה מחדש משלוח לדומיין %{target}"
+        disable_2fa_user_html: "%{name} ביטל/ה את הדרישה לאימות דו-גורמי למשתמש %{target}"
+        disable_custom_emoji_html: "%{name} השבית/ה את האמוג'י %{target}"
+        disable_sign_in_token_auth_user_html: '%{name} השבית/ה את האימות בעזרת אסימון דוא"ל עבור %{target}'
+        disable_user_html: "%{name} חסם/ה כניסה מהמשתמש/ת %{target}"
+        enable_custom_emoji_html: "%{name} אפשר/ה את האמוג'י %{target}"
+        enable_sign_in_token_auth_user_html: '%{name} אפשר/ה אימות בעזרת אסימון דוא"ל עבור %{target}'
+        enable_user_html: "%{name} אפשר/ה כניסה עבור המשתמש %{target}"
+        memorialize_account_html: "%{name} הפך/ה את חשבונו של %{target} לדף הנצחה"
+        promote_user_html: "%{name} העלה בדרגה את המשתמש %{target}"
+        reject_appeal_html: "%{name} דחו ערעור על החלטת הנהלת הקהילה מ-%{target}"
+        reject_user_html: "%{name} דחו הרשמה מ-%{target}"
+        remove_avatar_user_html: "%{name} הסירו את תמונת הפרופיל של %{target}"
+        reopen_report_html: '%{name} פתח מחדש דו"ח %{target}'
+        reset_password_user_html: "%{name} איפס/ה סיסמא עבור המשתמש %{target}"
+        resolve_report_html: '%{name} פתר/ה דו"ח %{target}'
+        sensitive_account_html: "%{name} סימן/ה את המדיה של %{target} כרגיש"
+        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}"
+        unsuspend_account_html: "%{name} ביטל/ה את ההשעיה של החשבון של %{target}"
+        update_announcement_html: "%{name} עדכן/ה הכרזה %{target}"
+        update_custom_emoji_html: "%{name} עדכן/ה אמוג'י %{target}"
+        update_domain_block_html: "%{name} עדכן/ה חסימת דומיין עבור %{target}"
+        update_status_html: "%{name} עדכן/ה חצרוץ של %{target}"
+      deleted_status: "(חצרוץ נמחק)"
+      empty: לא נמצאו יומנים.
+      filter_by_action: סינון לפי פעולה
+      filter_by_user: סינון לפי משתמש
+      title: ביקורת יומן
+    announcements:
+      destroyed_msg: הכרזה נמחקה בהצלחה!
+      edit:
+        title: עריכת הכרזה
+      empty: לא נמצאו הכרזות.
+      live: חי
+      new:
+        create: יצירת הכרזה
+        title: הכרזה חדשה
+      publish: פרסום
+      published_msg: ההכרזה פורסמה בהצלחה!
+      scheduled_for: מתוזמן ל-%{time}
+      scheduled_msg: ההכרזה תוזמנה לפרסום!
+      title: הכרזות
+      unpublish: ביטול פרסום
+      unpublished_msg: פרסום ההכרזה בוטל בהצלחה!
+      updated_msg: ההכרזה עודכנה בהצלחה!
+    custom_emojis:
+      assign_category: הקצאת קטגוריה
+      by_domain: לפי קהילה
+      copied_msg: עותק מקומי של האמוג'י נוצר בהצלחה
+      copy: להעתיק
+      copy_failed_msg: לא ניתן ליצור עותק מקומי של האמוג'י הזה
+      create_new_category: צור קטגוריה חדשה
+      created_msg: אמוג'י נוצר בהצלחה!
+      delete: למחוק
+      destroyed_msg: אמוג'י הושמד בהצלחה!
+      disable: השבתה
+      disabled: מושבת
+      disabled_msg: השבתת אמוג'י זה בוצעה בהצלחה
+      emoji: אמוג'י
+      enable: לאפשר
+      enabled: מאופשר
+      enabled_msg: אמוג'י זה אופשר בהצלחה
+      image_hint: PNG או GIF עד לגודל %{size}
+      list: רשימה
+      listed: ברשימה
+      new:
+        title: הוספת אמוג'י מיוחד חדש
+      not_permitted: אין לך הרשאות לביצוע פעולה זו
+      overwrite: לדרוס
+      shortcode: קוד קצר
+      shortcode_hint: לפחות 2 תוים, אלפאנומריים או קו תחתי
+      title: יצגנים מותאמים אישית
+      uncategorized: לא מסווגים
+      unlist: בטל רישום
+      unlisted: לא רשומים
+      update_failed_msg: לא ניתן היה לעדכן את היצגן הזה
+      updated_msg: יצגן עודכן בהצלחה!
+      upload: העלאה
+    dashboard:
+      active_users: משתמשים פעילים
+      interactions: אינטראקציות
+      media_storage: נפח אחסון מדיה
+      new_users: משתמשים חדשים
+      opened_reports: דו"חות פתוחים
+      pending_appeals_html:
+        many: "<strong>%{count}</strong> ערעורים ממתינים"
+        one: ערעור <strong>%{count}</strong> ממתין
+        other: "<strong>%{count}</strong> ערעורים ממתינים"
+        two: "<strong>%{count}</strong> ערעורים ממתינים"
+      pending_reports_html:
+        many: "<strong>%{count}</strong> דוחות ממתינים"
+        one: דו"ח <strong>%{count}</strong> ממתין
+        other: "<strong>%{count}</strong> דוחות ממתינים"
+        two: "<strong>%{count}</strong> דוחות ממתינים"
+      pending_tags_html:
+        many: "<strong>%{count}</strong> האשתגיות ממתינות"
+        one: "<strong>%{count}</strong> האשתג ממתין"
+        other: "<strong>%{count}</strong> האשתגיות ממתינות"
+        two: "<strong>%{count}</strong> האשתגיות ממתינות"
+      pending_users_html:
+        many: "<strong>%{count}</strong> משתמשים ממתינים"
+        one: "<strong>%{count}</strong> משתמש/ת ממתינ/ה"
+        other: "<strong>%{count}</strong> משתמשים ממתינים"
+        two: "<strong>%{count}</strong> משתמשים ממתינים"
+      resolved_reports: דו"חות נפתרו
+      software: תוכנה
+      sources: משאבי הרשמה
+      space: נפח בשימוש
+      title: לוח בקרה
+      top_languages: שפות פעילות מובילות
+      top_servers: שרתים פעילים מובילים
+      website: אתר
+    disputes:
+      appeals:
+        empty: לא נמצאו ערעורים.
+        title: ערעורים
+    domain_allows:
+      add_new: אפשר מַאֲחָד (פדרציה) עם שם המתחם
+      created_msg: הדומיין אופשר לפדרציה בהצלחה
+      destroyed_msg: הדומיין לא אופשר לפדרציה
+      undo: אסור מַאֲחָד (פדרציה) עם שם המתחם
     domain_blocks:
       add_new: הוספת חדש
       created_msg: חסימת שרת בתהליך
       destroyed_msg: חסימת שרת בוטלה
       domain: שרת
+      edit: עריכת חסימת שם מתחם
+      existing_domain_block_html: כבר הפעלת הגבלות חמורות יותר על %{name}, עליך ראשית <a href="%{unblock_url}">להסיר מעליו/ה את החסימה</a>.
       new:
         create: יצירת חסימה
         hint: חסימת השרת לא תמנע יצירת רישומי חשבון במסד הנתונים, אבל תבצע פעולות ניהול קהילה מסוימות על חשבונות אלו אוטומטית ורטרואקטיבית.
         severity:
           desc_html: "<strong>השתקה</strong> תחביא הודעות מחשבון זה לכל מי שלא עוקב אחריו. <strong>השעייה</strong> תסיר מהשרת את כל התוכן, מדיה ותכונות הפרופיל שמקושרות לחשבון זה. <strong>כלום</strong> כדי לחסום קבצי מדיה בלבד."
+          noop: ללא
           silence: השתקה
           suspend: השעייה
         title: חסימת שרת חדשה
+      obfuscate: לערפל את שם הדומיין
+      obfuscate_hint: לערפל באופן חלקי את שם הדומיין ברשימה אם פרסום רשימת ההגבלות על דומיינים מאופשר
+      private_comment: הערה פרטית
+      private_comment_hint: הערה על הגבלות לדומיין זה לשימוש פנימי של מנהלי הקהילה.
+      public_comment: תגובה פומבית
+      public_comment_hint: הערה אודות הגבלת דומיין זה לציבור הכללי, אם פרסום רשימת הגבלות הדומיינים מאופשר.
       reject_media: חסימת קבצי מדיה
       reject_media_hint: מסירה קבצי מדיה השמורים מקומית ומונעת מהורדת קבצים נוספים בעתיד. לא רלוונטי להשעיות
+      reject_reports: דחה דוחות
+      reject_reports_hint: התעלמות מכל הדיווחים הבאים מהדומיין הזה. לא רלוונטי עבור השעיות
       undo: ביטול
+      view: צפייה בחסימת דומיינים
+    email_domain_blocks:
+      add_new: הוספת חדש
+      attempts_over_week:
+        many: "%{count} נסיונות הרשמה במשך השבוע שעבר"
+        one: "%{count} נסיון במשך השבוע שעבר"
+        other: "%{count} נסיונות הרשמה במשך השבוע שעבר"
+        two: "%{count} נסיונות הרשמה במשך השבוע שעבר"
+      created_msg: כתובת מייל נחסמה בהצלחה
+      delete: מחיקה
+      dns:
+        types:
+          mx: רשומת MX
+      domain: דומיין
+      new:
+        create: הוספת דומיין
+        resolve: פתור דומיין
+        title: חסימת דומיין דוא"ל
+      no_email_domain_block_selected: לא בוצעו שינויים לחסימת דומייני דוא"ל שכן לא נבחרו דומיינים
+      resolved_dns_records_hint_html: שם הדומיין מוביל לדומייניי ה-MX הבאים, שהם בסופו של דבר אחראיים לקבלת דוא"ל. חסימת דומיין MX תוביל לחסימת הרשמות מכל כתובת דוא"ל שעושה שימוש בדומיין MX זה, אפילו אם הדומיין הגלוי שונה. <strong>יש להמנע מלחסום ספקי דוא"ל מובילים.</strong>
+      resolved_through_html: נמצא דרך %{domain}
+      title: דומייניי דוא"ל חסומים
+    follow_recommendations:
+      description_html: "<strong>עקבו אחר ההמלצות על מנת לעזור למשתמשים חדשים למצוא תוכן מעניין</strong>. במידה ומשתמש לא תקשר מספיק עם משתמשים אחרים כדי ליצור המלצות מעקב, חשבונות אלה יומלצו במקום. הם מחושבים מחדש על בסיסי יומיומי מתערובת של החשבונות הפעילים ביותר עם החשבונות הנעקבים ביותר עבור שפה נתונה."
+      language: עבור שפה
+      status: מצב
+      suppress: דכא המלצות מעקב
+      suppressed: מדוכא
+      title: המלצות מעקב
+      unsuppress: שחזור המלצות מעקב
     instances:
+      availability:
+        description_html:
+          many: אם משלוח לדומיין נכשל במשך <strong>%{count} ימים שונים</strong> ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח <em>מ</em>הדומיין.
+          one: אם משלוח לדומיין נכשל במשך <strong>%{count} ימים</strong> ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח <em>מ</em>הדומיין.
+          other: אם משלוח לדומיין נכשל במשך <strong>%{count} ימים שונים</strong> ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח <em>מ</em>הדומיין.
+          two: אם משלוח לדומיין נכשל במשך <strong>%{count} ימים שונים</strong> ולא מצליח, נסיונות משלוח נוספים לא יעשו אלא אם התקבל משלוח <em>מ</em>הדומיין.
+        failure_threshold_reached: סף כשלון הושג ב-%{date}.
+        failures_recorded:
+          many: נסיונות כושלים ב-%{count} ימים שונים.
+          one: נסיון כושל ביום %{count}.
+          other: נסיונות כושלים ב-%{count} ימים שונים.
+          two: נסיונות כושלים ב-%{count} ימים שונים.
+        no_failures_recorded: לא נמצאו כשלונות.
+        title: זמינות
+        warning: הנסיון האחרון להתחבר לשרת זה לא עלה בהצלחה
+      back_to_all: כל
+      back_to_limited: מוגבל
+      back_to_warning: אזהרה
+      by_domain: דומיין
+      confirm_purge: האם את/ה בטוח/ה שברצונך למחוק באופן סופי מידע מדומיין זה?
+      content_policies:
+        comment: הערה פנימית
+        description_html: ביכולתך להגדיר מדיניות תוכן שתופעל על כל החשבונות מדומיין זה ומתת-דומייניו.
+        policies:
+          reject_media: דחיית מדיה
+          reject_reports: דחיית דו"חות
+          silence: הגבלה
+          suspend: השעייה
+        policy: מדיניות
+        reason: סיבה פומבית
+        title: מדיניות תוכן
+      dashboard:
+        instance_accounts_dimension: חשבונות בעלי העוקבים הרבים ביותר
+        instance_accounts_measure: חשבונות מאופסנים
+        instance_followers_measure: עוקבינו שם
+        instance_follows_measure: עוקביהם כאן
+        instance_languages_dimension: שפות מובילות
+        instance_media_attachments_measure: קבצי מדיה מאופסנים
+        instance_reports_measure: דו"חות אודותיהם
+        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:
+        many: "%{count} חשבונות ידועים"
+        one: חשבון ידוע %{count}
+        other: "%{count} חשבונות ידועים"
+        two: "%{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:
+        all: כל ההזמנות
+        available: זמין
+        expired: פג תוקף
+        title: מסנן
+      title: הזמנות
+    ip_blocks:
+      add_new: צור כלל
+      created_msg: כלל IP חדש הוסף בהצלחה
+      delete: למחוק
+      expires_in:
+        '1209600': שבועיים
+        '15778476': 6 חודשים
+        '2629746': חודש אחד
+        '31556952': שנה אחת
+        '86400': יום אחד
+        '94670856': 3 שנים
+      new:
+        title: יצירת כלל IP
+      no_ip_block_selected: שום כלל IP לא שונה כי שום כלל IP לא נבחר
+      title: כללי IP
+    relationships:
+      title: היחסים של %{acct}
+    relays:
+      add_new: הוספת ממסר חדש
+      delete: מחיקה
+      description_html: "<strong>ממסר פדרטיבי</strong> הוא שרת מתווך שמחליף כמויות גדולות של חצרוצים פומביים בין שרתים שרשומים ומפרסמים אליו. <strong>הוא יכול לעזור לשרתים קטנים ובינוניים לגלות תוכן מהפדרציה</strong>, מה שאחרת היה דורש ממשתמשים מקומיים לעקוב ידנית אחרי אנשים בשרתים מרוחקים."
+      disable: השבתה
+      disabled: מושבת
+      enable: לאפשר
+      enable_hint: מרגע שאופשר, השרת שלך יירשם לכל החצרוצים הפומביים מהממסר הזה, ויתחיל לשלוח את חצרוציו הפומביים לממסר.
+      enabled: מאופשר
+      inbox_url: קישורית ממסר
+      pending: ממתין לאישור הממסר
+      save_and_enable: שמור והפעל
+      setup: הגדר חיבור לממסר
+      signatures_not_enabled: ממסרים לא עובדים נכון כשמאופשרים מצב מאובטח או מצב פדרציה מוגבל
+      status: מצב
+      title: ממסרים
     report_notes:
+      created_msg: הערה על דו"ח נוצרה בהצלחה!
+      destroyed_msg: הערה על דו"ח נמחקה בהצלחה!
       today_at: היום, ב%{time}
     reports:
+      account:
+        notes:
+          many: "%{count} הערות"
+          one: הערה %{count}
+          other: "%{count} הערות"
+          two: "%{count} הערות"
+      action_log: ביקורת יומן
+      action_taken_by: פעולה בוצעה ע"י
       actions:
         delete_description_html: הפוסטים המדווחים יימחקו ותרשם עבירה על מנת להקל בהעלאה של דיווחים עתידיים על אותה חשבון.
+        mark_as_sensitive_description_html: המדיה בחצרוצים מדווחים תסומן כרגישה ועבירה תרשם כדי לעזור לך להסלים באינטראקציות עתידיות עם אותו החשבון.
+        other_description_html: ראו אפשרויות נוספות לשליטה בהתנהגות החשבון וכדי לבצע התאמות בתקשורת עם החשבון המדווח.
         resolve_description_html: אף פעולה לא תבוצע נגד החשבון עליו דווח, לא תירשם עבירה, והדיווח ייסגר.
+        silence_description_html: הפרופיל יהיה גלוי אך ורק לאלה שכבר עוקבים אחריו או לאלה שיחפשו אותו ידנית, מה שיגביל מאד את תפוצתו. ניתן תמיד להחזיר את המצב לקדמותו.
+        suspend_description_html: הפרופיל וכל תכולתו יחסמו לכל גישה עד שבסופו של דבר ימחקו. כל תקשורת עם החשבון תהיה בלתי אפשרית. ניתן לביטול תוך 30 יום.
+      actions_description_html: בחר/י איזו פעולה לבצע על מנת לפתור את הדו"ח. אם תופעל פעולת ענישה כנגד החשבון המדווח, הודעת דוא"ל תשלח אליהם, אלא אם נבחרה קטגוריית ה<strong>ספאם</strong>.
       add_to_report: הוספת פרטים לדיווח
       are_you_sure: 100% על בטוח?
+      assign_to_self: הקצה אלי
+      assigned: מנחה מוקצה
+      by_target_domain: דומיין החשבון המדווח
       category: קטגוריה
+      category_description_html: הסיבה בגללה חשבון זה ו/או תוכנו דווחו תצוטט בתקשורת עם החשבון המדווח
       comment:
         none: ללא
       comment_description_html: 'על מנת לספק עוד מידע, %{name} כתב\ה:'
+      created_at: מדווח
+      delete_and_resolve: מחיקת חצרוצים
+      forwarded: קודם
+      forwarded_to: קודם ל-%{domain}
       mark_as_resolved: סימון כפתור
+      mark_as_sensitive: סימון כרגיש
+      mark_as_unresolved: סימון כלא פתור
       no_one_assigned: אף אחד
       notes:
+        create: הוספת הערה
+        create_and_resolve: פתרון עם הערה
+        create_and_unresolve: פתיחה מחדש עם הערה
+        delete: מחיקה
+        placeholder: תאר/י אילו פעולות ננקטו, או עדכונים קשורים אחרים...
         title: הערות
+      notes_description_html: צפייה והשארת הערות למנחים אחרים או לעצמך העתידי
+      quick_actions_description_html: 'נקוט/י פעולה מהירה או גלול/י למטה לצפייה בתוכן המדווח:'
+      remote_user_placeholder: המשתמש המרוחק מ-%{instance}
+      reopen: פתיחת דו"ח מחדש
       report: 'דווח על #%{id}'
       reported_account: חשבון מדווח
       reported_by: דווח על ידי
       resolved: פתור
+      resolved_msg: הדו"ח נפתר בהצלחה!
+      skip_to_actions: דלג/י לפעולות
       status: הודעה
       statuses: התוכן עליו דווח
+      statuses_description_html: התוכן הפוגע יצוטט בתקשורת עם החשבון המדווח
+      target_origin: מקור החשבון המדווח
       title: דיווחים
+      unassign: ביטול הקצאה
       unresolved: לא פתור
+      updated_at: עודכן
       view_profile: צפה בפרופיל
+    rules:
+      add_new: הוספת כלל
+      delete: מחיקה
+      description_html: בעוד הרוב טוען שקרא והסכים לתנאי השימוש, אנשים לא נוטים לקרוא אותם עד הסוף עד שמתעוררת בעיה. <strong>כדי שיקל לראות את כללי השרת במבט, יש לספקם כרשימת נקודות.</strong> כדאי לשמור על הכללים קצרים ופשוטים, אבל מאידך גם לא לפצל אותם ליותר מדי נקודות נפרדות.
+      edit: עריכת כלל
+      empty: שום כללי שרת לא הוגדרו עדיין.
+      title: כללי שרת
     settings:
+      activity_api_enabled:
+        desc_html: מספר החצרוצים שפורסמו מקומית, משתמשים פעילים, והרשמות חדשות בדליים שבועיים
+        title: פרסום סטטיסטיקות מקובצות עבור פעילות משתמשים בממשק
+      bootstrap_timeline_accounts:
+        desc_html: הפרדת משתמשים מרובים בפסיק. למשתמשים אלה מובטח שהם יכללו בהמלצות המעקב
+        title: המלצה על חשבונות אלה למשתמשים חדשים
       contact_information:
         email: נא להקליד כתובת דוא"ל פומבית
         username: נא להכניס שם משתמש
+      custom_css:
+        desc_html: שינוי המראה בעזרת CSS הנטען בכל דף
+        title: CSS יחודי
+      default_noindex:
+        desc_html: משפיע על כל המשתמשים שלא שינו את ההגדרה בעצמם
+        title: לא לכלול משתמשים במנוע החיפוש כברירת מחדל
+      domain_blocks:
+        all: לכולם
+        disabled: לאף אחד
+        title: צפיה בחסימת דומיינים
+        users: למשתמשים מקומיים מחוברים
+      domain_blocks_rationale:
+        title: הצגת רציונל
+      hero:
+        desc_html: מוצגת בדף הראשי. מומלץ לפחות 600x100px. אם לא נבחר, מוצגת במקום תמונה מוקטנת מהשרת
+        title: תמונת גיבור
+      mascot:
+        desc_html: מוצגת בכל מיני דפים. מומלץ לפחות 293×205px. אם לא נבחר, מוצג במקום קמע ברירת המחדל
+        title: תמונת קמע
+      peers_api_enabled:
+        desc_html: שמות דומיינים ששרת זה נתקל בהם ברחבי הפדרציה
+        title: פרסם רשימה של שרתים שנתגלו דרך הממשק
+      preview_sensitive_media:
+        desc_html: תצוגה מקדימה של קישוריות לאתרים אחרים יוצגו כתמונה מוקטנת אפילו אם המדיה מסומנת כרגישה
+        title: הצגת מדיה רגישה בתצוגה מקדימה של OpenGraph
+      profile_directory:
+        desc_html: הרשאה למשתמשים להתגלות
+        title: הרשאה לספריית פרופילים
       registrations:
         closed_message:
-          desc_html: מוצג על הדף הראשי כאשר ההרשמות סגורות<br>ניתן להשתמש בתגיות HTML
+          desc_html: מוצג על הדף הראשי כאשר ההרשמות סגורות. ניתן להשתמש בתגיות HTML
           title: מסר סגירת הרשמות
+        deletion:
+          desc_html: הרשאה לכולם למחוק את חשבונם
+          title: פתיחת מחיקת חשבון
+        min_invite_role:
+          disabled: אף אחד
+          title: אפשר הזמנות לפי
+        require_invite_text:
+          desc_html: כאשר הרשמות דורשות אישור ידני, הפיכת טקסט ה"מדוע את/ה רוצה להצטרף" להכרחי במקום אופציונלי
+          title: אלץ משתמשים חדשים למלא סיבת הצטרפות
+      registrations_mode:
+        modes:
+          approved: נדרש אישור הרשמה
+          none: אף אחד לא יכול להרשם
+          open: כל אחד יכול להרשם
+        title: מצב הרשמות
+      show_known_fediverse_at_about_page:
+        desc_html: כאשר לא מופעל, מגביל את הפיד הפומבי המקושר מדף הנחיתה להצגת תוכן מקומי בלבד
+        title: הכללת תוכן פדרטיבי בדף הפיד הפומבי הבלתי מאומת
+      show_staff_badge:
+        desc_html: הצג תג צוות בדף המשתמש
+        title: הצג תג צוות
       site_description:
         desc_html: מוצג כפסקה על הדף הראשי ומשמש כתגית מטא. ניתן להשתמש בתגיות HTML, ובמיוחד ב־<code> &lt; a&gt; </code> ו־<code> &lt; em&gt; </code> .
         title: תיאור האתר
       site_description_extended:
-        desc_html: מוצג על עמוד המידע הנוסף<br>ניתן להשתמש בתגיות HTML
+        desc_html: מקום טוב להצגת כללים, הנחיות, ודברים אחרים שמבדלים אותך ממופעים אחרים. ניתן להשתמש בתגיות HTML
         title: תיאור אתר מורחב
+      site_short_description:
+        desc_html: מוצג בעמודה הצידית ובמטא תגים. מתאר מהו מסטודון ומה מיחד שרת זה בפסקה בודדת.
+        title: תאור שרת קצר
+      site_terms:
+        desc_html: ניתן לכתוב מדיניות פרטיות, תנאי שירות ושאר מסמכים חוקיים בעצמך. ניתן להשתמש בתגי HTML
+        title: תנאי שירות יחודיים
       site_title: כותרת האתר
+      thumbnail:
+        desc_html: משמש לתצוגה מקדימה דרך OpenGraph והממשק. מומלץ 1200x630px
+        title: תמונה ממוזערת מהשרת
+      timeline_preview:
+        desc_html: הצגת קישורית לפיד הפומבי מדף הנחיתה והרשאה לממשק לגשת לפיד הפומבי ללא אימות
+        title: הרשאת גישה בלתי מאומתת לפיד הפומבי
       title: הגדרות אתר
+      trendable_by_default:
+        desc_html: משפיע על האשתגיות שלא נאסרו קודם לכן
+        title: הרשאה להאשתגיות להופיע בנושאים החמים ללא אישור מוקדם
+      trends:
+        desc_html: הצגה פומבית של תוכן שנסקר בעבר ומופיע כרגע בנושאים החמים
+        title: נושאים חמים
+    site_uploads:
+      delete: מחיקת קובץ שהועלה
+      destroyed_msg: העלאת אתר נמחקה בהצלחה!
     statuses:
+      back_to_account: חזרה לדף החשבון
       back_to_report: חזרה לעמוד הדיווח
       batch:
         remove_from_report: הסרה מהדיווח
         report: דווח
+      deleted: מחוקים
+      media:
+        title: מדיה
+      no_status_selected: לא בוצעו שינויים בחצרוצים שכן לא נבחרו חצרוצים
+      title: חצרוצי חשבון
+      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: בהמתנה לערעור
+    system_checks:
+      database_schema_check:
+        message_html: נדרשות הגירות מבני נתונים. אנא הריצו אותן כדי להבטיח שהיישום מתנהג כצפוי
+      elasticsearch_running_check:
+        message_html: לא ניתן להתחבר לחיפוש אלסטיק. בדקו בבקשה הוא רץ, או בטלו את חיפוש הטקסט המלא
+      elasticsearch_version_check:
+        message_html: 'גרסת חיפוש אלסטיק לא מתאימה: %{value}'
+        version_comparison: גרסת חיפוש אלסטיק %{running_version} רצה בעוד גרסא %{required_version} נדרשת
+      rules_check:
+        action: ניהול כללי שרת
+        message_html: לא הוגדרו שום כללי שרת.
+      sidekiq_process_check:
+        message_html: שום הליכי Sidekiq לא רצים עבור %{value} תור(ות). בחנו בבקשה את הגדרות Sidekiq
+    tags:
+      review: סקירת מצב
+      updated_msg: הגדרות האשתג עודכנו בהצלחה
     title: ניהול
+    trends:
+      allow: לאפשר
+      approved: אישור
+      disallow: לא לאשר
+      links:
+        allow: אישור קישורית
+        allow_provider: אישור מפרסם
+        description_html: בקישוריות אלה נעשה כרגע שימוש על ידי חשבונות רבים שהשרת שלך רואה חצרוצים מהם. זה עשוי לסייע למשתמשיך לברר מה קורה בעולם. שום קישוריות לא יוצגו עד שתאשרו את המפרסם. ניתן גם לאפשר או לדחות קישוריות ספציפיות.
+        disallow: לא לאשר קישורית
+        disallow_provider: לא לאשר מפרסם
+        shared_by_over_week:
+          many: הופץ על ידי %{count} אנשים בשבוע האחרון
+          one: הופץ על ידי אדם אחד בשבוע האחרון
+          other: הופץ על ידי %{count} אנשים בשבוע האחרון
+          two: הופץ על ידי %{count} אנשים בשבוע האחרון
+        title: קישוריות חמות
+        usage_comparison: הופץ %{today} פעמים היום, לעומת %{yesterday} אתמול
+      only_allowed: רק כאלה שהותרו
+      pending_review: בהמתנה לבדיקה
+      preview_card_providers:
+        allowed: קישוריות ממפרסם זה יכולות להכלל בנושאים החמים
+        description_html: אלה הם דומיינים מהם קישוריות מופצות תדיר לשרת שלך. קישוריות לא יכללו בנושאים החמים אלא אם דומיין הקישורית יאושר. אישורך (או דחייתך) יכלול גם תת-דומיינים.
+        rejected: קישוריות ממפרסם זה לא תכללנה בנושאים החמים
+        title: מפרסמים
+      rejected: דחוי
+      statuses:
+        allow: הרשאת חצרוץ
+        allow_account: הרשאת מחבר/ת
+        description_html: אלו הם חצרוצים שהשרת שלך מכיר וזוכים להדהודים וחיבובים רבים כרגע. זה עשוי למשתמשיך החדשים והחוזרים למצוא עוד נעקבים. החצרוצים לא מוצגים עד שיאושר המחבר/ת, והמחבר/ת יאשרו שחשבונים יומלץ לאחרים. ניתן לאשר או לדחות חצרוצים ספציפיים.
+        disallow: לא לאשר חצרוץ
+        disallow_account: לא לאשר מחבר/ת
+        not_discoverable: המחבר/ת לא בחר/ה לאפשר את גילויים
+        shared_by:
+          many: הודהד וחובב %{friendly_count} פעמים
+          one: הודהד או חובב פעם אחת
+          other: הודהד וחובב %{friendly_count} פעמים
+          two: הודהד וחובב %{friendly_count} פעמים
+        title: חצרוצים חמים
+      tags:
+        current_score: ציון נוכחי %{score}
+        dashboard:
+          tag_accounts_measure: שימושים יחודיים
+          tag_languages_dimension: שפות מובילות
+          tag_servers_dimension: שרתים מובילים
+          tag_servers_measure: שרתים שונים
+          tag_uses_measure: כלל השימושים
+        description_html: אלו הן האשתגיות שמופיעות הרבה כרגע בחצרוצים המגיעים לשרת. זה עשוי לעזור למשתמשיך למצוא על מה אנשים מרבים לדבר כרגע. שום האשתגיות לא יוצגו בפומבי עד שתאושרנה.
+        listable: ניתנות להצעה
+        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:
+          many: הוצגה על ידי %{count} משתמשים במשך השבוע שעבר
+          one: הוצגה על ידי משתמש בודד במשך השבוע שעבר
+          other: הוצגה על ידי %{count} משתמשים במשך השבוע שעבר
+          two: הוצגה על ידי %{count} משתמשים במשך השבוע שעבר
+      title: נושאים חמים
+      trending: נושאים חמים
+    warning_presets:
+      add_new: הוספת חדש
+      delete: למחוק
+      edit_preset: ערוך/י טקסט מוכן מראש לאזהרה
+      empty: לא הגדרת עדיין שום טקסט מוכן מראש לאזהרה.
+      title: ניהול טקסטים מוכנים מראש לאזהרות
+  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})
+    new_trends:
+      body: 'הפריטים הבאים זקוקים לסקירה לפני שניתן יהיה להציגם פומבית:'
+      new_trending_links:
+        no_approved_links: אין כרגע שום קישוריות חמות מאושרות.
+        requirements: כל אחד מהמועמדים האלה עשוי לעבור את הקישורית החמה המאושרת מדרגה %{rank}, שהיא כרגע %{lowest_link_title} עם ציון של %{lowest_link_score}.
+        title: נושאים חמים
+      new_trending_statuses:
+        no_approved_statuses: אין כרגע שום חצרוצים חמים מאושרים.
+        requirements: כל אחד מהמועמדים האלה עשוי לעבור החצרוץ החם המאושר מדרגה %{rank}, שההא כרגע %{lowest_status_url} עם ציון של %{lowest_status_score}.
+        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>.
+    remove: הסרת שם נרדף
+  appearance:
+    advanced_web_interface: ממשק ווב מתקדם
+    advanced_web_interface_hint: 'אם ברצונך לעשות שימוש במלוא רוחב המסך, ממשק הווב המתקדם מאפשר לך להגדיר עמודות רבות ושונות כדי לראות בו זמנית כמה מידע שתרצה/י: פיד הבית, התראות, פרהסיה ומספר כלשהו של רשימות והאשתגיות.'
+    animations_and_accessibility: הנפשות ונגישות
+    confirmation_dialogs: חלונות אישור
+    discovery: גילוי
+    localization:
+      body: מסטודון מתורגם על ידי מתנדבים.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: כולם יכולים לתרום.
+    sensitive_content: תוכן רגיש
+    toot_layout: פריסת חצרוץ
   application_mailer:
+    notification_preferences: שינוי העדפות דוא"ל
+    salutation: "%{name},"
     settings: 'שינוי הגדרות דוא"ל: %{link}'
     view: 'תצוגה:'
+    view_profile: צפיה בפרופיל
+    view_status: הצגת חצרוץ
   applications:
+    created: ישום נוצר בהצלחה
+    destroyed: ישום נמחק בהצלחה
     invalid_url: כתובת הקישורית אינה חוקית
+    regenerate_token: יצירת אסימון גישה מחדש
+    token_regenerated: אסימון גישה יוצר מחדש בהצלחה
+    warning: זהירות רבה נדרשת עם מידע זה. אין לחלוק אותו אף פעם עם אף אחד!
+    your_token: אסימון הגישה שלך
   auth:
+    apply_for_account: בקשת הזמנה
+    change_password: סיסמא
+    checkbox_agreement_html: אני מסכים/ה ל<a href="%{rules_path}" target="_blank">כללי השרת</a> ול<a href="%{terms_path}" target="_blank">תנאי השימוש</a>
+    checkbox_agreement_without_rules_html: אני מסכים/ה ל<a href="%{terms_path}" target="_blank">תנאי השימוש</a>
+    delete_account: מחיקת חשבון
+    delete_account_html: אם ברצונך למחוק את החשבון, ניתן <a href="%{path}">להמשיך כאן</a>. תתבקש/י לספק אישור נוסף.
+    description:
+      prefix_invited_by_user: "@%{name} מזמין אותך להצטרף לשרת זה במסטודון!"
+      prefix_sign_up: הרשם/י למסטודון היום!
+      suffix: כבעל/ת חשבון, תוכל/י לעקוב אחרי אנשים, לפרסם עדכונים ולהחליף מסרים עם משתמשים מכל שרת מסטודון ועוד!
     didnt_get_confirmation: לא התקבלו הוראות אימות?
+    dont_have_your_security_key: אין לך מפתח אבטחה?
     forgot_password: הנשתכחה סיסמתך?
+    invalid_reset_password_token: אסימון איפוס הסיסמא לא תקין או פג תוקף. נא לבקש אחד חדש.
+    link_to_otp: נא להכניס את קוד האימות הדו-גורמי מהטלפון או את קוד האחזור
+    link_to_webauth: נא להשתמש במכשיר מפתח האבטחה
     log_in_with: התחבר באמצעות
     login: כניסה
     logout: יציאה
+    migrate_account: מעבר לחשבון אחר
+    migrate_account_html: אם ברצונך להכווין את החשבון לעבר חשבון אחר, ניתן <a href="%{path}">להגדיר זאת כאן</a>.
+    or_log_in_with: או התחבר באמצעות
+    providers:
+      cas: CAS
+      saml: SAML
     register: הרשמה
+    registration_closed: "%{instance} לא מקבל חברים חדשים"
     resend_confirmation: שלח הוראות אימות בשנית
     reset_password: איפוס סיסמא
     security: החלפת סיסמא
     set_new_password: שינוי סיסמא
+    setup:
+      email_below_hint_html: אם כתובת הדוא"ל להלן לא נכונה, ניתן לשנותה כאן ולקבל דוא"ל אישור חדש.
+      email_settings_hint_html: דוא"ל האישור נשלח ל-%{email}. אם כתובת הדוא"ל הזו לא נכונה, ניתן לשנותה בהגדרות החשבון.
+      title: הגדרות
     status:
+      account_status: מצב חשבון
+      confirming: ממתין שדוא"ל האישור יושלם.
       functional: החשבון שלכם פעיל לגמרי.
+      pending: בקשתך ממתינה לאישור על ידי הצוות שלנו. זה עשוי לקחת זמן מה. דוא"ל יישלח אליך אם בקשתך התקבלה.
       redirecting_to: חשבונכם לא פעיל כעת מכיוון שמפנה ל%{acct}.
+      view_strikes: צפיה בעברות קודמות שנרשמו נגד חשבונך
+    too_fast: הטופס הוגש מהר מדי, נסה/י שוב.
+    trouble_logging_in: בעיה להתחבר לאתר?
+    use_security_key: שימוש במפתח אבטחה
   authorize_follow:
+    already_following: את/ה כבר עוקב/ת אחרי חשבון זה
+    already_requested: כבר נשלחה בקשת מעקב לחשבון זה
     error: למרבה הצער, היתה שגיאה בחיפוש החשבון המרוחק
     follow: לעקוב
+    follow_request: 'שלחת בקשת מעקב ל:'
+    following: 'הצלחה! הינך עוקב עכשיו אחרי:'
+    post_follow:
+      close: או, פשוט לסגור חלון זה.
+      return: הצג את פרופיל המשתמש
+      web: מעבר לווב
     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"
+      with_month_name: "%B %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} שעות"
@@ -208,116 +1039,661 @@ he:
       x_minutes: "%{count} דקות"
       x_months: "%{count} חודשים"
       x_seconds: "%{count} שניות"
+  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: שם המשתמש שלך שוב יהיה זמין
+      username_unavailable: שם המשתמש שלך יישאר בלתי זמין
+  directories:
+    directory: מדריך פרופילים
+    explanation: גלו משתמשים בהתבסס על תחומי העניין שלהם
+    explore_mastodon: חקור את %{title}
+  disputes:
+    strikes:
+      action_taken: הפעולה שבוצעה
+      appeal: ערער
+      appeal_approved: הערעור על פסילה זו התקבל
+      appeal_rejected: ערעור זה נדחה
+      appeal_submitted_at: ערעור הוגש
+      appealed_msg: הערעור שלך הוגש. במידה ויאושר, תיודע.
+      appeals:
+        submit: הגש ערעור
+      associated_report: הדו"ח המשויך
+      created_at: מתאריך
+      description_html: אלו הן הפעולות שננקטו כנגד חשבונך והאזהרות שנשלחו אליך על ידי צוות %{instance}.
+      recipient: הנמען
+      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:
-    '400': The request you submitted was invalid or malformed.
+    '400': הבקשה שהגשת לא תקינה.
     '403': חסרות לך הרשאות לצפיה בעמוד זה.
     '404': הדף המבוקש לא קיים.
-    '406': This page is not available in the requested format.
+    '406': הדף לא זמין בפורמט המבוקש.
     '410': הדף המבוקש כבר לא קיים.
     '422':
       content: בדיקת אבטחה נכשלה. החסמת עוגיותיך מפנינו?
       title: בדיקת בטיחות נכשלה
     '429': הוחנק
-    '500': 
-    '503': The page could not be served due to a temporary server failure.
+    '500':
+      content: אנו מצטערות, אבל משהו השתבש בצד שלנו.
+      title: דף זה אינו נכון
+    '503': לא ניתן להציג דף זה עקב תקלת שרת זמנית.
+    noscript_html: על מנת להשתמש ביישום הווב של מסטודון, נא לאפשר שימוש בג'אווהסקריפט. לחילופין אפשר לנסות את אחת ה<a href="%{apps_path}">אפליקציות הילידיות</a> שלנו המתאימה לסביבתך.
+  existing_username_validator:
+    not_found: לא נמצא משתמש מקומי בשם זה
+    not_found_multiple: לא נמצאו %{usernames}
   exports:
+    archive_takeout:
+      date: תאריך
+      download: הורדת הארכיון שלך
+      hint_html: ניתן לבקש ארכיון של <strong>חצרוציך וקבצי המדיה</strong> שלך. המידע המיוצא יהיה בפורמט אקטיביטיפאב, שיכול להיקרא על ידי כל תוכנה התומכת בו. ניתן לבקש ארכיון מדי 7 ימים.
+      in_progress: מייצר את הארכיון שלך...
+      request: לבקש את הארכיון שלך
+      size: גודל
     blocks: רשימת חסימות
+    bookmarks: סימניות
+    csv: CSV
+    domain_blocks: חסימות דומיינים
+    lists: רשימות
     mutes: רשימת השתקות
     storage: אחסון מדיה
+  featured_tags:
+    add_new: הוספת חדש
+    errors:
+      limit: המספר המירבי של האשתגיות כבר מוצג
+    hint_html: "<strong>מהן האשתגיות נבחרות?</strong> הן מוצגות במובלט בפרופיל הפומבי שלך ומאפשר לאנשים לעיין בחצרוציך הפומביים המסמונים בהאשתגיות אלה. הן כלי אדיר למעקב אחר עבודות יצירה ופרוייקטים לטווח ארוך."
+  filters:
+    contexts:
+      account: פרופילים
+      home: בית ורשימות
+      notifications: התראות
+      public: פידים פומביים
+      thread: שיחות
+    edit:
+      title: ערוך מסנן
+    errors:
+      invalid_context: לא סופק הקשר או הקשר לא תקין
+      invalid_irreversible: סינון בלתי הפיך עובד רק בהקשר פיד הבית או התראות
+    index:
+      delete: למחוק
+      empty: אין לך מסננים.
+      title: מסננים
+    new:
+      title: הוספת מסנן חדש
+  footer:
+    developers: מפתחות
+    more: עוד…
+    resources: משאבים
+    trending_now: נושאים חמים
   generic:
+    all: הכל
     changes_saved_msg: השינויים נשמרו בהצלחה!
+    copy: להעתיק
+    delete: למחוק
+    none: כלום
+    order_by: מיין לפי
     save_changes: שמור שינויים
+    today: היום
+    validation_errors:
+      many: משהו עדיין לא בסדר! נא לעיין ב-%{count} השגיאות להלן
+      one: משהו עדיין לא בסדר! נא לעיין בשגיאה להלן
+      other: משהו עדיין לא בסדר! נא לעיין ב-%{count} השגיאות להלן
+      two: משהו עדיין לא בסדר! נא לעיין ב-%{count} השגיאות להלן
+  html_validator:
+    invalid_markup: 'מכיל קוד HTML לא תקין: %{error}'
   imports:
+    errors:
+      over_rows_processing_limit: מכיל יותר מ-%{count} עמודות
+    modes:
+      merge: מיזוג
+      merge_long: שמירת רשומות קיימות והוספת חדשות
+      overwrite: דריסה
+      overwrite_long: החלף רשומות נוכחיות בחדשות
     preface: ניתן ליבא מידע מסויים כגון כל הנעקבים או המשתמשים החסומים לתוך חשבונך על שרת זה, מתוך קבצים שנוצרו על ידי יצוא משרת אחר כגון רשימת הנעקבים והחסומים שלך.
     success: כל המידע יובא בהצלחה, ויעובד בזמן הקרוב
     types:
       blocking: רשימת חסימות
+      bookmarks: סימניות
+      domain_blocking: רשימת שמות מתחם חסומים
       following: רשימת נעקבים
       muting: רשימת השתקות
     upload: יבוא
+  in_memoriam_html: לזכר.
+  invites:
+    delete: ביטול הפעלה
+    expired: פג תוקף
+    expires_in:
+      '1800': חצי שעה
+      '21600': 6 שעות
+      '3600': שעה
+      '43200': 12 שעות
+      '604800': שבוע
+      '86400': יום אחד
+    expires_in_prompt: לעולם לא
+    generate: צור קישור להזמנה
+    invited_by: הוזמנת ע"י
+    max_uses:
+      many: "%{count} שימושים"
+      one: שימוש אחד
+      other: "%{count} שימושים"
+      two: "%{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: נסיון כניסה כושל בשיטת %{method} מכתובת %{ip} (%{browser})
+    successful_sign_in_html: נסיון כניסה מוצלח בשיטה %{method} מכתובת %{ip} (%{browser})
+    title: הסטוריית אימותים
   media_attachments:
     validations:
       images_and_video: לא ניתן להוסיף וידאו לחצרוץ שכבר מכיל תמונות
+      not_ready: לא ניתן להצמיד קבצים שהעלאתם לא הסתיימה. נסה/י שוב בעוד רגע!
       too_many: לא ניתן להוסיף יותר מארבעה קבצים
   migrations:
+    acct: עבר אל
+    cancel: ביטול הפניה
+    cancel_explanation: ביטול ההפניה יפעיל מחדש את החשבון הנוכחי, אבל לא יחזיר את העוקבים שהועברו לחשבון החדש.
+    cancelled_msg: ההפניה בוטלה בהצלחה.
+    errors:
+      already_moved: זה אותו החשבון שכבר עברת אליו
+      missing_also_known_as: לא שם נרדף של החשבון הזה
+      move_to_self: לא יכול להיות החשבון הנוכחי
+      not_found: לא נמצאו
+      on_cooldown: את/ה בתקופת צינון
+    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: לאחר המעבר ישנה תקופת המתנה בה לא ניתן לעבור שוב
+      disabled_account: חשבונך הנוכחי לא יהיה שמיש לחלוטין לאחר מכן. עם זאת, ניתן יהיה לגשת ליצוא המידע, וכמו כן להפעילו מחדש.
+      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}, הנה הערותיך הקודמות לגביהם:'
   notification_mailer:
     admin:
       sign_up:
         subject: "%{name} נרשמו"
     digest:
+      action: הצגת כל ההתראות
       body: להלן סיכום זריז של הדברים שקרו על מאז ביקורך האחרון ב-%{since}
       mention: "%{name} פנה אליך ב:"
+      new_followers_summary:
+        many: חוץ מזה, נוספו לך %{count} עוקבים חדשים בזמן שלא היית! מדהים!
+        one: חוץ מזה, נוסף לך עוקב חדש בזמן שלא היית! הידד!
+        other: חוץ מזה, נוספו לך %{count} עוקבים חדשים בזמן שלא היית! מדהים!
+        two: חוץ מזה, נוספו לך %{count} עוקבים חדשים בזמן שלא היית! מדהים!
+      subject:
+        many: "%{count} התראות חדשות מאז ביקורך האחרון 🐘"
+        one: "התראה חדשה אחת מאז ביקורך האחרון 🐘"
+        other: "%{count} התראות חדשות מאז ביקורך האחרון 🐘"
+        two: "%{count} התראות חדשות מאז ביקורך האחרון 🐘"
+      title: בהעדרך...
     favourite:
       body: 'חצרוצך חובב על ידי %{name}:'
       subject: חצרוצך חובב על ידי %{name}
+      title: חיבוב חדש
     follow:
       body: "%{name} עכשיו במעקב אחריך!"
       subject: "%{name} עכשיו במעקב אחריך"
+      title: עוקב/ת חדש/ה
     follow_request:
+      action: ניהול בקשות מעקב
       body: התקבלה בקשת מעקב מ־%{name}
       subject: 'בקשת מעקב בהמתנה: %{name}'
+      title: בקשת מעקב חדשה
     mention:
+      action: תגובה
       body: 'התקבלה פניה עבורך מאת %{name} ב:'
       subject: התקבלה פניה עבורך מאת %{name}
+      title: אזכור חדש
+    poll:
+      subject: סקר מאת %{name} הסתיים
     reblog:
       body: 'חצרוצך הודהד על ידי %{name}:'
       subject: חצרוצך הודהד על ידי%{name}
+      title: הדהוד חדש
+    status:
+      subject: "%{name} בדיוק חצרץ"
     update:
       subject: "%{name} ערכו פוסט"
+  notifications:
+    email_events: ארועים להתראות דוא"ל
+    email_events_hint: 'בחר/י ארועים עבורים תרצה/י לקבל התראות:'
+    other_settings: הגדרות התראות אחרות
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: מליארד
+          million: מליון
+          quadrillion: קוואדריליון
+          thousand: אלף
+          trillion: טריליון
+  otp_authentication:
+    code_hint: על מנת לאשר, נא להכניס את הקוד שיוצר על ידי יישום האימות שלך
+    description_html: אם אופשר <strong>אימות דו-גורמי</strong> בעזרת אפליקציית אימות, כניסה לאתר תדרוש שימוש בטלפון ליצירת אסימוני כניסה עבורך.
+    enable: לאפשר
+    instructions_html: "<strong>נא לסרוק את קוד ה-QR בעזרת Google Authenticator או יישום TOTP דומה בטלפונך</strong>. מעתה ואילך, יישום זה ייצר אסימונים שיש להזין בזמן הכניסה לאתר."
+    manual_instructions: 'אם לא ניתן לסרוק את קוד ה-QR ויש להכניסו ידנית, הנה הסוד כטקסט:'
+    setup: הגדרה
+    wrong_code: הקוד שהוכנס אינו תקין! האם זמן השרת וזמן המכשיר נכונים?
   pagination:
+    newer: חדש יותר
     next: הבא
+    older: ישן יותר
     prev: הקודם
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: כבר הצבעת בסקר זה
+      duplicate_options: מכיל פריטים כפולים
+      duration_too_long: רחוק מדי בעתיד
+      duration_too_short: מוקדם מדי
+      expired: סקר זה כבר הסתיים
+      invalid_choice: ההצבעה שנבחרה אינה קיימת
+      over_character_limit: לא יכולים להיות יותר מ-%{max} תוים כל אחד
+      too_few_options: חייב להכיל יותר מפריט אחד
+      too_many_options: לא יכול להכיל יותר מ-%{max} פריטים
+  preferences:
+    other: שונות
+    posting_defaults: ברירות מחדל לחצרוץ
+    public_timelines: פידים פומביים
+  reactions:
+    errors:
+      limit_reached: גבול מספר התגובות השונות הושג
+      unrecognized_emoji: הוא לא אמוג'י מוכר
+  relationships:
+    activity: רמת פעילות
+    dormant: רדומים
+    follow_selected_followers: עקוב אחר הנעקבים שנבחרו
+    followers: עוקבים
+    following: נעקבים
+    invited: הוזמנו
+    last_active: פעילות אחרונה
+    most_recent: העדכניות ביותר
+    moved: הועברו
+    mutual: הדדיים
+    primary: עיקריים
+    relationship: יחסים
+    remove_selected_domains: הסר את כל העוקבים משמות המתחם שסומנו
+    remove_selected_followers: הסר את העוקבים שסומנו
+    remove_selected_follows: בטל מעקב אחר המשתמשים שסומנו
+    status: מצב חשבון
   remote_follow:
     acct: נא להקליד שם_משתמש@קהילה מהם ברצונך לעקוב
     missing_resource: לא ניתן למצוא קישורית להפניה לחשבונך
+    no_account_html: אין לך חשבון? ניתן <a href='%{sign_up_path}' target='_blank'>להרשם כאן</a>
     proceed: להמשיך ולעקוב
     prompt: 'לעקוב אחרי:'
+    reason_html: "<strong>למה שלב זה הכרחי?</strong> <code>%{instance}</code> עשוי לא להיות השרת בו את/ה רשום/ה, כך שנצטרך קודם כל להעביר אותך לשרת הבית."
+  remote_interaction:
+    favourite:
+      proceed: המשך לחיבוב
+      prompt: 'ברצונך לחבב חצרוץ זה:'
+    reblog:
+      proceed: המשיכו להדהוד
+      prompt: 'ברצונך להדהד חצרוץ זה:'
+    reply:
+      proceed: המשיבו לתגובה
+      prompt: 'ברצונך להשיב לחצרוץ זה:'
+  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: דפדפן
+    browsers:
+      alipay: Alipay
+      blackberry: בלקברי
+      chrome: כרום
+      edge: מייקרוסופט אדג'
+      electron: אלקטרון
+      firefox: פיירפוקס
+      generic: דפדפן לא ידוע
+      ie: אינטרנט אקספלורר
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
+      opera: אופרה
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: דפדפן QQ
+      safari: ספארי
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: חיבור נוכחי
+    description: "%{browser} על %{platform}"
+    explanation: אלה הם הדפדפנים המחוברים כרגע לחשבון המסטודון שלך.
+    ip: IP
+    platforms:
+      adobe_air: אדובה אייר
+      android: אנדרואיד
+      blackberry: בלקברי
+      chrome_os: Chrome OS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: לינוקס
+      mac: macOS
+      other: סביבה לא ידועה
+      windows: חלונות
+      windows_mobile: חלונות מובייל
+      windows_phone: טלפון חלונות
+    revoke: שלילה
+    revoke_success: החיבור נשלל בהצלחה
+    title: מכשירים מחוברים
+    view_authentication_history: צפיה בהיסטוריית התחברויות לחשבונך
   settings:
+    account: חשבון
+    account_settings: הגדרות חשבון
+    aliases: שמות נרדפים לחשבון
+    appearance: תצוגה
     authorized_apps: ישומים מאושרים
     back: חזרה למסטודון
+    delete: מחיקת חשבון
+    development: פיתוח
     edit_profile: עריכת פרופיל
     export: יצוא מידע
+    featured_tags: האשתגיות נבחרות
     import: יבוא
+    import_and_export: יבוא ויצוא
+    migrate: הגירת חשבון
+    notifications: התראות
     preferences: העדפות
+    profile: פרופיל
+    relationships: נעקבים ועוקבים
+    statuses_cleanup: מחיקת חצרוצים אוטומטית
+    strikes: עבירות מנהלתיות
     two_factor_authentication: אימות דו-שלבי
+    webauthn_authentication: מפתחות אבטחה
   statuses:
+    attached:
+      audio:
+        many: "%{count} אודיו"
+        one: אודיו %{count}
+        other: "%{count} אודיו"
+        two: "%{count} אודיו"
+      description: 'מצורף: %{attached}'
+      image:
+        many: "%{count} תמונות"
+        one: תמונה %{count}
+        other: "%{count} תמונות"
+        two: "%{count} תמונות"
+      video:
+        many: "%{count} סרטונים"
+        one: סרטון %{count}
+        other: "%{count} סרטונים"
+        two: "%{count} סרטונים"
+    boosted_from_html: הודהד מ-%{acct_link}
+    content_warning: 'אזהרת תוכן: %{warning}'
     default_language: זהה לשפת ממשק
+    disallowed_hashtags:
+      many: 'מכיל את ההאשתגיות האסורות: %{tags}'
+      one: 'מכיל את ההאשתג האסור: %{tags}'
+      other: 'מכיל את ההאשתגיות האסורות: %{tags}'
+      two: 'מכיל את ההאשתגיות האסורות: %{tags}'
+    edited_at_html: נערך ב-%{date}
+    errors:
+      in_reply_not_found: נראה שהחצרוץ שאת/ה מנסה להגיב לו לא קיים.
     open_in_web: פתח ברשת
     over_character_limit: חריגה מגבול התווים של %{max}
+    pin_errors:
+      direct: לא ניתן לקבע חצרוצים שנראותם מוגבלת למכותבים בלבד
+      limit: הגעת למספר החצרוצים המוצמדים המירבי.
+      ownership: חצרוצים של אחרים לא יכולים להיות מוצמדים
+      reblog: אין אפשרות להצמיד הדהודים
+    poll:
+      total_people:
+        many: "%{count} אנשים"
+        one: איש/ה %{count}
+        other: "%{count} אנשים"
+        two: "%{count} אנשים"
+      total_votes:
+        many: "%{count} קולות"
+        one: קול %{count}
+        other: "%{count} קולות"
+        two: "%{count} קולות"
+      vote: הצבעה
     show_more: עוד
+    show_newer: הצג חדשים יותר
+    show_older: הצג ישנים יותר
+    show_thread: הצג שרשור
+    sign_in_to_participate: הכנס כדי להשתתף בשיחה
+    title: '%{name}: "%{quote}"'
     visibilities:
+      direct: ישיר
       private: לעוקבים בלבד
       private_long: להצגה לעוקבים בלבד
       public: פומבי
       public_long: כולם יוכלו לקרוא
       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': שבועיים
+      '15778476': חצי שנה
+      '2629746': חודש
+      '31556952': שנה
+      '5259492': חודשיים
+      '604800': שבוע
+      '63113904': שנתיים
+      '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: לא תואם את השם האחרון
+  terms:
+    title: תנאי שימוש ומדיניות פרטיות ב-%{instance}
+  themes:
+    contrast: מסטודון (ניגודיות גבוהה)
+    default: מסטודון (כהה)
+    mastodon-light: מסטודון (בהיר)
   time:
     formats:
       default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
       time: "%H:%M"
   two_factor_authentication:
+    add: הוספה
     disable: כיבוי
+    disabled_success: אימות דו-גורמי בוטל בהצלחה
+    edit: עריכה
+    enabled: אימות דו-גורמי הופעל
     enabled_success: אימות דו-שלבי הופעל בהצלחה
     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: ביקשת גיבוי מלא של חשבון המסטודון שלך. הוא מוכן להורדה!
+      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: זה מה שתאמר.י לחברייך כדי שיוכלו לשלוח לך הודעה או לעקוב אחרייך ממופע אחר.
+      review_preferences_action: שנה הגדרות
+      review_preferences_step: וודא לקבוע את העדפותייך, למשל איזה הודעות דוא"ל תרצה/י לקבל, או איזו רמת פרטיות תרצה כברירת מחדל לחצרוצים שלך. אם אין לך בעיה עם זה, תוכל לאפשר הפעלה אוטומטית של הנפשות GIF
+      subject: ברוכים הבאים למסטודון
+      tip_federated_timeline: ציר הזמן הפדרטיבי הוא מבט לכל הפדיברס, אך הוא כולל רק אנשים שחבריך למופע הספציפי שהתחברת אליו נרשמו אליו, כך שהוא לא שלם.
+      tip_following: את.ה כבר עוקב.ת אחר האדמין (מנהל השרת) כברירת מחדל. על מנת למצוא עוד אנשים מעניינים, בדוק את צירי הזמן המקומי והפדרטיבי.
+      tip_local_timeline: ציר הזמן המקומי מספק מבט לאנשים במופע זה (%{instance}). אלו הם שכנייך המידיים !
+      tip_mobile_webapp: אם דפדפן הנייד שלך מאפשר את הוספת מסטודון למסך הבית שלך, תוכל לקבל התראות בדחיפה (push). במובנים רבים אפשרות זאת מתנהגת כמו ישומון !
+      tips: טיפים
+      title: ברוך/ה הבא/ה, %{name} !
   users:
+    follow_limit_reached: לא תוכל לעקוב אחר יותר מ %{limit} אנשים
     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>. התוכן הטקסטואלי של הקישורית לא משנה. הנה דוגמא:'
+    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/hu.yml b/config/locales/hu.yml
index 0a1fd439c..1ee801fd0 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -40,7 +40,7 @@ hu:
     status_count_before: Eddig
     tagline: Kövess barátokat és találj újakat
     terms: Felhasználási feltételek
-    unavailable_content: A tartalom nem elérhető
+    unavailable_content: Kimoderált szerverek
     unavailable_content_description:
       domain: Szerver
       reason: 'Indok:'
@@ -722,7 +722,7 @@ hu:
         title: Stáb-jelvény megjelenítése
       site_description:
         desc_html: Rövid bemutatkozás a főoldalon és a meta fejlécekben. Írd le, mi teszi ezt a szervert különlegessé! Használhatod a <code>&lt;a&gt;</code> és <code>&lt;em&gt;</code> HTML tageket.
-        title: A szerver bemutatása
+        title: Kiszolgáló leírása
       site_description_extended:
         desc_html: Ide teheted például a közösségi és egyéb szabályzatot, útmutatókat és mindent, ami egyedivé teszi szerveredet. HTML-tageket is használhatsz
         title: További egyéni információk
@@ -1038,10 +1038,12 @@ hu:
       appealed_msg: A fellebbezésedet beküldtük. Ha jóváhagyták, értesítünk.
       appeals:
         submit: Fellebbezés beküldése
+      approve_appeal: Fellebbezés jóváhagyása
       associated_report: Társított bejelentés
       created_at: Dátum
       description_html: Ezek a fiókoddal szemben elvégzett műveletek és figyelmeztetések, melyeket a %{instance} szerver csapata küldött.
       recipient: Címzett
+      reject_appeal: Fellebbezés elutasítása
       status: 'Bejegyzés #%{id}'
       status_removed: A bejegyzést már eltávolítottuk a rendszerből
       title: "%{action} ekkor: %{date}"
@@ -1356,6 +1358,11 @@ hu:
   reports:
     errors:
       invalid_rules: nem hivatkozik érvényes szabályra
+  rss:
+    content_warning: 'Tartalmi figyelmeztetés:'
+    descriptions:
+      account: Nyilvános bejegyzések a(z) @%{acct} fióktól
+      tag: 'Ezzel jelölt nyilvános bejegyzések: #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Túllépted az időzített bejegyzésekre vonatkozó %{limit} db-os napi limitet
     over_total_limit: Túllépted az időzített bejegyzésekre vonatkozó %{limit} db-os limitet
@@ -1438,7 +1445,7 @@ hu:
         one: "%{count} videó"
         other: "%{count} videó"
     boosted_from_html: Megtolva innen %{acct_link}
-    content_warning: 'Tartalom figyelmeztetés: %{warning}'
+    content_warning: 'Tartalmi figyelmeztetés: %{warning}'
     default_language: Felhasználói felület nyelvével azonos
     disallowed_hashtags:
       one: 'tiltott hashtaget tartalmaz: %{tags}'
@@ -1514,6 +1521,9 @@ hu:
     pinned: Kitűzött bejegyzés
     reblogged: megtolta
     sensitive_content: Kényes tartalom
+  strikes:
+    errors:
+      too_late: Túl késő, hogy fellebbezd ezt a szankciót
   tags:
     does_not_match_previous_name: nem illeszkedik az előző névvel
   terms:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index d6d00581e..610a45e1c 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -1017,10 +1017,12 @@ id:
       appealed_msg: Banding Anda sudah dikirim. Jika disetujui, Anda akan diberi tahu.
       appeals:
         submit: Ajukan banding
+      approve_appeal: Setujui banding
       associated_report: Laporan yang berkaitan
       created_at: Tanggal
       description_html: Ini adalah tindakan yang dilakukan terhadap akun Anda dan peringatan telah dikirim oleh staf %{instance}.
       recipient: Dialamatkan untuk
+      reject_appeal: Tolak banding
       status: 'Kiriman #%{id}'
       status_removed: Kirim sudah dihapus dari sistem
       title: "%{action} dari %{date}"
@@ -1331,6 +1333,11 @@ id:
   reports:
     errors:
       invalid_rules: tidak mereferensikan aturan yang valid
+  rss:
+    content_warning: 'Peringatan konten:'
+    descriptions:
+      account: Kiriman publik dari @%{acct}
+      tag: 'Kiriman publik ditagari #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Anda telah melampaui batas %{limit} toot terjadwal untuk sehari
     over_total_limit: Anda telah melampaui batas %{limit} toot terjadwal
@@ -1483,6 +1490,9 @@ id:
     pinned: Toot tersemat
     reblogged: di-boost-kan
     sensitive_content: Konten sensitif
+  strikes:
+    errors:
+      too_late: Terlambat untuk mengajukan banding hukuman ini
   tags:
     does_not_match_previous_name: tidak cocok dengan nama sebelumnya
   terms:
diff --git a/config/locales/io.yml b/config/locales/io.yml
index b6f7937c3..1d0304d09 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -1,154 +1,1729 @@
 ---
 io:
   about:
+    about_hashtag_html: Co esas publika posti quo etiketigesis kun <strong>#%{hashtag}</strong>. Vu povas interagar kun oli se vu havas konto irgaloke en fediverso.
     about_mastodon_html: Mastodon esas <em>gratuita, apertitkodexa</em> sociala reto. Ol esas <em>sencentra</em> altra alternativo a komercala servadi. Ol evitigas, ke sola firmo guvernez tua tota komunikadol. Selektez servero, quan tu fidas. Irge qua esas tua selekto, tu povas komunikar kun omna altra uzeri. Irgu povas krear sua propra instaluro di Mastodon en sua servero, e partoprenar en la <em>sociala reto</em> tote glate.
     about_this: Pri ta instaluro
+    active_count_after: aktiva
+    active_footnote: Monade Aktiva Uzanti (MAU)
+    administered_by: 'Administresis da:'
+    api: API
+    apps: Smartfonsoftwari
+    apps_platforms: Uzez Mastodon de iOS, Android e altra platformi
+    browse_directory: Videz profilcheflisto e filtrez segun interesi
+    browse_local_posts: Videz samtempa video di publika posti de ca servilo
+    browse_public_posts: Videz samtempa video di publika posti che Mastodon
     contact: Kontaktar
+    contact_missing: Ne fixigita
+    contact_unavailable: Nula
+    continue_to_web: Durez a retsoftwaro
+    discover_users: Deskovrez uzanti
+    documentation: Dokumentajo
+    federation_hint_html: Per konto che %{instance}, vu povas sequar persono che irga servilo di Mastodon e altra siti.
+    get_apps: Probez smartfonsoftwaro
+    hosted_on: Mastodon hostigesas che %{domain}
+    instance_actor_flash: 'Ca konto esas virtuala aganto quo uzesas por reprezentar la servilo e ne irga individuala uzanto. Ol uzesas por federskopo e ne debas restriktesar se vu ne volas obstruktar tota instanco, se ol esas la kaso, do vu debas uzar domenobstrukto.
+
+      '
+    learn_more: Lernez pluse
+    logged_in_as_html: Vu nun eniras quale %{username}.
+    logout_before_registering: Vu ja eniris.
+    privacy_policy: Privatesguidilo
+    rules: Servilreguli
+    rules_html: 'La subo montras rezumo di reguli quon vu bezonas sequar se vu volas havar konto che ca servilo di Mastodon:'
+    see_whats_happening: Videz quo eventas
+    server_stats: 'Servilstatistiko:'
     source_code: Fontkodexo
+    status_count_after:
+      one: posto
+      other: posti
     status_count_before: Qua publikigis
+    tagline: Sequez amiki e deskovrez nova personi
+    terms: Serveskondicioni
+    unavailable_content: Jerata servili
+    unavailable_content_description:
+      domain: Servilo
+      reason: Motivo
+      rejecting_media: 'Mediifaili de ca servili ne procedagesas o retenesos, e imajeti ne montresos, do manuala klikto bezonesas a originala failo:'
+      rejecting_media_title: Filtrita medii
+      silenced: 'Posti de ca servili celesos en publika tempolinei e konversi, e notifiki ne facesos de oli uzantinteragi, se vu ne sequas oli:'
+      silenced_title: Limitizita servili
+      suspended: 'Informi de ca servili procedagesos o retenesos o interchanjesos, do irga interago o komuniko kun uzanti de ca servili esas neposibla:'
+      suspended_title: Restriktita servili
+    unavailable_content_html: Mastodon generale permisas on vidar kontenajo e interagar kun uzanti de irga altra servilo en fediverso. Existas eceptioni quo facesis che ca partikulara servilo.
+    user_count_after:
+      one: uzanto
+      other: uzanti
     user_count_before: Hemo di
+    what_is_mastodon: Quo esas Mastodon?
   accounts:
+    choices_html: 'Selektaji di %{name}:'
+    endorsements_hint: Vu povas rekomendar personi quon vu sequas de retintervizajo, e oli montresos hike.
+    featured_tags_hint: Vu povas estalar partikulara hashtagi quo montresos hike.
     follow: Sequar
+    followers:
+      one: Sequanto
+      other: Sequanti
     following: Sequati
+    instance_actor_flash: Ca konto esas virtuala aganto quo uzesas por reprezentar la servilo e ne irga individuala uzanto. Ol uzesas por federskopo e ne debas restriktesar.
+    joined: Juntis ye %{date}
+    last_active: lasta aktiva tempo
+    link_verified_on: Proprieteso di ca ligilo kontrolesis ye %{date}
+    media: Medii
+    moved_html: "%{name} transferesis a %{new_profile_link}:"
+    network_hidden: Ca informi ne esas disponebla
     nothing_here: Esas nulo hike!
     people_followed_by: Sequati da %{name}
     people_who_follow: Sequanti di %{name}
+    pin_errors:
+      following: Vu mustas ja sequar persono quon vu volas estalar
+    posts:
+      one: Posto
+      other: Posti
+    posts_tab_heading: Posti
+    posts_with_replies: Posti e respondi
+    roles:
+      admin: Administrero
+      bot: Boto
+      group: Grupo
+      moderator: Jerero
+    unavailable: Profilo esas nedisponebla
     unfollow: Dessequar
   admin:
+    account_actions:
+      action: Agez
+      title: Agez jero a %{acct}
+    account_moderation_notes:
+      create: Pozez noto
+      created_msg: Jernoto sucesoze kreesis!
+      destroyed_msg: Jernoto sucesoze efacesis!
     accounts:
+      add_email_domain_block: Obstruktez retpostodomeno
+      approve: Aprobez
+      approved_msg: Sucesoze aprobis registroapliko di %{username}
       are_you_sure: Ka tu esas certa?
+      avatar: Profilimajo
+      by_domain: Domeno
+      change_email:
+        changed_msg: Kontoretposto sucesoze chanjesis!
+        current_email: Nuna retposto
+        label: Chanjez retposto
+        new_email: Nova retposto
+        submit: Chanjez retposto
+        title: Chanjez retposto por %{username}
+      confirm: Konfirmez
+      confirmed: Konfirmita
+      confirming: Ankore konfirmesas
+      custom: Kustuma
+      delete: Efacez informi
+      deleted: Efacita
+      demote: Despromocez
+      destroyed_msg: Informi di %{username} nun aranjesis por efacesar aparante
+      disable: Frostigez
+      disable_sign_in_token_auth: Desaktivigez retpostofichyurizeso
+      disable_two_factor_authentication: Desaktivigez 2FA
+      disabled: Desinterdiktita
+      display_name: Profilnomo
+      domain: Domeno
+      edit: Modifikez
       email: E-mail
+      email_status: Retpostostando
+      enable: Defrostigez
+      enable_sign_in_token_auth: Aktivigez retpostofichyurizeso
+      enabled: Aktivigita
+      enabled_msg: Sucesoze desfrostigas konto di %{username}
+      followers: Uzanti
+      follows: Uzati
+      header: Kapimajo
+      inbox_url: URL di mesajbuxo
+      invite_request_text: Juntomotivo
+      invited_by: Invitesis da
+      ip: IP
+      joined: Juntita
+      location:
+        all: Omna
+        local: Lokala
+        remote: Nelokala
+        title: Loko
+      login_status: Enirstando
+      media_attachments: Mediiatachaji
+      memorialize: Memorializez
+      memorialized: Memorializita
+      memorialized_msg: Sucesoze chanjesis %{username} a memorialkonto
+      moderation:
+        active: Aktiva
+        all: Omna
+        pending: Vartanta
+        suspended: Restriktita
+        title: Jero
+      moderation_notes: Jernoti
+      most_recent_activity: Maxim recenta aktiveso
+      most_recent_ip: Maxim recenta IP
+      no_account_selected: Nula konti chanjesis pro ke nulo selektesis
+      no_limits_imposed: Limiti ne fixesis
+      not_subscribed: Ne abonita
+      pending: Vartar kontrolo
       perform_full_suspension: Perform full suspension
+      previous_strikes: Antea streki
+      previous_strikes_description_html:
+        one: Ca konto havas <strong>1</strong> streko.
+        other: Ca konto havas <strong>%{count}</strong> streki.
+      promote: Promocez
+      protocol: Protokolo
+      public: Publika
+      push_subscription_expires: Abono PuSH expiras
+      redownload: Rifreshigez profilo
+      redownloaded_msg: Sucesoze rifreshis profilo di %{username} de origino
+      reject: Refuzez
+      rejected_msg: Sucesoze refuzis registroapliko di %{username}
+      remove_avatar: Efacez profilimajo
+      remove_header: Efacez kapimajo
+      removed_avatar_msg: Sucesoze efacis profilimajo di %{username}
+      removed_header_msg: Sucesoze efacis kapimajo di %{username}
+      resend_confirmation:
+        already_confirmed: Ca uzanto ja konfirmesis
+        send: Risendez konfirmretposto
+        success: Konfirmretposto sucesoze sendesas!
+      reset: Richanjez
+      reset_password: Richanjez pasvorto
+      resubscribe: Riabonez
+      role: Permisi
+      roles:
+        admin: Administrero
+        moderator: Jerero
+        staff: Laborero
+        user: Uzanto
+      search: Trovez
+      search_same_email_domain: Altra uzanti kun sama retpostodomeno
+      search_same_ip: Altra uzanti kun sama IP
+      security_measures:
+        only_password: Nur pasvorto
+        password_and_2fa: Pasvorto e 2FA
+      sensitive: Forcsentoza
+      sensitized: Markizesis quale sentoza
+      shared_inbox_url: Partigita URL di mesajbuxo
       show:
         created_reports: Reports created by this account
         targeted_reports: Reports made about this account
+      silence: Limito
+      silenced: Limitizita
+      statuses: Posti
+      strikes: Antea streki
+      subscribe: Abonez
+      suspend: Restriktez
+      suspended: Restriktita
+      suspension_irreversible: Ca informi di ca konto neinversigeble efacesis. Vu povas derestriktar konto por uzebligar lu ma ol ne riganos irga dati quon ol antee havis.
+      suspension_reversible_hint_html: Ca konto restriktesis, e ca informi tota efacesos en %{date}. Ante ta tempo, konto povas riganesar sen irga mala efekti. Se vu volas efacar omna informi di konto quik, vu povas agar lu sube.
+      title: Konti
+      unblock_email: Deobstruktez retpostoadreso
+      unblocked_email_msg: Sucesoze deobstruktis retpostoadreso di %{username}
+      unconfirmed_email: Nekonfirmita retposto
+      undo_sensitized: Deagez forcsentoza
+      undo_silenced: Deagez limito
+      undo_suspension: Deagez restrikto
+      unsilenced_msg: Sucesoza inversigis limito di konto di %{username}
+      unsubscribe: Deabonez
+      unsuspended_msg: Sucesoze derestriktis konto di %{username}
+      username: Uzantonomo
+      view_domain: Videz rezumo di domeno
+      warn: Avertez
+      web: Interret
+      whitelisted: Permisesis por federato
+    action_logs:
+      action_types:
+        approve_appeal: Aprobez apelo
+        approve_user: Aprobez uzanto
+        assigned_to_self_report: Taskigez raporto
+        change_email_user: Chanjez retposto por uzanto
+        confirm_user: Konfirmez uzanto
+        create_account_warning: Kreez averto
+        create_announcement: Kreez anunco
+        create_custom_emoji: Kreez kustumizita emocimajo
+        create_domain_allow: Kreez domenpermiso
+        create_domain_block: Kreez domenobstrukto
+        create_email_domain_block: Kreez retpostodomenobstrukto
+        create_ip_block: Kreez IP-regulo
+        create_unavailable_domain: Kreez nedisponebla domeno
+        demote_user: Despromocez uzanto
+        destroy_announcement: Efacez anunco
+        destroy_custom_emoji: Efacez kustumizita emocimajo
+        destroy_domain_allow: Efacez domenpermiso
+        destroy_domain_block: Efacez domenobstrukto
+        destroy_email_domain_block: Efacez retpostodomenobstrukto
+        destroy_instance: Efacez domeno
+        destroy_ip_block: Efacez IP-regulo
+        destroy_status: Efacez posto
+        destroy_unavailable_domain: Efacez nedisponebla domeno
+        disable_2fa_user: Desaktivigez 2FA
+        disable_custom_emoji: Desaktivigez kustumizita emocimajo
+        disable_sign_in_token_auth_user: Desaktivigez retpostofichyurizo por uzanto
+        disable_user: Desaktivigez uzanto
+        enable_custom_emoji: Aktivigez kustumizita emocimajo
+        enable_sign_in_token_auth_user: Aktivigez retpostofichyurizo por uzanto
+        enable_user: Aktivigez uzanto
+        memorialize_account: Memorializez konto
+        promote_user: Promocez uzanto
+        reject_appeal: Refuzez apelo
+        reject_user: Refuzez uzanto
+        remove_avatar_user: Efacez profilimajo
+        reopen_report: Riapertez raporto
+        reset_password_user: Richanjez pasvorto
+        resolve_report: Rezolvez raporto
+        sensitive_account: Forcsentoza konto
+        silence_account: Limitizez konto
+        suspend_account: Restriktez konto
+        unassigned_report: Destaskigez raporto
+        unblock_email_account: Deobstruktez retpostoadreso
+        unsensitive_account: Deagez forcsentoza konto
+        unsilence_account: Deagez limitkonto
+        unsuspend_account: Derestriktez konto
+        update_announcement: Novigez anunco
+        update_custom_emoji: Novigez kustumizita emocimajo
+        update_domain_block: Novigez domenobstrukto
+        update_status: Novigez posto
+      actions:
+        approve_appeal_html: "%{name} aprobis jerdecidapelo de %{target}"
+        approve_user_html: "%{name} aprobis registro de %{target}"
+        assigned_to_self_report_html: "%{name} taskigis raporto %{target} a su"
+        change_email_user_html: "%{name} chanjis retpostoadreso di uzanto %{target}"
+        confirm_user_html: "%{name} konfirmis retpostoadreso di uzanto %{target}"
+        create_account_warning_html: "%{name} sendis averto a %{target}"
+        create_announcement_html: "%{name} kreis nova anunco %{target}"
+        create_custom_emoji_html: "%{name} adchargis nova emocimajo %{target}"
+        create_domain_allow_html: "%{name} permisis federato kun domeno %{target}"
+        create_domain_block_html: "%{name} obstruktis domeno %{target}"
+        create_email_domain_block_html: "%{name} obstruktis retpostodomeno %{target}"
+        create_ip_block_html: "%{name} kreis regulo por IP %{target}"
+        create_unavailable_domain_html: "%{name} cesis sendo a domeno %{target}"
+        demote_user_html: "%{name} despromocis uzanto %{target}"
+        destroy_announcement_html: "%{name} efacis anunco %{target}"
+        destroy_custom_emoji_html: "%{name} destruktis emocimajo %{target}"
+        destroy_domain_allow_html: "%{name} despermisis federato kun domeno %{target}"
+        destroy_domain_block_html: "%{name} deobstruktis domeno %{target}"
+        destroy_email_domain_block_html: "%{name} deobstruktis retpostodomeno %{target}"
+        destroy_instance_html: "%{name} efacis domeno %{target}"
+        destroy_ip_block_html: "%{name} efacis regulo por IP %{target}"
+        destroy_status_html: "%{name} efacis posto da %{target}"
+        destroy_unavailable_domain_html: "%{name} durigis sendo a domeno %{target}"
+        disable_2fa_user_html: "%{name} desaktivigis 2-faktorbezono por uzanto %{target}"
+        disable_custom_emoji_html: "%{name} desaktivigis emocimajo %{target}"
+        disable_sign_in_token_auth_user_html: "%{name} desaktivigis retpostofichyurizo por %{target}"
+        disable_user_html: "%{name} desaktivigis eniro por uzanto %{target}"
+        enable_custom_emoji_html: "%{name} aktivigis emocimajo %{target}"
+        enable_sign_in_token_auth_user_html: "%{name} aktivigis retpostofichyurizo por %{target}"
+        enable_user_html: "%{name} aktivigis eniro por uzanto %{target}"
+        memorialize_account_html: "%{name} kauzigis konto di %{target} divenar memorialpagino"
+        promote_user_html: "%{name} promocis uzanto %{target}"
+        reject_appeal_html: "%{name} refuzis jerdecidapelo de %{target}"
+        reject_user_html: "%{name} refuzis registro de %{target}"
+        remove_avatar_user_html: "%{name} efacis profilimajo de %{target}"
+        reopen_report_html: "%{name} riapertis raporto %{target}"
+        reset_password_user_html: "%{name} richanjis pasvorto de uzanto %{target}"
+        resolve_report_html: "%{name} rezolvis raporto %{target}"
+        sensitive_account_html: "%{name} markizis medii di %{target} quale sentoza"
+        silence_account_html: "%{name} limitizis konto di %{target}"
+        suspend_account_html: "%{name} restriktis konto di %{target}"
+        unassigned_report_html: "%{name} detaskigis raporto %{target}"
+        unblock_email_account_html: "%{name} deobstruktis retpostoadreso di %{target}"
+        unsensitive_account_html: "%{name} demarkizis medii di %{target} quale sentoza"
+        unsilence_account_html: "%{name} efacis limito di konto di %{target}"
+        unsuspend_account_html: "%{name} derestriktis konto di %{target}"
+        update_announcement_html: "%{name} novigis anunco %{target}"
+        update_custom_emoji_html: "%{name} novigis emocimajo %{target}"
+        update_domain_block_html: "%{name} novigis domenobstrukto por %{target}"
+        update_status_html: "%{name} novigis posto da %{target}"
+      deleted_status: "(efacita posto)"
+      empty: Nula logi.
+      filter_by_action: Filtrez segun ago
+      filter_by_user: Filtrez segun uzanto
+      title: Kontrollogo
+    announcements:
+      destroyed_msg: Anunco sucesoze efacesas!
+      edit:
+        title: Modifikez anunco
+      empty: Nula anunci.
+      live: Samtempe
+      new:
+        create: Kreez anunco
+        title: Nova anunco
+      publish: Publikigez
+      published_msg: Anunco sucesoze publikigesas!
+      scheduled_for: Projetita por eventas en %{time}
+      scheduled_msg: Anunco projetesis por publikigo!
+      title: Anunci
+      unpublish: Depublikigez
+      unpublished_msg: Anunco sucesoze depublikigesas!
+      updated_msg: Anunco sucesoza novigesas!
+    custom_emojis:
+      assign_category: Insertez kategorio
+      by_domain: Domeno
+      copied_msg: Sucesoze kreis lokala kopiuro di emocimajo
+      copy: Kopiez
+      copy_failed_msg: Ne povas igar lokala kopiur di ta emocimajo
+      create_new_category: Kreez nova kategorio
+      created_msg: Emocimajo sucesoze kreesas!
+      delete: Efacez
+      destroyed_msg: Kustumizita emocimajo sucesoza destruktesas!
+      disable: Desaktivigez
+      disabled: Desaktivigita
+      disabled_msg: Sucesoze desaktivigis ta emocimajo
+      emoji: Emocimajo
+      enable: Aktivigez
+      enabled: Aktivigita
+      enabled_msg: Sucesoze aktivigis ta emocimajo
+      image_hint: Maximo grandeso di PNG o GIF esas %{size}
+      list: Listo
+      listed: Listita
+      new:
+        title: Insertez nova kustumizita emocimajo
+      not_permitted: Vu ne permisesis agar co
+      overwrite: Remplasez
+      shortcode: Kurtkodexo
+      shortcode_hint: Minime 2 simboli, nur literi e nombri e sublinei
+      title: Kustumizita emocimaji
+      uncategorized: Nekategorigita
+      unlist: Delistigez
+      unlisted: Delistigita
+      update_failed_msg: Ne povas novigar ta emocimajo
+      updated_msg: Emocimajo sucesoze novigesis!
+      upload: Adchargez
+    dashboard:
+      active_users: aktiva uzanti
+      interactions: interagi
+      media_storage: Mediireteneso
+      new_users: nova uzanti
+      opened_reports: raporti apertesis
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> vartanta apelo"
+        other: "<strong>%{count}</strong> vartanta apeli"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> vartanta raporto"
+        other: "<strong>%{count}</strong> vartanta raporti"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> vartanta hashtago"
+        other: "<strong>%{count}</strong> vartanta hashtagi"
+      pending_users_html:
+        one: "<strong>%{count}</strong> vartanta uzanti"
+        other: "<strong>%{count}</strong> vartanta uzanti"
+      resolved_reports: raporti rezolvesis
+      software: Softwaro
+      sources: Registrofonti
+      space: Spacuzeso
+      title: Chefpanelo
+      top_languages: Maxim aktiva lingui
+      top_servers: Maxim aktiva servili
+      website: Retsito
+    disputes:
+      appeals:
+        empty: Nula apeli.
+        title: Apeli
+    domain_allows:
+      add_new: Permisez federato kun domeno
+      created_msg: Domeno sucesoza permisesas por federato
+      destroyed_msg: Domeno despermisesas de federato
+      undo: Despermisez federato kun domeno
     domain_blocks:
       add_new: Add new
+      created_msg: Domenobstrukto nun procedesas
+      destroyed_msg: Domenobstrukto desagesis
+      domain: Domeno
+      edit: Modifikez domenobstrukto
+      existing_domain_block_html: Vu ja povis plu rigoroza limiti a %{name}, vu bezonas <a href="%{unblock_url}">deobstruktar</a> unesme.
       new:
+        create: Kreez obstrukto
+        hint: Domenobstrukto ne preventos kreo di kontrekordaji en datumaturo, ma retroaktive e automate aplikos partikulara jermetodi a ta konti.
         severity:
           desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data."
+          noop: Nulo
+          silence: Silencigez
+          suspend: Restriktez
+        title: Nova domenobstrukto
+      obfuscate: Nedicernebligez domennomo
+      obfuscate_hint: Partala nedicernebligez domennomo en listo se reklamo di listo di domenlimito aktivigesas
+      private_comment: Privata komento
+      private_comment_hint: Komento pri ca domenlimito esas por interna uzo da jereri.
+      public_comment: Publika komento
+      public_comment_hint: Komentez pri ca domenlimito por la publiko, se reklamar listo di domenlimito aktivigesis.
+      reject_media: Refusez mediifaili
+      reject_media_hint: Efacas lokale retenita mediifaili e refuzas deschargar irgo en futuro. Nerelatata por restrikti
+      reject_reports: Refuzez raporti
+      reject_reports_hint: Ignorez omna raporti quo venas de ca domeno. Nerelatata por restrikti
       undo: Undo
+      view: Videz domenobstrukto
+    email_domain_blocks:
+      add_new: Insertez novo
+      attempts_over_week:
+        one: "%{count} probo de pos 1 week"
+        other: "%{count} registroprobi de pos 1 week"
+      created_msg: Sucesoze obstruktis retpostodomeno
+      delete: Efacez
+      dns:
+        types:
+          mx: Rekordo MX
+      domain: Domeno
+      new:
+        create: Insertez domeno
+        resolve: Rezolvez domeno
+        title: Obstruktez nova retpostodomeno
+      no_email_domain_block_selected: Retpostodomenobstrukti ne chanjesis por ke nulo selektesis
+      resolved_dns_records_hint_html: Ca domennomo rezolvesas a ca MX-domeni, quale esas ultime responsanta por ganar retposto. Obstruktar MX-domeno obstruktos registri de irga retpostoadreso quo uzas sama MX-domeni, mem se la videbla domennomo esas diferanta. <strong>Sorgemez e ne obstruktez majora retpostositi.</strong>
+      resolved_through_html: Rezolvesis tra %{domain}
+      title: Obstruktita retpostodomeni
+    follow_recommendations:
+      description_html: "<strong>Sequorekomendi helpas nova uzanti rapide trovar interesanta kontenajo</strong>. Se uzanto ne interagas kun altra personi sate por igar personaligita sequorekomendi, ca konti rekomendas. Oli rikalkulesas die de mixo di konti kun maxim alta recenta interagi e maxim altra lokala sequantoquanto segun selektita linguo."
+      language: Por linguo
+      status: Stando
+      suppress: Desfortigez sequorekomendo
+      suppressed: Desfortigita
+      title: Sequez rekomendi
+      unsuppress: Riganez sequorekomendo
     instances:
+      availability:
+        description_html:
+          one: Se sendar a domeno falias <strong>%{count} dio</strong> sen sucesar, plusa sendoprobi ne agesos se sendo <em>de</em> la domeno ne ganesas.
+          other: Se sendar a domeno falias en <strong>%{count} diferanta dii</strong> sen sucesar, plusa sendoprobi ne agesos se sendo <em>de</em> la domeno ne ganesas.
+        failure_threshold_reached: Faliolimito atingesis en %{date}.
+        failures_recorded:
+          one: Falita probo en %{count} dio.
+          other: Falita probi en %{count} dii.
+        no_failures_recorded: Nula falio en rekordo.
+        title: Disponebleso
+        warning: Antea probo di konekto a ca servilo esas nesucesoza
+      back_to_all: Omna
+      back_to_limited: Limitizita
+      back_to_warning: Averto
+      by_domain: Domeno
+      confirm_purge: Ka vu certe volas netempale efacar informi de ca domeno?
+      content_policies:
+        comment: Interna noto
+        description_html: Vu povas fixar kontenajguidili quo aplikesos a omna konti de ca domeno e irga oli subdomeni.
+        policies:
+          reject_media: Refusez medii
+          reject_reports: Refusez raporti
+          silence: Limito
+          suspend: Restriktez
+        policy: Guidilo
+        reason: Publika motivo
+        title: Kontenajguidili
+      dashboard:
+        instance_accounts_dimension: Maxim sequata konti
+        instance_accounts_measure: retenata konti
+        instance_followers_measure: nia sequanti ibe
+        instance_follows_measure: olia sequanti hike
+        instance_languages_dimension: Maxim uzata lingui
+        instance_media_attachments_measure: retenata mediiatachaji
+        instance_reports_measure: raporti pri oli
+        instance_statuses_measure: retenata posti
+      delivery:
+        all: Omna
+        clear: Efacez senderori
+        failing: Falias
+        restart: Rikomencez sendo
+        stop: Cesez sendo
+        unavailable: Nedisponebla
+      delivery_available: Sendo esas disponebla
+      delivery_error_days: Senderordii
+      delivery_error_hint: Se sendo ne esas posibla dum %{count} dii, ol automata markizesos quale ne sendebla.
+      destroyed_msg: Informi de %{domain} nun faskigesis por partikulara efaco.
+      empty: Nula domeni.
+      known_accounts:
+        one: "%{count} savata konto"
+        other: "%{count} savata konti"
+      moderation:
+        all: Omna
+        limited: Limitizita
+        title: Jero
+      private_comment: Privata komento
+      public_comment: Publika komento
+      purge: Efacez grande
+      purge_description_html: Se vu kredas ke ca domeno esas nekonektata netempale, vu povas efacar omna kontorekordi e relatata informi de ca domeno de vua reteneyo. Co forsan esas nekurta.
       title: Known Instances
+      total_blocked_by_us: Obstruktesis da ni
+      total_followed_by_them: Sequesis da oli
+      total_followed_by_us: Sequesis da ni
+      total_reported: Raporti pri oli
+      total_storage: Mediiatachaji
+      totals_time_period_hint_html: Sumi quo montresas sube inkluzas informi de pos la komenco.
+    invites:
+      deactivate_all: Deaktivigez omno
+      filter:
+        all: Omna
+        available: Disponebla
+        expired: Expirita
+        title: Filtrez
+      title: Inviti
+    ip_blocks:
+      add_new: Kreez regulo
+      created_msg: Sucesoze insertis nova regulo di IP
+      delete: Efacez
+      expires_in:
+        '1209600': 2 semani
+        '15778476': 6 monati
+        '2629746': 1 monato
+        '31556952': 1 yaro
+        '86400': 1 dio
+        '94670856': 3 yari
+      new:
+        title: Kreez nova regulo di IP
+      no_ip_block_selected: Reguli di IP nechanjesis por ke nulo selektesis
+      title: Reguli di IP
+    relationships:
+      title: "%{acct} relatesi"
+    relays:
+      add_new: Insertez nova relayo
+      delete: Efacez
+      description_html: "<strong>Federatrelayo</strong> esas mediatajservilo quo interchanjas multa publika posti inter servili quo abonas e publikigas ibe. <strong>Ol povas helpar mikra e mezgranda servili deskovrar kontenajo de fediverso</strong>, quale ne bezonas lokala uzanti manuale sequar altra personi en nelokala servili."
+      disable: Desaktivigez
+      disabled: Desaktivigita
+      enable: Aktivigez
+      enable_hint: Pos aktivigesar, vua servilo abonos omna publika posti de ca relayo, e komencos sendar publika posti di ca servilo a ol.
+      enabled: Aktivigita
+      inbox_url: URL di relayo
+      pending: Vartas aprobo di relayo
+      save_and_enable: Sparez e aktivigez
+      setup: Facez relayokonekto
+      signatures_not_enabled: Relayi ne korekta funcionos dum ke sekurmodo o limigita federatmodo aktivigesis
+      status: Stando
+      title: Relayi
+    report_notes:
+      created_msg: Raportnoto sucesoze kreesis!
+      destroyed_msg: Raportnoto sucesoze efacesis!
+      today_at: Hodie en %{time}
+    reports:
+      account:
+        notes:
+          one: "%{count} noto"
+          other: "%{count} noti"
+      action_log: Kontrollogo
+      action_taken_by: Agesis da
+      actions:
+        delete_description_html: Raportizita posti efacesos e streko rekordigesos por helpar vu intensigar en nexta malagi da la sama konto.
+        mark_as_sensitive_description_html: Medii en raportizita posti markizesos quale sentoza e streko rekordigesos por helpar vu intensigar en nexta malagi da la sama konto.
+        other_description_html: Videz plu multa opcioni por dominacar konduto di konto e kustumizar komuniko a raportizita konto.
+        resolve_description_html: Nulo agesos kontre raportizita konto, streko ne rekordizesos e raporto klozesos.
+        silence_description_html: Profilo esos videbla nur por personi quo ja sequis o manuale trovis, se severe limitizas ola porteo. Sempre povas inversigesar.
+        suspend_description_html: Ca profilo e omna ola kontenaji divenos neacesebla til ol eventuale efacesas. Interagar kun la konto divenos neposibla. Inversigebla til 30 dii.
+      actions_description_html: Decidez ago por rezolvar ca raporto. Se vu decidar puniso kontre raportizesis konto, retpostoavizo sendesos a ol, ecepte kande <strong>Spam</strong> kategorio selektesis.
+      add_to_report: Insertez pluse a raporto
+      are_you_sure: Ka vu esas certa?
+      assign_to_self: Taskigez me
+      assigned: Taskigita jerero
+      by_target_domain: Domeno di raportizita konto
+      category: Kategorio
+      category_description_html: La motivo ke ca konto e kontenajo raportizesis citesos por komuniko kun raportizita konto
+      comment:
+        none: Nulo
+      comment_description_html: 'Por donar plu multa informo, %{name} skribis:'
+      created_at: Raportizesis
+      delete_and_resolve: Efacez posti
+      forwarded: Sendesis
+      forwarded_to: Sendesis a %{domain}
+      mark_as_resolved: Markizez quale rezolvita
+      mark_as_sensitive: Markizez quale sentoza
+      mark_as_unresolved: Markizez quale nerezolvita
+      no_one_assigned: Nulu
+      notes:
+        create: Insertez noto
+        create_and_resolve: Rezolvez per noto
+        create_and_unresolve: Riapertez per noto
+        delete: Efacez
+        placeholder: Deskriptez quo agesis o irga relatita novaji...
+        title: Noti
+      notes_description_html: Videz e pozez noti a altra jereri e vua su en futuro
+      quick_actions_description_html: 'Agetez o volvez base por vidar raportizita kontenajo:'
+      remote_user_placeholder: nelokala uzanti de %{instance}
+      reopen: Riapertez raporto
+      report: 'Raporto #%{id}'
+      reported_account: Raportizita konto
+      reported_by: Raportizesis da
+      resolved: Rezolvesis
+      resolved_msg: Raporto sucesoze rezolvesis!
+      skip_to_actions: Saltez a agi
+      status: Stando
+      statuses: Raportizita kontenajo
+      statuses_description_html: Ofensanta kontenajo citesos en komuniko kun raportizita konto
+      target_origin: Fonto di raportizita konto
+      title: Raporti
+      unassign: Detaskigez
+      unresolved: Nerezolvita
+      updated_at: Novigesis
+      view_profile: Videz profilo
+    rules:
+      add_new: Insertez regulo
+      delete: Efacez
+      description_html: Quankam maxim multa personi asertar ke lu ja lektis e konsentis serveskondicioni, frequente personi ne komplete lektas til problemo eventas. <strong>Faciligez on vidar vua reguli di servilo kurte per pozar puntostrukturlisto.</strong> Lasez singla reguli esar kurta e simpla, ma ne fendez a multa separata kozi anke.
+      edit: Modifikez regulo
+      empty: Nula servilreguli fixesis til nun.
+      title: Servilreguli
     settings:
+      activity_api_enabled:
+        desc_html: Quanto de lokale publikigita posti, aktiva uzanti e nova registri quale semane faski
+        title: Publikigez rezumstatistiko pri uzantoaktiveso en API
+      bootstrap_timeline_accounts:
+        desc_html: Separez multopla uzantonomi kun komo. Ca konti garantiesos montresar en sequorekomendi
+        title: Rekomendez ca konti a nova uzanti
       contact_information:
         email: Enter a public e-mail address
         username: Enter a username
+      custom_css:
+        desc_html: Modifikez aspekto kun CSS chargasas che singla pagino
+        title: Kustumizita CSS
+      default_noindex:
+        desc_html: Efektigar omna uzanti quo ne chanjis ca opciono per su
+        title: Despartoprenigez uzanti de trovmotorindexo quale originala stando
+      domain_blocks:
+        all: A omnu
+        disabled: A nulu
+        title: Montrez domenobstrukti
+        users: A enirinta lokala uzanti
+      domain_blocks_rationale:
+        title: Montrez motivo
+      hero:
+        desc_html: Montresas che chefpagino. Minime 600x100px rekomendesas. Se ne fixesis, ol retrouzas servilimajeto
+        title: Heroimajo
+      mascot:
+        desc_html: Montresas che multa chefpagino. Minime 293x205px rekomendesas. Se ne fixesis, ol retrouzas reprezentanto
+        title: Reprezenterimajo
+      peers_api_enabled:
+        desc_html: Domennomo quon ca servilo renkontris en fediverso
+        title: Publikigez listo di deskovrita servili en API
+      preview_sensitive_media:
+        desc_html: Ligilprevidi che altra retsiti montros imajeto mem se medii markizesas quale sentoza
+        title: Montrez sentoza medii e OpenGraph previdi
+      profile_directory:
+        desc_html: Permisez uzanti deskovresar
+        title: Aktivigez profilcheflisto
       registrations:
         closed_message:
           desc_html: Displayed on frontpage when registrations are closed<br>You can use HTML tags
+          title: Mesajo di klozita registro
+        deletion:
+          desc_html: Permisez irgu efacar sua konto
+          title: Apertez kontoefaco
+        min_invite_role:
+          disabled: Nulu
+          title: Permisez inviti da
+        require_invite_text:
+          desc_html: Se registri bezonas manuala aprobo, kauzigar "Por quo vu volas juntar?" textoenpoz divenar obligata
+          title: Bezonez nova uzanti insertar motivo por juntar
+      registrations_mode:
+        modes:
+          approved: Aprobo bezonesas por registro
+          none: Nulu povas registrar
+          open: Irgu povas registrar
+        title: Registromodo
+      show_known_fediverse_at_about_page:
+        desc_html: Se desaktivigesis, co permisas publika tempolineo quo ligesas de atingopagino montrar nur lokala kontenajo
+        title: Inkluzez federatita kontenajo che neyurizita publika tempolineopagino
+      show_staff_badge:
+        desc_html: Montrez laborerinsigno che uzantopagino
+        title: Montrez laborerinsigno
       site_description:
         desc_html: Displayed as a paragraph on the frontpage and used as a meta tag.<br>You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
         title: Site description
       site_description_extended:
         desc_html: Displayed on extended information page<br>You can use HTML tags
         title: Extended site description
+      site_short_description:
+        desc_html: Montresas en flankobaro e metatagi. Deskriptez Mastodon e por quo ca servilo esas specala per 1 paragrafo.
+        title: Kurta servildeskripto
+      site_terms:
+        desc_html: Vu povas skribar sua privatesguidilo, serveskondicioni e altra legi. Vu povas uzar HTML-tagi
+        title: Kustumizita serveskondicioni
       site_title: Site title
+      thumbnail:
+        desc_html: Uzesis por previdi tra OpenGraph e API. 1200x630px rekomendesas
+        title: Servilimajeto
+      timeline_preview:
+        desc_html: Montrez ligilo e publika tempolineo che atingopagino e permisez API acesar publika tempolineo sen yurizo
+        title: Permisez neyurizita aceso a publika tempolineo
       title: Site Settings
+      trendable_by_default:
+        desc_html: Efektigas hashtagi quo ante nepermisesis
+        title: Permisez hashtagi divenies tendencoza sen bezonata kontrolo
+      trends:
+        desc_html: Publika montrez antee kontrolita kontenajo quo nun esas tendencoza
+        title: Tendenci
+    site_uploads:
+      delete: Efacez adchargita failo
+      destroyed_msg: Sitadchargito sucesoze efacesis!
+    statuses:
+      back_to_account: Retrovenez a kontopagino
+      back_to_report: Retrovenez a raportpagino
+      batch:
+        remove_from_report: Efacez de raporto
+        report: Raportizez
+      deleted: Efacesis
+      media:
+        title: Medii
+      no_status_selected: Nula posti chanjesis pro ke nulo selektesis
+      title: Kontoposti
+      with_media: Kun medii
+    strikes:
+      actions:
+        delete_statuses: "%{name} efacis posti di %{target}"
+        disable: "%{name} frostigis konto di %{target}"
+        mark_statuses_as_sensitive: "%{name} markizis posti di %{target} quale sentoza"
+        none: "%{name} sendis averto a %{target}"
+        sensitive: "%{name} markizis konto di %{target} quale sentoza"
+        silence: "%{name} limitizis konto di %{target}"
+        suspend: "%{name} restriktis konto di %{target}"
+      appeal_approved: Apelis
+      appeal_pending: Vartata apelo
+    system_checks:
+      database_schema_check:
+        message_html: Existas vartanta datamaturmigri. Startez por certigar ke la softwaro kondutar quale expektita
+      elasticsearch_running_check:
+        message_html: Ne povas konektas a Elasticsearch. Kontrolez ke ol functionas o desaktivigez textokompleta trovo
+      elasticsearch_version_check:
+        message_html: 'Nekonciliebla versiono di Elasticsearch: %{value}'
+        version_comparison: Elasticsearch %{running_version} funcionas ma %{required_version} bezonesas
+      rules_check:
+        action: Jerez servilreguli
+        message_html: Vu ne fixis irga servilreguli.
+      sidekiq_process_check:
+        message_html: Sidekiq procedo ne funcionas ye %{value} fask(o). Kontrolez vua opciono di Sidekiq
+    tags:
+      review: Kontrolez stando
+      updated_msg: Hashtagopcioni novigesis sucesoze
+    title: Administro
     trends:
+      allow: Permisez
+      approved: Aprobesis
+      disallow: Despermisez
+      links:
+        allow: Permisez ligilo
+        allow_provider: Permisez publikiganto
+        description_html: Co esas ligili quo nun multe partigesas da konti kun posti quon vua servilo vidas. Ol povas helpar vua uzanti lernar quo eventas en mondo. Ligili ne publike montresas til vu aprobar publikiganto. Vu povas anke permisar o refuzar individuala ligili.
+        disallow: Despermisez ligilo
+        disallow_provider: Despermisez publikiganto
+        shared_by_over_week:
+          one: Partigesis da 1 persono de pos antea semano
+          other: Partigesis da %{count} personi de pos antea semano
+        title: Tendencoza ligili
+        usage_comparison: Partigesis %{today} foyi hodie, la nombro esas %{yesterday} hiere
       only_allowed: Nur permisato
+      pending_review: Vartas kontrolo
+      preview_card_providers:
+        allowed: Ligili de ca publikiganto povas divenar tendenco
+        description_html: Co esas domen quo havas ligili quo frequente partigesas en vua servilo. Ligili ne divenas tendenco publike se domeno di ligilo ne aprobesas. Vua aprobo (o refuzo) anke esas por subdomeni.
+        rejected: Ligili de ca publikiganto ne divenos tendenco
+        title: Publikiganti
+      rejected: Refuzesis
+      statuses:
+        allow: Permisez posto
+        allow_account: Permisez skribanto
+        description_html: Co esas posti quon vua servilo savas quale nun partigesas e favorizesas multe nun. Ol povas helpar vua nova e retrovenanta uzanti trovar plu multa personi por sequar. Posti ne publike montresas til vu aprobar la skribanto, e la skribanto permisas sua konto sugestesas a altra personi. Vu povas anke permisar o refuzar individuala posti.
+        disallow: Despermisez posto
+        disallow_account: Despermisez skribanto
+        not_discoverable: Skribanto ne konsentis pri esar deskovrebla
+        shared_by:
+          one: Partigesis o favorizesis 1 foye
+          other: Partigesis o favorizesis %{friendly_count} foye
+        title: Tendencoza posti
+      tags:
+        current_score: Nuna punto esas %{score}
+        dashboard:
+          tag_accounts_measure: specala uzeso
+          tag_languages_dimension: Maxim uzita lingui
+          tag_servers_dimension: Maxim uzita servili
+          tag_servers_measure: diferanta servili
+          tag_uses_measure: uzsumo
+        description_html: Co esas hashtagi quo nun aparas en multa posti quon vua servilo vidas. Ol povas helpar vua uzanti lernar quon personi parolas frequente nun. Hashtagi ne montresas publike til vu aprobar.
+        listable: Povas sugestesar
+        not_listable: Ne sugestesar
+        not_trendable: Ne aparas che tendenci
+        not_usable: Ne povas uzesar
+        peaked_on_and_decaying: Maxim uzita ye %{date}, nun diminutesas
+        title: Tendencoza hashtagi
+        trendable: Povas aparar che tendenci
+        trending_rank: 'Tendencorango #%{rank}'
+        usable: Povas uzesar
+        usage_comparison: Uzesis %{today} foyi hodie, la nombro esas %{yesterday} hiere
+        used_by_over_week:
+          one: Uzesis da 1 persono de pos 1 semano
+          other: Uzesis da %{count} personi de pos 1 semano
+      title: Tendenci
       trending: Tendenco
+    warning_presets:
+      add_new: Insertez novo
+      delete: Efacez
+      edit_preset: Modifikez avertfixito
+      empty: Vu ne fixis irga avertfixito til nun.
+      title: Jerez avertfixiti
+  admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: efacos ola posti
+        disable: frostigar olia konto
+        mark_statuses_as_sensitive: markizos ola posti quale sentoza
+        none: averto
+        sensitive: markizos ola konto quale sentoza
+        silence: limitizos ola konto
+        suspend: restriktos ola konto
+      body: "%{target} apelas jerdecido da %{action_taken_by} de %{date}, quale esis %{type}. Oli skribis:"
+      next_steps: Vu povas aprobar apelo por deagar jerdecido o ignorar.
+      subject: "%{username} apela jerdecido che %{instance}"
+    new_pending_account:
+      body: Detali de nova konto esas la subo. Vu povas aprobar o refuzar ca apliko.
+      subject: Nova konto bezonas kontrolesar che %{instance} (%{username})
+    new_report:
+      body: "%{reporter} raportizis %{target}"
+      body_remote: Ulu de %{domain} raportizis %{target}
+      subject: Nova raporto por %{instance} (#%{id})
+    new_trends:
+      body: 'Ca kozi bezonas kontrol ante ol povas montresar publike:'
+      new_trending_links:
+        no_approved_links: Nun no existas aprobita tendencoza ligili.
+        requirements: 'Irga ca probanti povas ecesar la #%{rank} aprobita tendencoligilo, quale nun esas %{lowest_link_title} kun punto %{lowest_link_score}.'
+        title: Tendencoza ligili
+      new_trending_statuses:
+        no_approved_statuses: Nun ne existas aprobita tendencoza posti.
+        requirements: 'Irga ca probanti povas ecesar la #%{rank} aprobita tendencoligilo, quale nun esas %{lowest_status_url} kun punto %{lowest_status_score}.'
+        title: Tendencoza posti
+      new_trending_tags:
+        no_approved_tags: Nun ne existas aprobita tendencoza hashtagi.
+        requirements: 'Irga ca probanti povas ecesar la #%{rank} aprobita tendencoligilo, quale nun esas %{lowest_tag_name} kun punto %{lowest_tag_score}.'
+        title: Tendencoza hashtagi
+      subject: Nova tendenci bezonas kontrolesar che %{instance}
+  aliases:
+    add_new: Kreez alternativa nomo
+    created_msg: Sucesoze kreis nova alternativa nomo. Vu povas nun komencar transfero de la olda konto.
+    deleted_msg: Sucesoze efacis alternativa nomo. Transferar de ta konto a co ne esos posibla.
+    empty: Vu ne havas alternativa nomi.
+    hint_html: Se vu volas transferesar de altra konto a co, hike vu povas krear alternativnomo, quo bezonesas ante vu povas durigar transferar sequanti de la olda konto a co. Ca ago esas <strong>nedanjeroza e inversigebla</strong>. <strong>Kontomigro komencesas de la olda konto</strong>.
+    remove: Deligez alternative nomo
+  appearance:
+    advanced_web_interface: Avancata retintervizajo
+    advanced_web_interface_hint: 'Se vu volas uzar tota skrenlongeso, avancata retintervizajo povigas vu modifikar multa diferanta kolumni por vida multa informi en sama tempo quon vu volas: Hemo, avizi, federatata tempolineo, multa listi e hashtagi.'
+    animations_and_accessibility: Animacii e aceseso
+    confirmation_dialogs: Konfirmdialogi
+    discovery: Deskovro
+    localization:
+      body: Mastodon tradukesas da voluntarii.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Omnu povas kontributar.
+    sensitive_content: Sentoza kontenajo
+    toot_layout: Postostrukturo
   application_mailer:
+    notification_preferences: Chanjez retpostopreferaji
+    salutation: "%{name},"
     settings: 'Chanjar la retpost-mesajala preferi: %{link}'
     view: 'Vidar:'
+    view_profile: Videz profilo
+    view_status: Videz posto
   applications:
+    created: Apliko sucesoze kreesas
+    destroyed: Apliko sucesoze efacesas
     invalid_url: La URL donita ne esas valida
+    regenerate_token: Rifacez acesficho
+    token_regenerated: Acesficho sucesoze riganesas
+    warning: Sorgemez per ca informi. Ne partigez kun irgu!
+    your_token: Vua acesficho
   auth:
+    apply_for_account: Demandez invito
+    change_password: Pasvorto
+    checkbox_agreement_html: Se konsentas <a href="%{rules_path}" target="_blank">servilreguli</a> e <a href="%{terms_path}" target="_blank">serveskondiconi</a>
+    checkbox_agreement_without_rules_html: Me konsentar <a href="%{terms_path}" target="_blank">serveskondicioni</a>
+    delete_account: Efacez konto
+    delete_account_html: Se vu volas efacar vua konto, vu povas <a href="%{path}">irar hike</a>. Vu demandesos konfirmar.
+    description:
+      prefix_invited_by_user: "@%{name} invitas vu juntar ca servilo di Mastodon!"
+      prefix_sign_up: Registrez che Mastodon hodie!
+      suffix: Per konto, vu povos sequar personi, postigar novaji e interchanjar mesaji kun uzanti de irga servilo di Mastodon e pluse!
     didnt_get_confirmation: Ka tu ne recevis la instrucioni por konfirmar?
+    dont_have_your_security_key: Ka vu ne havas sekuresklefo?
     forgot_password: Pasvorto obliviita?
+    invalid_reset_password_token: Pasvorto richanjoficho esas nevalida o expirita. Demandez novo.
+    link_to_otp: Insertez 2-faktorkodexo de vua fono o rigankodexo
+    link_to_webauth: Uzez vua sekuresklefaparato
+    log_in_with: Enirez per
     login: Enirar
     logout: Ekirar
+    migrate_account: Transferez a diferanta konto
+    migrate_account_html: Se vu volas ridirektar ca konto a diferanto, vu povas <a href="%{path}">ajustar hike</a>.
+    or_log_in_with: O eniras per
+    providers:
+      cas: CAS
+      saml: SAML
     register: Membreskar
+    registration_closed: "%{instance} ne aceptas nova membri"
     resend_confirmation: Risendar la instrucioni por konfirmar
     reset_password: Chanjar la pasvorto
     security: Chanjar pasvorto
     set_new_password: Selektar nova pasvorto
+    setup:
+      email_below_hint_html: Se suba retpostoadreso esas nekorekta, vu povas chanjar hike e ganar nova konfirmretposto.
+      email_settings_hint_html: Konfirmretposto sendesis a %{email}. Se ta retpostoadreso ne esas korekta, vu povas chanjar en kontoopcioni.
+      title: Komencoprocedo
+    status:
+      account_status: Kontostando
+      confirming: Vartas retpostokonfirmo finar.
+      functional: Vua konto esas tote funcionoza.
+      pending: Vua apliko bezonas kontrolo da nia laborero. Co forsan esas nekurta. Vu ganos retposto se vua apliko aprobesas.
+      redirecting_to: Vua konto esas neaktiva pro ke ol nun ridirektesos a %{acct}.
+      view_strikes: Videz antea streki kontre vua konto
+    too_fast: Formulario sendesis tro rapide, probez itere.
+    trouble_logging_in: Ka ne povas enirar?
+    use_security_key: Uzes sekuresklefo
   authorize_follow:
+    already_following: Vu ja sequis ca konto
+    already_requested: Vu ja sendis sequodemando a ta konto
     error: Regretinde, eventis eraro probante konsultar la fora konto
     follow: Sequar
+    follow_request: 'Vu sendis sequodemando a:'
+    following: 'Suceso! Vu nun sequas:'
+    post_follow:
+      close: O, vu volas jus klozar ca panelo.
+      return: Montrez priflo de uzanti
+      web: Irez a interreto
     title: Sequar %{acct}
+  challenge:
+    confirm: Durez
+    hint_html: "<strong>Guidilo:</strong> Ni ne demandos vua pasvorto itere til 1 horo."
+    invalid_password: Nevalida pasvorto
+    prompt: Konfirmez pasvorto por durar
+  crypto:
+    errors:
+      invalid_key: ne esas valida klefo Ed25519 o Curve25519
+      invalid_signature: ne esas valida parafo Ed25519
+  date:
+    formats:
+      default: "%d %b, %Y"
+      with_month_name: "%d %B, %Y"
   datetime:
     distance_in_words:
+      about_x_hours: "%{count}h"
+      about_x_months: "%{count}mo"
+      about_x_years: "%{count}y"
+      almost_x_years: "%{count}y"
       half_a_minute: Jus
+      less_than_x_minutes: "%{count}m"
       less_than_x_seconds: Jus
+      over_x_years: "%{count}y"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}mo"
+      x_seconds: "%{count}s"
+  deletes:
+    challenge_not_passed: Informo quon vu insertis ne esas korekta
+    confirm_password: Insertez nuna pasvorto por verifikar vua identeso
+    confirm_username: Insertez vua uzantonomo por konfirmar procedo
+    proceed: Efacez konto
+    success_msg: Vua konto sucesoze efacesis
+    warning:
+      before: 'Ante durar, lektez ca noti sorgeme:'
+      caches: Kontenajo quo memoresis da altra servilo forsan restas
+      data_removal: Vua posti e altra informi netempale efacesis
+      email_change_html: Vu povas <a href="%{path}">chanjar vua retpostoadreso</a> sen efacar vua konto
+      email_contact_html: Se ol ankore ne venas, vu povas retpostigar a <a href="mailto:%{email}">%{email}</a> por ganar helpo
+      email_reconfirmation_html: Se vu ne ganas konfirmretposto, vu povas <a href="%{path}">demandar itere</a>
+      irreversible: Vu ne povos riganar o riaktivigar vua konto
+      more_details_html: Por plu multa detali, videz <a href="%{terms_path}">privatesguidilo</a>.
+      username_available: Vua uzantonomo divenos disponebla itere
+      username_unavailable: Vua uzantonomo restos nedisponebla
+  directories:
+    directory: Profilcheflisto
+    explanation: Deskovrez uzanti segun olia intereso
+    explore_mastodon: Explorez %{title}
+  disputes:
+    strikes:
+      action_taken: Agesis
+      appeal: Apelo
+      appeal_approved: Ca streko sucesoza apelesis e nun ne esas valida
+      appeal_rejected: Apelo refuzesis
+      appeal_submitted_at: Apelo sendesis
+      appealed_msg: Vua apelo sendesis. Se ola aprobesis, vu notifikesos.
+      appeals:
+        submit: Sendez apelo
+      approve_appeal: Aprobez rikonsidero
+      associated_report: Relatata raporto
+      created_at: Dato
+      description_html: Co esas agi kontre vua konto e averti quo sendesis a vu da laborero di %{instance}.
+      recipient: Sendesas a
+      reject_appeal: Refusez rikonsidero
+      status: 'Posto #%{id}'
+      status_removed: Posto ja efacis de sistemo
+      title: "%{action} de %{date}"
+      title_actions:
+        delete_statuses: Postoefaco
+        disable: Frostigo di konto
+        mark_statuses_as_sensitive: Markizo di posti quale sentoza
+        none: Averto
+        sensitive: Markizo di konto quale sentoza
+        silence: Limitizo di konto
+        suspend: Restrikto de konto
+      your_appeal_approved: Vua konto aprobesis
+      your_appeal_pending: Vu sendis apelo
+      your_appeal_rejected: Vua apelo refuzesis
+  domain_validator:
+    invalid_domain: ne esas valida domennomo
   errors:
-    '400': The request you submitted was invalid or malformed.
-    '403': You don't have permission to view this page.
+    '400': Demando quon vu sendis esas nevalida o malstrukturala.
+    '403': Vu ne havas permiso por vidar ca pagino.
     '404': La pagino quan tu serchas ne existas.
-    '406': This page is not available in the requested format.
+    '406': Ca pagino ne esas displonebla kun demandita formato.
     '410': La pagino quan tu serchas ne plus existas.
-    '422': 
-    '429': Too many requests
-    '500': 
-    '503': The page could not be served due to a temporary server failure.
+    '422':
+      content: Sekuresverifiko faliis. Ka vu obstruktas kukii?
+      title: Sekuresverifiko faliis
+    '429': Tro multa agi
+    '500':
+      content: Regreto, ma evas nefuncionas che nia latero.
+      title: Ca pagino ne esas korekta
+    '503': La pagino ne povas montresas pro tempala servilfalio.
+    noscript_html: Por uzar retsoftwaro di Mastodon, aktivigez JavaScript. Alternative, probez 1 de <a href="%{apps_path}">konciliebla softwari</a> por Mastodon por vua platformo.
+  existing_username_validator:
+    not_found: ne povas trovar lokala uzanti kun ta uzantonomo
+    not_found_multiple: ne povas trovar %{usernames}
   exports:
+    archive_takeout:
+      date: Dato
+      download: Deschargez vua arkivo
+      hint_html: Vu povas demandar arkivo di vua <strong>posti e adchargita medii</strong>. Exportacita informi esos kun ActivityPub format, e lektebla da irga konciliebla softwaro. Vu povas demandar arkivo pos singla 7 dii.
+      in_progress: Kompilar vua arkivo...
+      request: Demandez vua arkivo
+      size: Grandeso
     blocks: Tu blokusas
+    bookmarks: Libromarki
+    csv: CSV
+    domain_blocks: Domenobstrukti
+    lists: Listi
+    mutes: Vu silencigesas
     storage: Konservado di kontenajo
+  featured_tags:
+    add_new: Insertez novo
+    errors:
+      limit: Vu ja estelis maxima hashtagi
+    hint_html: "<strong>Quo esas estelita hashtagi?</strong> Ol montresas eminente che vua publika profilo e povigas personi vidar vua publika posti partikulare kun ta hashtagi. Oli esas bona utensilo por jeretar kreiva agaji e longa projetaji."
+  filters:
+    contexts:
+      account: Profili
+      home: Hemo e listi
+      notifications: Avizi
+      public: Publika tempolinei
+      thread: Konversi
+    edit:
+      title: Modifikez filtrilo
+    errors:
+      invalid_context: Nula o nevalida kuntexto donesis
+      invalid_irreversible: Neinversigebla filtro nur funcionas kun hemo- e aviz- kuntexto
+    index:
+      delete: Efacez
+      empty: Vu ne havas filtrili.
+      title: Filtrili
+    new:
+      title: Insertez nova filtrilo
+  footer:
+    developers: Developeri
+    more: Pluse…
+    resources: Moyeni
+    trending_now: Nuna tendenco
   generic:
+    all: Omna
     changes_saved_msg: Chanji senprobleme konservita!
+    copy: Kopiez
+    delete: Efacez
+    none: Nulo
+    order_by: Asortez quale
     save_changes: Konservar la chanji
+    today: hodie
     validation_errors:
       one: Ulo ne eventis senprobleme! Voluntez konsultar la suba eror-raporto
       other: Ulo ne eventis senprobleme! Voluntez konsultar la suba %{count} eror-raporti
+  html_validator:
+    invalid_markup: 'kontenas nevalida kompozuro di HTML: %{error}'
   imports:
+    errors:
+      over_rows_processing_limit: kontenas plu kam %{count} horizontala lineo
+    modes:
+      merge: Kombinez
+      merge_long: Retenez displonebla rekordi e insertez novi
+      overwrite: Remplasez
+      overwrite_long: Remplasez nuna rekordi per novi
     preface: Tu povas importacar kelka datumi, tal quala listi de omna homi quin tu sequas o blokusas, a tua konto di ca instaluro, per dosiero exportacita de altra instaluro.
     success: Tua datumi esis senprobleme importacita ed esos traktita quale projetita
     types:
       blocking: Listo de blokusiti
+      bookmarks: Libromarki
+      domain_blocking: Domenobstruktolisto
       following: Listo de sequati
+      muting: Silenciglisto
     upload: Kargar
+  in_memoriam_html: Memorialo.
+  invites:
+    delete: Deaktivigez
+    expired: Expiris
+    expires_in:
+      '1800': 30 minuti
+      '21600': 6 hori
+      '3600': 1 horo
+      '43200': 12 hori
+      '604800': 1 semano
+      '86400': 1 dio
+    expires_in_prompt: Nulatempe
+    generate: Facez invitligilo
+    invited_by: 'Vu invitesis da:'
+    max_uses:
+      one: 1 uzo
+      other: "%{count} uzi"
+    max_uses_prompt: Nula limito
+    prompt: Facez e partigez ligili kun altra personi por donar aceso a ca servilo
+    table:
+      expires_at: Expiros
+      uses: Uzi
+    title: Invitez personi
+  lists:
+    errors:
+      limit: Vu astingas maxima listi
+  login_activities:
+    authentication_methods:
+      otp: 2-faktoryurizessoftwaro
+      password: pasvorto
+      sign_in_token: retpostosekureskodexo
+      webauthn: sekuresklefi
+    description_html: Se vu vidas aktiveso quon vu ne rikonocas, konsiderez chanjar vua pasvorto e aktivigez 2-faktoryurizo.
+    empty: Yurizeshistorio esas nedisponebla
+    failed_sign_in_html: Falita enirprob per %{method} de %{ip} (%{browser})
+    successful_sign_in_html: Sucesoza eniro per %{method} de %{ip} (%{browser})
+    title: Yurizeshistorio
+  media_attachments:
+    validations:
+      images_and_video: Ne povas atachar video a posto quo ja kontenar imaji
+      not_ready: Ne povas faili quo ankore procedigesas. Probez itere pose!
+      too_many: Ne povas atachar plu kam 4 faili
+  migrations:
+    acct: Transferesis a
+    cancel: Anulez ridirekto
+    cancel_explanation: Anular ridirekto riaktivigos vua nuna konto, ma ne riganos sequanti quo transferesis a ta konto.
+    cancelled_msg: Sucesoze anulis ridirekto.
+    errors:
+      already_moved: esas sama transferkonto
+      missing_also_known_as: ne esas alternativa nomo di ca konto
+      move_to_self: ne povas esar nuna konto
+      not_found: ne povas trovesar
+      on_cooldown: Vu havas varttempo
+    followers_count: Sequanti en transfertempo
+    incoming_migrations: Transfero de diferanta konto
+    incoming_migrations_html: Por transferar de irga konto a to, unesme vu bezonas <a href="%{path}">krear kontoalternativnomo</a>.
+    moved_msg: Vua konto nun ridirektesas a %{acct} e vua sequanti transferesas.
+    not_redirecting: Vua konto ne ridirektesas a irga altra konto nun.
+    on_cooldown: Vu recente migrigis vua konto. Ca funciono divenos disponebla itere pos %{count} dii.
+    past_migrations: Antea migri
+    proceed_with_move: Transferez sequanti
+    redirected_msg: Vua konto nun ridirektesas a %{acct}.
+    redirecting_to: Vua konto ridirektesas a %{acct}.
+    set_redirect: Fixez ridirekto
+    warning:
+      backreference_required: Nova konto mustas unesme ajustesar por dopreferar co
+      before: 'Ante durar, lektez ca noti sorgeme:'
+      cooldown: Pos transferesar, existas varttempo kande vu ne povas transferesar itere
+      disabled_account: Vua nuna konto ne divenos tote uzebla pose. Tamen, vu povas acesar informexportaco e anke riaktivigo.
+      followers: Ca ago transferos omna sequanti de nuna konto a nova konto
+      only_redirect_html: Alternative, vu povas <a href="%{path}">nur pozar ridirekto che vua profilo</a>.
+      other_data: Altra informi ne transferesos automate
+      redirect: Vua nuna profilo di konto novigesos kun ridirektoavizo e neinkluzesos de trovi
+  moderation:
+    title: Jero
+  move_handler:
+    carry_blocks_over_text: Ca uzanti transferesis de %{acct} quon vu restriktis.
+    carry_mutes_over_text: Ca uzanti transferesis de %{acct} quon vu silencigis.
+    copy_account_note_text: 'Ca uzanti transferesis de %{acct}, co esas vua antea noti pri ol:'
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} registris"
     digest:
+      action: Videz omna avizi
       body: Yen mikra rezumo di to, depos ke tu laste vizitis en %{since}
       mention: "%{name} mencionis tu en:"
       new_followers_summary:
         one: Tu obtenis nova sequanto! Yey!
         other: Tu obtenis %{count} nova sequanti! Astonive!
+      subject:
+        one: "1 nova avizo de pos vua antea vizito 🐘"
+        other: "%{count} nova avizi de pos vua antea vizito 🐘"
+      title: Dum vua neprezenteso...
     favourite:
       body: "%{name} favoris tua mesajo:"
       subject: "%{name} favoris tua mesajo"
+      title: Nova favorato
     follow:
       body: "%{name} sequeskas tu!"
       subject: "%{name} sequeskas tu"
+      title: Nova sequanto
     follow_request:
+      action: Jerez sequodemandi
       body: "%{name} demandis sequar tu"
       subject: "%{name} demandis sequar tu"
+      title: Nova sequodemando
     mention:
+      action: Respondez
       body: "%{name} mencionis tu en:"
       subject: "%{name} mencionis tu"
+      title: Nova menciono
+    poll:
+      subject: Votposto di %{name} finis
     reblog:
       body: "%{name} diskonocigis tua mesajo:"
       subject: "%{name} diskonocigis tua mesajo"
+      title: Nova busto
+    status:
+      subject: "%{name} nove postigis"
+    update:
+      subject: "%{name} modifikis posto"
+  notifications:
+    email_events: Eventi por retpostoavizi
+    email_events_hint: 'Selektez eventi quon vu volas ganar avizi:'
+    other_settings: Altra avizopcioni
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: G
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  otp_authentication:
+    code_hint: Insertez kodexo quo facesis da vua yurizsoftwaro por konfirmar
+    description_html: Se vu aktivigas <strong>2-faktoryurizo</strong> per yurizsoftwaro, eniro bezonos vu havar vua smartfono, quale facas fichi por vu por enirar.
+    enable: Aktivigez
+    instructions_html: "<strong>Skanez ca QR-kodexo a Google Authenticator o simila TOTP-softwaro en vua smartfono</strong>. Pos co, ta softwaro facos fichi quon vu bezonos insertar kande enirar."
+    manual_instructions: 'Se vu ne povas skanar QR-kodexo e bezonas insertar manuala, subo esas textosekreto:'
+    setup: Facez
+    wrong_code: Insertita kodexo esas nevalida! Ka serviltempo e aparattempo esas korekta?
   pagination:
+    newer: Nova
     next: Sequanta
+    older: Olda
     prev: Preiranta
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Vu ja votis che ca votposto
+      duplicate_options: havas duplikatkozi
+      duration_too_long: esas tro distanta en futuro
+      duration_too_short: es tro balde
+      expired: Votposto ja finis
+      invalid_choice: Selektita votselektajo ne existas
+      over_character_limit: ne povas esar plu longa kam %{max} literi por sing
+      too_few_options: mustas havar kozi
+      too_many_options: ne povas havar plu kam %{max} kozi
+  preferences:
+    other: Altra
+    posting_defaults: Originala postoopcioni
+    public_timelines: Publika tempolinei
+  reactions:
+    errors:
+      limit_reached: Limito di diferanta reakto atingesis
+      unrecognized_emoji: ne esas rikonocita emocimajo
+  relationships:
+    activity: Kontoaktiveso
+    dormant: Neaktiva
+    follow_selected_followers: Sequez kelka sequanti
+    followers: Sequanti
+    following: Sequati
+    invited: Invititi
+    last_active: Recente aktiva
+    most_recent: Maxim recenta
+    moved: Transferesis
+    mutual: Reciproka
+    primary: Primara
+    relationship: Relateso
+    remove_selected_domains: Efacez omna sequanti de selektita domeni
+    remove_selected_followers: Efacez selektita sequanti
+    remove_selected_follows: Desequez selektita uzanti
+    status: Kontostando
   remote_follow:
     acct: Enpozez tua uzernomo@instaluro de ube tu volas sequar ta uzero
     missing_resource: La URL di plussendado ne povis esar trovita
+    no_account_html: Ka vu ne havas konto? Vu povas <a href='%{sign_up_path}' target='_blank'>registrar hike</a>
     proceed: Durar por plussendar
     prompt: 'Tu sequeskos:'
+    reason_html: "<strong>Por quo ca demarsho bezonesas?</strong> <code>%{instance}</code> forsan ne esas servilo ube vu registris, do ni bezonas ridirektar vu a vua hemservilo unesme."
+  remote_interaction:
+    favourite:
+      proceed: Durez favorizar
+      prompt: 'Vu povas favorizar ca posto:'
+    reblog:
+      proceed: Durez bustar
+      prompt: 'Vu volas bustar ca posto:'
+    reply:
+      proceed: Durez respondar
+      prompt: 'Vu volas respondar ca posto:'
+  reports:
+    errors:
+      invalid_rules: ne refera valida reguli
+  rss:
+    content_warning: 'Kontenajaverto:'
+    descriptions:
+      account: Publika posti de @%{acct}
+      tag: 'Publika posti kun tago #%{hashtag}'
+  scheduled_statuses:
+    over_daily_limit: Vu ecesas limito quale esas %{limit} projetita posti por hodio
+    over_total_limit: Vu ecesas limito quale esas %{limit} projetita posti
+    too_soon: Projetita dato mustas esar en futuro
+  sessions:
+    activity: Antea aktiveso
+    browser: Vidilo
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Nesavita vidilo
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Vidilo Nokia S40 Ovi
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: Vidilo QQ
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Nuna sesiono
+    description: "%{browser} che %{platform}"
+    explanation: Co esas retvidili quo nun konektesis a vua konto di Mastodon.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: Chrome OS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: macOS
+      other: nesavata platformo
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Depermisez
+    revoke_success: Sesiono sucesoze deaprobesas
+    title: Sesioni
+    view_authentication_history: Videz yurizeshistorio di vua konto
   settings:
+    account: Konto
+    account_settings: Kontoopcioni
+    aliases: Kontoaltnomi
+    appearance: Aspekto
     authorized_apps: Yurizita apliki
     back: Retro a Mastodon
+    delete: Kontoefaco
+    development: Developo
     edit_profile: Redaktar la profilo
     export: Exportacar datumi
+    featured_tags: Estelata hashtagi
     import: Importacar
+    import_and_export: Importaco e exportaco
+    migrate: Kontomigro
+    notifications: Avizi
     preferences: Preferi
+    profile: Profilo
+    relationships: Sequati e sequanti
+    statuses_cleanup: Automata postoefaco
+    strikes: Jerstreki
     two_factor_authentication: Dufaktora autentikigo
+    webauthn_authentication: Sekuresklefi
   statuses:
+    attached:
+      audio:
+        one: "%{count} audio"
+        other: "%{count} audii"
+      description: 'Atachajo: %{attached}'
+      image:
+        one: "%{count} imajo"
+        other: "%{count} imaji"
+      video:
+        one: "%{count} video"
+        other: "%{count} videi"
+    boosted_from_html: Bustesis de %{acct_link}
+    content_warning: 'Kontenajaverto: %{warning}'
+    default_language: Sama quale intervizajlinguo
+    disallowed_hashtags:
+      one: 'kontenas nepermisita hashtago: %{tags}'
+      other: 'kontenas nepermisita hashtagi: %{tags}'
+    edited_at_html: Modifikesis ye %{date}
+    errors:
+      in_reply_not_found: Posto quon vu probas respondar semblas ne existas.
     open_in_web: Apertar retnavigile
     over_character_limit: limito de %{max} signi ecesita
+    pin_errors:
+      direct: Posti quo povas videsar nur mencionita uzanti ne povas pinglagesar
+      limit: Vu ja pinglagis maxima posti
+      ownership: Posto di altra persono ne povas pinglagesar
+      reblog: Busto ne povas pinglagesar
+    poll:
+      total_people:
+        one: "%{count} persono"
+        other: "%{count} personi"
+      total_votes:
+        one: "%{count} voto"
+        other: "%{count} voti"
+      vote: Votez
     show_more: Montrar plue
+    show_newer: Montrez plu nova kozo
+    show_older: Montrez plu olda kozo
+    show_thread: Montrez postaro
+    sign_in_to_participate: Registrez por partoprenar en konverso
+    title: '%{name}: "%{quote}"'
     visibilities:
+      direct: Direta
       private: Montrar nur a sequanti
+      private_long: Nur montrez a sequanti
       public: Publika
+      public_long: Omnu povas vidar
       unlisted: Publika, ma ne aperos en publika tempolinei
+      unlisted_long: Omnu povas vidar ma ne listigesas che publika tempolinei
+  statuses_cleanup:
+    enabled: Automata efacez olda posti
+    enabled_hint: Automata efacez vua posti pos oli atingar fixita oldeslimito, se oli ne parigesas a 1 de suba ecepti
+    exceptions: Ecepti
+    explanation: Pro ke efacar posti esas nechipa procedo, co agas lente progresive kande servilo ne esas okupata. Do, vua posti forsan efacesos kurte pos oli atingas oldeslimito.
+    ignore_favs: Ignorez favorati
+    ignore_reblogs: Ignorez busti
+    interaction_exceptions: Ecepti segun interagi
+    interaction_exceptions_explanation: Notale, ne existas garantio ke posti efacesos se oli iras sub favorato o bustlimito pos iras super ol.
+    keep_direct: Retenez direta mesaji
+    keep_direct_hint: Ne efacas irga vua direta mesaji
+    keep_media: Retenez posti kun mediiatachaji
+    keep_media_hint: Ne efacas irga vua posti quo havas mediiatachaji
+    keep_pinned: Retenez pinglagita posti
+    keep_pinned_hint: Ne efacas irga vua pinglagita posti
+    keep_polls: Retenez votposti
+    keep_polls_hint: Ne efacas irga vua votposti
+    keep_self_bookmark: Retenez posti quon vu libromarkizis
+    keep_self_bookmark_hint: Ne efacas vua sua posti se vu libromarkizis li
+    keep_self_fav: Retenez posti quon vu favorizis
+    keep_self_fav_hint: Ne efacas vua sua posti se vu favorizis li
+    min_age:
+      '1209600': 2 semani
+      '15778476': 6 monati
+      '2629746': 1 monato
+      '31556952': 1 yaro
+      '5259492': 2 monati
+      '604800': 1 semano
+      '63113904': 2 yari
+      '7889238': 3 monati
+    min_age_label: Oldeslimito
+    min_favs: Retenez favorizita posti mine
+    min_favs_hint: Ne efacas irga vua posti quo ganis mine ca favorizquanto. Restez quale vakua por efacar posti sen suciar olia favorizquanto
+    min_reblogs: Retenez bustita posti mine
+    min_reblogs_hint: Ne efacas irga vua posti quo bustigesos mine ca foyoquanto. Restez quale vakua por efacar posti sen suciar olia foyoquanto
   stream_entries:
+    pinned: Pinglagita posto
     reblogged: diskonocigita
     sensitive_content: Titiliva kontenajo
+  strikes:
+    errors:
+      too_late: Ol esas tro tarda ye apelar ca strekizo
+  tags:
+    does_not_match_previous_name: ne parigesas a antea nomo
+  terms:
+    body_html: |
+      <h2>Privatesguidilo</h2>
+      <h3 id="collect">Quo informi kolektesas da ni?</h3>
+
+      <ul>
+        <li><em>Bazala kontoinformo</em></li>
+        <li><em>Posti, sequo e altra publika informo</em></li>
+        <li><em>Direta e sequantinura posti</em>: <em>Noto, operacero di servilo e gananta servilo povas vidar tala mesaji</em>. <em>Ne partigez irga privata informi che Mastodon.</em></li>
+        <li><em>IP e altra metainformi</em></li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Por quo ni uzas vua informi?</h3>
+
+      <p>
+      Irga informi quon ni kolektas de vu forsan uzesas per ca metodi:</p>
+
+      <ul>
+        <li>Por donar precipua funciono di Mastodon.</li>
+        <li>Por helpar jero di komunitato.</li>
+        <li>Retpostoadreso quon vu donas forsan uzesas por sendar informi a vu.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Quale ni protektas vua informi?</h3>
+
+      <p>Ni facar diversa sekuresdemarsh por mmantenar sekureso di vua personala informi kande vu enirar, sendar o acesar vua personala informi.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Quo esas nia informiretenguidilo?</h3>
+
+      <p>Ni esforcive proba:</p>
+
+      <ul>
+        <li>Retenar servillogi quo kontenar IP-adreso di omna demandi a ca servilo.</li>
+        <li>Retenar IP-adresi quo relatata kun registrinta uzanti til 12 monati.</li>
+      </ul>
+
+      <p>Vu povas demandar e deschargar arkivo di vua kontenajo.</p>
+
+      <p>Vu povas inversigebla efacar vua konto irgatempe.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Ka ni uzas kukii?</h3>
+
+      <p>Yes. (Se vu permisas)</p>
+
+      <p>Ni uzas kukii por komprenar e sparar vua preferaji por viziti en futuro.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Ka ni revelas irga informi a externe grupi?</h3>
+
+      <p>Ni ne vendas, komercar e transferar a externe grupi vua personala identigebla informi.</p>
+
+      <p>Vua publika kontenajo forsan deschargesas da altra servili en reto.</p>
+
+      <p>Kande vu yurizas softwaro uzar vua konto, ol forsan ganar vua publika profilinformi.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Situzo da pueri</h3>
+
+      <p>Se ca servilo esas en EU o EEA: Minimo esas 16 yari. (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>)</p>
+
+      <p>Se ca servilo esas en USA: Minimo esas 13 yari. (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>)</p>
+
+      <p>Legalbezonaji forsan esas diferanta se ca servilo esas en altra regiono.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Chanji di privatesguidilo</h3>
+
+      <p>Se ni decidas chanjar nia privatesguidilo, ni postigos ta chanji a ca pagino.</p>
+
+      <p>Ca dokumento esas CC-BY-SA.</p>
+
+      <p>Tradukesis e modifikesis de Angla de <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
+    title: Serveskondiconi e Privatesguidilo di %{instance}
+  themes:
+    contrast: Mastodon (Alta kontrasteso)
+    default: Mastodon (Obskura)
+    mastodon-light: Mastodon (Brila)
+  time:
+    formats:
+      default: "%d %b, %Y, %H:%M"
+      month: "%b %Y"
+      time: "%H:%M"
   two_factor_authentication:
+    add: Insertez
     disable: Extingar
+    disabled_success: 2-faktoryurizeso sucesoze desaktivigesas
+    edit: Modifikez
+    enabled: 2-faktoryurizeso aktivigesas
+    enabled_success: 2-faktoryurizeso sucesoze aktivigesas
     generate_recovery_codes: Generate Recovery Codes
+    lost_recovery_codes: Rigankodexi povigas vu riganas aceso a vua konto se vu perdas vua smartfono. Se vu perdas vua rigankodexi, vu povas rifacar hike. Vua olda rigankodexi nevalidigesos.
+    methods: 2-faktormetodi
+    otp: Yurizsoftwaro
+    recovery_codes: Kopiez rigannumeri
+    recovery_codes_regenerated: Rigannumeri sucesoze rifacesas
     recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe, for example by printing them and storing them with other important documents.
+    webauthn: Sekuresklefi
+  user_mailer:
+    appeal_approved:
+      action: Irez a vua konto
+      explanation: Apelo di streko kontre vua konto en %{strike_date} quale vu sendis en %{appeal_date} aprobesis. Vua konto itere standas bone.
+      subject: Vua apelo de %{date} aprobesis
+      title: Apelo aprobesis
+    appeal_rejected:
+      explanation: Apelo di streko kontre vua konto en %{strike_date} quale vu sendis en %{appeal_date} refuzesis.
+      subject: Vua apelo de %{date} refuzesis
+      title: Apelo refuzesis
+    backup_ready:
+      explanation: Vu demandis kompleta kopiur di vua konto di Mastodon. Ol esas nun pronte deschargebla!
+      subject: Vua arkivo pronte deschargebla
+      title: Arkivekpreno
+    suspicious_sign_in:
+      change_password: chanjez vua pasvorto
+      details: 'Co esas detali di eniro:'
+      explanation: Ni deskovris eniro a vua konto de nova adreso IP.
+      further_actions_html: Se co ne agesis da vu, ni rekomendas ke vu %{action} quik e aktivigas 2-faktoryurizo por sekurigar vua konto.
+      subject: Vua konto acesesis de nova adreso IP
+      title: Nova eniro
+    warning:
+      appeal: Sendez apelo
+      appeal_description: Se vu kredas ke co esas eroro, vu povas sendar apelo a laboreri di %{instance}.
+      categories:
+        spam: Spamo
+        violation: Kontenajo nesequas ca komunitatguidili
+      explanation:
+        delete_statuses: Ol trovesis ke kelka vua posti nesequas komunitatguidilo e do efacesis da jereri di %{instance}.
+        disable: Vu ne povas uzar vua konto pluse, ma vua profilo e altra informi restas bone. Vu povas demandar kopiur di vua informi, chanjar kontoopcioni e efacar vua konto.
+        mark_statuses_as_sensitive: Kelka vua posti markizesis quale sentoza da jereri di %{instance}. Do, personi bezonos kliktar medii en posti ante prevido montresas. Vu povas markizar medii quale sentoza per su kande postar en futuro.
+        sensitive: Pos co, omna vua adchargita mediifaili markizesos quale sentoza e celesos dop kliktoaverto.
+        silence: Vu povas ankore uzar vua konto ma nur personi quo ja sequis vu vidos vua posti en ca servilo, e vu forsan neinkluzesas de diversa deskovrotraiti. Tamen, altra personi povas ankore manuala sequar vu.
+        suspend: Vu ne povas uzar vua konto pluse, e vua profilo e altra informi ne esas acesebla pluse. Vu povas ankore enirar por demandar kopiur di vua informi til informi komplete efacesas pos cirkum 30 dii, ma ni retenos kelka bazala informi por preventar vu evitar restrikto.
+      reason: 'Motivo:'
+      statuses: 'Citita posti:'
+      subject:
+        delete_statuses: Vua posti che %{acct} efacis
+        disable: Vua konto %{acct} frostigesis
+        mark_statuses_as_sensitive: Vua posti che %{acct} markizesis quale sentoza
+        none: Averto por %{acct}
+        sensitive: Vua posti che %{acct} markizesos quale sentoza pos nun
+        silence: Vua konto %{acct} limitizesis
+        suspend: Vua konto %{acct} restriktesis
+      title:
+        delete_statuses: Posti efacesis
+        disable: Konto frostigesis
+        mark_statuses_as_sensitive: Posti markizesis quale sentoza
+        none: Averto
+        sensitive: Konto markizesis quale sentoza
+        silence: Konto limitizesis
+        suspend: Konto restriktigesis
+    welcome:
+      edit_profile_action: Facez profilo
+      edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, kapimajo, chanjar vua montronomo e pluse. Se vu volas kontrolar nova sequanti ante oli permisesar sequantar vu, vu povas klefklozar vua konto.
+      explanation: Subo esas guidilo por helpar vu komencar
+      final_action: Komencez postigar
+      final_step: 'Jus postigez! Mem sen sequanti, vua publika posti povas videsar da altra personi, exemplo es en lokala tempolineo e en hashtagi. Vu povas anke introduktar su en #introductions hashtagi.'
+      full_handle: Vua kompleta profilnomo
+      full_handle_hint: Co esas quon vu dicos a amiki por ke oli povas mesajigar o sequar vu de altra servilo.
+      review_preferences_action: Chanjez preferaji
+      review_preferences_step: Certigez ke vu fixas vua preferaji, tale quala retposto quon vu volas ganar, o privatesnivelo quo vu volas vua posti normale uzar. Se vu ne havas movmalado, vu povas selektar aktivigar GIF-autopleo.
+      subject: Bonveno a Mastodon
+      tip_federated_timeline: Federatata tempolineo esas generala vido di reto di Mastodon. Ma, ol nur inkluzas personi quon vua vicini abonis, do ol ne esas kompleta.
+      tip_following: Vu sequas vua administrer(o) di servilo quale originala stando. Por sequar plu multa interesanta personi, videz lokala e federatata tempolinei.
+      tip_local_timeline: Lokala tempolineo esas generala vido di personi che %{instance}. Co esas vua apuda vicini!
+      tip_mobile_webapp: Se vua smartfonvidilo povigas vu pozar Mastodon a vua hemskreno, vu povas ganar pulsavizi. Ol funcionas tale traiti di smartfonsoftwaro!
+      tips: Guidili
+      title: Bonveno, %{name}!
   users:
+    follow_limit_reached: Vu ne povas sequar plu kam %{limit} personi
     invalid_otp_token: La dufaktora autentikigila kodexo ne esas valida
+    otp_lost_help_html: Se vu perdas aceso de 2 konto, vu povas kontaktar kun %{email}
+    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
+    create:
+      error: Existas problemo kande insertar vua sekuresklefo. Probez itere.
+      success: Vua sekuresklefo sucesoze insertesas.
+    delete: Efacez
+    delete_confirmation: Ka vu certe volas efacar ca sekuresklefo?
+    description_html: Se vu aktivigas <strong>sekuresklefyurizo</strong>, eniro bezonos vu uzar 1 de vua sekuresklefi.
+    destroy:
+      error: Existas problemo kande efacar vua sekuresklefo. Probez itere.
+      success: Vua sekuresklefo sucesoze efacesis.
+    invalid_credential: Nevalida sekuresklefo
+    nickname_hint: Insertez nometo di vua nova sekuresklefo
+    not_enabled: Vu ne aktivigesas WebAuthn til nun
+    not_supported: Ca vidilo ne suportas sekuresklefi
+    otp_required: Por uzar sekuresklefi, aktivigez 2-faktoryurizeso unesme.
+    registered_on: Registris ye %{date}
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 3e3ca0ed5..63d3809a3 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -1036,10 +1036,12 @@ is:
       appealed_msg: Áfrýjun þín hefur verið sen dinn. Þú verður látin/n vita ef hún verður samþykkt.
       appeals:
         submit: Senda inn áfrýjun
+      approve_appeal: Samþykkja áfrýjun
       associated_report: Tengd kæra
       created_at: Dagsett
       description_html: Þetta eru aðgerðir sem notaðar hafa verið gagnvart aðgangnum þínum og aðvaranir sem þér hafa verið sendar af umsjónarfólki á %{instance}.
       recipient: Stílað til
+      reject_appeal: Hafna áfrýjun
       status: 'Færsla #%{id}'
       status_removed: Færsla þegar fjarlægð úr kerfinu
       title: "%{action} frá %{date}"
@@ -1354,6 +1356,11 @@ is:
   reports:
     errors:
       invalid_rules: vísar ekki til gildra reglna
+  rss:
+    content_warning: 'Aðvörun vegna efnis:'
+    descriptions:
+      account: Opinberar færslur frá @%{acct}
+      tag: 'Opinberar færslur merktar #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætlaðar færslur fyrir þennan dag
     over_total_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætlaðar færslur
@@ -1512,6 +1519,9 @@ is:
     pinned: Fest færsla
     reblogged: endurbirt
     sensitive_content: Viðkvæmt efni
+  strikes:
+    errors:
+      too_late: Það er orðið of sint að áfrýja þessari refsingu
   tags:
     does_not_match_previous_name: samsvarar ekki fyrra nafni
   terms:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index c0e802f84..c404ea3ac 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -164,9 +164,9 @@ it:
       not_subscribed: Non sottoscritto
       pending: Revisioni in attesa
       perform_full_suspension: Sospendi
-      previous_strikes: Provvedimenti precedenti
+      previous_strikes: Sanzioni precedenti
       previous_strikes_description_html:
-        one: Questo account ha <strong>una</strong> violazione.
+        one: Questo account ha <strong>una</strong> sanzione.
         other: Questo account ha <strong>%{count}</strong> violazioni.
       promote: Promuovi
       protocol: Protocollo
@@ -208,7 +208,7 @@ it:
       silence: Silenzia
       silenced: Silenziato
       statuses: Stati
-      strikes: Provvedimenti precedenti
+      strikes: Sanzioni precedenti
       subscribe: Sottoscrivi
       suspend: Sospendi
       suspended: Sospeso
@@ -597,10 +597,10 @@ it:
       action_log: Registro di controllo
       action_taken_by: Azione intrapresa da
       actions:
-        delete_description_html: I post segnalati saranno eliminati e la violazione sarà registrata per aiutarti a prendere ulteriori provvedimenti sulle future infrazioni dello stesso account.
-        mark_as_sensitive_description_html: I contenuti nei post segnalati saranno segnati come sensibili e verrà registrata una violazione per aiutarti a prendere ulteriori provvedimenti sulle future infrazioni dello stesso account.
+        delete_description_html: I post segnalati saranno eliminati e la sanzione sarà registrata per aiutarti a prendere ulteriori provvedimenti sulle future infrazioni dello stesso account.
+        mark_as_sensitive_description_html: I contenuti nei post segnalati saranno segnati come sensibili e verrà registrata una sanzione per aiutarti a prendere ulteriori provvedimenti sulle future infrazioni dello stesso account.
         other_description_html: Vedi altre opzioni per controllare il comportamento dell'account e personalizzare la comunicazione all'account segnalato.
-        resolve_description_html: Nessuna azione sarà intrapresa contro l'account segnalato, nessuna violazione registrata, e la segnalazione sarà chiusa.
+        resolve_description_html: Nessuna azione sarà intrapresa contro l'account segnalato, nessuna sanzione registrata, e la segnalazione sarà chiusa.
         silence_description_html: Il profilo sarà visibile solo a coloro che lo seguono o lo cercano manualmente, limitandone fortemente la raggiungibilità. Può sempre essere annullato.
         suspend_description_html: Il profilo e tutti i suoi contenuti diventeranno inaccessibili fino a quando non sarà cancellato. L'interazione con l'account sarà impossibile. Annullabile entro 30 giorni.
       actions_description_html: Decidete quali azioni intraprendere per risolvere la segnalazione. Se si intraprende un'azione punitiva contro l'account segnalato, gli sarà inviata una notifica via e-mail, tranne quando è selezionata la categoria <strong>Spam</strong>.
@@ -802,6 +802,7 @@ it:
           other: Condiviso da %{count} persone nell'ultima settimana
         title: Link in tendenza
         usage_comparison: Condiviso %{today} volte oggi, rispetto a %{yesterday} ieri
+      only_allowed: Solo consentiti
       pending_review: Revisione in sospeso
       preview_card_providers:
         allowed: I link da questa fonte possono essere in tendenza
@@ -843,6 +844,7 @@ it:
           one: Usato da una persona nell'ultima settimana
           other: Usato da %{count} persone nell'ultima settimana
       title: Tendenze
+      trending: Di tendenza
     warning_presets:
       add_new: Aggiungi nuovo
       delete: Cancella
@@ -962,7 +964,7 @@ it:
       functional: Il tuo profilo è completamente operativo.
       pending: La tua richiesta è in attesa di esame da parte del nostro staff. Potrebbe richiedere un po' di tempo. Riceverai una e-mail se la richiesta è approvata.
       redirecting_to: Il tuo account è inattivo perché attualmente reindirizza a %{acct}.
-      view_strikes: Visualizza gli avvisi passati contro il tuo profilo
+      view_strikes: Visualizza le sanzioni precedenti prese nei confronti del tuo account
     too_fast: Modulo inviato troppo velocemente, riprova.
     trouble_logging_in: Problemi di accesso?
     use_security_key: Usa la chiave di sicurezza
@@ -1036,10 +1038,12 @@ it:
       appealed_msg: Il tuo appello è stato presentato. Se sarà approvato, sarai informato.
       appeals:
         submit: Presenta un appello
+      approve_appeal: Approva ricorso
       associated_report: Segnalazione associata
       created_at: Data
       description_html: Queste sono azioni intraprese contro il tuo profilo e avvisi inviati a te dallo staff di %{instance}.
       recipient: Indirizzata a
+      reject_appeal: Respingi ricorso
       status: 'Post #%{id}'
       status_removed: Post già rimosso dal sistema
       title: "%{action} da %{date}"
@@ -1354,6 +1358,11 @@ it:
   reports:
     errors:
       invalid_rules: non fa riferimento a regole valide
+  rss:
+    content_warning: 'Avviso sul contenuto:'
+    descriptions:
+      account: Post pubblici di @%{acct}
+      tag: 'Post pubblici taggati #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Hai superato il limite di %{limit} post programmati per questo giorno
     over_total_limit: Hai superato il limite di %{limit} post programmati
@@ -1420,7 +1429,7 @@ it:
     profile: Profilo
     relationships: Follows e followers
     statuses_cleanup: Cancellazione automatica dei post
-    strikes: Avvisi di moderazione
+    strikes: Sanzioni di moderazione
     two_factor_authentication: Autenticazione a due fattori
     webauthn_authentication: Chiavi di sicurezza
   statuses:
@@ -1512,6 +1521,9 @@ it:
     pinned: Post fissato in cima
     reblogged: condiviso
     sensitive_content: Materiale sensibile
+  strikes:
+    errors:
+      too_late: È troppo tardi per fare appello contro questa sanzione
   tags:
     does_not_match_previous_name: non corrisponde al nome precedente
   terms:
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 13b1b149f..54dcbc9fa 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -492,6 +492,8 @@ ja:
       dashboard:
         instance_accounts_dimension: 最もフォローされているアカウント
         instance_accounts_measure: 保存されたアカウント
+        instance_followers_measure: そこでの我々のフォロワー
+        instance_follows_measure: そのインスタンスのこのインスタンスでのフォロワー
         instance_languages_dimension: 人気の言語
         instance_media_attachments_measure: 保存されたメディア
         instance_reports_measure: 通報
@@ -609,6 +611,7 @@ ja:
         placeholder: どのような措置が取られたか、または関連する更新を記述してください…
         title: メモ
       notes_description_html: 他のモデレーターと将来の自分にメモを残してください
+      quick_actions_description_html: 'クイックアクションを実行するかスクロールして報告された通報を確認してください:'
       remote_user_placeholder: "%{instance}からのリモートユーザー"
       reopen: 未解決に戻す
       report: '通報 #%{id}'
@@ -1003,10 +1006,12 @@ ja:
       appealed_msg: 申し立てが送信されました。承認されると通知されます。
       appeals:
         submit: 抗議を送信
+      approve_appeal: 抗議を承認
       associated_report: 関連する通報
       created_at: 日時
       description_html: これらは、%{instance}のスタッフがあなたのアカウントに対して行った措置や、あなたに送られた警告です。
       recipient: 送信元
+      reject_appeal: 抗議を却下
       status: '投稿 #%{id}'
       status_removed: 既に削除されています
       title: "%{date}に%{action}"
@@ -1317,6 +1322,11 @@ ja:
   reports:
     errors:
       invalid_rules: 有効なルールを参照していません
+  rss:
+    content_warning: '閲覧注意:'
+    descriptions:
+      account: "@%{acct}からの公開投稿"
+      tag: "#%{hashtag}が付けられた公開投稿"
   scheduled_statuses:
     over_daily_limit: その日予約できる投稿数 %{limit}を超えています
     over_total_limit: 予約できる投稿数 %{limit}を超えています
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 0c1576776..c16c4f324 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -17,13 +17,13 @@ ko:
     contact_missing: 미설정
     contact_unavailable: 없음
     continue_to_web: 웹앱에서 계속하기
-    discover_users: 유저 발견하기
+    discover_users: 사용자 발견하기
     documentation: 문서
     federation_hint_html: "%{instance}에 계정을 만드는 것으로 모든 마스토돈 서버, 그리고 호환 되는 모든 서버의 사용자를 팔로우 할 수 있습니다."
     get_apps: 모바일 앱 사용해 보기
     hosted_on: "%{domain}에서 호스팅 되는 마스토돈"
     instance_actor_flash: |
-      이 계정은 가상의 actor로서 개인 유저가 아닌 서버 자체를 나타냅니다.
+      이 계정은 가상의 actor로서 개인 사용자가 아닌 서버 자체를 나타냅니다.
       이것은 페더레이션을 목적으로 사용 되며 인스턴스 전체를 차단하려 하지 않는 이상 차단하지 않아야 합니다, 그 경우에는 도메인 차단을 사용하세요.
     learn_more: 자세히
     logged_in_as_html: 현재 %{username}으로 로그인 했습니다.
@@ -49,7 +49,7 @@ ko:
       silenced_title: 침묵 된 서버들
       suspended: 이 서버의 아무도 팔로우 할 수 없으며, 어떤 데이터도 처리되거나 저장 되지 않고 데이터가 교환 되지도 않습니다.
       suspended_title: 금지된 서버들
-    unavailable_content_html: 마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 유저와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다.
+    unavailable_content_html: 마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 사용자와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다.
     user_count_after:
       other: 명
     user_count_before: 사용자 수
@@ -330,7 +330,7 @@ ko:
       deleted_status: "(삭제된 게시물)"
       empty: 로그를 찾을 수 없습니다
       filter_by_action: 행동으로 거르기
-      filter_by_user: 유저로 거르기
+      filter_by_user: 사용자로 거르기
       title: 감사 기록
     announcements:
       destroyed_msg: 공지가 성공적으로 삭제되었습니다!
@@ -498,8 +498,8 @@ ko:
       dashboard:
         instance_accounts_dimension: 제일 많이 팔로우된 계정
         instance_accounts_measure: 보관된 계정
-        instance_followers_measure: 저쪽을 팔로우 하는 우리의 팔로워 수
-        instance_follows_measure: 우리를 팔로우 하는 저쪽의 팔로워 수
+        instance_followers_measure: 우리를 팔로우 하는 저쪽의 팔로워 수
+        instance_follows_measure: 저쪽을 팔로우 하는 우리의 팔로워 수
         instance_languages_dimension: 상위 언어
         instance_media_attachments_measure: 보관된 미디어 첨부파일
         instance_reports_measure: 이들에 대한 신고
@@ -561,7 +561,7 @@ ko:
     relays:
       add_new: 릴레이 추가
       delete: 삭제
-      description_html: "<strong>연합 릴레이</strong>는 서버들 사이에서 많은 양의 공개 게시물을 구독하고 중개하는 서버입니다. <strong>이것은 중소 규모의 서버에서 연합우주를 발견하는 데에 도움을 줄 수 있습니다</strong>, 이제 로컬 유저들이 다른 서버의 유저들을 수동으로 팔로우 하지 않아도 됩니다."
+      description_html: "<strong>연합 릴레이</strong>는 서버들 사이에서 많은 양의 공개 게시물을 구독하고 중개하는 서버입니다. <strong>이것은 중소 규모의 서버에서 연합우주를 발견하는 데에 도움을 줄 수 있습니다</strong>, 이제 로컬 사용자들이 다른 서버의 사용자들을 수동으로 팔로우 하지 않아도 됩니다."
       disable: 비활성화
       disabled: 비활성화 됨
       enable: 활성화
@@ -646,24 +646,24 @@ ko:
     settings:
       activity_api_enabled:
         desc_html: 주별 로컬에 게시 된 글, 활성 사용자 및 새로운 가입자 수
-        title: 유저 활동에 대한 통계 발행
+        title: 사용자 활동에 대한 통계 발행
       bootstrap_timeline_accounts:
-        desc_html: 콤마로 여러 유저명을 구분. 이 계정들은 팔로우 추천에 반드시 나타나게 됩니다
+        desc_html: 콤마로 여러 사용자명을 구분. 이 계정들은 팔로우 추천에 반드시 나타나게 됩니다
         title: 새로운 사용자들에게 추천할 계정들
       contact_information:
         email: 공개할 메일 주소를 입력
-        username: 연락 받을 관리자 유저네임
+        username: 연락 받을 관리자 사용자명
       custom_css:
         desc_html: 모든 페이지에 적용할 CSS
         title: 커스텀 CSS
       default_noindex:
-        desc_html: 이 설정을 바꾸지 않은 모든 유저들에게 적용 됩니다
-        title: 유저들이 기본적으로 검색엔진에 인덱싱 되지 않도록 합니다
+        desc_html: 이 설정을 바꾸지 않은 모든 사용자들에게 적용 됩니다
+        title: 사용자들이 기본적으로 검색엔진에 인덱싱 되지 않도록 합니다
       domain_blocks:
         all: 모두에게
         disabled: 아무에게도 안 함
         title: 도메인 차단 보여주기
-        users: 로그인 한 유저에게
+        users: 로그인 한 사용자에게
       domain_blocks_rationale:
         title: 사유 보여주기
       hero:
@@ -679,14 +679,14 @@ ko:
         desc_html: 민감한 미디어로 설정되었더라도 다른 웹사이트에서 링크 미리보기에 썸네일을 보여줍니다
         title: 민감한 미디어를 오픈그래프 미리보기에 보여주기
       profile_directory:
-        desc_html: 유저들이 발견 될 수 있도록 허용
+        desc_html: 사용자들이 발견 될 수 있도록 허용
         title: 프로필 책자 활성화
       registrations:
         closed_message:
           desc_html: 신규 등록을 받지 않을 때 프론트 페이지에 표시됩니다. HTML 태그를 사용할 수 있습니다
           title: 신규 등록 정지 시 메시지
         deletion:
-          desc_html: 유저가 자신의 계정을 삭제할 수 있도록 허용합니다
+          desc_html: 사용자가 자신의 계정을 삭제할 수 있도록 허용합니다
           title: 계정 삭제를 허가함
         min_invite_role:
           disabled: 아무도 못 하게
@@ -704,7 +704,7 @@ ko:
         desc_html: 활성화 되면 프리뷰 페이지에서 페디버스의 모든 게시물을 표시합니다. 비활성화시 로컬에 있는 게시물만 표시 됩니다.
         title: 타임라인 프리뷰에 알려진 페디버스 표시하기
       show_staff_badge:
-        desc_html: 유저 페이지에 스태프 배지를 표시합니다
+        desc_html: 사용자 페이지에 스태프 배지를 표시합니다
         title: 스태프 배지 표시
       site_description:
         desc_html: API의 소개문에 사용 됩니다.이 마스토돈 서버의 특별한 점 등을 설명하세요. HTML 태그, 주로 <code>&lt;a&gt;</code>, <code>&lt;em&gt;</code> 같은 것을 사용 가능합니다.
@@ -915,7 +915,7 @@ ko:
     description:
       prefix_invited_by_user: "@%{name} 님이 당신을 이 마스토돈 서버로 초대했습니다!"
       prefix_sign_up: 마스토돈에 가입하세요!
-      suffix: 계정 하나로 사람들을 팔로우 하고, 게시물을 작성하며 마스토돈을 포함한 다른 어떤 서버의 유저와도 메시지를 주고 받을 수 있습니다!
+      suffix: 계정 하나로 사람들을 팔로우 하고, 게시물을 작성하며 마스토돈을 포함한 다른 어떤 서버의 사용자와도 메시지를 주고 받을 수 있습니다!
     didnt_get_confirmation: 확인 메일을 받지 못하셨습니까?
     dont_have_your_security_key: 보안 키가 없습니까?
     forgot_password: 비밀번호를 잊어버리셨습니까?
@@ -960,7 +960,7 @@ ko:
     following: '성공! 당신은 다음 계정을 팔로우 하고 있습니다:'
     post_follow:
       close: 혹은, 당신은 이 윈도우를 닫을 수 있습니다.
-      return: 유저 프로필 보기
+      return: 사용자 프로필 보기
       web: 웹으로 가기
     title: "%{acct} 를 팔로우"
   challenge:
@@ -1009,7 +1009,7 @@ ko:
       username_unavailable: 당신의 계정명은 앞으로 사용할 수 없습니다
   directories:
     directory: 프로필 책자
-    explanation: 관심사에 대한 유저들을 발견합니다
+    explanation: 관심사에 대한 사용자들을 발견합니다
     explore_mastodon: "%{title} 탐사하기"
   disputes:
     strikes:
@@ -1021,10 +1021,12 @@ ko:
       appealed_msg: 당신의 이의제기가 접수되었습니다. 만약 승인된다면, 알림을 받게 될 것입니다.
       appeals:
         submit: 이의 제출
+      approve_appeal: 이의제기 승인
       associated_report: 관련된 신고
       created_at: 날짜
       description_html: 이 결정사항들은 당신에 계정에 대해 행해졌고 %{instance}의 스태프에 의해 경고가 발송되었습니다.
       recipient: 수신자
+      reject_appeal: 이의제기 거절
       status: '게시물 #%{id}'
       status_removed: 게시물이 이미 시스템에서 지워졌습니다
       title: "%{action} (%{date}에)"
@@ -1057,7 +1059,7 @@ ko:
     '503': 이 페이지는 임시적인 서버 문제로 인해 제공 될 수 없습니다.
     noscript_html: 마스토돈을 사용하기 위해서는 자바스크립트를 켜 주십시오. 아니면 <a href="%{apps_path}">네이티브 앱</a> 중 하나를 사용할 수 있습니다.
   existing_username_validator:
-    not_found: 해당 유저네임에 대한 로컬 유저를 찾을 수 없습니다
+    not_found: 해당 사용자명에 대한 로컬 유저를 찾을 수 없습니다
     not_found_multiple: "%{usernames}를 찾을 수 없습니다"
   exports:
     archive_takeout:
@@ -1313,7 +1315,7 @@ ko:
     relationship: 관계
     remove_selected_domains: 선택한 도메인의 모든 팔로워 삭제
     remove_selected_followers: 선택한 팔로워 삭제
-    remove_selected_follows: 선택한 유저들을 팔로우 해제
+    remove_selected_follows: 선택한 사용자들을 팔로우 해제
     status: 계정 상태
   remote_follow:
     acct: 당신이 사용하는 아이디@도메인을 입력해 주십시오
@@ -1335,6 +1337,11 @@ ko:
   reports:
     errors:
       invalid_rules: 올바른 규칙을 포함하지 않습니다
+  rss:
+    content_warning: '열람 주의:'
+    descriptions:
+      account: "@%{acct}의 공개 게시물"
+      tag: "#%{hashtag} 해시태그가 붙은 공개 게시물"
   scheduled_statuses:
     over_daily_limit: 그 날짜에 대한 %{limit}개의 예약 게시물 제한을 초과합니다
     over_total_limit: 예약 게시물 제한 %{limit}을 초과합니다
@@ -1487,6 +1494,9 @@ ko:
     pinned: 고정된 게시물
     reblogged: 님이 부스트 했습니다
     sensitive_content: 민감한 컨텐츠
+  strikes:
+    errors:
+      too_late: 이의를 제기하기에 너무 늦었습니다
   tags:
     does_not_match_previous_name: 이전 이름과 맞지 않습니다
   terms:
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 192cd0b8f..3b4ab87c2 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -804,6 +804,7 @@ ku:
           other: Di nava hefteya dawî de ji aliyê %{count} ve hate parvekirin
         title: Girêdanên di rojevê de
         usage_comparison: Îro %{today} car hate parvekirin, li gorî %{yesterday} duh
+      only_allowed: Tenê yên mafdayî
       pending_review: Li benda nirxandinê ye
       preview_card_providers:
         allowed: Girêdanên ji vê weşangerê dikarin bibin rojev
@@ -845,6 +846,7 @@ ku:
           one: Di nava hefteya dawî de ji aliyê kesekî ve hatiye bikaranîn
           other: Di nava hefteya dawî de ji %{count} kes ve hatiye bikaranîn
       title: Rojev
+      trending: Rojev
     warning_presets:
       add_new: Yeka nû tevlî bike
       delete: Jê bibe
@@ -1036,10 +1038,12 @@ ku:
       appealed_msg: Îtîraza te hatiye şandin. Ku were pejirandin, tu yê werî agahdarkirin.
       appeals:
         submit: Îtîrazê bişîne
+      approve_appeal: Îtîrazê bipejirîne
       associated_report: Ragihandina têkildar
       created_at: Dîrok
       description_html: Ev kiryarên ku li dijî ajimêrê te hatine kirin û hişyariyên ku ji hêla xebatkarên %{instance} ve ji te re hatine şandinin.
       recipient: Ji kê re
+      reject_appeal: Îtîrazê nepejirîne
       status: 'Şandî #%{id}'
       status_removed: Şandî jixwe ji pergalê hatî rakirin
       title: "%{action} ji %{date}"
@@ -1354,6 +1358,11 @@ ku:
   reports:
     errors:
       invalid_rules: rêbazên derbasdar nîşan nadê
+  rss:
+    content_warning: 'Hişyariya naverokê:'
+    descriptions:
+      account: Şandiyên gelemperî ji @%{acct}
+      tag: 'Şandiyên gelemperî yên nîşankirî #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Te sînorê %{limit} şandiyên demsazkirî yên ji bo îro derbas kir
     over_total_limit: Te sînorê %{limit} şandiyên demsazkirî derbas kir
@@ -1512,6 +1521,9 @@ ku:
     pinned: Şandiya derzîkirî
     reblogged: bilindkirî
     sensitive_content: Naveroka hestiyarî
+  strikes:
+    errors:
+      too_late: Pir dereng e ji bo îtîrazê li ser vê binpêkirinê
   tags:
     does_not_match_previous_name: bi navê berê re li hev nayê
   terms:
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index c97a183f9..e62264acd 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -817,6 +817,7 @@ lv:
           zero: Pēdējās nedēļas laikā kopīgoja %{count} personas
         title: Populārākās saites
         usage_comparison: Šodien kopīgots %{today} reizes, salīdzinot ar %{yesterday} vakar
+      only_allowed: Tikai atļautās
       pending_review: Gaida pārskatīšanu
       preview_card_providers:
         allowed: Šī publicētāja saites var mainīties
@@ -860,6 +861,7 @@ lv:
           other: Pēdējās nedēļas laikā izmantoja %{count} personas
           zero: Pēdējās nedēļas laikā izmantoja %{count} personas
       title: Tendences
+      trending: Tendences
     warning_presets:
       add_new: Pievienot jaunu
       delete: Dzēst
@@ -1051,10 +1053,12 @@ lv:
       appealed_msg: Jūsu apelācija ir iesniegta. Ja tā tiks apstiprināta, jums tiks paziņots.
       appeals:
         submit: Iesniegt apelāciju
+      approve_appeal: Apstiprināt apelāciju
       associated_report: Saistītais ziņojums
       created_at: Datēts
       description_html: Šīs ir darbības, kas veiktas pret tavu kontu, un brīdinājumi, ko tev ir nosūtījuši %{instance} darbinieki.
       recipient: Adresēts
+      reject_appeal: Noraidīt apelāciju
       status: 'Publikācija #%{id}'
       status_removed: Publikācija jau ir noņemta no sistēmas
       title: "%{action} kopš %{date}"
@@ -1373,6 +1377,11 @@ lv:
   reports:
     errors:
       invalid_rules: neatsaucas uz derīgiem noteikumiem
+  rss:
+    content_warning: 'Satura brīdinājums:'
+    descriptions:
+      account: Publiskas ziņas no @%{acct}
+      tag: 'Publiskas ziņas ar atzīmi #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Tu esi pārsniedzis šodien ieplānoto %{limit} ziņu ierobežojumu
     over_total_limit: Tu esi pārsniedzis ieplānoto %{limit} ziņu ierobežojumu
@@ -1537,6 +1546,9 @@ lv:
     pinned: Piespraustā ziņa
     reblogged: paaugstinātās
     sensitive_content: Sensitīvs saturs
+  strikes:
+    errors:
+      too_late: Brīdinājuma apstrīdēšanas laiks ir nokavēts
   tags:
     does_not_match_previous_name: nesakrīt ar iepriekšējo nosaukumu
   terms:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 7a322a730..76b3535fe 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -173,6 +173,11 @@ pl:
       pending: Oczekuje na przegląd
       perform_full_suspension: Zawieś
       previous_strikes: Poprzednie ostrzeżenia
+      previous_strikes_description_html:
+        few: To konto ma <strong>%{count}</strong> ostrzeżenia.
+        many: To konto ma <strong>%{count}</strong> ostrzeżeń.
+        one: To konto ma <strong>jedno</strong> ostrzeżenie.
+        other: To konto ma <strong>%{count}</strong> ostrzeżeń.
       promote: Podnieś uprawnienia
       protocol: Protokół
       public: Publiczne
@@ -465,6 +470,11 @@ pl:
       view: Zobacz blokadę domeny
     email_domain_blocks:
       add_new: Dodaj nową
+      attempts_over_week:
+        few: "%{count} próby w ciągu ostatniego tygodnia"
+        many: "%{count} prób w ciągu ostatniego tygodnia"
+        one: "%{count} próba w ciągu ostatniego tygodnia"
+        other: "%{count} prób w ciągu ostatniego tygodnia"
       created_msg: Pomyślnie utworzono blokadę domeny e-mail
       delete: Usuń
       dns:
@@ -490,6 +500,11 @@ pl:
     instances:
       availability:
         failure_threshold_reached: Próg niepowodzenia osiągnięty dnia %{date}.
+        failures_recorded:
+          few: Nieudane próby w %{count} różnych dniach.
+          many: Nieudane próby w %{count} różnych dniach.
+          one: Nieudane próby %{count} dnia.
+          other: Nieudane próby w %{count} różnych dniach.
         no_failures_recorded: Brak błędów w rejestrze.
         title: Dostępność
         warning: Ostatnia próba połączenia z tym serwerem zakończyła się niepowodzeniem
@@ -521,6 +536,7 @@ pl:
       delivery:
         all: Wszystkie
         clear: Wyczyść błędy w doręczaniu
+        failing: Niepowodzenie
         restart: Uruchom ponownie doręczenie
         stop: Zatrzymaj doręczanie
         unavailable: Niedostępne
@@ -529,6 +545,11 @@ pl:
       delivery_error_hint: Jeżeli doręczanie nie będzie możliwe przez %{count} dni, zostanie automatycznie oznaczona jako nie do doręczania.
       destroyed_msg: Dane z %{domain} są teraz w kolejce do bezpośredniego usunięcia.
       empty: Nie znaleziono domen.
+      known_accounts:
+        few: "%{count} znane konta"
+        many: "%{count} znanych kont"
+        one: "%{count} znane konto"
+        other: "%{count} znane konta"
       moderation:
         all: Wszystkie
         limited: Ograniczone
@@ -1034,10 +1055,12 @@ pl:
       appealed_msg: Twoje odwołanie zostało złożone. Jeśli zostanie zatwierdzone, zostaniesz powiadomiony.
       appeals:
         submit: Zgłoś odwołanie
+      approve_appeal: Zatwierdź odwołanie
       associated_report: Powiązany raport
       created_at: Data
       description_html: Są to działania podjęte przeciwko Twojemu kontu i ostrzeżenia wysłane do ciebie przez administrację %{instance}.
       recipient: Adresowane do
+      reject_appeal: Odrzuć odwołanie
       status: 'Post #%{id}'
       status_removed: Post został już usunięty z systemu
       title: "%{action} z %{date}"
@@ -1360,6 +1383,11 @@ pl:
   reports:
     errors:
       invalid_rules: nie odwołuje się do prawidłowych reguł
+  rss:
+    content_warning: 'Ostrzeżenie o zawartości:'
+    descriptions:
+      account: Publiczne posty od @%{acct}
+      tag: 'Publiczne wpisy oznaczone #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Przekroczyłeś(-aś) limit %{limit} zaplanowanych wpisów na ten dzień
     over_total_limit: Przekroczyłeś(-aś) limit %{limit} zaplanowanych wpisów
@@ -1530,6 +1558,9 @@ pl:
     pinned: Przypięty wpis
     reblogged: podbił
     sensitive_content: Wrażliwa zawartość
+  strikes:
+    errors:
+      too_late: Jest za późno na odwołanie się od tego ostrzeżenia
   tags:
     does_not_match_previous_name: nie pasuje do poprzedniej nazwy
   terms:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 1a83cc022..e647b4c01 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -16,6 +16,7 @@ pt-BR:
     contact: Contato
     contact_missing: Não definido
     contact_unavailable: Não disponível
+    continue_to_web: Continuar no aplicativo web
     discover_users: Descubra usuários
     documentation: Documentação
     federation_hint_html: Com uma conta em %{instance} você vai poder seguir e interagir com pessoas de qualquer canto do fediverso.
@@ -163,6 +164,10 @@ pt-BR:
       not_subscribed: Não inscrito
       pending: Revisão pendente
       perform_full_suspension: Banir
+      previous_strikes: Ataques anteriores
+      previous_strikes_description_html:
+        one: Esta conta tem <strong>um</strong> ataque.
+        other: Esta conta tem <strong>%{count}</strong> ataques.
       promote: Promover
       protocol: Protocolo
       public: Público
@@ -203,6 +208,7 @@ pt-BR:
       silence: Silenciar
       silenced: Silenciado
       statuses: Toots
+      strikes: Ataques anteriores
       subscribe: Inscrever-se
       suspend: Suspender
       suspended: Banido
@@ -225,6 +231,7 @@ pt-BR:
       whitelisted: Permitido
     action_logs:
       action_types:
+        approve_appeal: Aprovar recurso
         approve_user: Aprovar Usuário
         assigned_to_self_report: Adicionar relatório
         change_email_user: Editar e-mail do usuário
@@ -243,6 +250,7 @@ pt-BR:
         destroy_domain_allow: Excluir domínio permitido
         destroy_domain_block: Excluir Bloqueio de Domínio
         destroy_email_domain_block: Excluir bloqueio de domínio de e-mail
+        destroy_instance: Limpar Domínio
         destroy_ip_block: Excluir regra de IP
         destroy_status: Excluir Status
         destroy_unavailable_domain: Deletar domínio indisponível
@@ -275,6 +283,7 @@ pt-BR:
         update_status: Editar Status
       actions:
         approve_appeal_html: "%{name} aprovou o recurso de decisão de moderação de %{target}"
+        approve_user_html: "%{name} aprovado inscrição de %{target}"
         assigned_to_self_report_html: "%{name} atribuiu o relatório %{target} para si"
         change_email_user_html: "%{name} alterou o endereço de e-mail do usuário %{target}"
         confirm_user_html: "%{name} confirmou o endereço de e-mail do usuário %{target}"
@@ -292,6 +301,7 @@ pt-BR:
         destroy_domain_allow_html: "%{name} bloqueou federação com domínio %{target}"
         destroy_domain_block_html: "%{name} deixou de bloquear domínio %{target}"
         destroy_email_domain_block_html: "%{name} adicionou domínio de e-mail %{target} à lista branca"
+        destroy_instance_html: "%{name} purgou o domínio %{target}"
         destroy_ip_block_html: "%{name} excluiu regra para o IP %{target}"
         destroy_status_html: "%{name} excluiu post de %{target}"
         destroy_unavailable_domain_html: "%{name} retomou a entrega ao domínio %{target}"
@@ -304,6 +314,7 @@ pt-BR:
         enable_user_html: "%{name} ativou o login para %{target}"
         memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial"
         promote_user_html: "%{name} promoveu o usuário %{target}"
+        reject_appeal_html: "%{name} rejeitou recurso de decisão de moderação de %{target}"
         reject_user_html: "%{name} rejeitou a inscrição de %{target}"
         remove_avatar_user_html: "%{name} removeu a imagem de perfil de %{target}"
         reopen_report_html: "%{name} reabriu a denúncia %{target}"
@@ -360,6 +371,7 @@ pt-BR:
       enable: Ativar
       enabled: Ativado
       enabled_msg: Emoji ativado com sucesso
+      image_hint: PNG ou GIF até %{size}
       list: Listar
       listed: Listado
       new:
@@ -381,6 +393,18 @@ pt-BR:
       media_storage: Armazenamento de mídia
       new_users: novos usuários
       opened_reports: denúncias abertas
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> recurso pendente"
+        other: "<strong>%{count}</strong> recursos pendentes"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> relatório pendente"
+        other: "<strong>%{count}</strong> relatórios pendentes"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> hashtag pendente"
+        other: "<strong>%{count}</strong> hashtags pendentes"
+      pending_users_html:
+        one: "<strong>%{count}</strong> usuário pendente"
+        other: "<strong>%{count}</strong> usuários pendentes"
       resolved_reports: denúncias solucionadas
       software: Software
       sources: Origem das inscrições
@@ -391,6 +415,7 @@ pt-BR:
       website: Site
     disputes:
       appeals:
+        empty: Nenhum recurso encontrado.
         title: Apelações
     domain_allows:
       add_new: Permitir domínio
@@ -427,13 +452,22 @@ pt-BR:
       view: Ver domínios bloqueados
     email_domain_blocks:
       add_new: Adicionar novo
+      attempts_over_week:
+        one: "%{count} tentativa na última semana"
+        other: "%{count} tentativas de inscrição na última semana"
       created_msg: Domínio de e-mail adicionado à lista negra com sucesso
       delete: Excluir
+      dns:
+        types:
+          mx: Registro MX
       domain: Domínio
       new:
         create: Adicionar domínio
         resolve: Resolver domínio
         title: Nova entrada de lista negra de e-mail
+      no_email_domain_block_selected: Nenhum bloco de domínio de e-mail foi alterado, pois nenhum foi selecionado
+      resolved_dns_records_hint_html: O nome de domínio resolve os seguintes domínios MX, que são responsáveis finais por aceitar o e-mail. Bloquear um domínio MX bloqueará inscrições de qualquer endereço de e-mail que use o mesmo domínio MX, mesmo que o nome de domínio visível seja diferente. <strong>Cuidado para não bloquear os principais provedores de e-mail.</strong>
+      resolved_through_html: Resolvido através de %{domain}
       title: Lista de negra de e-mail
     follow_recommendations:
       description_html: "<strong>A recomendação de contas ajuda os novos usuários a encontrar rapidamente conteúdo interessante</strong>. Quando um usuário ainda não tiver interagido o suficiente para gerar recomendações de contas, essas contas serão recomendadas. Essas recomendações são recalculadas diariamente a partir de uma lista de contas com alto engajamento e maior número de seguidores locais em uma dada língua."
@@ -445,21 +479,56 @@ pt-BR:
       unsuppress: Restaurar recomendação de contas
     instances:
       availability:
+        description_html:
+          one: Se a entrega ao domínio falhar <strong>%{count} dia</strong> sem sucesso, nenhuma tentativa de entrega será feita a menos que uma entrega <em>de</em> do domínio seja recebida.
+          other: Se a entrega ao domínio falhar em <strong>%{count} dias diferentes</strong> sem sucesso, nenhuma tentativa de entrega será feita a menos que uma entrega <em>de</em> do domínio seja recebida.
+        failure_threshold_reached: Limite de falhas atingido em %{date}.
+        failures_recorded:
+          one: Falha na tentativa em %{count} dia.
+          other: Tentativas falhas em %{count} dias diferentes.
+        no_failures_recorded: Sem falhas no registro.
         title: Disponibilidade
+        warning: A última tentativa de se conectar a este servidor não foi bem sucedida
       back_to_all: Todas
+      back_to_limited: Limitado
       back_to_warning: Aviso
       by_domain: Domínio
       confirm_purge: Você tem certeza de que deseja excluir permanentemente os dados deste domínio?
       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.
+        policies:
+          reject_media: Rejeitar mídia
+          reject_reports: Rejeitar relatórios
+          silence: Limite
+          suspend: Suspender
         policy: Políticas
+        reason: Razão pública
+        title: Políticas de conteúdo
+      dashboard:
+        instance_accounts_dimension: Contas mais seguidas
+        instance_accounts_measure: contas armazenadas
+        instance_followers_measure: nossos seguidores lá
+        instance_follows_measure: seus seguidores aqui
+        instance_languages_dimension: Idiomas principais
+        instance_media_attachments_measure: anexos de mídia armazenados
+        instance_reports_measure: relatórios sobre eles
+        instance_statuses_measure: publicações armazenadas
       delivery:
         all: Todos
         clear: Limpar erros de entrega
+        failing: Falhando
         restart: Reiniciar a entrega
         stop: Parar entrega
         unavailable: Indisponível
       delivery_available: Envio disponível
+      delivery_error_days: Dias de erro de entrega
+      delivery_error_hint: Se a entrega não for possível durante %{count} dias, será automaticamente marcada como não realizável.
+      destroyed_msg: Dados de %{domain} agora estão na fila para exclusão iminente.
       empty: Nenhum domínio encontrado.
+      known_accounts:
+        one: "%{count} conta conhecida"
+        other: "%{count} contas conhecidas"
       moderation:
         all: Todos
         limited: Limitados
@@ -467,12 +536,14 @@ pt-BR:
       private_comment: Comentário privado
       public_comment: Comentário público
       purge: Limpar
+      purge_description_html: Se você acredita que este domínio está offline definitivamente, você pode excluir todos os registros de conta e dados associados deste domínio do seu armazenamento. Isso pode demorar um pouco.
       title: Federação
       total_blocked_by_us: Bloqueado por nós
       total_followed_by_them: Seguidos por eles
       total_followed_by_us: Seguidos por nós
       total_reported: Denúncias sobre eles
       total_storage: Mídias anexadas
+      totals_time_period_hint_html: Os totais exibidos abaixo incluem dados para todo o tempo.
     invites:
       deactivate_all: Desativar todos
       filter:
@@ -517,6 +588,7 @@ pt-BR:
     report_notes:
       created_msg: Nota de denúncia criada com sucesso!
       destroyed_msg: Nota de denúncia excluída com sucesso!
+      today_at: Hoje às %{time}
     reports:
       account:
         notes:
@@ -742,6 +814,14 @@ pt-BR:
       body: "%{reporter} denunciou %{target}"
       body_remote: Alguém da instância %{domain} reportou %{target}
       subject: Nova denúncia sobre %{instance} (#%{id})
+    new_trends:
+      new_trending_statuses:
+        title: Publicações em alta
+      new_trending_tags:
+        no_approved_tags: No momento, não há hashtags de tendências aprovadas.
+        requirements: 'Qualquer um desses candidatos poderia ultrapassar a hashtag de tendência aprovada #%{rank} , que é atualmente #%{lowest_tag_name} com uma pontuação de %{lowest_tag_score}.'
+        title: Hashtags em alta
+      subject: Novas tendências para revisão em %{instance}
   aliases:
     add_new: Criar alias
     created_msg: Um novo alias foi criado com sucesso. Agora você pode iniciar a mudança da conta antiga.
@@ -793,6 +873,7 @@ pt-BR:
     invalid_reset_password_token: Código de alteração de senha é inválido ou expirou. Por favor, solicite um novo.
     link_to_otp: Digite um código de duas etapas do seu telefone ou um código de recuperação
     link_to_webauth: Use seu dispositivo de chave de segurança
+    log_in_with: Iniciar sessão com
     login: Entrar
     logout: Sair
     migrate_account: Mudar-se para outra conta
@@ -814,8 +895,10 @@ pt-BR:
     status:
       account_status: Status da conta
       confirming: Confirmação por e-mail pendente.
+      functional: Sua conta está totalmente operacional.
       pending: Sua solicitação está com revisão pendente por parte de nossa equipe. Você receberá um e-mail se ela for aprovada.
       redirecting_to: Sua conta está inativa porque atualmente está redirecionando para %{acct}.
+      view_strikes: Veja os ataques anteriores contra a sua conta
     too_fast: O formulário foi enviado muito rapidamente, tente novamente.
     trouble_logging_in: Problemas para entrar?
     use_security_key: Usar chave de segurança
@@ -851,8 +934,10 @@ pt-BR:
       about_x_years: "%{count}a"
       almost_x_years: "%{count}a"
       half_a_minute: Agora
+      less_than_x_minutes: "%{count}min"
       less_than_x_seconds: Agora
       over_x_years: "%{count}a"
+      x_days: "%{count}dias"
       x_minutes: "%{count}min"
       x_months: "%{count}m"
       x_seconds: "%{count}seg"
@@ -879,11 +964,32 @@ pt-BR:
     explore_mastodon: Explore o %{title}
   disputes:
     strikes:
+      action_taken: Ações tomadas
+      appeal: Recurso
+      appeal_approved: Este recurso foi contestado e não é mais válido
+      appeal_rejected: O recurso foi rejeitado
+      appeal_submitted_at: Recurso enviado
+      appealed_msg: Seu recurso foi enviado. Se ele for aprovado, você será notificado.
+      appeals:
+        submit: Enviar recurso
+      associated_report: Relatório associado
+      created_at: Datado
+      description_html: Estas são ações tomadas contra sua conta e avisos que foram enviados a você pela equipe de %{instance}.
+      recipient: Endereçado para
+      status: 'Postagem #%{id}'
+      status_removed: Postagem já removida do sistema
+      title: "%{action} de %{date}"
       title_actions:
+        delete_statuses: Remoção de publicações
+        disable: Congelamento de conta
+        mark_statuses_as_sensitive: Marcar as postagens como sensíveis
         none: Aviso
         sensitive: Marcar a conta como sensível
         silence: Limitação da conta
         suspend: Suspensão de conta
+      your_appeal_approved: Seu recurso foi aprovado
+      your_appeal_pending: Você submeteu um recurso
+      your_appeal_rejected: Seu recurso foi rejeitado
   domain_validator:
     invalid_domain: não é um nome de domínio válido
   errors:
@@ -1008,6 +1114,7 @@ pt-BR:
     authentication_methods:
       otp: autenticação de dois fatores
       password: senha
+      sign_in_token: código de segurança do e-mail
       webauthn: chaves de segurança
     description_html: Se você vir atividades suspeitas ou não reconhecidas, considere alterar sua senha e ativar a autenticação de dois fatores.
     empty: Sem histórico de autenticação disponível
@@ -1057,6 +1164,9 @@ pt-BR:
     carry_mutes_over_text: Este usuário mudou de %{acct}, que você havia silenciado.
     copy_account_note_text: 'Este usuário saiu de %{acct}, aqui estão suas notas anteriores sobre ele:'
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} se inscreveu"
     digest:
       action: Ver todas as notificações
       body: Aqui está um breve resumo das mensagens que você perdeu desde o seu último acesso em %{since}
@@ -1064,6 +1174,9 @@ pt-BR:
       new_followers_summary:
         one: Você tem um novo seguidor! Uia!
         other: Você tem %{count} novos seguidores! AÊÊÊ!
+      subject:
+        one: "Uma nova notificação desde o seu último acesso 🐘"
+        other: "%{count} novas notificações desde o seu último acesso 🐘"
       title: Enquanto você estava ausente...
     favourite:
       body: "%{name} favoritou seu toot:"
@@ -1091,6 +1204,8 @@ pt-BR:
       title: Novo boost
     status:
       subject: "%{name} acabou de postar"
+    update:
+      subject: "%{name} editou uma publicação"
   notifications:
     email_events: Eventos para notificações por e-mail
     email_events_hint: 'Selecione os eventos que deseja receber notificações:'
@@ -1172,6 +1287,9 @@ pt-BR:
     reply:
       proceed: Continue para responder
       prompt: 'Você responderá este toot:'
+  reports:
+    errors:
+      invalid_rules: não faz referência a regras válidas
   scheduled_statuses:
     over_daily_limit: Você excedeu o limite de %{limit} toots agendados para esse dia
     over_total_limit: Você excedeu o limite de %{limit} toots agendados
@@ -1238,6 +1356,7 @@ pt-BR:
     profile: Perfil
     relationships: Seguindo e seguidores
     statuses_cleanup: Exclusão automatizada de publicações
+    strikes: Moderação de ataques
     two_factor_authentication: Autenticação de dois fatores
     webauthn_authentication: Chaves de segurança
   statuses:
@@ -1254,9 +1373,11 @@ pt-BR:
         other: "%{count} vídeos"
     boosted_from_html: Boost de %{acct_link}
     content_warning: 'Aviso de Conteúdo: %{warning}'
+    default_language: Igual ao idioma da interface
     disallowed_hashtags:
       one: 'continha hashtag não permitida: %{tags}'
       other: 'continha hashtags não permitidas: %{tags}'
+    edited_at_html: Editado em %{date}
     errors:
       in_reply_not_found: O toot que você quer responder parece não existir.
     open_in_web: Abrir no navegador
@@ -1420,6 +1541,7 @@ pt-BR:
     formats:
       default: "%H:%M em %d de %b de %Y"
       month: "%b de %Y"
+      time: "%H:%M"
   two_factor_authentication:
     add: Adicionar
     disable: Desativar
@@ -1438,15 +1560,27 @@ pt-BR:
   user_mailer:
     appeal_approved:
       action: Acessar perfil
+      explanation: O recurso do ataque contra sua conta em %{strike_date} que você submeteu em %{appeal_date} foi aprovado. Sua conta está novamente em situação regular.
+      subject: Seu recurso de %{date} foi aprovado
       title: Contestação aprovada
     appeal_rejected:
+      explanation: O recurso do ataque contra sua conta em %{strike_date} que você submeteu em %{appeal_date} foi rejeitado.
+      subject: Seu recurso de %{date} foi rejeitado
       title: Contestação rejeitada
     backup_ready:
       explanation: Você pediu um backup completo da sua conta no Mastodon. E agora está pronto para ser baixado!
       subject: Seu arquivo está pronto para ser baixado
       title: Baixar arquivo
+    suspicious_sign_in:
+      change_password: Altere sua senha
+      details: 'Aqui estão os detalhes do acesso:'
+      explanation: Detectamos um login em sua conta a partir de um novo endereço IP.
+      further_actions_html: Se não foi você, recomendamos que você %{action} imediatamente e ative a autenticação de dois fatores para manter sua conta segura.
+      subject: Sua conta foi acessada a partir de um novo endereço IP
+      title: Um novo login
     warning:
       appeal: Enviar uma contestação
+      appeal_description: Se você acredita que isso é um erro, você pode enviar um apelo para a equipe de %{instance}.
       categories:
         spam: Spam
         violation: O conteúdo viola as seguintes diretrizes da comunidade
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index f196d525f..49cee32d0 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -802,6 +802,7 @@ pt-PT:
           other: Partilhado por %{count} pessoas na última semana
         title: Links em destaque
         usage_comparison: Partilhado %{today} vezes hoje, em comparação com %{yesterday} ontem
+      only_allowed: Apenas permitidos
       pending_review: Pendente de revisão
       preview_card_providers:
         allowed: Links deste editor poderão ser incluídos nos destaques
@@ -843,6 +844,7 @@ pt-PT:
           one: Utilizada por uma pessoa na última semana
           other: Utilizada por %{count} pessoas na última semana
       title: Tendências
+      trending: Em destaque
     warning_presets:
       add_new: Adicionar novo
       delete: Eliminar
@@ -1034,10 +1036,12 @@ pt-PT:
       appealed_msg: O seu recurso foi submetido. Se ele for aprovado, será notificado.
       appeals:
         submit: Submeter recurso
+      approve_appeal: Aprovar recurso
       associated_report: Denúncia associada
       created_at: Data
       description_html: Estas são ações tomadas contra a sua conta e avisos que lhe foram enviados pela equipa de %{instance}.
       recipient: Endereçado a
+      reject_appeal: Rejeitar recurso
       status: 'Publicação #%{id}'
       status_removed: Publicação já eliminada do sistema
       title: "%{action} de %{date}"
@@ -1352,6 +1356,11 @@ pt-PT:
   reports:
     errors:
       invalid_rules: não faz referência a regras válidas
+  rss:
+    content_warning: 'Aviso de conteúdo:'
+    descriptions:
+      account: Publicações públicas de @%{acct}
+      tag: 'Publicações públicas marcadas com #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Excedeste o limite de %{limit} publicações agendadas para esse dia
     over_total_limit: Tu excedeste o limite de %{limit} publicações agendadas
@@ -1510,6 +1519,9 @@ pt-PT:
     pinned: Toot fixado
     reblogged: partilhado
     sensitive_content: Conteúdo sensível
+  strikes:
+    errors:
+      too_late: É tarde demais para apelar desta punição
   tags:
     does_not_match_previous_name: não coincide com o nome anterior
   terms:
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 2187ae409..b3038846e 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -244,7 +244,7 @@ ru:
         approve_appeal: Одобрить обжалование
         approve_user: Утвердить
         assigned_to_self_report: Присвоение жалоб
-        change_email_user: Изменение e-mail пользователей
+        change_email_user: Изменение эл. почты пользователя
         confirm_user: Подтверждение пользователей
         create_account_warning: Выдача предупреждения
         create_announcement: Создание объявлений
@@ -260,6 +260,7 @@ ru:
         destroy_domain_allow: Отзыв разрешений для доменов
         destroy_domain_block: Разблокировка доменов
         destroy_email_domain_block: Разблокировка e-mail доменов
+        destroy_instance: Очистить домен
         destroy_ip_block: Удаление правил для IP-адресов
         destroy_status: Удаление постов
         destroy_unavailable_domain: Исключение доменов из списка недоступных
@@ -291,6 +292,7 @@ ru:
         update_domain_block: Изменение блокировки домена
         update_status: Изменение постов
       actions:
+        approve_appeal_html: "%{name} одобрил апелляцию на умеренное решение от %{target}"
         approve_user_html: "%{name} утвердил(а) регистрацию %{target}"
         assigned_to_self_report_html: "%{name} назначил(а) себя для решения жалобы %{target}"
         change_email_user_html: "%{name} сменил(а) e-mail пользователя %{target}"
@@ -322,6 +324,7 @@ ru:
         enable_user_html: "%{name} разморозил(а) пользователя %{target}"
         memorialize_account_html: "%{name} перевел(а) учётную запись пользователя %{target} в статус памятника"
         promote_user_html: "%{name} повысил(а) пользователя %{target}"
+        reject_appeal_html: "%{name} отклонил апелляцию на модерацию от %{target}"
         reject_user_html: "%{name} отклонил(а) регистрацию %{target}"
         remove_avatar_user_html: "%{name} убрал(а) аватарку пользователя %{target}"
         reopen_report_html: "%{name} повторно открыл(а) жалобу %{target}"
@@ -465,7 +468,9 @@ ru:
       domain: Домен
       new:
         create: Создать блокировку
+        resolve: Отрезолвенные домены
         title: Новая блокировка по домену
+      no_email_domain_block_selected: Блоки домена электронной почты не были изменены, так как не были выбраны
       resolved_through_html: Разрешено через %{domain}
       title: Блокировка e-mail доменов
     follow_recommendations:
@@ -487,6 +492,9 @@ ru:
       by_domain: Домен
       confirm_purge: Вы уверены, что хотите навсегда удалить данные с этого домена?
       content_policies:
+        comment: Внутренняя заметка
+        policies:
+          reject_media: Отклонить медиа
         policy: Политика
       dashboard:
         instance_accounts_measure: сохраненные учетные записи
@@ -820,6 +828,10 @@ ru:
       title: Управление шаблонами предупреждений
   admin_mailer:
     new_appeal:
+      actions:
+        none: предупреждение
+        silence: ограничить учётную запись
+        suspend: приостановить действие учётной записи
       subject: "%{username} обжалует решение модерации на %{instance}"
     new_pending_account:
       body: Ниже указана информация учётной записи. Вы можете одобрить или отклонить заявку.
@@ -912,6 +924,7 @@ ru:
       functional: Ваша учётная запись в полном порядке.
       pending: Ваша заявка ожидает одобрения администраторами, это может занять немного времени. Вы получите письмо, как только заявку одобрят.
       redirecting_to: Ваша учётная запись деактивированна, потому что вы настроили перенаправление на %{acct}.
+      view_strikes: Просмотр предыдущих замечаний в адрес вашей учетной записи
     too_fast: Форма отправлена слишком быстро, попробуйте еще раз.
     trouble_logging_in: Не удаётся войти?
     use_security_key: Использовать ключ безопасности
@@ -978,15 +991,18 @@ ru:
   disputes:
     strikes:
       action_taken: Предпринятые меры
+      appeal: Обжаловать
       appeal_approved: Это замечание было успешно обжаловано и более не действительно
       appeal_rejected: Апелляция была отклонена
       appeal_submitted_at: Апелляция отправлена
       appealed_msg: Ваша апелляция была отправлена. Если она будет одобрена, вы будете уведомлены.
       appeals:
         submit: Подать обжалование
+      approve_appeal: Одобрить обжалование
       associated_report: Связанные обращения
       created_at: Дата
       recipient: Адресовано
+      reject_appeal: Отклонить обжалование
       status: 'Пост #%{id}'
       status_removed: Пост уже удален из системы
       title: "%{action} от %{date}"
@@ -1037,7 +1053,7 @@ ru:
     add_new: Добавить
     errors:
       limit: Вы уже добавили максимальное число хэштегов
-    hint_html: "<strong>Особенные хэштеги</strong> отображаются в вашем профиле и позволяют людям просматривать ваши посты, отмеченные ими. Это отличный инструмент для отслеживания долгосрочных проектов и творческих работ."
+    hint_html: "<strong>Избранные хэштеги</strong> отображаются в вашем профиле и позволяют людям быстро найти посты, отмеченные ими. Это отличный инструмент для отслеживания долгосрочных проектов и творческих работ."
   filters:
     contexts:
       account: Посты в профилях
@@ -1306,6 +1322,11 @@ ru:
   reports:
     errors:
       invalid_rules: не ссылается на действительные правила
+  rss:
+    content_warning: 'Предупреждение о содержании:'
+    descriptions:
+      account: Публичные посты @%{acct}
+      tag: 'Публичные посты отмеченные хэштегом #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Вы превысили лимит в %{limit} запланированных постов на указанный день
     over_total_limit: Вы превысили лимит на %{limit} запланированных постов
@@ -1363,7 +1384,7 @@ ru:
     development: Разработчикам
     edit_profile: Изменить профиль
     export: Экспорт данных
-    featured_tags: Особенные хэштеги
+    featured_tags: Избранные хэштеги
     import: Импорт
     import_and_export: Импорт и экспорт
     migrate: Миграция учётной записи
@@ -1372,6 +1393,7 @@ ru:
     profile: Профиль
     relationships: Подписки и подписчики
     statuses_cleanup: Авто-удаление постов
+    strikes: Замечания модерации
     two_factor_authentication: Подтверждение входа
     webauthn_authentication: Ключи безопасности
   statuses:
@@ -1438,9 +1460,9 @@ ru:
       unlisted_long: Показывать всем, но не отображать в публичных лентах
   statuses_cleanup:
     enabled: Автоматически удалять устаревшие посты
-    enabled_hint: Автоматически удаляет ваши посты после того, как они достигли определённого возраста, за некоторыми исключениями ниже.
+    enabled_hint: Автоматически удаляет ваши посты после того, как они достигли определённого возрастного порога, за некоторыми исключениями ниже.
     exceptions: Исключения
-    explanation: Из-за того, что удаление постов — это ресурсоёмкий процесс, оно производится медленно со временем, когда сервер менее всего занят. По этой причине, посты могут удаляться не сразу, а спустя определённое время, по достижению возрастного порога.
+    explanation: Из-за того, что удаление постов — это ресурсоёмкий процесс, оно производится медленно со временем, когда сервер менее всего загружен. По этой причине, посты могут удаляться не сразу, а спустя определённое время, по достижению возрастного порога.
     ignore_favs: Игнорировать отметки «избранного»
     ignore_reblogs: Игнорировать продвижения
     interaction_exceptions: Исключения на основе взаимодействий
@@ -1448,13 +1470,13 @@ ru:
     keep_direct: Не удалять адресованные посты
     keep_direct_hint: Не удалять ваши посты с «адресованной» видимостью.
     keep_media: Не удалять посты с вложениями
-    keep_media_hint: Не удалять ваши посты, содержащие любые медийные вложения
+    keep_media_hint: Не удалять ваши посты, содержащие любые медийные вложения.
     keep_pinned: Не удалять закреплённые посты
     keep_pinned_hint: Не удалять ваши посты, которые закреплены в профиле.
     keep_polls: Не удалять опросы
     keep_polls_hint: Не удалять ваши посты с опросами.
     keep_self_bookmark: Не удалять закладки
-    keep_self_bookmark_hint: Не удалять ваши посты с закладками
+    keep_self_bookmark_hint: Не удалять ваши посты с закладками.
     keep_self_fav: Оставить посты, отмеченные «избранными»
     keep_self_fav_hint: Не удалять ваши посты, если вы отметили их как «избранные».
     min_age:
@@ -1475,6 +1497,9 @@ ru:
     pinned: Закреплённый пост
     reblogged: продвинул(а)
     sensitive_content: Содержимое деликатного характера
+  strikes:
+    errors:
+      too_late: Слишком поздно обжаловать это замечание
   tags:
     does_not_match_previous_name: не совпадает с предыдущим именем
   terms:
@@ -1601,12 +1626,14 @@ ru:
       title: Выполнен вход
     warning:
       appeal: Обжаловать
+      appeal_description: Если вы считаете, что это ошибка, вы можете обратиться к поддержке %{instance}.
       categories:
         spam: Спам
         violation: Содержимое нарушает следующие правила сообщества
       explanation:
         delete_statuses: Было обнаружено, что некоторые из ваших постов нарушают одно или несколько правил сообщества, и они были удалены модераторами %{instance}.
         disable: Вы не можете использовать свою учётную запись, однако ваш профиль и данные остаются нетронутыми. Вы можете запросить выгрузку своих данных, менять настройки, либо полностью удалить свою учётную запись.
+        mark_statuses_as_sensitive: Некоторые из ваших сообщений были отмечены модераторами %{instance} как деликатные. Это означает, что людям нужно будет нажать на медиа в сообщениях, прежде чем будет показан предпросмотр. При публикации в будущем вы можете помечать медиафайлы как деликатные самостоятельно.
         sensitive: С этого момента, все прикрепляемые вами файлы будут отмечаться как «деликатного характера» и скрыты за предупреждением, требующими клика.
         silence: Вы по-прежнему можете использовать свою учётную запись, но только пользователи, которые подписаны на вас, смогут видеть ваши публикации на данном узле. Вы также будете исключены из различных поисковых функций, однако пользователи всё ещё могут вручную подписаться на вас.
         suspend: Вы больше не сможете использовать эту учётную запись и ваш профиль более недоступен к просмотру. Вы по-прежнему можете войти в учётную запись, чтобы запросить выгрузку своих данных, до тех пор, пока они не будут удалены спустя 30 дней (за исключением информации, которая не позволит вам обойти эту блокировку).
@@ -1615,7 +1642,9 @@ ru:
       subject:
         delete_statuses: Опубликованные вами с учётной записи %{acct} посты были удалены
         disable: Ваша учётная запись %{acct} заморожена
+        mark_statuses_as_sensitive: Ваши сообщения в %{acct} были отмечены как деликатные
         none: "%{acct} вынесено предупреждение"
+        sensitive: Ваши сообщения в %{acct} будут отмечены с этого момента как деликатные
         silence: На учётную запись %{acct} наложены ограничения
         suspend: Ваша учётная запись %{acct} была заблокирована
       title:
@@ -1650,7 +1679,7 @@ ru:
     seamless_external_login: Вы залогинены через сторонний сервис, поэтому настройки e-mail и пароля недоступны.
     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/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index 7c8b20885..57ecee19f 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -37,6 +37,7 @@ ar:
         current_password: لأسباب أمنية ، يرجى إدخال الكلمة السرية الخاصة بالحساب الحالي
         current_username: يرجى إدخال اسم المستخدم الخاص بالحساب الحالي قصد التأكيد
         digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة
+        discoverable: السماح للغرباء اكتشاف حسابك من خلال التوصيات والمتداولة وغيرها من الميزات
         email: سوف تتلقى رسالة إلكترونية للتأكيد
         fields: يُمكنك عرض 4 عناصر على شكل جدول في صفحتك التعريفية
         header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index b89237b1e..2e0632648 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -44,7 +44,7 @@ ca:
         inbox_url: Copia l'URL de la pàgina principal del relay que vols utilitzar
         irreversible: Les publicacions filtrades desapareixeran de manera irreversible, fins i tot si el filtre s'elimina més tard
         locale: L'idioma de la interfície d’usuari, els correus i les notificacions push
-        locked: Controla manualment qui et pot seguir i aprovar les peticions
+        locked: Controla manualment qui et pot seguir, aprovant sol·licituds
         password: Utilitza com a mínim 8 caràcters
         phrase: Es combinarà independentment del format en el text o l'avís de contingut de la publicació
         scopes: API permeses per accedir a l'aplicació. Si selecciones un àmbit de nivell superior, no cal que en seleccions un d'individual.
@@ -143,16 +143,16 @@ ca:
         inbox_url: URL de la safata d'entrada del relay
         irreversible: Cau en lloc d'ocultar
         locale: Idioma de la interfície
-        locked: Torna aquest compte privat
+        locked: Requereix sol·licituds de seguiment
         max_uses: Nombre màxim d'usos
         new_password: Contrasenya nova
         note: Biografia
         otp_attempt: Codi de dos factors
         password: Contrasenya
         phrase: Paraula clau o frase
-        setting_advanced_layout: Activar l’interfície web avançada
+        setting_advanced_layout: Activa la interfície web avançada
         setting_aggregate_reblogs: Agrupar impulsos en les línies de temps
-        setting_always_send_emails: Envia sempre notificacions per correu electrònic
+        setting_always_send_emails: Envia'm sempre notificacions per correu electrònic
         setting_auto_play_gif: Reproduir automàticament els GIFs animats
         setting_boost_modal: Mostrar la finestra de confirmació abans d'impulsar
         setting_crop_images: Retalla les imatges en publicacions no ampliades a 16x9
@@ -160,14 +160,14 @@ ca:
         setting_default_privacy: Privacitat de les publicacions
         setting_default_sensitive: Marcar sempre el contingut gràfic com a sensible
         setting_delete_modal: Mostrar la finestra de confirmació abans d'esborrar una publicació
-        setting_disable_swiping: Desactivar les animacions
+        setting_disable_swiping: Desactiva les animacions
         setting_display_media: Visualització multimèdia
         setting_display_media_default: Per defecte
         setting_display_media_hide_all: Amaga-ho tot
         setting_display_media_show_all: Mostra-ho tot
         setting_expand_spoilers: Sempre ampliar les publicacions marcades amb advertències de contingut
         setting_hide_network: Amagar la teva xarxa
-        setting_noindex: Desactivar la indexació dels motors de cerca
+        setting_noindex: Desactiva la indexació dels motors de cerca
         setting_reduce_motion: Reduir el moviment de les animacions
         setting_show_application: Revelar l'aplicació utilitzada per fer les publicacions
         setting_system_font_ui: Utilitzar el tipus de lletra predeterminat del sistema
@@ -187,8 +187,8 @@ ca:
       featured_tag:
         name: Etiqueta
       interactions:
-        must_be_follower: Blocar les notificacions de persones que no et segueixen
-        must_be_following: Blocar les notificacions de persones que no segueixes
+        must_be_follower: Bloqueja les notificacions de persones que no em segueixen
+        must_be_following: Bloqueja les notificacions de persones no seguides
         must_be_following_dm: Blocar els missatges directes de persones que no segueixes
       invite:
         comment: Comenta
@@ -203,11 +203,11 @@ ca:
         severity: Regla
       notification_emails:
         appeal: Algú ha apel·lat una decisió de moderació
-        digest: Enviar un resum per correu electrònic
+        digest: Envia'm un resum per correu electrònic
         favourite: Algú marca com a preferit el teu estat
-        follow: Algú t'ha seguit
-        follow_request: Envia un correu electrònic si algú sol·licita seguir-te
-        mention: Algú t'ha esmentat
+        follow: Algú et segueix
+        follow_request: Algú sol·licita seguir-te
+        mention: Algú et menciona
         pending_account: Un nou compte necessita revisió
         reblog: Algú comparteix el teu estat
         report: Nou informe és emés
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 95d6783fd..472a44201 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -165,6 +165,8 @@ cy:
         comment: Sylw
       invite_request:
         text: Pam hoffech ymuno?
+      ip_block:
+        severity: Rheol
       notification_emails:
         digest: Anfonwch e-byst crynhoi
         favourite: Anfon e-bost pan mae rhywun yn ffefrynnu eich statws
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index 36d7cbf67..6faf1842a 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -2,27 +2,146 @@
 he:
   simple_form:
     hints:
+      account_alias:
+        acct: נא לציין משתמש@דומיין של החשבון ממנו תרצה/י לעבור
+      account_migration:
+        acct: נא לציין משתמש@דומיין של החשבון אליו תרצה/י לעבור
+      account_warning_preset:
+        text: ניתן להשתמש בתחביר חצרוצי, כגון קישוריות, האשתגיות ואזכורים
+        title: אופציונלי. בלתי נראה למקבל ההודעה
+      admin_account_action:
+        include_statuses: המשתמש יראה אילו חצרוצים גרמו לפעולה או לאזהרה
+        send_email_notification: המשתמש יקבל הסבר מה קרה לחשבונם
+        text_html: אופציונלי. ניתן להשתמש בתחביר חצרוצי. ניתן <a href="%{path}">להוסיף הגדרות אזהרה</a> כדי לחסוך זמן
+        type_html: נא לבחור מה לעשות עם <strong>%{acct}</strong>
+        types:
+          disable: מנעי מהמשתמש להשתמש בחשבונם, מבלי למחוק או להסתיר את תוכנו.
+          none: השתמשי בזה כדי לשלוח למשתמש אזהרה, מבלי לגרור פעולות נוספות.
+          sensitive: אלצי את כל קבצי המדיה המצורפים על ידי המשתמש להיות מסומנים כרגישים.
+          silence: מנעי מהמשתמש להיות מסוגל לחצרץ בנראות פומבית, החביאי את חצרוציהם והתראותיהם מאנשים שלא עוקבים אחריהם.
+          suspend: מנעי כל התקשרות עם חשבון זה ומחקי את תוכנו. ניתן לשחזור תוך 30 יום.
+        warning_preset_id: אופציונלי. ניתן עדיין להוסיף טקסט ייחודי לסוף ההגדרה
+      announcement:
+        all_day: אם נבחר, רק התאריכים בטווח הזמן יוצגו
+        ends_at: אופציונלי. הכרזות יוסרו באופן אוטומטי בזמן זה
+        scheduled_at: נא להשאיר ריק כדי לפרסם את ההכרזה באופן מיידי
+        starts_at: אופציונלי. במקרה שהכרזתך כבולה לטווח זמן ספציפי
+        text: ניתן להשתמש בתחביר חצרוצי. נא לשים לב לשטח שתתפוס ההכרזה על מסך המשתמש
+      appeal:
+        text: ניתן לערער על עברה רק פעם אחת
       defaults:
+        autofollow: אנשים שיצטרפו בעזרת ההזמנה יעקבו אחריך באופן אוטומטי
         avatar: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן ל-%{dimensions}px
+        bot: איתות לאחרים שהחשבון מבצע בעיקר פעולות אוטומטיות ועשוי לא להיות מנוטר
+        context: הקשר אחד או יותר בהם יופעל המסנן
+        current_password: מסיבות אבטחה נא להזין את הסיסמא של החשבון הנוכחי
+        current_username: על מנת לאשר, נא להכניס את שם המשתמש של החשבון הנוכחי
         digest: נשלח לאחר תקופה ארוכה של אי-פעילות עם סיכום איזכורים שקיבלת בהעדרך
+        discoverable: אשר/י לחשבונך להתגלות לזרים על ידי המלצות, נושאים חמים ושאר דרכים
+        email: דוא"ל אישור יישלח אליך
+        fields: ניתן להציג עד ארבעה פריטים כטבלה בפרופילך
         header: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן %{dimensions}px
+        inbox_url: נא להעתיק את הקישורית מדף הבית של הממסר בו תרצה/י להשתמש
+        irreversible: חצרוצים מסוננים יעלמו באופן בלתי הפיך, אפילו אם מאוחר יותר יוסר המסנן
+        locale: שפת ממשק המשתמש, הדוא"ל וההתראות בדחיפה
         locked: מחייב אישור עוקבים באופן ידני. פרטיות ההודעות תהיה עוקבים-בלבד אלא אם יצוין אחרת
+        password: נא להשתמש בלפחות 8 תוים
+        phrase: התאמה תמצא ללא תלות באזהרת תוכן בחצרוץ
+        scopes: לאיזה ממשק יורשה היישום לגשת. בבחירת תחום כללי, אין צורך לבחור ממשקים ספציפיים.
+        setting_aggregate_reblogs: לא להראות הדהודים של חצרוצים שהודהדו לאחרונה (משפיע רק על הדהודים שהתקבלו לא מזמן)
+        setting_always_send_emails: בדרך כלל התראות דוא"ל לא יישלחו בזמן שימוש פעיל במסטודון
+        setting_default_sensitive: מדיה רגישה מוסתרת כברירת מחדל וניתן להציגה בקליק
+        setting_display_media_default: הסתרת מדיה המסומנת כרגישה
+        setting_display_media_hide_all: הסתר מדיה תמיד
+        setting_display_media_show_all: גלה מדיה תמיד
+        setting_hide_network: עוקבייך ונעקבייך יוסתרו בפרופילך
         setting_noindex: משפיע על הפרופיל הציבורי שלך ועמודי ההודעות
+        setting_show_application: היישום בו נעשה שימוש כדי לחצרץ יופיע בתצוגה המפורטת של החצרוץ
+        setting_use_blurhash: הגראדיינטים מבוססים על תוכן התמונה המוסתרת, אבל מסתירים את כל הפרטים
+        setting_use_pending_items: הסתר עדכוני פיד מאחורי קליק במקום לגלול את הפיד אוטומטית
+        username: שם המשתמש שלך יהיה ייחודי ב-%{domain}
+        whole_word: אם מילת מפתח או ביטוי הם אלפאנומריים בלבד, הם יופעלו רק אם נמצאה התאמה למילה שלמה
+      domain_allow:
+        domain: דומיין זה יוכל לייבא מידע משרת זה והמידע המגיע ממנו יעובד ויאופסן
+      email_domain_block:
+        domain: זה יכול להיות שם הדומיין המופיע בכתובת הדוא"ל או רשומת ה-MX בה הוא משתמש. הם ייבדקו בהרשמה.
+        with_dns_records: ייעשה נסיון למצוא את רשומות ה-DNS של דומיין נתון והתוצאות ייחסמו גם הן
+      featured_tag:
+        name: 'אולי תרצה/י להשתמש באחד מאלה:'
+      form_challenge:
+        current_password: את.ה נכנס. ת לאזור מאובטח
       imports:
         data: קובץ CSV שיוצא משרת מסטודון אחר
+      invite_request:
+        text: זה יעזור לנו בסקירת הבקשה שלך
+      ip_block:
+        comment: רשות. זכור/י מדוע הוספת את הכלל הזה.
+        expires_in: כתובות IP הם משאב מוגבל, לפעמים הם משותפים ולעתים קרובות מחליפים ידיים. לכן, חסימות IP לצמיתות לא מומלצות.
+        ip: נא להכניס כתובת IPv4 או IPv6. ניתן לחסום תחומים שלמים על ידי שימוש בתחביר CIDR. זהירות לא לנעול את עצמכם בחוץ!
+        severities:
+          no_access: חסימת גישה לכל המשאבים
+          sign_up_requires_approval: הרשמות חדשות ידרשו את אישורך
+        severity: נא לבחור מה יקרה לבקשות מכתובת IP זו
+      rule:
+        text: נא לתאר את הכלל או הדרישה למשתמשים משרת זה. על התיאור להיות קצר ובהיר
       sessions:
-        otp: נא להקליד קוד אימות דו-שלבי ממכשירך או קוד אחזור גישה.
+        otp: 'נא להקליד קוד אימות דו-שלבי ממכשירך או להשתמש באחד מקודי אחזור הגישה שלך:'
+        webauthn: אם זהו מכשיר USB יש לוודא שהוא מוכנס, ואם יש צורך, להקיש עליו.
+      tag:
+        name: ניתן רק להחליף בין אותיות קטנות וגדולות, למשל כדי לשפר את הקריאות
+      user:
+        chosen_languages: אם פעיל, רק חצרוצים בשפות הנבחרות יוצגו לפידים הפומביים
     labels:
+      account:
+        fields:
+          name: תווית
+          value: תוכן
+      account_alias:
+        acct: שם משתמש של החשבון הישן
+      account_migration:
+        acct: שם משתמש של החשבון החדש
+      account_warning_preset:
+        text: טקסט קבוע מראש
+        title: כותרת
+      admin_account_action:
+        include_statuses: כלול חצרוצים מדווחים בהודעת הדוא"ל
+        send_email_notification: יידע את המשתמש באמצעות דוא"ל
+        text: התראה בהתאמה אישית
+        type: פעולה
+        types:
+          disable: הקפא
+          none: שלח התרעה
+          sensitive: רגיש
+          silence: הגבלה
+          suspend: השעייה
+        warning_preset_id: השתמש/י בטקסט מוכן מראש לאזהרה
+      announcement:
+        all_day: אירוע למשך כל היום
+        ends_at: סוף האירוע
+        scheduled_at: תיזמון פרסום
+        starts_at: תחילת האירוע
+        text: הכרזה
+      appeal:
+        text: הסבר מדוע יש להפוך את ההחלטה
       defaults:
+        autofollow: להזמין מעקב אחרי חשבונך
         avatar: תמונת פרופיל
+        bot: זהו חשבון מסוג בוט
+        chosen_languages: סינון שפות
         confirm_new_password: אישור סיסמא חדשה
         confirm_password: אישור סיסמא
+        context: סינון לפי הקשר
         current_password: סיסמא נוכחית
         data: מידע
+        discoverable: הצע חשבון לאחרים
         display_name: שם להצגה
         email: כתובת דוא"ל
         expires_in: תפוגה לאחר
+        fields: מטא-נתונים על הפרופיל
         header: ראשה
+        honeypot: "%{label} (לא למלא)"
+        inbox_url: קישורית לתיבת ממסר
+        irreversible: הסרה במקום הסתרה
         locale: שפה
         locked: הפוך חשבון לפרטי
         max_uses: מספר מרבי של שימושים
@@ -30,31 +149,82 @@ he:
         note: אודות
         otp_attempt: קוד אימות דו-שלבי
         password: סיסמא
+        phrase: מילת מפתח או ביטוי
+        setting_advanced_layout: אפשר ממשק ווב מתקדם
+        setting_aggregate_reblogs: קבץ הדהודים זהים
+        setting_always_send_emails: תמיד שלח התראות לדוא"ל
         setting_auto_play_gif: ניגון אוטומטי של גיפים
         setting_boost_modal: הצגת דיאלוג אישור לפני הדהוד
+        setting_crop_images: קטום תמונות בחצרוצים לא מורחבים ל 16 על 9
+        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: להסתיר הכל
+        setting_display_media_show_all: להציג הכול
+        setting_expand_spoilers: להרחיב תמיד חצרוצים מסומנים באזהרת תוכן
+        setting_hide_network: להחביא את הגרף החברתי שלך
         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: קוד אבטחה
         type: סוג יבוא
         username: שם משתמש
+        username_or_email: שם משתמש או דוא"ל
+        whole_word: מילה שלמה
+      email_domain_block:
+        with_dns_records: לכלול רשומות MX וכתובות IP של הדומיין
+      featured_tag:
+        name: האשתג
       interactions:
         must_be_follower: חסימת התראות משאינם עוקבים
         must_be_following: חסימת התראות משאינם נעקבים
         must_be_following_dm: חסימת הודעות ישירות מכותבים שאינם במעקב
+      invite:
+        comment: הערה
+      invite_request:
+        text: למה תרצה/י להצטרף?
+      ip_block:
+        comment: הערה
+        ip: IP
+        severities:
+          no_access: חסימת גישה
+          sign_up_requires_approval: הגבלת הרשמות
+        severity: כלל
       notification_emails:
+        appeal: מישהם מערערים על החלטת מנהל קהילה
         digest: שליחת הודעות דוא"ל מסכמות
         favourite: שליחת דוא"ל כשמחבבים חצרוץ
         follow: שליחת דוא"ל כשנוספות עוקבות
         follow_request: שליחת דוא"ל כשמבקשים לעקוב
         mention: שליחת דוא"ל כשפונים אלייך
+        pending_account: נדרשת סקירה של חשבון חדש
         reblog: שליחת דוא"ל כשמהדהדים חצרוץ שלך
+        report: דו"ח חדש הוגש
+        trending_tag: נושאים חמים חדשים דורשים סקירה
+      rule:
+        text: כלל
+      tag:
+        listable: הרשה/י להאשתג זה להופיע בחיפושים והצעות
+        name: האשתג
+        trendable: הרשה/י להאשתג זה להופיע תחת נושאים חמים
+        usable: הרשה/י לחצרוצים להכיל האשתג זה
     'no': לא
+    recommended: מומלץ
     required:
+      mark: "*"
       text: שדה חובה
+    title:
+      sessions:
+        webauthn: נא להשתמש באחד ממפתחות האבטחה שלך כדי להכנס
     'yes': כן
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index d426b5dcd..c8b09bc0f 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -46,7 +46,7 @@ hu:
         locale: A felhasználói felület, e-mailek, push üzenetek nyelve
         locked: Egyenként engedélyezned kell a követőidet
         password: Legalább 8 karakter
-        phrase: Illeszkedni fog kis/nagybetű függetlenül, és tartalom-figyelmeztetések mögött is
+        phrase: Illeszkedni fog kis/nagybetű függetlenül, és tartalmi figyelmeztetések mögött is
         scopes: Mely API-kat érheti el az alkalmazás. Ha felső szintű hatáskört választasz, nem kell egyesével kiválasztanod az alatta lévőeket.
         setting_aggregate_reblogs: Ne mutassunk megtolásokat olyan bejegyzésekhez, melyeket nemrég toltak meg (csak új megtolásokra lép életbe)
         setting_always_send_emails: Alapesetben nem küldünk e-mail értesítéseket, ha aktívan használod a Mastodont
@@ -165,7 +165,7 @@ hu:
         setting_display_media_default: Alapértelmezés
         setting_display_media_hide_all: Mindent elrejt
         setting_display_media_show_all: Mindent mutat
-        setting_expand_spoilers: Tartalom figyelmeztetéssel ellátott bejegyzések automatikus kinyitása
+        setting_expand_spoilers: Tartalmi figyelmeztetéssel ellátott bejegyzések automatikus kinyitása
         setting_hide_network: Hálózatod elrejtése
         setting_noindex: Megtiltom a keresőmotoroknak, hogy indexeljék a tartalmaimat
         setting_reduce_motion: Animációk mozgásának csökkentése
@@ -174,7 +174,7 @@ hu:
         setting_theme: Megjelenítési sablon
         setting_trends: Mai trend mutatása
         setting_unfollow_modal: Megerősítés kérése mielőtt abbahagyod valaki követését
-        setting_use_blurhash: Rejtett média helyett homály mutatása
+        setting_use_blurhash: Színátmenetek megjelenítése a rejtett médiáknál
         setting_use_pending_items: Lassú mód
         severity: Súlyosság
         sign_in_token_attempt: Biztonsági kód
diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml
index 4d640fd9a..0e2d5e3a9 100644
--- a/config/locales/simple_form.io.yml
+++ b/config/locales/simple_form.io.yml
@@ -2,42 +2,229 @@
 io:
   simple_form:
     hints:
+      account_alias:
+        acct: Partikulare pozez uzantonomo@domeno di konto quon vua volas ektransferesar
+      account_migration:
+        acct: Partikulare pozez uzantonomo@domeno di konto quon vua volas entransferesar
+      account_warning_preset:
+        text: Vu povas uzar postosintaxo tale URL, hashtagi e mencioni
+        title: Neobligata. Nevidebla da recevanto
+      admin_account_action:
+        include_statuses: Uzanto vidos quala posti quo kauzigas jero o averto
+        send_email_notification: Uzanto ganos expliko pri quo eventas a olia konto
+        text_html: Neobligata. Vu povas uzar postosintaxo. Vu povas <a href="%{path}">insertar avertofixiti</a> por sparar tempo
+        type_html: Selektez ago per <strong>%{acct}</strong>
+        types:
+          disable: Preventez uzanto de uzar olia konto ma ne efacez o celez olia kontenaji.
+          none: Uzez co por sendar averto a la uzanto sen eventigar irga altra ago.
+          sensitive: Koaktez omna mediiatachaji da ca uzanto markizesar quale sentoza.
+          silence: Preventez la uzanto de povar postar per publika videbleso, celez olia posti e avizi de personi quo ne sequas oli.
+          suspend: Preventez irga interago de o a ca konto e efacez ola kontenaji. Inversebla til 30 dii.
+        warning_preset_id: Neobligata. Vu povas ankore insertar kustume texto a extremajo di fixito
+      announcement:
+        all_day: Kande kontrolesas, nur tempoporteodato montresos
+        ends_at: Neobligata. Anunco automatika depublikigesos dum ta tempo
+        scheduled_at: Restez quale vakua por publikigar anunco quik
+        starts_at: Neobligata. Por vua anunco limitizesas a partikulare tempoporteo
+        text: Vu povas uzar postosintaxo. Notez intervalo quon anunco uzas che skreno de uzanto
+      appeal:
+        text: Vu povas nur apelar striko unafoye
       defaults:
+        autofollow: Personi quo registresesas tra invito automatika sequos vu
         avatar: En la formato PNG, GIF o JPG. Til %{size}. Esos mikrigita a %{dimensions}px
+        bot: Signalez a altra personi ke la konto precipue havas automatikigita agi e forsan ne surveyesas
+        context: Situeso kande filtrilo debas aplikesar
+        current_password: Por sekuresorezoni, pozez pasvorto di ca konto
+        current_username: Por konfirmar, pozez uzantonomo di ca konto
+        digest: Nur sendesas pos longa neaktiveso e nur se vu ganis irga mesaji dum ke vu esas neprezenta
+        discoverable: Permisez vua konto deskovresar da nekonociti tra rekomendi, tendenci e altra traiti
+        email: Vu sendesos konfirmretposto
+        fields: On povas havar maxime 4 kozi quo montresas quale tabelo che ona profilo
         header: En la formato PNG, GIF o JPG. Til %{size}. Esos mikrigita a %{dimensions}px
+        inbox_url: Kopiez URL de frontpagino de relayo quon vu volas uzar
+        irreversible: Filtrita posti neinversigeble desaparos, mem se filtro efacesas pose
+        locale: Linguo di uzantointervizajo, retposti e pulsavizi
         locked: Tu devos aprobar omna demandi di sequado, e tua mesaji esos senchanje nur por tua sequanti.
+        password: Uzes minime 8 litri
+        phrase: Parigesos ne ye textosituaciono o konteneyoaverto di posto
+        scopes: Quala API quon softwaro permisesas acesar. Se vu selektas alta skopo, vu ne mustas selektar individui.
+        setting_aggregate_reblogs: Ne montrez nova busti di posti quo recente bustesas (nova busti)
+        setting_always_send_emails: Normale retpostoavizi ne sendesas kande vu aktiva uzas Mastodon
+        setting_default_sensitive: Sentoza medii originala celesas e povas revelesar per klikto
+        setting_display_media_default: Celez medii quo markizesis quale sentoza
+        setting_display_media_hide_all: Sempre celez medii
+        setting_display_media_show_all: Sempre montrez medii
+        setting_hide_network: Vua sequato e sequanto celesos che vua profilo
+        setting_noindex: Efektigar vua publika profilo e postopagini
+        setting_show_application: Softwaro quon vu uzar por postigar montresos che detala vidajo di vua posti
+        setting_use_blurhash: Inklini esas segun kolori di celesis vidaji ma kovras irga detali
+        setting_use_pending_items: Celez tempolineonovi dop kliktar e ne automatike movigar niuzeto
+        username: Vua uzantonomo esos nura che %{domain}
+        whole_word: Kande klefvorto o fraz esas nur litera e nombra, ol nur aplikesos se ol parigesas la tota vorto
+      domain_allow:
+        domain: Ca domeno povas ganar informi de ca servilo e venanta informo de ol procedagesos e sparesos
+      email_domain_block:
+        domain: Co povas esas domennomo quo montresas che retposto o registrajo MX quon ol uzas. Oli kontrolesos kande registro.
+        with_dns_records: Probo di rezolvar registri DNS di la domeno agesos e rezulti anke preventesos
+      featured_tag:
+        name: 'Vu forsan volas uzar 1 de co:'
+      form_challenge:
+        current_password: Vu eniras sekura areo
       imports:
         data: Dosiero CSV de altra instaluro di Mastodon
+      invite_request:
+        text: Co helpos ni kontrolar vua apliko
+      ip_block:
+        comment: Neobligata. Memorez por quo vu insertas ca regulo.
+        expires_in: IP-Adresi esas finita moyeno, oli kelkafoye partigesas e frequenta uzesas da multa personi. Do, nedefinita IP-restrikti ne rekomendesas.
+        ip: Tipez adreso di IPv4 o IPv6. Vu povas restrikar tota porteo per sintaxo CIDR. Sorgemez por ke vu ne klefklozas su!
+        severities:
+          no_access: Restriktez aceso a omna moyeni
+          sign_up_requires_approval: Nova registro bezonos vua aprobo
+        severity: Selektez quo eventos kun demandi de ca IP
+      rule:
+        text: Deskriptez regulo o bezonaj por uzanti en ca servilo. Vu debas lasar lu esar korta e simpla
       sessions:
         otp: Enter the Two-factor code from your phone or use one of your recovery codes.
+        webauthn: Se ol esas klefo di USB, certigar ke vu insertas e se bezonesas, tushetez.
+      tag:
+        name: Vu povas nur chanjar literkaso, por exemplo, por kauzigar lu divenar plu lektebla
+      user:
+        chosen_languages: Kande marketigesis, nur posti en selektesis lingui montresos en publika tempolinei
     labels:
+      account:
+        fields:
+          name: Etiketo
+          value: Kontenajo
+      account_alias:
+        acct: Nomo di olda konto
+      account_migration:
+        acct: Nomo di nova konto
+      account_warning_preset:
+        text: Fixita texto
+        title: Titulo
+      admin_account_action:
+        include_statuses: Inkluzez raportizita posti en retposto
+        send_email_notification: Notifikez la uzanto di retposto
+        text: Kustumizita averto
+        type: Ago
+        types:
+          disable: Cesez
+          none: Sendez averto
+          sensitive: Privata
+          silence: Limitigez
+          suspend: Desaprobez
+        warning_preset_id: Uzez avertfixito
+      announcement:
+        all_day: Evento di tota dio
+        ends_at: Fino di evento
+        scheduled_at: Skemigez publikigito
+        starts_at: Komenco di evento
+        text: Anunco
+      appeal:
+        text: Explikar por quo ca decidajo debas inversigesar
       defaults:
+        autofollow: Invitez por sequar vua konto
         avatar: Profilimajo
+        bot: Co esas botkonto
+        chosen_languages: Filtrez lingui
         confirm_new_password: Konfirmar nova pasvorto
         confirm_password: Konfirmar nova pasvorto
+        context: Filtrez kuntexti
         current_password: Nuna pasvorto
         data: Datumi
+        discoverable: Sugestez konto a altra personi
         display_name: Publika nomo
         email: Retpost-adreso
+        expires_in: Expiras pos
+        fields: Profilmetadato
         header: Kapimajo
+        honeypot: "%{label} (ne plenigez)"
+        inbox_url: URL di relayomesajbuxo
+        irreversible: Deslevez e ne celez
         locale: Linguo
         locked: Privatigar la konto
+        max_uses: Maxima uzi
         new_password: Nova pasvorto
         note: Suprizento
         otp_attempt: Dufaktora identigilo
         password: Pasvorto
+        phrase: Klefvorto o frazo
+        setting_advanced_layout: Aktivigez avancata retintervizajo
+        setting_aggregate_reblogs: Grupbusti en tempolinei
+        setting_always_send_emails: Sempre sendez retpostoavizi
+        setting_auto_play_gif: Automate pleez animigita GIFi
+        setting_boost_modal: Montrez konfirmdialogo ante bustar
+        setting_crop_images: Ektranchez imaji en neexpansigita posti a 16x9
+        setting_default_language: Postolinguo
         setting_default_privacy: Videbleso di la mesaji
+        setting_default_sensitive: Sempre markizez medii quale sentoza
+        setting_delete_modal: Montrez konfirmdialogo ante efacar posto
+        setting_disable_swiping: Desaktivigez fingromovi
+        setting_display_media: Mediomontrajo
+        setting_display_media_default: Originalo
+        setting_display_media_hide_all: Celez omno
+        setting_display_media_show_all: Montrez omno
+        setting_expand_spoilers: Sempre expansigez posti quo markizesis kun kontenajaverti
+        setting_hide_network: Celez vua sociala grafiko
+        setting_noindex: Desjuntez trovmotorindexigo
+        setting_reduce_motion: Diminutez moveso di animacii
+        setting_show_application: Montrez softwaro quo uzesis por sendar posti
+        setting_system_font_ui: Uzez originala literfonto di sistemo
+        setting_theme: Sittemo
+        setting_trends: Montrez tendenco di hodie
+        setting_unfollow_modal: Montrez konfirmdialogo ante desequar ulu
+        setting_use_blurhash: Montrez koloroza inklini por celata medii
+        setting_use_pending_items: Modo lenta
+        severity: Severeso
+        sign_in_token_attempt: Sekureskodexo
         type: Tipo di importaco
         username: Uzernomo
+        username_or_email: Uzantonomo o retposto
+        whole_word: Tota vorto
+      email_domain_block:
+        with_dns_records: Inkluzez registraji MX e IPi di domeno
+      featured_tag:
+        name: Hashtago
       interactions:
         must_be_follower: Celar la savigi da homi, qui ne sequas tu
         must_be_following: Celar la savigi da homi, quin tu ne sequas
+        must_be_following_dm: Obstruktez direta mesaji de personi quon vu ne sequas
+      invite:
+        comment: Komento
+      invite_request:
+        text: Por quo vu volas juntar?
+      ip_block:
+        comment: Komento
+        ip: IP
+        severities:
+          no_access: Depermisez aceso
+          sign_up_requires_approval: Limitigez registri
+        severity: Regulo
       notification_emails:
+        appeal: Ulu apelas jererdecidajo
         digest: Sendar rezuma retpost-mesaji
         favourite: Sendar retpost-mesajo, kande ulu favoras mesajo da tu
         follow: Sendar retpost-mesajo, kande ulu sequeskas tu
         follow_request: Sendar retpost-mesajo, kande ulu diskonocigas mesajo da tu
         mention: Sendar retpost-mesajo, kande ulu mencionas tu
+        pending_account: Nova konto bezonas kontrolo
         reblog: Sendar retpost-mesajo, kande ulu diskonocigas mesajo da tu
+        report: Nova raport sendesas
+        trending_tag: Nova tendenco bezonas kontrolo
+      rule:
+        text: Regulo
+      tag:
+        listable: Permisez ca hashtago aparar en trovaji e sugestaji
+        name: Hashtago
+        trendable: Permisez ca hashtago aparar che tendenci
+        usable: Permisez posti uzar ca hashtago
+    'no': Ne
+    recommended: Rekomendito
     required:
+      mark: "*"
       text: bezonata
+    title:
+      sessions:
+        webauthn: Uzez 1 de vua sekuresklefti por enirar
+    'yes': 'Yes'
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index c89c483ea..5112d7c97 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -11,7 +11,7 @@ ko:
         title: 선택사항. 수신자에게는 보이지 않습니다
       admin_account_action:
         include_statuses: 사용자는 어떤 게시물에 대해 경고나 조치가 취해졌는지 볼 수 있게 됩니다
-        send_email_notification: 유저는 어떤 일이 일어났는 지에 대한 설명을 받게 됩니다
+        send_email_notification: 사용자는 어떤 일이 일어났는 지에 대한 설명을 받게 됩니다
         text_html: 선택사항. 게시물 문법을 사용할 수 있습니다. <a href="%{path}">경고 틀을 추가</a>하여 시간을 절약할 수 있습니다
         type_html: "<strong>%{acct}</strong>에 대해 취할 행동 선택"
         types:
@@ -43,7 +43,7 @@ ko:
         header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
         inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다
         irreversible: 필터링 된 게시물은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다
-        locale: 유저 인터페이스, 이메일, 푸시 알림 언어
+        locale: 사용자 인터페이스, 이메일, 푸시 알림 언어
         locked: 팔로우 요청을 승인함으로써 누가 당신을 팔로우 할 수 있는지를 수동으로 제어합니다.
         password: 최소 8글자
         phrase: 게시물 내용이나 열람주의 내용 안에서 대소문자 구분 없이 매칭 됩니다
@@ -59,7 +59,7 @@ ko:
         setting_show_application: 당신이 게시물을 작성하는데에 사용한 앱이 게시물의 상세정보에 표시 됩니다
         setting_use_blurhash: 그라디언트는 숨겨진 내용의 색상을 기반으로 하지만 상세 내용은 보이지 않게 합니다
         setting_use_pending_items: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다
-        username: 당신의 유저네임은 %{domain} 안에서 유일해야 합니다
+        username: 당신의 사용자명은 %{domain} 안에서 유일해야 합니다
         whole_word: 키워드가 영문과 숫자로만 이루어 진 경우, 단어 전체에 매칭 되었을 때에만 작동하게 합니다
       domain_allow:
         domain: 이 도메인은 이 서버에서 데이터를 가져갈 수 있고 이 도메인에서 보내진 데이터는 처리되고 저장 됩니다
@@ -105,7 +105,7 @@ ko:
         title: 제목
       admin_account_action:
         include_statuses: 신고된 게시물을 이메일에 포함
-        send_email_notification: 이메일로 유저에게 알리기
+        send_email_notification: 이메일로 사용자에게 알리기
         text: 커스텀 경고
         type: 조치
         types:
@@ -179,8 +179,8 @@ ko:
         severity: 심각도
         sign_in_token_attempt: 보안 코드
         type: 불러오기 종류
-        username: 유저 이름
-        username_or_email: 유저네임 또는 이메일
+        username: 사용자명
+        username_or_email: 사용자명 또는 이메일
         whole_word: 단어 전체에 매칭
       email_domain_block:
         with_dns_records: 도메인의 IP와 MX 레코드 값을 포함
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index b4c7d9cff..63559d30c 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -37,9 +37,9 @@ ru:
         current_password: В целях безопасности введите пароль текущей учётной записи
         current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учётной записи
         digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия.
-        discoverable: Разрешить другим людям находить ваш профиль через рекомендации, тренды и другие функции
+        discoverable: Разрешить другим людям находить ваш профиль через рекомендации, тренды и другие функции.
         email: Вам будет отправлено электронное письмо с подтверждением.
-        fields: В профиле можно отобразить до 4 пунктов в виде таблицы.
+        fields: В профиле можно отобразить до 4 пунктов в виде таблицы. Например, ваши местоимения, часовой пояс или ссылку на свой сайт.
         header: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшена до %{dimensions}px.
         inbox_url: Копировать URL с главной страницы ретранслятора, который вы хотите использовать
         irreversible: Отфильтрованные посты будут утеряны навсегда, даже если в будущем фильтр будет убран
@@ -133,7 +133,7 @@ ru:
         context: Контекст фильтра
         current_password: Текущий пароль
         data: Данные
-        discoverable: Показывать эту учётную запись в каталоге
+        discoverable: Рекомендовать учётную запись другим пользователям
         display_name: Отображаемое имя
         email: Адрес e-mail
         expires_in: Истекает через
@@ -185,7 +185,7 @@ ru:
       email_domain_block:
         with_dns_records: Включить MX-записи и IP-адреса домена
       featured_tag:
-        name: Хэштег
+        name: Добавить хэштег
       interactions:
         must_be_follower: Присылать уведомления только от подписчиков
         must_be_following: Присылать уведомления только от людей на которых вы подписаны
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index 2a2f3b4d5..dcce30e98 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -2,39 +2,61 @@
 sl:
   simple_form:
     hints:
+      account_alias:
+        acct: Določite uporabniškoime@domena računa, od katerega se želite preseliti
+      account_migration:
+        acct: Določite uporabniškoime@domena računa, na katerega se želite preseliti
       account_warning_preset:
-        text: Lahko uporabite skladnjo tuta, kot so URL-ji, ključniki in omembe
+        text: Lahko uporabite skladnjo objave, kot so URL-ji, ključniki in omembe
         title: Neobvezno. Ni vidno prejemniku
       admin_account_action:
+        include_statuses: Uporabnik vidi, katere objave so povzročile dejanje moderiranja ali opozorilo
         send_email_notification: Uporabnik bo prejel razlago, kaj se je zgodilo z njihovim računom
-        text_html: Neobvezno. Lahko uporabite skladnjo tuta. <a href="%{path}">Prednastavite opozorila</a>, da prihranite čas
+        text_html: Neobvezno. Lahko uporabite skladnjo objave. <a href="%{path}">Prednastavite opozorila</a>, da prihranite čas
         type_html: Izberite, kaj boste storili z <strong>%{acct}</strong>
+        types:
+          disable: Preprečite uporabniku, da uporablja svoj račun, vendar ne izbrišite ali skrijte njegove vsebine.
+          none: Uporabite to, da pošljete opozorilo uporabnik, ne da bi sprožili kakšno drugo dejanje.
+          sensitive: Vsilite, da so vse medijske priponke tega uporabnika označene kot občutljive.
+          silence: Prepreči uporabniku, da lahko objavlja javno, skrije njihove objave in obvestila pred osebami, ki mu ne sledijo.
+          suspend: Prepreči vsakršno interakcijo od ali do tega računa in izbriše njegovo vsebino. Povratno v roku 30 dni.
         warning_preset_id: Neobvezno. Še vedno lahko dodate besedilo po meri na konec prednastavitve
+      announcement:
+        all_day: Če je potrjeno, bodo prikazani le datumi časovnega obsega
+        ends_at: Neobvezno. Obvestilo bo samodejno neobjavljeno v navedenem času
+        scheduled_at: Pustite prazno, da objavite obvestilo takoj
+        starts_at: Neobvezno. V primeru, da je vaše obvestilo vezano na določen časovni obseg
+        text: Uporabite lahko skladnjo objav. Pazite na prostor, ki ga zavzame obvestilo na zaslonu uporabnika
+      appeal:
+        text: Na ukrep se lahko pritožite le enkrat
       defaults:
         autofollow: Osebe, ki se prijavijo prek povabila, vas bodo samodejno sledile
         avatar: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px
         bot: Ta račun v glavnem opravlja samodejna dejanja in morda ni pod nadzorom
         context: En ali več kontekstov, kjer naj se uporabi filter
+        current_password: Iz varnostnih razlogov vnesite geslo trenutnega računa
         current_username: Za potrditev vnesite uporabniško ime trenutnega računa
         digest: Pošlje se le po dolgem obdobju nedejavnosti in samo, če ste prejeli osebna sporočila v vaši odsotnosti
+        discoverable: Dovolite, da vaš račun odkrijejo neznanci prek priporočil, trendov in drugih funkcij
         email: Poslali vam bomo potrditveno e-pošto
         fields: Na svojem profilu lahko imate do 4 predmete prikazane kot tabelo.
         header: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px
         inbox_url: Kopirajte URL naslov s prve strani releja, ki ga želite uporabiti
-        irreversible: Filtrirani trobi bodo nepovratno izginili, tudi če je filter kasneje odstranjen
+        irreversible: Filtrirane objave bodo nepovratno izginile, tudi če je filter kasneje odstranjen
         locale: Jezik uporabniškega vmesnika, e-poštnih sporočil in potisnih obvestil
         locked: Zahteva, da ročno odobrite sledilce
         password: Uporabite najmanj 8 znakov
-        phrase: Se bo ujemal, ne glede na začetnice v tekstu ali opozorilo o vsebini troba
+        phrase: Se bo ujemal, ne glede na začetnice v besedilu ali opozorilo o vsebini objave
         scopes: Do katerih API-jev bo imel program dostop. Če izberete obseg najvišje ravni, vam ni treba izbrati posameznih.
-        setting_aggregate_reblogs: Ne prikažite novih spodbud za tute, ki so bili nedavno spodbujeni (vpliva samo na novo prejete spodbude)
+        setting_aggregate_reblogs: Ne prikažite novih izpostavitev za objave, ki so bile nedavno izpostavljene (vpliva samo na novo prejete izpostavitve)
+        setting_always_send_emails: Običajno e-obvestila ne bodo poslana, če ste na Mastodonu dejavni
         setting_default_sensitive: Občutljivi mediji so privzeto skriti in jih je mogoče razkriti s klikom
         setting_display_media_default: Skrij medij, ki je označen kot občutljiv
         setting_display_media_hide_all: Vedno skrij vse medije
         setting_display_media_show_all: Vedno pokaži medij, ki je označen kot občutljiv
         setting_hide_network: Kogar spremljate in kdo vas spremlja ne bo prikazano na vašem profilu
-        setting_noindex: Vpliva na vaš javni profil in na strani s stanjem
-        setting_show_application: Aplikacija, ki jo uporabljate za tutanje, bo prikazana v podrobnem pogledu vaših tutov
+        setting_noindex: Vpliva na vaš javni profil in na strani z objavami
+        setting_show_application: Aplikacija, ki jo uporabljate za objavljanje, bo prikazana v podrobnem pogledu vaših objav
         setting_use_blurhash: Gradienti temeljijo na barvah skrite vizualne slike, vendar zakrivajo vse podrobnosti
         setting_use_pending_items: Skrij posodobitev časovnice za klikom namesto samodejnega posodabljanja
         username: Vaše uporabniško ime bo edinstveno na %{domain}
@@ -43,6 +65,7 @@ sl:
         domain: Ta domena bo lahko prejela podatke s tega strežnika, dohodni podatki z nje pa bodo obdelani in shranjeni
       email_domain_block:
         domain: To je lahko ime domene, ki se pokaže v e-poštnem naslovu, ali zapis MX, ki ga uporablja. Ob prijavi bo preverjeno.
+        with_dns_records: Poskus razrešitve zapisov DNS danih domen bo izveden in rezultati bodo prav tako blokirani
       featured_tag:
         name: 'Morda boste želeli uporabiti eno od teh:'
       form_challenge:
@@ -53,14 +76,21 @@ sl:
         text: To nam bo pomagalo pregledati vašo prijavo
       ip_block:
         comment: Neobvezno. Spomnite se, zakaj ste dodali to pravilo.
+        expires_in: Naslovi IP so končno imejen vir, včasij si jih delimo in pogosto menjajo rabo. Zato nedoločeni bloki IP niso priporočeni.
+        ip: Vnesite naslov IPv4 oz. IPv6. S skladnjo CIDR lahko blokirate celotne obsege. Pazite, da se ne zaklenete ven!
         severities:
           no_access: Blokiraj dostop do vseh virov
           sign_up_requires_approval: Za nove registracije bo potrebna vaša odobritev
         severity: Izberite, kaj se bo zgodilo z zahtevami iz tega IP-naslova
+      rule:
+        text: Opišite pravilo ali zahtevo za uporabnike na tem strežniku. Poskusite biti kratki in jasni
       sessions:
         otp: 'Vnesite dvomestno kodo, ki je ustvarjena z aplikacijo na telefonu, ali uporabite eno od vaših obnovitvenih kod:'
+        webauthn: Če gre za ključek USB, ga ne pozabite vstaviti in, če je potrebno, tapniti.
+      tag:
+        name: Spremenite lahko le npr. velikost črk (velike/male), da je bolj berljivo
       user:
-        chosen_languages: Ko je označeno, bodo v javnih časovnicah prikazani samo trobi v izbranih jezikih
+        chosen_languages: Ko je označeno, bodo v javnih časovnicah prikazane samo objave v izbranih jezikih
     labels:
       account:
         fields:
@@ -121,23 +151,25 @@ sl:
         password: Geslo
         phrase: Ključna beseda ali fraza
         setting_advanced_layout: Omogoči napredni spletni vmesnik
-        setting_aggregate_reblogs: Skupinske spodbude na časovnicah
+        setting_aggregate_reblogs: Skupinske izpostavitve na časovnicah
+        setting_always_send_emails: Vedno pošlji e-obvestila
         setting_auto_play_gif: Samodejno predvajanje animiranih GIF-ov
-        setting_boost_modal: Pred sunkom pokaži potrditveno okno
+        setting_boost_modal: Pred izpostavljanjem pokaži potrditveno okno
         setting_crop_images: Obreži slike v nerazširjenih objavah v razmerju 16:9
         setting_default_language: Jezik objavljanja
         setting_default_privacy: Zasebnost objave
         setting_default_sensitive: Vedno označi medije kot občutljive
-        setting_delete_modal: Pred brisanjem troba prikaži okno za pritrditev
+        setting_delete_modal: Pred brisanjem objave prikaži okno za pritrditev
+        setting_disable_swiping: Onemogoči poteze drsanja
         setting_display_media: Prikaz medijev
         setting_display_media_default: Privzeto
         setting_display_media_hide_all: Skrij vse
         setting_display_media_show_all: Prikaži vse
-        setting_expand_spoilers: Vedno razširi trobe, označene z opozorili o vsebini
+        setting_expand_spoilers: Vedno razširi objave, označene z opozorili o vsebini
         setting_hide_network: Skrij svoje omrežje
         setting_noindex: Odsotnost indeksiranja iskalnikov
         setting_reduce_motion: Zmanjšanje premikanja v animacijah
-        setting_show_application: Razkrij aplikacijo za pošiljanje tutov
+        setting_show_application: Razkrij aplikacijo za pošiljanje objav
         setting_system_font_ui: Uporabi privzeto pisavo sistema
         setting_theme: Tema strani
         setting_trends: Pokaži današnje trende
@@ -170,13 +202,14 @@ sl:
           sign_up_requires_approval: Omeji število prijav
         severity: Pravilo
       notification_emails:
+        appeal: Nekdo se je pritožil na odločitev moderatorja
         digest: Pošlji izvlečke e-pošt
-        favourite: Pošlji e-pošto, ko nekdo doda vaše stanje med priljubljene
+        favourite: Pošlji e-pošto, ko nekdo doda vašo objavo med priljubljene
         follow: Pošlji e-pošto, ko vas nekdo sledi
         follow_request: Pošlji e-pošto, ko vam nekdo želi slediti
         mention: Pošlji e-pošto, ko vas nekdo omeni
         pending_account: Pošlji e-pošto, ko je potreben pregled novega računa
-        reblog: Pošlji e-pošto, ko nekdo sune vaše stanje
+        reblog: Pošlji e-sporočilo, ko nekdo izpostavi vašo objavo
         report: Novo poročilo je oddano
         trending_tag: Nov trend zahteva pregled
       rule:
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 2b223b56e..0b6aab940 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -27,6 +27,8 @@ uk:
         scheduled_at: Залиште поля незаповненими, щоб опублікувати оголошення відразу
         starts_at: Необов'язково. У разі якщо оголошення прив'язується до певного періоду часу
         text: Ви можете використовувати той же синтаксис, що і в постах. Будьте завбачливі щодо місця, яке займе оголошення на екрані користувачів
+      appeal:
+        text: Ви можете оскаржити рішення лише один раз
       defaults:
         autofollow: Люди, що зареєструвалися за вашим запрошенням, автоматично підпишуться на вас
         avatar: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px
@@ -35,6 +37,7 @@ uk:
         current_password: Для цілей безпеки, будь ласка, введіть пароль поточного облікового запису
         current_username: Для підтвердження, будь ласка, введіть ім'я користувача поточного облікового запису
         digest: Буде послано тільки після довгого періоду неактивності, та тільки якщо ви отримаєте персональне повідомлення у цей період
+        discoverable: Дозволити знаходити ваш обліковий запис стороннім людям за допомогою рекомендацій, трендів та інших функцій
         email: Вам надійде електронний лист з підтвердженням
         fields: До 4 елементів може бути відображено як таблиця у вашому профілі
         header: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px
@@ -46,6 +49,7 @@ uk:
         phrase: Шукає без врахування регістру у тексті дмуха або у його попередженні про вміст
         scopes: Які API додатку буде дозволено використовувати. Якщо ви виберете самий верхній, нижчестоящі будуть обрані автоматично.
         setting_aggregate_reblogs: Не показувати передмухи для дмухів, які нещодавно вже були передмухнуті (не вплине на вже отримані передмухи)
+        setting_always_send_emails: Зазвичай, під час активного користування Mastodon, сповіщення не будуть відправлятися електронною поштою
         setting_default_sensitive: Дражливі медіа приховані за промовчанням та можуть бути розкрити кліком
         setting_display_media_default: Приховувати медіа, помічені як дражливі
         setting_display_media_hide_all: Завжди приховувати медіа
@@ -60,6 +64,7 @@ uk:
       domain_allow:
         domain: Цей домен зможе отримувати дані з цього серверу. Вхідні дані будуть оброблені та збережені
       email_domain_block:
+        domain: Це може бути доменне ім'я, яке відображується в адресі електронної пошти, або використовуваний запис MX. Вони будуть перевірятися при реєстрації.
         with_dns_records: Спроба визначення DNS-записів заданого домену буде здійснена, а результати також будуть занесені до чорного списку
       featured_tag:
         name: 'Можливо, ви захочете використовувати один з цих:'
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 8e49e300a..11f4daea3 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -11,15 +11,15 @@ zh-TW:
         title: 可選。不會向收件者顯示
       admin_account_action:
         include_statuses: 使用者可看到導致檢舉或警告的嘟文
-        send_email_notification: 使用者將收到帳戶發生之事情的解釋
+        send_email_notification: 使用者將收到帳號發生之事情的解釋
         text_html: 選用。您能使用嘟文語法。您可 <a href="%{path}">新增警告預設</a> 來節省時間
         type_html: 設定要使用 <strong>%{acct}</strong> 做的事
         types:
-          disable: 禁止該使用者使用他們的帳戶,但是不刪除或隱藏他們的內容。
+          disable: 禁止該使用者使用他們的帳號,但是不刪除或隱藏他們的內容。
           none: 使用這個寄送警告給該使用者,而不進行其他動作。
           sensitive: 強制標記此使用者所有媒體為敏感內容。
-          silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳戶中隱藏嘟文和通知。
-          suspend: 禁止所有對該帳戶任何互動,並且刪除其內容。三十日內可以撤回。
+          silence: 禁止該使用者發公開嘟文,從無跟隨他們的帳號中隱藏嘟文和通知。
+          suspend: 禁止所有對該帳號任何互動,並且刪除其內容。三十日內可以撤回。
         warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字
       announcement:
         all_day: 核取後,只會顯示出時間範圍中的日期部分
@@ -30,13 +30,13 @@ zh-TW:
       appeal:
         text: 您只能對警示提出一次申訴
       defaults:
-        autofollow: 通過邀請網址註冊的使用者將自動關注你
+        autofollow: 通過邀請網址註冊的使用者將自動跟隨您
         avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會等比例縮減成 %{dimensions} 像素
-        bot: 此帳戶主要執行自動操作且可能未被監控
+        bot: 此帳號主要執行自動操作且可能未被監控
         context: 應該套用過濾器的一項或多項內容
-        current_password: 因安全因素,請輸入目前帳戶的密碼
-        current_username: 請輸入目前帳戶的使用者名稱以確認
-        digest: 僅在你長時間未登入且在未登入期間收到私訊時傳送
+        current_password: 因安全因素,請輸入目前帳號的密碼
+        current_username: 請輸入目前帳號的使用者名稱以確認
+        digest: 僅在您長時間未登入且在未登入期間收到私訊時傳送
         discoverable: 允許陌生人透過推薦、熱門趨勢及其他功能發現您的帳號
         email: 您將收到一封確認電子郵件
         fields: 您可在個人資料上有至多 4 個以表格形式顯示的項目
@@ -44,7 +44,7 @@ zh-TW:
         inbox_url: 從您想要使用的中繼首頁複製網址
         irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器移除之後也一樣
         locale: 使用者介面、電子信件和推送通知的語言
-        locked: 需要您手動核准關注請求
+        locked: 需要您手動批准跟隨請求
         password: 使用至少 8 個字元
         phrase: 無論是嘟文的本文或是內容警告都會被過濾
         scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。
@@ -54,7 +54,7 @@ zh-TW:
         setting_display_media_default: 隱藏標為敏感的媒體
         setting_display_media_hide_all: 總是隱藏所有媒體
         setting_display_media_show_all: 總是顯示標為敏感的媒體
-        setting_hide_network: 你關注的人與關注你的人將不會在你的個人資料頁上顯示
+        setting_hide_network: 您跟隨的人與跟隨您的人將不會在您的個人資料頁上顯示
         setting_noindex: 會影響您的公開個人資料與嘟文頁面
         setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示
         setting_use_blurhash: 漸層圖樣是基於隱藏媒體內容顏色產生,所有細節會變得模糊
@@ -113,7 +113,7 @@ zh-TW:
           none: 什麼也不做
           sensitive: 有雷小心
           silence: 安靜
-          suspend: 停權並不可逆的刪除帳戶資料
+          suspend: 停權並不可逆的刪除帳號資料
         warning_preset_id: 使用警告預設
       announcement:
         all_day: 全天活動
@@ -124,16 +124,16 @@ zh-TW:
       appeal:
         text: 解釋為什麼要撤銷這個決定
       defaults:
-        autofollow: 邀請別人關注你的帳戶
+        autofollow: 邀請別人跟隨您的帳號
         avatar: 大頭貼
-        bot: 此帳戶是台機器人
+        bot: 此帳號是台機器人
         chosen_languages: 過濾語言
         confirm_new_password: 確認新密碼
         confirm_password: 確認密碼
         context: 過濾情境
         current_password: 目前密碼
         data: 資料
-        discoverable: 在目錄列出此帳戶
+        discoverable: 在目錄列出此帳號
         display_name: 顯示名稱
         email: 電子信箱地址
         expires_in: 失效時間
@@ -143,7 +143,7 @@ zh-TW:
         inbox_url: 中繼收件匣的 URL
         irreversible: 放棄而非隱藏
         locale: 介面語言
-        locked: 鎖定帳戶
+        locked: 鎖定帳號
         max_uses: 最大使用次數
         new_password: 新密碼
         note: 簡介
@@ -173,7 +173,7 @@ zh-TW:
         setting_system_font_ui: 使用系統預設字型
         setting_theme: 站點主題
         setting_trends: 顯示本日趨勢
-        setting_unfollow_modal: 取消關注某人前先詢問我
+        setting_unfollow_modal: 取消跟隨某人前先詢問我
         setting_use_blurhash: 將隱藏媒體以彩色漸變圖樣表示
         setting_use_pending_items: 限速模式
         severity: 優先級
@@ -187,9 +187,9 @@ zh-TW:
       featured_tag:
         name: "「#」標籤"
       interactions:
-        must_be_follower: 封鎖非關注者的通知
-        must_be_following: 封鎖您未關注之使用者的通知
-        must_be_following_dm: 封鎖您未關注之使用者的私訊
+        must_be_follower: 封鎖非跟隨者的通知
+        must_be_following: 封鎖您未跟隨之使用者的通知
+        must_be_following_dm: 封鎖您未跟隨之使用者的私訊
       invite:
         comment: 備註
       invite_request:
@@ -204,12 +204,12 @@ zh-TW:
       notification_emails:
         appeal: 有人對管理員的決定提出上訴
         digest: 傳送摘要信件
-        favourite: 當有使用者喜歡你的嘟文時,傳送電子信件通知
-        follow: 當有使用者關注你時,傳送電子信件通知
-        follow_request: 當有使用者請求關注你時,傳送電子信件通知
-        mention: 當有使用者在嘟文提及你時,傳送電子信件通知
-        pending_account: 需要審核的新帳戶
-        reblog: 當有使用者轉嘟你的嘟文時,傳送電子信件通知
+        favourite: 當有使用者喜歡您的嘟文時,傳送電子信件通知
+        follow: 當有使用者跟隨您時,傳送電子信件通知
+        follow_request: 當有使用者請求跟隨您時,傳送電子信件通知
+        mention: 當有使用者在嘟文提及您時,傳送電子信件通知
+        pending_account: 需要審核的新帳號
+        reblog: 當有使用者轉嘟您的嘟文時,傳送電子信件通知
         report: 新回報已遞交
         trending_tag: 新趨勢需要審閱
       rule:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 5412b8fd1..8a46b531f 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -195,6 +195,7 @@ sk:
       silenced: Stíšený/é
       statuses: Príspevkov
       subscribe: Odoberaj
+      suspend: Vylúč
       suspended: Vylúčený/á
       title: Účty
       unblock_email: Odblokuj emailovú adresu
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index cf7564542..d846c8b92 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -1,16 +1,16 @@
 ---
 sl:
   about:
-    about_hashtag_html: To so javni tuti, označeni z <strong>#%{hashtag}</strong>. Z njimi se lahko povežete, če imate račun kjerkoli v fediverse-u.
+    about_hashtag_html: To so javne objave, označene z <strong>#%{hashtag}</strong>. Z njimi se lahko povežete, če imate račun kjerkoli v fediverzumu.
     about_mastodon_html: Mastodon je socialno omrežje, ki temelji na odprtih spletnih protokolih in prosti ter odprtokodni programski opremi. Je decentraliziran, kot e-pošta.
     about_this: O Mastodonu
-    active_count_after: dejaven
+    active_count_after: dejavnih
     active_footnote: Aktivni mesečni uporabniki (AMU)
     administered_by: 'Upravlja:'
     api: API (programerski vmesnik aplikacije)
     apps: Mobilne aplikacije
     apps_platforms: Uporabljajte Mastodon iz iOS, Android ali iz drugih platform
-    browse_directory: Brskajte po imeniku profilov in filtriranje po interesih
+    browse_directory: Brskajte po imeniku profilov in jih filtrirajte po interesih
     browse_local_posts: Prebrskaj živi tok javnih objav s tega strežnika
     browse_public_posts: Brskajte javnih objav v živo na Mastodonu
     contact: Kontakt
@@ -19,7 +19,7 @@ sl:
     continue_to_web: Nadaljuj v spletno aplikacijo
     discover_users: Odkrijte uporabnike
     documentation: Dokumentacija
-    federation_hint_html: Z računom na %{instance} boste lahko spremljali ljudi na kateremkoli Mastodon strežniku.
+    federation_hint_html: Z računom na %{instance} boste lahko spremljali osebe na poljubnem strežniku Mastodon.
     get_apps: Poskusite mobilno aplikacijo
     hosted_on: Mastodon gostuje na %{domain}
     instance_actor_flash: |
@@ -37,7 +37,7 @@ sl:
     status_count_after:
       few: stanja
       one: stanje
-      other: stanj
+      other: objav
       two: stanja
     status_count_before: Ki so avtorji
     tagline: Sledite prijateljem in odkrijte nove
@@ -46,7 +46,13 @@ sl:
     unavailable_content_description:
       domain: Strežnik
       reason: Razlog
+      rejecting_media: 'Medijske datoteke s teh strežnikov ne bodo obdelane ali shranjene, nobene ogledne sličice ne bodo prikazane, kar bo zahtevalo ročno klikanje po izvorni datoteki:'
+      rejecting_media_title: Filtrirane datoteke
+      silenced: 'Objave s teh strežnikov bodo skrite v javnih časovnicah ter pogovorih in nobena obvestila ne bodo izdelana iz interakcij njihovih uporabnikov, razen če jim sledite:'
       silenced_title: Omejeni strežniki
+      suspended: 'Nobeni podatki s teh strežnikov ne bodo obdelani, shranjeni ali izmenjani, zaradi česar je nemogoča kakršna koli interakcija ali komunikacija z uporabniki s teh strežnikov:'
+      suspended_title: Suspendirani strežniki
+    unavailable_content_html: Mastodon vam splošno omogoča ogled vsebin in interakcijo z uporabniki iz vseh drugih strežnikov v fediverzumu. To so izjeme, opravljene na tem strežniku.
     user_count_after:
       few: uporabniki
       one: uporabnik
@@ -56,6 +62,8 @@ sl:
     what_is_mastodon: Kaj je Mastodon?
   accounts:
     choices_html: "%{name} izbire:"
+    endorsements_hint: Osebe, ki jim sledite, lahko podprete prek spletnega vmesnika in prikazane bodo tukaj.
+    featured_tags_hint: Izpostavite lahko določene ključnike, ki bodo prikazani na tem mestu.
     follow: Sledi
     followers:
       few: Sledilci
@@ -63,6 +71,7 @@ sl:
       other: Sledilcev
       two: Sledilca
     following: Sledim
+    instance_actor_flash: Ta račun je navidezni akter, ki se uporablja za predstavljanje strežnika samega in ne posameznega uporabnika. Uporablja se za namene federacije in se ne sme začasno ustaviti.
     joined: Se je pridružil na %{date}
     last_active: zadnja dejavnost
     link_verified_on: Lastništvo te povezave je bilo preverjeno na %{date}
@@ -77,13 +86,15 @@ sl:
     posts:
       few: Tuti
       one: Tut
-      other: Tutov
+      other: Objav
       two: Tuta
-    posts_tab_heading: Tuti
-    posts_with_replies: Tuti in odgovori
+    posts_tab_heading: Objave
+    posts_with_replies: Objave in odgovori
     roles:
       admin: Skrbnik
       bot: Robot
+      group: Skupina
+      moderator: Mod
     unavailable: Profil ni na voljo
     unfollow: Prenehaj slediti
   admin:
@@ -97,6 +108,7 @@ sl:
     accounts:
       add_email_domain_block: Blokiraj domeno e-pošte
       approve: Odobri
+      approved_msg: Uspešno odobrena aplikacija prijave uporabnika %{username}
       are_you_sure: Ali ste prepričani?
       avatar: Podoba
       by_domain: Domena
@@ -114,7 +126,9 @@ sl:
       delete: Izbriši podatke
       deleted: Izbrisano
       demote: Degradiraj
+      destroyed_msg: Podatki uporabnika %{username} so zdaj v vrsti za trajen izbris
       disable: Onemogoči
+      disable_sign_in_token_auth: Onemogoči overjanje z žetonom po e-pošti
       disable_two_factor_authentication: Onemogoči 2FA
       disabled: Onemogočeno
       display_name: Prikazno ime
@@ -123,7 +137,9 @@ sl:
       email: E-pošta
       email_status: Stanje e-pošte
       enable: Omogoči
+      enable_sign_in_token_auth: Omogoči overjanje z žetonom po e-pošti
       enabled: Omogočeno
+      enabled_msg: Uspešno odmrznjen račun uporabnika %{username}
       followers: Sledilci
       follows: Sledi
       header: Glava
@@ -140,6 +156,8 @@ sl:
       login_status: Stanje prijave
       media_attachments: Predstavnostne priloge
       memorialize: Spremenite v spomin
+      memorialized: Spomenificirano
+      memorialized_msg: Uspešno preoblikovan %{username} v spominski račun
       moderation:
         active: Dejaven
         all: Vse
@@ -154,14 +172,24 @@ sl:
       not_subscribed: Ni naročen
       pending: Čakanje na pregled
       perform_full_suspension: Suspendiraj
+      previous_strikes: Predhodni ukrepi
+      previous_strikes_description_html:
+        few: Ta račun ima <strong>%{count}</strong> ukrepe.
+        one: Ta račun ima <strong>%{count}</strong> ukrep.
+        other: Ta račun ima <strong>%{count}</strong> ukrepov.
+        two: Ta račun ima <strong>%{count}</strong> ukrepa.
       promote: Promoviraj
       protocol: Protokol
       public: Javen
       push_subscription_expires: Naročnina PuSH preteče
       redownload: Osveži profil
+      redownloaded_msg: Uspešno osvežen profil %{username} iz izvirnika
       reject: Zavrni
+      rejected_msg: Uspešno zavrnjena aplikacija prijave uporabnika %{username}
       remove_avatar: Odstrani podobo
       remove_header: Odstrani glavo
+      removed_avatar_msg: Uspešno odstranjena slika avatarja uporabnika %{username}
+      removed_header_msg: Uspešno odstranjena naslovna slika uporabnika %{username}
       resend_confirmation:
         already_confirmed: Ta uporabnik je že potrjen
         send: Ponovno pošlji potrditveno e-pošto
@@ -180,21 +208,32 @@ sl:
       search_same_ip: Drugi uporabniki z istim IP
       security_measures:
         only_password: Samo geslo
+        password_and_2fa: Geslo in 2FA
+      sensitive: Občutljivo
+      sensitized: Označeno kot občutljivo
       shared_inbox_url: URL mape "Prejeto v skupni rabi"
       show:
-        created_reports: Narejene prijave
+        created_reports: Opravljene prijave
         targeted_reports: Prijavili drugi
       silence: Utišaj
       silenced: Utišan
-      statuses: Stanja
+      statuses: Objave
+      strikes: Predhodni ukrepi
       subscribe: Naroči
       suspend: Suspendiraj
       suspended: Suspendiran
+      suspension_irreversible: Podatki tega računa so bili nepovrazno izbrisani. Račun lahko vrnete iz suspenza, da bo ponovno uporaben, vendar preteklih podatkov ne boste mogli obnoviti.
+      suspension_reversible_hint_html: Račun je bil suspendiran, podatki pa bodo v celoti odstranjeni %{date}. Do takrat je mogoče račun obnoviti brez negativnih posledic. Če želite takoj odstraniti vse podatke računa, lahko to storite spodaj.
       title: Računi
+      unblock_email: Odblokiraj e-poštni naslov
+      unblocked_email_msg: E-poštni naslov uporabnika %{username} uspešno odblokiran
       unconfirmed_email: Nepotrjena e-pošta
+      undo_sensitized: Ni občutljivo
       undo_silenced: Razveljavi utišanje
       undo_suspension: Razveljavi suspendiranje
+      unsilenced_msg: Uspešno razveljavljena omejitev računa uporabnika %{username}
       unsubscribe: Odjavi se od naročnine
+      unsuspended_msg: Uspešno preklican suspenz računa uporabnika %{username}
       username: Uporabniško ime
       view_domain: Pokaži povzetek za domeno
       warn: Opozori
@@ -202,28 +241,109 @@ sl:
       whitelisted: Na belem seznamu
     action_logs:
       action_types:
+        approve_appeal: Odobri pritožbo
         approve_user: Odobri uporabnika
-        assigned_to_self_report: Dodeli poročilo
+        assigned_to_self_report: Dodeli prijavo
         change_email_user: Spremeni e-poštni naslov uporabnika
         confirm_user: Potrdi uporabnika
         create_account_warning: Ustvari opozorilo
         create_announcement: Ustvari obvestilo
+        create_custom_emoji: Ustvari emodži po meri
+        create_domain_allow: Ustvari odobritev domene
+        create_domain_block: Ustvari blokado domene
+        create_email_domain_block: Ustvari blokado domene e-pošte
         create_ip_block: Ustvari pravilo IP
         create_unavailable_domain: Ustvari domeno, ki ni na voljo
+        demote_user: Ponižaj uporabnika
         destroy_announcement: Izbriši obvestilo
+        destroy_custom_emoji: Izbriši emodži po meri
         destroy_domain_allow: Izbriši odobritev domene
         destroy_domain_block: Izbriši blokado domene
+        destroy_email_domain_block: Izbriši blokado domene e-pošte
+        destroy_instance: Očisti domeno
         destroy_ip_block: Izbriši pravilo IP
         destroy_status: Izbriši objavo
+        destroy_unavailable_domain: Izbriši domeno, ki ni na voljo
+        disable_2fa_user: Onemogoči
+        disable_custom_emoji: Onemogoči emodži po meri
+        disable_sign_in_token_auth_user: Onemogoči overjanje z žetonom po e-pošti za uporabnika
         disable_user: Onemogoči uporabnika
+        enable_custom_emoji: Omogoči emodži po meri
+        enable_sign_in_token_auth_user: Omogoči overjanje z žetonom po e-pošti za uporabnika
         enable_user: Omogoči uporabnika
+        memorialize_account: Spomenificiraj račun
+        promote_user: Povišaj uporabnika
+        reject_appeal: Zavrni pritožbo
         reject_user: Zavrni uporabnika
         remove_avatar_user: Odstrani avatar
         reopen_report: Ponovno odpri prijavo
         reset_password_user: Ponastavi geslo
+        resolve_report: Razreši prijavo
+        sensitive_account: Občutljivi račun
         silence_account: Omeji račun
+        suspend_account: Začasno prekini račun
+        unassigned_report: Prekliči dodelitev prijave
+        unblock_email_account: Odblokiraj e-poštni naslov
+        unsensitive_account: Ni občutljiv račun
+        unsilence_account: Razveljavi omejitev računa
+        unsuspend_account: Prekliči začasno prekinitev računa
+        update_announcement: Posodobi objavo
+        update_custom_emoji: Posodobi emodži po meri
+        update_domain_block: Posodobi blokado domene
         update_status: Posodobi objavo
-      deleted_status: "(izbrisano stanje)"
+      actions:
+        approve_appeal_html: "%{name} je ugodil pritožbi uporabnika %{target} na moderatorsko odločitev"
+        approve_user_html: "%{name} je odobril/a registracijo iz %{target}"
+        assigned_to_self_report_html: "%{name} je dodelil/a prijavo %{target} sebi"
+        change_email_user_html: "%{name} je spremenil/a naslov e-pošte uporabnika %{target}"
+        confirm_user_html: "%{name} je potrdil/a naslov e-pošte uporabnika %{target}"
+        create_account_warning_html: "%{name} je poslal/a opozorilo %{target}"
+        create_announcement_html: "%{name} je ustvarila/a novo obvestilo %{target}"
+        create_custom_emoji_html: "%{name} je posodobil/a emotikone %{target}"
+        create_domain_allow_html: "%{name} je dovolil/a federacijo z domeno %{target}"
+        create_domain_block_html: "%{name} je blokiral/a domeno %{target}"
+        create_email_domain_block_html: "%{name} je dal/a na črni seznam e-pošto domene %{target}"
+        create_ip_block_html: "%{name} je ustvaril/a pravilo za IP %{target}"
+        create_unavailable_domain_html: "%{name} je prekinil/a dostavo v domeno %{target}"
+        demote_user_html: "%{name} je ponižal/a uporabnika %{target}"
+        destroy_announcement_html: "%{name} je izbrisal/a obvestilo %{target}"
+        destroy_custom_emoji_html: "%{name} je uničil/a emotikone %{target}"
+        destroy_domain_allow_html: "%{name} ni dovolil/a federacije z domeno %{target}"
+        destroy_domain_block_html: "%{name} je odblokiral/a domeno %{target}"
+        destroy_email_domain_block_html: "%{name} je odblokiral/a e-pošto domene %{target}"
+        destroy_instance_html: "%{name} je očistil/a domeno %{target}"
+        destroy_ip_block_html: "%{name} je izbrisal/a pravilo za IP %{target}"
+        destroy_status_html: "%{name} je odstranil/a objavo uporabnika %{target}"
+        destroy_unavailable_domain_html: "%{name} je nadaljeval/a dostav v domeno %{target}"
+        disable_2fa_user_html: "%{name} je onemogočil/a dvofaktorsko zahtevo za uporabnika %{target}"
+        disable_custom_emoji_html: "%{name} je onemogočil/a emotikone %{target}"
+        disable_sign_in_token_auth_user_html: "%{name} je onemogočil/a overjanje z žetonom po e-pošti za uporabnika %{target}"
+        disable_user_html: "%{name} je onemogočil/a prijavo za uporabnika %{target}"
+        enable_custom_emoji_html: "%{name} je omogočil/a emotikone %{target}"
+        enable_sign_in_token_auth_user_html: "%{name} je omogočil/a overjanje z žetonom po e-pošti za uporabnika %{target}"
+        enable_user_html: "%{name} je omogočil/a prijavo za uporabnika %{target}"
+        memorialize_account_html: "%{name} je spremenil/a račun uporabnika %{target} v spominsko stran"
+        promote_user_html: "%{name} je povišal/a uporabnika %{target}"
+        reject_appeal_html: "%{name} je zavrnil/a pritožbo uporabnika %{target} na moderatorsko odločitev"
+        reject_user_html: "%{name} je zavrnil/a registracijo iz %{target}"
+        remove_avatar_user_html: "%{name} je odstranil podobo (avatar) uporabnika %{target}"
+        reopen_report_html: "%{name} je ponovno odprl/a prijavo %{target}"
+        reset_password_user_html: "%{name} je ponastavil/a geslo uporabnika %{target}"
+        resolve_report_html: "%{name} je razrešil/a prijavo %{target}"
+        sensitive_account_html: "%{name} je označil/a medije računa %{target}'s kot občutljive"
+        silence_account_html: "%{name} je omejil/a račun uporabnika %{target}"
+        suspend_account_html: "%{name} je suspendiral/a račun uporabnika %{target}"
+        unassigned_report_html: "%{name} je preklical dodelitev prijave uporabnika %{target}"
+        unblock_email_account_html: "%{name} je odblokiral/a e-poštni naslov uporabnika %{target}"
+        unsensitive_account_html: "%{name} je odznačil/a medije računa %{target}'s kot občutljive"
+        unsilence_account_html: "%{name} je preklical omejitev računa %{target}"
+        unsuspend_account_html: "%{name} je preklical suspenz računa %{target}"
+        update_announcement_html: "%{name} je posodobil/a objavo %{target}"
+        update_custom_emoji_html: "%{name} je posodobil/a emotikone %{target}"
+        update_domain_block_html: "%{name} je posodobil/a domenski blok za %{target}"
+        update_status_html: "%{name} je posodobil/a objavo uporabnika %{target}"
+      deleted_status: "(izbrisana objava)"
+      empty: Ni najdenih zapisnikov.
       filter_by_action: Filtriraj po dejanjih
       filter_by_user: Filtriraj po uporabnikih
       title: Dnevnik revizije
@@ -238,8 +358,12 @@ sl:
         title: Novo obvestilo
       publish: Objavi
       published_msg: Obvestilo je bilo uspešno objavljeno!
+      scheduled_for: Načrtovano ob %{time}
+      scheduled_msg: Obvestilo ima načrtovano objavo!
       title: Obvestila
       unpublish: Umakni iz objave
+      unpublished_msg: Obvestilo je bilo uspešno umaknjeno!
+      updated_msg: Obvestilo je bilo uspešno posodobljeno!
     custom_emojis:
       assign_category: Dodeli kategorijo
       by_domain: Domena
@@ -262,11 +386,13 @@ sl:
       listed: Navedeno
       new:
         title: Dodaj nove emotikone
+      not_permitted: Nimate pravic za izvedbo tega dejanja.
       overwrite: Prepiši
       shortcode: Kratka koda
       shortcode_hint: Najmanj 2 znaka, samo alfanumerični znaki in podčrtaji
       title: Emotikoni po meri
       uncategorized: Brez kategorije
+      unlist: Ne prikaži na seznamu
       unlisted: Neuvrščeni
       update_failed_msg: Tega emotikona ni bilo mogoče posodobiti
       updated_msg: Emotikon je uspešno posodobljen!
@@ -274,12 +400,41 @@ sl:
     dashboard:
       active_users: dejavnih uporabnikov
       interactions: interakcij
+      media_storage: Shramba za medije
       new_users: novih uporabnikov
-      opened_reports: odprtih poročil
+      opened_reports: odprtih prijav
+      pending_appeals_html:
+        few: "<strong>%{count}</strong> čakajoče pritožbe"
+        one: "<strong>%{count}</strong> čakajoča pritožba"
+        other: "<strong>%{count}</strong> čakajočih pritožb"
+        two: "<strong>%{count}</strong> čakajoči pritožbi"
+      pending_reports_html:
+        few: "<strong>%{count}</strong> čakajoče prijave"
+        one: "<strong>%{count}</strong> čakajoča prijava"
+        other: "<strong>%{count}</strong> čakajočih prijav"
+        two: "<strong>%{count}</strong> čakajoči prijavi"
+      pending_tags_html:
+        few: "<strong>%{count}</strong> čakajoči ključniki"
+        one: "<strong>%{count}</strong> čakajoči ključnik"
+        other: "<strong>%{count}</strong> čakajočih ključnikov"
+        two: "<strong>%{count}</strong> čakajoča ključnika"
+      pending_users_html:
+        few: "<strong>%{count}</strong> čakajoči uporabniki"
+        one: "<strong>%{count}</strong> čakajoči uporabnik"
+        other: "<strong>%{count}</strong> čakajočih uporabnikov"
+        two: "<strong>%{count}</strong> čakajoča uporabnika"
+      resolved_reports: razrešenih prijav
       software: Programska oprema
+      sources: Viri registracij
       space: Uporaba prostora
       title: Nadzorna plošča
+      top_languages: Najbolj dejavni jeziki
+      top_servers: Najbolj dejavni strežniki
       website: Spletišče
+    disputes:
+      appeals:
+        empty: Ni najdenih pritožb.
+        title: Pritožbe
     domain_allows:
       add_new: Dodaj domeno na beli seznam
       created_msg: Domena je bila uspešno dodana na beli seznam
@@ -301,15 +456,25 @@ sl:
           silence: Utišaj
           suspend: Suspendiraj
         title: Nov domenski blok
+      obfuscate: Zakrij ime domene
+      obfuscate_hint: Delno zakrij ime domene na seznamu, če je omogočeno oglaševanje omejitev seznama domen
       private_comment: Zasebni komentar
+      private_comment_hint: Komentar o tej omejitvi domene za interno uporabo moderatorjev.
       public_comment: Javni komentar
+      public_comment_hint: Komentar o tej omejitvi domene za širšo javnost, če je omogočeno oglaševanje seznama omejitev domene.
       reject_media: Zavrni predstavnostne datoteke
       reject_media_hint: Odstrani lokalno shranjene predstavnostne datoteke in zavrača prenašanje le-teh v prihodnosti. Za suspenzije ni pomembno
       reject_reports: Zavrnjene prijave
       reject_reports_hint: Prezri vse prijave, ki pridejo iz te domene. Za suspenzije ni pomembno
       undo: Razveljavi domenski blok
+      view: Pokaži domenski blok
     email_domain_blocks:
       add_new: Dodaj novo
+      attempts_over_week:
+        few: "%{count} poskusi prijave zadnji teden"
+        one: "%{count} poskus prijave zadnji teden"
+        other: "%{count} poskusov prijave zadnji teden"
+        two: "%{count} poskusa prijave zadnji teden"
       created_msg: Domena e-pošte je bila uspešno dodana na črni seznam
       delete: Izbriši
       dns:
@@ -321,26 +486,44 @@ sl:
         resolve: Razreši domeno
         title: Nov vnos e-pošte na črni seznam
       no_email_domain_block_selected: Nobena domena e-računa ni bila spremenjena, ker nobena ni bila izbrana
+      resolved_dns_records_hint_html: Ime domene se razreši na naslednje domene MX, ki so končno odgovorne za sprejemanje e-pošte. Blokiranje domene MX bo blokiralo prijave s poljubnega e-poštnega naslova, ki uporablja isto domeno MX, tudi če je vidno ime domene drugačno. <strong>Pazite, da ne blokirate večjih ponudnikov e-pošte.</strong>
       resolved_through_html: Razrešeno prek %{domain}
       title: Črni seznam e-pošt
     follow_recommendations:
+      description_html: "<strong>Sledi priporočilom pomaga novim uporabnikom, da hitro najdejo zanimivo vsebino</strong>. Če uporabnik ni dovolj komuniciral z drugimi, da bi oblikoval prilagojena priporočila za sledenje, se namesto tega priporočajo ti računi. Dnevno se ponovno izračunajo iz kombinacije računov z najvišjimi nedavnimi angažiranostmi in najvišjim številom krajevnih sledilcev za določen jezik."
       language: Za jezik
       status: Stanje
+      suppress: Zatri sledenje priporočilom
+      suppressed: Zatrto
+      title: Sledi priporočilom
+      unsuppress: Obnovi sledenje priporočilom
     instances:
       availability:
+        description_html:
+          few: Če dostava v domeno spodleti <strong>%{count} različne dni</strong> brez uspeha, ne bo nadaljnjih poskusov dostopa, razen če je prejeta dostava <em>iz</em> domene.
+          one: Če dostava v domeno spodleti <strong>%{count} dan</strong> brez uspeha, ne bo nadaljnjih poskusov dostopa, razen če je prejeta dostava <em>iz</em> domene.
+          other: Če dostava v domeno spodleti <strong>%{count} različne dni</strong> brez uspeha, ne bo nadaljnjih poskusov dostopa, razen če je prejeta dostava <em>iz</em> domene.
+          two: Če dostava v domeno spodleti <strong>%{count} različna dneva</strong> brez uspeha, ne bo nadaljnjih poskusov dostopa, razen če je prejeta dostava <em>iz</em> domene.
         failure_threshold_reached: Prag neuspelih poskusov dosežen %{date}.
+        failures_recorded:
+          few: Neuspeli poskusi %{count} različnih dni.
+          one: Neuspel poskus %{count} različen dan.
+          other: Neuspeli poskusi %{count} različnih dni.
+          two: Neuspeli poskusi %{count} različnih dni.
         no_failures_recorded: Ni zabeleženih neuspelih poskusov.
         title: Razpoložljivost
+        warning: Zadnji poskus povezave na ta strežnik je spodletel
       back_to_all: Vse
       back_to_limited: Omejeno
       back_to_warning: Opozorilo
       by_domain: Domena
+      confirm_purge: Ali ste prepričani, da želite trajno izbrisati podatke s te domene?
       content_policies:
         comment: Interna opomba
         description_html: Določite lahko pravila (t.i. politike), ki bodo veljale za vse račune te domene ter vseh njenih poddomen.
         policies:
           reject_media: Zavrni večpredstavnost
-          reject_reports: Zarvni poročila
+          reject_reports: Zavrni prijave
           silence: Omeji
           suspend: Suspendiraj
         policy: Pravila
@@ -353,26 +536,38 @@ sl:
         instance_follows_measure: njihovih sledilcev tukaj
         instance_languages_dimension: Naj jeziki
         instance_media_attachments_measure: shranjenih predstavnostnih priponk
-        instance_reports_measure: poročil o njih
+        instance_reports_measure: prijav o njih
         instance_statuses_measure: shanjenih objav
       delivery:
         all: Vse
         clear: Počisti napake dostave
+        failing: Spodletuje
+        restart: Ponovno zaženi dostavo
         stop: Ustavi dostavo
         unavailable: Ni na voljo
       delivery_available: Na voljo je dostava
+      delivery_error_days: Dnevi napak pri dostavi
+      delivery_error_hint: Če dostava ni možna %{count} dni, bo samodejno označeno kot nedostavljivo.
+      destroyed_msg: Podatki iz %{domain} so zdaj v vrsti za takojšnje brisanje.
+      empty: Ni zadetkov med domenami.
+      known_accounts:
+        few: "%{count} znani računi"
+        one: "%{count} znan račun"
+        other: "%{count} znani računi"
+        two: "%{count} znana računa"
       moderation:
         all: Vse
         limited: Omejeno
         title: Moderiranje
       private_comment: Zasebni komentar
       public_comment: Javni komentar
+      purge: Očisti
       purge_description_html: Če menite, da je ta domena trajno nedosegljiva, lahko v svoji shrambi izbrišete vse zapise računov in povezane podatke iz te domene. To lahko vzame nekaj časa.
       title: Federacija
       total_blocked_by_us: Blokirano iz naše strani
       total_followed_by_them: Oni ti sledijo
       total_followed_by_us: Mi ti sledimo
-      total_reported: Poročila o njih
+      total_reported: Prijave o njih
       total_storage: Predstavnostne priloge
       totals_time_period_hint_html: Spodaj prikazani seštevki vključujejo podatke za celotno obdobje.
     invites:
@@ -381,9 +576,11 @@ sl:
         all: Vse
         available: Razpoložljivo
         expired: Potekel
+        title: Filter
       title: Povabila
     ip_blocks:
       add_new: Ustvari pravilo
+      created_msg: Uspešno dodano novo pravilo IP
       delete: Izbriši
       expires_in:
         '1209600': 2 tedna
@@ -394,36 +591,63 @@ sl:
         '94670856': 3 leta
       new:
         title: Ustvari novo pravilo IP
+      no_ip_block_selected: Nobeno pravilo IP ni bilo spremenjeno, ker nobeno ni bilo izbrano
       title: IP-pravila
+    relationships:
+      title: Odnosi računa %{acct}
     relays:
       add_new: Dodaj nov rele
       delete: Izbriši
-      description_html: "<strong>Rele federacije</strong> je posredniški strežnik, ki si izmenjuje velike količine javnih tutov med strežniki, ki so se naročili in objavili na njem. <strong>Majhnim in srednjim strežnikom lahko pomaga pri odkrivanju vsebine iz sistema fediverse</strong>, kar bi sicer zahtevalo, da lokalni uporabniki ročno sledijo druge osebe na oddaljenih strežnikih."
+      description_html: "<strong>Rele federacije</strong> je posredniški strežnik, ki si izmenjuje velike količine javnih objav med strežniki, ki so se naročili in objavili na njem. <strong>Majhnim in srednjim strežnikom lahko pomaga pri odkrivanju vsebine iz sistema fediverse</strong>, kar bi sicer zahtevalo, da lokalni uporabniki ročno sledijo druge osebe na oddaljenih strežnikih."
       disable: Onemogoči
       disabled: Onemogočeno
       enable: Omogoči
-      enable_hint: Ko je omogočen, se bo vaš strežnik naročil na vse javne tute iz tega releja in začel pošiljati javne tute tega strežnika.
+      enable_hint: Ko je omogočen, se bo vaš strežnik naročil na vse javne objave iz tega releja in začel pošiljati javne objave tega strežnika.
       enabled: Omogočeno
       inbox_url: URL releja
       pending: Čakanje na odobritev releja
       save_and_enable: Shrani in omogoči
       setup: Nastavi povezavo releja
+      signatures_not_enabled: Posredovanja ne bodo delovala pravilno, ko je omogočen varni način ali omejen način federacije
       status: Stanje
       title: Releji
     report_notes:
       created_msg: Opomba o prijavi je uspešno ustvarjena!
       destroyed_msg: Opomba o prijavi je uspešno izbrisana!
+      today_at: Danes ob %{time}
     reports:
+      account:
+        notes:
+          few: "%{count} opombe"
+          one: "%{count} opomba"
+          other: "%{count} opomb"
+          two: "%{count} opombi"
+      action_log: Revizijski zapisnik
       action_taken_by: Dejanje, ki ga je sprejel
+      actions:
+        delete_description_html: Prijavljene objave bodo izbrisane in ukrep bo zabeležen, da vam pomaga stopnjevati ukrepe ob naslednjih kršitvah z istega računa.
+        mark_as_sensitive_description_html: Mediji v prijavljenih objavah bodo označeni kot občutljivi in ukrep bo zabeležen, da vam pomaga stopnjevati ukrepe ob naslednjih kršitvah z istega računa.
+        other_description_html: Oglejte si več možnosti za nadzor vedenja računa in prilagodite komunikacijo s prijavljenim računom.
+        resolve_description_html: Proti prijavljenemu računu ne bo izvedeno nobeno dejanje, noben ukrep ne bo zabeležen in prijava bo zaprta.
+        silence_description_html: Profil bo viden samo tistim, ki mu že sledijo ali ga ročno poiščejo, s čimer bo resno omejen njegov doseg. To je vedno možno povrniti.
+        suspend_description_html: Profil in vsa njegova vsebina bodo postali nedosegljivi, dokler niso dokončno izbrisani. Interakcija z računom ne bo možna. Povrnitev je možna v času 30 dni.
+      actions_description_html: Odločite se, katere ukrepe boste sprejeli za rešitev te prijave. Če sprejmete kazenski ukrep proti prijavljenemu računu, mu bo poslano e-poštno obvestilo, razen če je izbrana kategorija <strong>Neželena pošta</strong>.
+      add_to_report: Dodaj več v prijavo
       are_you_sure: Ali ste prepričani?
       assign_to_self: Dodeli meni
       assigned: Dodeljen moderator
+      by_target_domain: Domena prijavljenega računa
       category: Kategorija
+      category_description_html: Razlog, zakaj je ta račun in/ali vsebina prijavljena, bo naveden v komunikaciji z računom iz prijave
       comment:
         none: Brez
+      comment_description_html: 'V pojasnilo je %{name} zapisal/a:'
       created_at: Prijavljeno
       delete_and_resolve: Izbriši objave
+      forwarded: Posredovano
+      forwarded_to: Posredovano na %{domain}
       mark_as_resolved: Označi kot rešeno
+      mark_as_sensitive: Označi, kot občutljivo
       mark_as_unresolved: Označi kot nerešeno
       no_one_assigned: Nihče
       notes:
@@ -431,17 +655,22 @@ sl:
         create_and_resolve: Razreši z opombo
         create_and_unresolve: Ponovo odpri z opombo
         delete: Izbriši
-        placeholder: Opišite dejanja, ki ste jih izvedli, ali katere koli druge posodobitve...
+        placeholder: Opišite dejanja, ki ste jih izvedli, ali katere koli druge posodobitve ...
         title: Zapiski
-      quick_actions_description_html: 'Opravite hitro dejanje ali podrsajte navzdol, da si ogledate poročano vsebino:'
+      notes_description_html: Pokaži in pusti opombe drugim moderatorjem in sebi v prihodnosti
+      quick_actions_description_html: 'Opravite hitro dejanje ali podrsajte navzdol, da si ogledate prijavljeno vsebino:'
+      remote_user_placeholder: oddaljeni uporabnik iz %{instance}
       reopen: Ponovno odpri prijavo
       report: 'Prijavi #%{id}'
       reported_account: Prijavljeni račun
-      reported_by: Prijavljen od
+      reported_by: Prijavil/a
       resolved: Razrešeni
       resolved_msg: Prijava je uspešno razrešena!
       skip_to_actions: Preskoči na dejanja
       status: Stanje
+      statuses: Prijavljena vsebina
+      statuses_description_html: Žaljiva vsebina bo citirana v komunikaciji z računom iz prijave
+      target_origin: Izvor prijavljenega računa
       title: Prijave
       unassign: Odstopljeni
       unresolved: Nerešeni
@@ -450,12 +679,13 @@ sl:
     rules:
       add_new: Dodaj pravilo
       delete: Izbriši
+      description_html: Večina trdi, da so prebrali in da se strinjajo s pogoji rabe storitve, vendar le-teh ponavadi ne preberejo, dokler ne pride do težav. <strong>Poenostavite in naredite pravila svojega strežnika vidna na prvi pogled tako, da jih izpišete v označenem seznamu.</strong>Posamezna pravila skušajte ohraniti kratka in enostavna, ne razbijajte pa jih v preveč različnih točk.
       edit: Uredi pravilo
       empty: Zaenkrat še ni opredeljenih pravil.
       title: Pravila strežnika
     settings:
       activity_api_enabled:
-        desc_html: Številke lokalno objavljenih stanj, aktivnih uporabnikov in novih registracij na tedenskih seznamih
+        desc_html: Številke lokalno objavljenih objav, aktivnih uporabnikov in novih registracij na tedenskih seznamih
         title: Objavi združeno statistiko o dejavnosti uporabnikov
       bootstrap_timeline_accounts:
         desc_html: Več uporabniških imen ločite z vejico. Deluje samo na lokalnih in odklenjenih računih. Privzeto, ko je prazno, je pri vseh lokalnih skrbnikih.
@@ -466,6 +696,16 @@ sl:
       custom_css:
         desc_html: Spremeni videz z naloženim CSS na vsaki strani
         title: CSS po meri
+      default_noindex:
+        desc_html: Vpliva na vse uporabnike, ki niso sami spremenili te nastavitve
+        title: Privzeto izvzemi uporabnike iz indeksiranja iskalnika
+      domain_blocks:
+        all: Vsem
+        disabled: Nikomur
+        title: Domenske bloke pokaži
+        users: Prijavljenim krajevnim uporabnikom
+      domain_blocks_rationale:
+        title: Pokaži razlago
       hero:
         desc_html: Prikazano na sprednji strani. Priporoča se vsaj 600x100px. Ko ni nastavljen, se vrne na sličico strežnika
         title: Slika junaka
@@ -491,6 +731,9 @@ sl:
         min_invite_role:
           disabled: Nihče
           title: Dovoli vabila od
+        require_invite_text:
+          desc_html: Če registracije zahtevajo ročno potrditev, nastavite vnos besedila pod »Zakaj se želite pridružiti?« za obveznega
+          title: Zahteva, da novi uprorabniki navedejo razlog, zakaj se želijo registrirati
       registrations_mode:
         modes:
           approved: Potrebna je odobritev za prijavo
@@ -498,7 +741,7 @@ sl:
           open: Vsakdo se lahko prijavi
         title: Način registracije
       show_known_fediverse_at_about_page:
-        desc_html: Ko preklopite, bo prikazal tute vseh znanih fediverse-ov v predogledu. V nasprotnem primeru bodo prikazani samo lokalni tuti.
+        desc_html: Ko preklopite, bo prikazal objave vseh znanih fediverzumov v predogledu. V nasprotnem primeru bodo prikazane samo krajevne objave.
         title: Pokaži znane fediverse-e v predogledu časovnice
       show_staff_badge:
         desc_html: Prikaži značko osebja na uporabniški strani
@@ -523,18 +766,54 @@ sl:
         desc_html: Prikaži javno časovnico na ciljni strani
         title: Predogled časovnice
       title: Nastavitve strani
+      trendable_by_default:
+        desc_html: Velja za ključnike, ki niso bili poprej onemogočeni
+        title: Dovoli, da so ključniki v trendu brez predhodnega pregleda
       trends:
+        desc_html: Javno prikaži poprej pregledano vsebino, ki je trenutno v trendu
         title: Trendi
+    site_uploads:
+      delete: Izbriši naloženo datoteko
+      destroyed_msg: Prenos na strežnik uspešno izbrisan!
     statuses:
       back_to_account: Nazaj na stran računa
+      back_to_report: Nazaj na stran prijave
       batch:
-        remove_from_report: Odstrani iz poročila
+        remove_from_report: Odstrani iz prijave
+        report: Poročaj
       deleted: Izbrisano
       media:
         title: Mediji
-      no_status_selected: Nobeno stanje ni bilo spremenjeno, ker ni bilo izbrano nobeno
-      title: Stanja računa
+      no_status_selected: Nobena objava ni bila spremenjena, ker ni bila nobena izbrana
+      title: Objave računa
       with_media: Z mediji
+    strikes:
+      actions:
+        delete_statuses: "%{name} je izbrisal/a objave uporabnika %{target}"
+        disable: "%{name} je zamrznil/a račun uporabnika %{target}"
+        mark_statuses_as_sensitive: "%{name} je označil/a objave računa %{target} kot občutljive"
+        none: "%{name} je poslal/a opozorilo %{target}"
+        sensitive: "%{name} je označil/a račun %{target} kot občutljiv"
+        silence: "%{name} je omejil/a račun uporabnika %{target}"
+        suspend: "%{name} je suspendiral/a račun uporabnika %{target}"
+      appeal_approved: Pritoženo
+      appeal_pending: Čakajoč na ugovor
+    system_checks:
+      database_schema_check:
+        message_html: Na čakanju so migracije zbirke podatkov. Prosimo, izvedite jih, da zagotovite, da se program vede pričakovano
+      elasticsearch_running_check:
+        message_html: Povezava z Elasticsearch ni uspela. Preverite, da deluje, ali onemogočite iskanje po vsem besedilu
+      elasticsearch_version_check:
+        message_html: 'Nezdružljiva različica Elasticsearch: %{value}'
+        version_comparison: Izvaja se Elasticsearch %{running_version}, zahtevana pa je različica %{required_version}
+      rules_check:
+        action: Upravljaj pravila strežnika
+        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
+    tags:
+      review: Stanje pregleda
+      updated_msg: Nastavitve ključnikov uspešno posodobljene
     title: Upravljanje
     trends:
       allow: Dovoli
@@ -542,21 +821,83 @@ sl:
       disallow: Ne dovoli
       links:
         allow: Dovoli povezavo
+        allow_provider: Dovoli izdajatelja
+        description_html: To so povezave, ki jih trenutno veliko delijo računi, iz katerih vaš strežnik vidi objave. Vašim uporabnikom lahko pomaga izvedeti, kaj se dogaja po svetu. Nobene povezave niso javno prikazane, dokler ne odobrite izdajatelja. Posamezne povezave lahko tudi dovolite ali zavrnete.
+        disallow: Ne dovoli povezave
+        disallow_provider: Ne dovoli izdajatelja
+        shared_by_over_week:
+          few: Delile %{count} osebe v zadnjem tednu
+          one: Delila %{count} oseba v zadnjem tednu
+          other: Delilo %{count} oseb v zadnjem tednu
+          two: Delili %{count} osebi v zadnjem tednu
+        title: Povezave v trendu
+        usage_comparison: Danes deljeno %{today}-krat, včeraj pa %{yesterday}-krat
+      only_allowed: Samo dovoljeni
       pending_review: Čakajoče na pregled
+      preview_card_providers:
+        allowed: Povezave tega izdajatelja so lahko v trendu
+        description_html: To so domene, iz katerih se povezave pogosto delijo na vašem strežniku. Povezave ne bodo javno objavljene, razen če je domena povezave odobrena. Vaša odobritev (ali zavrnitev) se nanaša na poddomene.
+        rejected: Povezave tega izdajatelja ne bodo v trendu
+        title: Izdajatelji
+      rejected: Zavrnjen
+      statuses:
+        allow: Dovoli objavo
+        allow_account: Dovoli avtorja
+        description_html: To so objave, za katere vaš strežnik ve, da so trenutno v skupni rabi in med priljubljenimi. Vašim novim uporabnikom in uporabnikom, ki se vračajo, lahko pomaga najti več oseb, ki jim bodo sledili. Nobena objava ni javno prikazana, dokler avtorja ne odobrite in avtor ne dovoli, da se njegov račun predlaga drugim. Posamezne objave lahko tudi dovolite ali zavrnete.
+        disallow: Ne dovoli objave
+        disallow_account: Ne dovoli avtorja
+        not_discoverable: Avtor ni dovolil, da bi ga bilo moč odkriti
+        shared_by:
+          few: Deljeno ali priljubljeno %{friendly_count}-krat
+          one: Deljeno ali priljubljeno %{friendly_count}-krat
+          other: Deljeno ali priljubljeno %{friendly_count}-krat
+          two: Deljeno ali priljubljeno %{friendly_count}-krat
+        title: Trendne objave
       tags:
+        current_score: Trenutni rezultat %{score}
         dashboard:
+          tag_accounts_measure: enkratnih uporab
           tag_languages_dimension: Naj jeziki
           tag_servers_dimension: Naj strežniki
+          tag_servers_measure: različnih strežnikov
+          tag_uses_measure: uporab skupaj
+        description_html: To so ključniki, ki se trenutno pojavljajo v številnih objavah, ki jih vidi vaš strežnik. Uporabnikom lahko pomaga ugotoviti, o čem ljudje trenutno največ govorijo. Noben ključnik ni javno prikazan, dokler ga ne odobrite.
+        listable: Je moč predlagati
+        not_listable: Ne bo predlagano
+        not_trendable: Se ne bo pojavilo med trendi
+        not_usable: Ni mogoče uporabiti
+        peaked_on_and_decaying: Vrh dne %{date}, zdaj v upadu
+        title: Ključniki v trendu
+        trendable: Se lahko pojavi med trendi
+        trending_rank: 'V trendu #%{rank}'
+        usable: Je moč uporabiti
+        usage_comparison: Danes uporabljeno %{today}-krat, včeraj pa %{yesterday}-krat
+        used_by_over_week:
+          few: Uporabile %{count} osebe v zadnjem tednu
+          one: Uporabila %{count} oseba v zadnjem tednu
+          other: Uporabilo %{count} oseb v zadnjem tednu
+          two: Uporabili %{count} osebi v zadnjem tednu
       title: Trendi
+      trending: V porastu
     warning_presets:
       add_new: Dodaj novo
       delete: Izbriši
       edit_preset: Uredi prednastavitev opozoril
+      empty: Zaenkrat še niste določili nobenih opozorilnih prednastavitev.
       title: Upravljaj prednastavitev opozoril
   admin_mailer:
     new_appeal:
       actions:
+        delete_statuses: brisanje njihovih objav,
+        disable: zamrznitev njihovega računa,
+        mark_statuses_as_sensitive: označitev njihovih objav kot občutljivih,
         none: opozorilo
+        sensitive: označitev njihovega računa kot občutljivega,
+        silence: omejitev njihovega računa,
+        suspend: suspenz njihovega računa,
+      body: "%{target} se pritožuje na moderatorsko odločitev %{action_taken_by} z dne %{date}, ki je bila %{type}. Zapisal/a je:"
+      next_steps: Pritožbi lahko ugodite in s tem razveljavite moderatorsko odločitev ali pa jo prezrete.
+      subject: "%{username} se je pritožil na moderatorsko odločitev na %{instance}"
     new_pending_account:
       body: Podrobnosti o novem računu so navedene spodaj. To aplikacijo lahko odobrite ali zavrnete.
       subject: Nov račun za pregled na %{instance} (%{username})
@@ -564,22 +905,47 @@ sl:
       body: "%{reporter} je prijavil %{target}"
       body_remote: Nekdo iz %{domain} je prijavil %{target}
       subject: Nove prijave za %{instance} (#%{id})
+    new_trends:
+      body: 'Naslednji elementi potrebujejo pregled, preden jih je možno javno prikazati:'
+      new_trending_links:
+        no_approved_links: Trenutno ni odobrenih povezav v trendu.
+        requirements: Vsak od teh kandidatov bi lahko presegel odobreno povezavo v trendu št. %{rank}, ki je trenutno %{lowest_link_title} z rezultatom %{lowest_link_score}.
+        title: Povezave v trendu
+      new_trending_statuses:
+        no_approved_statuses: Trenutno ni odobrenih objav v trendu.
+        requirements: Vsak od teh kandidatov bi lahko presegel odobreno trendno objavo št. %{rank}, ki je trenutno %{lowest_status_url} z rezultatom %{lowest_status_score}.
+        title: Trendne objave
+      new_trending_tags:
+        no_approved_tags: Trenutno ni odobrenih ključnikov v trendu.
+        requirements: Vsak od teh kandidatov bi lahko presegel odobreni ključnik v trendu št. %{rank}, ki je trenutno %{lowest_tag_name} z rezultatom %{lowest_tag_score}.
+        title: Ključniki v trendu
+      subject: Novi trendi za pregled na %{instance}
+  aliases:
+    add_new: Ustvari vzdevek
+    created_msg: Uspešno ustvarjen novi vzdevek. Zdaj lahko pričnete s selitvijo s starega računa.
+    deleted_msg: Uspešno odstranjen vzdevek. Selitev iz tistega računa na tega ne bo več možna.
+    empty: Nimate vzdevkov.
+    hint_html: Če se želite preseliti iz drugega računa v tega, lahko tukaj ustvarite vzdevek, ki je potreben, preden lahko nadaljujete s selitvijo sledilcev iz starega računa v tega. To dejanje je samo po sebi <strong>neškodljivo in povratno</strong>. <strong>Selitev računa sprožite iz starega računa</strong>.
+    remove: Razveži vzdevek
   appearance:
     advanced_web_interface: Napredni spletni vmesnik
     advanced_web_interface_hint: 'Če želite uporabiti celotno širino zaslona, vam napredni spletni vmesnik omogoča, da si nastavite več različnih stolpcev in da si hkrati ogledate toliko informacij, kot želite: domačo stran, obvestila, združeno časovnico, poljubno število seznamov in ključnikov.'
     animations_and_accessibility: Animacije in dostopnost
     confirmation_dialogs: Potrditvena okna
+    discovery: Odkrito
     localization:
       body: Mastodon prevajamo prostovoljci.
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Vsakdo lahko prispeva.
     sensitive_content: Občutljiva vsebina
+    toot_layout: Postavitev objave
   application_mailer:
     notification_preferences: Spremenite e-poštne nastavitve
+    salutation: "%{name},"
     settings: 'Spremenite e-poštne nastavitve: %{link}'
     view: 'Pogled:'
     view_profile: Ogled profila
-    view_status: Ogled stanja
+    view_status: Pokaži objavo
   applications:
     created: Aplikacija je bila uspešno ustvarjena
     destroyed: Aplikacija je bila uspešno izbrisana
@@ -595,9 +961,16 @@ sl:
     checkbox_agreement_without_rules_html: Strinjam se s <a href="%{terms_path}" target="_blank">pogoji storitve</a>
     delete_account: Izbriši račun
     delete_account_html: Če želite izbrisati svoj račun, lahko nadaljujete <a href="%{path}">tukaj</a>. Prosili vas bomo za potrditev.
+    description:
+      prefix_invited_by_user: "@%{name} vas vabi, da se pridružite temu strežniku Mastodon!"
+      prefix_sign_up: Še danes se priključite Mastodonu!
+      suffix: Z računom boste lahko sledili osebam, objavljali posodobitve in izmenjevali sporočila z uporabniki s poljubnega strežnika Mastodon in še veliko več!
     didnt_get_confirmation: Niste prejeli navodil za potrditev?
+    dont_have_your_security_key: Ali imate svoj varnostni ključ?
     forgot_password: Ste pozabili svoje geslo?
     invalid_reset_password_token: Žeton za ponastavitev gesla je neveljaven ali je potekel. Zahtevajte novo.
+    link_to_otp: Vnesite dvofaktorsko kodo s svojega telefona ali obnovitveno kodo
+    link_to_webauth: Vnesite svojo napravo za varnostni ključ
     log_in_with: Prijavi se s
     login: Prijava
     logout: Odjava
@@ -622,10 +995,14 @@ sl:
       confirming: Čakanje na potrditev e-pošte.
       functional: Vaš račun je polno opravilen.
       pending: Naše osebje preverja vašo prijavo. To lahko traja nekaj časa. Če bo vaša prijava odobrena, boste prejeli e-pošto.
+      redirecting_to: Vaš račun ni dejaven, ker trenutno preusmerja na račun %{acct}.
+      view_strikes: Pokaži pretekle ukrepe proti mojemu računu
+    too_fast: Obrazec oddan prehitro, poskusite znova.
     trouble_logging_in: Težave pri prijavi?
     use_security_key: Uporabi varnostni ključ
   authorize_follow:
     already_following: Temu računu že sledite
+    already_requested: Temu računu ste že poslali zahtevo po sledenju
     error: Na žalost je prišlo do napake pri iskanju oddaljenega računa
     follow: Sledi
     follow_request: 'Prošnjo za sledenje se poslali:'
@@ -637,32 +1014,89 @@ sl:
     title: Sledi %{acct}
   challenge:
     confirm: Nadaljuj
+    hint_html: "<strong>Namig:</strong> naslednjo uro vas ne bomo več vprašali po vašem geslu."
     invalid_password: Neveljavno geslo
     prompt: Potrdite geslo za nadaljevanje
+  crypto:
+    errors:
+      invalid_key: ni veljaven ključ Ed25519 ali Curve25519
+      invalid_signature: ni veljaven podpis Ed25519
+  date:
+    formats:
+      default: "%d %b %Y"
+      with_month_name: "%B %d %Y"
   datetime:
     distance_in_words:
+      about_x_hours: "%{count} u"
+      about_x_months: "%{count} m"
+      about_x_years: "%{count} l"
+      almost_x_years: "%{count} l"
       half_a_minute: Pravkar
+      less_than_x_minutes: "%{count} min"
       less_than_x_seconds: Pravkar
+      over_x_years: "%{count} l"
+      x_days: "%{count} d"
+      x_minutes: "%{count} min"
+      x_months: "%{count} m"
+      x_seconds: "%{count} s"
   deletes:
+    challenge_not_passed: Podatki, ki ste jih vnesli, niso pravilni
     confirm_password: Vnesite svoje trenutno geslo, da potrdite svojo identiteto
     confirm_username: Vnesite svoje uporabniško ime, da potrdite postopek
     proceed: Izbriši račun
     success_msg: Vaš račun je bil uspešno izbrisan
+    warning:
+      before: 'Pred nadaljevanjem previdno preberite naslednje opombe:'
+      caches: Vsebina, ki jo medpomnijo drugi strežniki, lahko vztraja
+      data_removal: Vaše objave in drugi podatki bodo trajno odstranjeni
+      email_change_html: <a href="%{path}">Svoj e-naslov lahko spremenite</a> brez izbrisa svojega računa
+      email_contact_html: Če še vedno ni dostavljeno, lahko za pomoč pošljete e-sporočilo na naslov <a href="mailto:%{email}">%{email}</a>
+      email_reconfirmation_html: Če niste prejeli potrditvenega e-sporočila, lahko <a href="%{path}">znova zaprosite zanj</a>
+      irreversible: Vašega računa ne boste mogli obnoviti ali ponovno aktivirati
+      more_details_html: Za podrobnosti glejte <a href="%{terms_path}">politiko zasebnosti</a>.
+      username_available: Vaše uporabniško ime bo znova na voljo
+      username_unavailable: Vaše uporabniško ime še vedno ne bo na voljo
   directories:
     directory: Imenik profilov
     explanation: Odkrijte uporabnike glede na njihove interese
     explore_mastodon: Razišči %{title}
   disputes:
     strikes:
+      action_taken: Izvedeno dejanje
+      appeal: Pritoži se
+      appeal_approved: Pritožba na ukrep je bila uspešna in ukrep ni več veljaven
+      appeal_rejected: Pritožba je bila zavržena
+      appeal_submitted_at: Pritožba oddana
+      appealed_msg: Vaša pritožba je oddana. Če bo odobrena, boste o tem obveščeni.
+      appeals:
+        submit: Pošlji pritožbo
+      approve_appeal: Ugodi pritožbi
+      associated_report: Povezana prijava
+      created_at: Datum
+      description_html: To so dejanja, izvedena proti vašemu računu ter opozorila, ki so vam jih poslali sodelavci %{instance}.
+      recipient: Naslovljeno na
+      reject_appeal: Zavrni pritožbo
+      status: 'Objava #%{id}'
+      status_removed: Objava je že odstranjena iz sistema
+      title: "%{action} dne %{date}"
       title_actions:
         delete_statuses: Odstranitev objave
+        disable: Zamrznitev računa
+        mark_statuses_as_sensitive: Označevanje objav kot občutljivih
         none: Opozorilo
+        sensitive: Označevanj računa kot občutljivega
         silence: Omejitev računa
+        suspend: Suspenz računa
+      your_appeal_approved: Vaša pritožba je bila odobrena
+      your_appeal_pending: Oddali ste pritožbo
+      your_appeal_rejected: Vaša pritožba je bila zavržena
+  domain_validator:
+    invalid_domain: ni veljavno ime domene
   errors:
-    '400': The request you submitted was invalid or malformed.
+    '400': Zahteva, ki ste jo oddali, je neveljavna ali nepravilno oblikovana.
     '403': Nimate dovoljenja za ogled te strani.
     '404': Iskana stran ne obstaja.
-    '406': This page is not available in the requested format.
+    '406': Ta stran ni na voljo v zahtevani obliki.
     '410': Iskana stran ne obstaja več.
     '422':
       content: Varnostno preverjanje ni uspelo. Ali blokirate piškotke?
@@ -671,7 +1105,7 @@ sl:
     '500':
       content: Žal nam je, toda na našem koncu je prišlo do napake.
       title: Ta stran ni pravilna
-    '503': The page could not be served due to a temporary server failure.
+    '503': Strani ni mogoče postreči zaradi začasne odpovedi strežnika.
     noscript_html: Če želite uporabljati spletno aplikacijo Mastodon, omogočite JavaScript. Druga možnost je, da za svojo platformo poskusite eno od <a href="%{apps_path}">lastnih aplikacij</a> za Mastodon.
   existing_username_validator:
     not_found: s tem uporabniškim imenom ni bilo mogoče najti lokalnega uporabnika
@@ -680,12 +1114,13 @@ sl:
     archive_takeout:
       date: Datum
       download: Prenesi svoj arhiv
-      hint_html: Zahtevate lahko arhiv vaših <strong>tutov in naloženih medijev</strong>. Izvoženi podatki bodo v formatu ActivityPub, ki ga bo mogoče brati s katerokoli skladno programsko opremo. Arhiv lahko zahtevate vsakih 7 dni.
+      hint_html: Zahtevate lahko arhiv vaših <strong>objav in naloženih medijev</strong>. Izvoženi podatki bodo v zapisu ActivityPub, ki ga bo mogoče brati s poljubno skladno programsko opremo. Arhiv lahko zahtevate vsakih 7 dni.
       in_progress: Prevajanje arhiva...
       request: Zahtevajte svoj arhiv
       size: Velikost
     blocks: Blokirate
     bookmarks: Zaznamki
+    csv: CSV
     domain_blocks: Bloki domene
     lists: Seznami
     mutes: Utišate
@@ -694,6 +1129,7 @@ sl:
     add_new: Dodaj novo
     errors:
       limit: Ste že dodali največje število ključnikov
+    hint_html: "<strong>Kaj so izpostavljeni ključniki?</strong> Prikazani so vidno na vašem javnem profilu in ljudem omogočajo brskanje po vaših javnih objavah posebej pod temi ključniki. So odlično orodje za spremljanje ustvarjalnih del ali dolgoročnih projektov."
   filters:
     contexts:
       account: Profili
@@ -708,6 +1144,7 @@ sl:
       invalid_irreversible: Nepovratno filtriranje deluje le v kontekstu doma ali obvestil
     index:
       delete: Izbriši
+      empty: Nimate filtrov.
       title: Filtri
     new:
       title: Dodaj nov filter
@@ -733,6 +1170,8 @@ sl:
   html_validator:
     invalid_markup: 'vsebuje neveljavno oznako HTML: %{error}'
   imports:
+    errors:
+      over_rows_processing_limit: vsebuje več kot %{count} vrstic
     modes:
       merge: Združi
       merge_long: Ohrani obstoječe zapise in dodaj nove
@@ -777,18 +1216,61 @@ sl:
       limit: Dosegli ste največje število seznamov
   login_activities:
     authentication_methods:
+      otp: aplikacija za dvoravenjsko overjanje
       password: geslo
+      sign_in_token: varnostna koda po e-pošti
       webauthn: varnostni ključi
+    description_html: Če opazite dejavnost, ki je ne prepoznate kot svoje, razmislite o spremembi svojega gesla in omogočanju dvoravenskega overjanja.
+    empty: Zgodovina overjanja ni na voljo
+    failed_sign_in_html: Spodletela prijava z metodo %{method} iz %{ip} (%{browser})
+    successful_sign_in_html: Uspešna prijava z metodo %{method} iz %{ip} (%{browser})
+    title: Zgodovina overjanja
   media_attachments:
     validations:
-      images_and_video: Videoposnetka ni mogoče priložiti stanju, ki že vsebuje slike
+      images_and_video: Videoposnetka ni mogoče priložiti objavi, ki že vsebuje slike
+      not_ready: Datotek, katerih obdelava ni dokončana, ni mogoče pripeti. Poskusite znova kmalu!
       too_many: Ni možno priložiti več kot 4 datoteke
   migrations:
     acct: username@domain novega računa
+    cancel: Prekliči preusmeritev
+    cancel_explanation: Preklic preusmeritve ponovno aktivira vaš trenutni račun, vendar ne povrne sledilcev, ki so bili preseljeni na tisti račun.
+    cancelled_msg: Preusmeritev je bila uspešno preklicana.
+    errors:
+      already_moved: je isti račun, na katerega ste se že preselili
+      missing_also_known_as: ni vzdevek za ta račun
+      move_to_self: ne more biti trenutni račun
+      not_found: ni mogoče najti
+      on_cooldown: Ste na ohlajanju
+    followers_count: Sledilcev ob času selitve
+    incoming_migrations: Selitev iz drugega računa
+    incoming_migrations_html: Če se želite preseliti iz drugega računa na tega, morate najprej <a href="%{path}">ustvariti vzdevek računa</a>.
+    moved_msg: Vaš račun se zdaj preusmerja na %{acct} in vaši sledilci so preseljeni.
+    not_redirecting: Vaš račun trenutno ne preusmerja na noben drug račun.
+    on_cooldown: Nedavno ste migrirali svoj račun. Funkcija bo znova na voljo čez %{count} dni.
+    past_migrations: Pretekle migracije
     proceed_with_move: Premakni sledilce
+    redirected_msg: Vaš račun se zdaj preusmerja na %{acct}.
+    redirecting_to: Vaš račun se preusmerja na %{acct}.
+    set_redirect: Nastavi preusmeritev
+    warning:
+      backreference_required: Novi račun je potrebno najprej prilagoditi, da se bo skliceval nazaj na tega
+      before: 'Pred nadaljevanjem previdno preberite naslednje opombe:'
+      cooldown: Po selitvi sledi čakalna doba, v kateri računa ne boste mogli ponovno seliti
+      disabled_account: Vaš trenutni račun zatem ne bo polno uporaben. Vendar pa boste imeli dostop do izvoza podatkov kot tudi do ponovne aktivacije.
+      followers: S tem dejanjem boste preselili vse sledilce iz trenutnega računa na novi račun
+      only_redirect_html: Namesto tega lahko <a href="%{path}">na svojem profilu zgolj vzpostavite preusmeritev</a>.
+      other_data: Nobeni drugi podatki se ne bodo preselili samodejno
+      redirect: Profil vašega trenutnega računa bo posodobljen z obvestilom o preusmeritvi in bo izključen iz iskanj
   moderation:
     title: Moderiranje
+  move_handler:
+    carry_blocks_over_text: Ta uporabnik se je preselil iz računa %{acct}, ki ste ga blokirali.
+    carry_mutes_over_text: Ta uporabnik se je preselil iz računa %{acct}, ki ste ga utišali.
+    copy_account_note_text: 'Ta uporabnik se je preselil iz %{acct}, tukaj so vaše poprejšnje opombe o njem:'
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} se je vpisal/a"
     digest:
       action: Prikaži vsa obvestila
       body: Tukaj je kratek povzetek sporočil, ki ste jih zamudili od vašega zadnjega obiska v %{since}
@@ -798,10 +1280,15 @@ sl:
         one: Prav tako ste pridobili enega novega sledilca, ko ste bili odsotni! Juhu!
         other: Prav tako ste pridobili %{count} novih sledilcev, ko ste bili odsotni! Juhu!
         two: Prav tako ste pridobili %{count} nova sledilca, ko ste bili odsotni! Juhu!
+      subject:
+        few: "%{count} nova obvestila od vašega zadnjega obiska 🐘"
+        one: "%{count} novo obvestilo od vašega zadnjega obiska 🐘"
+        other: "%{count} novih obvestil od vašega zadnjega obiska 🐘"
+        two: "%{count} novi obvestili od vašega zadnjega obiska 🐘"
       title: V vaši odsotnosti...
     favourite:
-      body: "%{name} je vzljubil/a vaše stanje:"
-      subject: "%{name} je vzljubil/a vaše stanje"
+      body: "%{name} je vzljubil/a vašo objavo:"
+      subject: "%{name} je vzljubil/a vašo objavo"
       title: Novo priljubljeno
     follow:
       body: "%{name} vam sedaj sledi!"
@@ -817,19 +1304,44 @@ sl:
       body: "%{name} vas je omenil/a v:"
       subject: "%{name} vas je omenil/a"
       title: Nova omemba
+    poll:
+      subject: Anketa, ki jo je pripravil/a %{name}, se je iztekla
     reblog:
-      body: "%{name} je spodbudil/a vaše stanje:"
-      subject: "%{name} je spodbudil/a vaše stanje"
-      title: Nova spodbuda
+      body: 'Vašo objavo je izpostavil/a %{name}:'
+      subject: "%{name} je izpostavil/a vašo objavo"
+      title: Nova izpostavitev
+    status:
+      subject: "%{name} je pravkar objavil/a"
     update:
       subject: "%{name} je uredil(a) objavo"
+  notifications:
+    email_events: Dogodki za e-obvestila
+    email_events_hint: 'Izberite dogodke, za katere želite prejmati obvestila:'
+    other_settings: Druge nastavitve obvestil
+  number:
+    human:
+      decimal_units:
+        format: "%n %u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
   otp_authentication:
+    code_hint: Za potrditev vnesite kodo, ki jo je ustvarila aplikacija za preverjanje pristnosti
+    description_html: Če omogočite <strong>dvofaktorsko preverjanje pristnosti</strong> z aplikacijo za overjanje, boste za prijavo morali imeti pri sebi svoj telefon, s katerim boste ustvarili žetone za vstop.
     enable: Omogoči
+    instructions_html: "<strong>Skenirajte to QR-kodo z Google Authenticator ali s podobno aplikacijo TOTP na vašem telefnu</strong>. Od zdaj naprej bo ta aplikacija ustvarjala žetone, ki jih boste morali vnesti ob prijavi."
+    manual_instructions: 'Če ne morete skenirati QR-kode in jo morate vnesti ročno, je tu skrivnost v tekstovni obliki:'
+    setup: Vzpostavi
+    wrong_code: Vnesena koda je neveljavna! Ali sta čas strežnika in čas naprave pravilna?
   pagination:
     newer: Novejše
     next: Naprej
     older: Starejše
     prev: Nazaj
+    truncate: "&hellip;"
   polls:
     errors:
       already_voted: Na tej anketi ste že glasovali
@@ -837,6 +1349,7 @@ sl:
       duration_too_long: je predaleč v prihodnosti
       duration_too_short: je prezgodaj
       expired: Glasovanje se je že zaključilo
+      invalid_choice: Izbrana možnost glasovanja ne obstaja
       over_character_limit: ne more biti daljše od %{max} znakov
       too_few_options: mora imeti več kot en element
       too_many_options: ne more vsebovati več kot %{max} elementov
@@ -844,10 +1357,17 @@ sl:
     other: Ostalo
     posting_defaults: Privzete nastavitev objavljanja
     public_timelines: Javne časovnice
+  reactions:
+    errors:
+      limit_reached: Dosežena omejitev različnih reakcij/odzivov
+      unrecognized_emoji: ni prepoznan emotikon
   relationships:
     activity: Dejavnost računa
     dormant: Skrit
     follow_selected_followers: Sledi izbranim sledilcem
+    followers: Sledilci
+    following: Sledi
+    invited: Vabljeni
     last_active: Zadnja dejavnost
     most_recent: Najnovejša
     moved: Prestavljeno
@@ -868,19 +1388,24 @@ sl:
   remote_interaction:
     favourite:
       proceed: Nadaljuj s priljubljenim
-      prompt: 'Ali želite vzljubiti ta tut:'
+      prompt: 'Želite vzljubiti to objavo:'
     reblog:
-      proceed: Nadaljuj s spodbudo
-      prompt: 'Ali želite spodbuditi ta tut:'
+      proceed: Nadaljuj s izpostavljanjem
+      prompt: 'Želite izpostaviti to objavo:'
     reply:
       proceed: Nadaljuj z odgovorom
-      prompt: 'Ali želite odgovoriti na ta tut:'
+      prompt: 'Želite odgovoriti na to objavo:'
   reports:
     errors:
       invalid_rules: se ne sklicuje na veljavna pravila
+  rss:
+    content_warning: 'Opozorilo o vsebini:'
+    descriptions:
+      account: Javne objave @%{acct}
+      tag: 'Javne objave s ključnikom #%{hashtag}'
   scheduled_statuses:
-    over_daily_limit: Za ta dan ste presegli omejitev %{limit} načrtovanih tutov
-    over_total_limit: Presegli ste omejitev %{limit} načrtovanih tutov
+    over_daily_limit: Za ta dan ste presegli omejitev %{limit} načrtovanih objav
+    over_total_limit: Presegli ste omejitev %{limit} načrtovanih objav
     too_soon: Načrtovani datum mora biti v prihodnosti
   sessions:
     activity: Zadnja dejavnost
@@ -923,6 +1448,7 @@ sl:
     revoke: Prekliči
     revoke_success: Seja je bila uspešno preklicana
     title: Seje
+    view_authentication_history: Oglejte si zgodovino overjanja za vaš račun
   settings:
     account: Račun
     account_settings: Nastavitve računa
@@ -942,10 +1468,17 @@ sl:
     preferences: Nastavitve
     profile: Profil
     relationships: Sledenja in sledilci
+    statuses_cleanup: Samodejno brisanje objav
+    strikes: Ukrepi morediranja
     two_factor_authentication: Dvofaktorsko overjanje
     webauthn_authentication: Varnostni ključi
   statuses:
     attached:
+      audio:
+        few: "%{count} zvočni posnetki"
+        one: "%{count} zvočni posnetek"
+        other: "%{count} zvočnih posnetkov"
+        two: "%{count} zvočna posnetka"
       description: 'Priloženo: %{attached}'
       image:
         few: "%{count} slike"
@@ -957,21 +1490,30 @@ sl:
         one: "%{count} video posnetek"
         other: "%{count} video posnetkov"
         two: "%{count} video posnetka"
-    boosted_from_html: Spodbujeno iz %{acct_link}
+    boosted_from_html: Izpostavljeno z računa %{acct_link}
     content_warning: 'Opozorilo o vsebini: %{warning}'
+    default_language: Enak kot jezik vmesnika
     disallowed_hashtags:
       few: 'vsebuje nedovoljene ključnike: %{tags}'
       one: 'vsebuje nedovoljeni ključnik: %{tags}'
       other: 'vsebuje nedovoljenih ključnikov: %{tags}'
       two: 'vsebuje nedovoljena ključnika: %{tags}'
     edited_at_html: Urejeno %{date}
+    errors:
+      in_reply_not_found: Objava, na katero želite odgovoriti, ne obstaja.
     open_in_web: Odpri na spletu
     over_character_limit: omejitev %{max} znakov je presežena
     pin_errors:
-      limit: Pripeli ste največje število tutov
-      ownership: Trob nekoga drugega ne more biti pripet
-      reblog: Spodbuda ne more biti pripeta
+      direct: Objav, ki so vidne samo omenjenum uporabnikom, ni mogoče pripenjati
+      limit: Pripeli ste največje število objav
+      ownership: Objava nekoga drugega ne more biti pripeta
+      reblog: Izpostavitev ne more biti pripeta
     poll:
+      total_people:
+        few: "%{count} osebe"
+        one: "%{count} Oseba"
+        other: "%{count} oseb"
+        two: "%{count} osebi"
       total_votes:
         few: "%{count} glasovi"
         one: "%{count} glas"
@@ -983,7 +1525,9 @@ sl:
     show_older: Pokaži starejše
     show_thread: Pokaži nit
     sign_in_to_participate: Prijavite se, če želite sodelovati v pogovoru
+    title: "%{name}: »%{quote}«"
     visibilities:
+      direct: Neposredno
       private: Samo sledilci
       private_long: Prikaži samo sledilcem
       public: Javno
@@ -991,22 +1535,49 @@ sl:
       unlisted: Ni prikazano
       unlisted_long: Vsi lahko vidijo, vendar ni objavljeno na javnih časovnicah
   statuses_cleanup:
+    enabled: Samodejno izbriši stare objave
+    enabled_hint: Samodejno izbriše vaše objave, ko dosežejo določen starostni prag, razen če ne ustrezajo eni od spodnjih izjem
+    exceptions: Izjeme
+    explanation: Ker je brisanje objav draga operacija, se to postopoma izvaja počasi, ko strežnik sicer ni zaseden. Zaradi tega se lahko vaše objave izbrišejo nekaj časa po tem, ko dosežejo starostni prag.
+    ignore_favs: Prezri priljubljene
+    ignore_reblogs: Prezri izpostavitve
+    interaction_exceptions: Izjeme na osnovi interakcije
+    interaction_exceptions_explanation: Upoštevajte, da ni nobene garancije za objave, ki bodo izbrisane, če padejo pod prag priljubljenosti ali izpostavljenosti, ko so ga že enkrat presegle.
+    keep_direct: Ohrani neposredna sporočila
+    keep_direct_hint: Ne izbriše nobenega izmed vaših neposrednih sporočil
+    keep_media: Ohrani objave z medijskimi priponkami
+    keep_media_hint: Ne izbriše nobene vaših objav, ki imajo medijske priponke
+    keep_pinned: Ohrani pripete objave
+    keep_pinned_hint: Ne izbriše nobene od vaših pripetih objav
     keep_polls: Ohrani ankete
     keep_polls_hint: Ne izbriše vaših anket
+    keep_self_bookmark: Ohrani objave z zaznamki
+    keep_self_bookmark_hint: Ne izbriše vaših lastnih objav, če ste jih postavili med zaznamke
+    keep_self_fav: Ohrani priljubljene objave
+    keep_self_fav_hint: Ne izbriše vaših lastnih objav, če ste jih postavili med priljubljene
     min_age:
       '1209600': 2 tedna
       '15778476': 6 mesecev
       '2629746': 1 mesec
       '31556952': 1 leto
       '5259492': 2 meseca
-      '604800': 1 week
+      '604800': 1 teden
       '63113904': 2 leti
       '7889238': 3 mesece
     min_age_label: Starostna meja
+    min_favs: Obrži objave priljubljene vsaj
+    min_favs_hint: Ne izbriše nobene od vaših objav, ki je prejela vsaj takšno količino priljubljenih. Pustite prazno, če želite izbrisati objave ne glede na število všečkov
+    min_reblogs: Obdrži objave izpostavljene vsaj
+    min_reblogs_hint: Ne izbriše nobene od vaših objav, ki je bila vsaj tolikokrat podprta. Pustite prazno, če želite izbrisati objave ne glede na število izpostavitev
   stream_entries:
-    pinned: Pripet trob
-    reblogged: spodbujen
+    pinned: Pripeta objava
+    reblogged: izpostavljeno
     sensitive_content: Občutljiva vsebina
+  strikes:
+    errors:
+      too_late: Prepozno je, da bi se pritožili na ta ukrep
+  tags:
+    does_not_match_previous_name: se ne ujema s prejšnjim imenom
   terms:
     body_html: |
       <h2>Pravilnik o zasebnosti</h2>
@@ -1094,34 +1665,76 @@ sl:
     contrast: Mastodon (Visok kontrast)
     default: Mastodon (Temna)
     mastodon-light: Mastodon (Svetla)
+  time:
+    formats:
+      default: "%b %d %Y, %H:%M"
+      month: "%b %Y"
+      time: "%H:%M"
   two_factor_authentication:
     add: Dodaj
     disable: Onemogoči
+    disabled_success: Dvofaktorsko preverjanje pristnosti je uspešno onemogočeno
     edit: Uredi
     enabled: Dvofaktorsko preverjanje pristnosti je omogočeno
     enabled_success: Dvofaktorsko preverjanje pristnosti je uspešno omogočeno
     generate_recovery_codes: Ustvari kode za obnovitev
     lost_recovery_codes: Obnovitvene kode vam omogočajo, da ponovno pridobite dostop do svojega računa, če izgubite telefon. Če ste izgubili obnovitvene kode, jih lahko obnovite tukaj. Vaše stare obnovitvene kode bodo neveljavne.
+    methods: Dvofaktorske metode
+    otp: Avtentikacijska aplikacija
     recovery_codes: Varnostna kopija obnovitvenih kod
     recovery_codes_regenerated: Obnovitvene kode so bile uspešno regenerirane
     recovery_instructions_html: Če kdaj izgubite dostop do telefona, lahko uporabite eno od spodnjih obnovitvenih kod, da ponovno pridobite dostop do svojega računa. <strong>Shranite obnovitvene kode</strong>. Lahko jih natisnete in shranite z drugimi pomembnimi dokumenti.
     webauthn: Varnostni ključi
   user_mailer:
+    appeal_approved:
+      action: Pojdite na svoj račun
+      explanation: Pritožbi na ukrep proti vašemu računu z dne %{strike_date}, ki ste jo oddali dne %{appeal_date}, je bilo ugodeno. Vaš račun je znova nesporen.
+      subject: Vaši pritožbi z dne %{date} je bilo ugodeno
+      title: Pritožbi ugodeno
+    appeal_rejected:
+      explanation: Pritožba na ukrep proti vašemu računu z dne %{strike_date}, ki ste jo oddali dne %{appeal_date}, je bila zavrnjena.
+      subject: Vaša pritožba z dne %{date} je bila zavrnjena
+      title: Pritožba zavrnjena
     backup_ready:
       explanation: Zahtevali ste popolno varnostno kopijo računa Mastodon. Zdaj je pripravljen za prenos!
       subject: Vaš arhiv je pripravljen za prenos
       title: Prevzem arhiva
+    suspicious_sign_in:
+      change_password: spremenite svoje geslo
+      details: 'Tukaj so podrobnosti prijave:'
+      explanation: Zaznali smo prijavo v vaš račun z novega naslova IP.
+      further_actions_html: Če to niste bili vi, priporočamo da takoj ukrepate (%{action}) in omogočite dvo-ravensko overjanje (2FA), da ohranite račun varen.
+      subject: Do vašega računa je bil opravljen dostop z novega naslova IP
+      title: Nova prijava
     warning:
+      appeal: Pošlji pritožbo
+      appeal_description: Če menite, da gre za napako, lahko pošljete pritožbo osebju %{instance}.
+      categories:
+        spam: Neželeno
+        violation: Vsebina krši naslednja navodila skupnosti
+      explanation:
+        delete_statuses: Za nekatere vaših objav se je izkazalo, da kršijo eno ali več pravil skupnosti, zato so jih moderatorji %{instance} posledično odstranili.
+        disable: Svojega računa ne morete več uporabljati, vendar vaš profil in drugi podatki ostajajo nedotaknjeni. Zahtevate lahko varnostno kopiranje svojih podatkov, spremenite nastavitve računa ali izbrišete svoj račun.
+        mark_statuses_as_sensitive: Nekatere vaše objave so moderatorji %{instance} označili kot občutljive. To pomeni, da se bodo morale osebe dotakniti medijskih vsebin v objavah, preden se prikaže predogled. Med objavljanjem v prihodnosti lahko sami označite medijske vsebine kot občutljive.
+        sensitive: Odslej bodo vse vaše naložene medijske datoteke označene kot občutljive in skrite za opozorilom, ki ga je potrebno klikniti.
+        silence: Še vedno lahko uporabljate svoj račun, vendar bodo samo osebe, ki vas že spremljajo, videle vaše objave na tem strežniku in morda boste izključeni iz različnih funkcij odkrivanja. Vendar vam lahko drugi še vedno ročno sledijo.
+        suspend: Ne morete več uporabljati svojega računa, vaš profil in drugi podatki pa niso več dostopni. Še vedno se lahko prijavite in zahtevate varnostno kopijo svojih podatkov, dokler podatki niso v celoti odstranjeni v približno 30 dneh, vendar bomo ohranili nekaj osnovnih podatkov, da preprečimo, da bi se izognili suspenzu.
       reason: 'Razlog:'
+      statuses: 'Citirane objave:'
       subject:
+        delete_statuses: Vaše objave na %{acct} so bile odstranjene
         disable: Vaš račun %{acct} je zamrznjen
+        mark_statuses_as_sensitive: Vaše objave na računu %{acct} so bile označene kot občutljive
         none: Opozorila za %{acct}
+        sensitive: Vaše objave na računu %{acct} bodo odslej označene kot občutljive
         silence: Vaš račun %{acct} je omejen
         suspend: Vaš račun %{acct} je suspendiran
       title:
         delete_statuses: Objave odstranjene
         disable: Račun je zamrznjen
+        mark_statuses_as_sensitive: Objave, označene kot občuljive
         none: Opozorilo
+        sensitive: Račun je označen kot občutljiv
         silence: Račun je omejen
         suspend: Račun je suspendiran
     welcome:
@@ -1153,10 +1766,17 @@ sl:
   webauthn_credentials:
     add: Dodaj nov varnostni ključ
     create:
+      error: Pri dodajanju vašega varnostnega ključa je prišlo do težav. Poskusite znova.
       success: Vaš varnostni ključ je bil uspešno dodan.
     delete: Izbriši
     delete_confirmation: Ali ste prepričani, da želite izbrisati ta varnostni ključ?
+    description_html: Če omogočite <strong>overjanje z varnostnim ključem</strong>, boste morali ob prijavi uporabiti enega od svojih varnostnih ključev.
     destroy:
+      error: Pri brisanju vašega varnostnega ključa je prišlo do težav. Poskusite znova.
       success: Vaš varnostni ključ je bil uspešno izbrisan.
     invalid_credential: Neveljaven varnostni ključ
+    nickname_hint: Vnesite vzdevek svojega novega varnostnega ključa
+    not_enabled: Niste še omogočili WebAuthn
     not_supported: Ta brskalnik ne podpira varnostnih ključev
+    otp_required: Za uporabo varnostnih ključev morate najprej omogočiti 2FA (dvostopenjsko overjanje).
+    registered_on: Datum registracije %{date}
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index b21767738..30b701c25 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1027,10 +1027,12 @@ sq:
       appealed_msg: Apelimi juaj u parashtruar. Nëse miratohet, do të njoftoheni.
       appeals:
         submit: Parashtroni apelim
+      approve_appeal: Miratoni apelimin
       associated_report: Raportimi i përshoqëruar
       created_at: Datuar
       description_html: Këto janë veprime të ndërmara kundër llogarisë tuaj dhe sinjalizime që ju janë dërguar nga stafi i %{instance}.
       recipient: Drejtuar
+      reject_appeal: Hidheni poshtë apelimin
       status: "#%{id} postimi"
       status_removed: Postim i hequr tashmë nga sistemi
       title: "%{action} prej %{date}"
@@ -1345,6 +1347,11 @@ sq:
   reports:
     errors:
       invalid_rules: s’i referohet ndonjë rregulli të vlefshëm
+  rss:
+    content_warning: 'Sinjalizim lënde:'
+    descriptions:
+      account: Postime publike prej @%{acct}
+      tag: 'Postime publike etiketuar me #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Keni tejkaluar kufirin e %{limit} mesazheve të planifikuara për atë ditë
     over_total_limit: Keni tejkaluar kufirin prej %{limit} mesazhesh të planifikuara
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index b7f8c6747..7bfeb5e0e 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -768,7 +768,9 @@ sv:
     explore_mastodon: Utforska %{title}
   disputes:
     strikes:
+      approve_appeal: Godkänn förfrågan
       created_at: Daterad
+      reject_appeal: Avvisa förfrågan
       status: 'Inlägg #%{id}'
       title_actions:
         none: Varning
@@ -1175,6 +1177,9 @@ sv:
     pinned: Fäst toot
     reblogged: boostad
     sensitive_content: Känsligt innehåll
+  strikes:
+    errors:
+      too_late: Det är för sent att överklaga denna strejk
   tags:
     does_not_match_previous_name: matchar inte det föregående namnet
   terms:
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 5fb25d2db..25fc7034e 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -406,7 +406,7 @@ th:
       undo: ไม่อนุญาตการติดต่อกับภายนอกกับโดเมน
     domain_blocks:
       add_new: เพิ่มการปิดกั้นโดเมนใหม่
-      created_msg: กำลังประมวลผลการปิดกั้นโดเมน
+      created_msg: ตอนนี้กำลังประมวลผลการปิดกั้นโดเมน
       destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว
       domain: โดเมน
       edit: แก้ไขการปิดกั้นโดเมน
@@ -578,6 +578,7 @@ th:
         create_and_unresolve: เปิดใหม่โดยมีหมายเหตุ
         delete: ลบ
         title: หมายเหตุ
+      quick_actions_description_html: 'ดำเนินการอย่างรวดเร็วหรือเลื่อนลงเพื่อดูเนื้อหาที่รายงาน:'
       remote_user_placeholder: ผู้ใช้ระยะไกลจาก %{instance}
       reopen: เปิดรายงานใหม่
       report: 'รายงาน #%{id}'
@@ -652,7 +653,7 @@ th:
           title: ต้องให้ผู้ใช้ใหม่ป้อนเหตุผลที่จะเข้าร่วม
       registrations_mode:
         modes:
-          approved: ต้องมีการอนุมัติสำหรับการลงทะเบียน
+          approved: ต้องการการอนุมัติสำหรับการลงทะเบียน
           none: ไม่มีใครสามารถลงทะเบียน
           open: ใครก็ตามสามารถลงทะเบียน
         title: โหมดการลงทะเบียน
@@ -738,6 +739,7 @@ th:
           other: แบ่งปันโดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา
         title: ลิงก์ที่กำลังนิยม
         usage_comparison: แบ่งปัน %{today} ครั้งวันนี้ เทียบกับ %{yesterday} เมื่อวานนี้
+      only_allowed: อนุญาตเท่านั้น
       pending_review: การตรวจทานที่รอดำเนินการ
       preview_card_providers:
         allowed: ลิงก์จากผู้เผยแพร่นี้สามารถขึ้นแนวโน้ม
@@ -773,6 +775,7 @@ th:
         used_by_over_week:
           other: ใช้โดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา
       title: แนวโน้ม
+      trending: กำลังนิยม
     warning_presets:
       add_new: เพิ่มใหม่
       delete: ลบ
@@ -794,11 +797,13 @@ th:
       subject: "%{username} กำลังอุทธรณ์การตัดสินใจในการควบคุมใน %{instance}"
     new_pending_account:
       body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้
+      subject: บัญชีใหม่สำหรับตรวจทานใน %{instance} (%{username})
     new_report:
       body: "%{reporter} ได้รายงาน %{target}"
       body_remote: ใครสักคนจาก %{domain} ได้รายงาน %{target}
       subject: รายงานใหม่สำหรับ %{instance} (#%{id})
     new_trends:
+      body: 'รายการดังต่อไปนี้จำเป็นต้องมีการตรวจทานก่อนที่จะสามารถแสดงรายการเป็นสาธารณะ:'
       new_trending_links:
         no_approved_links: ไม่มีลิงก์ที่กำลังนิยมที่ได้รับอนุมัติในปัจจุบัน
         title: ลิงก์ที่กำลังนิยม
@@ -891,7 +896,7 @@ th:
     error: น่าเสียดาย มีข้อผิดพลาดในการค้นหาบัญชีระยะไกล
     follow: ติดตาม
     follow_request: 'คุณได้ส่งคำขอติดตามไปยัง:'
-    following: 'สำเร็จ! คุณกำลังติดตาม:'
+    following: 'สำเร็จ! ตอนนี้คุณกำลังติดตาม:'
     post_follow:
       close: หรือคุณสามารถปิดหน้าต่างนี้
       return: แสดงโปรไฟล์ของผู้ใช้
@@ -934,6 +939,7 @@ th:
       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>
@@ -951,11 +957,14 @@ th:
       appeal_submitted_at: ส่งการอุทธรณ์แล้ว
       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: การเอาโพสต์ออก
@@ -984,6 +993,7 @@ th:
       content: เราขออภัย แต่มีบางอย่างผิดพลาดในส่วนของเรา
       title: หน้านี้ไม่ถูกต้อง
     '503': ไม่สามารถให้บริการหน้าได้เนื่องจากเซิร์ฟเวอร์ล้มเหลวชั่วคราว
+    noscript_html: เพื่อใช้แอปพลิเคชันเว็บ Mastodon โปรดเปิดใช้งาน JavaScript หรืออีกวิธีหนึ่ง ลองหนึ่งใน <a href="%{apps_path}">แอปเนทีฟ</a> สำหรับ Mastodon สำหรับแพลตฟอร์มของคุณ
   existing_username_validator:
     not_found: ไม่พบผู้ใช้ในเซิร์ฟเวอร์ที่มีชื่อผู้ใช้นั้น
     not_found_multiple: ไม่พบ %{usernames}
@@ -1094,6 +1104,7 @@ th:
   migrations:
     acct: ย้ายไปยัง
     cancel: ยกเลิกการเปลี่ยนเส้นทาง
+    cancel_explanation: การยกเลิกการเปลี่ยนเส้นทางจะเปิดใช้งานบัญชีปัจจุบันของคุณใหม่ แต่จะไม่นำผู้ติดตามที่ได้รับการย้ายไปยังบัญชีนั้นกลับมา
     cancelled_msg: ยกเลิกการเปลี่ยนเส้นทางสำเร็จ
     errors:
       missing_also_known_as: ไม่ใช่นามแฝงของบัญชีนี้
@@ -1106,7 +1117,7 @@ th:
     on_cooldown: คุณเพิ่งโยกย้ายบัญชีของคุณ ฟังก์ชันนี้จะพร้อมใช้งานอีกครั้งในอีก %{count} วัน
     past_migrations: การโยกย้ายที่ผ่านมา
     proceed_with_move: ย้ายผู้ติดตาม
-    redirected_msg: บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct}
+    redirected_msg: ตอนนี้บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct}
     redirecting_to: บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct}
     set_redirect: ตั้งการเปลี่ยนเส้นทาง
     warning:
@@ -1136,8 +1147,8 @@ th:
       subject: "%{name} ได้ชื่นชอบโพสต์ของคุณ"
       title: รายการโปรดใหม่
     follow:
-      body: "%{name} กำลังติดตามคุณ!"
-      subject: "%{name} กำลังติดตามคุณ"
+      body: ตอนนี้ %{name} กำลังติดตามคุณ!
+      subject: ตอนนี้ %{name} กำลังติดตามคุณ
       title: ผู้ติดตามใหม่
     follow_request:
       action: จัดการคำขอติดตาม
@@ -1424,6 +1435,9 @@ th:
     suspicious_sign_in:
       change_password: เปลี่ยนรหัสผ่านของคุณ
       details: 'นี่คือรายละเอียดของการลงชื่อเข้า:'
+      explanation: เราตรวจพบการลงชื่อเข้าบัญชีของคุณจากที่อยู่ IP ใหม่
+      further_actions_html: หากนี่ไม่ใช่คุณ เราแนะนำให้คุณ %{action} ทันทีและเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยเพื่อรักษาบัญชีของคุณให้ปลอดภัย
+      subject: มีการเข้าถึงบัญชีของคุณจากที่อยู่ IP ใหม่
       title: การลงชื่อเข้าใหม่
     warning:
       appeal: ส่งการอุทธรณ์
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 922f4fd82..ad03aa7e4 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -1036,10 +1036,12 @@ tr:
       appealed_msg: İtiraz gönderildi. Kabul edilirse bilgilendirileceksiniz.
       appeals:
         submit: İtirazı gönder
+      approve_appeal: İtirazı kabul et
       associated_report: İlişkili rapor
       created_at: Tarih
       description_html: Bunlar hesabınıza yönelik eylemler ve %{instance} yönetimi tarafından size gönderilen uyarılardır.
       recipient: Kime
+      reject_appeal: İtirazı reddet
       status: 'Gönderi #%{id}'
       status_removed: Gönderi zaten sistemden kaldırıldı
       title: "%{date} tarihli %{action}"
@@ -1354,6 +1356,11 @@ tr:
   reports:
     errors:
       invalid_rules: geçerli kurallara işaret etmez
+  rss:
+    content_warning: 'İçerik uyarısı:'
+    descriptions:
+      account: "@%{acct} hesabından herkese açık gönderiler"
+      tag: "#%{hashtag} etiketli herkese açık gönderiler"
   scheduled_statuses:
     over_daily_limit: O gün için %{limit} zamanlanmış toot sınırını aştınız
     over_total_limit: "%{limit} zamanlanmış toot sınırını aştınız"
@@ -1512,6 +1519,9 @@ tr:
     pinned: Sabitlenmiş toot
     reblogged: boostladı
     sensitive_content: Hassas içerik
+  strikes:
+    errors:
+      too_late: Bu eyleme itiraz etmek için çok geç
   tags:
     does_not_match_previous_name: önceki adla eşleşmiyor
   terms:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index cb2b7c720..1142fa140 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -1,14 +1,14 @@
 ---
 uk:
   about:
-    about_hashtag_html: Це публічні дмухи, позначені символом <strong>#%{hashtag}</strong>. Ви можете взаємодіяти з ними, якщо маєте обліковий запис будь-де у федіверсі.
-    about_mastodon_html: Mastodon — це соціальна мережа, заснована на відкритих веб-протоколах та вільному програмному забезпеченні з відкритим кодом. Вона є децентралізованою на кшталт електронної пошти.
-    about_this: Про цю інстанцію
+    about_hashtag_html: Це публічні дописи, позначені символом <strong>#%{hashtag}</strong>. Ви можете взаємодіяти з ними, якщо маєте обліковий запис будь-де у федесвіті.
+    about_mastodon_html: 'Соціальна мережа майбутнього: жодної реклами, жодного корпоративного нагляду, етичний дизайн та децентралізація! З Mastodon ваші дані під вашим контролем!'
+    about_this: Про цей сервер
     active_count_after: активних
-    active_footnote: Активні користувачі місяця (MAU)
+    active_footnote: Щомісячно активні користувачі (MAU)
     administered_by: 'Адміністратор:'
     api: API
-    apps: Мобільні додатки
+    apps: Мобільні застосунки
     apps_platforms: Користуйтесь Mastodon на iOS, Android та інших платформах
     browse_directory: Переглядайте каталог профілів та фільтруйте за інтересами
     browse_local_posts: Переглядайте потік публічних постів з цього сервера
@@ -170,6 +170,12 @@ uk:
       not_subscribed: Не підписані
       pending: Відгук в очікуванні
       perform_full_suspension: Призупинити
+      previous_strikes: Попередні попередження
+      previous_strikes_description_html:
+        few: У цього облікового запису є <strong>%{count}</strong> попередження.
+        many: У цього облікового запису є <strong>%{count}</strong> попереджень.
+        one: У цього облікового запису є <strong>одне</strong> попередження.
+        other: У цього облікового запису є <strong>%{count}</strong> попереджень.
       promote: Просунути
       protocol: Протокол
       public: Публічний
@@ -205,11 +211,12 @@ uk:
       sensitized: позначено делікатним
       shared_inbox_url: URL спільного вхідного кошика
       show:
-        created_reports: Скарги, створені цим акаунтом
-        targeted_reports: Скарги щодо цього акаунту
+        created_reports: Скарги, створені цим обліковим записом
+        targeted_reports: Скарги на цей обліковий запис
       silence: Глушення
       silenced: Заглушені
       statuses: Статуси
+      strikes: Попередні попередження
       subscribe: Підписатися
       suspend: Призупинити
       suspended: Призупинені
@@ -267,13 +274,13 @@ uk:
         reject_appeal: Відхилити апеляцію
         reject_user: Відхилити користувача
         remove_avatar_user: Видалити аватар
-        reopen_report: Перевідкрити скаргу
+        reopen_report: Поновити скаргу
         reset_password_user: Скинути пароль
         resolve_report: Розв'язати скаргу
         sensitive_account: Позначити делікатним медіа вашого облікового запису
         silence_account: Заглушити обліковий запис
         suspend_account: Призупинити обліковий запис
-        unassigned_report: Видалити скаргу
+        unassigned_report: Зняти скаргу
         unblock_email_account: Розблокувати адресу е-пошти
         unsensitive_account: Прибрати позначку "делікатне" з медіа вашого облікового запису
         unsilence_account: Розглушити обліковий запис
@@ -283,6 +290,7 @@ uk:
         update_domain_block: Оновити блокування домену
         update_status: Оновити статус
       actions:
+        approve_appeal_html: "%{name} затвердили звернення на оскарження рішення від %{target}"
         approve_user_html: "%{name} схвалює реєстрацію від %{target}"
         assigned_to_self_report_html: "%{name} створює скаргу %{target} на себе"
         change_email_user_html: "%{name} змінює поштову адресу користувача %{target}"
@@ -314,6 +322,7 @@ uk:
         enable_user_html: "%{name} вмикає вхід для користувача %{target}"
         memorialize_account_html: "%{name} перетворює обліковий запис %{target} на сторінку пам'яті"
         promote_user_html: "%{name} підвищує користувача %{target}"
+        reject_appeal_html: "%{name} відхилили звернення на оскарження рішення від %{target}"
         reject_user_html: "%{name} відхиляє реєстрацію від %{target}"
         remove_avatar_user_html: "%{name} прибирає аватар %{target}"
         reopen_report_html: "%{name} знову відкриває звіт %{target}"
@@ -392,6 +401,11 @@ uk:
       media_storage: Медіасховище
       new_users: нові користувачі
       opened_reports: звітів відкрито
+      pending_appeals_html:
+        few: "<strong>%{count}</strong> апеляції в черзі"
+        many: "<strong>%{count}</strong> апеляцій в черзі"
+        one: "<strong>%{count}</strong> апеляція в черзі"
+        other: "<strong>%{count}</strong> апеляції в черзі"
       pending_reports_html:
         few: "<strong>%{count}</strong> звіти у черзі"
         many: "<strong>%{count}</strong> звітів у черзі"
@@ -469,6 +483,7 @@ uk:
         create: Додати домен
         resolve: Розв'язати домен
         title: Нове блокування поштового домену
+      no_email_domain_block_selected: Жодні налаштування блокування доменів електронної пошти не було змінено, оскільки жоден з них не було обрано
       resolved_through_html: Розв'язано через %{domain}
       title: Чорний список поштових доменів
     follow_recommendations:
@@ -481,7 +496,15 @@ uk:
       unsuppress: Відновити поради щодо підписок
     instances:
       availability:
+        failure_threshold_reached: Досягнуто поріг допустимих помилок станом на %{date}.
+        failures_recorded:
+          few: Невдалих спроб за %{count} різні дні.
+          many: Невдалих спроб за %{count} різних днів.
+          one: Невдалих спроб за %{count} день.
+          other: Невдалих спроб за %{count} різних днів.
+        no_failures_recorded: Проблем щодо запису немає.
         title: Доступність
+        warning: Остання спроба підключення до цього сервера була невдала
       back_to_all: Усі
       back_to_limited: Обмежені
       back_to_warning: Попередження
@@ -530,12 +553,14 @@ uk:
       private_comment: Приватний коментар
       public_comment: Публічний коментар
       purge: Очисти
-      title: Відомі інстанції
+      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:
@@ -668,14 +693,14 @@ uk:
       domain_blocks_rationale:
         title: Обґрунтування
       hero:
-        desc_html: Відображається на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не вказано, буде використано передпоказ інстанції
-        title: Банер інстанції
+        desc_html: Зображується на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не встановлено, буде використана мініатюра сервера
+        title: Банер серверу
       mascot:
-        desc_html: Відображається на багатьох сторінках. Щонайменше 293×205 пікселів рекомендовано. Якщо не вказано, буде використано талісман інстанції
+        desc_html: Зображується на декількох сторінках. Щонайменше 293×205 пікселів рекомендовано. Якщо не вказано, буде використано персонаж за замовчуванням
         title: Талісман
       peers_api_enabled:
-        desc_html: Доменні ім'я, помічені цією інстанцією федисвіту
-        title: Опублікувати список знайдених інстанцій
+        desc_html: Доменні ім'я, які сервер знайшов у федесвіті
+        title: Опублікувати список знайдених серверів в API
       preview_sensitive_media:
         desc_html: Передпоказ посилання на інших сайтах буде відображати мініатюру навіть якщо медіа відмічене як дражливе
         title: Показувати дражливе медіа у передпоказах OpenGraph
@@ -709,7 +734,7 @@ uk:
         title: Показувати персонал
       site_description:
         desc_html: Відображається у якості параграфа на титульній сторінці та використовується у якості мета-тега.<br>Можна використовувати HTML-теги, особливо <code>&lt;a&gt;</code> і <code>&lt;em&gt;</code>.
-        title: Опис інстанції
+        title: Опис сервера
       site_description_extended:
         desc_html: Відображається на сторінці додаткової информації<br>Можна використовувати HTML-теги
         title: Розширений опис сайту
@@ -724,7 +749,7 @@ uk:
       site_title: Назва сайту
       thumbnail:
         desc_html: Використовується для передпоказів через OpenGraph та API. Бажано розміром 1200х640 пікселів
-        title: Мініатюра інстанції
+        title: Мініатюра сервера
       timeline_preview:
         desc_html: Показувати публічну стрічку на головній сторінці
         title: Передпоказ фіду
@@ -764,6 +789,11 @@ uk:
     system_checks:
       database_schema_check:
         message_html: Існують відкладені перенесення бази даних. Запустіть їх, щоб забезпечити очікувану роботу програми
+      elasticsearch_running_check:
+        message_html: Не вдалося під'єднатися до Elasticsearch. Перевірте, чи він запущений або вимкніть повнотекстовий пошук
+      elasticsearch_version_check:
+        message_html: 'Несумісна версія Elasticsear: %{value}'
+        version_comparison: Запущено Elasticsearch %{running_version}, але вимагається %{required_version}
       rules_check:
         action: Керування правилами сервера
         message_html: Ви не визначили будь-які правила сервера.
@@ -782,8 +812,14 @@ uk:
         allow_provider: Дозволити публікатора
         disallow: Заборонити посилання
         disallow_provider: Заборонити публікатора
+        shared_by_over_week:
+          few: Поширили %{count} людини за останній тиждень
+          many: Поширили %{count} людей за останній тиждень
+          one: Поширила одна людина за останній тиждень
+          other: Поширили %{count} людей за останній тиждень
         title: Популярні посилання
         usage_comparison: Сьогодні поширено %{today} разів, у порівнянні з %{yesterday} вчора
+      only_allowed: Тільки дозволене
       pending_review: Очікує перевірки
       preview_card_providers:
         allowed: Посилання цього публікатора можуть бути популярними
@@ -820,6 +856,7 @@ uk:
           one: Використала одна людина за минулий тиждень
           other: Використали %{count} людей за минулий тиждень
       title: Популярні
+      trending: Популярне
     warning_presets:
       add_new: Додати новий
       delete: Видалити
@@ -847,6 +884,7 @@ uk:
       subject: Нова скарга до %{instance} (#%{id})
     new_trends:
       new_trending_links:
+        no_approved_links: На цей час немає схвалених популярних посилань.
         title: Популярні посилання
       new_trending_statuses:
         no_approved_statuses: На цей час немає схвалених популярних дописів.
@@ -1003,9 +1041,11 @@ uk:
       appealed_msg: Вашу апеляцію було надіслано. Якщо її погодять, вам буде повідомлено про це.
       appeals:
         submit: Подати апеляцію
+      approve_appeal: Схвалити апеляцію
       associated_report: Пов'язана скарга
       created_at: Застарілі
       recipient: Адресант
+      reject_appeal: Відхилити апеляцію
       status: 'Допис #%{id}'
       status_removed: Допис уже вилучено з системи
       title: "%{action} від %{date}"
@@ -1107,7 +1147,7 @@ uk:
       merge_long: Зберегти існуючі записи та додати нові
       overwrite: Перезаписувати
       overwrite_long: Замінити поточні записи новими
-    preface: Вы можете завантажити деякі дані, наприклад, списки людей, на яких Ви підписані чи яких блокуєте, в Ваш акаунт на цій інстанції з файлів, експортованих з іншої інстанції.
+    preface: Ви можете завантажити деякі дані, наприклад, списки людей, на яких ви підписані чи яких блокуєте, у ваш обліковий запис на даному сервері з файлів, експортованих з іншого сервера.
     success: Ваші дані були успішно загружені та будуть оброблені в найближчий момент
     types:
       blocking: Список блокувань
@@ -1210,6 +1250,11 @@ uk:
         many: У Вас з'явилось %{count} нових підписників! Чудово!
         one: Також, у Вас з'явився новий підписник, коли ви були відсутні! Ура!
         other: Також, у Вас з'явилось %{count} нових підписників, поки ви були відсутні! Чудово!
+      subject:
+        few: "%{count} нові сповіщення з вашого останнього відвідування 🐘"
+        many: "%{count} нових сповіщень з вашого останнього відвідування 🐘"
+        one: "1 нове сповіщення з вашого останнього відвідування 🐘"
+        other: "%{count} нових сповіщень з вашого останнього відвідування 🐘"
       title: Поки ви були відсутні...
     favourite:
       body: 'Ваш статус подобається %{name}:'
@@ -1323,6 +1368,8 @@ uk:
   reports:
     errors:
       invalid_rules: не посилається на чинні правила
+  rss:
+    content_warning: 'Попередження про матеріали:'
   scheduled_statuses:
     over_daily_limit: Ви перевищили ліміт в %{limit} запланованих дмухів на сьогодні
     over_total_limit: Ви перевищили ліміт в %{limit} запланованих дмухів
@@ -1389,6 +1436,7 @@ uk:
     profile: Профіль
     relationships: Підписки та підписники
     statuses_cleanup: Автовидалення допису
+    strikes: Попередження модераторів
     two_factor_authentication: Двофакторна авторизація
     webauthn_authentication: Ключі безпеки
   statuses:
@@ -1546,11 +1594,13 @@ uk:
         spam: Спам
         violation: Вміст порушує такі правила спільноти
       explanation:
+        delete_statuses: Деякі з ваших дописів порушили одне або кілька правил спільноти, і модератори %{instance} видалили їх.
         disable: Ви можете більше не використовувати свій обліковий запис, але ваш профіль та інші дані залишаються недоторканими. Ви можете надіслати запит на створення резервної копії ваших даних, змінити налаштування облікового запису або видалити свій обліковий запис.
         sensitive: Відтепер усі ваші завантажені медіафайли будуть позначені делікатними й приховані за попередженням.
         silence: Ви й надалі можете користуватися своїм обліковим записом, але ваші дописи на цьому сервері бачитимуть лише ті люди, які вже стежать за вами, а вас може бути виключено з різних можливостей виявлення. Проте, інші можуть почати стежити за вами вручну.
         suspend: Ви більше не можете користуватися своїм обліковим записом, а ваші інші дані більше недоступні. Ви досі можете увійти, щоб надіслати запит на отримання резервної копії своїх даних до повного видалення впродовж приблизно 30 днів, але ми збережемо деякі основні дані, щоб унеможливити ухилення вами від призупинення.
       reason: 'Причина:'
+      statuses: 'Цитовані дописи:'
       subject:
         delete_statuses: Ваші дописи на %{acct} були вилучені
         disable: Ваш обліковий запис %{acct} було заморожено
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index a685c73ec..c724b0ebc 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -579,7 +579,7 @@ vi:
         notes:
           other: "%{count} kiểm duyệt"
       action_log: Nhật ký kiểm duyệt
-      action_taken_by: Hành động được thực hiện bởi
+      action_taken_by: Quyết định bởi
       actions:
         delete_description_html: Những tút bị báo cáo sẽ được xóa và 1 lần cảnh cáo sẽ được ghi lại để giúp bạn lưu ý về tài khoản này trong tương lai.
         mark_as_sensitive_description_html: Media trong các tút bị báo cáo sẽ được đánh dấu là nhạy cảm và 1 lần cảnh cáo sẽ được ghi lại để giúp bạn nắm bắt nhanh những vi phạm của cùng một tài khoản.
@@ -1009,7 +1009,7 @@ vi:
     explore_mastodon: Thành viên %{title}
   disputes:
     strikes:
-      action_taken: Hành động thực hiện
+      action_taken: Hành động áp dụng
       appeal: Khiếu nại
       appeal_approved: Khiếu nại đã được chấp nhận và cảnh cáo không còn giá trị
       appeal_rejected: Khiếu nại bị từ chối
@@ -1017,10 +1017,12 @@ vi:
       appealed_msg: Khiếu nại của bạn đã được gửi đi. Nếu nó được chấp nhận, bạn sẽ nhận được thông báo.
       appeals:
         submit: Gửi khiếu nại
+      approve_appeal: Chấp nhận kháng cáo
       associated_report: Báo cáo đính kèm
       created_at: Ngày
       description_html: Đây là những cảnh cáo và áp đặt kiểm duyệt đối với bạn bởi đội ngũ %{instance}.
       recipient: Người nhận
+      reject_appeal: Từ chối kháng cáo
       status: 'Tút #%{id}'
       status_removed: Tút này đã được xóa khỏi hệ thống
       title: "%{action} từ %{date}"
@@ -1331,6 +1333,11 @@ vi:
   reports:
     errors:
       invalid_rules: không đúng với quy tắc
+  rss:
+    content_warning: 'Cảnh báo nội dung:'
+    descriptions:
+      account: Những tút công khai của @%{acct}
+      tag: 'Những tút #%{hashtag} công khai'
   scheduled_statuses:
     over_daily_limit: Bạn đã vượt qua giới hạn được lên lịch đăng tút %{limit} hôm nay
     over_total_limit: Bạn đã vượt quá giới hạn %{limit} của các tút được lên lịch
@@ -1483,6 +1490,9 @@ vi:
     pinned: Tút đã ghim
     reblogged: đăng lại
     sensitive_content: NSFW
+  strikes:
+    errors:
+      too_late: Đã quá trễ để kháng cáo
   tags:
     does_not_match_previous_name: không khớp với tên trước
   terms:
@@ -1592,7 +1602,7 @@ vi:
         mark_statuses_as_sensitive: Vài tút của bạn đã bị kiểm duyệt viên %{instance} đánh dấu nhạy cảm. Mọi người cần nhấn vào media để xem nó. Bạn có thể tự đánh dấu tài khoản của bạn là nhạy cảm.
         sensitive: Từ giờ trở đi, tất cả các media của bạn bạn tải lên sẽ được đánh dấu là nhạy cảm và ẩn đằng sau cảnh báo nhấp chuột.
         silence: Bạn vẫn có thể sử dụng tài khoản của mình, nhưng chỉ những người đang theo dõi bạn mới thấy bài đăng của bạn. Bạn cũng bị loại khỏi các tính năng khám phá khác. Tuy nhiên, những người khác vẫn có thể theo dõi bạn.
-        suspend: Bạn không còn có thể sử dụng tài khoản của bạn, hồ sơ và các dữ liệu khác không còn có thể truy cập được. Bạn vẫn có thể đăng nhập để yêu cầu sao lưu dữ liệu của mình cho đến khi dữ liệu bị xóa hoàn toàn trong khoảng 30 ngày, nhưng chúng tôi sẽ giữ lại một số dữ liệu cơ bản để ngăn bạn tránh bị đình chỉ.
+        suspend: Bạn không còn có thể sử dụng tài khoản của bạn, hồ sơ và các dữ liệu khác không còn có thể truy cập được. Trong vòng 30 ngày, bạn vẫn có thể đăng nhập để yêu cầu bản sao dữ liệu của mình cho đến khi dữ liệu bị xóa hoàn toàn, nhưng chúng tôi sẽ giữ lại một số dữ liệu cơ bản để ngăn bạn thoát khỏi việc vô hiệu hóa.
       reason: 'Lý do:'
       statuses: 'Tút lưu ý:'
       subject:
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 9515ffad8..425d1d186 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -29,7 +29,7 @@ zh-CN:
     logged_in_as_html: 您当前以 %{username} 登录。
     logout_before_registering: 您已登录。
     privacy_policy: 隐私政策
-    rules: 实例规则
+    rules: 服务器规则
     rules_html: 如果你想要在此Mastodon服务器上拥有一个账户,你必须遵守相应的规则,摘要如下:
     see_whats_happening: 看看有什么新鲜事
     server_stats: 服务器统计数据:
@@ -646,8 +646,8 @@ zh-CN:
         desc_html: 本站一周内的嘟文数、活跃用户数以及新用户数
         title: 公开用户活跃度的统计数据
       bootstrap_timeline_accounts:
-        desc_html: 用半角逗号分隔多个用户名。只能添加来自本站且未开启保护的帐户。如果留空,则默认关注本站所有的管理员。
-        title: 新用户默认关注
+        desc_html: 用半角逗号分隔多个用户名。这些账户一定会在推荐关注中展示。
+        title: 新用户推荐关注
       contact_information:
         email: 用于联系的公开电子邮件地址
         username: 用于联系的公开用户名
@@ -1019,10 +1019,12 @@ zh-CN:
       appealed_msg: 你的申诉已经提交。如果申诉通过,你将收到通知。
       appeals:
         submit: 提交申诉
+      approve_appeal: 批准申诉
       associated_report: 相关举报
       created_at: 日期
       description_html: 这些是针对您的帐户采取的行动和警告,已经由 %{instance} 的工作人员发送给您。
       recipient: 发送至
+      reject_appeal: 驳回申诉
       status: '嘟文 #%{id}'
       status_removed: 嘟文已从系统中删除
       title: "%{action} 于 %{date}"
@@ -1070,7 +1072,7 @@ zh-CN:
     csv: CSV
     domain_blocks: 域名屏蔽
     lists: 列表
-    mutes: 你隐藏的用户
+    mutes: 已被你隐藏的
     storage: 媒体文件存储
   featured_tags:
     add_new: 添加新条目
@@ -1333,6 +1335,11 @@ zh-CN:
   reports:
     errors:
       invalid_rules: 没有引用有效的规则
+  rss:
+    content_warning: 内容警告:
+    descriptions:
+      account: "@%{acct} 的公开嘟文"
+      tag: "#%{hashtag} 标签下的公开嘟文"
   scheduled_statuses:
     over_daily_limit: 你已超出每日定时嘟文的上限(%{limit} 条)
     over_total_limit: 你已超出定时嘟文的上限(%{limit} 条)
@@ -1423,8 +1430,8 @@ zh-CN:
     over_character_limit: 超过了 %{max} 字的限制
     pin_errors:
       direct: 仅对被提及的用户可见的帖子不能被置顶
-      limit: 你所置顶的嘟文数量已经达到上限
-      ownership: 不能置顶他人的嘟文
+      limit: 你所固定的嘟文数量已达到上限
+      ownership: 不能置顶别人的嘟文
       reblog: 不能置顶转嘟
     poll:
       total_people:
@@ -1460,7 +1467,7 @@ zh-CN:
     keep_media: 保留带媒体附件的嘟文
     keep_media_hint: 不会删除任何包含媒体附件的嘟文
     keep_pinned: 保留置顶嘟文
-    keep_pinned_hint: 不会删除你的任何置顶嘟文
+    keep_pinned_hint: 没有删除任何你已经固定的嘟文
     keep_polls: 保留投票
     keep_polls_hint: 不会删除你的任何投票
     keep_self_bookmark: 保存被你加入书签的嘟文
@@ -1485,6 +1492,9 @@ zh-CN:
     pinned: 置顶嘟文
     reblogged: 转嘟
     sensitive_content: 敏感内容
+  strikes:
+    errors:
+      too_late: 已来不及对此次处罚提出申诉
   tags:
     does_not_match_previous_name: 和之前的名称不匹配
   terms:
@@ -1624,7 +1634,7 @@ zh-CN:
       explanation:
         delete_statuses: 你的一些嘟文被发现违反了一条或多条社区准则,并已被 %{instance} 的监察员删除。
         disable: 你不能再使用你的帐户,但你的个人资料和其他数据保持不变。你可以请求数据备份,更改账户设置或删除账户。
-        mark_statuses_as_sensitive: 你的一些嘟文已经被 %{instance} 检察员标记为敏感内容。这意味着人们需要在嘟文中点击媒体,才能显示媒体预览。你可以在今后发嘟时自行将媒体标记为敏感内容。
+        mark_statuses_as_sensitive: 你的一些嘟文已经被 %{instance} 检察员标记为敏感内容。这意味着别人需要在嘟文中点击媒体,才能显示媒体预览。你可以在今后发嘟时自行将媒体标记为敏感内容。
         sensitive: 即刻起,你上传的所有媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。
         silence: 你可以继续使用你的账号,但只有已关注你的人才能在看到你在此服务器上的嘟文,并且你会被排除在各类公共列表之外。其他用户仍可以手动关注你。
         suspend: 你不能再使用你的帐户,并且你的个人资料和其他数据都将无法访问。在大约30天内,你仍可以登录并请求数据备份,之后相关数据将被完全删除。我们会保留一些基础数据以避免封禁失效。
@@ -1635,7 +1645,7 @@ zh-CN:
         disable: 你的帐户 %{acct} 已被冻结
         mark_statuses_as_sensitive: 你在 %{acct} 的嘟文已被标记为敏感内容
         none: 对 %{acct} 的警告
-        sensitive: 你在 %{acct} 的嘟文将从此被标记为敏感内容
+        sensitive: 你在 %{acct} 的嘟文今后将被标记为敏感内容
         silence: 你的帐户 %{acct} 已被隐藏
         suspend: 你的帐户 %{acct} 已被封禁。
       title:
@@ -1645,7 +1655,7 @@ zh-CN:
         none: 警示
         sensitive: 账户已被标记为敏感内容
         silence: 帐户被隐藏
-        suspend: 账号被挂起
+        suspend: 账号被封禁
     welcome:
       edit_profile_action: 设置个人资料
       edit_profile_step: 你可以自定义你的个人资料,包括上传头像、横幅图片、更改昵称等等。如果你想在新的关注者关注你之前对他们进行审核,你也可以选择为你的帐户开启保护。
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 0d1716790..0a6d6f9e7 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1,8 +1,8 @@
 ---
 zh-TW:
   about:
-    about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要你有任何 Mastodon 站點、或者其他站點的使用者,便可以與他們互動。
-    about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳戶,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。
+    about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要您有任何 Mastodon 站點、或者其他站點的使用者,便可以與他們互動。
+    about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳號,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。
     about_this: 關於本站
     active_count_after: 活躍
     active_footnote: 每月活躍使用者 (MAU)
@@ -19,7 +19,7 @@ zh-TW:
     continue_to_web: 於網頁程式中繼續
     discover_users: 探索使用者
     documentation: 文件
-    federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。
+    federation_hint_html: 您只需要擁有 %{instance} 的帳號,就可以追蹤任何一台 Mastodon 伺服器上的人等等。
     get_apps: 嘗試行動應用程式
     hosted_on: 在 %{domain} 運作的 Mastodon 站點
     instance_actor_flash: "這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。 \n"
@@ -28,7 +28,7 @@ zh-TW:
     logout_before_registering: 您已經登入了!
     privacy_policy: 隱私權政策
     rules: 伺服器規則
-    rules_html: 以下是您若想在此 Mastodon 伺服器建立帳戶必須遵守的規則總結:
+    rules_html: 以下是您若想在此 Mastodon 伺服器建立帳號必須遵守的規則總結:
     see_whats_happening: 看看發生什麼事
     server_stats: 伺服器統計:
     source_code: 原始碼
@@ -54,13 +54,13 @@ zh-TW:
     what_is_mastodon: 什麼是 Mastodon?
   accounts:
     choices_html: "%{name} 的選擇:"
-    endorsements_hint: 推薦您已經關注的人,把他們釘在您的個人頁面。
+    endorsements_hint: 推薦您已經跟隨的人,將他們釘選在您的個人頁面。
     featured_tags_hint: 您可以推薦不同主題標籤,它們也會在此處出現。
-    follow: 關注
+    follow: 跟隨
     followers:
-      other: 關注者
-    following: 正在關注
-    instance_actor_flash: 這個帳戶是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。
+      other: 跟隨者
+    following: 正在跟隨
+    instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。
     joined: 加入於 %{date}
     last_active: 上次活躍時間
     link_verified_on: 此連結的所有權已在 %{date} 檢查過
@@ -68,10 +68,10 @@ zh-TW:
     moved_html: "%{name} 已經搬遷到 %{new_profile_link}:"
     network_hidden: 此訊息不可用
     nothing_here: 暫時沒有內容可供顯示!
-    people_followed_by: "%{name} 關注的人"
-    people_who_follow: 關注 %{name} 的人
+    people_followed_by: "%{name} 跟隨的人"
+    people_who_follow: 跟隨 %{name} 的人
     pin_errors:
-      following: 你只能推薦你正在關注的使用者。
+      following: 您只能推薦您正在跟隨的使用者。
     posts:
       other: 嘟文
     posts_tab_heading: 嘟文
@@ -82,7 +82,7 @@ zh-TW:
       group: 群組
       moderator: 版主
     unavailable: 無法取得個人檔案
-    unfollow: 取消關注
+    unfollow: 取消跟隨
   admin:
     account_actions:
       action: 執行動作
@@ -93,13 +93,13 @@ zh-TW:
       destroyed_msg: 成功刪除管理備忘!
     accounts:
       add_email_domain_block: 將電子郵件網域加入黑名單
-      approve: 核准
-      approved_msg: 成功審核了%{username} 的新帳戶申請
+      approve: 批准
+      approved_msg: 成功審核了%{username} 的新帳號申請
       are_you_sure: 您確定嗎?
       avatar: 頭像
       by_domain: 站點
       change_email:
-        changed_msg: 已成功變更帳戶電子信箱地址!
+        changed_msg: 已成功變更帳號電子信箱地址!
         current_email: 目前的電子信箱地址
         label: 變更電子信箱地址
         new_email: 新的電子信箱地址
@@ -125,9 +125,9 @@ zh-TW:
       enable: 啟用
       enable_sign_in_token_auth: 啟用電子信箱 token 驗證
       enabled: 已啟用
-      enabled_msg: 成功解除 %{username} 帳戶的凍結
-      followers: 關注者
-      follows: 正在關注
+      enabled_msg: 成功解除 %{username} 帳號的凍結
+      followers: 跟隨者
+      follows: 正在跟隨
       header: 開頭
       inbox_url: 收件箱 (Inbox) URL
       invite_request_text: 加入原因
@@ -141,9 +141,9 @@ zh-TW:
         title: 位置
       login_status: 登入狀態
       media_attachments: 多媒體附件
-      memorialize: 設定為追悼帳戶
+      memorialize: 設定為追悼帳號
       memorialized: 被悼念的
-      memorialized_msg: 成功將%{username} 的帳戶變為紀念帳戶
+      memorialized_msg: 成功將%{username} 的帳號變為紀念帳號
       moderation:
         active: 活躍
         all: 全部
@@ -153,7 +153,7 @@ zh-TW:
       moderation_notes: 管理備忘
       most_recent_activity: 最近活動
       most_recent_ip: 最近 IP 位址
-      no_account_selected: 未選取任何帳戶,因此未變更
+      no_account_selected: 未選取任何帳號,因此未變更
       no_limits_imposed: 未受限制
       not_subscribed: 未訂閱
       pending: 等待審核中
@@ -168,7 +168,7 @@ zh-TW:
       redownload: 重新整理個人資料
       redownloaded_msg: 成功重新載入%{username} 的個人資料頁面
       reject: 拒絕
-      rejected_msg: 成功拒絕了%{username} 的新帳戶申請
+      rejected_msg: 成功拒絕了%{username} 的新帳號申請
       remove_avatar: 取消頭像
       remove_header: 移除開頭
       removed_avatar_msg: 成功刪除了 %{username} 的頭像
@@ -205,18 +205,18 @@ zh-TW:
       subscribe: 訂閱
       suspend: 停權
       suspended: 已停權
-      suspension_irreversible: 已永久刪除這個帳戶的數據。雖然這個帳戶的數據已被永久刪除,但是您仍然可以取消暫停這個帳戶。
-      suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。
-      title: 帳戶
+      suspension_irreversible: 已永久刪除這個帳號的數據。雖然這個帳號的數據已被永久刪除,但是您仍然可以取消暫停這個帳號。
+      suspension_reversible_hint_html: 這個帳號已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳號。如果您想即時刪除這個帳號的數據,您可以在下面進行操作。
+      title: 帳號
       unblock_email: 解除封鎖電子郵件地址
       unblocked_email_msg: 成功解除封鎖 %{username} 的電子郵件地址
       unconfirmed_email: 未確認的電子信箱地址
       undo_sensitized: 取消敏感狀態
       undo_silenced: 取消靜音
       undo_suspension: 取消停權
-      unsilenced_msg: 成功解除 %{username} 的帳戶限制
+      unsilenced_msg: 成功解除 %{username} 的帳號限制
       unsubscribe: 取消訂閱
-      unsuspended_msg: 成功取消暫停 %{username} 的帳戶
+      unsuspended_msg: 成功取消暫停 %{username} 的帳號
       username: 使用者名稱
       view_domain: 查看站台概要
       warn: 警告
@@ -250,32 +250,32 @@ zh-TW:
         disable_2fa_user: 停用兩階段認證
         disable_custom_emoji: 停用自訂顏文字
         disable_sign_in_token_auth_user: 停用使用者電子信箱 token 驗證
-        disable_user: 停用帳戶
+        disable_user: 停用帳號
         enable_custom_emoji: 啓用自訂顏文字
         enable_sign_in_token_auth_user: 啟用使用者電子信箱 token 驗證
-        enable_user: 啓用帳戶
-        memorialize_account: 設定成紀念帳戶
+        enable_user: 啓用帳號
+        memorialize_account: 設定成紀念帳號
         promote_user: 把用戶升級
-        reject_appeal: 回絕申訴
+        reject_appeal: 駁回申訴
         reject_user: 回絕使用者
         remove_avatar_user: 刪除大頭貼
         reopen_report: 重開舉報
         reset_password_user: 重設密碼
         resolve_report: 消除舉報
-        sensitive_account: 把您的帳戶的媒體標記為敏感內容
-        silence_account: 靜音用戶
-        suspend_account: 暫停用戶
+        sensitive_account: 把您的帳號的媒體標記為敏感內容
+        silence_account: 靜音帳號
+        suspend_account: 停權帳號
         unassigned_report: 取消指派舉報
         unblock_email_account: 解除封鎖電子郵件地址
-        unsensitive_account: 取消把您的帳戶的媒體設定為敏感內容
-        unsilence_account: 取消用戶的靜音狀態
-        unsuspend_account: 取消用戶的暫停狀態
+        unsensitive_account: 取消把您的帳號的媒體設定為敏感內容
+        unsilence_account: 取消帳號的靜音狀態
+        unsuspend_account: 取消帳號的暫停狀態
         update_announcement: 更新公告
         update_custom_emoji: 更新自訂顏文字
         update_domain_block: 更新封鎖網域
         update_status: 更新狀態
       actions:
-        approve_appeal_html: "%{name} 批准了來自 %{target} 的審核決定上訴"
+        approve_appeal_html: "%{name} 批准了來自 %{target} 的審核決定申訴"
         approve_user_html: "%{name} 批准了從 %{target} 而來的註冊"
         assigned_to_self_report_html: "%{name} 將報告 %{target} 指派給自己"
         change_email_user_html: "%{name} 變更了使用者 %{target} 的電子信箱地址"
@@ -305,9 +305,9 @@ zh-TW:
         enable_custom_emoji_html: "%{name} 啟用了自訂表情符號 %{target}"
         enable_sign_in_token_auth_user_html: "%{name} 啟用了 %{target} 之使用者電子信箱 token 驗證"
         enable_user_html: "%{name} 將使用者 %{target} 設定為允許登入"
-        memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳戶"
+        memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳號"
         promote_user_html: "%{name} 對使用者 %{target} 進行了晉級操作"
-        reject_appeal_html: "%{name} 回絕了來自 %{target} 的審核決定上訴"
+        reject_appeal_html: "%{name} 回絕了來自 %{target} 的審核決定申訴"
         reject_user_html: "%{name} 回絕了從 %{target} 而來的註冊"
         remove_avatar_user_html: "%{name} 移除了 %{target} 的大頭貼"
         reopen_report_html: "%{name} 重新開啟 %{target} 的檢舉"
@@ -420,9 +420,9 @@ zh-TW:
       existing_domain_block_html: 您已經對 %{name} 施加了更嚴格的限制,您需要先把他<a href="%{unblock_url}">取消封鎖</a>。
       new:
         create: 新增封鎖
-        hint: 站點封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。
+        hint: 站點封鎖動作並不會阻止帳號紀錄被新增至資料庫,但會自動回溯性地對那些帳號套用特定管理設定。
         severity:
-          desc_html: "「<strong>靜音</strong>」令該站點下使用者的嘟文,設定為只對關注者顯示,沒有關注的人會看不到。「<strong>停權</strong>」會刪除將該站點下使用者的嘟文、媒體檔案和個人資料。「<strong>無</strong>」則會拒絕接收來自該站點的媒體檔案。"
+          desc_html: "「<strong>靜音</strong>」令該站點下使用者的嘟文,設定為只對跟隨者顯示,沒有跟隨的人會看不到。「<strong>停權</strong>」會刪除將該站點下使用者的嘟文、媒體檔案和個人資料。「<strong>無</strong>」則會拒絕接收來自該站點的媒體檔案。"
           noop: 無
           silence: 靜音
           suspend: 停權
@@ -432,7 +432,7 @@ zh-TW:
       private_comment: 私人留言
       private_comment_hint: 請提供更多有關此站台限制的資訊以供版主作內部參考。
       public_comment: 公開留言
-      public_comment_hint: 如果你已經啟用站台限制列表的公告,請為一般大眾提供更多有關此站台限制的資訊。
+      public_comment_hint: 如果您已經啟用站台限制列表的公告,請為一般大眾提供更多有關此站台限制的資訊。
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地快取的媒體檔案,並且不再接收來自該站點的任何媒體檔案。與停權無關
       reject_reports: 拒絕檢舉
@@ -526,8 +526,8 @@ zh-TW:
       purge_description_html: 若您相信此網域將永久離線,您可以自儲存空間中刪除該網域所有帳號紀錄及相關資料。這可能花費一些時間。
       title: 聯邦
       total_blocked_by_us: 被我們封鎖
-      total_followed_by_them: 被他們關注
-      total_followed_by_us: 被我們關注
+      total_followed_by_them: 被他們跟隨
+      total_followed_by_us: 被我們跟隨
       total_reported: 關於他們的舉報
       total_storage: 多媒體附檔
       totals_time_period_hint_html: 以下顯示之總和包含所有時間的資料。
@@ -559,11 +559,11 @@ zh-TW:
     relays:
       add_new: 新增中繼站
       delete: 刪除
-      description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
+      description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦宇宙中探索內容</strong>,而無須本地使用者手動跟隨遠端伺服器的其他使用者。"
       disable: 停用
       disabled: 停用
       enable: 啟用
-      enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。
+      enable_hint: 啟用後,您的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。
       enabled: 已啟用
       inbox_url: 中繼URL
       pending: 等待中繼站審核
@@ -591,10 +591,10 @@ zh-TW:
         suspend_description_html: 個人頁面及其內容將無法被存取,直到其最終被刪除。將無法與此帳號互動。此設定 30 日內可被還原。
       actions_description_html: 決定應對此報告採取何種行動。若您對檢舉之帳號採取懲罰措施,則將對他們發送 e-mail 通知,如非選擇了 <strong>垃圾郵件</strong> 類別。
       add_to_report: 加入更多至報告
-      are_you_sure: 你確定嗎?
+      are_you_sure: 您確定嗎?
       assign_to_self: 指派給自己
       assigned: 指派負責人
-      by_target_domain: 檢舉帳戶之網域
+      by_target_domain: 檢舉帳號之網域
       category: 分類
       category_description_html: 此帳號及/或被檢舉內容之原因會被引用在檢舉帳號通知中
       comment:
@@ -628,7 +628,7 @@ zh-TW:
       status: 嘟文
       statuses: 被檢舉的內容
       statuses_description_html: 侵犯性違規內容會被引用在檢舉帳號通知中
-      target_origin: 檢舉帳戶之來源
+      target_origin: 檢舉帳號之來源
       title: 檢舉
       unassign: 取消指派
       unresolved: 未解決
@@ -646,8 +646,8 @@ zh-TW:
         desc_html: 本站使用者發佈的嘟文數量,以及本站的活躍使用者與一週內新使用者數量
         title: 公開使用者活躍度的統計數據
       bootstrap_timeline_accounts:
-        desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳戶。如果留空,則預設關注本站所有管理員。
-        title: 新使用者預設關注
+        desc_html: 以半形逗號分隔多個使用者名稱。只能加入來自本站且未開啟保護的帳號。如果留空,則預設跟隨本站所有管理員。
+        title: 新使用者預設跟隨
       contact_information:
         email: 用於聯絡的公開電子信箱地址
         username: 請輸入使用者名稱
@@ -684,8 +684,8 @@ zh-TW:
           desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤
           title: 關閉註冊訊息
         deletion:
-          desc_html: 允許所有人刪除自己的帳戶
-          title: 開放刪除帳戶的權限
+          desc_html: 允許所有人刪除自己的帳號
+          title: 開放刪除帳號的權限
         min_invite_role:
           disabled: 沒有人
           title: 允許發送邀請的身份
@@ -734,7 +734,7 @@ zh-TW:
       delete: 刪除上傳的檔案
       destroyed_msg: 成功刪除站台的上傳項目!
     statuses:
-      back_to_account: 返回帳戶訊息頁
+      back_to_account: 返回帳號訊息頁
       back_to_report: 回到檢舉報告頁面
       batch:
         remove_from_report: 從檢舉報告中移除
@@ -743,7 +743,7 @@ zh-TW:
       media:
         title: 媒體檔案
       no_status_selected: 因未選擇嘟文而未變更。
-      title: 帳戶嘟文
+      title: 帳號嘟文
       with_media: 含有媒體檔案
     strikes:
       actions:
@@ -766,9 +766,9 @@ zh-TW:
         version_comparison: Elasticsearch %{running_version} 版正在執行,需要 %{required_version} 版。
       rules_check:
         action: 管理服务器规则
-        message_html: 你没有定义任何服务器规则。
+        message_html: 您没有定義任何伺服器規則。
       sidekiq_process_check:
-        message_html: 没有队列 %{value} 的Sidekiq进程,请检查你的Sidekiq配置
+        message_html: 沒有佇列 %{value} 的 Sidekiq 行程,請檢查您的 Sidekiq 設定組態
     tags:
       review: 審核嘟文
       updated_msg: 成功更新主題標籤設定
@@ -844,12 +844,12 @@ zh-TW:
         sensitive: 要將他們的帳號標記為含有敏感內容
         silence: 要限制他們的帳號
         suspend: 要停權他們的帳號
-      body: "%{target} 正在就 %{date} 的 %{action_taken_by} 做出的審核決定提出上訴,該決定是 %{type}。他們寫道:"
+      body: "%{target} 正在就 %{date} 的 %{action_taken_by} 做出的審核決定提出申訴,該決定是 %{type}。他們寫道:"
       next_steps: 您可以批准申訴以還原審核決定,或是忽略它。
       subject: "%{username} 正在申訴 %{instance} 上的審核決定"
     new_pending_account:
-      body: 以下是新帳戶的詳細資訊。您可以同意或拒絕這項申請。
-      subject: "%{instance} 上有新帳戶 (%{username}) 待審核"
+      body: 以下是新帳號的詳細資訊。您可以同意或拒絕這項申請。
+      subject: "%{instance} 上有新帳號 (%{username}) 待審核"
     new_report:
       body: "%{reporter} 檢舉了使用者 %{target}"
       body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target}
@@ -871,10 +871,10 @@ zh-TW:
       subject: "%{instance} 有待審核之新熱門"
   aliases:
     add_new: 建立別名
-    created_msg: 成功建立別名。您可以自舊帳戶開始轉移。
-    deleted_msg: 成功移除別名。您將無法再由舊帳戶轉移到目前的帳戶。
+    created_msg: 成功建立別名。您可以自舊帳號開始轉移。
+    deleted_msg: 成功移除別名。您將無法再由舊帳號轉移到目前的帳號。
     empty: 您目前沒有任何別名。
-    hint_html: 如果想由其他帳戶轉移到此帳戶,您可以在此處建立別名,稍後系統將容許您把關注者由舊帳戶轉移至此。此項作業是<strong>無害且可復原的</strong>。 <strong>帳戶的遷移程序需要在舊帳戶啟動</strong>。
+    hint_html: 如果想由其他帳號轉移到此帳號,您可以在此處創建別名,稍後系統將容許您把跟隨者由舊帳號轉移至此。此項作業是<strong>無害且可復原的</strong>。 <strong>帳號的遷移程序需要在舊帳號啟動</strong>。
     remove: 取消連結別名
   appearance:
     advanced_web_interface: 進階網頁介面
@@ -902,18 +902,18 @@ zh-TW:
     regenerate_token: 重設 token
     token_regenerated: 已重設 token
     warning: 警告,不要把它分享給任何人!
-    your_token: 你的 token
+    your_token: 您的 access token
   auth:
     apply_for_account: 索取註冊邀請
     change_password: 密碼
     checkbox_agreement_html: 我同意 <a href="%{rules_path}" target="_blank">之伺服器規則</a> 以及 <a href="%{terms_path}" target="_blank">服務條款</a>
     checkbox_agreement_without_rules_html: 我同意 <a href="%{terms_path}" target="_blank">服務條款</a>
-    delete_account: 刪除帳戶
-    delete_account_html: 如果你想刪除你的帳戶,請<a href="%{path}">點擊這裡繼續</a>。你需要確認你的操作。
+    delete_account: 刪除帳號
+    delete_account_html: 如果您欲刪除您的帳號,請<a href="%{path}">點擊這裡繼續</a>。您需要確認您的操作。
     description:
       prefix_invited_by_user: "@%{name} 邀請您加入這個 Mastodon 伺服器!"
-      prefix_sign_up: 現在就註冊 Mastodon 帳戶吧!
-      suffix: 有了帳戶,就可以從任何 Mastodon 伺服器關注任何人、發發廢嘟,並且與任何 Mastodon 伺服器的使用者交流,以及更多!
+      prefix_sign_up: 現在就註冊 Mastodon 帳號吧!
+      suffix: 有了帳號,就可以從任何 Mastodon 伺服器跟隨任何人、發發廢嘟,並且與任何 Mastodon 伺服器的使用者交流,以及更多!
     didnt_get_confirmation: 沒有收到驗證信?
     dont_have_your_security_key: 找不到您的安全金鑰?
     forgot_password: 忘記密碼?
@@ -923,8 +923,8 @@ zh-TW:
     log_in_with: 登入,使用
     login: 登入
     logout: 登出
-    migrate_account: 轉移到另一個帳戶
-    migrate_account_html: 如果你希望引導他人關注另一個帳戶,請<a href="%{path}">到這裡設定</a>。
+    migrate_account: 轉移到另一個帳號
+    migrate_account_html: 如果您希望引導他人關注另一個帳號,請 <a href="%{path}">到這裡設定</a>。
     or_log_in_with: 或透過其他方式登入
     providers:
       cas: CAS
@@ -937,10 +937,10 @@ zh-TW:
     set_new_password: 設定新密碼
     setup:
       email_below_hint_html: 如果此電子郵件地址不正確,您可於此修改並接收郵件進行認證。
-      email_settings_hint_html: 請確認電子信件是否寄至 %{email} 。如果不對的話,可以在帳戶設定裡變更。
+      email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。
       title: 設定
     status:
-      account_status: 帳戶狀態
+      account_status: 帳號狀態
       confirming: 等待電子郵件確認完成。
       functional: 您的帳號可以正常使用了。
       pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將在申請通過後以電子郵件方式通知您。
@@ -950,17 +950,17 @@ zh-TW:
     trouble_logging_in: 登錄時遇到困難?
     use_security_key: 使用安全金鑰
   authorize_follow:
-    already_following: 你已經關注了這個使用者
+    already_following: 您已經跟隨了這個使用者
     already_requested: 您早已向該帳戶寄送追蹤請求
     error: 對不起,搜尋其他站點使用者出現錯誤
-    follow: 關注
-    follow_request: 關注請求已經發送給:
-    following: 成功! 你正在關注:
+    follow: 跟隨
+    follow_request: 跟隨請求已發送給:
+    following: 成功!您正在跟隨:
     post_follow:
-      close: 你也可以直接關閉這個頁面。
+      close: 您可以直接關閉此頁面。
       return: 顯示個人資料頁
       web: 返回本站
-    title: 關注 %{acct}
+    title: 跟隨 %{acct}
   challenge:
     confirm: 繼續
     hint_html: "<strong>温馨小提醒:</strong> 我們在接下來一小時內不會再要求您輸入密碼。"
@@ -990,21 +990,21 @@ zh-TW:
       x_seconds: "%{count}秒"
   deletes:
     challenge_not_passed: 您所輸入的資料不正確
-    confirm_password: 輸入你現在的密碼來驗證身份
+    confirm_password: 輸入您現在的密碼以驗證身份
     confirm_username: 請輸入您的使用者名稱以作確認
     proceed: 刪除帳戶
-    success_msg: 你的帳戶已經成功刪除
+    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: 你將無法復原或重新啟用你的帳戶
+      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: 你的使用者名稱將會釋出供他人使用
-      username_unavailable: 你的使用者名稱將會保留並不予他人使用
+      username_available: 您的使用者名稱將會釋出供他人使用
+      username_unavailable: 您的使用者名稱將會保留並不予他人使用
   directories:
     directory: 個人資料目錄
     explanation: 根據興趣去發現新朋友
@@ -1014,15 +1014,17 @@ zh-TW:
       action_taken: 採取的行動
       appeal: 申訴
       appeal_approved: 此警示已成功申訴,不再有效
-      appeal_rejected: 申訴已被回絕
+      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}"
@@ -1036,12 +1038,12 @@ zh-TW:
         suspend: 帳號停權
       your_appeal_approved: 您的申訴已被批准
       your_appeal_pending: 您已遞交申訴
-      your_appeal_rejected: 您的申訴已被回絕
+      your_appeal_rejected: 您的申訴已被駁回
   domain_validator:
     invalid_domain: 並非一個有效域名
   errors:
-    '400': 你所送出的請求無效或格式不正確。
-    '403': 你沒有觀看這個頁面的權限。
+    '400': 您所送出的請求無效或格式不正確。
+    '403': 您沒有檢視這個頁面的權限。
     '404': 您所尋找的網頁不存在。
     '406': 此頁面無法以請求的格式顯示。
     '410': 您所尋找的網頁此處已不存在。
@@ -1053,7 +1055,7 @@ zh-TW:
       content: 抱歉,我們的後台出現問題了。
       title: 這個頁面有問題
     '503': 此頁面因伺服器暫時發生錯誤而無法提供。
-    noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 <a href="%{apps_path}">Mastodon 應用</a>。
+    noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。您也可以選擇適用於您的平台的 <a href="%{apps_path}">Mastodon 應用</a>。
   existing_username_validator:
     not_found: 無法在本站找到這個名稱的使用者
     not_found_multiple: 揣嘸 %{usernames}
@@ -1061,8 +1063,8 @@ zh-TW:
     archive_takeout:
       date: 日期
       download: 下載檔案
-      hint_html: 你可以下載包含你的<strong>文章和媒體</strong>的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。每次允許存檔的間隔至少7天。
-      in_progress: 正在準備你的存檔...
+      hint_html: 您可以下載包含您的<strong>文章和媒體</strong>的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。每次允許存檔的間隔至少 7 天。
+      in_progress: 正在準備您的存檔...
       request: 下載存檔
       size: 大小
     blocks: 您封鎖的使用者
@@ -1075,7 +1077,7 @@ zh-TW:
   featured_tags:
     add_new: 追加
     errors:
-      limit: 你所推薦的標籤數量已經達到上限
+      limit: 您所推薦的標籤數量已經達到上限
     hint_html: "<strong>推薦標籤是什麼?</strong> 這些標籤將顯示於您的公開個人檔案頁,訪客可以藉此閱覽您標示了這些標籤的嘟文,拿來展示創意作品或者長期更新的專案很好用唷!"
   filters:
     contexts:
@@ -1121,7 +1123,7 @@ zh-TW:
       merge_long: 保留現有記錄並新增紀錄
       overwrite: 覆蓋
       overwrite_long: 以新的紀錄覆蓋目前紀錄
-    preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。
+    preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括跟隨的使用者、封鎖的使用者名單。
     success: 資料檔上傳成功,正在匯入,請稍候
     types:
       blocking: 您封鎖的使用者名單
@@ -1143,7 +1145,7 @@ zh-TW:
       '86400': 1 天後
     expires_in_prompt: 永不過期
     generate: 建立邀請連結
-    invited_by: 你的邀請人是:
+    invited_by: 您的邀請人是:
     max_uses:
       other: "%{count} 則"
     max_uses_prompt: 無限制
@@ -1154,7 +1156,7 @@ zh-TW:
     title: 邀請使用者
   lists:
     errors:
-      limit: 你所建立的列表數量已經達到上限
+      limit: 您所建立的列表數量已經達到上限
   login_activities:
     authentication_methods:
       otp: 兩步驟驗證應用程式
@@ -1172,25 +1174,25 @@ zh-TW:
       not_ready: 修但幾勒!不能附加未完成處理的檔案欸,咁按呢?
       too_many: 無法加入超過 4 個檔案
   migrations:
-    acct: 新帳戶的 使用者名稱@站點網域
+    acct: 新帳號的 使用者名稱@站點網域
     cancel: 取消重導向
-    cancel_explanation: 取消重新導向將會重新啟用目前帳戶,但不會還原已移至該帳號的關注者。
+    cancel_explanation: 取消重導向將會重新啓用目前帳號,但不會還原已移至該帳號的跟隨者。
     cancelled_msg: 成功取消重導向。
     errors:
-      already_moved: 與已經重導向的帳戶相同
-      missing_also_known_as: 不是這個帳戶的別名
-      move_to_self: 不能是目前帳戶
+      already_moved: 與已經重導向的帳號相同
+      missing_also_known_as: 不是這個帳號的別名
+      move_to_self: 不能是目前帳號
       not_found: 找不到
-      on_cooldown: 你正在處於冷卻(CD)狀態
+      on_cooldown: 您正在處於冷卻(CD)狀態
     followers_count: 轉移時的追隨者
-    incoming_migrations: 自另一個帳戶轉移
+    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}
+    proceed_with_move: 移動跟隨者
+    redirected_msg: 您的帳號現在指向 %{acct}
     redirecting_to: 您的帳號目前正被重新導向到 %{acct}
     set_redirect: 設定重新導向
     warning:
@@ -1214,36 +1216,36 @@ zh-TW:
         subject: "%{name} 已進行註冊"
     digest:
       action: 閱覽所有通知
-      body: 以下是自%{since}你最後一次登入以來錯過的訊息摘要
-      mention: "%{name} 在此提及了你:"
+      body: 以下是自 %{since} 您最後一次登入以來錯過的訊息摘要
+      mention: "%{name} 在此提及了您:"
       new_followers_summary:
         other: 此外,您在離開時獲得了 %{count} 位新的追蹤者!超棒的!
       subject:
         other: "從您上次造訪以來有 %{count} 個新通知 🐘"
-      title: 你不在的時候...
+      title: 您不在的時候...
     favourite:
-      body: '你的嘟文被 %{name} 加入了最愛:'
-      subject: "%{name} 將你的嘟文加入了最愛"
+      body: 您的嘟文被 %{name} 加入了最愛:
+      subject: "%{name} 將您的嘟文加入了最愛"
       title: 新的最愛
     follow:
-      body: "%{name} 開始關注你!"
-      subject: "%{name} 開始關注你"
-      title: 新的關注者
+      body: "%{name} 開始跟隨您!"
+      subject: "%{name} 開始跟隨您"
+      title: 新的跟隨者
     follow_request:
-      action: 處理關注請求
-      body: "%{name} 要求關注你"
-      subject: 等待關注你的使用者︰ %{name}
-      title: 新的關注請求
+      action: 處理跟隨請求
+      body: "%{name} 要求跟隨您"
+      subject: 等待跟隨您的使用者︰ %{name}
+      title: 新的跟隨請求
     mention:
       action: 回覆
-      body: "%{name} 在嘟文中提及你:"
-      subject: "%{name} 在嘟文中提及你"
+      body: "%{name} 在嘟文中提及您:"
+      subject: "%{name} 在嘟文中提及您"
       title: 新的提及
     poll:
       subject: 由 %{name} 發起的投票已結束
     reblog:
-      body: '你的嘟文被 %{name} 轉嘟:'
-      subject: "%{name} 轉嘟了你的嘟文"
+      body: 您的嘟文被 %{name} 轉嘟:
+      subject: "%{name} 轉嘟了您的嘟文"
       title: 新的轉嘟
     status:
       subject: "%{name} 剛剛嘟文"
@@ -1251,7 +1253,7 @@ zh-TW:
       subject: "%{name} 編輯了貼文"
   notifications:
     email_events: 電子郵件通知設定
-    email_events_hint: 選取你想接收通知的事件:
+    email_events_hint: 選取您想接收通知的事件:
     other_settings: 其他通知設定
   number:
     human:
@@ -1312,13 +1314,13 @@ zh-TW:
     remove_selected_domains: 從所選網域中移除所有追隨者
     remove_selected_followers: 移除所選的跟隨者
     remove_selected_follows: 取消跟隨所選使用者
-    status: 帳戶狀態
+    status: 帳號狀態
   remote_follow:
     acct: 請輸入您的使用者名稱@站點網域
     missing_resource: 無法找到資源
     no_account_html: 還沒有帳號?您可以<a href='%{sign_up_path}' target='_blank'>於這裡註冊</a>
     proceed: 下一步
-    prompt: '您希望關注:'
+    prompt: 您希望跟隨:
     reason_html: "<strong>為什麼要經過這個步驟?</strong>因為<code>%{instance}</code>未必是您註冊的伺服器,我們需要先將您帶回您駐在的伺服器。"
   remote_interaction:
     favourite:
@@ -1333,6 +1335,11 @@ zh-TW:
   reports:
     errors:
       invalid_rules: 未引用有效規則
+  rss:
+    content_warning: 內容警告:
+    descriptions:
+      account: 來自 @%{acct} 之公開嘟文
+      tag: '帶有 #%{hashtag} 之公開嘟文'
   scheduled_statuses:
     over_daily_limit: 您已經超過了本日排定發嘟的限額 (%{limit})
     over_total_limit: 您已經超過了排定發嘟的限額 (%{limit})
@@ -1360,7 +1367,7 @@ zh-TW:
       weibo: 新浪微博
     current_session: 目前的 session
     description: "%{platform} 上的 %{browser}"
-    explanation: 這些是現在正登入於你的 Mastodon 帳戶的瀏覽器。
+    explanation: 這些是現在正登入於您 Mastodon 帳號的瀏覽器。
     ip: IP 位址
     platforms:
       adobe_air: Adobe Air
@@ -1380,20 +1387,20 @@ zh-TW:
     title: 作業階段
     view_authentication_history: 檢視您帳號的身份驗證歷史紀錄
   settings:
-    account: 帳戶
-    account_settings: 帳戶設定
-    aliases: 帳戶別名
+    account: 帳號
+    account_settings: 帳號設定
+    aliases: 帳號別名
     appearance: 外觀設定
     authorized_apps: 已授權應用程式
     back: 回到 Mastodon
-    delete: 刪除帳戶
+    delete: 刪除帳號
     development: 開發
     edit_profile: 編輯使用者資訊
     export: 匯出
     featured_tags: 推薦標籤
     import: 匯入
     import_and_export: 匯入及匯出
-    migrate: 帳戶搬遷
+    migrate: 帳號搬遷
     notifications: 通知
     preferences: 偏好設定
     profile: 使用者資訊
@@ -1423,7 +1430,7 @@ zh-TW:
     over_character_limit: 超過了 %{max} 字的限制
     pin_errors:
       direct: 無法釘選只有僅提及使用者可見之嘟文
-      limit: 你所置頂的嘟文數量已經達到上限
+      limit: 您所置頂的嘟文數量已經達到上限
       ownership: 不能置頂他人的嘟文
       reblog: 不能置頂轉嘟
     poll:
@@ -1440,8 +1447,8 @@ zh-TW:
     title: "%{name}:「%{quote}」"
     visibilities:
       direct: 私訊
-      private: 僅關注者
-      private_long: 只有關注你的人能看到
+      private: 僅限跟隨者
+      private_long: 只有跟隨您的人能看到
       public: 公開
       public_long: 所有人都能看到
       unlisted: 公開,但不在公共時間軸顯示
@@ -1485,6 +1492,9 @@ zh-TW:
     pinned: 置頂嘟文
     reblogged: 轉嘟
     sensitive_content: 敏感內容
+  strikes:
+    errors:
+      too_late: 您太晚申訴這個警示了
   tags:
     does_not_match_previous_name: 與先前的名稱不吻合
   terms:
@@ -1574,7 +1584,7 @@ zh-TW:
     mastodon-light: Mastodon(亮色主題)
   time:
     formats:
-      default: "%Y年%-m月%d日 %H:%M"
+      default: "%Y 年 %b 月 %d 日 %H:%M"
       month: "%b %Y"
       time: "%H:%M"
   two_factor_authentication:
@@ -1585,12 +1595,12 @@ zh-TW:
     enabled: 兩階段認證已啟用
     enabled_success: 已成功啟用兩階段認證
     generate_recovery_codes: 產生備用驗證碼
-    lost_recovery_codes: 讓你可以在遺失手機時,使用備用驗證碼登入。如果你遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。
+    lost_recovery_codes: 讓您可以在遺失手機時,使用備用驗證碼登入。若您遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。
     methods: 兩步驟方式
     otp: 驗證應用程式
     recovery_codes: 備份備用驗證碼
     recovery_codes_regenerated: 成功產生新的備用驗證碼
-    recovery_instructions_html: 如果你的手機無法使用,你可以使用下列任意一個備用驗證碼來重新獲得帳戶的訪問權。<strong>請妥善保管好你的備用驗證碼</strong>(例如,你可以將它們列印出來,與你的其他重要文件放在一起)。
+    recovery_instructions_html: 若您的手機無法使用,您可以使用下列任意一個備用驗證碼來重新獲得帳號的訪問權。<strong>請妥善保管好您的備用驗證碼</strong>(例如,可以將它們列印出來,與您的其他重要文件放在一起)。
     webauthn: 安全金鑰
   user_mailer:
     appeal_approved:
@@ -1599,12 +1609,12 @@ zh-TW:
       subject: 您在 %{date} 提出的申訴已獲批准
       title: 申訴已批准
     appeal_rejected:
-      explanation: 您在 %{appeal_date} 遞交的針對您帳號的 %{strike_date} 警示的申訴已被回絕。
-      subject: 您在 %{date} 提出的申訴已被回絕
-      title: 申訴被回絕
+      explanation: 您在 %{appeal_date} 遞交的針對您帳號的 %{strike_date} 警示的申訴已被駁回。
+      subject: 您在 %{date} 提出的申訴已被駁回
+      title: 申訴被駁回
     backup_ready:
-      explanation: 你要求的 Mastodon 帳戶完整備份檔案現已就緒,可供下載!
-      subject: 你的備份檔已可供下載
+      explanation: 您要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載!
+      subject: 您的備份檔已可供下載
       title: 檔案匯出
     suspicious_sign_in:
       change_password: 變更密碼
@@ -1625,7 +1635,7 @@ zh-TW:
         mark_statuses_as_sensitive: 您的部份嘟文已被 %{instance} 的管理員標記為敏感。這代表了人們必須在顯示預覽前點擊嘟文中的媒體。您可以在將來嘟文時自己將媒體標記為敏感。
         sensitive: 由此刻起,您所有上傳的媒體檔案將被標記為敏感內容,並且隱藏於點擊警告之後。
         silence: 您仍然可以使用您的帳號,但僅有已追蹤您的人才能看到您在此伺服器的貼文,您也可能會從各式探索功能中被排除。但其他人仍可手動追蹤您。
-        suspend: 您將不能使用您的帳號,您的個人資料頁面及其他資料將不再能被存取。您仍可於約 30 日內資料被完全刪除前要求下載你的資料,但我們仍會保留一部份基本資料,以防止有人規避停權處罰。
+        suspend: 您將不能使用您的帳號,您的個人資料頁面及其他資料將不再能被存取。您仍可於約 30 日內資料被完全刪除前要求下載您的資料,但我們仍會保留一部份基本資料,以防止有人規避停權處罰。
       reason: 原因:
       statuses: 引用的嘟文:
       subject:
@@ -1646,27 +1656,27 @@ zh-TW:
         suspend: 帳號己被停用
     welcome:
       edit_profile_action: 設定個人資料
-      edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、變更顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。
-      explanation: 下面是幾個小幫助,希望它們能幫到你
+      edit_profile_step: 您可以設定您的個人資料,包括上傳頭像、橫幅圖片、變更顯示名稱等等。如果想在新的跟隨者跟隨您之前對他們進行審核,您也可以選擇為您的帳號設為「私人」。
+      explanation: 下面是幾個小幫助,希望它們能幫到您
       final_action: 開始嘟嘟
-      final_step: '開始嘟嘟吧! 即使你現在沒有關注者,其他人仍然能在本站時間軸或著話題標籤等地方看到你的公開嘟文。試著用 #introductions 這個話題標籤介紹一下自己吧。'
-      full_handle: 你的完整帳戶名稱
-      full_handle_hint: 你需要把這告訴你的朋友們,這樣他們就能從另一個伺服器向你發送訊息或著關注你。
+      final_step: '開始嘟嘟吧!即使您現在沒有跟隨者,其他人仍然能在本站時間軸或著話題標籤等地方看到您的公開嘟文。試著用 #introductions 這個話題標籤介紹一下自己吧。'
+      full_handle: 您的完整帳號名稱
+      full_handle_hint: 您需要把這告訴你的朋友們,這樣他們就能從另一個伺服器向您發送訊息或著跟隨您。
       review_preferences_action: 變更偏好設定
-      review_preferences_step: 記得調整你的偏好設定,比如你想接收什麼類型的電子郵件,或著你想把你的嘟文可見範圍預設設定什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。
+      review_preferences_step: 記得調整您的偏好設定,比如想接收什麼類型的電子郵件,或著想把您的嘟文可見範圍預設設定什麼級別。如果您沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。
       subject: 歡迎來到 Mastodon
-      tip_federated_timeline: 跨站公共時間軸可以讓你一窺更廣闊的 Mastodon 網路。不過,由於它們只顯示你的鄰居們所訂閱的內容,所以並不是全部。
-      tip_following: 預設情況下,你會自動關注你所在站點的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸與跨站公共時間軸哦。
-      tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 上的使用者。他們就是離你最近的鄰居!
-      tip_mobile_webapp: 如果你的行動裝置瀏覽器允許你將 Mastodon 新增到主螢幕,你就能夠接收推送訊息。它就像手機APP一樣好用!
+      tip_federated_timeline: 跨站公共時間軸可以讓您一窺更廣闊的 Mastodon 網路。不過,由於它們只顯示您的鄰居們所訂閱的內容,所以並不是全部。
+      tip_following: 預設情況下,您會自動跟隨您所在站點的管管。想結交更多有趣的人的話,請記得多逛逛本站時間軸與跨站公共時間軸哦。
+      tip_local_timeline: 本站時間軸可以讓您一窺 %{instance} 上的使用者。他們就是離您最近的鄰居!
+      tip_mobile_webapp: 如果您的行動裝置瀏覽器允許將 Mastodon 新增到主螢幕,您就能夠接收推播通知。它就像手機 APP 一樣好用!
       tips: 小幫手
-      title: "%{name} 歡迎你的加入!"
+      title: "%{name} 誠摯歡迎您的加入!"
   users:
     follow_limit_reached: 您無法追蹤多於 %{limit} 個人
     invalid_otp_token: 兩階段認證碼不正確
-    otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫
-    seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼與電子郵件。
-    signed_in_as: 目前登入的帳戶:
+    otp_lost_help_html: 如果您無法訪問這兩者,可以透過 %{email} 與我們聯繫
+    seamless_external_login: 由於您是由外部系統登入,所以不能設定密碼與電子郵件。
+    signed_in_as: 目前登入的帳號:
   verification:
     explanation_html: 您在 Mastodon 個人資料頁上所列出的連結,可以用此方式<strong>驗證您確實掌控該連結網頁的內容</strong>。您可以在連結的網頁上加上一個連回 Mastodon 個人資料頁的連結,該連結的原始碼 <strong>必須</strong>包含<code>rel="me"</code>屬性。連結的顯示文字可自由發揮,以下為範例:
     verification: 驗證連結
@@ -1674,7 +1684,7 @@ zh-TW:
     add: 新增安全金鑰
     create:
       error: 新增安全金鑰時出現了問題。請再試一次。
-      success: 你已成功加入安全金鑰。
+      success: 您已成功加入安全金鑰。
     delete: 刪除
     delete_confirmation: 您確定要移除這把安全金鑰嗎?
     description_html: 如果您啟用<strong>安全金鑰驗證</strong>的話,您將在登入時需要使用其中一把安全金鑰。
diff --git a/config/routes.rb b/config/routes.rb
index 574715705..5ab3ec1e1 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -194,7 +194,25 @@ Rails.application.routes.draw do
     get '/dashboard', to: 'dashboard#index'
 
     resources :domain_allows, only: [:new, :create, :show, :destroy]
-    resources :domain_blocks, only: [:new, :create, :destroy, :update, :edit]
+    resources :domain_blocks, only: [:new, :create, :show, :destroy, :update, :edit] do
+      collection do
+        post :batch
+      end
+    end
+
+    resources :export_domain_allows, only: [:new] do
+      collection do
+        get :export, constraints: { format: :csv }
+        post :import
+      end
+    end
+
+    resources :export_domain_blocks, only: [:new] do
+      collection do
+        get :export, constraints: { format: :csv }
+        post :import
+      end
+    end
 
     resources :email_domain_blocks, only: [:index, :new, :create] do
       collection do
@@ -471,6 +489,7 @@ Rails.application.routes.draw do
       end
 
       resource :domain_blocks, only: [:show, :create, :destroy]
+
       resource :directory, only: [:show]
 
       resources :follow_requests, only: [:index] do
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 26be26326..2a3871468 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -21,6 +21,10 @@
     every: '6h'
     class: Scheduler::Trends::ReviewNotificationsScheduler
     queue: scheduler
+  indexing_scheduler:
+    every: '5m'
+    class: Scheduler::IndexingScheduler
+    queue: scheduler
   media_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::MediaCleanupScheduler
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 000000000..177e05f98
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,33 @@
+module.exports = {
+  'testEnvironment': 'jsdom',
+  'projects': [
+    '<rootDir>/app/javascript/mastodon',
+  ],
+  'testPathIgnorePatterns': [
+    '<rootDir>/node_modules/',
+    '<rootDir>/vendor/',
+    '<rootDir>/config/',
+    '<rootDir>/log/',
+    '<rootDir>/public/',
+    '<rootDir>/tmp/',
+    '<rootDir>/app/javascript/themes/',
+  ],
+  'setupFiles': [
+    'raf/polyfill',
+  ],
+  'setupFilesAfterEnv': [
+    '<rootDir>/app/javascript/mastodon/test_setup.js',
+  ],
+  'collectCoverageFrom': [
+    'app/javascript/mastodon/**/*.js',
+    '!app/javascript/mastodon/features/emoji/emoji_compressed.js',
+    '!app/javascript/mastodon/locales/locale-data/*.js',
+    '!app/javascript/mastodon/service_worker/entry.js',
+    '!app/javascript/mastodon/test_setup.js',
+  ],
+  'coverageDirectory': '<rootDir>/coverage',
+  'moduleDirectories': [
+    '<rootDir>/node_modules',
+    '<rootDir>/app/javascript',
+  ],
+};
diff --git a/lib/chewy/strategy/custom_sidekiq.rb b/lib/chewy/strategy/custom_sidekiq.rb
deleted file mode 100644
index 794ae4ed4..000000000
--- a/lib/chewy/strategy/custom_sidekiq.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module Chewy
-  class Strategy
-    class CustomSidekiq < Sidekiq
-      def update(_type, _objects, _options = {})
-        super if Chewy.enabled?
-      end
-    end
-  end
-end
diff --git a/lib/chewy/strategy/mastodon.rb b/lib/chewy/strategy/mastodon.rb
new file mode 100644
index 000000000..ee8b92186
--- /dev/null
+++ b/lib/chewy/strategy/mastodon.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Chewy
+  class Strategy
+    class Mastodon < Base
+      def initialize
+        super
+
+        @stash = Hash.new { |hash, key| hash[key] = [] }
+      end
+
+      def update(type, objects, _options = {})
+        @stash[type].concat(type.root.id ? Array.wrap(objects) : type.adapter.identify(objects)) if Chewy.enabled?
+      end
+
+      def leave
+        RedisConfiguration.with do |redis|
+          redis.pipelined do |pipeline|
+            @stash.each do |type, ids|
+              pipeline.sadd("chewy:queue:#{type.name}", ids)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/mastodon/search_cli.rb b/lib/mastodon/search_cli.rb
index 74f980ba1..b579ebc14 100644
--- a/lib/mastodon/search_cli.rb
+++ b/lib/mastodon/search_cli.rb
@@ -16,19 +16,21 @@ module Mastodon
       StatusesIndex,
     ].freeze
 
-    option :concurrency, type: :numeric, default: 2, aliases: [:c], desc: 'Workload will be split between this number of threads'
-    option :batch_size, type: :numeric, default: 1_000, aliases: [:b], desc: 'Number of records in each batch'
+    option :concurrency, type: :numeric, default: 5, aliases: [:c], desc: 'Workload will be split between this number of threads'
+    option :batch_size, type: :numeric, default: 100, aliases: [:b], desc: 'Number of records in each batch'
     option :only, type: :array, enum: %w(accounts tags statuses), desc: 'Only process these indices'
+    option :import, type: :boolean, default: true, desc: 'Import data from the database to the index'
+    option :clean, type: :boolean, default: true, desc: 'Remove outdated documents from the index'
     desc 'deploy', 'Create or upgrade Elasticsearch indices and populate them'
     long_desc <<~LONG_DESC
       If Elasticsearch is empty, this command will create the necessary indices
       and then import data from the database into those indices.
 
       This command will also upgrade indices if the underlying schema has been
-      changed since the last run.
+      changed since the last run. Index upgrades erase index data.
 
       Even if creating or upgrading indices is not necessary, data from the
-      database will be imported into the indices.
+      database will be imported into the indices, unless overriden with --no-import.
     LONG_DESC
     def deploy
       if options[:concurrency] < 1
@@ -49,7 +51,9 @@ module Mastodon
         end
       end
 
-      progress = ProgressBar.create(total: nil, format: '%t%c/%u |%b%i| %e (%r docs/s)', autofinish: false)
+      pool      = Concurrent::FixedThreadPool.new(options[:concurrency], max_queue: options[:concurrency] * 10)
+      importers = indices.index_with { |index| "Importer::#{index.name}Importer".constantize.new(batch_size: options[:batch_size], executor: pool) }
+      progress  = ProgressBar.create(total: nil, format: '%t%c/%u |%b%i| %e (%r docs/s)', autofinish: false)
 
       # First, ensure all indices are created and have the correct
       # structure, so that live data can already be written
@@ -59,99 +63,46 @@ module Mastodon
         index.specification.lock!
       end
 
+      progress.title = 'Estimating workload '
+      progress.total = indices.sum { |index| importers[index].estimate! }
+
       reset_connection_pools!
 
-      pool    = Concurrent::FixedThreadPool.new(options[:concurrency])
-      added   = Concurrent::AtomicFixnum.new(0)
-      removed = Concurrent::AtomicFixnum.new(0)
+      added   = 0
+      removed = 0
 
-      progress.title = 'Estimating workload '
+      indices.each do |index|
+        importer = importers[index]
+        importer.optimize_for_import!
+
+        importer.on_progress do |(indexed, deleted)|
+          progress.total = nil if progress.progress + indexed + deleted > progress.total
+          progress.progress += indexed + deleted
+          added   += indexed
+          removed += deleted
+        end
 
-      # Estimate the amount of data that has to be imported first
-      progress.total = indices.sum { |index| index.adapter.default_scope.count }
+        importer.on_failure do |reason|
+          progress.log(pastel.red("Error while importing #{index}: #{reason}"))
+        end
 
-      # Now import all the actual data. Mind that unlike chewy:sync, we don't
-      # fetch and compare all record IDs from the database and the index to
-      # find out which to add and which to remove from the index. Because with
-      # potentially millions of rows, the memory footprint of such a calculation
-      # is uneconomical. So we only ever add.
-      indices.each do |index|
-        progress.title = "Importing #{index} "
-        batch_size     = options[:batch_size]
-        slice_size     = (batch_size / options[:concurrency]).ceil
-
-        index.adapter.default_scope.reorder(nil).find_in_batches(batch_size: batch_size) do |batch|
-          futures = []
-
-          batch.each_slice(slice_size) do |records|
-            futures << Concurrent::Future.execute(executor: pool) do
-              begin
-                if !progress.total.nil? && progress.progress + records.size > progress.total
-                  # The number of items has changed between start and now,
-                  # since there is no good way to predict the final count from
-                  # here, just change the progress bar to an indeterminate one
-
-                  progress.total = nil
-                end
-
-                grouped_records = nil
-                bulk_body       = nil
-                index_count     = 0
-                delete_count    = 0
-
-                ActiveRecord::Base.connection_pool.with_connection do
-                  grouped_records = records.to_a.group_by do |record|
-                    index.adapter.send(:delete_from_index?, record) ? :delete : :to_index
-                  end
-
-                  bulk_body = Chewy::Index::Import::BulkBuilder.new(index, **grouped_records).bulk_body
-                end
-
-                index_count  = grouped_records[:to_index].size  if grouped_records.key?(:to_index)
-                delete_count = grouped_records[:delete].size    if grouped_records.key?(:delete)
-
-                # The following is an optimization for statuses specifically, since
-                # we want to de-index statuses that cannot be searched by anybody,
-                # but can't use Chewy's delete_if logic because it doesn't use
-                # crutches and our searchable_by logic depends on them
-                if index == StatusesIndex
-                  bulk_body.map! do |entry|
-                    if entry[:to_index] && entry.dig(:to_index, :data, 'searchable_by').blank?
-                      index_count  -= 1
-                      delete_count += 1
-
-                      { delete: entry[:to_index].except(:data) }
-                    else
-                      entry
-                    end
-                  end
-                end
-
-                Chewy::Index::Import::BulkRequest.new(index).perform(bulk_body)
-
-                progress.progress += records.size
-
-                added.increment(index_count)
-                removed.increment(delete_count)
-
-                sleep 1
-              rescue => e
-                progress.log pastel.red("Error importing #{index}: #{e}")
-              ensure
-                RedisConfiguration.pool.checkin if Thread.current[:redis]
-                Thread.current[:redis] = nil
-              end
-            end
-          end
-
-          futures.map(&:value)
+        if options[:import]
+          progress.title = "Importing #{index} "
+          importer.import!
+        end
+
+        if options[:clean]
+          progress.title = "Cleaning #{index} "
+          importer.clean_up!
         end
+      ensure
+        importer.optimize_for_search!
       end
 
-      progress.title = ''
-      progress.stop
+      progress.title = 'Done! '
+      progress.finish
 
-      say("Indexed #{added.value} records, de-indexed #{removed.value}", :green, true)
+      say("Indexed #{added} records, de-indexed #{removed}", :green, true)
     end
   end
 end
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 4b4b4b262..75e283cce 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,7 +13,7 @@ module Mastodon
     end
 
     def patch
-      1
+      3
     end
 
     def flags
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index a89af6778..d652468b3 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -8,6 +8,14 @@ namespace :mastodon do
     prompt = TTY::Prompt.new
     env    = {}
 
+    # When the application code gets loaded, it runs `lib/mastodon/redis_configuration.rb`.
+    # This happens before application environment configuration and sets REDIS_URL etc.
+    # These variables are then used even when REDIS_HOST etc. are changed, so clear them
+    # out so they don't interfer with our new configuration.
+    ENV.delete('REDIS_URL')
+    ENV.delete('CACHE_REDIS_URL')
+    ENV.delete('SIDEKIQ_REDIS_URL')
+
     begin
       prompt.say('Your instance is identified by its domain name. Changing it afterward will break things.')
       env['LOCAL_DOMAIN'] = prompt.ask('Domain name:') do |q|
diff --git a/package.json b/package.json
index 5b32884b3..f0f41c140 100644
--- a/package.json
+++ b/package.json
@@ -22,62 +22,24 @@
     "type": "git",
     "url": "https://github.com/mastodon/mastodon.git"
   },
-  "browserslist": [
-    "last 2 versions",
-    "not IE 11",
-    "iOS >= 9",
-    "not dead"
-  ],
-  "jest": {
-    "testEnvironment": "jsdom",
-    "projects": [
-      "<rootDir>/app/javascript/mastodon"
-    ],
-    "testPathIgnorePatterns": [
-      "<rootDir>/node_modules/",
-      "<rootDir>/vendor/",
-      "<rootDir>/config/",
-      "<rootDir>/log/",
-      "<rootDir>/public/",
-      "<rootDir>/tmp/",
-      "<rootDir>/app/javascript/themes/"
-    ],
-    "setupFiles": [
-      "raf/polyfill"
-    ],
-    "setupFilesAfterEnv": [
-      "<rootDir>/app/javascript/mastodon/test_setup.js"
-    ],
-    "collectCoverageFrom": [
-      "app/javascript/mastodon/**/*.js",
-      "!app/javascript/mastodon/features/emoji/emoji_compressed.js",
-      "!app/javascript/mastodon/locales/locale-data/*.js",
-      "!app/javascript/mastodon/service_worker/entry.js",
-      "!app/javascript/mastodon/test_setup.js"
-    ],
-    "coverageDirectory": "<rootDir>/coverage",
-    "moduleDirectories": [
-      "<rootDir>/node_modules",
-      "<rootDir>/app/javascript"
-    ]
-  },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.17.10",
-    "@babel/plugin-proposal-decorators": "^7.17.9",
+    "@babel/core": "^7.18.0",
+    "@babel/plugin-proposal-decorators": "^7.17.12",
     "@babel/plugin-transform-react-inline-elements": "^7.16.7",
-    "@babel/plugin-transform-runtime": "^7.17.10",
-    "@babel/preset-env": "^7.17.10",
-    "@babel/preset-react": "^7.16.7",
-    "@babel/runtime": "^7.17.9",
+    "@babel/plugin-transform-runtime": "^7.18.2",
+    "@babel/preset-env": "^7.18.2",
+    "@babel/preset-react": "^7.17.12",
+    "@babel/runtime": "^7.18.0",
     "@gamestdio/websocket": "^0.3.2",
     "@github/webauthn-json": "^0.5.7",
-    "@rails/ujs": "^6.1.5",
-    "array-includes": "^3.1.4",
+    "@rails/ujs": "^6.1.6",
+    "array-includes": "^3.1.5",
+    "atrament": "0.2.4",
     "arrow-key-navigation": "^1.2.0",
     "atrament": "0.2.4",
     "autoprefixer": "^9.8.8",
-    "axios": "^0.26.1",
+    "axios": "^0.27.2",
     "babel-loader": "^8.2.5",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-preval": "^5.1.0",
@@ -92,7 +54,7 @@
     "css-loader": "^5.2.7",
     "cssnano": "^4.1.11",
     "detect-passive-events": "^2.0.3",
-    "dotenv": "^16.0.0",
+    "dotenv": "^16.0.1",
     "emoji-mart": "npm:emoji-mart-lazyload",
     "es6-symbol": "^3.1.3",
     "escape-html": "^1.0.3",
@@ -101,10 +63,11 @@
     "favico.js": "^0.3.10",
     "file-loader": "^6.2.0",
     "font-awesome": "^4.7.0",
-    "glob": "^7.2.0",
+    "fuzzysort": "^1.9.0",
+    "glob": "^8.0.3",
     "history": "^4.10.1",
     "http-link-header": "^1.0.4",
-    "immutable": "^4.0.0",
+    "immutable": "^4.1.0",
     "imports-loader": "^1.2.0",
     "intersection-observer": "^0.12.0",
     "intl": "^1.2.5",
@@ -143,13 +106,13 @@
     "react-redux-loading-bar": "^4.0.8",
     "react-router-dom": "^4.1.1",
     "react-router-scroll-4": "^1.0.0-beta.1",
-    "react-select": "^5.3.1",
+    "react-select": "^5.3.2",
     "react-sparklines": "^1.7.0",
     "react-swipeable-views": "^0.14.0",
     "react-textarea-autosize": "^8.3.3",
     "react-toggle": "^4.1.2",
-    "redis": "^4.0.6",
-    "redux": "^4.1.2",
+    "redis": "^4.0.6 <4.1.0",
+    "redux": "^4.2.0",
     "redux-immutable": "^4.0.0",
     "redux-thunk": "^2.4.1",
     "regenerator-runtime": "^0.13.9",
@@ -174,26 +137,27 @@
     "webpack-cli": "^3.3.12",
     "webpack-merge": "^5.8.0",
     "wicg-inert": "^3.1.1",
-    "ws": "^8.5.0"
+    "ws": "^8.6.0"
   },
   "devDependencies": {
     "@testing-library/jest-dom": "^5.16.4",
     "@testing-library/react": "^12.1.5",
     "babel-eslint": "^10.1.0",
-    "babel-jest": "^27.5.1",
+    "babel-jest": "^28.1.0",
     "eslint": "^7.32.0",
     "eslint-plugin-import": "~2.26.0",
     "eslint-plugin-jsx-a11y": "~6.5.1",
     "eslint-plugin-promise": "~6.0.0",
     "eslint-plugin-react": "~7.29.4",
-    "jest": "^27.5.1",
+    "jest": "^28.1.0",
+    "jest-environment-jsdom": "^28.1.0",
     "prettier": "^2.6.2",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
     "react-test-renderer": "^16.14.0",
     "sass-lint": "^1.13.1",
     "webpack-dev-server": "^3.11.3",
-    "yargs": "^17.4.1"
+    "yargs": "^17.5.1"
   },
   "resolutions": {
     "kind-of": "^6.0.3"
diff --git a/public/embed.js b/public/embed.js
index d597fd33c..5607c24d5 100644
--- a/public/embed.js
+++ b/public/embed.js
@@ -1,6 +1,11 @@
+// @ts-check
+
 (function() {
   'use strict';
 
+  /**
+   * @param {() => void} loaded
+   */
   var ready = function(loaded) {
     if (['interactive', 'complete'].indexOf(document.readyState) !== -1) {
       loaded();
@@ -10,25 +15,42 @@
   };
 
   ready(function() {
-    var iframes = [];
+    /** @type {Map<number, HTMLIFrameElement>} */
+    var iframes = new Map();
 
     window.addEventListener('message', function(e) {
       var data = e.data || {};
 
-      if (data.type !== 'setHeight' || !iframes[data.id] || window.location.origin !== e.origin || data.id.toString() === '__proto__') {
+      if (typeof data !== 'object' || data.type !== 'setHeight' || !iframes.has(data.id)) {
+        return;
+      }
+
+      var iframe = iframes.get(data.id);
+
+      if ('source' in e && iframe.contentWindow !== e.source) {
         return;
       }
 
-      iframes[data.id].height = data.height;
+      iframe.height = data.height;
     });
 
     [].forEach.call(document.querySelectorAll('iframe.mastodon-embed'), function(iframe) {
-      iframe.scrolling      = 'no';
-      iframe.style.overflow = 'hidden';
+      // select unique id for each iframe
+      var id = 0, failCount = 0, idBuffer = new Uint32Array(1);
+      while (id === 0 || iframes.has(id)) {
+        id = crypto.getRandomValues(idBuffer)[0];
+        failCount++;
+        if (failCount > 100) {
+          // give up and assign (easily guessable) unique number if getRandomValues is broken or no luck
+          id = -(iframes.size + 1);
+          break;
+        }
+      }
 
-      iframes.push(iframe);
+      iframes.set(id, iframe);
 
-      var id = iframes.length - 1;
+      iframe.scrolling      = 'no';
+      iframe.style.overflow = 'hidden';
 
       iframe.onload = function() {
         iframe.contentWindow.postMessage({
diff --git a/spec/controllers/admin/domain_allows_controller_spec.rb b/spec/controllers/admin/domain_allows_controller_spec.rb
new file mode 100644
index 000000000..8bacdd3e4
--- /dev/null
+++ b/spec/controllers/admin/domain_allows_controller_spec.rb
@@ -0,0 +1,48 @@
+require 'rails_helper'
+
+RSpec.describe Admin::DomainAllowsController, type: :controller do
+  render_views
+
+  before do
+    sign_in Fabricate(:user, admin: true), scope: :user
+  end
+
+  describe 'GET #new' do
+    it 'assigns a new domain allow' do
+      get :new
+
+      expect(assigns(:domain_allow)).to be_instance_of(DomainAllow)
+      expect(response).to have_http_status(200)
+    end
+  end
+
+  describe 'POST #create' do
+    it 'blocks the domain when succeeded to save' do
+      post :create, params: { domain_allow: { domain: 'example.com' } }
+
+      expect(flash[:notice]).to eq I18n.t('admin.domain_allows.created_msg')
+      expect(response).to redirect_to(admin_instances_path)
+    end
+
+    it 'renders new when failed to save' do
+      Fabricate(:domain_allow, domain: 'example.com')
+
+      post :create, params: { domain_allow: { domain: 'example.com' } }
+
+      expect(response).to render_template :new
+    end
+  end
+
+  describe 'DELETE #destroy' do
+    it 'disallows the domain' do
+      service = double(call: true)
+      allow(UnallowDomainService).to receive(:new).and_return(service)
+      domain_allow = Fabricate(:domain_allow)
+      delete :destroy, params: { id: domain_allow.id }
+
+      expect(service).to have_received(:call).with(domain_allow)
+      expect(flash[:notice]).to eq I18n.t('admin.domain_allows.destroyed_msg')
+      expect(response).to redirect_to(admin_instances_path)
+    end
+  end
+end
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index ecc79292b..a35b2fb3b 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -16,6 +16,27 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do
     end
   end
 
+  describe 'POST #batch' do
+    it 'blocks the domains when succeeded to save' do
+      allow(DomainBlockWorker).to receive(:perform_async).and_return(true)
+
+      post :batch, params: {
+        save: '',
+        form_domain_block_batch: {
+          domain_blocks_attributes: {
+            '0' => { enabled: '1', domain: 'example.com', severity: 'silence' },
+            '1' => { enabled: '0', domain: 'mastodon.social', severity: 'suspend' },
+            '2' => { enabled: '1', domain: 'mastodon.online', severity: 'suspend' }
+          }
+        }
+      }
+
+      expect(DomainBlockWorker).to have_received(:perform_async).exactly(2).times
+      expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg')
+      expect(response).to redirect_to(admin_instances_path(limited: '1'))
+    end
+  end
+
   describe 'POST #create' do
     it 'blocks the domain when succeeded to save' do
       allow(DomainBlockWorker).to receive(:perform_async).and_return(true)
diff --git a/spec/controllers/admin/export_domain_allows_controller_spec.rb b/spec/controllers/admin/export_domain_allows_controller_spec.rb
new file mode 100644
index 000000000..f6275c2d6
--- /dev/null
+++ b/spec/controllers/admin/export_domain_allows_controller_spec.rb
@@ -0,0 +1,42 @@
+require 'rails_helper'
+
+RSpec.describe Admin::ExportDomainAllowsController, type: :controller do
+  render_views
+
+  before do
+    sign_in Fabricate(:user, admin: true), scope: :user
+  end
+
+  describe 'GET #export' do
+    it 'renders instances' do
+      Fabricate(:domain_allow, domain: 'good.domain')
+      Fabricate(:domain_allow, domain: 'better.domain')
+
+      get :export, params: { format: :csv }
+      expect(response).to have_http_status(200)
+      expect(response.body).to eq(IO.read(File.join(file_fixture_path, 'domain_allows.csv')))
+    end
+  end
+
+  describe 'POST #import' do
+    it 'allows imported domains' do
+      post :import, params: { admin_import: { data: fixture_file_upload('domain_allows.csv') } }
+
+      expect(response).to redirect_to(admin_instances_path)
+
+      # Header should not be imported
+      expect(DomainAllow.where(domain: '#domain').present?).to eq(false)
+
+      # Domains should now be added
+      get :export, params: { format: :csv }
+      expect(response).to have_http_status(200)
+      expect(response.body).to eq(IO.read(File.join(file_fixture_path, 'domain_allows.csv')))
+    end
+
+    it 'displays error on no file selected' do
+      post :import, params: { admin_import: {} }
+      expect(response).to redirect_to(admin_instances_path)
+      expect(flash[:error]).to eq(I18n.t('admin.export_domain_allows.no_file'))
+    end
+  end
+end
diff --git a/spec/controllers/admin/export_domain_blocks_controller_spec.rb b/spec/controllers/admin/export_domain_blocks_controller_spec.rb
new file mode 100644
index 000000000..0493df859
--- /dev/null
+++ b/spec/controllers/admin/export_domain_blocks_controller_spec.rb
@@ -0,0 +1,35 @@
+require 'rails_helper'
+
+RSpec.describe Admin::ExportDomainBlocksController, type: :controller do
+  render_views
+
+  before do
+    sign_in Fabricate(:user, admin: true), scope: :user
+  end
+
+  describe 'GET #export' do
+    it 'renders instances' do
+      Fabricate(:domain_block, domain: 'bad.domain', severity: 'silence', public_comment: 'bad')
+      Fabricate(:domain_block, domain: 'worse.domain', severity: 'suspend', reject_media: true, reject_reports: true, public_comment: 'worse', obfuscate: true)
+      Fabricate(:domain_block, domain: 'reject.media', severity: 'noop', reject_media: true, public_comment: 'reject media')
+      Fabricate(:domain_block, domain: 'no.op', severity: 'noop', public_comment: 'noop')
+
+      get :export, params: { format: :csv }
+      expect(response).to have_http_status(200)
+      expect(response.body).to eq(IO.read(File.join(file_fixture_path, 'domain_blocks.csv')))
+    end
+  end
+
+  describe 'POST #import' do
+    it 'blocks imported domains' do
+      post :import, params: { admin_import: { data: fixture_file_upload('domain_blocks.csv') } }
+
+      expect(assigns(:domain_blocks).map(&:domain)).to match_array ['bad.domain', 'worse.domain', 'reject.media']
+    end
+  end
+
+  it 'displays error on no file selected' do
+    post :import, params: { admin_import: {} }
+    expect(flash[:alert]).to eq(I18n.t('admin.export_domain_blocks.no_file'))
+  end
+end
diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb
index 7b86513be..569c8322b 100644
--- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb
+++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb
@@ -22,7 +22,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do
     let(:user) { Fabricate(:user, email: 'local-part@domain', otp_secret: with_otp_secret ? 'oldotpsecret' : nil) }
 
     describe 'GET #new' do
-      context 'when signed in and a new otp secret has been setted in the session' do
+      context 'when signed in and a new otp secret has been set in the session' do
         subject do
           sign_in user, scope: :user
           get :new, session: { challenge_passed_at: Time.now.utc, new_otp_secret: 'thisisasecretforthespecofnewview' }
@@ -36,7 +36,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do
         expect(response).to redirect_to('/auth/sign_in')
       end
 
-      it 'redirects if a new otp_secret has not been setted in the session' do
+      it 'redirects if a new otp_secret has not been set in the session' do
         sign_in user, scope: :user
         get :new, session: { challenge_passed_at: Time.now.utc }
         expect(response).to redirect_to('/settings/otp_authentication')
diff --git a/spec/fixtures/files/domain_allows.csv b/spec/fixtures/files/domain_allows.csv
new file mode 100644
index 000000000..4200ac3f5
--- /dev/null
+++ b/spec/fixtures/files/domain_allows.csv
@@ -0,0 +1,3 @@
+#domain
+good.domain
+better.domain
diff --git a/spec/fixtures/files/domain_blocks.csv b/spec/fixtures/files/domain_blocks.csv
new file mode 100644
index 000000000..28ffb9175
--- /dev/null
+++ b/spec/fixtures/files/domain_blocks.csv
@@ -0,0 +1,4 @@
+#domain,#severity,#reject_media,#reject_reports,#public_comment,#obfuscate
+bad.domain,silence,false,false,bad,false
+worse.domain,suspend,true,true,worse,true
+reject.media,noop,true,false,reject media,false
diff --git a/spec/helpers/settings/keyword_mutes_helper_spec.rb b/spec/helpers/settings/keyword_mutes_helper_spec.rb
deleted file mode 100644
index a19d518dd..000000000
--- a/spec/helpers/settings/keyword_mutes_helper_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'rails_helper'
-
-# Specs in this file have access to a helper object that includes
-# the Settings::KeywordMutesHelper. For example:
-#
-# describe Settings::KeywordMutesHelper do
-#   describe "string concat" do
-#     it "concats two strings with spaces" do
-#       expect(helper.concat_strings("this","that")).to eq("this that")
-#     end
-#   end
-# end
-RSpec.describe Settings::KeywordMutesHelper, type: :helper do
-  pending "add some examples to (or delete) #{__FILE__}"
-end
diff --git a/spec/lib/advanced_text_formatter_spec.rb b/spec/lib/advanced_text_formatter_spec.rb
index ea1a9570d..3255fc927 100644
--- a/spec/lib/advanced_text_formatter_spec.rb
+++ b/spec/lib/advanced_text_formatter_spec.rb
@@ -40,6 +40,10 @@ RSpec.describe AdvancedTextFormatter do
         it 'formats code using <pre> and <code>' do
           is_expected.to include '<pre><code>int main'
         end
+
+        it 'does not strip leading spaces' do
+          is_expected.to include '>  return 0'
+        end
       end
 
       context 'given some quote' do
diff --git a/spec/lib/emoji_formatter_spec.rb b/spec/lib/emoji_formatter_spec.rb
index 129445aa5..e1747bdd9 100644
--- a/spec/lib/emoji_formatter_spec.rb
+++ b/spec/lib/emoji_formatter_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe EmojiFormatter do
       let(:text) { preformat_text(':coolcat: Beep boop') }
 
       it 'converts the shortcode to an image tag' do
-        is_expected.to match(/<img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
+        is_expected.to match(/<img rel="emoji" draggable="false" width="16" height="16" class="emojione custom-emoji" alt=":coolcat:"/)
       end
     end
 
@@ -32,7 +32,7 @@ RSpec.describe EmojiFormatter do
       let(:text) { preformat_text('Beep :coolcat: boop') }
 
       it 'converts the shortcode to an image tag' do
-        is_expected.to match(/Beep <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
+        is_expected.to match(/Beep <img rel="emoji" draggable="false" width="16" height="16" class="emojione custom-emoji" alt=":coolcat:"/)
       end
     end
 
@@ -48,7 +48,7 @@ RSpec.describe EmojiFormatter do
       let(:text) { preformat_text('Beep boop :coolcat:') }
 
       it 'converts the shortcode to an image tag' do
-        is_expected.to match(/boop <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
+        is_expected.to match(/boop <img rel="emoji" draggable="false" width="16" height="16" class="emojione custom-emoji" alt=":coolcat:"/)
       end
     end
   end
diff --git a/spec/lib/rss/serializer_spec.rb b/spec/lib/rss/serializer_spec.rb
deleted file mode 100644
index 1da45d302..000000000
--- a/spec/lib/rss/serializer_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-describe RSS::Serializer do
-  describe '#status_title' do
-    let(:text)      { 'This is a toot' }
-    let(:spoiler)   { '' }
-    let(:sensitive) { false }
-    let(:reblog)    { nil }
-    let(:account)   { Fabricate(:account) }
-    let(:status)    { Fabricate(:status, account: account, text: text, spoiler_text: spoiler, sensitive: sensitive, reblog: reblog) }
-
-    subject { RSS::Serializer.new.send(:status_title, status) }
-
-    context 'on a toot with long text' do
-      let(:text) { "This toot's text is longer than the allowed number of characters" }
-
-      it 'truncates toot text appropriately' do
-        expect(subject).to eq "#{account.acct}: “This toot's text is longer tha…”"
-      end
-    end
-
-    context 'on a toot with long text with a newline' do
-      let(:text) { "This toot's text is longer\nthan the allowed number of characters" }
-
-      it 'truncates toot text appropriately' do
-        expect(subject).to eq "#{account.acct}: “This toot's text is longer…”"
-      end
-    end
-
-    context 'on a toot with a content warning' do
-      let(:spoiler) { 'long toot' }
-
-      it 'displays spoiler text instead of toot content' do
-        expect(subject).to eq "#{account.acct}: CW “long toot”"
-      end
-    end
-
-    context 'on a toot with sensitive media' do
-      let(:sensitive) { true }
-
-      it 'displays that the media is sensitive' do
-        expect(subject).to eq "#{account.acct}: “This is a toot” (sensitive)"
-      end
-    end
-
-    context 'on a reblog' do
-      let(:reblog) { Fabricate(:status, text: 'This is a toot') }
-
-      it 'display that the toot is a reblog' do
-        expect(subject).to eq "#{account.acct} boosted #{reblog.account.acct}: “This is a toot”"
-      end
-    end
-  end
-end
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 681134d49..dc0ca3da3 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -350,6 +350,45 @@ RSpec.describe Account, type: :model do
       )
     end
 
+    it 'does not return suspended users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username',
+        domain: 'example.com',
+        suspended: true
+      )
+
+      results = Account.search_for('username')
+      expect(results).to eq []
+    end
+
+    it 'does not return unapproved users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username'
+      )
+
+      match.user.update(approved: false)
+
+      results = Account.search_for('username')
+      expect(results).to eq []
+    end
+
+    it 'does not return unconfirmed users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username'
+      )
+
+      match.user.update(confirmed_at: nil)
+
+      results = Account.search_for('username')
+      expect(results).to eq []
+    end
+
     it 'accepts ?, \, : and space as delimiter' do
       match = Fabricate(
         :account,
@@ -422,8 +461,114 @@ RSpec.describe Account, type: :model do
   end
 
   describe '.advanced_search_for' do
+    let(:account) { Fabricate(:account) }
+
+    context 'when limiting search to followed accounts' do
+      it 'accepts ?, \, : and space as delimiter' do
+        match = Fabricate(
+          :account,
+          display_name: 'A & l & i & c & e',
+          username: 'username',
+          domain: 'example.com'
+        )
+        account.follow!(match)
+
+        results = Account.advanced_search_for('A?l\i:c e', account, 10, true)
+        expect(results).to eq [match]
+      end
+
+      it 'does not return non-followed accounts' do
+        match = Fabricate(
+          :account,
+          display_name: 'A & l & i & c & e',
+          username: 'username',
+          domain: 'example.com'
+        )
+
+        results = Account.advanced_search_for('A?l\i:c e', account, 10, true)
+        expect(results).to eq []
+      end
+
+      it 'does not return suspended users' do
+        match = Fabricate(
+          :account,
+          display_name: 'Display Name',
+          username: 'username',
+          domain: 'example.com',
+          suspended: true
+        )
+
+        results = Account.advanced_search_for('username', account, 10, true)
+        expect(results).to eq []
+      end
+
+      it 'does not return unapproved users' do
+        match = Fabricate(
+          :account,
+          display_name: 'Display Name',
+          username: 'username'
+        )
+
+        match.user.update(approved: false)
+
+        results = Account.advanced_search_for('username', account, 10, true)
+        expect(results).to eq []
+      end
+
+      it 'does not return unconfirmed users' do
+        match = Fabricate(
+          :account,
+          display_name: 'Display Name',
+          username: 'username'
+        )
+
+        match.user.update(confirmed_at: nil)
+
+        results = Account.advanced_search_for('username', account, 10, true)
+        expect(results).to eq []
+      end
+    end
+
+    it 'does not return suspended users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username',
+        domain: 'example.com',
+        suspended: true
+      )
+
+      results = Account.advanced_search_for('username', account)
+      expect(results).to eq []
+    end
+
+    it 'does not return unapproved users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username'
+      )
+
+      match.user.update(approved: false)
+
+      results = Account.advanced_search_for('username', account)
+      expect(results).to eq []
+    end
+
+    it 'does not return unconfirmed users' do
+      match = Fabricate(
+        :account,
+        display_name: 'Display Name',
+        username: 'username'
+      )
+
+      match.user.update(confirmed_at: nil)
+
+      results = Account.advanced_search_for('username', account)
+      expect(results).to eq []
+    end
+
     it 'accepts ?, \, : and space as delimiter' do
-      account = Fabricate(:account)
       match = Fabricate(
         :account,
         display_name: 'A & l & i & c & e',
@@ -437,18 +582,17 @@ RSpec.describe Account, type: :model do
 
     it 'limits by 10 by default' do
       11.times { Fabricate(:account, display_name: "Display Name") }
-      results = Account.search_for("display")
+      results = Account.advanced_search_for("display", account)
       expect(results.size).to eq 10
     end
 
     it 'accepts arbitrary limits' do
       2.times { Fabricate(:account, display_name: "Display Name") }
-      results = Account.search_for("display", 1)
+      results = Account.advanced_search_for("display", account, 1)
       expect(results.size).to eq 1
     end
 
     it 'ranks followed accounts higher' do
-      account = Fabricate(:account)
       match = Fabricate(:account, username: "Matching")
       followed_match = Fabricate(:account, username: "Matcher")
       Fabricate(:follow, account: account, target_account: followed_match)
@@ -775,6 +919,32 @@ RSpec.describe Account, type: :model do
         expect(Account.suspended).to match_array([account_1])
       end
     end
+
+    describe 'searchable' do
+      let!(:suspended_local)        { Fabricate(:account, suspended: true, username: 'suspended_local') }
+      let!(:suspended_remote)       { Fabricate(:account, suspended: true, domain: 'example.org', username: 'suspended_remote') }
+      let!(:silenced_local)         { Fabricate(:account, silenced: true, username: 'silenced_local') }
+      let!(:silenced_remote)        { Fabricate(:account, silenced: true, domain: 'example.org', username: 'silenced_remote') }
+      let!(:unconfirmed)            { Fabricate(:user, confirmed_at: nil).account }
+      let!(:unapproved)             { Fabricate(:user, approved: false).account }
+      let!(:unconfirmed_unapproved) { Fabricate(:user, confirmed_at: nil, approved: false).account }
+      let!(:local_account)          { Fabricate(:account, username: 'local_account') }
+      let!(:remote_account)         { Fabricate(:account, domain: 'example.org', username: 'remote_account') }
+
+      before do
+        # Accounts get automatically-approved depending on settings, so ensure they aren't approved
+        unapproved.user.update(approved: false)
+        unconfirmed_unapproved.user.update(approved: false)
+      end
+
+      it 'returns every usable non-suspended account' do
+        expect(Account.searchable).to match_array([silenced_local, silenced_remote, local_account, remote_account])
+      end
+
+      it 'does not mess with previously-applied scopes' do
+        expect(Account.where.not(id: remote_account.id).searchable).to match_array([silenced_local, silenced_remote, local_account])
+      end
+    end
   end
 
   context 'when is local' do
diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb
index 943cb161d..7359ca0b4 100644
--- a/spec/services/activitypub/fetch_remote_status_service_spec.rb
+++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb
@@ -3,16 +3,15 @@ require 'rails_helper'
 RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
   include ActionView::Helpers::TextHelper
 
-  let!(:sender) { Fabricate(:account).tap { |account| account.update(uri: ActivityPub::TagManager.instance.uri_for(account)) } }
+  let!(:sender) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar') }
   let!(:recipient) { Fabricate(:account) }
-  let!(:valid_domain) { Rails.configuration.x.local_domain }
 
   let(:existing_status) { nil }
 
   let(:note) do
     {
       '@context': 'https://www.w3.org/ns/activitystreams',
-      id: "https://#{valid_domain}/@foo/1234",
+      id: "https://foo.bar/@foo/1234",
       type: 'Note',
       content: 'Lorem ipsum',
       attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -22,7 +21,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
   subject { described_class.new }
 
   before do
-    stub_request(:head, 'https://example.com/watch?v=12345').to_return(status: 404, body: '')
+    stub_request(:get, 'https://foo.bar/watch?v=12345').to_return(status: 404, body: '')
+    stub_request(:get, object[:id]).to_return(body: Oj.dump(object))
   end
 
   describe '#call' do
@@ -46,7 +46,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
       let(:object) do
         {
           '@context': 'https://www.w3.org/ns/activitystreams',
-          id: "https://#{valid_domain}/@foo/1234",
+          id: "https://foo.bar/@foo/1234",
           type: 'Video',
           name: 'Nyan Cat 10 hours remix',
           attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -54,13 +54,13 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
             {
               type: 'Link',
               mimeType: 'application/x-bittorrent',
-              href: "https://#{valid_domain}/12345.torrent",
+              href: "https://foo.bar/12345.torrent",
             },
 
             {
               type: 'Link',
               mimeType: 'text/html',
-              href: "https://#{valid_domain}/watch?v=12345",
+              href: "https://foo.bar/watch?v=12345",
             },
           ],
         }
@@ -70,8 +70,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.url).to eq "https://#{valid_domain}/watch?v=12345"
-        expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345"
+        expect(status.url).to eq "https://foo.bar/watch?v=12345"
+        expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345"
       end
     end
 
@@ -79,7 +79,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
       let(:object) do
         {
           '@context': 'https://www.w3.org/ns/activitystreams',
-          id: "https://#{valid_domain}/@foo/1234",
+          id: "https://foo.bar/@foo/1234",
           type: 'Audio',
           name: 'Nyan Cat 10 hours remix',
           attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -87,13 +87,13 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
             {
               type: 'Link',
               mimeType: 'application/x-bittorrent',
-              href: "https://#{valid_domain}/12345.torrent",
+              href: "https://foo.bar/12345.torrent",
             },
 
             {
               type: 'Link',
               mimeType: 'text/html',
-              href: "https://#{valid_domain}/watch?v=12345",
+              href: "https://foo.bar/watch?v=12345",
             },
           ],
         }
@@ -103,8 +103,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.url).to eq "https://#{valid_domain}/watch?v=12345"
-        expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345"
+        expect(status.url).to eq "https://foo.bar/watch?v=12345"
+        expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345"
       end
     end
 
@@ -112,7 +112,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
       let(:object) do
         {
           '@context': 'https://www.w3.org/ns/activitystreams',
-          id: "https://#{valid_domain}/@foo/1234",
+          id: "https://foo.bar/@foo/1234",
           type: 'Event',
           name: "Let's change the world",
           attributedTo: ActivityPub::TagManager.instance.uri_for(sender)
@@ -123,8 +123,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.url).to eq "https://#{valid_domain}/@foo/1234"
-        expect(strip_tags(status.text)).to eq "Let's change the worldhttps://#{valid_domain}/@foo/1234"
+        expect(status.url).to eq "https://foo.bar/@foo/1234"
+        expect(strip_tags(status.text)).to eq "Let's change the worldhttps://foo.bar/@foo/1234"
       end
     end
 
@@ -154,7 +154,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
       let(:object) do
         {
           '@context': 'https://www.w3.org/ns/activitystreams',
-          id: "https://#{valid_domain}/@foo/1234/create",
+          id: "https://foo.bar/@foo/1234/create",
           type: 'Create',
           actor: ActivityPub::TagManager.instance.uri_for(sender),
           object: note,
@@ -174,7 +174,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
       let(:object) do
         {
           '@context': 'https://www.w3.org/ns/activitystreams',
-          id: "https://#{valid_domain}/@foo/1234/create",
+          id: "https://foo.bar/@foo/1234/create",
           type: 'Create',
           actor: ActivityPub::TagManager.instance.uri_for(sender),
           object: {
@@ -208,7 +208,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
         let(:object) do
           {
             '@context': 'https://www.w3.org/ns/activitystreams',
-            id: "https://#{valid_domain}/@foo/1234/create",
+            id: "https://foo.bar/@foo/1234/create",
             type: 'Create',
             actor: ActivityPub::TagManager.instance.uri_for(sender),
             object: note.merge(updated: '2021-09-08T22:39:25Z'),
diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb
index 0e63cc9eb..fe5f1aed1 100644
--- a/spec/services/fetch_remote_status_service_spec.rb
+++ b/spec/services/fetch_remote_status_service_spec.rb
@@ -1,14 +1,13 @@
 require 'rails_helper'
 
 RSpec.describe FetchRemoteStatusService, type: :service do
-  let(:account) { Fabricate(:account) }
+  let(:account) { Fabricate(:account, domain: 'example.org', uri: 'https://example.org/foo') }
   let(:prefetched_body) { nil }
-  let(:valid_domain) { Rails.configuration.x.local_domain }
 
   let(:note) do
     {
       '@context': 'https://www.w3.org/ns/activitystreams',
-      id: "https://#{valid_domain}/@foo/1234",
+      id: "https://example.org/@foo/1234",
       type: 'Note',
       content: 'Lorem ipsum',
       attributedTo: ActivityPub::TagManager.instance.uri_for(account),
@@ -20,7 +19,6 @@ RSpec.describe FetchRemoteStatusService, type: :service do
     let(:prefetched_body) { Oj.dump(note) }
 
     before do
-      account.update(uri: ActivityPub::TagManager.instance.uri_for(account))
       subject
     end
 
diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb
index 1b639dea9..b3e3defbf 100644
--- a/spec/services/resolve_url_service_spec.rb
+++ b/spec/services/resolve_url_service_spec.rb
@@ -126,5 +126,24 @@ describe ResolveURLService, type: :service do
         end
       end
     end
+
+    context 'searching for a link that redirects to a local public status' do
+      let(:account) { Fabricate(:account) }
+      let(:poster)  { Fabricate(:account) }
+      let!(:status) { Fabricate(:status, account: poster, visibility: :public) }
+      let(:url)     { 'https://link.to/foobar' }
+      let(:status_url) { ActivityPub::TagManager.instance.url_for(status) }
+      let(:uri)     { ActivityPub::TagManager.instance.uri_for(status) }
+
+      before do
+        stub_request(:get, url).to_return(status: 302, headers: { 'Location' => status_url })
+        body = ActiveModelSerializers::SerializableResource.new(status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter).to_json
+        stub_request(:get, status_url).to_return(body: body, headers: { 'Content-Type' => 'application/activity+json' })
+      end
+
+      it 'returns status by url' do
+        expect(subject.call(url, on_behalf_of: account)).to eq(status)
+      end
+    end
   end
 end
diff --git a/yarn.lock b/yarn.lock
index b5bee3540..9c89d32ed 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,39 +23,39 @@
   dependencies:
     "@babel/highlight" "^7.16.7"
 
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.10":
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10":
   version "7.17.10"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab"
   integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==
 
-"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.17.10", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05"
-  integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.0", "@babel/core@^7.7.2":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756"
+  integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==
   dependencies:
     "@ampproject/remapping" "^2.1.0"
     "@babel/code-frame" "^7.16.7"
-    "@babel/generator" "^7.17.10"
+    "@babel/generator" "^7.18.0"
     "@babel/helper-compilation-targets" "^7.17.10"
-    "@babel/helper-module-transforms" "^7.17.7"
-    "@babel/helpers" "^7.17.9"
-    "@babel/parser" "^7.17.10"
+    "@babel/helper-module-transforms" "^7.18.0"
+    "@babel/helpers" "^7.18.0"
+    "@babel/parser" "^7.18.0"
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.17.10"
-    "@babel/types" "^7.17.10"
+    "@babel/traverse" "^7.18.0"
+    "@babel/types" "^7.18.0"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
     json5 "^2.2.1"
     semver "^6.3.0"
 
-"@babel/generator@^7.17.10", "@babel/generator@^7.7.2":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189"
-  integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==
+"@babel/generator@^7.18.0", "@babel/generator@^7.7.2":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f"
+  integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==
   dependencies:
-    "@babel/types" "^7.17.10"
-    "@jridgewell/gen-mapping" "^0.1.0"
+    "@babel/types" "^7.18.0"
+    "@jridgewell/gen-mapping" "^0.3.0"
     jsesc "^2.5.1"
 
 "@babel/helper-annotate-as-pure@^7.16.7":
@@ -81,20 +81,33 @@
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/types" "^7.16.7"
 
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe"
-  integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b"
+  integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==
   dependencies:
     "@babel/compat-data" "^7.17.10"
     "@babel/helper-validator-option" "^7.16.7"
     browserslist "^4.20.2"
     semver "^6.3.0"
 
-"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d"
-  integrity sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==
+"@babel/helper-create-class-features-plugin@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.12.tgz#d4f8393fc4838cbff6b7c199af5229aee16d07cf"
+  integrity sha512-sZoOeUTkFJMyhqCei2+Z+wtH/BehW8NVKQt7IRUQlRiOARuXymJYfN/FCcI8CvVbR0XVyDM6eLFOlR7YtiXnew==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.16.7"
+    "@babel/helper-environment-visitor" "^7.16.7"
+    "@babel/helper-function-name" "^7.17.9"
+    "@babel/helper-member-expression-to-functions" "^7.17.7"
+    "@babel/helper-optimise-call-expression" "^7.16.7"
+    "@babel/helper-replace-supers" "^7.16.7"
+    "@babel/helper-split-export-declaration" "^7.16.7"
+
+"@babel/helper-create-class-features-plugin@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19"
+  integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/helper-environment-visitor" "^7.16.7"
@@ -112,10 +125,10 @@
     "@babel/helper-annotate-as-pure" "^7.16.7"
     regexpu-core "^4.7.1"
 
-"@babel/helper-create-regexp-features-plugin@^7.17.0":
-  version "7.17.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1"
-  integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==
+"@babel/helper-create-regexp-features-plugin@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd"
+  integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
     regexpu-core "^5.0.1"
@@ -214,10 +227,10 @@
   dependencies:
     "@babel/types" "^7.16.7"
 
-"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7":
-  version "7.17.7"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd"
-  integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==
+"@babel/helper-module-transforms@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd"
+  integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==
   dependencies:
     "@babel/helper-environment-visitor" "^7.16.7"
     "@babel/helper-module-imports" "^7.16.7"
@@ -225,8 +238,8 @@
     "@babel/helper-split-export-declaration" "^7.16.7"
     "@babel/helper-validator-identifier" "^7.16.7"
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.17.3"
-    "@babel/types" "^7.17.0"
+    "@babel/traverse" "^7.18.0"
+    "@babel/types" "^7.18.0"
 
 "@babel/helper-optimise-call-expression@^7.16.7":
   version "7.16.7"
@@ -235,10 +248,10 @@
   dependencies:
     "@babel/types" "^7.16.7"
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz"
-  integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96"
+  integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==
 
 "@babel/helper-remap-async-to-generator@^7.16.8":
   version "7.16.8"
@@ -267,6 +280,13 @@
   dependencies:
     "@babel/types" "^7.17.0"
 
+"@babel/helper-simple-access@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9"
+  integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==
+  dependencies:
+    "@babel/types" "^7.18.2"
+
 "@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
   version "7.16.0"
   resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz"
@@ -301,14 +321,14 @@
     "@babel/traverse" "^7.16.8"
     "@babel/types" "^7.16.8"
 
-"@babel/helpers@^7.17.9":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a"
-  integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==
+"@babel/helpers@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370"
+  integrity sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==
   dependencies:
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.17.9"
-    "@babel/types" "^7.17.0"
+    "@babel/traverse" "^7.18.0"
+    "@babel/types" "^7.18.0"
 
 "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
   version "7.16.7"
@@ -319,63 +339,63 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.7.0":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78"
-  integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0", "@babel/parser@^7.7.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112"
+  integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==
 
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz"
-  integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e"
+  integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz"
-  integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753"
+  integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
-    "@babel/plugin-proposal-optional-chaining" "^7.16.7"
+    "@babel/plugin-proposal-optional-chaining" "^7.17.12"
 
-"@babel/plugin-proposal-async-generator-functions@^7.16.8":
-  version "7.16.8"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz"
-  integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==
+"@babel/plugin-proposal-async-generator-functions@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03"
+  integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-remap-async-to-generator" "^7.16.8"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
 
-"@babel/plugin-proposal-class-properties@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz"
-  integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==
+"@babel/plugin-proposal-class-properties@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4"
+  integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-proposal-class-static-block@^7.17.6":
-  version "7.17.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c"
-  integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==
+"@babel/plugin-proposal-class-static-block@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710"
+  integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.17.6"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.18.0"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
 
-"@babel/plugin-proposal-decorators@^7.17.9":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.9.tgz#67a1653be9c77ce5b6c318aa90c8287b87831619"
-  integrity sha512-EfH2LZ/vPa2wuPwJ26j+kYRkaubf89UlwxKXtxqEm57HrgSEYDB8t4swFP+p8LcI9yiP9ZRJJjo/58hS6BnaDA==
+"@babel/plugin-proposal-decorators@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.12.tgz#26a6a605f271a6703abf97f8fafd1368834c131c"
+  integrity sha512-gL0qSSeIk/VRfTDgtQg/EtejENssN/r3p5gJsPie1UacwiHibprpr19Z0pcK3XKuqQvjGVxsQ37Tl1MGfXzonA==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.17.9"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-replace-supers" "^7.16.7"
     "@babel/helper-split-export-declaration" "^7.16.7"
-    "@babel/plugin-syntax-decorators" "^7.17.0"
+    "@babel/plugin-syntax-decorators" "^7.17.12"
     charcodes "^0.2.0"
 
 "@babel/plugin-proposal-dynamic-import@^7.16.7":
@@ -386,36 +406,36 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/plugin-syntax-dynamic-import" "^7.8.3"
 
-"@babel/plugin-proposal-export-namespace-from@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz"
-  integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==
+"@babel/plugin-proposal-export-namespace-from@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378"
+  integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
 
-"@babel/plugin-proposal-json-strings@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz"
-  integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==
+"@babel/plugin-proposal-json-strings@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664"
+  integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
 
-"@babel/plugin-proposal-logical-assignment-operators@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz"
-  integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==
+"@babel/plugin-proposal-logical-assignment-operators@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23"
+  integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
 
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz"
-  integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be"
+  integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
 
 "@babel/plugin-proposal-numeric-separator@^7.16.7":
@@ -426,16 +446,16 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/plugin-syntax-numeric-separator" "^7.10.4"
 
-"@babel/plugin-proposal-object-rest-spread@^7.17.3":
-  version "7.17.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390"
-  integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==
+"@babel/plugin-proposal-object-rest-spread@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8"
+  integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==
   dependencies:
-    "@babel/compat-data" "^7.17.0"
-    "@babel/helper-compilation-targets" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/compat-data" "^7.17.10"
+    "@babel/helper-compilation-targets" "^7.17.10"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.16.7"
+    "@babel/plugin-transform-parameters" "^7.17.12"
 
 "@babel/plugin-proposal-optional-catch-binding@^7.16.7":
   version "7.16.7"
@@ -445,40 +465,40 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
 
-"@babel/plugin-proposal-optional-chaining@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz"
-  integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==
+"@babel/plugin-proposal-optional-chaining@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174"
+  integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
 
-"@babel/plugin-proposal-private-methods@^7.16.11":
-  version "7.16.11"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz"
-  integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
+"@babel/plugin-proposal-private-methods@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c"
+  integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.16.10"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-proposal-private-property-in-object@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz"
-  integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==
+"@babel/plugin-proposal-private-property-in-object@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d"
+  integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
-    "@babel/helper-create-class-features-plugin" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz"
-  integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==
+"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d"
+  integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-syntax-async-generators@^7.8.4":
   version "7.8.4"
@@ -508,12 +528,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.14.5"
 
-"@babel/plugin-syntax-decorators@^7.17.0":
-  version "7.17.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz#a2be3b2c9fe7d78bd4994e790896bc411e2f166d"
-  integrity sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==
+"@babel/plugin-syntax-decorators@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz#02e8f678602f0af8222235271efea945cfdb018a"
+  integrity sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-syntax-dynamic-import@^7.8.3":
   version "7.8.3"
@@ -529,6 +549,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
+"@babel/plugin-syntax-import-assertions@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd"
+  integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.17.12"
+
 "@babel/plugin-syntax-import-meta@^7.8.3":
   version "7.10.4"
   resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz"
@@ -543,13 +570,20 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7":
+"@babel/plugin-syntax-jsx@^7.12.13":
   version "7.16.7"
   resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz"
   integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
+"@babel/plugin-syntax-jsx@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47"
+  integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.17.12"
+
 "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
   version "7.10.4"
   resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
@@ -613,20 +647,20 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.14.5"
 
-"@babel/plugin-transform-arrow-functions@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz"
-  integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==
+"@babel/plugin-transform-arrow-functions@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45"
+  integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-async-to-generator@^7.16.8":
-  version "7.16.8"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz"
-  integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==
+"@babel/plugin-transform-async-to-generator@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832"
+  integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==
   dependencies:
     "@babel/helper-module-imports" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-remap-async-to-generator" "^7.16.8"
 
 "@babel/plugin-transform-block-scoped-functions@^7.16.7":
@@ -636,40 +670,40 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-block-scoping@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz"
-  integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==
+"@babel/plugin-transform-block-scoping@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz#68fc3c4b3bb7dfd809d97b7ed19a584052a2725c"
+  integrity sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-classes@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz"
-  integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==
+"@babel/plugin-transform-classes@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz#da889e89a4d38375eeb24985218edeab93af4f29"
+  integrity sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/helper-environment-visitor" "^7.16.7"
-    "@babel/helper-function-name" "^7.16.7"
+    "@babel/helper-function-name" "^7.17.9"
     "@babel/helper-optimise-call-expression" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-replace-supers" "^7.16.7"
     "@babel/helper-split-export-declaration" "^7.16.7"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz"
-  integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==
+"@babel/plugin-transform-computed-properties@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f"
+  integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-destructuring@^7.17.7":
-  version "7.17.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1"
-  integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==
+"@babel/plugin-transform-destructuring@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858"
+  integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
   version "7.16.7"
@@ -679,12 +713,12 @@
     "@babel/helper-create-regexp-features-plugin" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-duplicate-keys@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz"
-  integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==
+"@babel/plugin-transform-duplicate-keys@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c"
+  integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-exponentiation-operator@^7.16.7":
   version "7.16.7"
@@ -694,12 +728,12 @@
     "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-for-of@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz"
-  integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==
+"@babel/plugin-transform-for-of@^7.18.1":
+  version "7.18.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036"
+  integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-function-name@^7.16.7":
   version "7.16.7"
@@ -710,12 +744,12 @@
     "@babel/helper-function-name" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-literals@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz"
-  integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==
+"@babel/plugin-transform-literals@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae"
+  integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-member-expression-literals@^7.16.7":
   version "7.16.7"
@@ -724,57 +758,58 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-modules-amd@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz"
-  integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==
+"@babel/plugin-transform-modules-amd@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed"
+  integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-module-transforms" "^7.18.0"
+    "@babel/helper-plugin-utils" "^7.17.12"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.17.9":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6"
-  integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==
+"@babel/plugin-transform-modules-commonjs@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e"
+  integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==
   dependencies:
-    "@babel/helper-module-transforms" "^7.17.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
-    "@babel/helper-simple-access" "^7.17.7"
+    "@babel/helper-module-transforms" "^7.18.0"
+    "@babel/helper-plugin-utils" "^7.17.12"
+    "@babel/helper-simple-access" "^7.18.2"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-systemjs@^7.17.8":
-  version "7.17.8"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859"
-  integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==
+"@babel/plugin-transform-modules-systemjs@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz#50ecdb43de97c8483824402f7125edb94cddb09a"
+  integrity sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==
   dependencies:
     "@babel/helper-hoist-variables" "^7.16.7"
-    "@babel/helper-module-transforms" "^7.17.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-module-transforms" "^7.18.0"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-validator-identifier" "^7.16.7"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-umd@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz"
-  integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==
+"@babel/plugin-transform-modules-umd@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f"
+  integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-module-transforms" "^7.18.0"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4"
-  integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931"
+  integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.17.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-new-target@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz"
-  integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==
+"@babel/plugin-transform-new-target@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3"
+  integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-object-super@^7.16.7":
   version "7.16.7"
@@ -784,12 +819,12 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/helper-replace-supers" "^7.16.7"
 
-"@babel/plugin-transform-parameters@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz"
-  integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==
+"@babel/plugin-transform-parameters@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766"
+  integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-property-literals@^7.16.7":
   version "7.16.7"
@@ -820,16 +855,16 @@
   dependencies:
     "@babel/plugin-transform-react-jsx" "^7.16.7"
 
-"@babel/plugin-transform-react-jsx@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz"
-  integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==
+"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba"
+  integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/helper-module-imports" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
-    "@babel/plugin-syntax-jsx" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
+    "@babel/plugin-syntax-jsx" "^7.17.12"
+    "@babel/types" "^7.17.12"
 
 "@babel/plugin-transform-react-pure-annotations@^7.16.7":
   version "7.16.7"
@@ -839,27 +874,28 @@
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-regenerator@^7.17.9":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c"
-  integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==
+"@babel/plugin-transform-regenerator@^7.18.0":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5"
+  integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==
   dependencies:
+    "@babel/helper-plugin-utils" "^7.17.12"
     regenerator-transform "^0.15.0"
 
-"@babel/plugin-transform-reserved-words@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz"
-  integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==
+"@babel/plugin-transform-reserved-words@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f"
+  integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-runtime@^7.17.10":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1"
-  integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig==
+"@babel/plugin-transform-runtime@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d"
+  integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==
   dependencies:
     "@babel/helper-module-imports" "^7.16.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     babel-plugin-polyfill-corejs2 "^0.3.0"
     babel-plugin-polyfill-corejs3 "^0.5.0"
     babel-plugin-polyfill-regenerator "^0.3.0"
@@ -872,12 +908,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-spread@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz"
-  integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==
+"@babel/plugin-transform-spread@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5"
+  integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
 
 "@babel/plugin-transform-sticky-regex@^7.16.7":
@@ -887,19 +923,19 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-template-literals@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz"
-  integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==
+"@babel/plugin-transform-template-literals@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28"
+  integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-typeof-symbol@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz"
-  integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==
+"@babel/plugin-transform-typeof-symbol@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889"
+  integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
 
 "@babel/plugin-transform-unicode-escapes@^7.16.7":
   version "7.16.7"
@@ -916,37 +952,38 @@
     "@babel/helper-create-regexp-features-plugin" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/preset-env@^7.17.10":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c"
-  integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==
+"@babel/preset-env@^7.18.2":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a"
+  integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==
   dependencies:
     "@babel/compat-data" "^7.17.10"
-    "@babel/helper-compilation-targets" "^7.17.10"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-compilation-targets" "^7.18.2"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-validator-option" "^7.16.7"
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7"
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7"
-    "@babel/plugin-proposal-async-generator-functions" "^7.16.8"
-    "@babel/plugin-proposal-class-properties" "^7.16.7"
-    "@babel/plugin-proposal-class-static-block" "^7.17.6"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12"
+    "@babel/plugin-proposal-async-generator-functions" "^7.17.12"
+    "@babel/plugin-proposal-class-properties" "^7.17.12"
+    "@babel/plugin-proposal-class-static-block" "^7.18.0"
     "@babel/plugin-proposal-dynamic-import" "^7.16.7"
-    "@babel/plugin-proposal-export-namespace-from" "^7.16.7"
-    "@babel/plugin-proposal-json-strings" "^7.16.7"
-    "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7"
+    "@babel/plugin-proposal-export-namespace-from" "^7.17.12"
+    "@babel/plugin-proposal-json-strings" "^7.17.12"
+    "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12"
     "@babel/plugin-proposal-numeric-separator" "^7.16.7"
-    "@babel/plugin-proposal-object-rest-spread" "^7.17.3"
+    "@babel/plugin-proposal-object-rest-spread" "^7.18.0"
     "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
-    "@babel/plugin-proposal-optional-chaining" "^7.16.7"
-    "@babel/plugin-proposal-private-methods" "^7.16.11"
-    "@babel/plugin-proposal-private-property-in-object" "^7.16.7"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.16.7"
+    "@babel/plugin-proposal-optional-chaining" "^7.17.12"
+    "@babel/plugin-proposal-private-methods" "^7.17.12"
+    "@babel/plugin-proposal-private-property-in-object" "^7.17.12"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.17.12"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
     "@babel/plugin-syntax-class-properties" "^7.12.13"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
     "@babel/plugin-syntax-dynamic-import" "^7.8.3"
     "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+    "@babel/plugin-syntax-import-assertions" "^7.17.12"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
     "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
@@ -956,40 +993,40 @@
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
     "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
     "@babel/plugin-syntax-top-level-await" "^7.14.5"
-    "@babel/plugin-transform-arrow-functions" "^7.16.7"
-    "@babel/plugin-transform-async-to-generator" "^7.16.8"
+    "@babel/plugin-transform-arrow-functions" "^7.17.12"
+    "@babel/plugin-transform-async-to-generator" "^7.17.12"
     "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
-    "@babel/plugin-transform-block-scoping" "^7.16.7"
-    "@babel/plugin-transform-classes" "^7.16.7"
-    "@babel/plugin-transform-computed-properties" "^7.16.7"
-    "@babel/plugin-transform-destructuring" "^7.17.7"
+    "@babel/plugin-transform-block-scoping" "^7.17.12"
+    "@babel/plugin-transform-classes" "^7.17.12"
+    "@babel/plugin-transform-computed-properties" "^7.17.12"
+    "@babel/plugin-transform-destructuring" "^7.18.0"
     "@babel/plugin-transform-dotall-regex" "^7.16.7"
-    "@babel/plugin-transform-duplicate-keys" "^7.16.7"
+    "@babel/plugin-transform-duplicate-keys" "^7.17.12"
     "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
-    "@babel/plugin-transform-for-of" "^7.16.7"
+    "@babel/plugin-transform-for-of" "^7.18.1"
     "@babel/plugin-transform-function-name" "^7.16.7"
-    "@babel/plugin-transform-literals" "^7.16.7"
+    "@babel/plugin-transform-literals" "^7.17.12"
     "@babel/plugin-transform-member-expression-literals" "^7.16.7"
-    "@babel/plugin-transform-modules-amd" "^7.16.7"
-    "@babel/plugin-transform-modules-commonjs" "^7.17.9"
-    "@babel/plugin-transform-modules-systemjs" "^7.17.8"
-    "@babel/plugin-transform-modules-umd" "^7.16.7"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10"
-    "@babel/plugin-transform-new-target" "^7.16.7"
+    "@babel/plugin-transform-modules-amd" "^7.18.0"
+    "@babel/plugin-transform-modules-commonjs" "^7.18.2"
+    "@babel/plugin-transform-modules-systemjs" "^7.18.0"
+    "@babel/plugin-transform-modules-umd" "^7.18.0"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12"
+    "@babel/plugin-transform-new-target" "^7.17.12"
     "@babel/plugin-transform-object-super" "^7.16.7"
-    "@babel/plugin-transform-parameters" "^7.16.7"
+    "@babel/plugin-transform-parameters" "^7.17.12"
     "@babel/plugin-transform-property-literals" "^7.16.7"
-    "@babel/plugin-transform-regenerator" "^7.17.9"
-    "@babel/plugin-transform-reserved-words" "^7.16.7"
+    "@babel/plugin-transform-regenerator" "^7.18.0"
+    "@babel/plugin-transform-reserved-words" "^7.17.12"
     "@babel/plugin-transform-shorthand-properties" "^7.16.7"
-    "@babel/plugin-transform-spread" "^7.16.7"
+    "@babel/plugin-transform-spread" "^7.17.12"
     "@babel/plugin-transform-sticky-regex" "^7.16.7"
-    "@babel/plugin-transform-template-literals" "^7.16.7"
-    "@babel/plugin-transform-typeof-symbol" "^7.16.7"
+    "@babel/plugin-transform-template-literals" "^7.18.2"
+    "@babel/plugin-transform-typeof-symbol" "^7.17.12"
     "@babel/plugin-transform-unicode-escapes" "^7.16.7"
     "@babel/plugin-transform-unicode-regex" "^7.16.7"
     "@babel/preset-modules" "^0.1.5"
-    "@babel/types" "^7.17.10"
+    "@babel/types" "^7.18.2"
     babel-plugin-polyfill-corejs2 "^0.3.0"
     babel-plugin-polyfill-corejs3 "^0.5.0"
     babel-plugin-polyfill-regenerator "^0.3.0"
@@ -1007,15 +1044,15 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/preset-react@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz"
-  integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==
+"@babel/preset-react@^7.17.12":
+  version "7.17.12"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d"
+  integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-plugin-utils" "^7.17.12"
     "@babel/helper-validator-option" "^7.16.7"
     "@babel/plugin-transform-react-display-name" "^7.16.7"
-    "@babel/plugin-transform-react-jsx" "^7.16.7"
+    "@babel/plugin-transform-react-jsx" "^7.17.12"
     "@babel/plugin-transform-react-jsx-development" "^7.16.7"
     "@babel/plugin-transform-react-pure-annotations" "^7.16.7"
 
@@ -1034,10 +1071,10 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.9", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
-  version "7.17.9"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
-  integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae"
+  integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==
   dependencies:
     regenerator-runtime "^0.13.4"
 
@@ -1057,26 +1094,26 @@
     "@babel/parser" "^7.16.7"
     "@babel/types" "^7.16.7"
 
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5"
-  integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2":
+  version "7.18.0"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba"
+  integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==
   dependencies:
     "@babel/code-frame" "^7.16.7"
-    "@babel/generator" "^7.17.10"
+    "@babel/generator" "^7.18.0"
     "@babel/helper-environment-visitor" "^7.16.7"
     "@babel/helper-function-name" "^7.17.9"
     "@babel/helper-hoist-variables" "^7.16.7"
     "@babel/helper-split-export-declaration" "^7.16.7"
-    "@babel/parser" "^7.17.10"
-    "@babel/types" "^7.17.10"
+    "@babel/parser" "^7.18.0"
+    "@babel/types" "^7.18.0"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
-  version "7.17.10"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4"
-  integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.2.tgz#191abfed79ebe6f4242f643a9a5cbaa36b10b091"
+  integrity sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
     to-fast-properties "^2.0.0"
@@ -1241,163 +1278,185 @@
   resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz"
   integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
 
-"@jest/console@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
-  integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
+"@jest/console@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176"
+  integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==
   dependencies:
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     chalk "^4.0.0"
-    jest-message-util "^27.5.1"
-    jest-util "^27.5.1"
+    jest-message-util "^28.1.0"
+    jest-util "^28.1.0"
     slash "^3.0.0"
 
-"@jest/core@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
-  integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
-  dependencies:
-    "@jest/console" "^27.5.1"
-    "@jest/reporters" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
+"@jest/core@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.0.tgz#784a1e6ce5358b46fcbdcfbbd93b1b713ed4ea80"
+  integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==
+  dependencies:
+    "@jest/console" "^28.1.0"
+    "@jest/reporters" "^28.1.0"
+    "@jest/test-result" "^28.1.0"
+    "@jest/transform" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     ansi-escapes "^4.2.1"
     chalk "^4.0.0"
-    emittery "^0.8.1"
+    ci-info "^3.2.0"
     exit "^0.1.2"
     graceful-fs "^4.2.9"
-    jest-changed-files "^27.5.1"
-    jest-config "^27.5.1"
-    jest-haste-map "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-regex-util "^27.5.1"
-    jest-resolve "^27.5.1"
-    jest-resolve-dependencies "^27.5.1"
-    jest-runner "^27.5.1"
-    jest-runtime "^27.5.1"
-    jest-snapshot "^27.5.1"
-    jest-util "^27.5.1"
-    jest-validate "^27.5.1"
-    jest-watcher "^27.5.1"
+    jest-changed-files "^28.0.2"
+    jest-config "^28.1.0"
+    jest-haste-map "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-regex-util "^28.0.2"
+    jest-resolve "^28.1.0"
+    jest-resolve-dependencies "^28.1.0"
+    jest-runner "^28.1.0"
+    jest-runtime "^28.1.0"
+    jest-snapshot "^28.1.0"
+    jest-util "^28.1.0"
+    jest-validate "^28.1.0"
+    jest-watcher "^28.1.0"
     micromatch "^4.0.4"
+    pretty-format "^28.1.0"
     rimraf "^3.0.0"
     slash "^3.0.0"
     strip-ansi "^6.0.0"
 
-"@jest/environment@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
-  integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
+"@jest/environment@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.0.tgz#dedf7d59ec341b9292fcf459fd0ed819eb2e228a"
+  integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==
   dependencies:
-    "@jest/fake-timers" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/fake-timers" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
-    jest-mock "^27.5.1"
+    jest-mock "^28.1.0"
 
-"@jest/fake-timers@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
-  integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
+"@jest/expect-utils@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.0.tgz#a5cde811195515a9809b96748ae8bcc331a3538a"
+  integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==
+  dependencies:
+    jest-get-type "^28.0.2"
+
+"@jest/expect@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.0.tgz#2e5a31db692597070932366a1602b5157f0f217c"
+  integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==
   dependencies:
-    "@jest/types" "^27.5.1"
-    "@sinonjs/fake-timers" "^8.0.1"
+    expect "^28.1.0"
+    jest-snapshot "^28.1.0"
+
+"@jest/fake-timers@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.0.tgz#ea77878aabd5c5d50e1fc53e76d3226101e33064"
+  integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==
+  dependencies:
+    "@jest/types" "^28.1.0"
+    "@sinonjs/fake-timers" "^9.1.1"
     "@types/node" "*"
-    jest-message-util "^27.5.1"
-    jest-mock "^27.5.1"
-    jest-util "^27.5.1"
+    jest-message-util "^28.1.0"
+    jest-mock "^28.1.0"
+    jest-util "^28.1.0"
 
-"@jest/globals@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
-  integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
+"@jest/globals@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.0.tgz#a4427d2eb11763002ff58e24de56b84ba79eb793"
+  integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==
   dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/types" "^27.5.1"
-    expect "^27.5.1"
+    "@jest/environment" "^28.1.0"
+    "@jest/expect" "^28.1.0"
+    "@jest/types" "^28.1.0"
 
-"@jest/reporters@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
-  integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
+"@jest/reporters@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.0.tgz#5183a28b9b593b6000fa9b89b031c7216b58a9a0"
+  integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==
   dependencies:
     "@bcoe/v8-coverage" "^0.2.3"
-    "@jest/console" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/console" "^28.1.0"
+    "@jest/test-result" "^28.1.0"
+    "@jest/transform" "^28.1.0"
+    "@jest/types" "^28.1.0"
+    "@jridgewell/trace-mapping" "^0.3.7"
     "@types/node" "*"
     chalk "^4.0.0"
     collect-v8-coverage "^1.0.0"
     exit "^0.1.2"
-    glob "^7.1.2"
+    glob "^7.1.3"
     graceful-fs "^4.2.9"
     istanbul-lib-coverage "^3.0.0"
     istanbul-lib-instrument "^5.1.0"
     istanbul-lib-report "^3.0.0"
     istanbul-lib-source-maps "^4.0.0"
     istanbul-reports "^3.1.3"
-    jest-haste-map "^27.5.1"
-    jest-resolve "^27.5.1"
-    jest-util "^27.5.1"
-    jest-worker "^27.5.1"
+    jest-util "^28.1.0"
+    jest-worker "^28.1.0"
     slash "^3.0.0"
-    source-map "^0.6.0"
     string-length "^4.0.1"
+    strip-ansi "^6.0.0"
     terminal-link "^2.0.0"
-    v8-to-istanbul "^8.1.0"
+    v8-to-istanbul "^9.0.0"
 
-"@jest/source-map@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
-  integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
+"@jest/schemas@^28.0.2":
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613"
+  integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==
   dependencies:
+    "@sinclair/typebox" "^0.23.3"
+
+"@jest/source-map@^28.0.2":
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90"
+  integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==
+  dependencies:
+    "@jridgewell/trace-mapping" "^0.3.7"
     callsites "^3.0.0"
     graceful-fs "^4.2.9"
-    source-map "^0.6.0"
 
-"@jest/test-result@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
-  integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
+"@jest/test-result@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c"
+  integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==
   dependencies:
-    "@jest/console" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/console" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/istanbul-lib-coverage" "^2.0.0"
     collect-v8-coverage "^1.0.0"
 
-"@jest/test-sequencer@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
-  integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
+"@jest/test-sequencer@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz#ce7294bbe986415b9a30e218c7e705e6ebf2cdf2"
+  integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==
   dependencies:
-    "@jest/test-result" "^27.5.1"
+    "@jest/test-result" "^28.1.0"
     graceful-fs "^4.2.9"
-    jest-haste-map "^27.5.1"
-    jest-runtime "^27.5.1"
+    jest-haste-map "^28.1.0"
+    slash "^3.0.0"
 
-"@jest/transform@^27.5.1":
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
-  integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
+"@jest/transform@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.0.tgz#224a3c9ba4cc98e2ff996c0a89a2d59db15c74ce"
+  integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==
   dependencies:
-    "@babel/core" "^7.1.0"
-    "@jest/types" "^27.5.1"
+    "@babel/core" "^7.11.6"
+    "@jest/types" "^28.1.0"
+    "@jridgewell/trace-mapping" "^0.3.7"
     babel-plugin-istanbul "^6.1.1"
     chalk "^4.0.0"
     convert-source-map "^1.4.0"
     fast-json-stable-stringify "^2.0.0"
     graceful-fs "^4.2.9"
-    jest-haste-map "^27.5.1"
-    jest-regex-util "^27.5.1"
-    jest-util "^27.5.1"
+    jest-haste-map "^28.1.0"
+    jest-regex-util "^28.0.2"
+    jest-util "^28.1.0"
     micromatch "^4.0.4"
     pirates "^4.0.4"
     slash "^3.0.0"
-    source-map "^0.6.1"
-    write-file-atomic "^3.0.0"
+    write-file-atomic "^4.0.1"
 
 "@jest/types@^25.5.0":
   version "25.5.0"
@@ -1409,7 +1468,7 @@
     "@types/yargs" "^15.0.0"
     chalk "^3.0.0"
 
-"@jest/types@^27.0.2", "@jest/types@^27.5.1":
+"@jest/types@^27.0.2":
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
   integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
@@ -1420,13 +1479,26 @@
     "@types/yargs" "^16.0.0"
     chalk "^4.0.0"
 
-"@jridgewell/gen-mapping@^0.1.0":
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
-  integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+"@jest/types@^28.1.0":
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519"
+  integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==
+  dependencies:
+    "@jest/schemas" "^28.0.2"
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "@types/istanbul-reports" "^3.0.0"
+    "@types/node" "*"
+    "@types/yargs" "^17.0.8"
+    chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.0":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9"
+  integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==
   dependencies:
     "@jridgewell/set-array" "^1.0.0"
     "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.9"
 
 "@jridgewell/resolve-uri@^3.0.3":
   version "3.0.4"
@@ -1451,6 +1523,22 @@
     "@jridgewell/resolve-uri" "^3.0.3"
     "@jridgewell/sourcemap-codec" "^1.4.10"
 
+"@jridgewell/trace-mapping@^0.3.7":
+  version "0.3.9"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+  integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/trace-mapping@^0.3.9":
+  version "0.3.13"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea"
+  integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
 "@node-redis/bloom@1.0.1":
   version "1.0.1"
   resolved "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz"
@@ -1498,10 +1586,15 @@
   resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz"
   integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
 
-"@rails/ujs@^6.1.5":
-  version "6.1.5"
-  resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.5.tgz#bb1afddd0d771f00924f44b21634969e329532e1"
-  integrity sha512-Ir4yd2fdDldWIghavPr874copVKf6OOoecKHZiFRlPtm38tFvhyxr+ywzNieXGwolF9JQe3D5GrM8ejkzUgh5Q==
+"@rails/ujs@^6.1.6":
+  version "6.1.6"
+  resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.6.tgz#de486ae0a663e1bed637a012cbb2739bfcfa2031"
+  integrity sha512-2M4zlthYmOC6X/tcPcFd//sIL26a7JbCpGNl8uIrQf+pR1Z47uhYt9cOwVqJTJZPurdy2k+YY3Pn64pqruAPEA==
+
+"@sinclair/typebox@^0.23.3":
+  version "0.23.5"
+  resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d"
+  integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==
 
 "@sinonjs/commons@^1.7.0":
   version "1.8.1"
@@ -1510,10 +1603,10 @@
   dependencies:
     type-detect "4.0.8"
 
-"@sinonjs/fake-timers@^8.0.1":
-  version "8.0.1"
-  resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz"
-  integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew==
+"@sinonjs/fake-timers@^9.1.1":
+  version "9.1.2"
+  resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
+  integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
   dependencies:
     "@sinonjs/commons" "^1.7.0"
 
@@ -1555,17 +1648,17 @@
     "@testing-library/dom" "^8.0.0"
     "@types/react-dom" "<18.0.0"
 
-"@tootallnate/once@1":
-  version "1.1.2"
-  resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz"
-  integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+"@tootallnate/once@2":
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+  integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
 
 "@types/aria-query@^4.2.0":
   version "4.2.0"
   resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.0.tgz"
   integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==
 
-"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3":
+"@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3":
   version "7.1.18"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8"
   integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==
@@ -1591,7 +1684,7 @@
     "@babel/parser" "^7.1.0"
     "@babel/types" "^7.0.0"
 
-"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
   version "7.0.13"
   resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz"
   integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==
@@ -1617,10 +1710,10 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
-"@types/graceful-fs@^4.1.2":
-  version "4.1.3"
-  resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz"
-  integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==
+"@types/graceful-fs@^4.1.3":
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+  integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
   dependencies:
     "@types/node" "*"
 
@@ -1667,7 +1760,21 @@
     jest-diff "^25.2.1"
     pretty-format "^25.2.1"
 
-"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+"@types/jsdom@^16.2.4":
+  version "16.2.14"
+  resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.14.tgz#26fe9da6a8870715b154bb84cd3b2e53433d8720"
+  integrity sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==
+  dependencies:
+    "@types/node" "*"
+    "@types/parse5" "*"
+    "@types/tough-cookie" "*"
+
+"@types/json-schema@^7.0.5":
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
+  integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
+
+"@types/json-schema@^7.0.8":
   version "7.0.9"
   resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz"
   integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
@@ -1692,6 +1799,11 @@
   resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
+"@types/parse5@*":
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
+  integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
+
 "@types/prettier@^2.1.5":
   version "2.2.3"
   resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz"
@@ -1771,6 +1883,11 @@
   dependencies:
     "@types/jest" "*"
 
+"@types/tough-cookie@*":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397"
+  integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==
+
 "@types/yargs-parser@*":
   version "15.0.0"
   resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz"
@@ -1790,6 +1907,13 @@
   dependencies:
     "@types/yargs-parser" "*"
 
+"@types/yargs@^17.0.8":
+  version "17.0.10"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a"
+  integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==
+  dependencies:
+    "@types/yargs-parser" "*"
+
 "@webassemblyjs/ast@1.9.0":
   version "1.9.0"
   resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz"
@@ -1945,10 +2069,10 @@
   resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
   integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 
-abab@^2.0.3, abab@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz"
-  integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+abab@^2.0.5, abab@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+  integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
 
 accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
   version "1.3.8"
@@ -2008,11 +2132,16 @@ acorn@^7.1.1, acorn@^7.4.0:
   resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
-acorn@^8.0.4, acorn@^8.2.4:
+acorn@^8.0.4:
   version "8.3.0"
   resolved "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz"
   integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==
 
+acorn@^8.5.0:
+  version "8.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+  integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
+
 agent-base@6:
   version "6.0.2"
   resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
@@ -2232,14 +2361,14 @@ array-flatten@^2.1.0:
   resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
   integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
 
-array-includes@^3.1.3, array-includes@^3.1.4:
-  version "3.1.4"
-  resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz"
-  integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
+array-includes@^3.1.3, array-includes@^3.1.4, array-includes@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb"
+  integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==
   dependencies:
     call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.1"
+    define-properties "^1.1.4"
+    es-abstract "^1.19.5"
     get-intrinsic "^1.1.1"
     is-string "^1.0.7"
 
@@ -2366,12 +2495,13 @@ axe-core@^4.3.5:
   resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz"
   integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==
 
-axios@^0.26.1:
-  version "0.26.1"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
-  integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
+axios@^0.27.2:
+  version "0.27.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+  integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
   dependencies:
-    follow-redirects "^1.14.8"
+    follow-redirects "^1.14.9"
+    form-data "^4.0.0"
 
 axobject-query@^2.2.0:
   version "2.2.0"
@@ -2390,16 +2520,15 @@ babel-eslint@^10.1.0:
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
-babel-jest@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
-  integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
+babel-jest@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.0.tgz#95a67f8e2e7c0042e7b3ad3951b8af41a533b5ea"
+  integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==
   dependencies:
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/transform" "^28.1.0"
     "@types/babel__core" "^7.1.14"
     babel-plugin-istanbul "^6.1.1"
-    babel-preset-jest "^27.5.1"
+    babel-preset-jest "^28.0.2"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
     slash "^3.0.0"
@@ -2432,14 +2561,14 @@ babel-plugin-istanbul@^6.1.1:
     istanbul-lib-instrument "^5.0.4"
     test-exclude "^6.0.0"
 
-babel-plugin-jest-hoist@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
-  integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
+babel-plugin-jest-hoist@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz#9307d03a633be6fc4b1a6bc5c3a87e22bd01dd3b"
+  integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==
   dependencies:
     "@babel/template" "^7.3.3"
     "@babel/types" "^7.3.3"
-    "@types/babel__core" "^7.0.0"
+    "@types/babel__core" "^7.1.14"
     "@types/babel__traverse" "^7.0.6"
 
 babel-plugin-lodash@^3.3.4:
@@ -2541,12 +2670,12 @@ babel-preset-current-node-syntax@^1.0.0:
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
     "@babel/plugin-syntax-top-level-await" "^7.8.3"
 
-babel-preset-jest@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
-  integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
+babel-preset-jest@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz#d8210fe4e46c1017e9fa13d7794b166e93aa9f89"
+  integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==
   dependencies:
-    babel-plugin-jest-hoist "^27.5.1"
+    babel-plugin-jest-hoist "^28.0.2"
     babel-preset-current-node-syntax "^1.0.0"
 
 babel-runtime@^6.26.0:
@@ -2685,6 +2814,13 @@ brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
+brace-expansion@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+  dependencies:
+    balanced-match "^1.0.0"
+
 braces@^2.3.1, braces@^2.3.2:
   version "2.3.2"
   resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
@@ -3738,10 +3874,10 @@ csso@^4.0.2:
   dependencies:
     css-tree "^1.1.2"
 
-cssom@^0.4.4:
-  version "0.4.4"
-  resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz"
-  integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+cssom@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
+  integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
 
 cssom@~0.3.6:
   version "0.3.8"
@@ -3778,14 +3914,14 @@ damerau-levenshtein@^1.0.7:
   resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz"
   integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
 
-data-urls@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz"
-  integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+data-urls@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143"
+  integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==
   dependencies:
-    abab "^2.0.3"
-    whatwg-mimetype "^2.3.0"
-    whatwg-url "^8.0.0"
+    abab "^2.0.6"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^11.0.0"
 
 debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
   version "2.6.9"
@@ -3795,9 +3931,9 @@ debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
     ms "2.0.0"
 
 debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
-  version "4.3.3"
-  resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz"
-  integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
   dependencies:
     ms "2.1.2"
 
@@ -3813,9 +3949,9 @@ decamelize@^1.2.0:
   resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
-decimal.js@^10.2.1:
+decimal.js@^10.3.1:
   version "10.3.1"
-  resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
   integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
 
 decode-uri-component@^0.2.0:
@@ -3863,12 +3999,13 @@ default-gateway@^4.2.0:
     execa "^1.0.0"
     ip-regex "^2.1.0"
 
-define-properties@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
-  integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+define-properties@^1.1.3, define-properties@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+  integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
   dependencies:
-    object-keys "^1.0.12"
+    has-property-descriptors "^1.0.0"
+    object-keys "^1.1.1"
 
 define-property@^0.2.5:
   version "0.2.5"
@@ -3970,10 +4107,10 @@ diff-sequences@^25.2.6:
   resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz"
   integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
 
-diff-sequences@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
-  integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+diff-sequences@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41"
+  integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==
 
 diffie-hellman@^5.0.0:
   version "5.0.3"
@@ -4069,12 +4206,12 @@ domelementtype@^2.0.1:
   resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz"
   integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
 
-domexception@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz"
-  integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+domexception@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
+  integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
   dependencies:
-    webidl-conversions "^5.0.0"
+    webidl-conversions "^7.0.0"
 
 domutils@^1.7.0:
   version "1.7.0"
@@ -4091,10 +4228,10 @@ dot-prop@^5.2.0:
   dependencies:
     is-obj "^2.0.0"
 
-dotenv@^16.0.0:
-  version "16.0.0"
-  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411"
-  integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==
+dotenv@^16.0.1:
+  version "16.0.1"
+  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d"
+  integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==
 
 duplexer@^0.1.2:
   version "0.1.2"
@@ -4144,10 +4281,10 @@ elliptic@^6.5.3:
     minimalistic-assert "^1.0.1"
     minimalistic-crypto-utils "^1.0.1"
 
-emittery@^0.8.1:
-  version "0.8.1"
-  resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz"
-  integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==
+emittery@^0.10.2:
+  version "0.10.2"
+  resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933"
+  integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==
 
 "emoji-mart@npm:emoji-mart-lazyload":
   version "3.0.1-j"
@@ -4237,31 +4374,34 @@ error-stack-parser@^2.0.6:
   dependencies:
     stackframe "^1.1.1"
 
-es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1:
-  version "1.19.1"
-  resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz"
-  integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
+es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5:
+  version "1.20.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.0.tgz#b2d526489cceca004588296334726329e0a6bfb6"
+  integrity sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==
   dependencies:
     call-bind "^1.0.2"
     es-to-primitive "^1.2.1"
     function-bind "^1.1.1"
+    function.prototype.name "^1.1.5"
     get-intrinsic "^1.1.1"
     get-symbol-description "^1.0.0"
     has "^1.0.3"
-    has-symbols "^1.0.2"
+    has-property-descriptors "^1.0.0"
+    has-symbols "^1.0.3"
     internal-slot "^1.0.3"
     is-callable "^1.2.4"
-    is-negative-zero "^2.0.1"
+    is-negative-zero "^2.0.2"
     is-regex "^1.1.4"
-    is-shared-array-buffer "^1.0.1"
+    is-shared-array-buffer "^1.0.2"
     is-string "^1.0.7"
-    is-weakref "^1.0.1"
-    object-inspect "^1.11.0"
+    is-weakref "^1.0.2"
+    object-inspect "^1.12.0"
     object-keys "^1.1.1"
     object.assign "^4.1.2"
-    string.prototype.trimend "^1.0.4"
-    string.prototype.trimstart "^1.0.4"
-    unbox-primitive "^1.0.1"
+    regexp.prototype.flags "^1.4.1"
+    string.prototype.trimend "^1.0.5"
+    string.prototype.trimstart "^1.0.5"
+    unbox-primitive "^1.0.2"
 
 es-to-primitive@^1.2.1:
   version "1.2.1"
@@ -4734,15 +4874,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
-  integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+expect@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.0.tgz#10e8da64c0850eb8c39a480199f14537f46e8360"
+  integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==
   dependencies:
-    "@jest/types" "^27.5.1"
-    jest-get-type "^27.5.1"
-    jest-matcher-utils "^27.5.1"
-    jest-message-util "^27.5.1"
+    "@jest/expect-utils" "^28.1.0"
+    jest-get-type "^28.0.2"
+    jest-matcher-utils "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-util "^28.1.0"
 
 express@^4.17.1, express@^4.18.1:
   version "4.18.1"
@@ -5013,10 +5154,10 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-follow-redirects@^1.0.0, follow-redirects@^1.14.8:
-  version "1.14.8"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
-  integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
+follow-redirects@^1.0.0, follow-redirects@^1.14.9:
+  version "1.14.9"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
+  integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
 
 font-awesome@^4.7.0:
   version "4.7.0"
@@ -5028,10 +5169,10 @@ for-in@^1.0.2:
   resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
   integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
 
-form-data@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz"
-  integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
   dependencies:
     asynckit "^0.4.0"
     combined-stream "^1.0.8"
@@ -5127,11 +5268,31 @@ function-bind@^1.1.1:
   resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
+function.prototype.name@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+  integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.0"
+    functions-have-names "^1.2.2"
+
 functional-red-black-tree@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
   integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
+functions-have-names@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+fuzzysort@^1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-1.9.0.tgz#d36d27949eae22340bb6f7ba30ea6751b92a181c"
+  integrity sha512-MOxCT0qLTwLqmEwc7UtU045RKef7mc8Qz8eR4r2bLNEq9dy/c3ZKMEFp6IEst69otkQdFZ4FfgH2dmZD+ddX1g==
+
 gauge@^4.0.3:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
@@ -5229,7 +5390,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
-glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
   version "7.2.0"
   resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz"
   integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -5241,6 +5402,17 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^8.0.3:
+  version "8.0.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
+  integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^5.0.1"
+    once "^1.3.0"
+
 glob@~7.1.1:
   version "7.1.7"
   resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
@@ -5362,6 +5534,11 @@ has-bigints@^1.0.1:
   resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
   integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
 
+has-bigints@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+  integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
 has-flag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"
@@ -5377,11 +5554,28 @@ has-flag@^4.0.0:
   resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
-has-symbols@^1.0.1, has-symbols@^1.0.2:
+has-property-descriptors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+  integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+  dependencies:
+    get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
+
+has-symbols@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz"
   integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
 
+has-symbols@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
 has-tostringtag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
@@ -5514,12 +5708,12 @@ hsla-regex@^1.0.0:
   resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz"
   integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
 
-html-encoding-sniffer@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz"
-  integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+html-encoding-sniffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
+  integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
   dependencies:
-    whatwg-encoding "^1.0.5"
+    whatwg-encoding "^2.0.0"
 
 html-entities@^1.3.1:
   version "1.4.0"
@@ -5567,12 +5761,12 @@ http-parser-js@>=0.5.1:
   resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz"
   integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==
 
-http-proxy-agent@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz"
-  integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+http-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+  integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
   dependencies:
-    "@tootallnate/once" "1"
+    "@tootallnate/once" "2"
     agent-base "6"
     debug "4"
 
@@ -5601,9 +5795,9 @@ https-browserify@^1.0.0:
   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
 
 https-proxy-agent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz"
-  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+  integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
   dependencies:
     agent-base "6"
     debug "4"
@@ -5620,6 +5814,13 @@ iconv-lite@0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+  integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
 icss-utils@^5.0.0, icss-utils@^5.1.0:
   version "5.1.0"
   resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz"
@@ -5650,10 +5851,10 @@ ignore@^4.0.6:
   resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-immutable@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz"
-  integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==
+immutable@^4.0.0, immutable@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
+  integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
 
 import-cwd@^2.0.0:
   version "2.1.0"
@@ -6097,9 +6298,9 @@ is-nan@^1.3.2:
     call-bind "^1.0.0"
     define-properties "^1.1.3"
 
-is-negative-zero@^2.0.1:
+is-negative-zero@^2.0.2:
   version "2.0.2"
-  resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
+  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
   integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
 
 is-number-object@^1.0.4:
@@ -6175,10 +6376,12 @@ is-resolvable@^1.0.0:
   resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz"
   integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
 
-is-shared-array-buffer@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz"
-  integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+is-shared-array-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+  integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+  dependencies:
+    call-bind "^1.0.2"
 
 is-stream@^1.1.0:
   version "1.1.0"
@@ -6204,19 +6407,14 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
   dependencies:
     has-symbols "^1.0.2"
 
-is-typedarray@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
-  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
 is-url@^1.2.4:
   version "1.2.4"
   resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz"
   integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
 
-is-weakref@^1.0.1:
+is-weakref@^1.0.2:
   version "1.0.2"
-  resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+  resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
   integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
   dependencies:
     call-bind "^1.0.2"
@@ -6300,85 +6498,82 @@ istanbul-reports@^3.1.3:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
-jest-changed-files@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
-  integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
+jest-changed-files@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531"
+  integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==
   dependencies:
-    "@jest/types" "^27.5.1"
     execa "^5.0.0"
     throat "^6.0.1"
 
-jest-circus@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
-  integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
+jest-circus@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.0.tgz#e229f590911bd54d60efaf076f7acd9360296dae"
+  integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==
   dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/environment" "^28.1.0"
+    "@jest/expect" "^28.1.0"
+    "@jest/test-result" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     chalk "^4.0.0"
     co "^4.6.0"
     dedent "^0.7.0"
-    expect "^27.5.1"
     is-generator-fn "^2.0.0"
-    jest-each "^27.5.1"
-    jest-matcher-utils "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-runtime "^27.5.1"
-    jest-snapshot "^27.5.1"
-    jest-util "^27.5.1"
-    pretty-format "^27.5.1"
+    jest-each "^28.1.0"
+    jest-matcher-utils "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-runtime "^28.1.0"
+    jest-snapshot "^28.1.0"
+    jest-util "^28.1.0"
+    pretty-format "^28.1.0"
     slash "^3.0.0"
     stack-utils "^2.0.3"
     throat "^6.0.1"
 
-jest-cli@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
-  integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
+jest-cli@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.0.tgz#cd1d8adb9630102d5ba04a22895f63decdd7ac1f"
+  integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==
   dependencies:
-    "@jest/core" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/core" "^28.1.0"
+    "@jest/test-result" "^28.1.0"
+    "@jest/types" "^28.1.0"
     chalk "^4.0.0"
     exit "^0.1.2"
     graceful-fs "^4.2.9"
     import-local "^3.0.2"
-    jest-config "^27.5.1"
-    jest-util "^27.5.1"
-    jest-validate "^27.5.1"
+    jest-config "^28.1.0"
+    jest-util "^28.1.0"
+    jest-validate "^28.1.0"
     prompts "^2.0.1"
-    yargs "^16.2.0"
+    yargs "^17.3.1"
 
-jest-config@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
-  integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
+jest-config@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.0.tgz#fca22ca0760e746fe1ce1f9406f6b307ab818501"
+  integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==
   dependencies:
-    "@babel/core" "^7.8.0"
-    "@jest/test-sequencer" "^27.5.1"
-    "@jest/types" "^27.5.1"
-    babel-jest "^27.5.1"
+    "@babel/core" "^7.11.6"
+    "@jest/test-sequencer" "^28.1.0"
+    "@jest/types" "^28.1.0"
+    babel-jest "^28.1.0"
     chalk "^4.0.0"
     ci-info "^3.2.0"
     deepmerge "^4.2.2"
-    glob "^7.1.1"
+    glob "^7.1.3"
     graceful-fs "^4.2.9"
-    jest-circus "^27.5.1"
-    jest-environment-jsdom "^27.5.1"
-    jest-environment-node "^27.5.1"
-    jest-get-type "^27.5.1"
-    jest-jasmine2 "^27.5.1"
-    jest-regex-util "^27.5.1"
-    jest-resolve "^27.5.1"
-    jest-runner "^27.5.1"
-    jest-util "^27.5.1"
-    jest-validate "^27.5.1"
+    jest-circus "^28.1.0"
+    jest-environment-node "^28.1.0"
+    jest-get-type "^28.0.2"
+    jest-regex-util "^28.0.2"
+    jest-resolve "^28.1.0"
+    jest-runner "^28.1.0"
+    jest-util "^28.1.0"
+    jest-validate "^28.1.0"
     micromatch "^4.0.4"
     parse-json "^5.2.0"
-    pretty-format "^27.5.1"
+    pretty-format "^28.1.0"
     slash "^3.0.0"
     strip-json-comments "^3.1.1"
 
@@ -6392,151 +6587,128 @@ jest-diff@^25.2.1:
     jest-get-type "^25.2.6"
     pretty-format "^25.5.0"
 
-jest-diff@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
-  integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+jest-diff@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269"
+  integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==
   dependencies:
     chalk "^4.0.0"
-    diff-sequences "^27.5.1"
-    jest-get-type "^27.5.1"
-    pretty-format "^27.5.1"
+    diff-sequences "^28.0.2"
+    jest-get-type "^28.0.2"
+    pretty-format "^28.1.0"
 
-jest-docblock@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
-  integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
+jest-docblock@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2"
+  integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==
   dependencies:
     detect-newline "^3.0.0"
 
-jest-each@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
-  integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
+jest-each@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.0.tgz#54ae66d6a0a5b1913e9a87588d26c2687c39458b"
+  integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==
   dependencies:
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     chalk "^4.0.0"
-    jest-get-type "^27.5.1"
-    jest-util "^27.5.1"
-    pretty-format "^27.5.1"
-
-jest-environment-jsdom@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
-  integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
-  dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/fake-timers" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    jest-get-type "^28.0.2"
+    jest-util "^28.1.0"
+    pretty-format "^28.1.0"
+
+jest-environment-jsdom@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.0.tgz#1042cffd0343615c5fac2d2c8da20d1d43b73ef8"
+  integrity sha512-8n6P4xiDjNVqTWv6W6vJPuQdLx+ZiA3dbYg7YJ+DPzR+9B61K6pMVJrSs2IxfGRG4J7pyAUA5shQ9G0KEun78w==
+  dependencies:
+    "@jest/environment" "^28.1.0"
+    "@jest/fake-timers" "^28.1.0"
+    "@jest/types" "^28.1.0"
+    "@types/jsdom" "^16.2.4"
     "@types/node" "*"
-    jest-mock "^27.5.1"
-    jest-util "^27.5.1"
-    jsdom "^16.6.0"
-
-jest-environment-node@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
-  integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
-  dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/fake-timers" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    jest-mock "^28.1.0"
+    jest-util "^28.1.0"
+    jsdom "^19.0.0"
+
+jest-environment-node@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.0.tgz#6ed2150aa31babba0c488c5b4f4d813a585c68e6"
+  integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==
+  dependencies:
+    "@jest/environment" "^28.1.0"
+    "@jest/fake-timers" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
-    jest-mock "^27.5.1"
-    jest-util "^27.5.1"
+    jest-mock "^28.1.0"
+    jest-util "^28.1.0"
 
 jest-get-type@^25.2.6:
   version "25.2.6"
   resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz"
   integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
 
-jest-get-type@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
-  integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+jest-get-type@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
+  integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
 
-jest-haste-map@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
-  integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
+jest-haste-map@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.0.tgz#6c1ee2daf1c20a3e03dbd8e5b35c4d73d2349cf0"
+  integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==
   dependencies:
-    "@jest/types" "^27.5.1"
-    "@types/graceful-fs" "^4.1.2"
+    "@jest/types" "^28.1.0"
+    "@types/graceful-fs" "^4.1.3"
     "@types/node" "*"
     anymatch "^3.0.3"
     fb-watchman "^2.0.0"
     graceful-fs "^4.2.9"
-    jest-regex-util "^27.5.1"
-    jest-serializer "^27.5.1"
-    jest-util "^27.5.1"
-    jest-worker "^27.5.1"
+    jest-regex-util "^28.0.2"
+    jest-util "^28.1.0"
+    jest-worker "^28.1.0"
     micromatch "^4.0.4"
     walker "^1.0.7"
   optionalDependencies:
     fsevents "^2.3.2"
 
-jest-jasmine2@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
-  integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
-  dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/source-map" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/types" "^27.5.1"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    co "^4.6.0"
-    expect "^27.5.1"
-    is-generator-fn "^2.0.0"
-    jest-each "^27.5.1"
-    jest-matcher-utils "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-runtime "^27.5.1"
-    jest-snapshot "^27.5.1"
-    jest-util "^27.5.1"
-    pretty-format "^27.5.1"
-    throat "^6.0.1"
-
-jest-leak-detector@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
-  integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+jest-leak-detector@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz#b65167776a8787443214d6f3f54935a4c73c8a45"
+  integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==
   dependencies:
-    jest-get-type "^27.5.1"
-    pretty-format "^27.5.1"
+    jest-get-type "^28.0.2"
+    pretty-format "^28.1.0"
 
-jest-matcher-utils@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
-  integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+jest-matcher-utils@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf"
+  integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==
   dependencies:
     chalk "^4.0.0"
-    jest-diff "^27.5.1"
-    jest-get-type "^27.5.1"
-    pretty-format "^27.5.1"
+    jest-diff "^28.1.0"
+    jest-get-type "^28.0.2"
+    pretty-format "^28.1.0"
 
-jest-message-util@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
-  integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+jest-message-util@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af"
+  integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==
   dependencies:
     "@babel/code-frame" "^7.12.13"
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     "@types/stack-utils" "^2.0.0"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
     micromatch "^4.0.4"
-    pretty-format "^27.5.1"
+    pretty-format "^28.1.0"
     slash "^3.0.0"
     stack-utils "^2.0.3"
 
-jest-mock@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
-  integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
+jest-mock@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.0.tgz#ccc7cc12a9b330b3182db0c651edc90d163ff73e"
+  integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==
   dependencies:
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
 
 jest-pnp-resolver@^1.2.2:
@@ -6544,162 +6716,154 @@ jest-pnp-resolver@^1.2.2:
   resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz"
   integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
 
-jest-regex-util@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
-  integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
+jest-regex-util@^28.0.2:
+  version "28.0.2"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead"
+  integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==
 
-jest-resolve-dependencies@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
-  integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
+jest-resolve-dependencies@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz#167becb8bee6e20b5ef4a3a728ec67aef6b0b79b"
+  integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==
   dependencies:
-    "@jest/types" "^27.5.1"
-    jest-regex-util "^27.5.1"
-    jest-snapshot "^27.5.1"
+    jest-regex-util "^28.0.2"
+    jest-snapshot "^28.1.0"
 
-jest-resolve@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
-  integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
+jest-resolve@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.0.tgz#b1f32748a6cee7d1779c7ef639c0a87078de3d35"
+  integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==
   dependencies:
-    "@jest/types" "^27.5.1"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
-    jest-haste-map "^27.5.1"
+    jest-haste-map "^28.1.0"
     jest-pnp-resolver "^1.2.2"
-    jest-util "^27.5.1"
-    jest-validate "^27.5.1"
+    jest-util "^28.1.0"
+    jest-validate "^28.1.0"
     resolve "^1.20.0"
     resolve.exports "^1.1.0"
     slash "^3.0.0"
 
-jest-runner@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
-  integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
-  dependencies:
-    "@jest/console" "^27.5.1"
-    "@jest/environment" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
+jest-runner@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.0.tgz#aefe2a1e618a69baa0b24a50edc54fdd7e728eaa"
+  integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==
+  dependencies:
+    "@jest/console" "^28.1.0"
+    "@jest/environment" "^28.1.0"
+    "@jest/test-result" "^28.1.0"
+    "@jest/transform" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     chalk "^4.0.0"
-    emittery "^0.8.1"
+    emittery "^0.10.2"
     graceful-fs "^4.2.9"
-    jest-docblock "^27.5.1"
-    jest-environment-jsdom "^27.5.1"
-    jest-environment-node "^27.5.1"
-    jest-haste-map "^27.5.1"
-    jest-leak-detector "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-resolve "^27.5.1"
-    jest-runtime "^27.5.1"
-    jest-util "^27.5.1"
-    jest-worker "^27.5.1"
-    source-map-support "^0.5.6"
+    jest-docblock "^28.0.2"
+    jest-environment-node "^28.1.0"
+    jest-haste-map "^28.1.0"
+    jest-leak-detector "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-resolve "^28.1.0"
+    jest-runtime "^28.1.0"
+    jest-util "^28.1.0"
+    jest-watcher "^28.1.0"
+    jest-worker "^28.1.0"
+    source-map-support "0.5.13"
     throat "^6.0.1"
 
-jest-runtime@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
-  integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
-  dependencies:
-    "@jest/environment" "^27.5.1"
-    "@jest/fake-timers" "^27.5.1"
-    "@jest/globals" "^27.5.1"
-    "@jest/source-map" "^27.5.1"
-    "@jest/test-result" "^27.5.1"
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
+jest-runtime@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.0.tgz#4847dcb2a4eb4b0f9eaf41306897e51fb1665631"
+  integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==
+  dependencies:
+    "@jest/environment" "^28.1.0"
+    "@jest/fake-timers" "^28.1.0"
+    "@jest/globals" "^28.1.0"
+    "@jest/source-map" "^28.0.2"
+    "@jest/test-result" "^28.1.0"
+    "@jest/transform" "^28.1.0"
+    "@jest/types" "^28.1.0"
     chalk "^4.0.0"
     cjs-module-lexer "^1.0.0"
     collect-v8-coverage "^1.0.0"
     execa "^5.0.0"
     glob "^7.1.3"
     graceful-fs "^4.2.9"
-    jest-haste-map "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-mock "^27.5.1"
-    jest-regex-util "^27.5.1"
-    jest-resolve "^27.5.1"
-    jest-snapshot "^27.5.1"
-    jest-util "^27.5.1"
+    jest-haste-map "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-mock "^28.1.0"
+    jest-regex-util "^28.0.2"
+    jest-resolve "^28.1.0"
+    jest-snapshot "^28.1.0"
+    jest-util "^28.1.0"
     slash "^3.0.0"
     strip-bom "^4.0.0"
 
-jest-serializer@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
-  integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
+jest-snapshot@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.0.tgz#4b74fa8816707dd10fe9d551c2c258e5a67b53b6"
+  integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==
   dependencies:
-    "@types/node" "*"
-    graceful-fs "^4.2.9"
-
-jest-snapshot@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
-  integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
-  dependencies:
-    "@babel/core" "^7.7.2"
+    "@babel/core" "^7.11.6"
     "@babel/generator" "^7.7.2"
     "@babel/plugin-syntax-typescript" "^7.7.2"
     "@babel/traverse" "^7.7.2"
-    "@babel/types" "^7.0.0"
-    "@jest/transform" "^27.5.1"
-    "@jest/types" "^27.5.1"
-    "@types/babel__traverse" "^7.0.4"
+    "@babel/types" "^7.3.3"
+    "@jest/expect-utils" "^28.1.0"
+    "@jest/transform" "^28.1.0"
+    "@jest/types" "^28.1.0"
+    "@types/babel__traverse" "^7.0.6"
     "@types/prettier" "^2.1.5"
     babel-preset-current-node-syntax "^1.0.0"
     chalk "^4.0.0"
-    expect "^27.5.1"
+    expect "^28.1.0"
     graceful-fs "^4.2.9"
-    jest-diff "^27.5.1"
-    jest-get-type "^27.5.1"
-    jest-haste-map "^27.5.1"
-    jest-matcher-utils "^27.5.1"
-    jest-message-util "^27.5.1"
-    jest-util "^27.5.1"
+    jest-diff "^28.1.0"
+    jest-get-type "^28.0.2"
+    jest-haste-map "^28.1.0"
+    jest-matcher-utils "^28.1.0"
+    jest-message-util "^28.1.0"
+    jest-util "^28.1.0"
     natural-compare "^1.4.0"
-    pretty-format "^27.5.1"
-    semver "^7.3.2"
+    pretty-format "^28.1.0"
+    semver "^7.3.5"
 
-jest-util@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
-  integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
+jest-util@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5"
+  integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==
   dependencies:
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     chalk "^4.0.0"
     ci-info "^3.2.0"
     graceful-fs "^4.2.9"
     picomatch "^2.2.3"
 
-jest-validate@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
-  integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
+jest-validate@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.0.tgz#8a6821f48432aba9f830c26e28226ad77b9a0e18"
+  integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==
   dependencies:
-    "@jest/types" "^27.5.1"
+    "@jest/types" "^28.1.0"
     camelcase "^6.2.0"
     chalk "^4.0.0"
-    jest-get-type "^27.5.1"
+    jest-get-type "^28.0.2"
     leven "^3.1.0"
-    pretty-format "^27.5.1"
+    pretty-format "^28.1.0"
 
-jest-watcher@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
-  integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
+jest-watcher@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf"
+  integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==
   dependencies:
-    "@jest/test-result" "^27.5.1"
-    "@jest/types" "^27.5.1"
+    "@jest/test-result" "^28.1.0"
+    "@jest/types" "^28.1.0"
     "@types/node" "*"
     ansi-escapes "^4.2.1"
     chalk "^4.0.0"
-    jest-util "^27.5.1"
+    emittery "^0.10.2"
+    jest-util "^28.1.0"
     string-length "^4.0.1"
 
 jest-worker@^26.5.0:
@@ -6711,23 +6875,23 @@ jest-worker@^26.5.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
-jest-worker@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
-  integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+jest-worker@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.0.tgz#ced54757a035e87591e1208253a6e3aac1a855e5"
+  integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==
   dependencies:
     "@types/node" "*"
     merge-stream "^2.0.0"
     supports-color "^8.0.0"
 
-jest@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
-  integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
+jest@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.0.tgz#f420e41c8f2395b9a30445a97189ebb57593d831"
+  integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==
   dependencies:
-    "@jest/core" "^27.5.1"
+    "@jest/core" "^28.1.0"
     import-local "^3.0.2"
-    jest-cli "^27.5.1"
+    jest-cli "^28.1.0"
 
 jpeg-autorotate@^7.1.1:
   version "7.1.1"
@@ -6770,23 +6934,23 @@ js-yaml@^4.1.0:
   dependencies:
     argparse "^2.0.1"
 
-jsdom@^16.6.0:
-  version "16.7.0"
-  resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz"
-  integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+jsdom@^19.0.0:
+  version "19.0.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a"
+  integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==
   dependencies:
     abab "^2.0.5"
-    acorn "^8.2.4"
+    acorn "^8.5.0"
     acorn-globals "^6.0.0"
-    cssom "^0.4.4"
+    cssom "^0.5.0"
     cssstyle "^2.3.0"
-    data-urls "^2.0.0"
-    decimal.js "^10.2.1"
-    domexception "^2.0.1"
+    data-urls "^3.0.1"
+    decimal.js "^10.3.1"
+    domexception "^4.0.0"
     escodegen "^2.0.0"
-    form-data "^3.0.0"
-    html-encoding-sniffer "^2.0.1"
-    http-proxy-agent "^4.0.1"
+    form-data "^4.0.0"
+    html-encoding-sniffer "^3.0.0"
+    http-proxy-agent "^5.0.0"
     https-proxy-agent "^5.0.0"
     is-potential-custom-element-name "^1.0.1"
     nwsapi "^2.2.0"
@@ -6795,13 +6959,13 @@ jsdom@^16.6.0:
     symbol-tree "^3.2.4"
     tough-cookie "^4.0.0"
     w3c-hr-time "^1.0.2"
-    w3c-xmlserializer "^2.0.0"
-    webidl-conversions "^6.1.0"
-    whatwg-encoding "^1.0.5"
-    whatwg-mimetype "^2.3.0"
-    whatwg-url "^8.5.0"
-    ws "^7.4.6"
-    xml-name-validator "^3.0.0"
+    w3c-xmlserializer "^3.0.0"
+    webidl-conversions "^7.0.0"
+    whatwg-encoding "^2.0.0"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^10.0.0"
+    ws "^8.2.3"
+    xml-name-validator "^4.0.0"
 
 jsesc@^2.5.1:
   version "2.5.2"
@@ -7100,7 +7264,7 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
 
-lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.10:
+lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.3.0, lodash@~4.17.10:
   version "4.17.21"
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -7280,12 +7444,36 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
+mime-db@1.44.0:
+  version "1.44.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+  integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
 mime-db@1.51.0, "mime-db@>= 1.43.0 < 2":
   version "1.51.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
   integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
 
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-db@1.52.0:
+  version "1.52.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+  version "2.1.35"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
+mime-types@~2.1.17, mime-types@~2.1.24:
+  version "2.1.27"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+  integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+  dependencies:
+    mime-db "1.44.0"
+
+mime-types@~2.1.34:
   version "2.1.34"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
   integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
@@ -7338,6 +7526,13 @@ minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.2:
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
+  integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
@@ -7687,11 +7882,16 @@ object-fit-images@^3.2.3:
   resolved "https://registry.npmjs.org/object-fit-images/-/object-fit-images-3.2.4.tgz"
   integrity sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg==
 
-object-inspect@^1.11.0, object-inspect@^1.9.0:
+object-inspect@^1.12.0:
   version "1.12.0"
-  resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
   integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
 
+object-inspect@^1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a"
+  integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
+
 object-is@^1.0.1:
   version "1.1.5"
   resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz"
@@ -7700,7 +7900,7 @@ object-is@^1.0.1:
     call-bind "^1.0.2"
     define-properties "^1.1.3"
 
-object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -8675,14 +8875,15 @@ pretty-format@^27.0.2:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
-pretty-format@^27.5.1:
-  version "27.5.1"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
-  integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+pretty-format@^28.1.0:
+  version "28.1.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55"
+  integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==
   dependencies:
+    "@jest/schemas" "^28.0.2"
     ansi-regex "^5.0.1"
     ansi-styles "^5.0.0"
-    react-is "^17.0.1"
+    react-is "^18.0.0"
 
 process-nextick-args@~2.0.0:
   version "2.0.1"
@@ -8962,6 +9163,11 @@ react-is@^17.0.1, react-is@^17.0.2:
   resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
   integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
 
+react-is@^18.0.0:
+  version "18.1.0"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67"
+  integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==
+
 react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
   version "3.0.4"
   resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz"
@@ -9057,10 +9263,10 @@ react-router@^4.3.1:
     prop-types "^15.6.1"
     warning "^4.0.1"
 
-react-select@^5.3.1:
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.3.1.tgz#2cb651b71493e494c56f6b4ce40011669b34bd95"
-  integrity sha512-Y195MmhDoDAj/8gTDyYZU1Raf7tmZd81wxM6RkFko4pqJ4Xv0/ilqUMtSn+GYkwmSlTWeMlzh+e+t7PJgtuXPw==
+react-select@^5.3.2:
+  version "5.3.2"
+  resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.3.2.tgz#ecee0d5c59ed4acb7f567f7de3c75a488d93dacb"
+  integrity sha512-W6Irh7U6Ha7p5uQQ2ZnemoCQ8mcfgOtHfw3wuMzG6FAu0P+CYicgofSLOq97BhjMx8jS+h+wwWdCBeVVZ9VqlQ==
   dependencies:
     "@babel/runtime" "^7.12.0"
     "@emotion/cache" "^11.4.0"
@@ -9230,7 +9436,7 @@ redis-parser@3.0.0:
   dependencies:
     redis-errors "^1.0.0"
 
-redis@^4.0.6:
+"redis@^4.0.6 <4.1.0":
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/redis/-/redis-4.0.6.tgz#a2ded4d9f4f4bad148e54781051618fc684cd858"
   integrity sha512-IaPAxgF5dV0jx+A9l6yd6R9/PAChZIoAskDVRzUODeLDNhsMlq7OLLTmu0AwAr0xjrJ1bibW5xdpRwqIQ8Q0Xg==
@@ -9252,10 +9458,10 @@ redux-thunk@^2.4.1:
   resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz"
   integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==
 
-redux@^4.0.0, redux@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz"
-  integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==
+redux@^4.0.0, redux@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13"
+  integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==
   dependencies:
     "@babel/runtime" "^7.9.2"
 
@@ -9316,6 +9522,15 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1:
     call-bind "^1.0.2"
     define-properties "^1.1.3"
 
+regexp.prototype.flags@^1.4.1:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
+  integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    functions-have-names "^1.2.2"
+
 regexpp@^3.1.0:
   version "3.2.0"
   resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz"
@@ -9599,7 +9814,7 @@ safe-regex@^1.1.0:
   dependencies:
     ret "~0.1.10"
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0:
   version "2.1.2"
   resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -10012,7 +10227,23 @@ source-map-resolve@^0.6.0:
     atob "^2.1.2"
     decode-uri-component "^0.2.0"
 
-source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20:
+source-map-support@0.5.13:
+  version "0.5.13"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+  integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-support@~0.5.12:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-support@~0.5.20:
   version "0.5.21"
   resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
   integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -10040,7 +10271,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
   resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-source-map@^0.7.3, source-map@~0.7.2:
+source-map@~0.7.2:
   version "0.7.3"
   resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz"
   integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
@@ -10247,21 +10478,23 @@ string.prototype.matchall@^4.0.6:
     regexp.prototype.flags "^1.3.1"
     side-channel "^1.0.4"
 
-string.prototype.trimend@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz"
-  integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+string.prototype.trimend@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
+  integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
   dependencies:
     call-bind "^1.0.2"
-    define-properties "^1.1.3"
+    define-properties "^1.1.4"
+    es-abstract "^1.19.5"
 
-string.prototype.trimstart@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz"
-  integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+string.prototype.trimstart@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
+  integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
   dependencies:
     call-bind "^1.0.2"
-    define-properties "^1.1.3"
+    define-properties "^1.1.4"
+    es-abstract "^1.19.5"
 
 string_decoder@^1.0.0, string_decoder@~1.1.1:
   version "1.1.1"
@@ -10712,10 +10945,10 @@ tough-cookie@^4.0.0:
     punycode "^2.1.1"
     universalify "^0.1.2"
 
-tr46@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz"
-  integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+tr46@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+  integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
   dependencies:
     punycode "^2.1.1"
 
@@ -10801,26 +11034,19 @@ type@^2.5.0:
   resolved "https://registry.npmjs.org/type/-/type-2.5.0.tgz"
   integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
 
-typedarray-to-buffer@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
-  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
-  dependencies:
-    is-typedarray "^1.0.0"
-
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
-unbox-primitive@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz"
-  integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+unbox-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+  integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
   dependencies:
-    function-bind "^1.1.1"
-    has-bigints "^1.0.1"
-    has-symbols "^1.0.2"
+    call-bind "^1.0.2"
+    has-bigints "^1.0.2"
+    has-symbols "^1.0.3"
     which-boxed-primitive "^1.0.2"
 
 unicode-canonical-property-names-ecmascript@^2.0.0:
@@ -11036,14 +11262,14 @@ v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
   resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz"
   integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
 
-v8-to-istanbul@^8.1.0:
-  version "8.1.1"
-  resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz"
-  integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==
+v8-to-istanbul@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511"
+  integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==
   dependencies:
+    "@jridgewell/trace-mapping" "^0.3.7"
     "@types/istanbul-lib-coverage" "^2.0.1"
     convert-source-map "^1.6.0"
-    source-map "^0.7.3"
 
 value-equal@^1.0.1:
   version "1.0.1"
@@ -11072,12 +11298,12 @@ w3c-hr-time@^1.0.2:
   dependencies:
     browser-process-hrtime "^1.0.0"
 
-w3c-xmlserializer@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz"
-  integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+w3c-xmlserializer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923"
+  integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==
   dependencies:
-    xml-name-validator "^3.0.0"
+    xml-name-validator "^4.0.0"
 
 walker@^1.0.7:
   version "1.0.8"
@@ -11130,15 +11356,10 @@ webidl-conversions@^3.0.0:
   resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
   integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
 
-webidl-conversions@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz"
-  integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
-
-webidl-conversions@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz"
-  integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+webidl-conversions@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+  integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
 
 webpack-assets-manifest@^4.0.6:
   version "4.0.6"
@@ -11304,17 +11525,33 @@ websocket-extensions@>=0.1.1:
   resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz"
   integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
-whatwg-encoding@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz"
-  integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+whatwg-encoding@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
+  integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
   dependencies:
-    iconv-lite "0.4.24"
+    iconv-lite "0.6.3"
 
-whatwg-mimetype@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz"
-  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+whatwg-mimetype@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
+  integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
+
+whatwg-url@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da"
+  integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==
+  dependencies:
+    tr46 "^3.0.0"
+    webidl-conversions "^7.0.0"
+
+whatwg-url@^11.0.0:
+  version "11.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
+  integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
+  dependencies:
+    tr46 "^3.0.0"
+    webidl-conversions "^7.0.0"
 
 whatwg-url@^5.0.0:
   version "5.0.0"
@@ -11324,15 +11561,6 @@ whatwg-url@^5.0.0:
     tr46 "~0.0.3"
     webidl-conversions "^3.0.0"
 
-whatwg-url@^8.0.0, whatwg-url@^8.5.0:
-  version "8.7.0"
-  resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz"
-  integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
-  dependencies:
-    lodash "^4.7.0"
-    tr46 "^2.1.0"
-    webidl-conversions "^6.1.0"
-
 which-boxed-primitive@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
@@ -11415,15 +11643,13 @@ wrappy@1:
   resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write-file-atomic@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz"
-  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+write-file-atomic@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
+  integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
   dependencies:
     imurmurhash "^0.1.4"
-    is-typedarray "^1.0.0"
-    signal-exit "^3.0.2"
-    typedarray-to-buffer "^3.1.5"
+    signal-exit "^3.0.7"
 
 write@^0.2.1:
   version "0.2.1"
@@ -11439,20 +11665,20 @@ ws@^6.2.1:
   dependencies:
     async-limiter "~1.0.0"
 
-ws@^7.3.1, ws@^7.4.6:
-  version "7.5.6"
-  resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz"
-  integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
+ws@^7.3.1:
+  version "7.4.6"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+  integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
 
-ws@^8.5.0:
-  version "8.5.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
-  integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
+ws@^8.2.3, ws@^8.6.0:
+  version "8.6.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23"
+  integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==
 
-xml-name-validator@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz"
-  integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+xml-name-validator@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
+  integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
 
 xmlchars@^2.2.0:
   version "2.2.0"
@@ -11497,7 +11723,7 @@ yargs-parser@^13.1.2:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^20.2.1, yargs-parser@^20.2.2:
+yargs-parser@^20.2.1:
   version "20.2.9"
   resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz"
   integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
@@ -11523,23 +11749,10 @@ yargs@^13.3.2:
     y18n "^4.0.0"
     yargs-parser "^13.1.2"
 
-yargs@^16.2.0:
-  version "16.2.0"
-  resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
-  integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
-  dependencies:
-    cliui "^7.0.2"
-    escalade "^3.1.1"
-    get-caller-file "^2.0.5"
-    require-directory "^2.1.1"
-    string-width "^4.2.0"
-    y18n "^5.0.5"
-    yargs-parser "^20.2.2"
-
-yargs@^17.4.1:
-  version "17.4.1"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284"
-  integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==
+yargs@^17.3.1, yargs@^17.5.1:
+  version "17.5.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e"
+  integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==
   dependencies:
     cliui "^7.0.2"
     escalade "^3.1.1"