about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS.md81
-rw-r--r--CHANGELOG.md74
-rw-r--r--Gemfile1
-rw-r--r--Gemfile.lock4
-rw-r--r--app/controllers/admin/domain_blocks_controller.rb9
-rw-r--r--app/controllers/admin/instances_controller.rb44
-rw-r--r--app/controllers/api/base_controller.rb2
-rw-r--r--app/controllers/api/v1/instances/peers_controller.rb2
-rw-r--r--app/controllers/application_controller.rb2
-rw-r--r--app/helpers/statuses_helper.rb20
-rw-r--r--app/javascript/core/admin.js28
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js9
-rw-r--r--app/javascript/flavours/glitch/components/autosuggest_input.js8
-rw-r--r--app/javascript/flavours/glitch/components/autosuggest_textarea.js8
-rw-r--r--app/javascript/flavours/glitch/components/status_content.js9
-rw-r--r--app/javascript/flavours/glitch/features/account_gallery/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/reply_indicator.js4
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/column_settings.js25
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.js19
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js5
-rw-r--r--app/javascript/flavours/glitch/features/notifications/index.js2
-rw-r--r--app/javascript/flavours/glitch/reducers/notifications.js3
-rw-r--r--app/javascript/flavours/glitch/reducers/settings.js2
-rw-r--r--app/javascript/flavours/glitch/styles/about.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss8
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss15
-rw-r--r--app/javascript/flavours/glitch/util/rtl.js32
-rw-r--r--app/javascript/mastodon/actions/notifications.js9
-rw-r--r--app/javascript/mastodon/components/autosuggest_input.js8
-rw-r--r--app/javascript/mastodon/components/autosuggest_textarea.js8
-rw-r--r--app/javascript/mastodon/components/status_content.js18
-rw-r--r--app/javascript/mastodon/features/account_gallery/index.js10
-rw-r--r--app/javascript/mastodon/features/account_timeline/index.js4
-rw-r--r--app/javascript/mastodon/features/compose/components/reply_indicator.js6
-rw-r--r--app/javascript/mastodon/features/notifications/components/column_settings.js25
-rw-r--r--app/javascript/mastodon/features/notifications/components/grant_permission_button.js19
-rw-r--r--app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js5
-rw-r--r--app/javascript/mastodon/features/notifications/index.js2
-rw-r--r--app/javascript/mastodon/locales/ar.json10
-rw-r--r--app/javascript/mastodon/locales/ast.json10
-rw-r--r--app/javascript/mastodon/locales/bg.json10
-rw-r--r--app/javascript/mastodon/locales/bn.json10
-rw-r--r--app/javascript/mastodon/locales/br.json10
-rw-r--r--app/javascript/mastodon/locales/ca.json10
-rw-r--r--app/javascript/mastodon/locales/co.json12
-rw-r--r--app/javascript/mastodon/locales/cs.json16
-rw-r--r--app/javascript/mastodon/locales/cy.json10
-rw-r--r--app/javascript/mastodon/locales/da.json10
-rw-r--r--app/javascript/mastodon/locales/de.json12
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json53
-rw-r--r--app/javascript/mastodon/locales/el.json10
-rw-r--r--app/javascript/mastodon/locales/en.json10
-rw-r--r--app/javascript/mastodon/locales/eo.json38
-rw-r--r--app/javascript/mastodon/locales/es-AR.json10
-rw-r--r--app/javascript/mastodon/locales/es.json12
-rw-r--r--app/javascript/mastodon/locales/et.json10
-rw-r--r--app/javascript/mastodon/locales/eu.json10
-rw-r--r--app/javascript/mastodon/locales/fa.json18
-rw-r--r--app/javascript/mastodon/locales/fi.json10
-rw-r--r--app/javascript/mastodon/locales/fr.json16
-rw-r--r--app/javascript/mastodon/locales/ga.json10
-rw-r--r--app/javascript/mastodon/locales/gl.json12
-rw-r--r--app/javascript/mastodon/locales/he.json10
-rw-r--r--app/javascript/mastodon/locales/hi.json10
-rw-r--r--app/javascript/mastodon/locales/hr.json22
-rw-r--r--app/javascript/mastodon/locales/hu.json10
-rw-r--r--app/javascript/mastodon/locales/hy.json16
-rw-r--r--app/javascript/mastodon/locales/id.json10
-rw-r--r--app/javascript/mastodon/locales/io.json10
-rw-r--r--app/javascript/mastodon/locales/is.json10
-rw-r--r--app/javascript/mastodon/locales/it.json10
-rw-r--r--app/javascript/mastodon/locales/ja.json14
-rw-r--r--app/javascript/mastodon/locales/ka.json10
-rw-r--r--app/javascript/mastodon/locales/kab.json12
-rw-r--r--app/javascript/mastodon/locales/kk.json10
-rw-r--r--app/javascript/mastodon/locales/kn.json10
-rw-r--r--app/javascript/mastodon/locales/ko.json20
-rw-r--r--app/javascript/mastodon/locales/ku.json16
-rw-r--r--app/javascript/mastodon/locales/lt.json10
-rw-r--r--app/javascript/mastodon/locales/lv.json10
-rw-r--r--app/javascript/mastodon/locales/mk.json10
-rw-r--r--app/javascript/mastodon/locales/ml.json268
-rw-r--r--app/javascript/mastodon/locales/mr.json10
-rw-r--r--app/javascript/mastodon/locales/ms.json10
-rw-r--r--app/javascript/mastodon/locales/nl.json54
-rw-r--r--app/javascript/mastodon/locales/nn.json10
-rw-r--r--app/javascript/mastodon/locales/no.json10
-rw-r--r--app/javascript/mastodon/locales/oc.json10
-rw-r--r--app/javascript/mastodon/locales/pl.json12
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json10
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json10
-rw-r--r--app/javascript/mastodon/locales/ro.json10
-rw-r--r--app/javascript/mastodon/locales/ru.json10
-rw-r--r--app/javascript/mastodon/locales/sa.json10
-rw-r--r--app/javascript/mastodon/locales/sc.json184
-rw-r--r--app/javascript/mastodon/locales/sk.json10
-rw-r--r--app/javascript/mastodon/locales/sl.json10
-rw-r--r--app/javascript/mastodon/locales/sq.json10
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json10
-rw-r--r--app/javascript/mastodon/locales/sr.json10
-rw-r--r--app/javascript/mastodon/locales/sv.json20
-rw-r--r--app/javascript/mastodon/locales/szl.json10
-rw-r--r--app/javascript/mastodon/locales/ta.json10
-rw-r--r--app/javascript/mastodon/locales/tai.json10
-rw-r--r--app/javascript/mastodon/locales/te.json10
-rw-r--r--app/javascript/mastodon/locales/th.json18
-rw-r--r--app/javascript/mastodon/locales/tr.json10
-rw-r--r--app/javascript/mastodon/locales/tt.json486
-rw-r--r--app/javascript/mastodon/locales/ug.json10
-rw-r--r--app/javascript/mastodon/locales/uk.json10
-rw-r--r--app/javascript/mastodon/locales/ur.json10
-rw-r--r--app/javascript/mastodon/locales/vi.json94
-rw-r--r--app/javascript/mastodon/locales/whitelist_tt.json2
-rw-r--r--app/javascript/mastodon/locales/zgh.json180
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json20
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json232
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json238
-rw-r--r--app/javascript/mastodon/reducers/notifications.js3
-rw-r--r--app/javascript/mastodon/reducers/settings.js2
-rw-r--r--app/javascript/mastodon/rtl.js32
-rw-r--r--app/javascript/styles/mailer.scss12
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss42
-rw-r--r--app/javascript/styles/mastodon/about.scss1
-rw-r--r--app/javascript/styles/mastodon/components.scss10
-rw-r--r--app/javascript/styles/mastodon/forms.scss15
-rw-r--r--app/javascript/styles/mastodon/rtl.scss46
-rw-r--r--app/lib/activitypub/activity/create.rb4
-rw-r--r--app/lib/feed_manager.rb30
-rw-r--r--app/models/account.rb22
-rw-r--r--app/models/account_filter.rb2
-rw-r--r--app/models/concerns/domain_materializable.rb13
-rw-r--r--app/models/domain_allow.rb1
-rw-r--r--app/models/domain_block.rb21
-rw-r--r--app/models/favourite.rb2
-rw-r--r--app/models/follow.rb2
-rw-r--r--app/models/follow_request.rb2
-rw-r--r--app/models/form/admin_settings.rb2
-rw-r--r--app/models/import.rb1
-rw-r--r--app/models/instance.rb63
-rw-r--r--app/models/instance_filter.rb31
-rw-r--r--app/models/list.rb13
-rw-r--r--app/models/poll.rb2
-rw-r--r--app/models/report.rb1
-rw-r--r--app/models/status.rb12
-rw-r--r--app/models/unavailable_domain.rb2
-rw-r--r--app/models/user.rb13
-rw-r--r--app/policies/account_policy.rb4
-rw-r--r--app/policies/domain_block_policy.rb4
-rw-r--r--app/presenters/instance_presenter.rb2
-rw-r--r--app/serializers/manifest_serializer.rb40
-rw-r--r--app/services/activitypub/fetch_remote_account_service.rb2
-rw-r--r--app/services/activitypub/process_account_service.rb28
-rw-r--r--app/services/batched_remove_status_service.rb98
-rw-r--r--app/services/delete_account_service.rb150
-rw-r--r--app/services/import_service.rb7
-rw-r--r--app/services/remove_status_service.rb2
-rw-r--r--app/services/report_service.rb3
-rw-r--r--app/services/resolve_account_service.rb17
-rw-r--r--app/services/resolve_url_service.rb6
-rw-r--r--app/validators/import_validator.rb44
-rw-r--r--app/views/about/_domain_blocks.html.haml2
-rw-r--r--app/views/about/_registration.html.haml2
-rw-r--r--app/views/about/more.html.haml4
-rw-r--r--app/views/admin/accounts/show.html.haml14
-rw-r--r--app/views/admin/domain_blocks/edit.html.haml3
-rw-r--r--app/views/admin/domain_blocks/new.html.haml3
-rw-r--r--app/views/admin/instances/_instance.html.haml25
-rw-r--r--app/views/admin/instances/index.html.haml36
-rw-r--r--app/views/admin/instances/show.html.haml50
-rw-r--r--app/views/admin/reports/index.html.haml4
-rw-r--r--app/views/admin/reports/show.html.haml10
-rw-r--r--app/views/admin/settings/edit.html.haml9
-rw-r--r--app/views/auth/registrations/new.html.haml2
-rw-r--r--app/views/notification_mailer/_status.html.haml4
-rw-r--r--app/views/statuses/_detailed_status.html.haml2
-rw-r--r--app/views/statuses/_simple_status.html.haml2
-rw-r--r--app/workers/account_deletion_worker.rb2
-rw-r--r--app/workers/account_merging_worker.rb18
-rw-r--r--app/workers/scheduler/feed_cleanup_scheduler.rb32
-rw-r--r--app/workers/scheduler/instance_refresh_scheduler.rb11
-rw-r--r--boxfile.yml1
-rw-r--r--chart/Chart.yaml4
-rw-r--r--chart/values.yaml.template2
-rw-r--r--config/boot.rb5
-rw-r--r--config/brakeman.ignore101
-rw-r--r--config/initializers/chewy.rb5
-rw-r--r--config/initializers/paperclip.rb11
-rw-r--r--config/locales/activerecord.kab.yml2
-rw-r--r--config/locales/activerecord.sc.yml11
-rw-r--r--config/locales/activerecord.tt.yml1
-rw-r--r--config/locales/ca.yml16
-rw-r--r--config/locales/co.yml14
-rw-r--r--config/locales/de.yml16
-rw-r--r--config/locales/devise.hu.yml4
-rw-r--r--config/locales/devise.ko.yml4
-rw-r--r--config/locales/devise.nl.yml17
-rw-r--r--config/locales/devise.sc.yml114
-rw-r--r--config/locales/devise.tt.yml1
-rw-r--r--config/locales/devise.vi.yml10
-rw-r--r--config/locales/devise.zh-HK.yml86
-rw-r--r--config/locales/devise.zh-TW.yml33
-rw-r--r--config/locales/doorkeeper.es.yml152
-rw-r--r--config/locales/doorkeeper.sc.yml150
-rw-r--r--config/locales/doorkeeper.tt.yml1
-rw-r--r--config/locales/doorkeeper.vi.yml8
-rw-r--r--config/locales/doorkeeper.zgh.yml35
-rw-r--r--config/locales/doorkeeper.zh-HK.yml102
-rw-r--r--config/locales/el.yml14
-rw-r--r--config/locales/en.yml15
-rw-r--r--config/locales/eo.yml48
-rw-r--r--config/locales/es-AR.yml16
-rw-r--r--config/locales/es.yml16
-rw-r--r--config/locales/fa.yml22
-rw-r--r--config/locales/fr.yml22
-rw-r--r--config/locales/gl.yml22
-rw-r--r--config/locales/hu.yml58
-rw-r--r--config/locales/hy.yml55
-rw-r--r--config/locales/id.yml14
-rw-r--r--config/locales/is.yml18
-rw-r--r--config/locales/it.yml16
-rw-r--r--config/locales/ja.yml13
-rw-r--r--config/locales/kab.yml6
-rw-r--r--config/locales/ko.yml16
-rw-r--r--config/locales/ku.yml16
-rw-r--r--config/locales/ml.yml89
-rw-r--r--config/locales/nl.yml101
-rw-r--r--config/locales/oc.yml16
-rw-r--r--config/locales/pl.yml16
-rw-r--r--config/locales/pt-BR.yml13
-rw-r--r--config/locales/pt-PT.yml16
-rw-r--r--config/locales/ru.yml11
-rw-r--r--config/locales/sc.yml1426
-rw-r--r--config/locales/simple_form.ca.yml1
-rw-r--r--config/locales/simple_form.co.yml1
-rw-r--r--config/locales/simple_form.de.yml1
-rw-r--r--config/locales/simple_form.el.yml12
-rw-r--r--config/locales/simple_form.eo.yml18
-rw-r--r--config/locales/simple_form.es-AR.yml1
-rw-r--r--config/locales/simple_form.es.yml1
-rw-r--r--config/locales/simple_form.fa.yml1
-rw-r--r--config/locales/simple_form.fr.yml19
-rw-r--r--config/locales/simple_form.gl.yml11
-rw-r--r--config/locales/simple_form.hu.yml1
-rw-r--r--config/locales/simple_form.hy.yml3
-rw-r--r--config/locales/simple_form.id.yml1
-rw-r--r--config/locales/simple_form.is.yml1
-rw-r--r--config/locales/simple_form.it.yml1
-rw-r--r--config/locales/simple_form.ko.yml1
-rw-r--r--config/locales/simple_form.ku.yml1
-rw-r--r--config/locales/simple_form.ml.yml4
-rw-r--r--config/locales/simple_form.nl.yml19
-rw-r--r--config/locales/simple_form.oc.yml1
-rw-r--r--config/locales/simple_form.pl.yml1
-rw-r--r--config/locales/simple_form.pt-BR.yml3
-rw-r--r--config/locales/simple_form.pt-PT.yml1
-rw-r--r--config/locales/simple_form.ru.yml1
-rw-r--r--config/locales/simple_form.sc.yml212
-rw-r--r--config/locales/simple_form.sq.yml1
-rw-r--r--config/locales/simple_form.sv.yml1
-rw-r--r--config/locales/simple_form.th.yml10
-rw-r--r--config/locales/simple_form.tr.yml1
-rw-r--r--config/locales/simple_form.tt.yml1
-rw-r--r--config/locales/simple_form.vi.yml3
-rw-r--r--config/locales/simple_form.zh-CN.yml1
-rw-r--r--config/locales/simple_form.zh-HK.yml162
-rw-r--r--config/locales/simple_form.zh-TW.yml11
-rw-r--r--config/locales/sq.yml16
-rw-r--r--config/locales/sv.yml14
-rw-r--r--config/locales/th.yml27
-rw-r--r--config/locales/tr.yml4
-rw-r--r--config/locales/tt.yml12
-rw-r--r--config/locales/vi.yml226
-rw-r--r--config/locales/zgh.yml13
-rw-r--r--config/locales/zh-CN.yml18
-rw-r--r--config/locales/zh-HK.yml941
-rw-r--r--config/locales/zh-TW.yml160
-rw-r--r--config/settings.yml1
-rw-r--r--config/sidekiq.yml17
-rw-r--r--db/migrate/20200309150742_add_forwarded_to_reports.rb5
-rw-r--r--db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb26
-rw-r--r--db/migrate/20201206004238_create_instances.rb9
-rw-r--r--db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb15
-rw-r--r--db/schema.rb29
-rw-r--r--db/views/instances_v01.sql17
-rw-r--r--lib/chewy/strategy/custom_sidekiq.rb25
-rw-r--r--lib/mastodon/accounts_cli.rb21
-rw-r--r--lib/mastodon/domains_cli.rb4
-rw-r--r--lib/mastodon/maintenance_cli.rb2
-rw-r--r--lib/mastodon/version.rb2
-rw-r--r--lib/paperclip/attachment_extensions.rb17
-rw-r--r--lib/tasks/mastodon.rake2
-rw-r--r--public/shortcuts/direct.pngbin0 -> 3045 bytes
-rw-r--r--public/shortcuts/new-status.pngbin0 -> 3031 bytes
-rw-r--r--public/shortcuts/notifications.pngbin0 -> 3067 bytes
-rw-r--r--public/shortcuts/profile.pngbin0 -> 4190 bytes
-rw-r--r--spec/controllers/admin/instances_controller_spec.rb6
-rw-r--r--spec/controllers/auth/registrations_controller_spec.rb5
-rw-r--r--spec/helpers/statuses_helper_spec.rb18
-rw-r--r--spec/models/account_filter_spec.rb2
-rw-r--r--spec/models/account_spec.rb21
-rw-r--r--spec/models/follow_spec.rb2
-rw-r--r--spec/models/import_spec.rb10
-rw-r--r--spec/services/batched_remove_status_service_spec.rb9
-rw-r--r--spec/services/delete_account_service_spec.rb108
-rw-r--r--spec/services/remove_status_service_spec.rb14
-rw-r--r--spec/services/resolve_account_service_spec.rb56
-rw-r--r--yarn.lock26
309 files changed, 7319 insertions, 2258 deletions
diff --git a/AUTHORS.md b/AUTHORS.md
index 12d0736bd..a2913bfe9 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -5,38 +5,39 @@ Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
 and provided thanks to the work of the following contributors:
 
 * [Gargron](https://github.com/Gargron)
-* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
 * [ThibG](https://github.com/ThibG)
-* [ykzts](https://github.com/ykzts)
+* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
 * [dependabot[bot]](https://github.com/apps/dependabot)
+* [ykzts](https://github.com/ykzts)
 * [akihikodaki](https://github.com/akihikodaki)
 * [mjankowski](https://github.com/mjankowski)
 * [unarist](https://github.com/unarist)
 * [yiskah](https://github.com/yiskah)
 * [nolanlawson](https://github.com/nolanlawson)
 * [abcang](https://github.com/abcang)
-* [ysksn](https://github.com/ysksn)
 * [mayaeh](https://github.com/mayaeh)
+* [ysksn](https://github.com/ysksn)
 * [sorin-davidoi](https://github.com/sorin-davidoi)
+* [noellabo](https://github.com/noellabo)
 * [lynlynlynx](https://github.com/lynlynlynx)
 * [m4sk1n](mailto:me@m4sk.in)
 * [Marcin Mikołajczak](mailto:me@m4sk.in)
 * [Kjwon15](https://github.com/Kjwon15)
-* [noellabo](https://github.com/noellabo)
 * [renatolond](https://github.com/renatolond)
 * [alpaca-tc](https://github.com/alpaca-tc)
 * [jeroenpraat](https://github.com/jeroenpraat)
 * [nclm](https://github.com/nclm)
 * [ineffyble](https://github.com/ineffyble)
-* [shleeable](https://github.com/shleeable)
 * [zunda](https://github.com/zunda)
+* [shleeable](https://github.com/shleeable)
 * [Masoud Abkenar](mailto:ampbox@gmail.com)
 * [blackle](https://github.com/blackle)
 * [Quent-in](https://github.com/Quent-in)
 * [JantsoP](https://github.com/JantsoP)
 * [nullkal](https://github.com/nullkal)
 * [yookoala](https://github.com/yookoala)
-* [Sasha-Sorokin](https://github.com/Sasha-Sorokin)
+* [Brawaru](https://github.com/Brawaru)
+* [ariasuni](https://github.com/ariasuni)
 * [Aditoo17](https://github.com/Aditoo17)
 * [Quenty31](https://github.com/Quenty31)
 * [marek-lach](https://github.com/marek-lach)
@@ -45,7 +46,6 @@ and provided thanks to the work of the following contributors:
 * [danhunsaker](https://github.com/danhunsaker)
 * [eramdam](https://github.com/eramdam)
 * [takayamaki](https://github.com/takayamaki)
-* [ariasuni](https://github.com/ariasuni)
 * [masarakki](https://github.com/masarakki)
 * [ticky](https://github.com/ticky)
 * [ThisIsMissEm](https://github.com/ThisIsMissEm)
@@ -53,14 +53,15 @@ and provided thanks to the work of the following contributors:
 * [hcmiya](https://github.com/hcmiya)
 * [stephenburgess8](https://github.com/stephenburgess8)
 * [Wonderfall](mailto:wonderfall@targaryen.house)
+* [trwnh](https://github.com/trwnh)
 * [matteoaquila](https://github.com/matteoaquila)
 * [yukimochi](https://github.com/yukimochi)
 * [palindromordnilap](https://github.com/palindromordnilap)
 * [rkarabut](https://github.com/rkarabut)
-* [trwnh](https://github.com/trwnh)
 * [nightpool](https://github.com/nightpool)
 * [Artoria2e5](https://github.com/Artoria2e5)
 * [marrus-sh](https://github.com/marrus-sh)
+* [dunn](https://github.com/dunn)
 * [krainboltgreene](https://github.com/krainboltgreene)
 * [pfigel](https://github.com/pfigel)
 * [BoFFire](https://github.com/BoFFire)
@@ -84,25 +85,25 @@ and provided thanks to the work of the following contributors:
 * [ashleyhull-versent](https://github.com/ashleyhull-versent)
 * [yhirano55](https://github.com/yhirano55)
 * [rinsuki](https://github.com/rinsuki)
-* [dunn](https://github.com/dunn)
 * [devkral](https://github.com/devkral)
 * [camponez](https://github.com/camponez)
 * [hugogameiro](https://github.com/hugogameiro)
 * [SerCom_KC](mailto:szescxz@gmail.com)
 * [aschmitz](https://github.com/aschmitz)
+* [mfmfuyu](https://github.com/mfmfuyu)
+* [kedamaDQ](https://github.com/kedamaDQ)
 * [fpiesche](https://github.com/fpiesche)
 * [gandaro](https://github.com/gandaro)
 * [johnsudaar](https://github.com/johnsudaar)
 * [trebmuh](https://github.com/trebmuh)
 * [rmhasan](https://github.com/rmhasan)
-* [kedamaDQ](https://github.com/kedamaDQ)
 * [lindwurm](https://github.com/lindwurm)
 * [victorhck](mailto:victorhck@geeko.site)
 * [voidsatisfaction](https://github.com/voidsatisfaction)
+* [mkljczk](https://github.com/mkljczk)
 * [hikari-no-yume](https://github.com/hikari-no-yume)
 * [seefood](https://github.com/seefood)
 * [jackjennings](https://github.com/jackjennings)
-* [mfmfuyu](https://github.com/mfmfuyu)
 * [puckipedia](https://github.com/puckipedia)
 * [spla](mailto:spla@mastodont.cat)
 * [walf443](https://github.com/walf443)
@@ -111,14 +112,15 @@ and provided thanks to the work of the following contributors:
 * [Ashley](mailto:expenses@airmail.cc)
 * [xqus](https://github.com/xqus)
 * [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
-* [Samy KACIMI](mailto:samy.kacimi@gmail.com)
+* [fakenine](https://github.com/fakenine)
 * [tsuwatch](https://github.com/tsuwatch)
 * [victorhck](https://github.com/victorhck)
-* [mkljczk](https://github.com/mkljczk)
 * [manuelviens](https://github.com/manuelviens)
+* [tateisu](https://github.com/tateisu)
 * [fvh-P](https://github.com/fvh-P)
 * [rtucker](https://github.com/rtucker)
 * [Anna e só](mailto:contraexemplos@gmail.com)
+* [dariusk](https://github.com/dariusk)
 * [kazu9su](https://github.com/kazu9su)
 * [Komic](https://github.com/Komic)
 * [lmorchard](https://github.com/lmorchard)
@@ -145,9 +147,9 @@ and provided thanks to the work of the following contributors:
 * [fhemberger](https://github.com/fhemberger)
 * [Gomasy](https://github.com/Gomasy)
 * [greysteil](https://github.com/greysteil)
-* [hencatsmith](https://github.com/hencatsmith)
+* [hendotcat](https://github.com/hendotcat)
 * [d6rkaiz](https://github.com/d6rkaiz)
-* [Reverite](https://github.com/Reverite)
+* [ladyisatis](https://github.com/ladyisatis)
 * [JohnD28](https://github.com/JohnD28)
 * [znz](https://github.com/znz)
 * [saper](https://github.com/saper)
@@ -160,14 +162,14 @@ and provided thanks to the work of the following contributors:
 * [leopku](https://github.com/leopku)
 * [SansPseudoFix](https://github.com/SansPseudoFix)
 * [spla](mailto:sp@mastodont.cat)
-* [tateisu](https://github.com/tateisu)
 * [tomfhowe](https://github.com/tomfhowe)
 * [noraworld](https://github.com/noraworld)
 * [lfuelling](https://github.com/lfuelling)
-* [theboss](https://github.com/theboss)
+* [aji-su](https://github.com/aji-su)
 * [nzws](https://github.com/nzws)
 * [duxovni](https://github.com/duxovni)
 * [smorimoto](https://github.com/smorimoto)
+* [mashirozx](https://github.com/mashirozx)
 * [178inaba](https://github.com/178inaba)
 * [acid-chicken](https://github.com/acid-chicken)
 * [xgess](https://github.com/xgess)
@@ -175,7 +177,6 @@ and provided thanks to the work of the following contributors:
 * [aablinov](https://github.com/aablinov)
 * [stalker314314](https://github.com/stalker314314)
 * [cutls](https://github.com/cutls)
-* [dariusk](https://github.com/dariusk)
 * [huertanix](https://github.com/huertanix)
 * [eleboucher](https://github.com/eleboucher)
 * [halkeye](https://github.com/halkeye)
@@ -183,7 +184,7 @@ and provided thanks to the work of the following contributors:
 * [treby](https://github.com/treby)
 * [jpdevries](https://github.com/jpdevries)
 * [gdpelican](https://github.com/gdpelican)
-* [kmichl](https://github.com/kmichl)
+* [Korbinian](mailto:kontakt@korbinian-michl.de)
 * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 * [panarom](https://github.com/panarom)
 * [Dar13](https://github.com/Dar13)
@@ -225,6 +226,7 @@ and provided thanks to the work of the following contributors:
 * [aaribaud](https://github.com/aaribaud)
 * [pointlessone](https://github.com/pointlessone)
 * [Andrew](mailto:andrewlchronister@gmail.com)
+* [arielrodrigues](https://github.com/arielrodrigues)
 * [aurelien-reeves](https://github.com/aurelien-reeves)
 * [elegaanz](https://github.com/elegaanz)
 * [estuans](https://github.com/estuans)
@@ -238,6 +240,7 @@ and provided thanks to the work of the following contributors:
 * [muffinista](https://github.com/muffinista)
 * [cdutson](https://github.com/cdutson)
 * [farlistener](https://github.com/farlistener)
+* [divergentdave](https://github.com/divergentdave)
 * [DavidLibeau](https://github.com/DavidLibeau)
 * [dmerejkowsky](https://github.com/dmerejkowsky)
 * [ddevault](https://github.com/ddevault)
@@ -276,7 +279,7 @@ and provided thanks to the work of the following contributors:
 * [xPaw](https://github.com/xPaw)
 * [petzah](https://github.com/petzah)
 * [ignisf](https://github.com/ignisf)
-* [raymestalez](https://github.com/raymestalez)
+* [lumenwrites](https://github.com/lumenwrites)
 * [remram44](https://github.com/remram44)
 * [sts10](https://github.com/sts10)
 * [SuperSandro2000](https://github.com/SuperSandro2000)
@@ -286,8 +289,9 @@ and provided thanks to the work of the following contributors:
 * [Sir-Boops](https://github.com/Sir-Boops)
 * [stemid](https://github.com/stemid)
 * [sumdog](https://github.com/sumdog)
+* [OmmyZhang](https://github.com/OmmyZhang)
 * [ThomasLeister](https://github.com/ThomasLeister)
-* [mcat-ee](https://github.com/mcat-ee)
+* [Tom McAtee](mailto:a1608768@student.adelaide.edu.au)
 * [tototoshi](https://github.com/tototoshi)
 * [TrashMacNugget](https://github.com/TrashMacNugget)
 * [VirtuBox](https://github.com/VirtuBox)
@@ -314,11 +318,13 @@ and provided thanks to the work of the following contributors:
 * [matsurai25](https://github.com/matsurai25)
 * [mecab](https://github.com/mecab)
 * [nicobz25](https://github.com/nicobz25)
+* [niwatori24](https://github.com/niwatori24)
 * [oliverkeeble](https://github.com/oliverkeeble)
 * [partev](https://github.com/partev)
 * [pinfort](https://github.com/pinfort)
 * [rbaumert](https://github.com/rbaumert)
 * [rhoio](https://github.com/rhoio)
+* [santiagorodriguez96](https://github.com/santiagorodriguez96)
 * [sclaire-1](https://github.com/sclaire-1)
 * [umonaca](https://github.com/umonaca)
 * [usagi-f](https://github.com/usagi-f)
@@ -327,7 +333,7 @@ and provided thanks to the work of the following contributors:
 * [wxcafe](https://github.com/wxcafe)
 * [Grawl](https://github.com/Grawl)
 * [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
-* [clarfon](https://github.com/clarfon)
+* [clarfonthey](https://github.com/clarfonthey)
 * [cygnan](https://github.com/cygnan)
 * [Awea](https://github.com/Awea)
 * [eai04191](https://github.com/eai04191)
@@ -358,11 +364,11 @@ and provided thanks to the work of the following contributors:
 * [schas002](https://github.com/schas002)
 * [contraexemplo](https://github.com/contraexemplo)
 * [abackstrom](https://github.com/abackstrom)
-* [arielrodrigues](https://github.com/arielrodrigues)
 * [orlea](https://github.com/orlea)
 * [armandfardeau](https://github.com/armandfardeau)
 * [raboof](https://github.com/raboof)
 * [jumbosushi](https://github.com/jumbosushi)
+* [acuteaura](https://github.com/acuteaura)
 * [ayumin](https://github.com/ayumin)
 * [bzg](https://github.com/bzg)
 * [BastienDurel](https://github.com/BastienDurel)
@@ -389,7 +395,7 @@ and provided thanks to the work of the following contributors:
 * [colindean](https://github.com/colindean)
 * [DeeUnderscore](https://github.com/DeeUnderscore)
 * [dachinat](https://github.com/dachinat)
-* [shapeshifter-system](https://github.com/shapeshifter-system)
+* [monsterpit-firedemon](https://github.com/monsterpit-firedemon)
 * [watilde](https://github.com/watilde)
 * [daprice](https://github.com/daprice)
 * [da2x](https://github.com/da2x)
@@ -400,14 +406,13 @@ and provided thanks to the work of the following contributors:
 * [singingwolfboy](https://github.com/singingwolfboy)
 * [caldwell](https://github.com/caldwell)
 * [davidcelis](https://github.com/davidcelis)
-* [divergentdave](https://github.com/divergentdave)
 * [davefp](https://github.com/davefp)
 * [yipdw](https://github.com/yipdw)
 * [debanshuk](https://github.com/debanshuk)
 * [mascali33](https://github.com/mascali33)
 * [DerekNonGeneric](https://github.com/DerekNonGeneric)
 * [dblandin](https://github.com/dblandin)
-* [Drew Gates](mailto:aranaur@users.noreply.github.com)
+* [Aranaur](https://github.com/Aranaur)
 * [dtschust](https://github.com/dtschust)
 * [Dryusdan](https://github.com/Dryusdan)
 * [d3vgru](https://github.com/d3vgru)
@@ -451,22 +456,25 @@ and provided thanks to the work of the following contributors:
 * [J Yeary](mailto:usbsnowcrash@users.noreply.github.com)
 * [jack-michaud](https://github.com/jack-michaud)
 * [Floppy](https://github.com/Floppy)
-* [loomchild](https://github.com/loomchild)
-* [jglauche](https://github.com/jglauche)
-* [jenkr55](https://github.com/jenkr55)
-* [hyenagirl64](https://github.com/hyenagirl64)
-* [press5](https://github.com/press5)
-* [TrollDecker](https://github.com/TrollDecker)
-* [jmontane](https://github.com/jmontane)
+* [Jarek Lipski](mailto:pub@loomchild.net)
+* [Jennifer Glauche](mailto:=^.^=@github19.jglauche.de)
+* [Jennifer Kruse](mailto:jenkr55@gmail.com)
+* [Jeremy Rose](mailto:nornagon@nornagon.net)
+* [Jessica](mailto:46502909+hyenagirl64@users.noreply.github.com)
+* [Jessica K. Litwin](mailto:jessica@litw.in)
+* [Jo Decker](mailto:trolldecker@users.noreply.github.com)
+* [Joan Montané](mailto:jmontane@users.noreply.github.com)
 * [Jonathan Klee](mailto:klee.jonathan@gmail.com)
 * [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net)
 * [Joseph Mingrone](mailto:jehops@users.noreply.github.com)
+* [Josh Leeb-du Toit](mailto:mail@joshleeb.com)
 * [Joshua Wood](mailto:josh@joshuawood.net)
 * [Julien](mailto:tiwy57@users.noreply.github.com)
 * [Julien Deswaef](mailto:juego@requiem4tv.com)
 * [June Sallou](mailto:jnsll@users.noreply.github.com)
 * [Jérémy Benoist](mailto:j0k3r@users.noreply.github.com)
 * [KEINOS](mailto:github@keinos.com)
+* [Kairui Song | 宋恺睿](mailto:ryncsn@gmail.com)
 * [Keiji Matsuzaki](mailto:futoase@gmail.com)
 * [Kevin Liu](mailto:kevin@potatofrom.space)
 * [Kit Redgrave](mailto:qwertyitis@gmail.com)
@@ -482,7 +490,6 @@ and provided thanks to the work of the following contributors:
 * [Lukas Burk](mailto:jemus42@users.noreply.github.com)
 * [Manato Kameya](mailto:grabacr07+github@gmail.com)
 * [Mantas](mailto:mistermantas@users.noreply.github.com)
-* [Marcin Mikołajczak](mailto:me@mkljczk.pl)
 * [Mareena Kunjachan](mailto:mareenakunjachan@gmail.com)
 * [Marek Lach](mailto:marek.brohatwack.lach@gmail.com)
 * [Markus R](mailto:wirehack7@users.noreply.github.com)
@@ -529,10 +536,12 @@ and provided thanks to the work of the following contributors:
 * [Norayr Chilingarian](mailto:norayr@arnet.am)
 * [Noëlle Anthony](mailto:noelle.d.anthony@gmail.com)
 * [N氏](mailto:uenok.htc@gmail.com)
+* [OSAMU SATO](mailto:satosamu@gmail.com)
 * [Olivier Nicole](mailto:olivierthnicole@gmail.com)
 * [Oskari Noppa](mailto:noppa@users.noreply.github.com)
 * [Otakan](mailto:otakan951@gmail.com)
 * [Padraig Fahy](mailto:tech@padraigfahy.com)
+* [Patrice Ferlet](mailto:metal3d@gmail.com)
 * [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
 * [Paul](mailto:naydex.mc+github@gmail.com)
 * [Pete Keen](mailto:pete@petekeen.net)
@@ -574,7 +583,6 @@ and provided thanks to the work of the following contributors:
 * [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
 * [Tao Bror Bojlén](mailto:brortao@users.noreply.github.com)
 * [Taras Gogol](mailto:taras2358@gmail.com)
-* [Tdxdxoz](mailto:tdxdxoz@gmail.com)
 * [TheInventrix](mailto:theinventrix@users.noreply.github.com)
 * [TheMainOne](mailto:50847364+theevilskeleton@users.noreply.github.com)
 * [Thomas Alberola](mailto:thomas@needacoffee.fr)
@@ -594,6 +602,7 @@ and provided thanks to the work of the following contributors:
 * [Wesley Ellis](mailto:tahnok@gmail.com)
 * [Wiktor](mailto:wiktor@metacode.biz)
 * [Wonderfall](mailto:wonderfall@schrodinger.io)
+* [Y.Yamashiro](mailto:shukukei@mojizuri.jp)
 * [YDrogen](mailto:ydrogen45@gmail.com)
 * [YMHuang](mailto:ymhuang@fmbase.tw)
 * [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com)
@@ -638,6 +647,7 @@ and provided thanks to the work of the following contributors:
 * [jumoru](mailto:jumoru@mailbox.org)
 * [kaiyou](mailto:pierre@jaury.eu)
 * [karlyeurl](mailto:karl.yeurl@gmail.com)
+* [kawaguchi](mailto:jiikko@users.noreply.github.com)
 * [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
 * [kuro5hin](mailto:rusty@kuro5hin.org)
 * [leo60228](mailto:leo@60228.dev)
@@ -655,6 +665,7 @@ and provided thanks to the work of the following contributors:
 * [notozeki](mailto:notozeki@users.noreply.github.com)
 * [ntl-purism](mailto:57806346+ntl-purism@users.noreply.github.com)
 * [nzws](mailto:git-yuzu@svk.jp)
+* [proxy](mailto:51172302+3n-k1@users.noreply.github.com)
 * [rch850](mailto:rich850@gmail.com)
 * [roikale](mailto:roikale@users.noreply.github.com)
 * [rysiekpl](mailto:rysiek@hackerspace.pl)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe2c1b8b3..12c996641 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,7 +17,7 @@ All notable changes to this project will be documented in this file.
 - Add border around 🐞 emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14712))
 - Add home link to the getting started column when home isn't mounted ([ThibG](https://github.com/tootsuite/mastodon/pull/14707))
 - Add option to disable swiping motions across the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/13885))
-- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915))
+- **Add pop-out player for audio/video in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/14870), [Gargron](https://github.com/tootsuite/mastodon/pull/15157), [Gargron](https://github.com/tootsuite/mastodon/pull/14915), [noellabo](https://github.com/tootsuite/mastodon/pull/15309))
   - Continue watching/listening when you scroll away
   - Action bar to interact with/open toot from the pop-out player
 - Add unread notification markers in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14818), [ThibG](https://github.com/tootsuite/mastodon/pull/14960), [ThibG](https://github.com/tootsuite/mastodon/pull/14954), [noellabo](https://github.com/tootsuite/mastodon/pull/14897), [noellabo](https://github.com/tootsuite/mastodon/pull/14907))
@@ -27,14 +27,16 @@ All notable changes to this project will be documented in this file.
   - If you have a proxy cache in front of object storage, deleted files will persist until the cache expires
   - If enabled, cache buster will make a special request to the proxy to signal a cache reset
 - Add duration option to the mute function ([aquarla](https://github.com/tootsuite/mastodon/pull/13831))
-- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205))
+- Add replies policy option to the list function ([ThibG](https://github.com/tootsuite/mastodon/pull/9205), [trwnh](https://github.com/tootsuite/mastodon/pull/15304))
 - Add `og:published_time` OpenGraph tags on toots ([nornagon](https://github.com/tootsuite/mastodon/pull/14865))
 - **Add option to be notified when a followed user posts** ([Gargron](https://github.com/tootsuite/mastodon/pull/13546), [ThibG](https://github.com/tootsuite/mastodon/pull/14896), [Gargron](https://github.com/tootsuite/mastodon/pull/14822))
   - If you don't want to miss a toot, click the bell button!
 - Add client-side validation in password change forms ([ThibG](https://github.com/tootsuite/mastodon/pull/14564))
 - Add client-side validation in the registration form ([ThibG](https://github.com/tootsuite/mastodon/pull/14560), [ThibG](https://github.com/tootsuite/mastodon/pull/14599))
 - Add support for Gemini URLs ([joshleeb](https://github.com/tootsuite/mastodon/pull/15013))
+- Add app shortcuts to web app manifest ([mkljczk](https://github.com/tootsuite/mastodon/pull/15234))
 - Add WebAuthn as an alternative 2FA method ([santiagorodriguez96](https://github.com/tootsuite/mastodon/pull/14466), [jiikko](https://github.com/tootsuite/mastodon/pull/14806))
+- Add honeypot fields and minimum fill-out time for sign-up form ([ThibG](https://github.com/tootsuite/mastodon/pull/15276))
 - Add icon for mutual relationships in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15149))
 - Add follow selected followers button in relationship manager ([noellabo](https://github.com/tootsuite/mastodon/pull/15148))
 - **Add subresource integrity for JS and CSS assets** ([Gargron](https://github.com/tootsuite/mastodon/pull/15096))
@@ -42,7 +44,7 @@ All notable changes to this project will be documented in this file.
   - Subresource integrity compares server-generated asset digests with what's actually served from the CDN and prevents such attacks
 - Add `ku`, `sa`, `sc`, `zgh` to available locales ([ykzts](https://github.com/tootsuite/mastodon/pull/15138))
 - Add ability to force an account to mark media as sensitive ([noellabo](https://github.com/tootsuite/mastodon/pull/14361))
-- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963))
+- **Add ability to block access or limit sign-ups from chosen IPs** ([Gargron](https://github.com/tootsuite/mastodon/pull/14963), [ThibG](https://github.com/tootsuite/mastodon/pull/15263))
   - Add rules for IPs or CIDR ranges that automatically expire after a configurable amount of time
   - Choose the severity of the rule, either blocking all access or merely limiting sign-ups
 - **Add support for reversible suspensions through ActivityPub** ([Gargron](https://github.com/tootsuite/mastodon/pull/14989))
@@ -50,17 +52,21 @@ All notable changes to this project will be documented in this file.
   - During suspension, the account can only delete its own content
   - A reversal of the suspension can be signalled the same way
   - A local suspension always overrides a remote one
+- Add indication to admin UI of whether a report has been forwarded ([ThibG](https://github.com/tootsuite/mastodon/pull/13237))
+- Add display of reasons for joining of an account in admin UI ([mashirozx](https://github.com/tootsuite/mastodon/pull/15265))
+- Add option to obfuscate domain name in public list of domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/15355))
+- Add option to make reasons for joining required on sign-up ([ThibG](https://github.com/tootsuite/mastodon/pull/15326), [ThibG](https://github.com/tootsuite/mastodon/pull/15358), [ThibG](https://github.com/tootsuite/mastodon/pull/15385), [ThibG](https://github.com/tootsuite/mastodon/pull/15405))
 - Add ActivityPub follower synchronization mechanism ([ThibG](https://github.com/tootsuite/mastodon/pull/14510), [ThibG](https://github.com/tootsuite/mastodon/pull/15026))
 - Add outbox attribute to instance actor ([ThibG](https://github.com/tootsuite/mastodon/pull/14721))
-- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595))
+- Add featured hashtags as an ActivityPub collection ([Gargron](https://github.com/tootsuite/mastodon/pull/11595), [noellabo](https://github.com/tootsuite/mastodon/pull/15277))
 - Add support for dereferencing objects through bearcaps ([Gargron](https://github.com/tootsuite/mastodon/pull/14683), [noellabo](https://github.com/tootsuite/mastodon/pull/14981))
 - Add `S3_READ_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/14952))
 - Add `ALLOWED_PRIVATE_ADDRESSES` environment variable ([ThibG](https://github.com/tootsuite/mastodon/pull/14722))
 - Add `--fix-permissions` option to `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/14383), [uist1idrju3i](https://github.com/tootsuite/mastodon/pull/14715))
-- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201))
+- Add `tootctl accounts merge` ([Gargron](https://github.com/tootsuite/mastodon/pull/15201), [ThibG](https://github.com/tootsuite/mastodon/pull/15264), [ThibG](https://github.com/tootsuite/mastodon/pull/15256))
   - Has someone changed their domain or subdomain thereby creating two accounts where there should be one?
   - This command will fix it on your end
-- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223))
+- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223), [ThibG](https://github.com/tootsuite/mastodon/pull/15373))
   - Index corruption in the database?
   - This command is for you
 - **Add support for managing multiple stream subscriptions in a single connection** ([Gargron](https://github.com/tootsuite/mastodon/pull/14524), [Gargron](https://github.com/tootsuite/mastodon/pull/14566), [mfmfuyu](https://github.com/tootsuite/mastodon/pull/14859), [zunda](https://github.com/tootsuite/mastodon/pull/14608))
@@ -68,22 +74,24 @@ All notable changes to this project will be documented in this file.
   - More connections means more resource consumption on both ends, not to mention the (ever so slight) delay when establishing a new connection
   - Now, with just a single WebSocket connection you can subscribe and unsubscribe to and from multiple streams
 - Add support for limiting results by both `min_id` and `max_id` at the same time in REST API ([tateisu](https://github.com/tootsuite/mastodon/pull/14776))
-- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817))
+- Add `GET /api/v1/accounts/:id/featured_tags` to REST API ([noellabo](https://github.com/tootsuite/mastodon/pull/11817), [noellabo](https://github.com/tootsuite/mastodon/pull/15270))
+- Add stoplight for object storage failures, return HTTP 503 in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/13043))
 - Add optional `tootctl remove media` cronjob in Helm chart ([dunn](https://github.com/tootsuite/mastodon/pull/14396))
+- Add clean error message when `RAILS_ENV` is unset ([ThibG](https://github.com/tootsuite/mastodon/pull/15381))
 
 ### Changed
 
-- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221))
+- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305))
   - Background of the overlay matches the color of the image
   - Action bar to interact with or open the toot from the modal
 - Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091))
-- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855))
+- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380))
   - Suspensions no longer equal deletions
   - A suspended account can be unsuspended with minimal consequences for 30 days
   - Immediate deletion of data is still available as an explicit option
   - Suspended accounts can request an archive of their data through the UI
 - Change REST API to return empty data for suspended accounts (14765)
-- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766))
+- Change web UI to show empty profile for suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/14766), [Gargron](https://github.com/tootsuite/mastodon/pull/15345))
 - Change featured hashtag suggestions to be recently used instead of most used ([abcang](https://github.com/tootsuite/mastodon/pull/14760))
 - Change direct toots to appear in the home feed again ([Gargron](https://github.com/tootsuite/mastodon/pull/14711), [ThibG](https://github.com/tootsuite/mastodon/pull/15182), [noellabo](https://github.com/tootsuite/mastodon/pull/14727))
   - Return to treating all toots the same instead of trying to retrofit direct visibility into an instant messaging model
@@ -96,7 +104,14 @@ All notable changes to this project will be documented in this file.
 - Change string "Boost to original audience" to "Boost with original visibility" in web UI ([3n-k1](https://github.com/tootsuite/mastodon/pull/14598))
 - Change string "Show more" to "Show newer" and "Show older" on public pages ([ariasuni](https://github.com/tootsuite/mastodon/pull/15052))
 - Change order of announcements to be reverse chronological in web UI ([dariusk](https://github.com/tootsuite/mastodon/pull/15065), [dariusk](https://github.com/tootsuite/mastodon/pull/15070))
+- Change RTL detection to rely on unicode-bidi paragraph by paragraph in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14573))
 - Change visibility icon next to timestamp to be clickable in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15053), [mayaeh](https://github.com/tootsuite/mastodon/pull/15055))
+- Change public thread view to hide "Show thread" link ([ThibG](https://github.com/tootsuite/mastodon/pull/15266))
+- Change number format on about page from full to shortened ([Gargron](https://github.com/tootsuite/mastodon/pull/15327))
+- Change how scheduled tasks run in multi-process environments ([noellabo](https://github.com/tootsuite/mastodon/pull/15314))
+  - New dedicated queue `scheduler`
+  - Runs by default when Sidekiq is executed with no options
+  - Has to be added manually in a multi-process environment
 
 ### Removed
 
@@ -107,6 +122,8 @@ All notable changes to this project will be documented in this file.
 
 ### Fixed
 
+- Fix layout on about page when contact account has a long username ([ThibG](https://github.com/tootsuite/mastodon/pull/15357))
+- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207))
 - **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200))
   - Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot
   - Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned
@@ -123,7 +140,7 @@ All notable changes to this project will be documented in this file.
 - Fix poll ending notifications being created for each vote ([ThibG](https://github.com/tootsuite/mastodon/pull/15071))
 - Fix multiple boosts of a same toot erroneously appearing in TL ([ThibG](https://github.com/tootsuite/mastodon/pull/14759))
 - Fix asset builds not picking up `CDN_HOST` change ([ThibG](https://github.com/tootsuite/mastodon/pull/14381))
-- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543))
+- Fix desktop notifications permission prompt in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/14985), [Gargron](https://github.com/tootsuite/mastodon/pull/15141), [ThibG](https://github.com/tootsuite/mastodon/pull/13543), [ThibG](https://github.com/tootsuite/mastodon/pull/15176))
   - Some time ago, browsers added a requirement that desktop notification prompts could only be displayed in response to a user-generated event (such as a click)
   - This means that for some time, users who haven't already given the permission before were not getting a prompt and as such were not receiving desktop notifications
 - Fix "Mark media as sensitive" string not supporting pluralizations in other languages in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/15051))
@@ -139,11 +156,19 @@ All notable changes to this project will be documented in this file.
 - Fix disabled boost icon being replaced by private boost icon on hover in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14456))
 - Fix hashtag detection in compose form being different to server-side in web UI ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/14484), [ThibG](https://github.com/tootsuite/mastodon/pull/14513))
 - Fix home last read marker mishandling gaps in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14809))
+- Fix unnecessary re-rendering of various components when typing in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15286))
+- Fix notifications being unnecessarily re-rendered in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15312))
+- Fix column swiping animation logic in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15301))
 - Fix inefficiency when fetching hashtag timeline ([noellabo](https://github.com/tootsuite/mastodon/pull/14861), [akihikodaki](https://github.com/tootsuite/mastodon/pull/14662))
 - Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674))
 - Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673))
 - Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675))
+- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402))
 - Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534))
+- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287))
+- Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282))
+- Fix server actor appearing in list of accounts in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/14567))
+- Fix "bootstrap timeline accounts" toggle in site settings in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/15325))
 - Fix PostgreSQL secret name for cronjob in Helm chart ([metal3d](https://github.com/tootsuite/mastodon/pull/15072))
 - Fix Procfile not being compatible with herokuish ([acuteaura](https://github.com/tootsuite/mastodon/pull/12685))
 - Fix installation of tini being split into multiple steps in Dockerfile ([ryncsn](https://github.com/tootsuite/mastodon/pull/14686))
@@ -152,6 +177,33 @@ All notable changes to this project will be documented in this file.
 
 - Fix streaming API allowing connections to persist after access token invalidation ([Gargron](https://github.com/tootsuite/mastodon/pull/15111))
 - Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802))
+- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364))
+
+## [3.2.2] - 2020-12-19
+### Added
+
+- Add `tootctl maintenance fix-duplicates` ([ThibG](https://github.com/tootsuite/mastodon/pull/14860), [Gargron](https://github.com/tootsuite/mastodon/pull/15223))
+  - Index corruption in the database?
+  - This command is for you
+
+### Removed
+
+- Remove dependency on unused and unmaintained http_parser.rb gem ([ThibG](https://github.com/tootsuite/mastodon/pull/14574))
+
+### Fixed
+
+- Fix Move handler not being triggered when failing to fetch target account ([ThibG](https://github.com/tootsuite/mastodon/pull/15107))
+- Fix downloading remote media files when server returns empty filename ([ThibG](https://github.com/tootsuite/mastodon/pull/14867))
+- Fix possible casing inconsistencies in hashtag search ([ThibG](https://github.com/tootsuite/mastodon/pull/14906))
+- Fix updating account counters when association is not yet created ([Gargron](https://github.com/tootsuite/mastodon/pull/15108))
+- Fix account processing failing because of large collections ([ThibG](https://github.com/tootsuite/mastodon/pull/15027))
+- Fix resolving an account through its non-canonical form (i.e. alternate domain) ([ThibG](https://github.com/tootsuite/mastodon/pull/15187))
+- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287))
+
+### Security
+
+- Fix 2FA/sign-in token sessions being valid after password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14802))
+- Fix resolving accounts sometimes creating duplicate records for a given ActivityPub identifier ([ThibG](https://github.com/tootsuite/mastodon/pull/15364))
 
 ## [3.2.1] - 2020-10-19
 ### Added
diff --git a/Gemfile b/Gemfile
index 32ebf0dd1..f9eddd932 100644
--- a/Gemfile
+++ b/Gemfile
@@ -82,6 +82,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 gem 'rqrcode', '~> 1.1'
 gem 'ruby-progressbar', '~> 1.10'
 gem 'sanitize', '~> 5.2'
+gem 'scenic', '~> 1.5'
 gem 'sidekiq', '~> 6.1'
 gem 'sidekiq-scheduler', '~> 3.0'
 gem 'sidekiq-unique-jobs', '~> 6.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index f5d8d20c1..a356029a6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -562,6 +562,9 @@ GEM
       crass (~> 1.0.2)
       nokogiri (>= 1.8.0)
       nokogumbo (~> 2.0)
+    scenic (1.5.4)
+      activerecord (>= 4.0.0)
+      railties (>= 4.0.0)
     securecompare (1.0.0)
     semantic_range (2.3.0)
     sidekiq (6.1.2)
@@ -784,6 +787,7 @@ DEPENDENCIES
   rubocop-rails (~> 2.8)
   ruby-progressbar (~> 1.10)
   sanitize (~> 5.2)
+  scenic (~> 1.5)
   sidekiq (~> 6.1)
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 3.0)
diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb
index 74a36b79c..ba927b04a 100644
--- a/app/controllers/admin/domain_blocks_controller.rb
+++ b/app/controllers/admin/domain_blocks_controller.rb
@@ -29,6 +29,7 @@ module Admin
           @domain_block = existing_domain_block
           @domain_block.update(resource_params)
         end
+
         if @domain_block.save
           DomainBlockWorker.perform_async(@domain_block.id)
           log_action :create, @domain_block
@@ -40,7 +41,7 @@ module Admin
     end
 
     def update
-      authorize :domain_block, :create?
+      authorize :domain_block, :update?
 
       @domain_block.update(update_params)
 
@@ -48,7 +49,7 @@ module Admin
 
       if @domain_block.save
         DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
-        log_action :create, @domain_block
+        log_action :update, @domain_block
         redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
       else
         render :edit
@@ -73,11 +74,11 @@ module Admin
     end
 
     def update_params
-      params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment)
+      params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
     end
 
     def resource_params
-      params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment)
+      params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
     end
   end
 end
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index 1790becbf..b5918d231 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -2,65 +2,31 @@
 
 module Admin
   class InstancesController < BaseController
-    before_action :set_domain_block, only: :show
-    before_action :set_domain_allow, only: :show
+    before_action :set_instances, only: :index
     before_action :set_instance, only: :show
 
     def index
       authorize :instance, :index?
-
-      @instances = ordered_instances
     end
 
     def show
       authorize :instance, :show?
-
-      @following_count = Follow.where(account: Account.where(domain: params[:id])).count
-      @followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
-      @reports_count   = Report.where(target_account: Account.where(domain: params[:id])).count
-      @blocks_count    = Block.where(target_account: Account.where(domain: params[:id])).count
-      @available       = DeliveryFailureTracker.available?(params[:id])
-      @media_storage   = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
-      @private_comment = @domain_block&.private_comment
-      @public_comment  = @domain_block&.public_comment
     end
 
     private
 
-    def set_domain_block
-      @domain_block = DomainBlock.rule_for(params[:id])
-    end
-
-    def set_domain_allow
-      @domain_allow = DomainAllow.rule_for(params[:id])
-    end
-
     def set_instance
-      resource   = Account.by_domain_accounts.find_by(domain: params[:id])
-      resource ||= @domain_block
-      resource ||= @domain_allow
+      @instance = Instance.find(params[:id])
+    end
 
-      if resource
-        @instance = Instance.new(resource)
-      else
-        not_found
-      end
+    def set_instances
+      @instances = filtered_instances.page(params[:page])
     end
 
     def filtered_instances
       InstanceFilter.new(whitelist_mode? ? { allowed: true } : filter_params).results
     end
 
-    def paginated_instances
-      filtered_instances.page(params[:page])
-    end
-
-    helper_method :paginated_instances
-
-    def ordered_instances
-      paginated_instances.map { |resource| Instance.new(resource) }
-    end
-
     def filter_params
       params.slice(*InstanceFilter::KEYS).permit(*InstanceFilter::KEYS)
     end
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index fe199e689..85f4cc768 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -40,7 +40,7 @@ class Api::BaseController < ApplicationController
     render json: { error: 'This action is not allowed' }, status: 403
   end
 
-  rescue_from Mastodon::RaceConditionError do
+  rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight do
     render json: { error: 'There was a temporary problem serving your request, please try again' }, status: 503
   end
 
diff --git a/app/controllers/api/v1/instances/peers_controller.rb b/app/controllers/api/v1/instances/peers_controller.rb
index 9fa440935..2877fec52 100644
--- a/app/controllers/api/v1/instances/peers_controller.rb
+++ b/app/controllers/api/v1/instances/peers_controller.rb
@@ -8,7 +8,7 @@ class Api::V1::Instances::PeersController < Api::BaseController
 
   def index
     expires_in 1.day, public: true
-    render_with_cache(expires_in: 1.day) { Account.remote.domains }
+    render_with_cache(expires_in: 1.day) { Instance.where.not(domain: DomainBlock.select(:domain)).pluck(:domain) }
   end
 
   private
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index e996c2217..41fe9d88a 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -29,7 +29,7 @@ class ApplicationController < ActionController::Base
   rescue_from ActiveRecord::RecordNotFound, with: :not_found
   rescue_from Mastodon::NotPermittedError, with: :forbidden
   rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error
-  rescue_from Mastodon::RaceConditionError, with: :service_unavailable
+  rescue_from Mastodon::RaceConditionError, Seahorse::Client::NetworkingError, Stoplight::Error::RedLight, with: :service_unavailable
   rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests
 
   before_action :store_current_location, except: :raise_not_found, unless: :devise_controller?
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
index daed9048f..1f654f34f 100644
--- a/app/helpers/statuses_helper.rb
+++ b/app/helpers/statuses_helper.rb
@@ -92,22 +92,6 @@ module StatusesHelper
     end
   end
 
-  def rtl_status?(status)
-    status.local? ? rtl?(status.text) : rtl?(strip_tags(status.text))
-  end
-
-  def rtl?(text)
-    text = simplified_text(text)
-    rtl_words = text.scan(/[\p{Hebrew}\p{Arabic}\p{Syriac}\p{Thaana}\p{Nko}]+/m)
-
-    if rtl_words.present?
-      total_size = text.size.to_f
-      rtl_size(rtl_words) / total_size > 0.3
-    else
-      false
-    end
-  end
-
   def fa_visibility_icon(status)
     case status.visibility
     when 'public'
@@ -143,10 +127,6 @@ module StatusesHelper
     end
   end
 
-  def rtl_size(words)
-    words.reduce(0) { |acc, elem| acc + elem.size }.to_f
-  end
-
   def embedded_view?
     params[:controller] == EMBEDDED_CONTROLLER && params[:action] == EMBEDDED_ACTION
   end
diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js
index bbc7cfac7..d2db89ca7 100644
--- a/app/javascript/core/admin.js
+++ b/app/javascript/core/admin.js
@@ -59,18 +59,46 @@ const onEnableBootstrapTimelineAccountsChange = (target) => {
     bootstrapTimelineAccountsField.disabled = !target.checked;
     if (target.checked) {
       bootstrapTimelineAccountsField.parentElement.classList.remove('disabled');
+      bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove('disabled');
     } else {
       bootstrapTimelineAccountsField.parentElement.classList.add('disabled');
+      bootstrapTimelineAccountsField.parentElement.parentElement.classList.add('disabled');
     }
   }
 };
 
 delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
 
+const onChangeRegistrationMode = (target) => {
+  const enabled = target.value === 'approved';
+
+  [].forEach.call(document.querySelectorAll('#form_admin_settings_require_invite_text'), (input) => {
+    input.disabled = !enabled;
+    if (enabled) {
+      let element = input;
+      do {
+        element.classList.remove('disabled');
+        element = element.parentElement;
+      } while (element && !element.classList.contains('fields-group'));
+    } else {
+      let element = input;
+      do {
+        element.classList.add('disabled');
+        element = element.parentElement;
+      } while (element && !element.classList.contains('fields-group'));
+    }
+  });
+};
+
+delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target));
+
 ready(() => {
   const domainBlockSeverityInput = document.getElementById('domain_block_severity');
   if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput);
 
   const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts');
   if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts);
+
+  const registrationMode = document.getElementById('form_admin_settings_registrations_mode');
+  if (registrationMode) onChangeRegistrationMode(registrationMode);
 });
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index 9f12df773..bd3a34e5d 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -50,9 +50,8 @@ export const NOTIFICATIONS_SET_VISIBILITY = 'NOTIFICATIONS_SET_VISIBILITY';
 
 export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
 
-export const NOTIFICATIONS_SET_BROWSER_SUPPORT        = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
-export const NOTIFICATIONS_SET_BROWSER_PERMISSION     = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
-export const NOTIFICATIONS_DISMISS_BROWSER_PERMISSION = 'NOTIFICATIONS_DISMISS_BROWSER_PERMISSION';
+export const NOTIFICATIONS_SET_BROWSER_SUPPORT    = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
+export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
 
 defineMessages({
   mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
@@ -372,7 +371,3 @@ export function setBrowserPermission (value) {
     value,
   };
 }
-
-export const dismissBrowserPermission = () => ({
-  type: NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
-});
diff --git a/app/javascript/flavours/glitch/components/autosuggest_input.js b/app/javascript/flavours/glitch/components/autosuggest_input.js
index 1ef7ee216..cc0ff7dea 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_input.js
+++ b/app/javascript/flavours/glitch/components/autosuggest_input.js
@@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 import AutosuggestHashtag from './autosuggest_hashtag';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from 'flavours/glitch/util/rtl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import classNames from 'classnames';
 import { List as ImmutableList } from 'immutable';
@@ -189,11 +188,6 @@ export default class AutosuggestInput extends ImmutablePureComponent {
   render () {
     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;
     const { suggestionsHidden } = this.state;
-    const style = { direction: 'ltr' };
-
-    if (isRtl(value)) {
-      style.direction = 'rtl';
-    }
 
     return (
       <div className='autosuggest-input'>
@@ -212,7 +206,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
             onKeyUp={onKeyUp}
             onFocus={this.onFocus}
             onBlur={this.onBlur}
-            style={style}
+            dir='auto'
             aria-autocomplete='list'
             id={id}
             className={className}
diff --git a/app/javascript/flavours/glitch/components/autosuggest_textarea.js b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
index 1ce2f42b4..967c593af 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_textarea.js
+++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
@@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 import AutosuggestHashtag from './autosuggest_hashtag';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from 'flavours/glitch/util/rtl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Textarea from 'react-textarea-autosize';
 import classNames from 'classnames';
@@ -195,11 +194,6 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
   render () {
     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;
     const { suggestionsHidden } = this.state;
-    const style = { direction: 'ltr' };
-
-    if (isRtl(value)) {
-      style.direction = 'rtl';
-    }
 
     return [
       <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>
@@ -220,7 +214,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
               onFocus={this.onFocus}
               onBlur={this.onBlur}
               onPaste={this.onPaste}
-              style={style}
+              dir='auto'
               aria-autocomplete='list'
             />
           </label>
diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js
index a39f747b8..76e2d79a5 100644
--- a/app/javascript/flavours/glitch/components/status_content.js
+++ b/app/javascript/flavours/glitch/components/status_content.js
@@ -1,7 +1,6 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from 'flavours/glitch/util/rtl';
 import { FormattedMessage } from 'react-intl';
 import Permalink from './permalink';
 import classnames from 'classnames';
@@ -277,16 +276,11 @@ export default class StatusContent extends React.PureComponent {
 
     const content = { __html: status.get('contentHtml') };
     const spoilerContent = { __html: status.get('spoilerHtml') };
-    const directionStyle = { direction: 'ltr' };
     const classNames = classnames('status__content', {
       'status__content--with-action': parseClick && !disabled,
       'status__content--with-spoiler': status.get('spoiler_text').length > 0,
     });
 
-    if (isRtl(status.get('search_index'))) {
-      directionStyle.direction = 'rtl';
-    }
-
     if (status.get('spoiler_text').length > 0) {
       let mentionsPlaceholder = '';
 
@@ -346,7 +340,6 @@ export default class StatusContent extends React.PureComponent {
             <div
               ref={this.setContentsRef}
               key={`contents-${tagLinks}`}
-              style={directionStyle}
               tabIndex={!hidden ? 0 : null}
               dangerouslySetInnerHTML={content}
               className='status__content__text'
@@ -360,7 +353,6 @@ export default class StatusContent extends React.PureComponent {
       return (
         <div
           className={classNames}
-          style={directionStyle}
           onMouseDown={this.handleMouseDown}
           onMouseUp={this.handleMouseUp}
           tabIndex='0'
@@ -380,7 +372,6 @@ export default class StatusContent extends React.PureComponent {
       return (
         <div
           className='status__content'
-          style={directionStyle}
           tabIndex='0'
           ref={this.setRef}
         >
diff --git a/app/javascript/flavours/glitch/features/account_gallery/index.js b/app/javascript/flavours/glitch/features/account_gallery/index.js
index fda8082cc..81203e3f8 100644
--- a/app/javascript/flavours/glitch/features/account_gallery/index.js
+++ b/app/javascript/flavours/glitch/features/account_gallery/index.js
@@ -168,7 +168,7 @@ class AccountGallery extends ImmutablePureComponent {
 
             {suspended ? (
               <div className='empty-column-indicator'>
-                <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />
+                <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />
               </div>
             ) : (
               <div role='feed' className='account-gallery__container' ref={this.handleRef}>
diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index c56cc9b8e..0d24980a9 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -117,7 +117,7 @@ class AccountTimeline extends ImmutablePureComponent {
     let emptyMessage;
 
     if (suspended) {
-      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
     } else if (remote && statusIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
     } else {
diff --git a/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js
index 9d5b65a40..0fd07c282 100644
--- a/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js
+++ b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js
@@ -10,9 +10,6 @@ import AccountContainer from 'flavours/glitch/containers/account_container';
 import IconButton from 'flavours/glitch/components/icon_button';
 import AttachmentList from 'flavours/glitch/components/attachment_list';
 
-//  Utils.
-import { isRtl } from 'flavours/glitch/util/rtl';
-
 //  Messages.
 const messages = defineMessages({
   cancel: {
@@ -71,7 +68,6 @@ class ReplyIndicator extends ImmutablePureComponent {
         <div
           className='content'
           dangerouslySetInnerHTML={{ __html: content || '' }}
-          style={{ direction: isRtl(content) ? 'rtl' : 'ltr' }}
         />
         {attachments.size > 0 && (
           <AttachmentList
diff --git a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
index 9748219dd..e502c3173 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { FormattedMessage } from 'react-intl';
 import ClearColumnButton from './clear_column_button';
+import GrantPermissionButton from './grant_permission_button';
 import SettingToggle from './setting_toggle';
 
 export default class ColumnSettings extends React.PureComponent {
@@ -23,7 +24,7 @@ export default class ColumnSettings extends React.PureComponent {
   }
 
   render () {
-    const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission } = this.props;
+    const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props;
 
     const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;
     const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
@@ -43,6 +44,14 @@ export default class ColumnSettings extends React.PureComponent {
           </div>
         )}
 
+        {alertsEnabled && browserSupport && browserPermission === 'default' && (
+          <div className='column-settings__row column-settings__row--with-margin'>
+            <span className='warning-hint'>
+              <FormattedMessage id='notifications.permission_required' defaultMessage='Desktop notifications are unavailable because the required permission has not been granted.' /> <GrantPermissionButton onClick={onRequestNotificationPermission} />
+            </span>
+          </div>
+        )}
+
         <div className='column-settings__row'>
           <ClearColumnButton onClick={onClear} />
         </div>
@@ -62,7 +71,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />
@@ -73,7 +82,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-follow-request' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow_request' defaultMessage='New follow requests:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow_request']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow_request']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow_request']} onChange={onChange} label={soundStr} />
@@ -84,7 +93,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />
@@ -95,7 +104,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />
@@ -106,7 +115,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
@@ -117,7 +126,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />
@@ -128,7 +137,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.status' defaultMessage='New toots:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'status']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'status']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'status']} meta={pushMeta} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'status']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'status']} onChange={onChange} label={soundStr} />
diff --git a/app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.js b/app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.js
new file mode 100644
index 000000000..798e4c787
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/notifications/components/grant_permission_button.js
@@ -0,0 +1,19 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+
+export default class GrantPermissionButton extends React.PureComponent {
+
+  static propTypes = {
+    onClick: PropTypes.func.isRequired,
+  };
+
+  render () {
+    return (
+      <button className='text-btn column-header__permission-btn' tabIndex='0' onClick={this.props.onClick}>
+        <FormattedMessage id='notifications.grant_permission' defaultMessage='Grant permission.' />
+      </button>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js b/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
index 73fc05dea..dd163225e 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
@@ -2,7 +2,8 @@ import React from 'react';
 import Icon from 'flavours/glitch/components/icon';
 import Button from 'flavours/glitch/components/button';
 import IconButton from 'flavours/glitch/components/icon_button';
-import { requestBrowserPermission, dismissBrowserPermission } from 'flavours/glitch/actions/notifications';
+import { requestBrowserPermission } from 'flavours/glitch/actions/notifications';
+import { changeSetting } from 'flavours/glitch/actions/settings';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
@@ -25,7 +26,7 @@ class NotificationsPermissionBanner extends React.PureComponent {
   }
 
   handleClose = () => {
-    this.props.dispatch(dismissBrowserPermission());
+    this.props.dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true));
   }
 
   render () {
diff --git a/app/javascript/flavours/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js
index 73d969517..5ceda9a91 100644
--- a/app/javascript/flavours/glitch/features/notifications/index.js
+++ b/app/javascript/flavours/glitch/features/notifications/index.js
@@ -69,7 +69,7 @@ const mapStateToProps = state => ({
   notifCleaningActive: state.getIn(['notifications', 'cleaningMode']),
   lastReadId: state.getIn(['local_settings', 'notifications', 'show_unread']) ? state.getIn(['notifications', 'readMarkerId']) : '0',
   canMarkAsRead: state.getIn(['local_settings', 'notifications', 'show_unread']) && state.getIn(['notifications', 'readMarkerId']) !== '0' && getNotifications(state).some(item => item !== null && compareId(item.get('id'), state.getIn(['notifications', 'readMarkerId'])) > 0),
-  needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default',
+  needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default' && !state.getIn(['settings', 'notifications', 'dismissPermissionBanner']),
 });
 
 /* glitch */
diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index c630cc7e3..b4c5ef71a 100644
--- a/app/javascript/flavours/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -19,7 +19,6 @@ import {
   NOTIFICATIONS_MARK_AS_READ,
   NOTIFICATIONS_SET_BROWSER_SUPPORT,
   NOTIFICATIONS_SET_BROWSER_PERMISSION,
-  NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
 } from 'flavours/glitch/actions/notifications';
 import {
   ACCOUNT_BLOCK_SUCCESS,
@@ -284,8 +283,6 @@ export default function notifications(state = initialState, action) {
     return state.set('browserSupport', action.value);
   case NOTIFICATIONS_SET_BROWSER_PERMISSION:
     return state.set('browserPermission', action.value);
-  case NOTIFICATIONS_DISMISS_BROWSER_PERMISSION:
-    return state.set('browserPermission', 'denied');
 
   case NOTIFICATION_MARK_FOR_DELETE:
     return markForDelete(state, action.id, action.yes);
diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js
index bf0545c48..091b8feec 100644
--- a/app/javascript/flavours/glitch/reducers/settings.js
+++ b/app/javascript/flavours/glitch/reducers/settings.js
@@ -48,6 +48,8 @@ const initialState = ImmutableMap({
       advanced: false,
     }),
 
+    dismissPermissionBanner: false,
+
     shows: ImmutableMap({
       follow: true,
       follow_request: false,
diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss
index ac5f3ebb0..de821fbe4 100644
--- a/app/javascript/flavours/glitch/styles/about.scss
+++ b/app/javascript/flavours/glitch/styles/about.scss
@@ -734,6 +734,7 @@ $small-breakpoint: 960px;
 
       &__column {
         flex: 1 1 50%;
+        overflow-x: hidden;
       }
     }
 
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index 2550f50f4..2d080d3b9 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -443,6 +443,12 @@
   }
 }
 
+.column-header__permission-btn {
+  display: inline;
+  font-weight: inherit;
+  text-decoration: underline;
+}
+
 .column-header__setting-arrows {
   float: right;
 
@@ -690,7 +696,7 @@
 }
 
 .column-settings__row {
-  .text-btn {
+  .text-btn:not(.column-header__permission-btn) {
     margin-bottom: 15px;
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 7ca1ae423..e067c9335 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -70,6 +70,7 @@
   p, pre, blockquote {
     margin-bottom: 20px;
     white-space: pre-wrap;
+    unicode-bidi: plaintext;
 
     &:last-child {
       margin-bottom: 0;
@@ -152,6 +153,7 @@
   a {
     color: $secondary-text-color;
     text-decoration: none;
+    unicode-bidi: isolate;
 
     &:hover {
       text-decoration: underline;
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index f973cad22..0c7cb443b 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -362,11 +362,6 @@ code {
       box-shadow: none;
     }
 
-    &:focus:invalid:not(:placeholder-shown),
-    &:required:invalid:not(:placeholder-shown) {
-      border-color: lighten($error-red, 12%);
-    }
-
     &:required:valid {
       border-color: $valid-value-color;
     }
@@ -382,6 +377,16 @@ code {
     }
   }
 
+  input[type=text],
+  input[type=number],
+  input[type=email],
+  input[type=password] {
+    &:focus:invalid:not(:placeholder-shown),
+    &:required:invalid:not(:placeholder-shown) {
+      border-color: lighten($error-red, 12%);
+    }
+  }
+
   .input.field_with_errors {
     label {
       color: lighten($error-red, 12%);
diff --git a/app/javascript/flavours/glitch/util/rtl.js b/app/javascript/flavours/glitch/util/rtl.js
deleted file mode 100644
index 89bed6de8..000000000
--- a/app/javascript/flavours/glitch/util/rtl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// U+0590  to U+05FF  - Hebrew
-// U+0600  to U+06FF  - Arabic
-// U+0700  to U+074F  - Syriac
-// U+0750  to U+077F  - Arabic Supplement
-// U+0780  to U+07BF  - Thaana
-// U+07C0  to U+07FF  - N'Ko
-// U+0800  to U+083F  - Samaritan
-// U+08A0  to U+08FF  - Arabic Extended-A
-// U+FB1D  to U+FB4F  - Hebrew presentation forms
-// U+FB50  to U+FDFF  - Arabic presentation forms A
-// U+FE70  to U+FEFF  - Arabic presentation forms B
-
-const rtlChars = /[\u0590-\u083F]|[\u08A0-\u08FF]|[\uFB1D-\uFDFF]|[\uFE70-\uFEFF]/mg;
-
-export function isRtl(text) {
-  if (text.length === 0) {
-    return false;
-  }
-
-  text = text.replace(/(?:^|[^\/\w])@([a-z0-9_]+(@[a-z0-9\.\-]+)?)/ig, '');
-  text = text.replace(/(?:^|[^\/\w])#([\S]+)/ig, '');
-  text = text.replace(/\s+/g, '');
-  text = text.replace(/(\w\S+\.\w{2,}\S*)/g, '');
-
-  const matches = text.match(rtlChars);
-
-  if (!matches) {
-    return false;
-  }
-
-  return matches.length / text.length > 0.3;
-};
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 93e18fba9..3464ac995 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -37,9 +37,8 @@ export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
 
 export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
 
-export const NOTIFICATIONS_SET_BROWSER_SUPPORT        = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
-export const NOTIFICATIONS_SET_BROWSER_PERMISSION     = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
-export const NOTIFICATIONS_DISMISS_BROWSER_PERMISSION = 'NOTIFICATIONS_DISMISS_BROWSER_PERMISSION';
+export const NOTIFICATIONS_SET_BROWSER_SUPPORT    = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
+export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
 
 defineMessages({
   mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
@@ -284,7 +283,3 @@ export function setBrowserPermission (value) {
     value,
   };
 }
-
-export const dismissBrowserPermission = () => ({
-  type: NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
-});
diff --git a/app/javascript/mastodon/components/autosuggest_input.js b/app/javascript/mastodon/components/autosuggest_input.js
index 6d2035add..5187f95c8 100644
--- a/app/javascript/mastodon/components/autosuggest_input.js
+++ b/app/javascript/mastodon/components/autosuggest_input.js
@@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 import AutosuggestHashtag from './autosuggest_hashtag';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from '../rtl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import classNames from 'classnames';
 import { List as ImmutableList } from 'immutable';
@@ -189,11 +188,6 @@ export default class AutosuggestInput extends ImmutablePureComponent {
   render () {
     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;
     const { suggestionsHidden } = this.state;
-    const style = { direction: 'ltr' };
-
-    if (isRtl(value)) {
-      style.direction = 'rtl';
-    }
 
     return (
       <div className='autosuggest-input'>
@@ -212,7 +206,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
             onKeyUp={onKeyUp}
             onFocus={this.onFocus}
             onBlur={this.onBlur}
-            style={style}
+            dir='auto'
             aria-autocomplete='list'
             id={id}
             className={className}
diff --git a/app/javascript/mastodon/components/autosuggest_textarea.js b/app/javascript/mastodon/components/autosuggest_textarea.js
index 58ec4f6eb..08b9cd80b 100644
--- a/app/javascript/mastodon/components/autosuggest_textarea.js
+++ b/app/javascript/mastodon/components/autosuggest_textarea.js
@@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 import AutosuggestHashtag from './autosuggest_hashtag';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from '../rtl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Textarea from 'react-textarea-autosize';
 import classNames from 'classnames';
@@ -195,11 +194,6 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
   render () {
     const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;
     const { suggestionsHidden } = this.state;
-    const style = { direction: 'ltr' };
-
-    if (isRtl(value)) {
-      style.direction = 'rtl';
-    }
 
     return [
       <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>
@@ -220,7 +214,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
               onFocus={this.onFocus}
               onBlur={this.onBlur}
               onPaste={this.onPaste}
-              style={style}
+              dir='auto'
               aria-autocomplete='list'
             />
           </label>
diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js
index 3200f2d82..185a2a663 100644
--- a/app/javascript/mastodon/components/status_content.js
+++ b/app/javascript/mastodon/components/status_content.js
@@ -1,7 +1,6 @@
 import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
-import { isRtl } from '../rtl';
 import { FormattedMessage } from 'react-intl';
 import Permalink from './permalink';
 import classnames from 'classnames';
@@ -186,17 +185,12 @@ export default class StatusContent extends React.PureComponent {
 
     const content = { __html: status.get('contentHtml') };
     const spoilerContent = { __html: status.get('spoilerHtml') };
-    const directionStyle = { direction: 'ltr' };
     const classNames = classnames('status__content', {
       'status__content--with-action': this.props.onClick && this.context.router,
       'status__content--with-spoiler': status.get('spoiler_text').length > 0,
       'status__content--collapsed': renderReadMore,
     });
 
-    if (isRtl(status.get('search_index'))) {
-      directionStyle.direction = 'rtl';
-    }
-
     const showThreadButton = (
       <button className='status__content__read-more-button' onClick={this.props.onClick}>
         <FormattedMessage id='status.show_thread' defaultMessage='Show thread' />
@@ -225,7 +219,7 @@ export default class StatusContent extends React.PureComponent {
       }
 
       return (
-        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
+        <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
           <p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}>
             <span dangerouslySetInnerHTML={spoilerContent} />
             {' '}
@@ -234,7 +228,7 @@ export default class StatusContent extends React.PureComponent {
 
           {mentionsPlaceholder}
 
-          <div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''}`} style={directionStyle} dangerouslySetInnerHTML={content} />
+          <div tabIndex={!hidden ? 0 : null} className={`status__content__text ${!hidden ? 'status__content__text--visible' : ''}`} dangerouslySetInnerHTML={content} />
 
           {!hidden && !!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 
@@ -243,8 +237,8 @@ export default class StatusContent extends React.PureComponent {
       );
     } else if (this.props.onClick) {
       const output = [
-        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content'>
-          <div className='status__content__text status__content__text--visible' style={directionStyle} dangerouslySetInnerHTML={content} />
+        <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content'>
+          <div className='status__content__text status__content__text--visible' dangerouslySetInnerHTML={content} />
 
           {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 
@@ -259,8 +253,8 @@ export default class StatusContent extends React.PureComponent {
       return output;
     } else {
       return (
-        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle}>
-          <div className='status__content__text status__content__text--visible' style={directionStyle} dangerouslySetInnerHTML={content} />
+        <div className={classNames} ref={this.setRef} tabIndex='0'>
+          <div className='status__content__text status__content__text--visible' dangerouslySetInnerHTML={content} />
 
           {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 
diff --git a/app/javascript/mastodon/features/account_gallery/index.js b/app/javascript/mastodon/features/account_gallery/index.js
index 597ca8af6..015a6a6d7 100644
--- a/app/javascript/mastodon/features/account_gallery/index.js
+++ b/app/javascript/mastodon/features/account_gallery/index.js
@@ -152,6 +152,14 @@ class AccountGallery extends ImmutablePureComponent {
       loadOlder = <LoadMore visible={!isLoading} onClick={this.handleLoadOlder} />;
     }
 
+    let emptyMessage;
+
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (blockedBy) {
+      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
+    }
+
     return (
       <Column>
         <ColumnBackButton multiColumn={multiColumn} />
@@ -162,7 +170,7 @@ class AccountGallery extends ImmutablePureComponent {
 
             {(suspended || blockedBy) ? (
               <div className='empty-column-indicator'>
-                <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />
+                {emptyMessage}
               </div>
             ) : (
               <div role='feed' className='account-gallery__container' ref={this.handleRef}>
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index cbc859805..fa4239d6f 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -136,7 +136,9 @@ class AccountTimeline extends ImmutablePureComponent {
 
     let emptyMessage;
 
-    if (suspended || blockedBy) {
+    if (suspended) {
+      emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;
+    } else if (blockedBy) {
       emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
     } else if (remote && statusIds.isEmpty()) {
       emptyMessage = <RemoteHint url={remoteUrl} />;
diff --git a/app/javascript/mastodon/features/compose/components/reply_indicator.js b/app/javascript/mastodon/features/compose/components/reply_indicator.js
index 66dc85742..856383893 100644
--- a/app/javascript/mastodon/features/compose/components/reply_indicator.js
+++ b/app/javascript/mastodon/features/compose/components/reply_indicator.js
@@ -6,7 +6,6 @@ import IconButton from '../../../components/icon_button';
 import DisplayName from '../../../components/display_name';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { isRtl } from '../../../rtl';
 import AttachmentList from 'mastodon/components/attachment_list';
 
 const messages = defineMessages({
@@ -45,9 +44,6 @@ class ReplyIndicator extends ImmutablePureComponent {
     }
 
     const content = { __html: status.get('contentHtml') };
-    const style   = {
-      direction: isRtl(status.get('search_index')) ? 'rtl' : 'ltr',
-    };
 
     return (
       <div className='reply-indicator'>
@@ -60,7 +56,7 @@ class ReplyIndicator extends ImmutablePureComponent {
           </a>
         </div>
 
-        <div className='reply-indicator__content' style={style} dangerouslySetInnerHTML={content} />
+        <div className='reply-indicator__content' dangerouslySetInnerHTML={content} />
 
         {status.get('media_attachments').size > 0 && (
           <AttachmentList
diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.js b/app/javascript/mastodon/features/notifications/components/column_settings.js
index 169e4b44d..8339a367e 100644
--- a/app/javascript/mastodon/features/notifications/components/column_settings.js
+++ b/app/javascript/mastodon/features/notifications/components/column_settings.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { FormattedMessage } from 'react-intl';
 import ClearColumnButton from './clear_column_button';
+import GrantPermissionButton from './grant_permission_button';
 import SettingToggle from './setting_toggle';
 
 export default class ColumnSettings extends React.PureComponent {
@@ -23,7 +24,7 @@ export default class ColumnSettings extends React.PureComponent {
   }
 
   render () {
-    const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission } = this.props;
+    const { settings, pushSettings, onChange, onClear, alertsEnabled, browserSupport, browserPermission, onRequestNotificationPermission } = this.props;
 
     const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;
     const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
@@ -42,6 +43,14 @@ export default class ColumnSettings extends React.PureComponent {
           </div>
         )}
 
+        {alertsEnabled && browserSupport && browserPermission === 'default' && (
+          <div className='column-settings__row column-settings__row--with-margin'>
+            <span className='warning-hint'>
+              <FormattedMessage id='notifications.permission_required' defaultMessage='Desktop notifications are unavailable because the required permission has not been granted.' /> <GrantPermissionButton onClick={onRequestNotificationPermission} />
+            </span>
+          </div>
+        )}
+
         <div className='column-settings__row'>
           <ClearColumnButton onClick={onClear} />
         </div>
@@ -61,7 +70,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />
@@ -72,7 +81,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-follow-request' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow_request' defaultMessage='New follow requests:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow_request']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow_request']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow_request']} onChange={onChange} label={soundStr} />
@@ -83,7 +92,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />
@@ -94,7 +103,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />
@@ -105,7 +114,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />
@@ -116,7 +125,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />
@@ -127,7 +136,7 @@ export default class ColumnSettings extends React.PureComponent {
           <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.status' defaultMessage='New toots:' /></span>
 
           <div className='column-settings__row'>
-            <SettingToggle disabled={browserPermission !== 'granted'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'status']} onChange={onChange} label={alertStr} />
+            <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'status']} onChange={onChange} label={alertStr} />
             {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'status']} onChange={this.onPushChange} label={pushStr} />}
             <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'status']} onChange={onChange} label={showStr} />
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'status']} onChange={onChange} label={soundStr} />
diff --git a/app/javascript/mastodon/features/notifications/components/grant_permission_button.js b/app/javascript/mastodon/features/notifications/components/grant_permission_button.js
new file mode 100644
index 000000000..798e4c787
--- /dev/null
+++ b/app/javascript/mastodon/features/notifications/components/grant_permission_button.js
@@ -0,0 +1,19 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+
+export default class GrantPermissionButton extends React.PureComponent {
+
+  static propTypes = {
+    onClick: PropTypes.func.isRequired,
+  };
+
+  render () {
+    return (
+      <button className='text-btn column-header__permission-btn' tabIndex='0' onClick={this.props.onClick}>
+        <FormattedMessage id='notifications.grant_permission' defaultMessage='Grant permission.' />
+      </button>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
index 6daf75814..df9b7fb1b 100644
--- a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
+++ b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
@@ -2,7 +2,8 @@ import React from 'react';
 import Icon from 'mastodon/components/icon';
 import Button from 'mastodon/components/button';
 import IconButton from 'mastodon/components/icon_button';
-import { requestBrowserPermission, dismissBrowserPermission } from 'mastodon/actions/notifications';
+import { requestBrowserPermission } from 'mastodon/actions/notifications';
+import { changeSetting } from 'mastodon/actions/settings';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
@@ -25,7 +26,7 @@ class NotificationsPermissionBanner extends React.PureComponent {
   }
 
   handleClose = () => {
-    this.props.dispatch(dismissBrowserPermission());
+    this.props.dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true));
   }
 
   render () {
diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js
index 2e0afd863..108470c9a 100644
--- a/app/javascript/mastodon/features/notifications/index.js
+++ b/app/javascript/mastodon/features/notifications/index.js
@@ -62,7 +62,7 @@ const mapStateToProps = state => ({
   numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size,
   lastReadId: state.getIn(['notifications', 'readMarkerId']),
   canMarkAsRead: state.getIn(['notifications', 'readMarkerId']) !== '0' && getNotifications(state).some(item => item !== null && compareId(item.get('id'), state.getIn(['notifications', 'readMarkerId'])) > 0),
-  needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default',
+  needsNotificationPermission: state.getIn(['settings', 'notifications', 'alerts']).includes(true) && state.getIn(['notifications', 'browserSupport']) && state.getIn(['notifications', 'browserPermission']) === 'default' && !state.getIn(['settings', 'notifications', 'dismissPermissionBanner']),
 });
 
 export default @connect(mapStateToProps)
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 8f0e04561..4d43a2720 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "نتائج البحث",
   "emoji_button.symbols": "رموز",
   "emoji_button.travel": "الأماكن والسفر",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "ليس هناك تبويقات!",
   "empty_column.account_unavailable": "الملف التعريفي غير متوفر",
   "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "التالي",
   "lightbox.previous": "العودة",
-  "lightbox.view_context": "اعرض السياق",
   "lists.account.add": "أضف إلى القائمة",
   "lists.account.remove": "احذف من القائمة",
   "lists.delete": "احذف القائمة",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "تعديل العنوان",
   "lists.new.create": "إنشاء قائمة",
   "lists.new.title_placeholder": "عنوان القائمة الجديدة",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "إبحث في قائمة الحسابات التي تُتابِعها",
   "lists.subheading": "قوائمك",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "الإشارات",
   "notifications.filter.polls": "نتائج استطلاع الرأي",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} إشعارات",
   "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",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index e0b67d6bb..4f5fec8b1 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Search results",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viaxes y llugares",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "¡Equí nun hai barritos!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "Entá nun bloquiesti a nunengún usuariu.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Amestar a la llista",
   "lists.account.remove": "Desaniciar de la llista",
   "lists.delete": "Desaniciar la llista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "Títulu nuevu de la llista",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Guetar ente la xente que sigues",
   "lists.subheading": "Les tos llistes",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Poll results",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} avisos",
   "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",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 3ffa07a71..4778d6618 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 056a3d424..9b73c3597 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "খোঁজার ফলাফল",
   "emoji_button.symbols": "প্রতীক",
   "emoji_button.travel": "ভ্রমণ এবং স্থান",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "এখানে কোনো টুট নেই!",
   "empty_column.account_unavailable": "নিজস্ব পাতা নেই",
   "empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "পরবর্তী",
   "lightbox.previous": "পূর্ববর্তী",
-  "lightbox.view_context": "প্রসঙ্গটি দেখতে",
   "lists.account.add": "তালিকাতে যুক্ত করতে",
   "lists.account.remove": "তালিকা থেকে বাদ দিতে",
   "lists.delete": "তালিকা মুছে ফেলতে",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "শিরোনাম সম্পাদনা করতে",
   "lists.new.create": "তালিকাতে যুক্ত করতে",
   "lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন",
   "lists.subheading": "আপনার তালিকা",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "উল্লেখিত",
   "notifications.filter.polls": "নির্বাচনের ফলাফল",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} প্রজ্ঞাপন",
   "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",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index ce7260477..84c5f4523 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Disoc'hoù an enklask",
   "emoji_button.symbols": "Arouezioù",
   "emoji_button.travel": "Lec'hioù ha Beajoù",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Toud ebet amañ!",
   "empty_column.account_unavailable": "Profil dihegerz",
   "empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Da-heul",
   "lightbox.previous": "A-raok",
-  "lightbox.view_context": "Diskouez ar c'hemperzh",
   "lists.account.add": "Ouzhpennañ d'al listenn",
   "lists.account.remove": "Lemel kuit eus al listenn",
   "lists.delete": "Dilemel al listenn",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cheñch an titl",
   "lists.new.create": "Ouzhpennañ ul listenn",
   "lists.new.title_placeholder": "Titl nevez al listenn",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Ho listennoù",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menegoù",
   "notifications.filter.polls": "Disoc'hoù ar sontadegoù",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} a gemennoù",
   "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",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 93bcffeaa..13e9e885b 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultats de la cerca",
   "emoji_button.symbols": "Símbols",
   "emoji_button.travel": "Viatges i Llocs",
+  "empty_column.account_suspended": "Compte suspès",
   "empty_column.account_timeline": "No hi ha tuts aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Encara no has bloquejat cap usuari.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Amplia el quadre de visualització de l’imatge",
   "lightbox.next": "Següent",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Veure el context",
   "lists.account.add": "Afegir a la llista",
   "lists.account.remove": "Treure de la llista",
   "lists.delete": "Esborrar llista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Canvi de títol",
   "lists.new.create": "Afegir llista",
   "lists.new.title_placeholder": "Nova llista",
-  "lists.replies_policy.all_replies": "Qualsevol usuari seguit",
-  "lists.replies_policy.list_replies": "Membres de la llista",
-  "lists.replies_policy.no_replies": "Ningú",
+  "lists.replies_policy.followed": "Qualsevol usuari seguit",
+  "lists.replies_policy.list": "Membres de la llista",
+  "lists.replies_policy.none": "Ningú",
   "lists.replies_policy.title": "Mostra respostes a:",
   "lists.search": "Cercar entre les persones que segueixes",
   "lists.subheading": "Les teves llistes",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Mencions",
   "notifications.filter.polls": "Resultats de l'enquesta",
   "notifications.filter.statuses": "Actualitzacions de gent que segueixes",
+  "notifications.grant_permission": "Concedir permís.",
   "notifications.group": "{count} notificacions",
   "notifications.mark_as_read": "Marca cada notificació com a llegida",
   "notifications.permission_denied": "No s’ha pogut activar les notificacions d’escriptori perquè s’ha denegat el permís.",
   "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
+  "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.",
   "notifications_permission_banner.enable": "Activar les notificacions d’escriptori",
   "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
   "notifications_permission_banner.title": "Mai et perdis res",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 10d5f9008..43e1f6c10 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Risultati di a cerca",
   "emoji_button.symbols": "Simbuli",
   "emoji_button.travel": "Lochi è Viaghju",
+  "empty_column.account_suspended": "Contu suspesu",
   "empty_column.account_timeline": "Nisun statutu quì!",
   "empty_column.account_unavailable": "Prufile micca dispunibule",
   "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti",
   "lightbox.next": "Siguente",
   "lightbox.previous": "Pricidente",
-  "lightbox.view_context": "Vede u cuntestu",
   "lists.account.add": "Aghjunghje à a lista",
   "lists.account.remove": "Toglie di a lista",
   "lists.delete": "Toglie a lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cambià u titulu",
   "lists.new.create": "Aghjunghje",
   "lists.new.title_placeholder": "Titulu di a lista",
-  "lists.replies_policy.all_replies": "Tutti i vostri abbunamenti",
-  "lists.replies_policy.list_replies": "Membri di a lista",
-  "lists.replies_policy.no_replies": "Nisunu",
+  "lists.replies_policy.followed": "Tutti i vostri abbunamenti",
+  "lists.replies_policy.list": "Membri di a lista",
+  "lists.replies_policy.none": "Nimu",
   "lists.replies_policy.title": "Vede e risposte à:",
   "lists.search": "Circà indè i vostr'abbunamenti",
   "lists.subheading": "E vo liste",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Minzione",
   "notifications.filter.polls": "Risultati di u scandagliu",
   "notifications.filter.statuses": "Messe à ghjornu di e persone chì siguitate",
+  "notifications.grant_permission": "Auturizà.",
   "notifications.group": "{count} nutificazione",
   "notifications.mark_as_read": "Marcà tutte e nutificazione cum'è lette",
-  "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè a dumanda d'auturizazione hè stata ricusata",
+  "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè l'auturizazione hè stata ricusata",
   "notifications.permission_denied_alert": "Ùn pudete micca attivà e nutificazione nant'à l'urdinatore, perchè avete digià ricusatu a dumanda d'auturizazione di u navigatore",
+  "notifications.permission_required": "Ùn si po micca attivà e nutificazione desktop perchè a l'auturizazione richiesta ùn hè micca stata data.",
   "notifications_permission_banner.enable": "Attivà e nutificazione nant'à l'urdinatore",
   "notifications_permission_banner.how_to_control": "Per riceve nutificazione quandu Mastodon ùn hè micca aperta, attivate e nutificazione nant'à l'urdinatore. Pudete decide quali tippi d'interazione anu da mandà ste nutificazione cù u buttone {icon} quì sopra quandu saranu attivate.",
   "notifications_permission_banner.title": "Ùn mancate mai nunda",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index c43b3c875..76df857d8 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -12,12 +12,12 @@
   "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Doména skryta",
   "account.edit_profile": "Upravit profil",
-  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.enable_notifications": "Oznámit mě na příspěvky @{name}",
   "account.endorse": "Zvýraznit na profilu",
   "account.follow": "Sledovat",
   "account.followers": "Sledující",
   "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.followers_counter": "{count, plural, one {{counter} sledující} few {{counter} sledující} many {{counter} sledujících} other {{counter} sledujících}}",
   "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
   "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
   "account.follows_you": "Sleduje vás",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Výsledky hledání",
   "emoji_button.symbols": "Symboly",
   "emoji_button.travel": "Cestování a místa",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Nejsou tu žádné tooty!",
   "empty_column.account_unavailable": "Profil nedostupný",
   "empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.",
@@ -176,7 +177,7 @@
   "follow_request.authorize": "Autorizovat",
   "follow_request.reject": "Odmítnout",
   "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, {domain} si myslí, že budete chtít následující požadavky na sledování zkontrolovat ručně.",
-  "generic.saved": "Saved",
+  "generic.saved": "Uloženo",
   "getting_started.developers": "Vývojáři",
   "getting_started.directory": "Adresář profilů",
   "getting_started.documentation": "Dokumentace",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Další",
   "lightbox.previous": "Předchozí",
-  "lightbox.view_context": "Zobrazit kontext",
   "lists.account.add": "Přidat do seznamu",
   "lists.account.remove": "Odebrat ze seznamu",
   "lists.delete": "Smazat seznam",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Změnit název",
   "lists.new.create": "Přidat seznam",
   "lists.new.title_placeholder": "Název nového seznamu",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Hledejte mezi lidmi, které sledujete",
   "lists.subheading": "Vaše seznamy",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Zmínky",
   "notifications.filter.polls": "Výsledky anket",
   "notifications.filter.statuses": "Aktuality od lidí, které sledujete",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} oznámení",
   "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",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index e5f2e69b0..b3c1947b4 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Canlyniadau chwilio",
   "emoji_button.symbols": "Symbolau",
   "emoji_button.travel": "Teithio & Llefydd",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Dim tŵtiau fama!",
   "empty_column.account_unavailable": "Proffil ddim ar gael",
   "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Nesaf",
   "lightbox.previous": "Blaenorol",
-  "lightbox.view_context": "Gweld cyd-destyn",
   "lists.account.add": "Ychwanegwch at restr",
   "lists.account.remove": "Dileu o'r rhestr",
   "lists.delete": "Dileu rhestr",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Newid teitl",
   "lists.new.create": "Ychwanegu rhestr",
   "lists.new.title_placeholder": "Teitl rhestr newydd",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
   "lists.subheading": "Eich rhestrau",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Crybwylliadau",
   "notifications.filter.polls": "Canlyniadau pleidlais",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} o hysbysiadau",
   "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",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 4b312a8f4..7c4b3e4ef 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Søgeresultater",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Rejser & steder",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ingen bidrag her!",
   "empty_column.account_unavailable": "Profil utilgængelig",
   "empty_column.blocks": "Du har ikke blokeret nogen endnu.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Næste",
   "lightbox.previous": "Forrige",
-  "lightbox.view_context": "Vis kontekst",
   "lists.account.add": "Tilføj til liste",
   "lists.account.remove": "Fjern fra liste",
   "lists.delete": "Slet liste",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Skift titel",
   "lists.new.create": "Tilføj liste",
   "lists.new.title_placeholder": "Ny liste titel",
-  "lists.replies_policy.all_replies": "Enhver fulgt bruger",
-  "lists.replies_policy.list_replies": "Medlemmer af listen",
-  "lists.replies_policy.no_replies": "Ingen",
+  "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": "Vis svar til:",
   "lists.search": "Søg iblandt folk du følger",
   "lists.subheading": "Dine lister",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Statusser der nævner dig",
   "notifications.filter.polls": "Afstemningsresultat",
   "notifications.filter.statuses": "Opdateringer fra personer, du følger",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} notifikationer",
   "notifications.mark_as_read": "Markér alle notifikationer som læst",
   "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": "Aktivér skrivebordsmeddelelser",
   "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": "Gå aldrig glip af noget",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 3c877308d..1cc962880 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Suchergebnisse",
   "emoji_button.symbols": "Symbole",
   "emoji_button.travel": "Reisen und Orte",
+  "empty_column.account_suspended": "Konto gesperrt",
   "empty_column.account_timeline": "Keine Beiträge!",
   "empty_column.account_unavailable": "Konto nicht verfügbar",
   "empty_column.blocks": "Du hast keine Profile blockiert.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Bildansicht erweitern",
   "lightbox.next": "Weiter",
   "lightbox.previous": "Zurück",
-  "lightbox.view_context": "Beitrag sehen",
   "lists.account.add": "Zur Liste hinzufügen",
   "lists.account.remove": "Von der Liste entfernen",
   "lists.delete": "Liste löschen",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Titel ändern",
   "lists.new.create": "Liste hinzufügen",
   "lists.new.title_placeholder": "Neuer Titel der Liste",
-  "lists.replies_policy.all_replies": "Jeder gefolgte Benutzer",
-  "lists.replies_policy.list_replies": "Mitglieder der Liste",
-  "lists.replies_policy.no_replies": "Niemand",
+  "lists.replies_policy.followed": "Jeder gefolgte Benutzer",
+  "lists.replies_policy.list": "Mitglieder der Liste",
+  "lists.replies_policy.none": "Niemand",
   "lists.replies_policy.title": "Antworten anzeigen für:",
   "lists.search": "Suche nach Leuten denen du folgst",
   "lists.subheading": "Deine Listen",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Erwähnungen",
   "notifications.filter.polls": "Ergebnisse der Umfrage",
   "notifications.filter.statuses": "Updates von Personen, denen du folgst",
+  "notifications.grant_permission": "Zugriff gewährt.",
   "notifications.group": "{count} Benachrichtigungen",
   "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren",
   "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.",
   "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde",
+  "notifications.permission_required": "Desktop-Benachrichtigungen sind nicht verfügbar, da die erforderliche Berechtigung nicht erteilt wurde.",
   "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen",
   "notifications_permission_banner.how_to_control": "Um Benachrichtigungen zu erhalten, wenn Mastodon nicht geöffnet ist, aktiviere die Desktop-Benachrichtigungen. Du kannst genau bestimmen, welche Arten von Interaktionen Desktop-Benachrichtigungen über die {icon} -Taste erzeugen, sobald diese aktiviert sind.",
   "notifications_permission_banner.title": "Verpasse nie etwas",
@@ -379,7 +381,7 @@
   "search_popout.search_format": "Fortgeschrittenes Suchformat",
   "search_popout.tips.full_text": "Einfache Texteingabe gibt Beiträge, die du geschrieben, favorisiert und geteilt hast zurück. Außerdem auch Beiträge in denen du erwähnt wurdest, aber auch passende Nutzernamen, Anzeigenamen oder Hashtags.",
   "search_popout.tips.hashtag": "Hashtag",
-  "search_popout.tips.status": "Beitrag",
+  "search_popout.tips.status": "Tröt",
   "search_popout.tips.text": "Einfache Texteingabe gibt Anzeigenamen, Benutzernamen und Hashtags zurück",
   "search_popout.tips.user": "Nutzer",
   "search_results.accounts": "Personen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 86e4b6140..4ffedfbfb 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -653,6 +653,10 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Account suspended",
+        "id": "empty_column.account_suspended"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       }
@@ -713,6 +717,10 @@
         "id": "timeline_hint.resources.statuses"
       },
       {
+        "defaultMessage": "Account suspended",
+        "id": "empty_column.account_suspended"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -2161,15 +2169,15 @@
       },
       {
         "defaultMessage": "Any followed user",
-        "id": "lists.replies_policy.all_replies"
+        "id": "lists.replies_policy.followed"
       },
       {
         "defaultMessage": "No one",
-        "id": "lists.replies_policy.no_replies"
+        "id": "lists.replies_policy.none"
       },
       {
         "defaultMessage": "Members of the list",
-        "id": "lists.replies_policy.list_replies"
+        "id": "lists.replies_policy.list"
       },
       {
         "defaultMessage": "Edit list",
@@ -2273,6 +2281,10 @@
         "id": "notifications.permission_denied"
       },
       {
+        "defaultMessage": "Desktop notifications are unavailable because the required permission has not been granted.",
+        "id": "notifications.permission_required"
+      },
+      {
         "defaultMessage": "Quick filter bar",
         "id": "notifications.column_settings.filter_bar.category"
       },
@@ -2356,6 +2368,15 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Grant permission.",
+        "id": "notifications.grant_permission"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/notifications/components/grant_permission_button.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "{name} favourited your status",
         "id": "notification.favourite"
       },
@@ -2478,6 +2499,10 @@
       {
         "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
         "id": "confirmations.reply.message"
+      },
+      {
+        "defaultMessage": "Expand this status",
+        "id": "status.open"
       }
     ],
     "path": "app/javascript/mastodon/features/picture_in_picture/components/footer.json"
@@ -2767,15 +2792,6 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "View context",
-        "id": "lightbox.view_context"
-      }
-    ],
-    "path": "app/javascript/mastodon/features/ui/components/audio_modal.json"
-  },
-  {
-    "descriptors": [
-      {
         "defaultMessage": "Are you sure you want to block {name}?",
         "id": "confirmations.block.message"
       },
@@ -3049,10 +3065,6 @@
       {
         "defaultMessage": "Next",
         "id": "lightbox.next"
-      },
-      {
-        "defaultMessage": "View context",
-        "id": "lightbox.view_context"
       }
     ],
     "path": "app/javascript/mastodon/features/ui/components/media_modal.json"
@@ -3221,15 +3233,6 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "View context",
-        "id": "lightbox.view_context"
-      }
-    ],
-    "path": "app/javascript/mastodon/features/ui/components/video_modal.json"
-  },
-  {
-    "descriptors": [
-      {
         "defaultMessage": "Compress image view box",
         "id": "lightbox.compress"
       },
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index bd9f2e7ff..7b7373165 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Αποτελέσματα αναζήτησης",
   "emoji_button.symbols": "Σύμβολα",
   "emoji_button.travel": "Ταξίδια & Τοποθεσίες",
+  "empty_column.account_suspended": "Λογαριασμός σε αναστολή",
   "empty_column.account_timeline": "Δεν έχει τουτ εδώ!",
   "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ",
   "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας",
   "lightbox.next": "Επόμενο",
   "lightbox.previous": "Προηγούμενο",
-  "lightbox.view_context": "Εμφάνιση πλαισίου",
   "lists.account.add": "Πρόσθεσε στη λίστα",
   "lists.account.remove": "Βγάλε από τη λίστα",
   "lists.delete": "Διαγραφή λίστας",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Αλλαγή τίτλου",
   "lists.new.create": "Προσθήκη λίστας",
   "lists.new.title_placeholder": "Τίτλος νέας λίστα",
-  "lists.replies_policy.all_replies": "Οποιοσδήποτε χρήστης που ακολουθείς",
-  "lists.replies_policy.list_replies": "Μέλη της λίστας",
-  "lists.replies_policy.no_replies": "Κανείς",
+  "lists.replies_policy.followed": "Οποιοσδήποτε χρήστης που ακολουθείς",
+  "lists.replies_policy.list": "Μέλη της λίστας",
+  "lists.replies_policy.none": "Κανένας",
   "lists.replies_policy.title": "Εμφάνιση απαντήσεων σε:",
   "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
   "lists.subheading": "Οι λίστες σου",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Αναφορές",
   "notifications.filter.polls": "Αποτελέσματα ψηφοφορίας",
   "notifications.filter.statuses": "Ενημερώσεις από όσους ακολουθείς",
+  "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": "Οι ειδοποιήσεις δεν είναι διαθέσιμες επειδή δεν έχει δοθεί η απαιτούμενη άδεια.",
   "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": "Μη χάσετε τίποτα",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 6d3224e3d..5bea4e816 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -153,6 +153,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -262,7 +263,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -270,9 +270,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -339,10 +339,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 1b5f18884..5cff6c5af 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -6,7 +6,7 @@
   "account.block": "Bloki @{name}",
   "account.block_domain": "Bloki {domain}",
   "account.blocked": "Blokita",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Rigardi pli al la originala profilo",
   "account.cancel_follow_request": "Nuligi peton de sekvado",
   "account.direct": "Rekte mesaĝi @{name}",
   "account.disable_notifications": "Stop notifying me when @{name} posts",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Serĉaj rezultoj",
   "emoji_button.symbols": "Simboloj",
   "emoji_button.travel": "Vojaĝoj kaj lokoj",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Neniu mesaĝo ĉi tie!",
   "empty_column.account_unavailable": "Profilo ne disponebla",
   "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sekva",
   "lightbox.previous": "Antaŭa",
-  "lightbox.view_context": "Vidi kuntekston",
   "lists.account.add": "Aldoni al la listo",
   "lists.account.remove": "Forigi de la listo",
   "lists.delete": "Forigi la liston",
@@ -266,10 +266,10 @@
   "lists.edit.submit": "Ŝanĝi titolon",
   "lists.new.create": "Aldoni liston",
   "lists.new.title_placeholder": "Titolo de la nova listo",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
-  "lists.replies_policy.title": "Show replies to:",
+  "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": "Montri respondon al:",
   "lists.search": "Serĉi inter la homoj, kiujn vi sekvas",
   "lists.subheading": "Viaj listoj",
   "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}",
@@ -277,9 +277,9 @@
   "media_gallery.toggle_visible": "Baskuligi videblecon",
   "missing_indicator.label": "Ne trovita",
   "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita",
-  "mute_modal.duration": "Duration",
+  "mute_modal.duration": "Daŭro",
   "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?",
-  "mute_modal.indefinite": "Indefinite",
+  "mute_modal.indefinite": "Nedifinita",
   "navigation_bar.apps": "Telefonaj aplikaĵoj",
   "navigation_bar.blocks": "Blokitaj uzantoj",
   "navigation_bar.bookmarks": "Legosignoj",
@@ -310,7 +310,7 @@
   "notification.own_poll": "Via balotenketo finiĝitis",
   "notification.poll": "Partoprenita balotenketo finiĝis",
   "notification.reblog": "{name} diskonigis vian mesaĝon",
-  "notification.status": "{name} just posted",
+  "notification.status": "{name} ĵus afiŝita",
   "notifications.clear": "Forviŝi sciigojn",
   "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
   "notifications.column_settings.alert": "Retumilaj sciigoj",
@@ -334,13 +334,15 @@
   "notifications.filter.mentions": "Mencioj",
   "notifications.filter.polls": "Balotenketaj rezultoj",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} sciigoj",
-  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.mark_as_read": "Marki ĉiujn sciigojn legita",
   "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_banner.enable": "Enable desktop notifications",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications_permission_banner.enable": "Ebligi retumilajn sciigojn",
   "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",
+  "notifications_permission_banner.title": "Neniam preterlasas iun ajn",
   "picture_in_picture.restore": "Put it back",
   "poll.closed": "Finita",
   "poll.refresh": "Aktualigi",
@@ -351,13 +353,13 @@
   "poll_button.add_poll": "Aldoni balotenketon",
   "poll_button.remove_poll": "Forigi balotenketon",
   "privacy.change": "Agordi mesaĝan privatecon",
-  "privacy.direct.long": "Afiŝi nur al menciitaj uzantoj",
+  "privacy.direct.long": "Videbla nur al menciitaj uzantoj",
   "privacy.direct.short": "Rekta",
-  "privacy.private.long": "Afiŝi nur al sekvantoj",
-  "privacy.private.short": "Nur por sekvantoj",
-  "privacy.public.long": "Afiŝi en publikaj tempolinioj",
+  "privacy.private.long": "Videbla nur al viaj sekvantoj",
+  "privacy.private.short": "Nur al sekvantoj",
+  "privacy.public.long": "Videbla al ĉiuj, afiŝita en publikaj tempolinioj",
   "privacy.public.short": "Publika",
-  "privacy.unlisted.long": "Ne afiŝi en publikaj tempolinioj",
+  "privacy.unlisted.long": "Videbla al ĉiuj, sed ne en publikaj tempolinioj",
   "privacy.unlisted.short": "Nelistigita",
   "refresh": "Refreŝigu",
   "regeneration_indicator.label": "Ŝargado…",
@@ -448,7 +450,7 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personoj}} parolante",
   "trends.trending_now": "Nunaj furoraĵoj",
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
-  "units.short.billion": "{count}B",
+  "units.short.billion": "{count}Md",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Altreni kaj lasi por alŝuti",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 57115404b..434382e20 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultados de búsqueda",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viajes y lugares",
+  "empty_column.account_suspended": "Cuenta suspendida",
   "empty_column.account_timeline": "¡No hay toots acá!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expandir cuadro de vista de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ver contexto",
   "lists.account.add": "Agregar a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Eliminar lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cambiar título",
   "lists.new.create": "Agregar lista",
   "lists.new.title_placeholder": "Nuevo título de lista",
-  "lists.replies_policy.all_replies": "Cualquier cuenta seguida",
-  "lists.replies_policy.list_replies": "Miembros de la lista",
-  "lists.replies_policy.no_replies": "Nadie",
+  "lists.replies_policy.followed": "Cualquier cuenta seguida",
+  "lists.replies_policy.list": "Miembros de la lista",
+  "lists.replies_policy.none": "Nadie",
   "lists.replies_policy.title": "Mostrar respuestas a:",
   "lists.search": "Buscar entre la gente que seguís",
   "lists.subheading": "Tus listas",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Resultados de encuesta",
   "notifications.filter.statuses": "Actualizaciones de cuentas que seguís",
+  "notifications.grant_permission": "Conceder permiso.",
   "notifications.group": "{count} notificaciones",
   "notifications.mark_as_read": "Marcar cada notificación como leída",
   "notifications.permission_denied": "Las notificaciones de escritorio no están disponibles, debido a una solicitud de permiso del navegador web previamente denegada",
   "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado antes",
+  "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se concedió el permiso requerido.",
   "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio",
   "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no está abierto, habilitá las notificaciones de escritorio. Podés controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba, una vez que estén habilitadas.",
   "notifications_permission_banner.title": "No te pierdas nada",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 43c717281..e769d7a48 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultados de búsqueda",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viajes y lugares",
+  "empty_column.account_suspended": "Cuenta suspendida",
   "empty_column.account_timeline": "¡No hay toots aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expandir cuadro de visualización de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ver contexto",
   "lists.account.add": "Añadir a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Borrar lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cambiar título",
   "lists.new.create": "Añadir lista",
   "lists.new.title_placeholder": "Título de la nueva lista",
-  "lists.replies_policy.all_replies": "Cualquier usuario al que sigas",
-  "lists.replies_policy.list_replies": "Miembros de la lista",
-  "lists.replies_policy.no_replies": "Nadie",
+  "lists.replies_policy.followed": "Cualquier usuario seguido",
+  "lists.replies_policy.list": "Miembros de la lista",
+  "lists.replies_policy.none": "Nadie",
   "lists.replies_policy.title": "Mostrar respuestas a:",
   "lists.search": "Buscar entre la gente a la que sigues",
   "lists.subheading": "Tus listas",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Resultados de la votación",
   "notifications.filter.statuses": "Actualizaciones de gente a la que sigues",
+  "notifications.grant_permission": "Conceder permiso.",
   "notifications.group": "{count} notificaciones",
   "notifications.mark_as_read": "Marcar todas las notificaciones como leídas",
   "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.",
   "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente",
+  "notifications.permission_required": "Las notificaciones de escritorio no están disponibles porque no se ha concedido el permiso requerido.",
   "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio",
   "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.",
   "notifications_permission_banner.title": "Nunca te pierdas nada",
@@ -390,7 +392,7 @@
   "status.admin_account": "Abrir interfaz de moderación para @{name}",
   "status.admin_status": "Abrir este estado en la interfaz de moderación",
   "status.block": "Bloquear a @{name}",
-  "status.bookmark": "Marcador",
+  "status.bookmark": "Añadir marcador",
   "status.cancel_reblog_private": "Eliminar retoot",
   "status.cannot_reblog": "Este toot no puede retootearse",
   "status.copy": "Copiar enlace al estado",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 4e42fb999..54f4159fe 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Otsitulemused",
   "emoji_button.symbols": "Sümbolid",
   "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.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Järgmine",
   "lightbox.previous": "Eelmine",
-  "lightbox.view_context": "Vaata konteksti",
   "lists.account.add": "Lisa nimistusse",
   "lists.account.remove": "Eemalda nimistust",
   "lists.delete": "Kustuta nimistu",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Muuda pealkiri",
   "lists.new.create": "Lisa nimistu",
   "lists.new.title_placeholder": "Uus nimistu pealkiri",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Otsi Teie poolt jälgitavate inimese hulgast",
   "lists.subheading": "Teie nimistud",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Mainimised",
   "notifications.filter.polls": "Küsitluse tulemused",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} teated",
   "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",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 5139d83aa..80119dc00 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Bilaketaren emaitzak",
   "emoji_button.symbols": "Sinboloak",
   "emoji_button.travel": "Bidaiak eta tokiak",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ez dago tootik hemen!",
   "empty_column.account_unavailable": "Profila ez dago eskuragarri",
   "empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Hurrengoa",
   "lightbox.previous": "Aurrekoa",
-  "lightbox.view_context": "Ikusi testuingurua",
   "lists.account.add": "Gehitu zerrendara",
   "lists.account.remove": "Kendu zerrendatik",
   "lists.delete": "Ezabatu zerrenda",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Aldatu izenburua",
   "lists.new.create": "Gehitu zerrenda",
   "lists.new.title_placeholder": "Zerrenda berriaren izena",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Bilatu jarraitzen dituzun pertsonen artean",
   "lists.subheading": "Zure zerrendak",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Aipamenak",
   "notifications.filter.polls": "Inkestaren emaitza",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} jakinarazpen",
   "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",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 44c936142..b062ec18b 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -81,7 +81,7 @@
   "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": "این بوق تنها به کاربرانی که از آن‌ها نام برده شده فرستاده خواهد شد.",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "نتایج جستجو",
   "emoji_button.symbols": "نمادها",
   "emoji_button.travel": "سفر و مکان",
+  "empty_column.account_suspended": "حساب معلق شد",
   "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!",
   "empty_column.account_unavailable": "نمایهٔ موجود نیست",
   "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.",
@@ -254,11 +255,10 @@
   "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": "قبلی",
-  "lightbox.view_context": "نمایش گفتگو",
   "lists.account.add": "افزودن به فهرست",
   "lists.account.remove": "برداشتن از فهرست",
   "lists.delete": "حذف فهرست",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "تغییر عنوان",
   "lists.new.create": "افزودن فهرست",
   "lists.new.title_placeholder": "عنوان فهرست تازه",
-  "lists.replies_policy.all_replies": "هر کاربر پی‌گیری‌شده",
-  "lists.replies_policy.list_replies": "اعضای فهرست",
-  "lists.replies_policy.no_replies": "هیچ‌کس",
+  "lists.replies_policy.followed": "هر کاربر پیگرفته",
+  "lists.replies_policy.list": "اعضای فهرست",
+  "lists.replies_policy.none": "هیچ کدام",
   "lists.replies_policy.title": "نمایش پاسخ‌ها به:",
   "lists.search": "بین کسانی که پی می‌گیرید بگردید",
   "lists.subheading": "فهرست‌های شما",
@@ -334,12 +334,14 @@
   "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": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.how_to_control": "اگر می‌خواهید حتی زمانی که ماستودون باز نیست اعلان‌ها نمایش یابند، اعلان‌های میزکار را فعال کنید. به محض فعال شدن از طریق دکمه {icon} بالا می‌توانید به دقت کنترل کنید که چه نوع از تعامل‌ها باعث صادر شدن اعلان‌ها شوند.",
   "notifications_permission_banner.title": "هرگز چیزی را از دست ندهید",
   "picture_in_picture.restore": "برگرداندن",
   "poll.closed": "پایان‌یافته",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 21e0290b7..28ff603e9 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Hakutulokset",
   "emoji_button.symbols": "Symbolit",
   "emoji_button.travel": "Matkailu",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ei ole 'toots' täällä!",
   "empty_column.account_unavailable": "Profiilia ei löydy",
   "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Seuraava",
   "lightbox.previous": "Edellinen",
-  "lightbox.view_context": "Näytä kontekstissa",
   "lists.account.add": "Lisää listaan",
   "lists.account.remove": "Poista listasta",
   "lists.delete": "Poista lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Vaihda otsikko",
   "lists.new.create": "Lisää lista",
   "lists.new.title_placeholder": "Uuden listan nimi",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Etsi seuraamistasi henkilöistä",
   "lists.subheading": "Omat listat",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Maininnat",
   "notifications.filter.polls": "Kyselyn tulokset",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} ilmoitusta",
   "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",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 5c4b386bc..8eedb8d85 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Résultats de la recherche",
   "emoji_button.symbols": "Symboles",
   "emoji_button.travel": "Lieux & Voyages",
+  "empty_column.account_suspended": "Compte suspendu",
   "empty_column.account_timeline": "Aucun pouet ici !",
   "empty_column.account_unavailable": "Profil non disponible",
   "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Agrandir la fenêtre de visualisation des images",
   "lightbox.next": "Suivant",
   "lightbox.previous": "Précédent",
-  "lightbox.view_context": "Voir le contexte",
   "lists.account.add": "Ajouter à la liste",
   "lists.account.remove": "Supprimer de la liste",
   "lists.delete": "Supprimer la liste",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Modifier le titre",
   "lists.new.create": "Ajouter une liste",
   "lists.new.title_placeholder": "Titre de la nouvelle liste",
-  "lists.replies_policy.all_replies": "N’importe quel·le utilisateur·rice suivi·e",
-  "lists.replies_policy.list_replies": "Membres de la liste",
-  "lists.replies_policy.no_replies": "Personne",
+  "lists.replies_policy.followed": "N’importe quel·le utilisateur·rice suivi·e",
+  "lists.replies_policy.list": "Membres de la liste",
+  "lists.replies_policy.none": "Personne",
   "lists.replies_policy.title": "Afficher les réponses à :",
   "lists.search": "Rechercher parmi les gens que vous suivez",
   "lists.subheading": "Vos listes",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Résultats des sondages",
   "notifications.filter.statuses": "Mises à jour des personnes que vous suivez",
+  "notifications.grant_permission": "Accorder l’autorisation.",
   "notifications.group": "{count} notifications",
   "notifications.mark_as_read": "Marquer toutes les notifications comme lues",
   "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.",
   "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant",
+  "notifications.permission_required": "Les notifications de bureau ne sont pas disponibles car l’autorisation requise n’a pas été accordée.",
   "notifications_permission_banner.enable": "Activer les notifications de bureau",
   "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.",
   "notifications_permission_banner.title": "Toujours au courant",
@@ -436,7 +438,7 @@
   "tabs_bar.local_timeline": "Fil public local",
   "tabs_bar.notifications": "Notifications",
   "tabs_bar.search": "Chercher",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} restants",
+  "time_remaining.days": "{number, plural, one {# jour} other {# jours}} restant·s",
   "time_remaining.hours": "{number, plural, one {# heure} other {# heures}} restantes",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} restantes",
   "time_remaining.moments": "Encore quelques instants",
@@ -448,7 +450,7 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} personne en parle} other {{counter} personnes en parlent}}",
   "trends.trending_now": "Tendance en ce moment",
   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
-  "units.short.billion": "{count}B",
+  "units.short.billion": "{count}Md",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Glissez et déposez pour envoyer",
@@ -468,7 +470,7 @@
   "upload_modal.detect_text": "Détecter le texte de l’image",
   "upload_modal.edit_media": "Modifier le média",
   "upload_modal.hint": "Cliquez ou faites glisser le cercle sur l’aperçu pour choisir le point focal qui sera toujours visible sur toutes les miniatures.",
-  "upload_modal.preparing_ocr": "Préparation de OCR…",
+  "upload_modal.preparing_ocr": "Préparation de l’OCR…",
   "upload_modal.preview_label": "Aperçu ({ratio})",
   "upload_progress.label": "Envoi en cours…",
   "video.close": "Fermer la vidéo",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 22230ab73..928742dd7 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 6fe22e1d4..854e31554 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultados da procura",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viaxes e Lugares",
+  "empty_column.account_suspended": "Conta suspendida",
   "empty_column.account_timeline": "Non hai toots aquí!",
   "empty_column.account_unavailable": "Perfil non dispoñible",
   "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expandir a caixa de vista da imaxe",
   "lightbox.next": "Seguinte",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ollar contexto",
   "lists.account.add": "Engadir á listaxe",
   "lists.account.remove": "Eliminar da listaxe",
   "lists.delete": "Eliminar listaxe",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Mudar o título",
   "lists.new.create": "Engadir listaxe",
   "lists.new.title_placeholder": "Título da nova listaxe",
-  "lists.replies_policy.all_replies": "Calquera usuaria á que segues",
-  "lists.replies_policy.list_replies": "Membros da lista",
-  "lists.replies_policy.no_replies": "Ninguén",
+  "lists.replies_policy.followed": "Toda usuaria seguida",
+  "lists.replies_policy.list": "Membros da lista",
+  "lists.replies_policy.none": "Ninguén",
   "lists.replies_policy.title": "Mostrar respostas a:",
   "lists.search": "Procurar entre as persoas que segues",
   "lists.subheading": "As túas listaxes",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Mencións",
   "notifications.filter.polls": "Resultados da enquisa",
   "notifications.filter.statuses": "Actualizacións de xente á que segues",
+  "notifications.grant_permission": "Conceder permiso.",
   "notifications.group": "{count} notificacións",
   "notifications.mark_as_read": "Marcar todas as notificacións como lidas",
   "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso",
   "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente",
+  "notifications.permission_required": "As notificacións de escritorio non están dispoñibles porque non se concedeu o permiso necesario.",
   "notifications_permission_banner.enable": "Activar notificacións de escritorio",
   "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións que crean as notificacións de escritorio a través da {icon} superior unha vez están activadas.",
   "notifications_permission_banner.title": "Non perder nada",
@@ -360,7 +362,7 @@
   "privacy.unlisted.long": "Non publicar nas cronoloxías públicas",
   "privacy.unlisted.short": "Non listado",
   "refresh": "Actualizar",
-  "regeneration_indicator.label": "Cargando…",
+  "regeneration_indicator.label": "Estase a cargar…",
   "regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index cce1f29e7..123b2e855 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "תוצאות חיפוש",
   "emoji_button.symbols": "סמלים",
   "emoji_button.travel": "טיולים ואתרים",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "הלאה",
   "lightbox.previous": "הקודם",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 275cc3eb9..7e0fe4e7a 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "खोज परिणाम",
   "emoji_button.symbols": "प्रतीक",
   "emoji_button.travel": "यात्रा एवं स्थान",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!",
   "empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं",
   "empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "अगला",
   "lightbox.previous": "पिछला",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "सूची से निकालें",
   "lists.delete": "सूची हटाएँ",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "सूची जोड़ें",
   "lists.new.title_placeholder": "नये सूची का शीर्षक",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "आपकी सूचियाँ",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "उल्लेख",
   "notifications.filter.polls": "चुनाव परिणाम",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} सूचनाएँ",
   "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",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index d59e10a89..f1b78eda4 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -134,7 +134,7 @@
   "directory.new_arrivals": "New arrivals",
   "directory.recently_active": "Nedavno aktivni",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
+  "embed.preview": "Evo kako će izgledati:",
   "emoji_button.activity": "Aktivnost",
   "emoji_button.custom": "Prilagođeno",
   "emoji_button.flags": "Zastave",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Rezultati pretraživanja",
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Putovanje i mjesta",
+  "empty_column.account_suspended": "Račun je suspendiran",
   "empty_column.account_timeline": "Ovdje nema tootova!",
   "empty_column.account_unavailable": "Profil nije dostupan",
   "empty_column.blocks": "Još niste blokirali nikoga.",
@@ -164,7 +165,7 @@
   "empty_column.home.public_timeline": "javnu vremensku crtu",
   "empty_column.list": "Na ovoj listi još nema ničega. Kada članovi ove liste objave nove tootove, oni će se pojaviti ovdje.",
   "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.mutes": "Niste utišali nijednog korisnika.",
   "empty_column.notifications": "Još nemate obavijesti. Komunicirajte s drugima kako biste započeli razgovor.",
   "empty_column.public": "Ovdje nema ništa! Napišite nešto javno ili ručno pratite korisnike s drugi poslužitelja da biste ovo popunili",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sljedeće",
   "lightbox.previous": "Prethodno",
-  "lightbox.view_context": "Prikaži kontekst",
   "lists.account.add": "Dodaj na listu",
   "lists.account.remove": "Ukloni s liste",
   "lists.delete": "Izbriši listu",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Promijeni naslov",
   "lists.new.create": "Dodaj listu",
   "lists.new.title_placeholder": "Naziv nove liste",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.followed": "Bilo koji praćeni korisnik",
+  "lists.replies_policy.list": "Članovi liste",
+  "lists.replies_policy.none": "Nitko",
   "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Traži među praćenim ljudima",
   "lists.subheading": "Vaše liste",
@@ -277,10 +277,10 @@
   "media_gallery.toggle_visible": "Sakrij {number, plural, one {sliku} other {slike}}",
   "missing_indicator.label": "Nije pronađeno",
   "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.duration": "Duration",
+  "mute_modal.duration": "Trajanje",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.apps": "Mobilne aplikacije",
   "navigation_bar.blocks": "Blokirani korisnici",
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalna vremenska crta",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Spominjanja",
   "notifications.filter.polls": "Rezultati anketa",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} obavijesti",
-  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.mark_as_read": "Označi sve obavijesti kao pročitane",
   "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",
@@ -382,7 +384,7 @@
   "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
   "search_popout.tips.user": "korisnik",
-  "search_results.accounts": "People",
+  "search_results.accounts": "Ljudi",
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 1c8c06284..a0ae7305c 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Keresési találatok",
   "emoji_button.symbols": "Szimbólumok",
   "emoji_button.travel": "Utazás és Helyek",
+  "empty_column.account_suspended": "Fiók felfüggesztve",
   "empty_column.account_timeline": "Itt nincs tülkölés!",
   "empty_column.account_unavailable": "A profil nem érhető el",
   "empty_column.blocks": "Még senkit sem tiltottál le.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Képnézet kinagyítása",
   "lightbox.next": "Következő",
   "lightbox.previous": "Előző",
-  "lightbox.view_context": "Környezet megtekintése",
   "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",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cím megváltoztatása",
   "lists.new.create": "Lista hozzáadása",
   "lists.new.title_placeholder": "Új lista címe",
-  "lists.replies_policy.all_replies": "Bármely követett felhasználó",
-  "lists.replies_policy.list_replies": "A lista tagjai",
-  "lists.replies_policy.no_replies": "Senki",
+  "lists.replies_policy.followed": "Bármely követett felhasználó",
+  "lists.replies_policy.list": "A lista tagjai",
+  "lists.replies_policy.none": "Senki",
   "lists.replies_policy.title": "Nekik mutassuk a válaszokat:",
   "lists.search": "Keresés a követett személyek között",
   "lists.subheading": "Listáid",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Megemlítések",
   "notifications.filter.polls": "Szavazások eredményei",
   "notifications.filter.statuses": "Frissítések azoktól, akiket követsz",
+  "notifications.grant_permission": "Engedély megadása.",
   "notifications.group": "{count} értesítés",
   "notifications.mark_as_read": "Minden értesítés olvasottnak jelölése",
   "notifications.permission_denied": "Nem tudjuk engedélyezni az asztali értesítéseket, mert az engedélyt megtagadták.",
   "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetőek, mert az engedélyt megtagadták a böngészőben",
+  "notifications.permission_required": "Az asztali értesítések nem elérhetőek, mert a szükséges engedélyt nem adtad meg.",
   "notifications_permission_banner.enable": "Asztali értesítések engedélyezése",
   "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.",
   "notifications_permission_banner.title": "Soha ne mulassz el semmit",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index dd904bfca..4d9d0b63e 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -128,7 +128,7 @@
   "conversation.delete": "Ջնջել խօսակցութիւնը",
   "conversation.mark_as_read": "Նշել որպէս ընթերցուած",
   "conversation.open": "Դիտել խօսակցութիւնը",
-  "conversation.with": "{names}֊երի հետ",
+  "conversation.with": "{names}-ի հետ",
   "directory.federated": "Յայտնի դաշնեզերքից",
   "directory.local": "{domain} տիրոյթից միայն",
   "directory.new_arrivals": "Նորեկներ",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Որոնման արդիւնքներ",
   "emoji_button.symbols": "Նշաններ",
   "emoji_button.travel": "Ուղեւորութիւն եւ տեղանքներ",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Այստեղ թթեր չկա՛ն։",
   "empty_column.account_unavailable": "Անձնական էջը հասանելի չի",
   "empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Հաջորդ",
   "lightbox.previous": "Նախորդ",
-  "lightbox.view_context": "Տեսնել ենթատեքստը",
   "lists.account.add": "Ավելացնել ցանկին",
   "lists.account.remove": "Հանել ցանկից",
   "lists.delete": "Ջնջել ցանկը",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Փոխել վերնագիրը",
   "lists.new.create": "Ավելացնել ցանկ",
   "lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
-  "lists.replies_policy.all_replies": "Ում հետևում եմ",
-  "lists.replies_policy.list_replies": "Ցանկի անդամները",
-  "lists.replies_policy.no_replies": "Ոչ ոք",
+  "lists.replies_policy.followed": "Any followed user",
+  "lists.replies_policy.list": "Members of the list",
+  "lists.replies_policy.none": "Ոչ ոք",
   "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
   "lists.subheading": "Քո ցանկերը",
@@ -334,14 +334,16 @@
   "notifications.filter.mentions": "Նշումները",
   "notifications.filter.polls": "Հարցման արդիւնքները",
   "notifications.filter.statuses": "Updates from people you follow",
+  "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_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": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
+  "picture_in_picture.restore": "Հետ բերել",
   "poll.closed": "Փակ",
   "poll.refresh": "Թարմացնել",
   "poll.total_people": "{count, plural, one {# հոգի} other {# հոգի}}",
@@ -468,7 +470,7 @@
   "upload_modal.detect_text": "Հայտնբերել տեքստը նկարից",
   "upload_modal.edit_media": "Խմբագրել մեդիան",
   "upload_modal.hint": "Սեղմէք եւ տեղաշարժէք նախադիտման շրջանակը՝ որ ընտրէք մանրապատկերում միշտ տեսանելի կէտը։",
-  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preparing_ocr": "Գրաճանաչման նախապատրաստում…",
   "upload_modal.preview_label": "Նախադիտում ({ratio})",
   "upload_progress.label": "Վերբեռնվում է…",
   "video.close": "Փակել  տեսագրութիւնը",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 562d9d038..24f100b6a 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Hasil pencarian",
   "emoji_button.symbols": "Simbol",
   "emoji_button.travel": "Tempat Wisata",
+  "empty_column.account_suspended": "Akun ditangguhkan",
   "empty_column.account_timeline": "Tidak ada toot di sini!",
   "empty_column.account_unavailable": "Profil tidak tersedia",
   "empty_column.blocks": "Anda belum memblokir siapapun.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Besarkan kotak tampilan gambar",
   "lightbox.next": "Selanjutnya",
   "lightbox.previous": "Sebelumnya",
-  "lightbox.view_context": "Lihat konteks",
   "lists.account.add": "Tambah ke daftar",
   "lists.account.remove": "Hapus dari daftar",
   "lists.delete": "Hapus daftar",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Ubah judul",
   "lists.new.create": "Tambah daftar",
   "lists.new.title_placeholder": "Judul daftar baru",
-  "lists.replies_policy.all_replies": "Siapapun pengguna yang diikuti",
-  "lists.replies_policy.list_replies": "Anggota di daftar tersebut",
-  "lists.replies_policy.no_replies": "Tidak ada satu pun",
+  "lists.replies_policy.followed": "Siapapun pengguna yang diikuti",
+  "lists.replies_policy.list": "Anggota di daftar tersebut",
+  "lists.replies_policy.none": "Tidak ada satu pun",
   "lists.replies_policy.title": "Tampilkan balasan ke:",
   "lists.search": "Cari di antara orang yang Anda ikuti",
   "lists.subheading": "Daftar Anda",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Sebutan",
   "notifications.filter.polls": "Hasil japat",
   "notifications.filter.statuses": "Pembaruan dari orang yang Anda ikuti",
+  "notifications.grant_permission": "Setujui izin.",
   "notifications.group": "{count} notifikasi",
   "notifications.mark_as_read": "Tandai setiap notifikasi sebagai sudah dibaca",
   "notifications.permission_denied": "Tidak dapat mengaktifkan notifikasi desktop karena izin ditolak.",
   "notifications.permission_denied_alert": "Notifikasi desktop tidak dapat diaktifkan karena izin peramban telah ditolak sebelumnya",
+  "notifications.permission_required": "Notifikasi desktop tidak tersedia karena izin yang dibutuhkan belum disetujui.",
   "notifications_permission_banner.enable": "Aktifkan notifikasi desktop",
   "notifications_permission_banner.how_to_control": "Untuk menerima notifikasi saat Mastodon terbuka, aktifkan notifikasi desktop. Anda dapat mengendalikan tipe interaksi mana yang ditampilkan notifikasi desktop melalui tombol {icon} di atas saat sudah aktif.",
   "notifications_permission_banner.title": "Jangan lewatkan apapun",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 1528dec69..998799b9f 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 43004bebb..d90156835 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Leitarniðurstöður",
   "emoji_button.symbols": "Tákn",
   "emoji_button.travel": "Ferðalög og staðir",
+  "empty_column.account_suspended": "Notandaaðgangur í bið",
   "empty_column.account_timeline": "Engin tíst hér!",
   "empty_column.account_unavailable": "Notandasnið ekki tiltækt",
   "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Fletta út myndskoðunarreit",
   "lightbox.next": "Næsta",
   "lightbox.previous": "Fyrra",
-  "lightbox.view_context": "Skoða samhengi",
   "lists.account.add": "Bæta á lista",
   "lists.account.remove": "Fjarlægja af lista",
   "lists.delete": "Eyða lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Breyta titli",
   "lists.new.create": "Bæta við lista",
   "lists.new.title_placeholder": "Titill á nýjum lista",
-  "lists.replies_policy.all_replies": "Allra notenda sem fylgst er með",
-  "lists.replies_policy.list_replies": "Meðlima listans",
-  "lists.replies_policy.no_replies": "Engra",
+  "lists.replies_policy.followed": "Allra notenda sem fylgst er með",
+  "lists.replies_policy.list": "Meðlima listans",
+  "lists.replies_policy.none": "Engra",
   "lists.replies_policy.title": "Sýna svör til:",
   "lists.search": "Leita meðal þeirra sem þú fylgist með",
   "lists.subheading": "Listarnir þínir",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Tilvísanir",
   "notifications.filter.polls": "Niðurstöður könnunar",
   "notifications.filter.statuses": "Uppfærslur frá fólki sem þú fylgist með",
+  "notifications.grant_permission": "Veita heimild.",
   "notifications.group": "{count} tilkynningar",
   "notifications.mark_as_read": "Merkja allar tilkynningar sem lesnar",
   "notifications.permission_denied": "Tilkynningar á skjáborði eru ekki aðgengilegar megna áður hafnaðra beiðna fyrir vafra",
   "notifications.permission_denied_alert": "Ekki var hægt að virkja tilkynningar á skjáborði, þar sem heimildum fyrir vafra var áður hafnað",
+  "notifications.permission_required": "Tilkynningar á skjáborði eru ekki aðgengilegar þar sem nauðsynlegar heimildir hafa ekki verið veittar.",
   "notifications_permission_banner.enable": "Virkja tilkynningar á skjáborði",
   "notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.",
   "notifications_permission_banner.title": "Aldrei missa af neinu",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index c472e098f..b63b231ae 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Risultati della ricerca",
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Viaggi & Luoghi",
+  "empty_column.account_suspended": "Account sospeso",
   "empty_column.account_timeline": "Nessun toot qui!",
   "empty_column.account_unavailable": "Profilo non disponibile",
   "empty_column.blocks": "Non hai ancora bloccato alcun utente.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Espandi casella di visualizzazione immagine",
   "lightbox.next": "Successivo",
   "lightbox.previous": "Precedente",
-  "lightbox.view_context": "Mostra contesto",
   "lists.account.add": "Aggiungi alla lista",
   "lists.account.remove": "Togli dalla lista",
   "lists.delete": "Elimina lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cambia titolo",
   "lists.new.create": "Aggiungi lista",
   "lists.new.title_placeholder": "Titolo della nuova lista",
-  "lists.replies_policy.all_replies": "Qualsiasi utente seguito",
-  "lists.replies_policy.list_replies": "Iscritti alla lista",
-  "lists.replies_policy.no_replies": "Nessuno",
+  "lists.replies_policy.followed": "Qualsiasi utente seguito",
+  "lists.replies_policy.list": "Iscritti alla lista",
+  "lists.replies_policy.none": "Nessuno",
   "lists.replies_policy.title": "Mostra risposte a:",
   "lists.search": "Cerca tra le persone che segui",
   "lists.subheading": "Le tue liste",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menzioni",
   "notifications.filter.polls": "Risultati del sondaggio",
   "notifications.filter.statuses": "Aggiornamenti dalle persone che segui",
+  "notifications.grant_permission": "Dai il permesso.",
   "notifications.group": "{count} notifiche",
   "notifications.mark_as_read": "Segna tutte le notifiche come lette",
   "notifications.permission_denied": "Impossibile abilitare le notifiche sul desktop perché il permesso è stato negato.",
   "notifications.permission_denied_alert": "Le notifiche sul desktop non possono essere abilitate, poiché il permesso nel browser è stato negato in precedenza",
+  "notifications.permission_required": "Le notifiche desktop non sono disponibili perché l'autorizzazione richiesta non è stata concessa.",
   "notifications_permission_banner.enable": "Abilita le notifiche sul desktop",
   "notifications_permission_banner.how_to_control": "Per ricevere notifiche quando Mastodon non è aperto, abilita le notifiche desktop. Puoi controllare con precisione quali tipi di interazioni generano notifiche desktop tramite il pulsante {icon} qui sopra, dopo averle abilitate.",
   "notifications_permission_banner.title": "Non perderti mai nulla",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index a97400bdf..e4334ccc4 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -153,6 +153,7 @@
   "emoji_button.search_results": "検索結果",
   "emoji_button.symbols": "記号",
   "emoji_button.travel": "旅行と場所",
+  "empty_column.account_suspended": "アカウントは停止されています",
   "empty_column.account_timeline": "トゥートがありません!",
   "empty_column.account_unavailable": "プロフィールは利用できません",
   "empty_column.blocks": "まだ誰もブロックしていません。",
@@ -258,11 +259,10 @@
   "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": "前",
-  "lightbox.view_context": "トゥートを表示",
   "lists.account.add": "リストに追加",
   "lists.account.remove": "リストから外す",
   "lists.delete": "リストを削除",
@@ -270,9 +270,9 @@
   "lists.edit.submit": "タイトルを変更",
   "lists.new.create": "リストを作成",
   "lists.new.title_placeholder": "新規リスト名",
-  "lists.replies_policy.all_replies": "フォロー中のユーザー全員",
-  "lists.replies_policy.list_replies": "リストのメンバー",
-  "lists.replies_policy.no_replies": "表示しない",
+  "lists.replies_policy.followed": "フォロー中のユーザー全員",
+  "lists.replies_policy.list": "リストのメンバー",
+  "lists.replies_policy.none": "表示しない",
   "lists.replies_policy.title": "リプライを表示:",
   "lists.search": "フォローしている人の中から検索",
   "lists.subheading": "あなたのリスト",
@@ -339,10 +339,12 @@
   "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": "Mastodon を閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。",
   "notifications_permission_banner.title": "お見逃しなく",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 6a0b47fdc..ad3b1b033 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "ძებნის შედეგები",
   "emoji_button.symbols": "სიმბოლოები",
   "emoji_button.travel": "მოგზაურობა და ადგილები",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "შემდეგი",
   "lightbox.previous": "წინა",
-  "lightbox.view_context": "View context",
   "lists.account.add": "სიაში დამატება",
   "lists.account.remove": "სიიდან ამოშლა",
   "lists.delete": "სიის წაშლა",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "სიის დამატება",
   "lists.new.title_placeholder": "ახალი სიის სათაური",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით",
   "lists.subheading": "თქვენი სიები",
@@ -334,10 +334,12 @@
   "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.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",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 261d003aa..cf9860f1e 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Igemmaḍ n unadi",
   "emoji_button.symbols": "Izamulen",
   "emoji_button.travel": "Imeḍqan d Yinigen",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ulac tijewwaqin dagi!",
   "empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi",
   "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
   "lightbox.next": "Γer zdat",
   "lightbox.previous": "Γer deffir",
-  "lightbox.view_context": "Ẓer amnaḍ",
   "lists.account.add": "Rnu ɣer tebdart",
   "lists.account.remove": "Kkes seg tebdart",
   "lists.delete": "Kkes tabdart",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Beddel azwel",
   "lists.new.create": "Rnu tabdart",
   "lists.new.title_placeholder": "Azwel amaynut n tebdart",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "Ula yiwen",
+  "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": "Ssken-d tiririyin i:",
   "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ",
   "lists.subheading": "Tibdarin-ik·im",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Abdar",
   "notifications.filter.polls": "Igemmaḍ n usenqed",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} n tilɣa",
   "notifications.mark_as_read": "Mark every notification as read",
   "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.",
   "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",
@@ -468,7 +470,7 @@
   "upload_modal.detect_text": "Sefru-d aḍris seg tugna",
   "upload_modal.edit_media": "Ẓreg taɣwalt",
   "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.preparing_ocr": "Aheyyi n OCR…",
   "upload_modal.preview_label": "Taskant ({ratio})",
   "upload_progress.label": "Asali iteddu...",
   "video.close": "Mdel tabidyutt",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index a2c0856e5..04a0f9140 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Іздеу нәтижелері",
   "emoji_button.symbols": "Таңбалар",
   "emoji_button.travel": "Саяхат",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Жазба жоқ ешқандай!",
   "empty_column.account_unavailable": "Профиль қолжетімді емес",
   "empty_column.blocks": "Ешкімді бұғаттамағансыз.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Келесі",
   "lightbox.previous": "Алдыңғы",
-  "lightbox.view_context": "Контексті көрсет",
   "lists.account.add": "Тізімге қосу",
   "lists.account.remove": "Тізімнен шығару",
   "lists.delete": "Тізімді өшіру",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Тақырыбын өзгерту",
   "lists.new.create": "Тізім құру",
   "lists.new.title_placeholder": "Жаңа тізім аты",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Сіз іздеген адамдар арасында іздеу",
   "lists.subheading": "Тізімдеріңіз",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Аталымдар",
   "notifications.filter.polls": "Сауалнама нәтижелері",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} ескертпе",
   "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",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 0f6c71fb9..a5025bb72 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 24539248a..10f7eabcf 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "검색 결과",
   "emoji_button.symbols": "기호",
   "emoji_button.travel": "여행과 장소",
+  "empty_column.account_suspended": "계정 정지됨",
   "empty_column.account_timeline": "여긴 툿이 없어요!",
   "empty_column.account_unavailable": "프로필 사용 불가",
   "empty_column.blocks": "아직 아무도 차단하지 않았습니다.",
@@ -254,11 +255,10 @@
   "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": "이전",
-  "lightbox.view_context": "게시물 보기",
   "lists.account.add": "리스트에 추가",
   "lists.account.remove": "리스트에서 제거",
   "lists.delete": "리스트 삭제",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "제목 수정",
   "lists.new.create": "리스트 추가",
   "lists.new.title_placeholder": "새 리스트의 이름",
-  "lists.replies_policy.all_replies": "팔로우 한 사용자 누구나",
-  "lists.replies_policy.list_replies": "목록의 멤버들",
-  "lists.replies_policy.no_replies": "아무도 없음",
+  "lists.replies_policy.followed": "팔로우 한 사용자 누구나",
+  "lists.replies_policy.list": "리스트의 구성원들",
+  "lists.replies_policy.none": "아무도 없음",
   "lists.replies_policy.title": "답글 표시:",
   "lists.search": "팔로우 중인 사람들 중에서 찾기",
   "lists.subheading": "당신의 리스트",
@@ -334,10 +334,12 @@
   "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": "아무것도 놓치지 마세요",
@@ -448,9 +450,9 @@
   "trends.counter_by_accounts": "{counter} 명이 말하는 중",
   "trends.trending_now": "지금 유행중",
   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
-  "units.short.billion": "{count}십억",
-  "units.short.million": "{count}백만",
-  "units.short.thousand": "{count}천",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}B",
+  "units.short.thousand": "{count}K",
   "upload_area.title": "드래그 & 드롭으로 업로드",
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "파일 업로드 제한에 도달했습니다.",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index b40a15669..3c359d222 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "تێبینیتێبینی",
+  "account.account_note_header": "تێبینی    ",
   "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
   "account.badges.bot": "بوت",
   "account.badges.group": "گرووپ",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "ئەنجامەکانی گەڕان",
   "emoji_button.symbols": "هێماکان",
   "emoji_button.travel": "گەشت & شوێنەکان",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "لێرە هیچ توتەک نییە!",
   "empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
   "empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
@@ -254,11 +255,10 @@
   "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": "پێشوو",
-  "lightbox.view_context": "پێشاندانی دەق",
   "lists.account.add": "زیادکردن بۆ لیست",
   "lists.account.remove": "لابردن لە لیست",
   "lists.delete": "سڕینەوەی لیست",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "گۆڕینی ناونیشان",
   "lists.new.create": "زیادکردنی لیست",
   "lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
-  "lists.replies_policy.all_replies": "هەربەکارهێنەرێکی شوێنکەوتوو",
-  "lists.replies_policy.list_replies": "ئەندامانی لیستەکە",
-  "lists.replies_policy.no_replies": "هیچکەس",
+  "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": "پیشاندانی وەڵامەکان بۆ:",
   "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
   "lists.subheading": "لیستەکانت",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "ئاماژەکان",
   "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
   "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
+  "notifications.grant_permission": "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_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
   "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
   "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 6141f321e..46dc0975d 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 061ab2a83..f075731fe 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Meklēšanas rezultāti",
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Ceļošana & Vietas",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Šeit ziņojumu nav!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "Tu neesi vēl nevienu bloķējis.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index b640b8c66..6dac40e8b 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Резултати од барање",
   "emoji_button.symbols": "Симболи",
   "emoji_button.travel": "Патувања и Места",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Недостапен профил",
   "empty_column.blocks": "Немате сеуште блокирано корисници.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Спомнувања",
   "notifications.filter.polls": "Резултати од анкета",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} нотификации",
   "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",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 08c3cacd0..97b4ec401 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -2,17 +2,17 @@
   "account.account_note_header": "കുറിപ്പ്",
   "account.add_or_remove_from_list": "പട്ടികയിൽ ചേർക്കുകയോ അല്ലെങ്കിൽ മാറ്റുകയോ ചെയ്യുക",
   "account.badges.bot": "റോബോട്ട്",
-  "account.badges.group": "കൂട്ടം",
-  "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
+  "account.badges.group": "ഗ്രൂപ്പ്",
+  "account.block": "@{name} -നെ തടയുക",
   "account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
   "account.blocked": "തടഞ്ഞു",
   "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": "പിന്തുടരുന്നവർ",
@@ -67,7 +67,7 @@
   "column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ",
   "column.favourites": "പ്രിയപ്പെട്ടവ",
   "column.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ",
-  "column.home": "ഭവനം",
+  "column.home": "ഹോം",
   "column.lists": "പട്ടികകൾ",
   "column.mutes": "നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ",
   "column.notifications": "അറിയിപ്പുകൾ",
@@ -105,17 +105,17 @@
   "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല",
   "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക",
   "confirmation_modal.cancel": "റദ്ദാക്കുക",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "തടയുകയും റിപ്പോർട്ടും ചെയ്യുക",
   "confirmations.block.confirm": "തടയുക",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.block.message": "{name} തടയാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
   "confirmations.delete.confirm": "മായ്ക്കുക",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete.message": "ഈ ടൂട്ട് ഇല്ലാതാക്കണം എന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?",
   "confirmations.delete_list.confirm": "മായ്ക്കുക",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.delete_list.message": "ഈ പട്ടിക എന്നെന്നേക്കുമായി നീക്കം ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
+  "confirmations.domain_block.confirm": "മുഴുവൻ ഡൊമെയ്‌നും തടയുക",
   "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": "പുറത്തുകടക്കുക",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "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.message": "Are you sure you want to mute {name}?",
@@ -133,7 +133,7 @@
   "directory.local": "{domain} ൽ നിന്ന് മാത്രം",
   "directory.new_arrivals": "പുതിയ വരവുകൾ",
   "directory.recently_active": "അടുത്തിടെയായി സജീവമായ",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.instructions": "ചുവടെയുള്ള കോഡ് പകർത്തിക്കൊണ്ട് നിങ്ങളുടെ വെബ്‌സൈറ്റിൽ ഈ ടൂട്ട് ഉൾച്ചേർക്കുക.",
   "embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:",
   "emoji_button.activity": "പ്രവര്‍ത്തനം",
   "emoji_button.custom": "സ്വന്തമായ ഭേദഗതി",
@@ -141,7 +141,7 @@
   "emoji_button.food": "ഭക്ഷണവും പാനീയവും",
   "emoji_button.label": "ഇമോജി ചേർക്കുക",
   "emoji_button.nature": "പ്രകൃതി",
-  "emoji_button.not_found": "എമോജി പാടില്ല (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "ഇമോജി പാടില്ല (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "വസ്തുക്കൾ",
   "emoji_button.people": "ആളുകൾ",
   "emoji_button.recent": "അടിക്കടി ഉപയോഗിക്കുന്നവ",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "തിരച്ചിൽ ഫലങ്ങൾ",
   "emoji_button.symbols": "ചിഹ്നങ്ങൾ",
   "emoji_button.travel": "യാത്രയും സ്ഥലങ്ങളും",
+  "empty_column.account_suspended": "അക്കൗണ്ട് താൽക്കാലികമായി നിർത്തിവച്ചു",
   "empty_column.account_timeline": "ഇവിടെ ടൂട്ടുകൾ ഇല്ല!",
   "empty_column.account_unavailable": "പ്രൊഫൈൽ ലഭ്യമല്ല",
   "empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.",
@@ -159,7 +160,7 @@
   "empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
   "empty_column.favourites": "ഇതുവരെ ആരും ഈ ടൂട്ട് പ്രിയപ്പെട്ടതായി അടയാളപ്പെടുത്തിയിട്ടില്ല. ആരെങ്കിലും അങ്ങനെ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
   "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.hashtag": "ഈ ഹാഷ്‌ടാഗിൽ ഇതുവരെ ഒന്നുമില്ല.",
   "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
   "empty_column.home.public_timeline": "പൊതു സമയരേഖ",
   "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
@@ -178,7 +179,7 @@
   "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": "സംരക്ഷിച്ചു",
   "getting_started.developers": "വികസിപ്പിക്കുന്നവർ",
-  "getting_started.directory": "രൂപരേഖ നാമഗൃഹസൂചി",
+  "getting_started.directory": "പ്രൊഫൈൽ ഡയറക്ടറി",
   "getting_started.documentation": "രേഖാ സമാഹരണം",
   "getting_started.heading": "തുടക്കം കുറിക്കുക",
   "getting_started.invite": "ആളുകളെ ക്ഷണിക്കുക",
@@ -189,7 +190,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": "ഇതിലൊന്നുമല്ല",
@@ -205,7 +206,7 @@
   "introduction.federation.action": "അടുത്തത്",
   "introduction.federation.federated.headline": "സംയുക്തമാക്കിയ",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "ഭവനം",
+  "introduction.federation.home.headline": "ഹോം",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
   "introduction.federation.local.headline": "പ്രാദേശികം",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
@@ -232,17 +233,17 @@
   "keyboard_shortcuts.favourites": "to open favourites list",
   "keyboard_shortcuts.federated": "to open federated timeline",
   "keyboard_shortcuts.heading": "കീബോർഡ് എളുപ്പവഴികൾ",
-  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.home": "ഹോം ടൈംലൈൻ തുറക്കുന്നതിന്",
   "keyboard_shortcuts.hotkey": "Hotkey",
   "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.local": "പ്രാദേശിക സമയരേഖ തുറക്കാൻ",
   "keyboard_shortcuts.mention": "to mention author",
   "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.my_profile": "നിങ്ങളുടെ പ്രൊഫൈൽ തുറക്കാൻ",
   "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.open_media": "മീഡിയ തുറക്കാൻ",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.profile": "രചയിതാവിന്റെ പ്രൊഫൈൽ തുറക്കുന്നതിന്",
   "keyboard_shortcuts.reply": "മറുപടി അയക്കാൻ",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "അടുത്തത്",
   "lightbox.previous": "പുറകോട്ട്",
-  "lightbox.view_context": "View context",
   "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക",
   "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക",
   "lists.delete": "പട്ടിക ഒഴിവാക്കുക",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "തലക്കെട്ട് മാറ്റുക",
   "lists.new.create": "പുതിയ പട്ടിക ചേർക്കുക",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.followed": "Any followed user",
+  "lists.replies_policy.list": "Members of the list",
+  "lists.replies_policy.none": "ആരുമില്ല",
   "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "എന്റെ പട്ടികകൾ",
@@ -277,206 +277,208 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "കാണാനില്ല",
   "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.duration": "Duration",
+  "mute_modal.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": "അടയാളങ്ങൾ",
-  "navigation_bar.community_timeline": "Local timeline",
+  "mute_modal.indefinite": "അനിശ്ചിതകാല",
+  "navigation_bar.apps": "മൊബൈൽ ആപ്പുകൾ",
+  "navigation_bar.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
+  "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ",
+  "navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ",
   "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
+  "navigation_bar.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ",
+  "navigation_bar.discover": "കണ്ടെത്തുക",
   "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
+  "navigation_bar.favourites": "പ്രിയപ്പെട്ടവ",
   "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ",
   "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "About this server",
+  "navigation_bar.info": "ഈ സെർവറിനെക്കുറിച്ച്",
   "navigation_bar.keyboard_shortcuts": "Hotkeys",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
-  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.lists": "ലിസ്റ്റുകൾ",
+  "navigation_bar.logout": "ലോഗൗട്ട്",
+  "navigation_bar.mutes": "നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ",
   "navigation_bar.personal": "Personal",
   "navigation_bar.pins": "Pinned toots",
-  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.preferences": "ക്രമീകരണങ്ങൾ",
   "navigation_bar.public_timeline": "Federated timeline",
-  "navigation_bar.security": "Security",
+  "navigation_bar.security": "സുരക്ഷ",
   "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
+  "notification.follow": "{name} നിങ്ങളെ പിന്തുടർന്നു",
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
-  "notification.own_poll": "Your poll has ended",
+  "notification.own_poll": "നിങ്ങളുടെ പോൾ അവസാനിച്ചു",
   "notification.poll": "A poll you have voted in has ended",
-  "notification.reblog": "{name} boosted your status",
-  "notification.status": "{name} just posted",
-  "notifications.clear": "Clear notifications",
+  "notification.reblog": "{name} നിങ്ങളുടെ പോസ്റ്റ് ബൂസ്റ്റ് ചെയ്തു",
+  "notification.status": "{name} ഇപ്പോൾ പോസ്റ്റുചെയ്‌തു",
+  "notifications.clear": "അറിയിപ്പ് മായ്ക്കുക",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
-  "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ",
+  "notifications.column_settings.favourite": "പ്രിയപ്പെട്ടവ:",
+  "notifications.column_settings.filter_bar.advanced": "എല്ലാ വിഭാഗങ്ങളും പ്രദർശിപ്പിക്കുക",
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.show": "കാണിക്കുക",
   "notifications.column_settings.follow": "New followers:",
-  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.follow_request": "പുതിയ പിന്തുടരൽ അഭ്യർത്ഥനകൾ:",
   "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.poll": "പോൾ ഫലങ്ങൾ:",
   "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.reblog": "ബൂസ്റ്റുകൾ:",
   "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.column_settings.status": "New toots:",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
+  "notifications.column_settings.sound": "ശബ്ദം പ്ലേ ചെയ്യുക",
+  "notifications.column_settings.status": "പുതിയ ടൂട്ടുകൾ:",
+  "notifications.filter.all": "എല്ലാം",
+  "notifications.filter.boosts": "ബൂസ്റ്റുകൾ",
+  "notifications.filter.favourites": "പ്രിയപ്പെട്ടവ",
+  "notifications.filter.follows": "പിന്തുടരുന്നു",
   "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.filter.statuses": "Updates from people you follow",
-  "notifications.group": "{count} notifications",
-  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.filter.polls": "പോൾ ഫലങ്ങൾ",
+  "notifications.filter.statuses": "നിങ്ങൾ പിന്തുടരുന്ന ആളുകളിൽ നിന്നുള്ള അപ്‌ഡേറ്റുകൾ",
+  "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_banner.enable": "Enable desktop notifications",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "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": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "picture_in_picture.restore": "തിരികെ വയ്ക്കുക",
+  "poll.closed": "അടച്ചു",
+  "poll.refresh": "പുതുക്കുക",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
+  "poll.vote": "വോട്ട് ചെയ്യുക",
   "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "ഒരു പോൾ ചേർക്കുക",
+  "poll_button.remove_poll": "പോൾ നീക്കംചെയ്യുക",
   "privacy.change": "Adjust status privacy",
   "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "നേരിട്ട്",
   "privacy.private.long": "Post to followers only",
   "privacy.private.short": "Followers-only",
   "privacy.public.long": "Post to public timelines",
   "privacy.public.short": "Public",
   "privacy.unlisted.long": "Do not show in public timelines",
   "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "refresh": "പുതുക്കുക",
+  "regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…",
+  "regeneration_indicator.sublabel": "നിങ്ങളുടെ ഹോം ഫീഡ് തയാറാക്കുന്നു!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "ഇപ്പോൾ",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "relative_time.today": "today",
-  "reply_indicator.cancel": "Cancel",
+  "relative_time.today": "ഇന്ന്",
+  "reply_indicator.cancel": "റദ്ദാക്കുക",
   "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.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
+  "report.placeholder": "കൂടുതൽ അഭിപ്രായങ്ങൾ",
+  "report.submit": "സമർപ്പിക്കുക",
   "report.target": "Report {target}",
-  "search.placeholder": "Search",
+  "search.placeholder": "തിരയുക",
   "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.hashtag": "ഹാഷ്ടാഗ്",
+  "search_popout.tips.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.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
+  "search_popout.tips.user": "ഉപയോക്താവ്",
+  "search_results.accounts": "ആളുകൾ",
+  "search_results.hashtags": "ഹാഷ്ടാഗുകൾ",
+  "search_results.statuses": "ടൂട്ടുകൾ",
   "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 {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.block": "@{name} -നെ തടയുക",
+  "status.bookmark": "ബുക്ക്മാർക്ക്",
   "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
+  "status.cannot_reblog": "ഈ പോസ്റ്റ് ബൂസ്റ്ചെയ്യാൻ കഴിയില്ല",
+  "status.copy": "ടൂട്ടിലേക്ക് ലിങ്ക് പകർത്തുക",
   "status.delete": "മായ്ക്കുക",
   "status.detailed_status": "വിശദമായ സംഭാഷണ കാഴ്‌ച",
   "status.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
   "status.embed": "ഉൾച്ചേർക്കുക",
   "status.favourite": "പ്രിയപ്പെട്ടത്",
-  "status.filtered": "Filtered",
+  "status.filtered": "ഫിൽട്ടർ ചെയ്‌തു",
   "status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക",
-  "status.media_hidden": "Media hidden",
+  "status.media_hidden": "മീഡിയ മറച്ചു",
   "status.mention": "@{name} സൂചിപ്പിക്കുക",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
+  "status.more": "കൂടുതൽ",
+  "status.mute": "@{name}-നെ നിശ്ശബ്ദമാക്കുക",
   "status.mute_conversation": "Mute conversation",
   "status.open": "Expand this status",
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
-  "status.reblog": "Boost",
+  "status.read_more": "കൂടുതൽ വായിക്കുക",
+  "status.reblog": "ബൂസ്റ്റ്",
   "status.reblog_private": "Boost with original visibility",
-  "status.reblogged_by": "{name} boosted",
+  "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.reply": "Reply",
+  "status.redraft": "ഇല്ലാതാക്കുക & വീണ്ടും ഡ്രാഫ്റ്റ് ചെയ്യുക",
+  "status.remove_bookmark": "ബുക്ക്മാർക്ക് നീക്കംചെയ്യുക",
+  "status.reply": "മറുപടി",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
   "status.sensitive_warning": "Sensitive content",
-  "status.share": "Share",
-  "status.show_less": "Show less",
+  "status.share": "പങ്കിടുക",
+  "status.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_more": "കൂടുതകൽ കാണിക്കുക",
+  "status.show_more_all": "എല്ലാവർക്കുമായി കൂടുതൽ കാണിക്കുക",
   "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "ലഭ്യമല്ല",
   "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",
+  "suggestions.header": "നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടാകാം…",
+  "tabs_bar.federated_timeline": "സംയുക്തമാക്കിയ",
+  "tabs_bar.home": "ഹോം",
+  "tabs_bar.local_timeline": "പ്രാദേശികം",
+  "tabs_bar.notifications": "അറിയിപ്പുകൾ",
+  "tabs_bar.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 toots",
+  "timeline_hint.resources.followers": "പിന്തുടരുന്നവർ",
+  "timeline_hint.resources.follows": "പിന്തുടരുന്നു",
+  "timeline_hint.resources.statuses": "പഴയ ടൂട്ടുകൾ",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Trending now",
+  "trends.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.million": "{count}ദശലക്ഷം",
   "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_area.title": "അപ്‌ലോഡുചെയ്യാൻ വലിച്ചിടുക",
+  "upload_button.label": "ഇമേജുകൾ, ഒരു വീഡിയോ അല്ലെങ്കിൽ ഓഡിയോ ഫയൽ ചേർക്കുക",
+  "upload_error.limit": "ഫയൽ അപ്‌ലോഡ് പരിധി കവിഞ്ഞു.",
   "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.edit": "Edit",
-  "upload_form.thumbnail": "Change thumbnail",
-  "upload_form.undo": "Delete",
+  "upload_form.audio_description": "കേൾവിശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ",
+  "upload_form.description": "കാഴ്ചശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ",
+  "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.choose_image": "Choose image",
+  "upload_modal.apply": "പ്രയോഗിക്കുക",
+  "upload_modal.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.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.close": "വീഡിയോ അടയ്ക്കുക",
+  "video.download": "ഫയൽ ഡൌൺലോഡ് ചെയ്യുക",
   "video.exit_fullscreen": "Exit full screen",
   "video.expand": "Expand video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
+  "video.fullscreen": "പൂർണ്ണ സ്ക്രീൻ",
+  "video.hide": "വീഡിയോ മറയ്ക്കുക",
   "video.mute": "Mute sound",
   "video.pause": "Pause",
   "video.play": "Play",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 33f8cfd84..8559665b9 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index a4006a745..ec992c679 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index acab31394..095114255 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -9,10 +9,10 @@
   "account.browse_more_on_origin_server": "Meer op het originele profiel bekijken",
   "account.cancel_follow_request": "Volgverzoek annuleren",
   "account.direct": "@{name} een direct bericht sturen",
-  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.disable_notifications": "Geef geen melding meer wanneer @{name} toot",
   "account.domain_blocked": "Server verborgen",
   "account.edit_profile": "Profiel bewerken",
-  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.enable_notifications": "Geef een melding wanneer @{name} toot",
   "account.endorse": "Op profiel weergeven",
   "account.follow": "Volgen",
   "account.followers": "Volgers",
@@ -98,9 +98,9 @@
   "compose_form.poll.switch_to_single": "Poll wijzigen om een enkele keuze toe te staan",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Media als gevoelig markeren",
-  "compose_form.sensitive.marked": "Media is als gevoelig gemarkeerd",
-  "compose_form.sensitive.unmarked": "Media is niet als gevoelig gemarkeerd",
+  "compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}",
   "compose_form.spoiler.marked": "Tekst is achter een waarschuwing verborgen",
   "compose_form.spoiler.unmarked": "Tekst is niet verborgen",
   "compose_form.spoiler_placeholder": "Waarschuwingstekst",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Zoekresultaten",
   "emoji_button.symbols": "Symbolen",
   "emoji_button.travel": "Reizen en plekken",
+  "empty_column.account_suspended": "Account opgeschort",
   "empty_column.account_timeline": "Hier zijn geen toots!",
   "empty_column.account_unavailable": "Profiel is niet beschikbaar",
   "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
@@ -168,9 +169,9 @@
   "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.",
   "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen",
   "error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.",
-  "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.explanation_addons": "Deze pagina kon niet correct geladen worden. Deze fout wordt waarschijnlijk door een browser-add-on of een automatische vertalingshulpmiddel veroorzaakt.",
   "error.unexpected_crash.next_steps": "Probeer deze pagina te vernieuwen. Wanneer dit niet helpt is het nog steeds mogelijk om Mastodon in een andere webbrowser of mobiele app te gebruiken.",
-  "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.",
+  "error.unexpected_crash.next_steps_addons": "Probeer deze uit te schakelen en de pagina te verversen. Wanneer dat niet helpt, kun je Mastodon nog altijd met een andere webbrowser of mobiele app gebruiken.",
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
   "errors.unexpected_crash.report_issue": "Technisch probleem melden",
   "follow_request.authorize": "Goedkeuren",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Afbeelding groot weergeven",
   "lightbox.next": "Volgende",
   "lightbox.previous": "Vorige",
-  "lightbox.view_context": "Context tonen",
   "lists.account.add": "Aan lijst toevoegen",
   "lists.account.remove": "Uit lijst verwijderen",
   "lists.delete": "Lijst verwijderen",
@@ -266,10 +266,10 @@
   "lists.edit.submit": "Titel veranderen",
   "lists.new.create": "Lijst toevoegen",
   "lists.new.title_placeholder": "Naam nieuwe lijst",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
-  "lists.replies_policy.title": "Show replies to:",
+  "lists.replies_policy.followed": "Elke gevolgde gebruiker",
+  "lists.replies_policy.list": "Leden van de lijst",
+  "lists.replies_policy.none": "Niemand",
+  "lists.replies_policy.title": "Toon reacties aan:",
   "lists.search": "Zoek naar mensen die je volgt",
   "lists.subheading": "Jouw lijsten",
   "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}",
@@ -277,7 +277,7 @@
   "media_gallery.toggle_visible": "Media verbergen",
   "missing_indicator.label": "Niet gevonden",
   "missing_indicator.sublabel": "Deze hulpbron kan niet gevonden worden",
-  "mute_modal.duration": "Duration",
+  "mute_modal.duration": "Duur",
   "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?",
   "mute_modal.indefinite": "Voor onbepaalde tijd",
   "navigation_bar.apps": "Mobiele apps",
@@ -310,7 +310,7 @@
   "notification.own_poll": "Jouw poll is beëindigd",
   "notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd",
   "notification.reblog": "{name} boostte jouw toot",
-  "notification.status": "{name} just posted",
+  "notification.status": "{name} heeft zojuist een toot geplaatst",
   "notifications.clear": "Meldingen verwijderen",
   "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
   "notifications.column_settings.alert": "Desktopmeldingen",
@@ -326,22 +326,24 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "In kolom tonen",
   "notifications.column_settings.sound": "Geluid afspelen",
-  "notifications.column_settings.status": "New toots:",
+  "notifications.column_settings.status": "Nieuwe toots:",
   "notifications.filter.all": "Alles",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favorieten",
   "notifications.filter.follows": "Die jij volgt",
   "notifications.filter.mentions": "Vermeldingen",
   "notifications.filter.polls": "Pollresultaten",
-  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.filter.statuses": "Updates van mensen die je volgt",
+  "notifications.grant_permission": "Toestemming geven.",
   "notifications.group": "{count} meldingen",
-  "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_banner.enable": "Notificatie meldingen inschakelen",
-  "notifications_permission_banner.how_to_control": "Gebruikt notificaties om ook meldingen te ontvangen wanneer Mastodon niet open is. U kunt precies bepalen welke soort meldingen wel of geen notificaties afgeven via de bovenstaande knop {icon}.",
-  "notifications_permission_banner.title": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
+  "notifications.mark_as_read": "Markeer elke melding als gelezen",
+  "notifications.permission_denied": "Desktopmeldingen zijn niet beschikbaar omdat een eerdere browsertoestemming werd geweigerd",
+  "notifications.permission_denied_alert": "Desktopmeldingen kunnen niet worden ingeschakeld, omdat een eerdere browsertoestemming werd geweigerd",
+  "notifications.permission_required": "Desktopmeldingen zijn niet beschikbaar omdat de benodigde toestemming niet is verleend.",
+  "notifications_permission_banner.enable": "Desktopmeldingen inschakelen",
+  "notifications_permission_banner.how_to_control": "Om meldingen te ontvangen wanneer Mastodon niet open is. Je kunt precies bepalen welke soort interacties wel of geen desktopmeldingen geven via de bovenstaande {icon} knop.",
+  "notifications_permission_banner.title": "Mis nooit meer iets",
+  "picture_in_picture.restore": "Terugzetten",
   "poll.closed": "Gesloten",
   "poll.refresh": "Vernieuwen",
   "poll.total_people": "{count, plural, one {# persoon} other {# mensen}}",
@@ -448,9 +450,9 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persoon} other {{counter} personen}} zijn aan het praten",
   "trends.trending_now": "Trends",
   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.",
-  "units.short.billion": "{count} miljard",
-  "units.short.million": "{count} miljoen",
-  "units.short.thousand": "{count} duizend",
+  "units.short.billion": "{count} mrd.",
+  "units.short.million": "{count} mln.",
+  "units.short.thousand": "{count}k",
   "upload_area.title": "Hiernaar toe slepen om te uploaden",
   "upload_button.label": "Afbeeldingen, een video- of een geluidsbestand toevoegen",
   "upload_error.limit": "Uploadlimiet van bestand overschreden.",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index f6518afab..38a95533c 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Søkeresultat",
   "emoji_button.symbols": "Symbol",
   "emoji_button.travel": "Reise & stader",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ingen tut her!",
   "empty_column.account_unavailable": "Profil ikkje tilgjengelig",
   "empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Neste",
   "lightbox.previous": "Førre",
-  "lightbox.view_context": "Sjå kontekst",
   "lists.account.add": "Legg til i liste",
   "lists.account.remove": "Fjern frå liste",
   "lists.delete": "Slett liste",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Legg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
-  "lists.replies_policy.all_replies": "Enhver fulgt bruker",
-  "lists.replies_policy.list_replies": "Medlemmer i listen",
-  "lists.replies_policy.no_replies": "Ingen",
+  "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": "Vis svar på:",
   "lists.search": "Søk gjennom folk du følgjer",
   "lists.subheading": "Dine lister",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Nemningar",
   "notifications.filter.polls": "Røysteresultat",
   "notifications.filter.statuses": "Oppdateringer fra folk du følger",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} varsel",
   "notifications.mark_as_read": "Merk alle varsler som lest",
   "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": "Skru på skrivebordsvarsler",
   "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": "Aldri gå glipp av noe",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 46cf7c407..e64bf4a5a 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Søkeresultat",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Reise & steder",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Ingen tuter er her!",
   "empty_column.account_unavailable": "Profilen er utilgjengelig",
   "empty_column.blocks": "Du har ikke blokkert noen brukere enda.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Neste",
   "lightbox.previous": "Forrige",
-  "lightbox.view_context": "Vis sammenheng",
   "lists.account.add": "Legg til i listen",
   "lists.account.remove": "Fjern fra listen",
   "lists.delete": "Slett listen",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Ligg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
-  "lists.replies_policy.all_replies": "Enhver fulgt bruker",
-  "lists.replies_policy.list_replies": "Medlemmer i listen",
-  "lists.replies_policy.no_replies": "Ingen",
+  "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": "Vis svar på:",
   "lists.search": "Søk blant personer du følger",
   "lists.subheading": "Dine lister",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Nevnelser",
   "notifications.filter.polls": "Avstemningsresultater",
   "notifications.filter.statuses": "Oppdateringer fra folk du følger",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} varslinger",
   "notifications.mark_as_read": "Merk alle varsler som lest",
   "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": "Skru på skrivebordsvarsler",
   "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": "Aldri gå glipp av noe",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index f166f95e2..f56d337d3 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultats de recèrca",
   "emoji_button.symbols": "Simbòls",
   "emoji_button.travel": "Viatges & lòcs",
+  "empty_column.account_suspended": "Compte suspendut",
   "empty_column.account_timeline": "Cap de tuts aquí !",
   "empty_column.account_unavailable": "Perfil pas disponible",
   "empty_column.blocks": "Avètz pas blocat degun pel moment.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge",
   "lightbox.next": "Seguent",
   "lightbox.previous": "Precedent",
-  "lightbox.view_context": "Veire lo contèxt",
   "lists.account.add": "Ajustar a la lista",
   "lists.account.remove": "Levar de la lista",
   "lists.delete": "Suprimir la lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Cambiar lo títol",
   "lists.new.create": "Ajustar una lista",
   "lists.new.title_placeholder": "Títol de la nòva lista",
-  "lists.replies_policy.all_replies": "Los que sègui",
-  "lists.replies_policy.list_replies": "Membres d’aquesta lista",
-  "lists.replies_policy.no_replies": "Degun",
+  "lists.replies_policy.followed": "Quin seguidor que siá",
+  "lists.replies_policy.list": "Membres de la lista",
+  "lists.replies_policy.none": "Degun",
   "lists.replies_policy.title": "Mostrar las responsas a :",
   "lists.search": "Cercar demest lo mond que seguètz",
   "lists.subheading": "Vòstras listas",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Mencions",
   "notifications.filter.polls": "Resultats del sondatge",
   "notifications.filter.statuses": "Mesas a jorn del monde que seguissètz",
+  "notifications.grant_permission": "Acordar l’autorizacion.",
   "notifications.group": "{count} notificacions",
   "notifications.mark_as_read": "Marcar totas las notificacions coma legidas",
   "notifications.permission_denied": "Las notificacion burèu son pas disponiblas a causa del refús de las demandas d’autorizacion navigador",
   "notifications.permission_denied_alert": "Las notificacions burèu son pas activada, per çò que las autorizacions son estadas refusada abans",
+  "notifications.permission_required": "Las notificacions de burèu son pas indisponiblas perque las permissions requeridas son pas estadas acordadas.",
   "notifications_permission_banner.enable": "Activar las notificacions burèu",
   "notifications_permission_banner.how_to_control": "Per recebre las notificacions de Mastodon quand es pas dobèrt, activatz las notificacions de burèu. Podètz precisar quin tipe de notificacion generarà una notificacion de burèu via lo boton {icon} dessús un còp activadas.",
   "notifications_permission_banner.title": "Manquetz pas jamai res",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 813a6df29..f03a0086e 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -13,7 +13,7 @@
   "account.domain_blocked": "Ukryto domenę",
   "account.edit_profile": "Edytuj profil",
   "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}",
-  "account.endorse": "Polecaj na profilu",
+  "account.endorse": "Wyróżnij na profilu",
   "account.follow": "Śledź",
   "account.followers": "Śledzący",
   "account.followers.empty": "Nikt jeszcze nie śledzi tego użytkownika.",
@@ -153,6 +153,7 @@
   "emoji_button.search_results": "Wyniki wyszukiwania",
   "emoji_button.symbols": "Symbole",
   "emoji_button.travel": "Podróże i miejsca",
+  "empty_column.account_suspended": "Konto zawieszone",
   "empty_column.account_timeline": "Brak wpisów tutaj!",
   "empty_column.account_unavailable": "Profil niedostępny",
   "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.",
@@ -262,7 +263,6 @@
   "lightbox.expand": "Rozwiń pole widoku obrazu",
   "lightbox.next": "Następne",
   "lightbox.previous": "Poprzednie",
-  "lightbox.view_context": "Pokaż kontekst",
   "lists.account.add": "Dodaj do listy",
   "lists.account.remove": "Usunąć z listy",
   "lists.delete": "Usuń listę",
@@ -270,9 +270,9 @@
   "lists.edit.submit": "Zmień tytuł",
   "lists.new.create": "Utwórz listę",
   "lists.new.title_placeholder": "Wprowadź tytuł listy",
-  "lists.replies_policy.all_replies": "Dowolnego obserwowanego użytkownika",
-  "lists.replies_policy.list_replies": "Członków listy",
-  "lists.replies_policy.no_replies": "Nikogo",
+  "lists.replies_policy.followed": "Dowolny obserwowany użytkownik",
+  "lists.replies_policy.list": "Członkowie listy",
+  "lists.replies_policy.none": "Nikt",
   "lists.replies_policy.title": "Pokazuj odpowiedzi dla:",
   "lists.search": "Szukaj wśród osób które śledzisz",
   "lists.subheading": "Twoje listy",
@@ -339,10 +339,12 @@
   "notifications.filter.mentions": "Wspomienia",
   "notifications.filter.polls": "Wyniki głosowania",
   "notifications.filter.statuses": "Aktualizacje od osób które obserwujesz",
+  "notifications.grant_permission": "Przyznaj uprawnienia.",
   "notifications.group": "{count, number} {count, plural, one {powiadomienie} few {powiadomienia} many {powiadomień} more {powiadomień}}",
   "notifications.mark_as_read": "Oznacz wszystkie powiadomienia jako przeczytane",
   "notifications.permission_denied": "Powiadomienia na pulpicie nie są dostępne, ponieważ wcześniej nie udzielono uprawnień w przeglądarce",
   "notifications.permission_denied_alert": "Powiadomienia na pulpicie nie mogą zostać włączone, ponieważ wcześniej odmówiono uprawnień",
+  "notifications.permission_required": "Powiadomienia na pulpicie nie są dostępne, ponieważ nie przyznano wymaganego uprawnienia.",
   "notifications_permission_banner.enable": "Włącz powiadomienia na pulpicie",
   "notifications_permission_banner.how_to_control": "Aby otrzymywać powiadomienia, gdy Mastodon nie jest otwarty, włącz powiadomienia pulpitu. Możesz dokładnie kontrolować, októrych działaniach będziesz powiadomienia na pulpicie za pomocą przycisku {icon} powyżej, jeżeli tylko zostaną włączone.",
   "notifications_permission_banner.title": "Nie przegap niczego",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index abbaced58..2e0adfa9c 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultados da pesquisa",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viagem & Lugares",
+  "empty_column.account_suspended": "Conta suspensa",
   "empty_column.account_timeline": "Nada aqui!",
   "empty_column.account_unavailable": "Perfil indisponível",
   "empty_column.blocks": "Nada aqui.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expandir caixa de visualização de imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ver contexto",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Excluir lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Renomear",
   "lists.new.create": "Criar lista",
   "lists.new.title_placeholder": "Nome da lista",
-  "lists.replies_policy.all_replies": "Qualquer usuário seguido",
-  "lists.replies_policy.list_replies": "Membros da lista",
-  "lists.replies_policy.no_replies": "Ninguém",
+  "lists.replies_policy.followed": "Qualquer usuário seguido",
+  "lists.replies_policy.list": "Membros da lista",
+  "lists.replies_policy.none": "Ninguém",
   "lists.replies_policy.title": "Mostrar respostas para:",
   "lists.search": "Procurar entre as pessoas que você segue",
   "lists.subheading": "Suas listas",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menções",
   "notifications.filter.polls": "Resultados de enquete",
   "notifications.filter.statuses": "Atualizações de pessoas que você segue",
+  "notifications.grant_permission": "Conceder permissão.",
   "notifications.group": "{count} notificações",
   "notifications.mark_as_read": "Marcar todas as notificações como lidas",
   "notifications.permission_denied": "Não é possível habilitar as notificações da área de trabalho pois a permissão foi negada.",
   "notifications.permission_denied_alert": "As notificações da área de trabalho não podem ser habilitdas pois a permissão do navegador foi negada antes",
+  "notifications.permission_required": "Notificações da área de trabalho não estão disponíveis porque a permissão necessária não foi concedida.",
   "notifications_permission_banner.enable": "Habilitar notificações da área de trabalho",
   "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, habilite as notificações da área de trabalho. Você pode controlar precisamente quais tipos de interações geram notificações da área de trabalho através do botão {icon} acima uma vez habilitadas.",
   "notifications_permission_banner.title": "Nunca perca nada",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 065a6bf57..dd3b4eba2 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Resultados da pesquisa",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viagens & Lugares",
+  "empty_column.account_suspended": "Conta suspensa",
   "empty_column.account_timeline": "Sem toots por aqui!",
   "empty_column.account_unavailable": "Perfil indisponível",
   "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expandir caixa de visualização de imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ver contexto",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Remover lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Mudar o título",
   "lists.new.create": "Adicionar lista",
   "lists.new.title_placeholder": "Título da nova lista",
-  "lists.replies_policy.all_replies": "Qualquer utilizador seguido",
-  "lists.replies_policy.list_replies": "Membros da lista",
-  "lists.replies_policy.no_replies": "Ninguém",
+  "lists.replies_policy.followed": "Qualquer utilizador seguido",
+  "lists.replies_policy.list": "Membros da lista",
+  "lists.replies_policy.none": "Ninguém",
   "lists.replies_policy.title": "Mostrar respostas para:",
   "lists.search": "Pesquisa entre as pessoas que segues",
   "lists.subheading": "As tuas listas",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menções",
   "notifications.filter.polls": "Votações",
   "notifications.filter.statuses": "Atualizações de pessoas que você segue",
+  "notifications.grant_permission": "Conceder permissões.",
   "notifications.group": "{count} notificações",
   "notifications.mark_as_read": "Marcar todas as notificações como lidas",
   "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente",
   "notifications.permission_denied_alert": "Notificações no ambinente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente",
+  "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.",
   "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho",
   "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.",
   "notifications_permission_banner.title": "Nunca perca nada",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index dc1be7bc1..a80bfa822 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Rezultatele căutării",
   "emoji_button.symbols": "Simboluri",
   "emoji_button.travel": "Călătorii și Locuri",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Nicio postare aici!",
   "empty_column.account_unavailable": "Profil indisponibil",
   "empty_column.blocks": "Nu ai blocat nici un utilizator încă.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Următorul",
   "lightbox.previous": "Precedentul",
-  "lightbox.view_context": "Vizualizați contextul",
   "lists.account.add": "Adaugă în listă",
   "lists.account.remove": "Elimină din listă",
   "lists.delete": "Șterge lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Schimbă titlul",
   "lists.new.create": "Adaugă listă",
   "lists.new.title_placeholder": "Titlu pentru noua listă",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Caută printre persoanele pe care le urmărești",
   "lists.subheading": "Listele tale",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Menționări",
   "notifications.filter.polls": "Rezultate sondaj",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} notificări",
   "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",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index ae46adf82..3ce050759 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Результаты поиска",
   "emoji_button.symbols": "Символы",
   "emoji_button.travel": "Путешествия и места",
+  "empty_column.account_suspended": "Учетная запись заблокирована",
   "empty_column.account_timeline": "Здесь нет постов!",
   "empty_column.account_unavailable": "Профиль недоступен",
   "empty_column.blocks": "Вы ещё никого не заблокировали.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Развернуть окно просмотра изображений",
   "lightbox.next": "Далее",
   "lightbox.previous": "Назад",
-  "lightbox.view_context": "Контекст",
   "lists.account.add": "Добавить в список",
   "lists.account.remove": "Убрать из списка",
   "lists.delete": "Удалить список",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Изменить название",
   "lists.new.create": "Создать список",
   "lists.new.title_placeholder": "Название для нового списка",
-  "lists.replies_policy.all_replies": "Пользователям, на которых вы подписаны",
-  "lists.replies_policy.list_replies": "Пользователям в списке",
-  "lists.replies_policy.no_replies": "Никому",
+  "lists.replies_policy.followed": "Любой подписанный пользователь",
+  "lists.replies_policy.list": "Пользователи в списке",
+  "lists.replies_policy.none": "Никого",
   "lists.replies_policy.title": "Показать ответы только:",
   "lists.search": "Искать среди подписок",
   "lists.subheading": "Ваши списки",
@@ -334,10 +334,12 @@
   "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": "Ничего не пропустите",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index a8f5171c9..4656aa275 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "अन्वेषणपरिणामाः",
   "emoji_button.symbols": "चिह्नानि",
   "emoji_button.travel": "यात्रा च स्थानानि",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "न दौत्यान्यत्र",
   "empty_column.account_unavailable": "व्यक्तित्वं न प्राप्यते",
   "empty_column.blocks": "नैकोऽप्युपभोक्ता निषिद्धो वर्तते",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index cf4ceb5d0..e1b4e3998 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -4,42 +4,42 @@
   "account.badges.bot": "Bot",
   "account.badges.group": "Grupu",
   "account.block": "Bloca @{name}",
-  "account.block_domain": "Bloca domìniu{domain}",
+  "account.block_domain": "Bloca su domìniu {domain}",
   "account.blocked": "Blocadu",
   "account.browse_more_on_origin_server": "Esplora de prus in su profilu originale",
   "account.cancel_follow_request": "Annulla rechesta de sighidura",
   "account.direct": "Messàgiu deretu a @{name}",
-  "account.disable_notifications": "Acaba·la de mi notificare cando @{name} publicat carchi cosa",
+  "account.disable_notifications": "Non mi notìfiches prus cando @{name} pùblichet messàgios",
   "account.domain_blocked": "Domìniu blocadu",
   "account.edit_profile": "Modìfica profilu",
-  "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat carchi cosa",
+  "account.enable_notifications": "Notìfica·mi cando @{name} pùblicat messàgios",
   "account.endorse": "Cussìgia in su profilu tuo",
   "account.follow": "Sighi",
   "account.followers": "Sighiduras",
   "account.followers.empty": "Nemos sighit ancora custa persone.",
-  "account.followers_counter": "{count, plural, one {{counter} Sighidore} other {{counter} Sighidores}}",
-  "account.following_counter": "{count, plural, one {{counter} Sighidu} other {{counter} Sighidos}}",
+  "account.followers_counter": "{count, plural, one {{counter} sighidura} other {{counter} sighiduras}}",
+  "account.following_counter": "{count, plural, one {Sighende a {counter}} other {Sighende a {counter}}}",
   "account.follows.empty": "Custa persone non sighit ancora a nemos.",
   "account.follows_you": "Ti sighit",
   "account.hide_reblogs": "Cua is cumpartziduras de @{name}",
   "account.last_status": "Ùrtima atividade",
-  "account.link_verified_on": "Sa propiedade de custu ligàmene est istada controllada su {date}",
-  "account.locked_info": "Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.",
+  "account.link_verified_on": "Sa propiedade de custu ligòngiu est istada controllada su {date}",
+  "account.locked_info": "S'istadu de riservadesa de custu contu est istadu cunfiguradu comente blocadu. Sa persone chi tenet sa propiedade revisionat a manu chie dda podet sighire.",
   "account.media": "Cuntenutu multimediale",
-  "account.mention": "Mentova @{name}",
-  "account.moved_to": "{name} est istadu trasferidu a:",
-  "account.mute": "Pone @name a sa muda",
-  "account.mute_notifications": "Notìficas disativadas dae @{name}",
+  "account.mention": "Mentova a @{name}",
+  "account.moved_to": "{name} at cambiadu a:",
+  "account.mute": "Pone a @{name} a sa muda",
+  "account.mute_notifications": "Disativa is notìficas de @{name}",
   "account.muted": "A sa muda",
   "account.never_active": "Mai",
   "account.posts": "Tuts",
   "account.posts_with_replies": "Tuts e rispostas",
   "account.report": "Signala @{name}",
-  "account.requested": "Incarca pro annullare sa rechesta de sighidura",
+  "account.requested": "Abetende s'aprovatzione. Incarca pro annullare sa rechesta de sighidura",
   "account.share": "Cumpartzi su profilu de @{name}",
   "account.show_reblogs": "Ammustra is cumpartziduras de @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
-  "account.unblock": "Isbloca @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tuts}}",
+  "account.unblock": "Isbloca a @{name}",
   "account.unblock_domain": "Isbloca su domìniu {domain}",
   "account.unendorse": "Non cussiges in su profilu",
   "account.unfollow": "Non sigas prus",
@@ -49,7 +49,7 @@
   "alert.rate_limited.message": "Torra·bi a proare a pustis de {retry_time, time, medium}.",
   "alert.rate_limited.title": "Màssimu de rechestas barigadu",
   "alert.unexpected.message": "B'at àpidu una faddina.",
-  "alert.unexpected.title": "Oops!",
+  "alert.unexpected.title": "Oh!",
   "announcement.announcement": "Annùntziu",
   "autosuggest_hashtag.per_week": "{count} a sa chida",
   "boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit",
@@ -73,7 +73,7 @@
   "column.notifications": "Notìficas",
   "column.pins": "Tuts apicados",
   "column.public": "Lìnia de tempus federada",
-  "column_back_button.label": "In segus",
+  "column_back_button.label": "A coa",
   "column_header.hide_settings": "Cua is cunfiguratziones",
   "column_header.moveLeft_settings": "Moe sa colunna a manca",
   "column_header.moveRight_settings": "Moe sa colunna a dereta",
@@ -81,13 +81,13 @@
   "column_header.show_settings": "Ammustra is cunfiguratziones",
   "column_header.unpin": "Boga dae pitzu",
   "column_subheading.settings": "Cunfiguratziones",
-  "community.column_settings.local_only": "Locale ebbia",
-  "community.column_settings.media_only": "Multimediale isceti",
-  "community.column_settings.remote_only": "Remotu ebbia",
+  "community.column_settings.local_only": "Isceti locale",
+  "community.column_settings.media_only": "Isceti multimediale",
+  "community.column_settings.remote_only": "Isceti remotu",
   "compose_form.direct_message_warning": "Custu tut at a èssere imbiadu isceti a is persones mentovadas.",
   "compose_form.direct_message_warning_learn_more": "Àteras informatziones",
-  "compose_form.hashtag_warning": "Custu tut no at a èssere ammustradu in peruna eticheta, dae chi no est listadu.",
-  "compose_form.lock_disclaimer": "Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a is chi ti sighint.",
+  "compose_form.hashtag_warning": "Custu tut no at a èssere ammustradu in peruna eticheta, dae chi no est listadu. Isceti is tuts pùblicos podent èssere chircados cun etichetas.",
+  "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.",
   "compose_form.lock_disclaimer.lock": "blocadu",
   "compose_form.placeholder": "A ite ses pensende?",
   "compose_form.poll.add_option": "Agiunghe unu sèberu",
@@ -98,10 +98,10 @@
   "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Marca mèdia comente a sensìbile",
-  "compose_form.sensitive.marked": "Mèdia marcadu comente a sensìbile",
-  "compose_form.sensitive.unmarked": "Mèdia non marcadu comente a sensìbile",
-  "compose_form.spoiler.marked": "Su testu est cuadu dae s'avisu",
+  "compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Elementu multimediale marcadu comente a sensìbile} other {Elementos multimediales marcados comente a sensìbiles}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Elementu multimediale non marcadu comente a sensìbile} other {Elementos multimediales non marcados comente a sensìbiles}}",
+  "compose_form.spoiler.marked": "Su testu est cuadu in fatu de s'avisu",
   "compose_form.spoiler.unmarked": "Su testu no est cuadu",
   "compose_form.spoiler_placeholder": "Iscrie s'avisu tuo inoghe",
   "confirmation_modal.cancel": "Annulla",
@@ -112,24 +112,24 @@
   "confirmations.delete.message": "Seguru chi boles cantzellare custu tut?",
   "confirmations.delete_list.confirm": "Cantzella",
   "confirmations.delete_list.message": "Seguru chi boles cantzellare custa lista in manera permanente?",
-  "confirmations.domain_block.confirm": "Cua totu su domìniu",
-  "confirmations.domain_block.message": "Ses seguru a beru, ma a beru a beru, de bòlere blocare su {domain} intreu? In sa parte manna de is casos pagos blocos o silentziamentos de utentes sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Is sighidores tuos dae cussu domìniu ant a èssere bogados.",
+  "confirmations.domain_block.confirm": "Bloca totu su domìniu",
+  "confirmations.domain_block.message": "Boles de seguru, ma a beru a beru, blocare su {domain} intreu? In sa parte manna de is casos pagos blocos o silentziamentos de persones sunt sufitzientes e preferìbiles. No as a bìdere cuntenutos dae custu domìniu in peruna lìnia de tempus pùblica o in is notìficas tuas. Sa gente chi ti sighit dae cussu domìniu at a èssere bogada.",
   "confirmations.logout.confirm": "Essi·nche",
   "confirmations.logout.message": "Seguru chi boles essire?",
   "confirmations.mute.confirm": "A sa muda",
   "confirmations.mute.explanation": "Custu at a cuare is publicatziones issoro e is messàgios chi ddos mentovant, ma ant a pòdere bìdere is messàgios tuos e t'ant a pòdere sighire.",
-  "confirmations.mute.message": "Seguru chi boles pònnere {name} a sa muda?",
+  "confirmations.mute.message": "Seguru chi boles pònnere a {name} a sa muda?",
   "confirmations.redraft.confirm": "Cantzella e torra a fàghere",
-  "confirmations.redraft.message": "As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.",
+  "confirmations.redraft.message": "Seguru chi boles cantzellare a torrare a fàghere custu tut? As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.",
   "confirmations.reply.confirm": "Risponde",
   "confirmations.reply.message": "Rispondende immoe as a subraiscrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?",
   "confirmations.unfollow.confirm": "Non sigas prus",
-  "confirmations.unfollow.message": "Seguru chi non boles sighire prus {name}?",
+  "confirmations.unfollow.message": "Seguru chi non boles sighire prus a {name}?",
   "conversation.delete": "Cantzella arresonada",
   "conversation.mark_as_read": "Signala comente lèghidu",
-  "conversation.open": "Bide arresonada",
+  "conversation.open": "Ammsutra arresonada",
   "conversation.with": "Cun {names}",
-  "directory.federated": "Dae unu fediversu connòschidu",
+  "directory.federated": "Dae unu fediversu connotu",
   "directory.local": "Isceti dae {domain}",
   "directory.new_arrivals": "Arribos noos",
   "directory.recently_active": "Ativos dae pagu",
@@ -149,14 +149,15 @@
   "emoji_button.search_results": "Resurtados de sa chirca",
   "emoji_button.symbols": "Sìmbulos",
   "emoji_button.travel": "Biàgios e logos",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Perunu tut inoghe!",
   "empty_column.account_unavailable": "Su profilu no est a disponimentu",
-  "empty_column.blocks": "No as isblocadu ancora nemos.",
+  "empty_column.blocks": "No as blocadu ancora nemos.",
   "empty_column.bookmarked_statuses": "Non tenes ancora perunu tut in is marcadores. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.",
   "empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!",
   "empty_column.direct": "Non tenes ancora perunu messàgiu deretu. Cando nd'as a imbiare o nd'as a retzire unu, at a èssere ammustradu inoghe.",
   "empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.",
-  "empty_column.favourited_statuses": "Non tenes ancora perunu tut in is marcadores. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.",
+  "empty_column.favourited_statuses": "Non tenes ancora perunu tut in is preferidos. Cando nd'as a agiùnghere unu, at a èssere ammustradu inoghe.",
   "empty_column.favourites": "Nemos at marcadu ancora custu tut comente preferidu. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.",
   "empty_column.follow_requests": "Non tenes ancora peruna rechesta de sighidura. Cando nd'as a retzire una, at a èssere ammustrada inoghe.",
   "empty_column.hashtag": "Ancora nudda in custa eticheta.",
@@ -169,8 +170,8 @@
   "empty_column.public": "Nudda inoghe. Iscrie calicuna cosa pùblica, o sighi àteras persones de àteros serbidores pro prenare custu ispàtziu",
   "error.unexpected_crash.explanation": "A càusa de una faddina in su còdighe nostru o unu problema de cumpatibilidade de su navigadore, custa pàgina diat pòdere no èssere ammustrada in manera curreta.",
   "error.unexpected_crash.explanation_addons": "Custa pàgina diat pòdere no èssere ammustrada comente si tocat. Custa faddina est probàbile chi dipendat dae un'estensione de su navigadore o dae ainas automàticas de tradutzione.",
-  "error.unexpected_crash.next_steps": "Proa de atualizare sa pàgina. Si custu non acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
-  "error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e a atualizare sa pàgina. Si custu non acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
+  "error.unexpected_crash.next_steps": "Proa de torrare a carrigare sa pàgina. Si custu no acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
+  "error.unexpected_crash.next_steps_addons": "Proa a ddos disabilitare e torra a carrigare sa pàgina. Si custu no acontzat su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete",
   "errors.unexpected_crash.report_issue": "Signala unu problema",
   "follow_request.authorize": "Autoriza",
@@ -199,14 +200,14 @@
   "home.column_settings.show_replies": "Ammustra rispostas",
   "home.hide_announcements": "Cua annùntzios",
   "home.show_announcements": "Ammustra annùntzios",
-  "intervals.full.days": "{number, plural, one {# die} other {# die}}",
+  "intervals.full.days": "{number, plural, one {# die} other {# dies}}",
   "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}",
   "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}",
   "introduction.federation.action": "Sighi",
   "introduction.federation.federated.headline": "Federada",
   "introduction.federation.federated.text": "Is publicatziones pùblicas de àteros serbidores de su fediversu ant a aparèssere in sa lìnia de tempus federada.",
   "introduction.federation.home.headline": "Printzipale",
-  "introduction.federation.home.text": "Is messàgios de gente chi sighis ant a aparèssere in lìnia de tempus printzipale tua. Podes sighire gente de cale si siat serbidore.",
+  "introduction.federation.home.text": "Is messàgios de sa gente chi sighis ant a aparèssere in sa lìnia de tempus printzipale tua. Podes sighire gente de cale si siat serbidore!",
   "introduction.federation.local.headline": "Locale",
   "introduction.federation.local.text": "Is publicatziones pùblicas de sa gente de su pròpiu serbidore tuo ant a aparèssere in sa lìnia de tempus locale.",
   "introduction.interactions.action": "Acabba su tutoriale!",
@@ -218,16 +219,16 @@
   "introduction.interactions.reply.text": "Podes rispòndere a is tuts de àtera gente e a is tuos pròpios, e ant a èssere unidos in un'arresonada.",
   "introduction.welcome.action": "Ajò, andamus!",
   "introduction.welcome.headline": "Primos passos",
-  "introduction.welcome.text": "Ti donamus sa benebènnida a su fediversu. Dae immoe a pagu, as a pòdere publicare messàgios e chistionare cun is amistades tuas in meda serbidores. Però custu serbidore, {domain}, est ispetziale: allògiat su profilu tuo, duncas regorda·nde si nòmine.",
+  "introduction.welcome.text": "Ti donamus sa benebènnida a su fediversu. Dae immoe a pagu, as a pòdere publicare messàgios e chistionare cun is amistades tuas in meda serbidores. Però custu serbidore, {domain}, est ispetziale: allògiat su profilu tuo, duncas regorda·ti·nde su nòmine.",
   "keyboard_shortcuts.back": "pro navigare in segus",
   "keyboard_shortcuts.blocked": "pro abèrrere sa lista de persones blocadas",
   "keyboard_shortcuts.boost": "pro cumpartzire",
-  "keyboard_shortcuts.column": "pro atzentrare un'istadu in una de is colunnas",
+  "keyboard_shortcuts.column": "pro atzentrare unu tut in una de is colunnas",
   "keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu",
   "keyboard_shortcuts.description": "Descritzione",
   "keyboard_shortcuts.direct": "pro abèrrere sa colunna de messàgios diretos",
   "keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista",
-  "keyboard_shortcuts.enter": "pro abèrrere s'istadu",
+  "keyboard_shortcuts.enter": "pro abèrrere su tut",
   "keyboard_shortcuts.favourite": "pro marcare comente a preferidu",
   "keyboard_shortcuts.favourites": "pro abèrrere sa lista de preferidos",
   "keyboard_shortcuts.federated": "pro abèrrere sa lìnia de tempus federada",
@@ -240,7 +241,7 @@
   "keyboard_shortcuts.muted": "pro abèrrere sa lista de persones a sa muda",
   "keyboard_shortcuts.my_profile": "pro abèrrere su profilu tuo",
   "keyboard_shortcuts.notifications": "pro abèrrere sa colunna de notificatziones",
-  "keyboard_shortcuts.open_media": "pro abèrrere mèdia",
+  "keyboard_shortcuts.open_media": "pro abèrrere elementos multimediales",
   "keyboard_shortcuts.pinned": "pro abèrrere lista de tuts apicados",
   "keyboard_shortcuts.profile": "pro abèrrere su profilu de s'autore",
   "keyboard_shortcuts.reply": "pro rispòndere",
@@ -249,7 +250,7 @@
   "keyboard_shortcuts.spoilers": "pro ammustrare/cuare su campu AC",
   "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"",
   "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC",
-  "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare mèdias",
+  "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare elementos multimediales",
   "keyboard_shortcuts.toot": "pro cumintzare a iscrìere unu tut nou",
   "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca",
   "keyboard_shortcuts.up": "pro mòere in susu in sa lista",
@@ -258,26 +259,25 @@
   "lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines",
   "lightbox.next": "Sighi",
   "lightbox.previous": "Pretzedente",
-  "lightbox.view_context": "Bide su cuntestu",
-  "lists.account.add": "Agiùnghe a sa lista",
+  "lists.account.add": "Agiunghe a sa lista",
   "lists.account.remove": "Boga dae sa lista",
   "lists.delete": "Cantzella sa lista",
   "lists.edit": "Modìfica sa lista",
   "lists.edit.submit": "Muda su tìtulu",
   "lists.new.create": "Agiunghe lista",
-  "lists.new.title_placeholder": "Lista noa",
-  "lists.replies_policy.all_replies": "Cale si siat utente sighidu",
-  "lists.replies_policy.list_replies": "Membros de sa lista",
-  "lists.replies_policy.no_replies": "Perunu",
+  "lists.new.title_placeholder": "Tìtulu de sa lista noa",
+  "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": "Ammustra is rispostas a:",
-  "lists.search": "Chircare intre sa gente chi ses sighende",
+  "lists.search": "Chirca intre sa gente chi ses sighende",
   "lists.subheading": "Is listas tuas",
   "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}",
   "loading_indicator.label": "Carrighende...",
-  "media_gallery.toggle_visible": "Cua mèdia",
+  "media_gallery.toggle_visible": "Cua {number, plural, one {immàgine} other {immàgines}}",
   "missing_indicator.label": "Perunu resurtadu",
   "missing_indicator.sublabel": "Resursa no agatada",
-  "mute_modal.duration": "Duration",
+  "mute_modal.duration": "Durada",
   "mute_modal.hide_notifications": "Boles cuare is notìficas de custa persone?",
   "mute_modal.indefinite": "Indefinida",
   "navigation_bar.apps": "Aplicatziones mòbiles",
@@ -290,7 +290,7 @@
   "navigation_bar.domain_blocks": "Domìnios blocados",
   "navigation_bar.edit_profile": "Modìfica profilu",
   "navigation_bar.favourites": "Preferidos",
-  "navigation_bar.filters": "Paràulas a sa muda",
+  "navigation_bar.filters": "Faeddos a sa muda",
   "navigation_bar.follow_requests": "Rechestas de sighidura",
   "navigation_bar.follows_and_followers": "Persones chi sighis e chi ti sighint",
   "navigation_bar.info": "Informatziones de su serbidore",
@@ -309,7 +309,7 @@
   "notification.mention": "{name} t'at mentovadu",
   "notification.own_poll": "Sondàgiu acabbadu",
   "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu",
-  "notification.reblog": "{name} at cumpartzidu s'istadu tuo",
+  "notification.reblog": "{name} at cumpartzidu su tut tuo",
   "notification.status": "{name} at publicadu cosa",
   "notifications.clear": "Lìmpia notìficas",
   "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?",
@@ -318,8 +318,8 @@
   "notifications.column_settings.filter_bar.advanced": "Ammustra totu is categorias",
   "notifications.column_settings.filter_bar.category": "Barra lestra de filtros",
   "notifications.column_settings.filter_bar.show": "Ammustra",
-  "notifications.column_settings.follow": "Gente noa chi ti sighit:",
-  "notifications.column_settings.follow_request": "Rechesta de sighidura noa:",
+  "notifications.column_settings.follow": "Sighiduras noas:",
+  "notifications.column_settings.follow_request": "Rechestas noas de sighidura:",
   "notifications.column_settings.mention": "Mentovos:",
   "notifications.column_settings.poll": "Resurtados de su sondàgiu:",
   "notifications.column_settings.push": "Notìficas push",
@@ -332,20 +332,22 @@
   "notifications.filter.favourites": "Preferidos",
   "notifications.filter.follows": "Sighende",
   "notifications.filter.mentions": "Mentovos",
-  "notifications.filter.polls": "Resurtados dae su sondàgiu",
-  "notifications.filter.statuses": "Agiornamentos dae is persones chi sighis",
+  "notifications.filter.polls": "Resurtados de su sondàgiu",
+  "notifications.filter.statuses": "Atualizatziones dae gente chi sighis",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} notìficas",
-  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.mark_as_read": "Sinnala ònnia notìfica comente lèghida",
   "notifications.permission_denied": "Is notìficas de iscrivania non sunt a disponimentu pro neghe de rechestas de permissu chi sunt istadas dennegadas in antis",
   "notifications.permission_denied_alert": "Is notìficas de iscrivania non podent èssere abilitadas, ca su permissu de su navigadore est istadu dennegadu in antis",
-  "notifications_permission_banner.enable": "Abìlita is notìficas de iscrivania",
-  "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",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications_permission_banner.enable": "Abilita is notìficas de iscrivania",
+  "notifications_permission_banner.how_to_control": "Pro retzire notìficas cando Mastodon no est abertu, abilita is notìficas de iscrivania. Podes controllare cun pretzisione is castas de interatziones chi ingendrant notìficas de iscrivania pro mèdiu de su butone {icon} in subra, cando sunt abilitadas.",
+  "notifications_permission_banner.title": "Non ti perdas mai nudda",
+  "picture_in_picture.restore": "Torra·ddu a ue fiat",
   "poll.closed": "Serradu",
   "poll.refresh": "Atualiza",
-  "poll.total_people": "{count, plurale, one {# persone} other {# persones}}",
-  "poll.total_votes": "{count, plurale, one {# votu} other {# votos}}",
+  "poll.total_people": "{count, plural, one {# persone} other {# persones}}",
+  "poll.total_votes": "{count, plural, one {# votu} other {# votos}}",
   "poll.vote": "Vota",
   "poll.voted": "As votadu custa risposta",
   "poll_button.add_poll": "Agiunghe unu sondàgiu",
@@ -370,7 +372,7 @@
   "relative_time.today": "oe",
   "reply_indicator.cancel": "Annulla",
   "report.forward": "Torra a imbiare a {target}",
-  "report.forward_hint": "Custu contu est de un'àteru serbidore. Bi boles imbiare puru una còpia anònima de custu informe?",
+  "report.forward_hint": "Custu contu est de un'àteru serbidore. Ddi boles imbiare puru una còpia anònima de custu informe?",
   "report.hint": "S'informe at a èssere imbiadu a sa moderatzione de su serbidore. Podes frunire un'ispiegatzione de sa signalatzione tua de custu contu:",
   "report.placeholder": "Cummentos additzionales",
   "report.submit": "Imbia",
@@ -379,21 +381,21 @@
   "search_popout.search_format": "Formadu de chirca avantzada",
   "search_popout.tips.full_text": "Testu sèmplitze pro agatare istados chi as iscritu, marcadu comente a preferidos, cumpartzidu o chi t'ant mentovadu, e fintzas nòmines de utente, nòmines visualizados e etichetas chi ddu includent.",
   "search_popout.tips.hashtag": "eticheta",
-  "search_popout.tips.status": "istadu",
+  "search_popout.tips.status": "tut",
   "search_popout.tips.text": "Testu sèmplitze pro agatare nòmines visualizados, nòmines de utente e etichetas",
   "search_popout.tips.user": "utente",
   "search_results.accounts": "Gente",
   "search_results.hashtags": "Etichetas",
   "search_results.statuses": "Tuts",
   "search_results.statuses_fts_disabled": "Sa chirca de tuts pro su cuntenutu issoro no est abilitada in custu serbidore de Mastodon.",
-  "search_results.total": "{count, number} {count, plurale, one {resurtadu} other {resurtados}}",
+  "search_results.total": "{count, number} {count, plural, one {resurtadu} other {resurtados}}",
   "status.admin_account": "Aberi s'interfache de moderatzione pro @{name}",
   "status.admin_status": "Aberi custu istadu in s'interfache de moderatzione",
   "status.block": "Bloca @{name}",
-  "status.bookmark": "Marcadore",
+  "status.bookmark": "Sinnalibru",
   "status.cancel_reblog_private": "Iscontza sa cumpartzidura",
   "status.cannot_reblog": "Custa publicatzione non podet èssere cumpartzida",
-  "status.copy": "Còpia su ligàmene a s'istadu tuo",
+  "status.copy": "Còpia su ligòngiu a su tut tuo",
   "status.delete": "Cantzella",
   "status.detailed_status": "Visualizatzione de detàlliu de arresonada",
   "status.direct": "Messàgiu deretu a @{name}",
@@ -401,24 +403,24 @@
   "status.favourite": "Preferidos",
   "status.filtered": "Filtradu",
   "status.load_more": "Càrriga·nde àteros",
-  "status.media_hidden": "Mèdias cuados",
+  "status.media_hidden": "Elementos multimediales cuados",
   "status.mention": "Mentova @{name}",
   "status.more": "Àteru",
-  "status.mute": "Pone @name a sa muda",
+  "status.mute": "Pone @{name} a sa muda",
   "status.mute_conversation": "Pone s'arresonada a sa muda",
-  "status.open": "Ismànnia custu istadu",
+  "status.open": "Ismànnia custu tut",
   "status.pin": "Apica in su profilu",
   "status.pinned": "Tut apicadu",
-  "status.read_more": "Lèghe·nde àteru",
+  "status.read_more": "Leghe·nde àteru",
   "status.reblog": "Cumpartzi",
   "status.reblog_private": "Cumpartzi cun is utentes originales",
   "status.reblogged_by": "{name} at cumpartzidu",
   "status.reblogs.empty": "Nemos at ancora cumpartzidu custu tut. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.",
   "status.redraft": "Cantzella e torra a iscrìere",
-  "status.remove_bookmark": "Boga su marcadore",
+  "status.remove_bookmark": "Boga su sinnalibru",
   "status.reply": "Risponde",
   "status.replyAll": "Risponde a su tema",
-  "status.report": "Signala @{name}",
+  "status.report": "Sinnala @{name}",
   "status.sensitive_warning": "Cuntenutu sensìbile",
   "status.share": "Cumpartzi",
   "status.show_less": "Ammustra·nde prus pagu",
@@ -428,7 +430,7 @@
   "status.show_thread": "Ammustra su tema",
   "status.uncached_media_warning": "No est a disponimentu",
   "status.unmute_conversation": "Torra a ativare s'arresonada",
-  "status.unpin": "Isbloca dae pitzu de su profilu",
+  "status.unpin": "Boga dae pitzu de su profilu",
   "suggestions.dismiss": "Iscarta cussìgiu",
   "suggestions.header": "Est possìbile chi tèngias interessu in…",
   "tabs_bar.federated_timeline": "Federada",
@@ -441,34 +443,34 @@
   "time_remaining.minutes": "{number, plural, one {abarrat # minutu} other {abarrant # minutos}}",
   "time_remaining.moments": "Abarrant pagu momentos",
   "time_remaining.seconds": "{number, plural, one {abarrat # segundu} other {abarrant # segundos}}",
-  "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",
+  "timeline_hint.remote_resource_not_displayed": "{resource} dae àteros serbidores non benint ammustrados.",
+  "timeline_hint.resources.followers": "Sighiduras",
+  "timeline_hint.resources.follows": "Sighende",
+  "timeline_hint.resources.statuses": "Tuts prus betzos",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} persone} other {{counter} persones}} chistionende",
   "trends.trending_now": "Est tendèntzia immoe",
   "ui.beforeunload": "S'abbotzu tuo at a èssere pèrdidu si essis dae Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count}Mrd",
+  "units.short.million": "{count}Mln",
+  "units.short.thousand": "{count}m",
   "upload_area.title": "Traga pro carrigare",
-  "upload_button.label": "Agiunghe mèdias",
+  "upload_button.label": "Agiunghe immàgines, unu vìdeu o unu documentu sonoru",
   "upload_error.limit": "Lìmite de càrriga de archìvios barigadu.",
   "upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.",
   "upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva",
   "upload_form.description": "Descritzione pro persones cun problemas visuales",
   "upload_form.edit": "Modìfica",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Càmbia sa miniadura",
   "upload_form.undo": "Cantzella",
   "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales",
   "upload_modal.analyzing_picture": "Analizende immàgine…",
   "upload_modal.apply": "Àplica",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Sèbera un'immàgine",
   "upload_modal.description_placeholder": "Su margiane castàngiu brincat lestru a subra de su cane mandrone",
   "upload_modal.detect_text": "Rileva testu de s'immàgine",
-  "upload_modal.edit_media": "Modìfica su mèdia",
-  "upload_modal.hint": "Incarca o traga su tzìrculu in sa previsualizatzione pro seberare su puntu focale chi at a èssere semper visìbile in totu is miniaturas.",
-  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.edit_media": "Modìfica elementu multimediale",
+  "upload_modal.hint": "Incarca o traga su tzìrculu in sa previsualizatzione pro seberare su puntu focale chi at a èssere semper visìbile in totu is miniaduras.",
+  "upload_modal.preparing_ocr": "Ammaniende s'OCR…",
   "upload_modal.preview_label": "Previsualiza ({ratio})",
   "upload_progress.label": "Carrighende...",
   "video.close": "Serra su vìdeu",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index de64a9e52..9bb0aa8ce 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Nájdené",
   "emoji_button.symbols": "Symboly",
   "emoji_button.travel": "Cestovanie a miesta",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Niesú tu žiadne príspevky!",
   "empty_column.account_unavailable": "Profil nedostupný",
   "empty_column.blocks": "Ešte si nikoho nezablokoval/a.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Ďalšie",
   "lightbox.previous": "Predchádzajúci",
-  "lightbox.view_context": "Ukáž kontext",
   "lists.account.add": "Pridaj do zoznamu",
   "lists.account.remove": "Odober zo zoznamu",
   "lists.delete": "Vymaž list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Zmeň názov",
   "lists.new.create": "Pridaj zoznam",
   "lists.new.title_placeholder": "Názov nového zoznamu",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Vyhľadávaj medzi užívateľmi, ktorých sleduješ",
   "lists.subheading": "Tvoje zoznamy",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Iba spomenutia",
   "notifications.filter.polls": "Výsledky ankiet",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} oboznámení",
   "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",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index dd25cbc03..ca29c4455 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Rezultati iskanja",
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Potovanja in Kraji",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Tukaj ni tutov!",
   "empty_column.account_unavailable": "Profil ni na voljo",
   "empty_column.blocks": "Niste še blokirali nobenega uporabnika.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Naslednji",
   "lightbox.previous": "Prejšnji",
-  "lightbox.view_context": "Poglej kontekst",
   "lists.account.add": "Dodaj na seznam",
   "lists.account.remove": "Odstrani s seznama",
   "lists.delete": "Izbriši seznam",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Spremeni naslov",
   "lists.new.create": "Dodaj seznam",
   "lists.new.title_placeholder": "Nov naslov seznama",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Išči med ljudmi, katerim sledite",
   "lists.subheading": "Vaši seznami",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Omembe",
   "notifications.filter.polls": "Rezultati glasovanj",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} obvestil",
   "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",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 63feac7ff..b45f62cd5 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Përfundime kërkimi",
   "emoji_button.symbols": "Simbole",
   "emoji_button.travel": "Udhëtime & Vende",
+  "empty_column.account_suspended": "Llogaria u pezullua",
   "empty_column.account_timeline": "S’ka mesazhe këtu!",
   "empty_column.account_unavailable": "Profil jashtë funksionimi",
   "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave",
   "lightbox.next": "Pasuesja",
   "lightbox.previous": "E mëparshmja",
-  "lightbox.view_context": "Shihni kontekstin",
   "lists.account.add": "Shto në listë",
   "lists.account.remove": "Hiqe nga lista",
   "lists.delete": "Fshije listën",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Ndryshoni titullin",
   "lists.new.create": "Shtoni listë",
   "lists.new.title_placeholder": "Titull liste të re",
-  "lists.replies_policy.all_replies": "Cilido përdorues i ndjekur",
-  "lists.replies_policy.list_replies": "Anëtarë të listës",
-  "lists.replies_policy.no_replies": "Askush",
+  "lists.replies_policy.followed": "Cilido përdorues i ndjekur",
+  "lists.replies_policy.list": "Anëtarë të listës",
+  "lists.replies_policy.none": "Askush",
   "lists.replies_policy.title": "Shfaq përgjigje për:",
   "lists.search": "Kërkoni mes personash që ndiqni",
   "lists.subheading": "Listat tuaja",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Përmendje",
   "notifications.filter.polls": "Përfundime pyetësori",
   "notifications.filter.statuses": "Përditësime prej personash që ndiqni",
+  "notifications.grant_permission": "Akordoji leje.",
   "notifications.group": "{count}s njoftime",
   "notifications.mark_as_read": "Vëri shenjë çdo njoftimi si të lexuar",
   "notifications.permission_denied": "S’mund të aktivizohen njoftime në desktop, ngaqë janë mohuar lejet për këtë.",
   "notifications.permission_denied_alert": "S’mund të aktivizohen njoftimet në desktop, ngaqë lejet e shfletuesit për këtë janë mohuar më herët",
+  "notifications.permission_required": "S’merren dot njoftime desktop, ngaqë s’është akorduar leja përkatëse.",
   "notifications_permission_banner.enable": "Aktivizo njoftime në desktop",
   "notifications_permission_banner.how_to_control": "Për të marrë njoftime, kur Mastodon-i s’është i hapur, aktivizoni njoftime në desktop. Përmes butoni {icon} më sipër, mund të kontrolloni me përpikëri cilat lloje ndërveprimesh prodhojnë njoftime në dekstop, pasi të jenë aktivizuar.",
   "notifications_permission_banner.title": "Mos t’ju shpëtojë gjë",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 38fc9cdce..88c9df59b 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Rezultati pretrage",
   "emoji_button.symbols": "Simboli",
   "emoji_button.travel": "Putovanja & mesta",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sledeći",
   "lightbox.previous": "Prethodni",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Dodaj na listu",
   "lists.account.remove": "Ukloni sa liste",
   "lists.delete": "Obriši listu",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Dodaj listu",
   "lists.new.title_placeholder": "Naslov nove liste",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Pretraži među ljudima koje pratite",
   "lists.subheading": "Vaše liste",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 8df81fae6..2509c9085 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Резултати претраге",
   "emoji_button.symbols": "Симболи",
   "emoji_button.travel": "Путовања и места",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Овде нема труба!",
   "empty_column.account_unavailable": "Профил недоступан",
   "empty_column.blocks": "Још увек немате блокираних корисника.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Следећи",
   "lightbox.previous": "Претходни",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Додај на листу",
   "lists.account.remove": "Уклони са листе",
   "lists.delete": "Обриши листу",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Додај листу",
   "lists.new.title_placeholder": "Наслов нове листе",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Претражи међу људима које пратите",
   "lists.subheading": "Ваше листе",
@@ -334,10 +334,12 @@
   "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.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",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 86f4738c7..a0fc4a4f3 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -9,10 +9,10 @@
   "account.browse_more_on_origin_server": "Läs mer på original profilen",
   "account.cancel_follow_request": "Avbryt följarförfrågan",
   "account.direct": "Skicka ett direktmeddelande till @{name}",
-  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.disable_notifications": "Sluta meddela mig när @{name} tutar",
   "account.domain_blocked": "Domän dold",
   "account.edit_profile": "Redigera profil",
-  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.enable_notifications": "Meddela mig när @{name} tutar",
   "account.endorse": "Visa på profil",
   "account.follow": "Följ",
   "account.followers": "Följare",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Sökresultat",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Resor & platser",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Inga inlägg här!",
   "empty_column.account_unavailable": "Profilen ej tillgänglig",
   "empty_column.blocks": "Du har ännu ej blockerat några användare.",
@@ -168,9 +169,9 @@
   "empty_column.notifications": "Du har inga meddelanden än. Interagera med andra för att starta konversationen.",
   "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det",
   "error.unexpected_crash.explanation": "På grund av en bugg i vår kod eller kompatiblitetsproblem i webbläsaren kan den här sidan inte visas korrekt.",
-  "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.explanation_addons": "Denna sida kunde inte visas korrekt. Detta beror troligen på ett webbläsartillägg eller ett automatiskt översättningsverktyg.",
   "error.unexpected_crash.next_steps": "Prova att ladda om sidan. Om det inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller 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.",
+  "error.unexpected_crash.next_steps_addons": "Prova att avaktivera dem och uppdatera sidan. Om detta inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller en app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp",
   "errors.unexpected_crash.report_issue": "Rapportera problem",
   "follow_request.authorize": "Godkänn",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Nästa",
   "lightbox.previous": "Tidigare",
-  "lightbox.view_context": "Visa kontext",
   "lists.account.add": "Lägg till i lista",
   "lists.account.remove": "Ta bort från lista",
   "lists.delete": "Radera lista",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Ändra titel",
   "lists.new.create": "Lägg till lista",
   "lists.new.title_placeholder": "Ny listrubrik",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Sök bland personer du följer",
   "lists.subheading": "Dina listor",
@@ -334,12 +334,14 @@
   "notifications.filter.mentions": "Omnämningar",
   "notifications.filter.polls": "Omröstningsresultat",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} aviseringar",
   "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.how_to_control": "För att ta emot aviseringar när Mastodon inte är öppet, aktivera skrivbordsaviseringar. När de är aktiverade kan du styra exakt vilka typer av interaktioner som aviseras via {icon} -knappen ovan.",
   "notifications_permission_banner.title": "Never miss a thing",
   "picture_in_picture.restore": "Put it back",
   "poll.closed": "Stängd",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 17ffe5519..70f6ab152 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index d509b619a..8f5f06cc4 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "தேடல் முடிவுகள்",
   "emoji_button.symbols": "குறியீடுகள்",
   "emoji_button.travel": "சுற்றுலா மற்றும் இடங்கள்",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "டூட்டுகள் ஏதும் இல்லை!",
   "empty_column.account_unavailable": "சுயவிவரம் கிடைக்கவில்லை",
   "empty_column.blocks": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "அடுத்த",
   "lightbox.previous": "சென்ற",
-  "lightbox.view_context": "சூழலைக் பார்",
   "lists.account.add": "பட்டியலில் சேர்",
   "lists.account.remove": "பட்டியலில் இருந்து அகற்று",
   "lists.delete": "பட்டியலை நீக்கு",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "தலைப்பு மாற்றவும்",
   "lists.new.create": "பட்டியலில் சேர்",
   "lists.new.title_placeholder": "புதிய பட்டியல் தலைப்பு",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்",
   "lists.subheading": "உங்கள் பட்டியல்கள்",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "குறிப்பிடுகிறார்",
   "notifications.filter.polls": "கருத்துக்கணிப்பு முடிவுகள்",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} அறிவிப்புகள்",
   "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",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 17ffe5519..70f6ab152 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 84e73f7e5..994682a67 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "శోధన ఫలితాలు",
   "emoji_button.symbols": "చిహ్నాలు",
   "emoji_button.travel": "ప్రయాణం & ప్రదేశాలు",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "ఇక్కడ ఏ టూట్లూ లేవు!No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "తరువాత",
   "lightbox.previous": "మునుపటి",
-  "lightbox.view_context": "View context",
   "lists.account.add": "జాబితాకు జోడించు",
   "lists.account.remove": "జాబితా నుండి తొలగించు",
   "lists.delete": "జాబితాను తొలగించు",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "శీర్షిక మార్చు",
   "lists.new.create": "జాబితాను జోడించు",
   "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "మీరు అనుసరించే వ్యక్తులలో శోధించండి",
   "lists.subheading": "మీ జాబితాలు",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "పేర్కొన్నవి",
   "notifications.filter.polls": "ఎన్నిక ఫలితాలు",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} ప్రకటనలు",
   "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",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index a2add6715..30ec26809 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -98,9 +98,9 @@
   "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
   "compose_form.publish": "โพสต์",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "ทำเครื่องหมายสื่อว่าละเอียดอ่อน",
-  "compose_form.sensitive.marked": "มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน",
-  "compose_form.sensitive.unmarked": "ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน",
+  "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
+  "compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
+  "compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
   "compose_form.spoiler.marked": "มีการซ่อนข้อความอยู่หลังคำเตือน",
   "compose_form.spoiler.unmarked": "ไม่มีการซ่อนข้อความ",
   "compose_form.spoiler_placeholder": "เขียนคำเตือนของคุณที่นี่",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "ผลลัพธ์การค้นหา",
   "emoji_button.symbols": "สัญลักษณ์",
   "emoji_button.travel": "การเดินทางและสถานที่",
+  "empty_column.account_suspended": "ระงับบัญชีอยู่",
   "empty_column.account_timeline": "ไม่มีโพสต์ที่นี่!",
   "empty_column.account_unavailable": "ไม่มีโปรไฟล์",
   "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ",
@@ -258,7 +259,6 @@
   "lightbox.expand": "ขยายกล่องดูภาพ",
   "lightbox.next": "ถัดไป",
   "lightbox.previous": "ก่อนหน้า",
-  "lightbox.view_context": "ดูบริบท",
   "lists.account.add": "เพิ่มไปยังรายการ",
   "lists.account.remove": "เอาออกจากรายการ",
   "lists.delete": "ลบรายการ",
@@ -266,15 +266,15 @@
   "lists.edit.submit": "เปลี่ยนชื่อเรื่อง",
   "lists.new.create": "เพิ่มรายการ",
   "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่",
-  "lists.replies_policy.all_replies": "ผู้ใช้ใด ๆ ที่ติดตาม",
-  "lists.replies_policy.list_replies": "สมาชิกของรายการ",
-  "lists.replies_policy.no_replies": "ไม่มีใคร",
+  "lists.replies_policy.followed": "ผู้ใช้ใด ๆ ที่ติดตาม",
+  "lists.replies_policy.list": "สมาชิกของรายการ",
+  "lists.replies_policy.none": "ไม่มีใคร",
   "lists.replies_policy.title": "แสดงการตอบกลับแก่:",
   "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม",
   "lists.subheading": "รายการของคุณ",
   "load_pending": "{count, plural, other {# รายการใหม่}}",
   "loading_indicator.label": "กำลังโหลด...",
-  "media_gallery.toggle_visible": "ซ่อน{number, plural, other {ภาพ}}",
+  "media_gallery.toggle_visible": "ซ่อน {number, plural, other {ภาพ}}",
   "missing_indicator.label": "ไม่พบ",
   "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้",
   "mute_modal.duration": "ระยะเวลา",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "การกล่าวถึง",
   "notifications.filter.polls": "ผลลัพธ์การสำรวจความคิดเห็น",
   "notifications.filter.statuses": "การอัปเดตจากผู้คนที่คุณติดตาม",
+  "notifications.grant_permission": "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_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": "ไม่พลาดสิ่งต่าง ๆ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index ec5f65a0c..1d56d169c 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Arama sonuçları",
   "emoji_button.symbols": "Semboller",
   "emoji_button.travel": "Seyahat ve Yerler",
+  "empty_column.account_suspended": "Hesap askıya alındı",
   "empty_column.account_timeline": "Burada hiç toot yok!",
   "empty_column.account_unavailable": "Profil kullanılamıyor",
   "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Resim görüntüleme kutusunu genişlet",
   "lightbox.next": "Sonraki",
   "lightbox.previous": "Önceki",
-  "lightbox.view_context": "İçeriği görüntüle",
   "lists.account.add": "Listeye ekle",
   "lists.account.remove": "Listeden kaldır",
   "lists.delete": "Listeyi sil",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Başlığı değiştir",
   "lists.new.create": "Liste ekle",
   "lists.new.title_placeholder": "Yeni liste başlığı",
-  "lists.replies_policy.all_replies": "Takip edilen herhangi bir kullanıcı",
-  "lists.replies_policy.list_replies": "Listenin üyeleri",
-  "lists.replies_policy.no_replies": "Hiç kimse",
+  "lists.replies_policy.followed": "Any followed user",
+  "lists.replies_policy.list": "Listenin üyeleri",
+  "lists.replies_policy.none": "No one",
   "lists.replies_policy.title": "Yanıtları göster:",
   "lists.search": "Takip ettiğiniz kişiler arasından arayın",
   "lists.subheading": "Listeleriniz",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Bahsetmeler",
   "notifications.filter.polls": "Anket sonuçları",
   "notifications.filter.statuses": "Takip ettiğiniz kişilerden gelen güncellemeler",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} bildirim",
   "notifications.mark_as_read": "Her bildirimi okundu olarak işaretle",
   "notifications.permission_denied": "Daha önce reddedilen tarayıcı izinleri isteği nedeniyle masaüstü bildirimleri kullanılamıyor",
   "notifications.permission_denied_alert": "Tarayıcı izni daha önce reddedildiğinden, masaüstü bildirimleri etkinleştirilemez",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
   "notifications_permission_banner.enable": "Masaüstü bildirimlerini etkinleştir",
   "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra yukarıdaki {icon} düğmesini kullanarak hangi etkileşim türlerinin masaüstü bildirimleri oluşturduğunu tam olarak kontrol edebilirsiniz.",
   "notifications_permission_banner.title": "Hiçbir şeyi kaçırmayın",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
new file mode 100644
index 000000000..224c51301
--- /dev/null
+++ b/app/javascript/mastodon/locales/tt.json
@@ -0,0 +1,486 @@
+{
+  "account.account_note_header": "Язма",
+  "account.add_or_remove_from_list": "Исемлеккә кертү я бетерү",
+  "account.badges.bot": "Бот",
+  "account.badges.group": "Төркем",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Block domain {domain}",
+  "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Тулырак оригинал профилендә карап була",
+  "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_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.last_status": "Last active",
+  "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.never_active": "Never",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unblock domain {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account_note.placeholder": "Click to add a note",
+  "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",
+  "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 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",
+  "community.column_settings.media_only": "Media only",
+  "community.column_settings.remote_only": "Remote only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "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.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.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.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.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 emojos!! (╯°□°)╯︵ ┻━┻",
+  "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 toots here!",
+  "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 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.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.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_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! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "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. Interact with others to start the conversation.",
+  "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",
+  "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}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "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 toots 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 toot",
+  "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",
+  "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": "Hide {number, plural, one {image} other {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 toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "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 toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "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",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "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": "Show",
+  "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 toots:",
+  "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_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, shown in public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Visible for all, but not in public timelines",
+  "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.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.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "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.hashtags": "Hashtags",
+  "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 {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.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "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 toot",
+  "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 toot 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 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",
+  "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.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.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/ug.json b/app/javascript/mastodon/locales/ug.json
index 17ffe5519..70f6ab152 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -149,6 +149,7 @@
   "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 toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index dab23f448..941e43c99 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Результати пошуку",
   "emoji_button.symbols": "Символи",
   "emoji_button.travel": "Подорожі",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "Тут дмухалок немає!",
   "empty_column.account_unavailable": "Профіль недоступний",
   "empty_column.blocks": "Ви ще не заблокували жодного користувача.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Далі",
   "lightbox.previous": "Назад",
-  "lightbox.view_context": "Переглянути контекст",
   "lists.account.add": "Додати до списку",
   "lists.account.remove": "Видалити зі списку",
   "lists.delete": "Видалити список",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Змінити назву",
   "lists.new.create": "Додати список",
   "lists.new.title_placeholder": "Нова назва списку",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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": "Шукати серед людей, на яких ви підписані",
   "lists.subheading": "Ваші списки",
@@ -334,10 +334,12 @@
   "notifications.filter.mentions": "Згадки",
   "notifications.filter.polls": "Результати опитування",
   "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} сповіщень",
   "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",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index 3260a33cd..aaccf1d83 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -149,6 +149,7 @@
   "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": "یہاں کوئی نوٹس نہیں ہیں!",
   "empty_column.account_unavailable": "مشخص دستیاب نہیں ہے",
   "empty_column.blocks": "آپ نے ابھی کسی صارف کو مسدود نہیں کیا ہے.",
@@ -258,7 +259,6 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "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",
@@ -334,10 +334,12 @@
   "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",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 3da7cf375..14c74830b 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -6,12 +6,12 @@
   "account.block": "Chặn @{name}",
   "account.block_domain": "Ẩn mọi thứ từ {domain}",
   "account.blocked": "Đã chặn",
-  "account.browse_more_on_origin_server": "Tìm những tài khoản có liên quan",
+  "account.browse_more_on_origin_server": "Truy cập trang của người này",
   "account.cancel_follow_request": "Hủy yêu cầu theo dõi",
   "account.direct": "Nhắn tin @{name}",
   "account.disable_notifications": "Không thông báo khi @{name} đăng tút",
-  "account.domain_blocked": "Đã chặn người dùng",
-  "account.edit_profile": "Giới thiệu bản thân",
+  "account.domain_blocked": "Người đã chặn",
+  "account.edit_profile": "Chỉnh sửa trang cá nhân",
   "account.enable_notifications": "Thông báo khi @{name} đăng tút",
   "account.endorse": "Vinh danh người này",
   "account.follow": "Theo dõi",
@@ -19,7 +19,7 @@
   "account.followers.empty": "Chưa có người theo dõi nào.",
   "account.followers_counter": "{count, plural, one {{counter} Người theo dõi} other {{counter} Người theo dõi}}",
   "account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}",
-  "account.follows.empty": "Người dùng này chưa theo dõi ai.",
+  "account.follows.empty": "Người này chưa theo dõi ai.",
   "account.follows_you": "Đang theo dõi bạn",
   "account.hide_reblogs": "Ẩn chia sẻ từ @{name}",
   "account.last_status": "Online",
@@ -38,7 +38,7 @@
   "account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi",
   "account.share": "Chia sẻ hồ sơ @{name}",
   "account.show_reblogs": "Hiện chia sẻ từ @{name}",
-  "account.statuses_counter": "{count, plural, other {{counter} Tút}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Tút} other {{counter} Tút}}",
   "account.unblock": "Bỏ chặn @{name}",
   "account.unblock_domain": "Bỏ ẩn {domain}",
   "account.unendorse": "Ngưng vinh danh người này",
@@ -59,17 +59,17 @@
   "bundle_modal_error.close": "Đóng",
   "bundle_modal_error.message": "Đã có lỗi xảy ra trong khi tải nội dung này.",
   "bundle_modal_error.retry": "Thử lại",
-  "column.blocks": "Người dùng đã chặn",
-  "column.bookmarks": "Để dành đọc lại",
+  "column.blocks": "Người đã chặn",
+  "column.bookmarks": "Đã lưu",
   "column.community": "Máy chủ của bạn",
-  "column.direct": "Tin nhắn của bạn",
+  "column.direct": "Tin nhắn",
   "column.directory": "Tìm người cùng sở thích",
   "column.domain_blocks": "Máy chủ đã chặn",
-  "column.favourites": "Lượt thích của bạn",
+  "column.favourites": "Lượt thích",
   "column.follow_requests": "Yêu cầu theo dõi",
   "column.home": "Bảng tin",
   "column.lists": "Danh sách",
-  "column.mutes": "Người dùng đã ẩn",
+  "column.mutes": "Người đã ẩn",
   "column.notifications": "Thông báo",
   "column.pins": "Tút ghim",
   "column.public": "Mạng liên hợp",
@@ -98,7 +98,7 @@
   "compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn",
   "compose_form.publish": "Tút",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Nội dung nhạy cảm",
+  "compose_form.sensitive.hide": "{count, plural, one {Nội dung là nhạy cảm} other {Nội dung là nhạy cảm}}",
   "compose_form.sensitive.marked": "{count, plural, one {Nội dung đã đánh dấu là nhạy cảm} other {Nội dung đã đánh dấu là nhạy cảm}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Nội dung này bình thường} other {Nội dung này bình thường}}",
   "compose_form.spoiler.marked": "Hủy nội dung ẩn",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "Kết quả tìm kiếm",
   "emoji_button.symbols": "Biểu tượng",
   "emoji_button.travel": "Du lịch",
+  "empty_column.account_suspended": "Tài khoản vô hiệu hóa",
   "empty_column.account_timeline": "Chưa có tút nào!",
   "empty_column.account_unavailable": "Tài khoản bị đình chỉ",
   "empty_column.blocks": "Bạn chưa chặn bất cứ ai.",
@@ -164,9 +165,9 @@
   "empty_column.home.public_timeline": "tút công khai",
   "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
   "empty_column.lists": "Bạn chưa tạo danh sách nào.",
-  "empty_column.mutes": "Bạn chưa ẩn người dùng nào.",
+  "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
   "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.",
-  "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi người dùng khác",
+  "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác",
   "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.",
   "error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.",
   "error.unexpected_crash.next_steps": "Hãy thử làm mới trang. Nếu vẫn không được, bạn hãy vào Mastodon bằng một ứng dụng di động hoặc trình duyệt khác.",
@@ -178,7 +179,7 @@
   "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.",
   "generic.saved": "Đã lưu",
   "getting_started.developers": "Nhà phát triển",
-  "getting_started.directory": "Kết bạn",
+  "getting_started.directory": "Mạng lưới",
   "getting_started.documentation": "Tài liệu",
   "getting_started.heading": "Quản lý",
   "getting_started.invite": "Mời bạn bè",
@@ -220,7 +221,7 @@
   "introduction.welcome.headline": "Hướng dẫn người mới",
   "introduction.welcome.text": "Chào mừng bạn đến mạng xã hội liên hợp! Tại đây bạn có thể đăng tải nội dung và trao đổi với bạn bè của mình trên các máy chủ khác nhau. Máy chủ {domain} là nơi lưu trữ trang cá nhân của bạn.",
   "keyboard_shortcuts.back": "trở lại",
-  "keyboard_shortcuts.blocked": "mở danh sách người dùng đã chặn",
+  "keyboard_shortcuts.blocked": "mở danh sách người đã chặn",
   "keyboard_shortcuts.boost": "chia sẻ",
   "keyboard_shortcuts.column": "mở các mục",
   "keyboard_shortcuts.compose": "mở khung soạn tút",
@@ -236,8 +237,8 @@
   "keyboard_shortcuts.hotkey": "Phím tắt",
   "keyboard_shortcuts.legend": "hiện bảng hướng dẫn này",
   "keyboard_shortcuts.local": "mở máy chủ của bạn",
-  "keyboard_shortcuts.mention": "nhắc đến người dùng",
-  "keyboard_shortcuts.muted": "mở danh sách người dùng đã ẩn",
+  "keyboard_shortcuts.mention": "nhắc đến ai đó",
+  "keyboard_shortcuts.muted": "mở danh sách người đã ẩn",
   "keyboard_shortcuts.my_profile": "mở trang cá nhân của bạn",
   "keyboard_shortcuts.notifications": "mở mục thông báo",
   "keyboard_shortcuts.open_media": "mở ảnh hoặc video",
@@ -254,11 +255,10 @@
   "keyboard_shortcuts.unfocus": "đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm",
   "keyboard_shortcuts.up": "di chuyển lên trên danh sách",
   "lightbox.close": "Đóng",
-  "lightbox.compress": "Thu gọn khung hình",
-  "lightbox.expand": "Mở rộng khung hình",
+  "lightbox.compress": "Thu nhỏ hình",
+  "lightbox.expand": "Phóng to hình",
   "lightbox.next": "Tiếp",
   "lightbox.previous": "Trước",
-  "lightbox.view_context": "Xem nội dung",
   "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",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "Thay đổi tiêu đề",
   "lists.new.create": "Tạo danh sách mới",
   "lists.new.title_placeholder": "Tên danh sách mới",
-  "lists.replies_policy.all_replies": "Bất cứ người dùng nào đã theo dõi",
-  "lists.replies_policy.list_replies": "Thành viên trong danh sách",
-  "lists.replies_policy.no_replies": "Tắt bình luận",
+  "lists.replies_policy.followed": "Người theo dõi",
+  "lists.replies_policy.list": "Người trong danh sách",
+  "lists.replies_policy.none": "Không ai",
   "lists.replies_policy.title": "Cho phép bình luận với:",
   "lists.search": "Tìm kiếm những người mà bạn quan tâm",
   "lists.subheading": "Danh sách của bạn",
@@ -278,17 +278,17 @@
   "missing_indicator.label": "Không tìm thấy",
   "missing_indicator.sublabel": "Nội dung này không còn tồn tại",
   "mute_modal.duration": "Thời hạn",
-  "mute_modal.hide_notifications": "Ẩn thông báo từ người dùng này?",
+  "mute_modal.hide_notifications": "Ẩn thông báo từ người này?",
   "mute_modal.indefinite": "Vĩnh viễn",
   "navigation_bar.apps": "Apps",
-  "navigation_bar.blocks": "Người dùng đã chặn",
+  "navigation_bar.blocks": "Người đã chặn",
   "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": "Giới thiệu bản thân",
+  "navigation_bar.edit_profile": "Trang cá nhân",
   "navigation_bar.favourites": "Lượt thích",
   "navigation_bar.filters": "Bộ lọc từ ngữ",
   "navigation_bar.follow_requests": "Yêu cầu theo dõi",
@@ -297,7 +297,7 @@
   "navigation_bar.keyboard_shortcuts": "Phím tắt",
   "navigation_bar.lists": "Danh sách",
   "navigation_bar.logout": "Đăng xuất",
-  "navigation_bar.mutes": "Người dùng đã ẩn",
+  "navigation_bar.mutes": "Người đã ẩn",
   "navigation_bar.personal": "Cá nhân",
   "navigation_bar.pins": "Tút ghim",
   "navigation_bar.preferences": "Cài đặt",
@@ -307,8 +307,8 @@
   "notification.follow": "{name} theo dõi bạn",
   "notification.follow_request": "{name} yêu cầu theo dõi bạn",
   "notification.mention": "{name} nhắc đến bạn",
-  "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc",
-  "notification.poll": "Một cuộc bình chọn mà bạn tham gia đã kết thúc",
+  "notification.own_poll": "Cuộc bình chọn bạn tạo đã kết thúc",
+  "notification.poll": "Cuộc bình chọn của bạn đã kết thúc",
   "notification.reblog": "{name} chia sẻ tút của bạn",
   "notification.status": "{name} vừa đăng",
   "notifications.clear": "Xóa hết thông báo",
@@ -321,7 +321,7 @@
   "notifications.column_settings.follow": "Người theo dõi mới:",
   "notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:",
   "notifications.column_settings.mention": "Lượt nhắc đến:",
-  "notifications.column_settings.poll": "Kết quả bình chọn:",
+  "notifications.column_settings.poll": "Kết quả:",
   "notifications.column_settings.push": "Thông báo đẩy",
   "notifications.column_settings.reblog": "Lượt chia sẻ mới:",
   "notifications.column_settings.show": "Thông báo trên thanh menu",
@@ -334,44 +334,46 @@
   "notifications.filter.mentions": "Lượt nhắc đến",
   "notifications.filter.polls": "Kết quả bình chọn",
   "notifications.filter.statuses": "Cập nhật từ những người bạn theo dõi",
+  "notifications.grant_permission": "Cho phép.",
   "notifications.group": "{count} thông báo",
   "notifications.mark_as_read": "Đánh dấu tất cả thông báo là đã đọc",
   "notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.",
   "notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó",
+  "notifications.permission_required": "Không hiện thông báo trên màn hình bởi vì chưa cho phép.",
   "notifications_permission_banner.enable": "Cho phép thông báo trên màn hình",
   "notifications_permission_banner.how_to_control": "Hãy bật thông báo trên màn hình để không bỏ lỡ những thông báo từ Mastodon. Một khi đã bật, bạn có thể lựa chọn từng loại thông báo khác nhau thông qua {icon} nút bên dưới.",
   "notifications_permission_banner.title": "Không bỏ lỡ điều thú vị nào",
   "picture_in_picture.restore": "Hiển thị bình thường",
   "poll.closed": "Kết thúc",
   "poll.refresh": "Làm mới",
-  "poll.total_people": "{count, plural, one {# người bình chọn} other {# người bình chọn}}",
-  "poll.total_votes": "{count, plural, one {# bình chọn} other {# bình chọn}}",
-  "poll.vote": "Khảo sát",
-  "poll.voted": "Bạn đã bình chọn câu trả lời này",
-  "poll_button.add_poll": "Tạo cuộc bình chọn",
+  "poll.total_people": "{count, plural, one {# người} other {# người}}",
+  "poll.total_votes": "{count, plural, one {# người} other {# người}}",
+  "poll.vote": "Bình chọn",
+  "poll.voted": "Bạn đã bình chọn rồi",
+  "poll_button.add_poll": "Tạo bình chọn",
   "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": "Tin nhắn",
   "privacy.private.long": "Chỉ dành cho người theo dõi",
-  "privacy.private.short": "Chỉ người theo dõi",
+  "privacy.private.short": "Người theo dõi",
   "privacy.public.long": "Hiện trên bảng tin máy chủ",
   "privacy.public.short": "Công khai",
-  "privacy.unlisted.long": "Công khai nhưng không hiện trên bảng tin máy chủ",
-  "privacy.unlisted.short": "Mở",
+  "privacy.unlisted.long": "Không hiện trên bảng tin máy chủ",
+  "privacy.unlisted.short": "Riêng tư",
   "refresh": "Làm mới",
   "regeneration_indicator.label": "Đang tải…",
   "regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!",
   "relative_time.days": "{number} ngày",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "vừa xong",
+  "relative_time.just_now": "mới",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "hôm nay",
   "reply_indicator.cancel": "Hủy bỏ",
   "report.forward": "Chuyển đến {target}",
-  "report.forward_hint": "Người dùng này ở máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?",
-  "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người dùng này:",
+  "report.forward_hint": "Người này thuộc máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?",
+  "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người này:",
   "report.placeholder": "Bổ sung thêm",
   "report.submit": "Gửi đi",
   "report.target": "Báo cáo {target}",
@@ -380,12 +382,12 @@
   "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút mà bạn đã viết, thích, chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "tút",
-  "search_popout.tips.text": "Nội dung trả về là địa chỉ người dùng, tên hiển thị và hashtag",
+  "search_popout.tips.text": "Nội dung trả về là tên người dùng, tên hiển thị và hashtag",
   "search_popout.tips.user": "người dùng",
   "search_results.accounts": "Người dùng",
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Tút",
-  "search_results.statuses_fts_disabled": "Máy chủ của bạn không bật chức năng tìm kiếm tút.",
+  "search_results.statuses_fts_disabled": "Máy chủ của bạn không bật tính năng tìm kiếm tút.",
   "search_results.total": "{count, number} {count, plural, one {kết quả} other {kết quả}}",
   "status.admin_account": "Mở giao diện quản trị @{name}",
   "status.admin_status": "Mở tút này trong giao diện quản trị",
@@ -409,7 +411,7 @@
   "status.open": "Xem nguyên văn",
   "status.pin": "Ghim lên trang cá nhân",
   "status.pinned": "Tút đã ghim",
-  "status.read_more": "Đọc thêm tút",
+  "status.read_more": "Đọc tiếp",
   "status.reblog": "Chia sẻ",
   "status.reblog_private": "Chia sẻ với người có thể xem",
   "status.reblogged_by": "{name} chia sẻ",
@@ -425,7 +427,7 @@
   "status.show_less_all": "Thu gọn toàn bộ",
   "status.show_more": "Mở rộng",
   "status.show_more_all": "Hiển thị tất cả",
-  "status.show_thread": "Xem thêm",
+  "status.show_thread": "Liên quan",
   "status.uncached_media_warning": "Giới hạn",
   "status.unmute_conversation": "Quan tâm",
   "status.unpin": "Bỏ ghim trên trang cá nhân",
@@ -454,7 +456,7 @@
   "upload_area.title": "Kéo và thả để tải lên",
   "upload_button.label": "Thêm media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Tập tin tải lên vượt quá giới hạn cho phép.",
-  "upload_error.poll": "Cuộc bình chọn không cho phép đính kèm tập tin.",
+  "upload_error.poll": "Không cho phép đính kèm tập tin.",
   "upload_form.audio_description": "Mô tả cho người mất thính giác",
   "upload_form.description": "Mô tả cho người khiếm thị",
   "upload_form.edit": "Biên tập",
diff --git a/app/javascript/mastodon/locales/whitelist_tt.json b/app/javascript/mastodon/locales/whitelist_tt.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_tt.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index e79399ea1..e2c69c116 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -4,23 +4,23 @@
   "account.badges.bot": "ⴰⴱⵓⵜ",
   "account.badges.group": "ⵜⴰⵔⴰⴱⴱⵓⵜ",
   "account.block": "ⴳⴷⵍ @{name}",
-  "account.block_domain": "Block domain {domain}",
+  "account.block_domain": "ⴳⴷⵍ ⵉⴳⵔ {domain}",
   "account.blocked": "ⵉⵜⵜⵓⴳⴷⵍ",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "ⵙⵜⴰⵔⴰ ⵓⴳⴳⴰⵔ ⴳ ⵉⴼⵔⵙ ⴰⵏⵚⵍⵉ",
   "account.cancel_follow_request": "ⵙⵔ ⵜⵓⵜⵔⴰ ⵏ ⵓⴹⴼⵕ",
-  "account.direct": "Direct message @{name}",
+  "account.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ @{name}",
   "account.disable_notifications": "Stop notifying me when @{name} posts",
-  "account.domain_blocked": "Domain blocked",
+  "account.domain_blocked": "ⵉⵜⵜⵓⴳⴷⵍ ⵉⴳⵔ",
   "account.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
   "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "ⴹⴼⵕ",
-  "account.followers": "Followers",
+  "account.followers": "ⵉⵎⴹⴼⴰⵕⵏ",
   "account.followers.empty": "No one follows this user yet.",
   "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
   "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.follows_you": "ⴹⴼⵕⵏ ⴽⵯⵏ",
   "account.hide_reblogs": "Hide boosts from @{name}",
   "account.last_status": "Last active",
   "account.link_verified_on": "Ownership of this link was checked on {date}",
@@ -31,18 +31,18 @@
   "account.mute": "Mute @{name}",
   "account.mute_notifications": "Mute notifications from @{name}",
   "account.muted": "Muted",
-  "account.never_active": "Never",
+  "account.never_active": "ⵓⵙⴰⵔ",
   "account.posts": "Toots",
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
-  "account.share": "Share @{name}'s profile",
+  "account.share": "ⴱⴹⵓ ⵉⴼⵔⵙ ⵏ @{name}",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "Unblock @{name}",
   "account.unblock_domain": "Unblock domain {domain}",
   "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
+  "account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
   "account_note.placeholder": "Click to add a note",
@@ -51,21 +51,21 @@
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "announcement.announcement": "Announcement",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "autosuggest_hashtag.per_week": "{count} ⵙ ⵉⵎⴰⵍⴰⵙⵙ",
   "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": "ⴰⵍⵙ ⴰⵔⵎ",
+  "bundle_column_error.title": "ⴰⵣⴳⴰⵍ ⵏ ⵓⵥⵟⵟⴰ",
   "bundle_modal_error.close": "ⵔⴳⵍ",
   "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
-  "column.blocks": "Blocked users",
+  "bundle_modal_error.retry": "ⴰⵍⵙ ⴰⵔⵎ",
+  "column.blocks": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⴳⴷⵍⵏⵉⵏ",
   "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
   "column.domain_blocks": "Blocked domains",
-  "column.favourites": "Favourites",
+  "column.favourites": "ⵜⵓⴼⵓⵜⵉⵏ",
   "column.follow_requests": "Follow requests",
   "column.home": "ⴰⵙⵏⵓⴱⴳ",
   "column.lists": "ⵜⵉⵍⴳⴰⵎⵉⵏ",
@@ -73,26 +73,26 @@
   "column.notifications": "ⵜⵉⵏⵖⵎⵉⵙⵉⵏ",
   "column.pins": "Pinned toot",
   "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
+  "column_back_button.label": "ⴰⵖⵓⵍ",
+  "column_header.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_header.pin": "ⵖⵏⵙ",
+  "column_header.show_settings": "ⵙⵎⴰⵍ ⵜⵉⵙⵖⴰⵍ",
+  "column_header.unpin": "ⴽⴽⵙ ⴰⵖⵏⴰⵙ",
   "column_subheading.settings": "ⵜⵉⵙⵖⴰⵍ",
-  "community.column_settings.local_only": "Local only",
-  "community.column_settings.media_only": "Media only",
+  "community.column_settings.local_only": "ⵖⴰⵙ ⴰⴷⵖⴰⵔⴰⵏ",
+  "community.column_settings.media_only": "ⵖⴰⵙ ⵉⵙⵏⵖⵎⵉⵙⵏ",
   "community.column_settings.remote_only": "Remote only",
   "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ",
   "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.placeholder": "What is on your mind?",
+  "compose_form.placeholder": "ⵎⴰⵢⴷ ⵉⵍⵍⴰⵏ ⴳ ⵉⵅⴼ ⵏⵏⴽ?",
   "compose_form.poll.add_option": "Add a choice",
   "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.option_placeholder": "ⴰⵙⵜⵜⴰⵢ {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",
@@ -106,29 +106,29 @@
   "compose_form.spoiler_placeholder": "Write your warning here",
   "confirmation_modal.cancel": "ⵙⵔ",
   "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.block.confirm": "ⴳⴷⵍ",
+  "confirmations.block.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴳⴷⵍⴷ {name}?",
   "confirmations.delete.confirm": "ⴽⴽⵙ",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⴰⵥⵕⵉⴳⵜ ⴰ?",
   "confirmations.delete_list.confirm": "ⴽⴽⵙ",
   "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
   "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.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.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": "ⵔⴰⵔ",
   "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",
+  "confirmations.unfollow.confirm": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ",
+  "confirmations.unfollow.message": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⴰⴹⴼⴼⵓⵕ ⵉ {name}?",
+  "conversation.delete": "ⴽⴽⵙ ⴰⵎⵙⴰⵡⴰⵍ",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
+  "conversation.with": "ⴰⴽⴷ {names}",
   "directory.federated": "From known fediverse",
   "directory.local": "From {domain} only",
   "directory.new_arrivals": "New arrivals",
@@ -141,14 +141,15 @@
   "emoji_button.food": "Food & Drink",
   "emoji_button.label": "Insert emoji",
   "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "ⵓⵍⴰ ⵉⵎⵓⵊⵉ!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
+  "emoji_button.people": "ⵎⵉⴷⴷⵏ",
   "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
+  "emoji_button.search": "ⵔⵣⵓ...",
   "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
+  "emoji_button.symbols": "ⵜⵉⵎⴰⵜⴰⵔⵉⵏ",
   "emoji_button.travel": "Travel & Places",
+  "empty_column.account_suspended": "Account suspended",
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
@@ -185,11 +186,11 @@
   "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
   "getting_started.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.all": "ⴷ {additional}",
+  "hashtag.column_header.tag_mode.any": "ⵏⵖ {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.select.placeholder": "ⵙⴽⵛⵎ ⴰⵀⴰⵛⵟⴰⴳ…",
   "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",
@@ -199,15 +200,15 @@
   "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.days": "{number, plural, one {# ⵡⴰⵙⵙ} other {# ⵡⵓⵙⵙⴰⵏ}}",
   "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "intervals.full.minutes": "{number, plural, one {# ⵜⵓⵙⴷⵉⴷⵜ} other {# ⵜⵓⵙⴷⵉⴷⵉⵏ}}",
   "introduction.federation.action": "Next",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
   "introduction.federation.home.headline": "ⴰⵙⵏⵓⴱⴳ",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "ⴰⴷⵖⴰⵔⴰⵏ",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
   "introduction.interactions.action": "Finish toot-orial!",
   "introduction.interactions.favourite.headline": "Favourite",
@@ -258,23 +259,22 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
   "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ",
   "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ",
   "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.all_replies": "Any followed user",
-  "lists.replies_policy.list_replies": "Members of the list",
-  "lists.replies_policy.no_replies": "No one",
+  "lists.edit": "ⵙⵏⴼⵍ ⵜⴰⵍⴳⴰⵎⵜ",
+  "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.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": "Hide {number, plural, one {image} other {images}}",
+  "lists.subheading": "ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ",
+  "load_pending": "{count, plural, one {# ⵓⴼⵔⴷⵉⵙ ⴰⵎⴰⵢⵏⵓ} other {# ⵉⴼⵔⴷⴰⵙ ⵉⵎⴰⵢⵏⵓⵜⵏ}}",
+  "loading_indicator.label": "ⴰⵣⴷⴰⵎ...",
+  "media_gallery.toggle_visible": "ⴼⴼⵔ {number, plural, one {ⵜⴰⵡⵍⴰⴼⵜ} other {ⵜⵉⵡⵍⴰⴼⵉⵏ}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.duration": "Duration",
@@ -296,7 +296,7 @@
   "navigation_bar.info": "About this server",
   "navigation_bar.keyboard_shortcuts": "Hotkeys",
   "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
+  "navigation_bar.logout": "ⴼⴼⵖ",
   "navigation_bar.mutes": "Muted users",
   "navigation_bar.personal": "Personal",
   "navigation_bar.pins": "Pinned toots",
@@ -325,26 +325,28 @@
   "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.sound": "ⵖⵔ ⵉⵎⵙⵍⵉ",
   "notifications.column_settings.status": "New toots:",
-  "notifications.filter.all": "All",
+  "notifications.filter.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.group": "{count} notifications",
+  "notifications.grant_permission": "Grant permission.",
+  "notifications.group": "{count} ⵜⵏⵖⵎⵉⵙⵉⵏ",
   "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.closed": "ⵉⵜⵜⵓⵔⴳⵍ",
   "poll.refresh": "Refresh",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# ⵓⴼⴳⴰⵏ} other {# ⵉⴼⴳⴰⵏⵏ}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
   "poll.vote": "Vote",
   "poll.voted": "You voted for this answer",
@@ -352,24 +354,24 @@
   "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": "ⵜⵓⵔⴷⵉⵜ",
   "privacy.private.long": "Visible for followers only",
   "privacy.private.short": "Followers-only",
   "privacy.public.long": "Visible for all, shown in public timelines",
-  "privacy.public.short": "Public",
+  "privacy.public.short": "ⵜⴰⴳⴷⵓⴷⴰⵏⵜ",
   "privacy.unlisted.long": "Visible for all, but not in public timelines",
   "privacy.unlisted.short": "Unlisted",
   "refresh": "Refresh",
   "regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…",
   "regeneration_indicator.sublabel": "Your home feed is being prepared!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
+  "relative_time.days": "{number}ⴰⵙ",
+  "relative_time.hours": "{number}ⵙⵔⴳ",
   "relative_time.just_now": "ⴷⵖⵉ",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
-  "relative_time.today": "today",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
+  "relative_time.minutes": "{number}ⵙⴷ",
+  "relative_time.seconds": "{number}ⵙⵏ",
+  "relative_time.today": "ⴰⵙⵙⴰ",
+  "reply_indicator.cancel": "ⵙⵔ",
+  "report.forward": "ⵙⵙⵉⴼⴹ ⵉ {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
   "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Additional comments",
@@ -382,30 +384,30 @@
   "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.hashtags": "Hashtags",
+  "search_results.accounts": "ⵎⵉⴷⴷⵏ",
+  "search_results.hashtags": "ⵀⴰⵛⵟⴰⴳ",
   "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 {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.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": "ⴽⴽⵙ",
   "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
+  "status.direct": "ⵜⵓⵣⵉⵏⵜ ⵜⵓⵙⵔⵉⴷⵜ ⵉ @{name}",
   "status.embed": "Embed",
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
-  "status.load_more": "Load more",
+  "status.load_more": "ⵙⵙⵉⵍⵉ ⵓⴳⴳⴰⵔ",
   "status.media_hidden": "Media hidden",
   "status.mention": "Mention @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
+  "status.more": "ⵓⴳⴳⴰⵔ",
+  "status.mute": "ⵥⵥⵉⵥⵏ @{name}",
+  "status.mute_conversation": "ⵥⵥⵉⵥⵏ ⴰⵎⵙⴰⵡⴰⵍ",
   "status.open": "Expand this status",
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
@@ -420,11 +422,11 @@
   "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.share": "ⴱⴹⵓ",
+  "status.show_less": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ",
+  "status.show_less_all": "ⵙⵎⴰⵍ ⴷⵔⵓⵙ ⵉ ⵎⴰⵕⵕⴰ",
+  "status.show_more": "ⵙⵎⴰⵍ ⵓⴳⴳⴰⵔ",
+  "status.show_more_all": "ⵙⵎⴰⵍ ⵓⴳⴳⴰⵔ ⵉ ⵎⴰⵕⵕⴰ",
   "status.show_thread": "Show thread",
   "status.uncached_media_warning": "Not available",
   "status.unmute_conversation": "Unmute conversation",
@@ -433,16 +435,16 @@
   "suggestions.header": "You might be interested in…",
   "tabs_bar.federated_timeline": "Federated",
   "tabs_bar.home": "ⴰⵙⵏⵓⴱⴳ",
-  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.local_timeline": "ⴰⴷⵖⴰⵔⴰⵏ",
   "tabs_bar.notifications": "ⵜⵉⵏⵖⵎⵉⵙⵉⵏ",
   "tabs_bar.search": "ⵔⵣⵓ",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.days": "{number, plural, one {# ⵡⴰⵙⵙ} other {# ⵡⵓⵙⵙⴰⵏ}} ⵉⵇⵇⵉⵎⵏ",
   "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.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",
@@ -479,6 +481,6 @@
   "video.hide": "Hide video",
   "video.mute": "Mute sound",
   "video.pause": "Pause",
-  "video.play": "Play",
+  "video.play": "ⵖⵔ",
   "video.unmute": "Unmute sound"
 }
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 956067e6f..6c746bf96 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -133,7 +133,7 @@
   "directory.local": "仅来自 {domain}",
   "directory.new_arrivals": "新来者",
   "directory.recently_active": "最近活跃",
-  "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。",
+  "embed.instructions": "要在你的网站上嵌入此嘟文,请复制以下代码。",
   "embed.preview": "它会像这样显示出来:",
   "emoji_button.activity": "活动",
   "emoji_button.custom": "自定义",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "搜索结果",
   "emoji_button.symbols": "符号",
   "emoji_button.travel": "旅行和地点",
+  "empty_column.account_suspended": "账户被封禁",
   "empty_column.account_timeline": "这里没有嘟文!",
   "empty_column.account_unavailable": "个人资料不可用",
   "empty_column.blocks": "你目前没有屏蔽任何用户。",
@@ -162,7 +163,7 @@
   "empty_column.hashtag": "这个话题标签下暂时没有内容。",
   "empty_column.home": "你还没有关注任何用户。快看看{public},向其他人问个好吧。",
   "empty_column.home.public_timeline": "公共时间轴",
-  "empty_column.list": "这个列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。",
+  "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。",
   "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。",
   "empty_column.mutes": "你没有隐藏任何用户。",
   "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
@@ -258,7 +259,6 @@
   "lightbox.expand": "放大查看图片",
   "lightbox.next": "下一个",
   "lightbox.previous": "上一个",
-  "lightbox.view_context": "查看上下文",
   "lists.account.add": "添加到列表",
   "lists.account.remove": "从列表中移除",
   "lists.delete": "删除列表",
@@ -266,9 +266,9 @@
   "lists.edit.submit": "更改标题",
   "lists.new.create": "新建列表",
   "lists.new.title_placeholder": "新列表的标题",
-  "lists.replies_policy.all_replies": "任何关注的用户",
-  "lists.replies_policy.list_replies": "列表成员",
-  "lists.replies_policy.no_replies": "没有人",
+  "lists.replies_policy.followed": "任何被关注的用户",
+  "lists.replies_policy.list": "列表成员",
+  "lists.replies_policy.none": "没有人",
   "lists.replies_policy.title": "显示回复给:",
   "lists.search": "搜索你关注的人",
   "lists.subheading": "你的列表",
@@ -334,10 +334,12 @@
   "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": "启用桌面通知以在 Mastodon 未打开时接收通知。您可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。",
   "notifications_permission_banner.title": "精彩不容错过",
@@ -401,7 +403,7 @@
   "status.favourite": "喜欢",
   "status.filtered": "已过滤",
   "status.load_more": "加载更多",
-  "status.media_hidden": "隐藏媒体内容",
+  "status.media_hidden": "已隐藏的媒体内容",
   "status.mention": "提及 @{name}",
   "status.more": "更多",
   "status.mute": "隐藏 @{name}",
@@ -427,7 +429,7 @@
   "status.show_more_all": "显示所有内容",
   "status.show_thread": "显示全部对话",
   "status.uncached_media_warning": "暂不可用",
-  "status.unmute_conversation": "不再隐藏此对话",
+  "status.unmute_conversation": "将此对话解除静音",
   "status.unpin": "在个人资料页面取消置顶",
   "suggestions.dismiss": "关闭建议",
   "suggestions.header": "您可能会感兴趣…",
@@ -452,7 +454,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "将文件拖放到此处开始上传",
-  "upload_button.label": "上传媒体文件",
+  "upload_button.label": "上传图片、视频或音频",
   "upload_error.limit": "文件大小超过限制。",
   "upload_error.poll": "投票中不允许上传文件。",
   "upload_form.audio_description": "为听障人士添加文字描述",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 832e2a6a0..1a62ccbb3 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -4,27 +4,27 @@
   "account.badges.bot": "機械人",
   "account.badges.group": "群組",
   "account.block": "封鎖 @{name}",
-  "account.block_domain": "隱藏來自 {domain} 的一切文章",
-  "account.blocked": "封鎖",
-  "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多",
+  "account.block_domain": "封鎖來自 {domain} 的一切文章",
+  "account.blocked": "已封鎖",
+  "account.browse_more_on_origin_server": "瀏覽原服務站上的個人資料頁",
   "account.cancel_follow_request": "取消關注請求",
   "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.followers": "關注的人",
-  "account.followers.empty": "尚沒有人關注這位使用者。",
-  "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注",
+  "account.endorse": "在個人資料頁推薦對方",
+  "account.follow": "正在關注",
+  "account.followers": "關注者",
+  "account.followers.empty": "尚未有人關注這位使用者。",
+  "account.followers_counter": "有 {count, plural,one {{counter} 個} other {{counter} 個}}關注者",
   "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}",
-  "account.follows.empty": "這位使用者尚未關注任何使用者。",
+  "account.follows.empty": "這位使用者尚未關注任何人。",
   "account.follows_you": "關注你",
   "account.hide_reblogs": "隱藏 @{name} 的轉推",
   "account.last_status": "上次活躍時間",
   "account.link_verified_on": "此連結的所有權已在 {date} 檢查過",
-  "account.locked_info": "此用戶的私隱狀態為不公開,關注請求需經過該用戶的審核。",
+  "account.locked_info": "這位使用者將私隱設定為「不公開」,會手動審批誰能關注他/她。",
   "account.media": "媒體",
   "account.mention": "提及 @{name}",
   "account.moved_to": "{name} 已經遷移到:",
@@ -38,15 +38,15 @@
   "account.requested": "等候審批",
   "account.share": "分享 @{name} 的個人資料",
   "account.show_reblogs": "顯示 @{name} 的推文",
-  "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
+  "account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}文章",
   "account.unblock": "解除對 @{name} 的封鎖",
-  "account.unblock_domain": "不再隱藏 {domain}",
+  "account.unblock_domain": "解除對域名 {domain} 的封鎖",
   "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "取消 @{name} 的靜音",
   "account.unmute_notifications": "取消來自 @{name} 通知的靜音",
   "account_note.placeholder": "按此添加備注",
-  "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試",
+  "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試",
   "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生不可預期的錯誤。",
   "alert.unexpected.title": "噢!",
@@ -59,12 +59,12 @@
   "bundle_modal_error.close": "關閉",
   "bundle_modal_error.message": "加載本組件出錯。",
   "bundle_modal_error.retry": "重試",
-  "column.blocks": "封鎖用戶",
+  "column.blocks": "封鎖名單",
   "column.bookmarks": "書籤",
   "column.community": "本站時間軸",
   "column.direct": "個人訊息",
   "column.directory": "瀏覽個人資料",
-  "column.domain_blocks": "隱藏的服務站",
+  "column.domain_blocks": "封鎖的服務站",
   "column.favourites": "最愛的文章",
   "column.follow_requests": "關注請求",
   "column.home": "主頁",
@@ -77,25 +77,25 @@
   "column_header.hide_settings": "隱藏設定",
   "column_header.moveLeft_settings": "將欄左移",
   "column_header.moveRight_settings": "將欄右移",
-  "column_header.pin": "固定",
+  "column_header.pin": "置頂",
   "column_header.show_settings": "顯示設定",
-  "column_header.unpin": "取下",
+  "column_header.unpin": "取消置頂",
   "column_subheading.settings": "設定",
   "community.column_settings.local_only": "只顯示本站",
-  "community.column_settings.media_only": "僅媒體",
+  "community.column_settings.media_only": "只顯示多媒體",
   "community.column_settings.remote_only": "只顯示外站",
-  "compose_form.direct_message_warning": "這文章只有被提及的用戶才可以看到。",
+  "compose_form.direct_message_warning": "這文章只有被提及的使用者才可以看到。",
   "compose_form.direct_message_warning_learn_more": "了解更多",
   "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。",
-  "compose_form.lock_disclaimer": "你的用戶狀態為「{locked}」,任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
-  "compose_form.lock_disclaimer.lock": "公共",
+  "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_single": "變更投票為允許單一選項",
+  "compose_form.poll.switch_to_single": "變更投票為限定單一選項",
   "compose_form.publish": "發文",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "標記媒體為敏感內容",
@@ -112,8 +112,8 @@
   "confirmations.delete.message": "你確定要刪除這文章嗎?",
   "confirmations.delete_list.confirm": "刪除",
   "confirmations.delete_list.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": "靜音",
@@ -129,9 +129,9 @@
   "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.preview": "看上去會是這樣:",
@@ -141,7 +141,7 @@
   "emoji_button.food": "飲飲食食",
   "emoji_button.label": "加入表情符號",
   "emoji_button.nature": "自然",
-  "emoji_button.not_found": "沒有表情符號!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "沒找到表情符號!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "物品",
   "emoji_button.people": "人物",
   "emoji_button.recent": "常用",
@@ -149,6 +149,7 @@
   "emoji_button.search_results": "搜尋結果",
   "emoji_button.symbols": "符號",
   "emoji_button.travel": "旅遊景物",
+  "empty_column.account_suspended": "帳號已停權",
   "empty_column.account_timeline": "這裡還沒有嘟文!",
   "empty_column.account_unavailable": "無法取得個人資料",
   "empty_column.blocks": "你還沒有封鎖任何使用者。",
@@ -156,11 +157,11 @@
   "empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!",
   "empty_column.direct": "你沒有個人訊息。當你發出或接收個人訊息,就會在這裡出現。",
   "empty_column.domain_blocks": "尚未隱藏任何網域。",
-  "empty_column.favourited_statuses": "你還沒收藏任何嘟文。這裡將會顯示你收藏的嘟文。",
-  "empty_column.favourites": "還沒有人收藏這則嘟文。這裡將會顯示被收藏的嘟文。",
+  "empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。",
+  "empty_column.favourites": "還沒有人收藏這則文章。這裡將會顯示被收藏的嘟文。",
   "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。",
   "empty_column.hashtag": "這個標籤暫時未有內容。",
-  "empty_column.home": "你還沒有關注任何用戶。快看看{public},向其他用戶搭訕吧。",
+  "empty_column.home": "你還沒有關注任何使用者。快看看{public},向其他使用者搭訕吧。",
   "empty_column.home.public_timeline": "公共時間軸",
   "empty_column.list": "這個列表暫時未有內容。",
   "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。",
@@ -171,7 +172,7 @@
   "error.unexpected_crash.explanation_addons": "此頁面無法被正確顯示,這可能是由於瀏覽器的附加元件或網頁自動翻譯工具造成的。",
   "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
   "error.unexpected_crash.next_steps_addons": "請嘗試停止使用這些附加元件然後重新載入頁面。如果問題沒有解決,你仍然可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
-  "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
+  "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
   "errors.unexpected_crash.report_issue": "舉報問題",
   "follow_request.authorize": "批准",
   "follow_request.reject": "拒絕",
@@ -182,8 +183,8 @@
   "getting_started.documentation": "文件",
   "getting_started.heading": "開始使用",
   "getting_started.invite": "邀請使用者",
-  "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub ({github}) 貢獻或者回報問題。",
-  "getting_started.security": "帳戶安全",
+  "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}",
@@ -193,7 +194,7 @@
   "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",
+  "hashtag.column_settings.tag_toggle": "在這欄位加入額外的標籤",
   "home.column_settings.basic": "基本",
   "home.column_settings.show_reblogs": "顯示被轉推的文章",
   "home.column_settings.show_replies": "顯示回應文章",
@@ -203,24 +204,24 @@
   "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}",
   "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}",
   "introduction.federation.action": "下一步",
-  "introduction.federation.federated.headline": "站台聯盟",
-  "introduction.federation.federated.text": "來自聯盟宇宙中其他站台的公開嘟文將會在站點聯盟時間軸中顯示。",
+  "introduction.federation.federated.headline": "已知服務站",
+  "introduction.federation.federated.text": "來自社交聯盟其他網站的公開文章,將會顯示在站點跨站時間軸上。",
   "introduction.federation.home.headline": "首頁",
-  "introduction.federation.home.text": "你關注使用者的嘟文將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!",
-  "introduction.federation.local.headline": "本機",
-  "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "關注",
-  "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。",
-  "introduction.interactions.reblog.headline": "轉嘟",
-  "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。",
+  "introduction.federation.home.text": "你所關注使用者的文章,將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!",
+  "introduction.federation.local.headline": "本站",
+  "introduction.federation.local.text": "與你共用一個服務站使用者的公開文章,將會顯示在本站時間軸中。",
+  "introduction.interactions.action": "完成使用教學",
+  "introduction.interactions.favourite.headline": "最愛",
+  "introduction.interactions.favourite.text": "你能用將文章加入「最愛的文章」,一方便把儲存文章稍候觀看,也同時對作者表示支持。",
+  "introduction.interactions.reblog.headline": "轉推",
+  "introduction.interactions.reblog.text": "你可以透過「轉推文章」把文章分享給你的關注者。",
   "introduction.interactions.reply.headline": "回覆",
-  "introduction.interactions.reply.text": "您能回覆其他人或自己的嘟文,這麼做會把這些回覆串成一串對話。",
+  "introduction.interactions.reply.text": "你可以回覆其他人或自己的文章,這麼做會把這些回覆串成一串對話。",
   "introduction.welcome.action": "開始旅程吧!",
   "introduction.welcome.headline": "第一步",
-  "introduction.welcome.text": "歡迎來到聯盟宇宙!等等你就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它寄管了你的個人資料,所以請記住它的名字。",
-  "keyboard_shortcuts.back": "後退",
-  "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單",
+  "introduction.welcome.text": "歡迎來到聯盟社交網絡 (fediverse)!稍後你就可以廣播訊息,同時與多個服務站的不同朋友聊天。但留意 {domain} 這個服務站非常特別——它託管了你的個人資料啊!所以請記住它。",
+  "keyboard_shortcuts.back": "返回",
+  "keyboard_shortcuts.blocked": "開啟封鎖名單",
   "keyboard_shortcuts.boost": "轉推",
   "keyboard_shortcuts.column": "把標示移動到其中一列",
   "keyboard_shortcuts.compose": "把標示移動到文字輸入區",
@@ -228,20 +229,20 @@
   "keyboard_shortcuts.direct": "開啟私訊欄",
   "keyboard_shortcuts.down": "在列表往下移動",
   "keyboard_shortcuts.enter": "打開文章",
-  "keyboard_shortcuts.favourite": "收藏",
-  "keyboard_shortcuts.favourites": "開啟收藏名單",
-  "keyboard_shortcuts.federated": "開啟站點聯盟時間軸",
+  "keyboard_shortcuts.favourite": "收藏文章",
+  "keyboard_shortcuts.favourites": "開啟最愛的內容",
+  "keyboard_shortcuts.federated": "打開跨站時間軸",
   "keyboard_shortcuts.heading": "鍵盤快速鍵",
-  "keyboard_shortcuts.home": "開啟首頁時間軸",
+  "keyboard_shortcuts.home": "開啟個人時間軸",
   "keyboard_shortcuts.hotkey": "快速鍵",
   "keyboard_shortcuts.legend": "顯示這個說明",
-  "keyboard_shortcuts.local": "開啟本機時間軸",
+  "keyboard_shortcuts.local": "開啟本站時間軸",
   "keyboard_shortcuts.mention": "提及作者",
-  "keyboard_shortcuts.muted": "開啟靜音使用者名單",
+  "keyboard_shortcuts.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": "開啟關注請求名單",
@@ -250,7 +251,7 @@
   "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": "關閉",
@@ -258,7 +259,6 @@
   "lightbox.expand": "擴大檢視",
   "lightbox.next": "下一頁",
   "lightbox.previous": "上一頁",
-  "lightbox.view_context": "檢視內文",
   "lists.account.add": "新增到列表",
   "lists.account.remove": "從列表刪除",
   "lists.delete": "刪除列表",
@@ -266,28 +266,28 @@
   "lists.edit.submit": "變更標題",
   "lists.new.create": "新增列表",
   "lists.new.title_placeholder": "新列表標題",
-  "lists.replies_policy.all_replies": "任何關注的用戶",
-  "lists.replies_policy.list_replies": "列表中的用戶",
-  "lists.replies_policy.no_replies": "沒有人",
+  "lists.replies_policy.followed": "任何已關注的用戶",
+  "lists.replies_policy.list": "列表中的用戶",
+  "lists.replies_policy.none": "無人",
   "lists.replies_policy.title": "顯示回應文章︰",
-  "lists.search": "從你關注的用戶中搜索",
+  "lists.search": "從你關注的人搜索",
   "lists.subheading": "列表",
   "load_pending": "{count, plural, other {# 個新項目}}",
   "loading_indicator.label": "載入中...",
-  "media_gallery.toggle_visible": "打開或關上",
+  "media_gallery.toggle_visible": "隱藏圖片",
   "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.apps": "手機 App",
+  "navigation_bar.blocks": "封鎖名單",
   "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.domain_blocks": "封鎖的服務站",
   "navigation_bar.edit_profile": "修改個人資料",
   "navigation_bar.favourites": "最愛的內容",
   "navigation_bar.filters": "靜音詞彙",
@@ -297,24 +297,24 @@
   "navigation_bar.keyboard_shortcuts": "鍵盤快速鍵",
   "navigation_bar.lists": "列表",
   "navigation_bar.logout": "登出",
-  "navigation_bar.mutes": "被你靜音的用戶",
+  "navigation_bar.mutes": "靜音名單",
   "navigation_bar.personal": "個人",
   "navigation_bar.pins": "置頂文章",
   "navigation_bar.preferences": "偏好設定",
   "navigation_bar.public_timeline": "跨站時間軸",
   "navigation_bar.security": "安全",
-  "notification.favourite": "{name} 收藏了你的文章",
+  "notification.favourite": "{name} 喜歡你的文章",
   "notification.follow": "{name} 開始關注你",
   "notification.follow_request": "{name} 要求關注你",
   "notification.mention": "{name} 提及你",
-  "notification.own_poll": "您的投票已結束",
-  "notification.poll": "您投過的投票已經結束",
+  "notification.own_poll": "你的投票已結束",
+  "notification.poll": "你參與過的一個投票已經結束",
   "notification.reblog": "{name} 轉推你的文章",
-  "notification.status": "{name} 剛剛發了嘟文",
+  "notification.status": "{name} 剛發表了文章",
   "notifications.clear": "清空通知紀錄",
   "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
   "notifications.column_settings.alert": "顯示桌面通知",
-  "notifications.column_settings.favourite": "收藏了你的文章:",
+  "notifications.column_settings.favourite": "你最愛的文章:",
   "notifications.column_settings.filter_bar.advanced": "顯示所有分類",
   "notifications.column_settings.filter_bar.category": "快速過濾欄",
   "notifications.column_settings.filter_bar.show": "顯示",
@@ -328,32 +328,34 @@
   "notifications.column_settings.sound": "播放音效",
   "notifications.column_settings.status": "新的文章",
   "notifications.filter.all": "全部",
-  "notifications.filter.boosts": "轉嘟",
+  "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_denied": "本站不能發送桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求",
+  "notifications.permission_denied_alert": "無法啟用桌面通知,因為瀏覽器先前拒絕了本站的桌面通知權限請求",
+  "notifications.permission_required": "由於瀏覽器未有授予桌面通知權限,本站暫未能發送桌面通知。",
   "notifications_permission_banner.enable": "啟用桌面通知",
-  "notifications_permission_banner.how_to_control": "啟用桌面通知可以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確控制哪些類型的互動會產生桌面通知。",
-  "notifications_permission_banner.title": "不放過任何通知",
+  "notifications_permission_banner.how_to_control": "只要啟用桌面通知,便可在 Mastodon 網站沒有打開時收到通知。在已經啟用桌面通知的時候,你可以透過上面的 {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.total_people": "{count, plural, one {# 人投票} other {# 人投票}}",
+  "poll.total_votes": "{count, plural, one {# 票} other {# 票}}",
   "poll.vote": "投票",
-  "poll.voted": "你已對此問題投票",
+  "poll.voted": "你已投票給這答案",
   "poll_button.add_poll": "建立投票",
   "poll_button.remove_poll": "移除投票",
   "privacy.change": "調整私隱設定",
-  "privacy.direct.long": "只有提及的用戶能看到",
+  "privacy.direct.long": "只有提及的使用者能看到",
   "privacy.direct.short": "私人訊息",
-  "privacy.private.long": "只有關注你用戶能看到",
+  "privacy.private.long": "只有你的關注者能看到",
   "privacy.private.short": "關注者",
   "privacy.public.long": "在公共時間軸顯示",
   "privacy.public.short": "公共",
@@ -362,11 +364,11 @@
   "refresh": "重新整理",
   "regeneration_indicator.label": "載入中……",
   "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!",
-  "relative_time.days": "{number}日",
-  "relative_time.hours": "{number}小時",
+  "relative_time.days": "{number}日前",
+  "relative_time.hours": "{number}小時前",
   "relative_time.just_now": "剛剛",
-  "relative_time.minutes": "{number}分鐘",
-  "relative_time.seconds": "{number}秒",
+  "relative_time.minutes": "{number}分鐘前",
+  "relative_time.seconds": "{number}秒前",
   "relative_time.today": "今天",
   "reply_indicator.cancel": "取消",
   "report.forward": "轉寄到 {target}",
@@ -377,28 +379,28 @@
   "report.target": "舉報",
   "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.hashtags": "標籤",
   "search_results.statuses": "文章",
-  "search_results.statuses_fts_disabled": "「依內容搜尋嘟文」未在此 Mastodon 伺服器啟用。",
+  "search_results.statuses_fts_disabled": "此 Mastodon 伺服器並未啟用「搜尋文章內章」功能。",
   "search_results.total": "{count, number} 項結果",
   "status.admin_account": "開啟 @{name} 的管理介面",
-  "status.admin_status": "在管理介面開啟此嘟文",
+  "status.admin_status": "在管理介面開啟這篇文章",
   "status.block": "封鎖 @{name}",
   "status.bookmark": "書籤",
   "status.cancel_reblog_private": "取消轉推",
   "status.cannot_reblog": "這篇文章無法被轉推",
-  "status.copy": "將連結複製到嘟文中",
+  "status.copy": "將連結複製到文章中",
   "status.delete": "刪除",
-  "status.detailed_status": "對話的詳細內容",
+  "status.detailed_status": "詳細對話內容",
   "status.direct": "私訊 @{name}",
-  "status.embed": "鑲嵌",
-  "status.favourite": "收藏",
+  "status.embed": "嵌入",
+  "status.favourite": "最愛",
   "status.filtered": "已過濾",
   "status.load_more": "載入更多",
   "status.media_hidden": "隱藏媒體內容",
@@ -413,7 +415,7 @@
   "status.reblog": "轉推",
   "status.reblog_private": "轉推到原讀者",
   "status.reblogged_by": "{name} 轉推",
-  "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。",
+  "status.reblogs.empty": "還未有人轉推。有的話會顯示在這裡。",
   "status.redraft": "刪除並編輯",
   "status.remove_bookmark": "移除書籤",
   "status.reply": "回應",
@@ -421,38 +423,38 @@
   "status.report": "舉報 @{name}",
   "status.sensitive_warning": "敏感內容",
   "status.share": "分享",
-  "status.show_less": "減少顯示",
-  "status.show_less_all": "減少顯示這類文章",
-  "status.show_more": "顯示更多",
-  "status.show_more_all": "顯示更多這類文章",
+  "status.show_less": "收起",
+  "status.show_less_all": "全部收起",
+  "status.show_more": "展開",
+  "status.show_more_all": "全部展開",
   "status.show_thread": "顯示討論串",
   "status.uncached_media_warning": "無法使用",
-  "status.unmute_conversation": "解禁對話",
+  "status.unmute_conversation": "對話解除靜音",
   "status.unpin": "解除置頂",
   "suggestions.dismiss": "關閉建議",
-  "suggestions.header": "您可能對這些東西有興趣…",
+  "suggestions.header": "你可能對這些感興趣…",
   "tabs_bar.federated_timeline": "跨站",
   "tabs_bar.home": "主頁",
   "tabs_bar.local_timeline": "本站",
   "tabs_bar.notifications": "通知",
   "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.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.remote_resource_not_displayed": "不會顯示來自其他伺服器的 {resource}",
   "timeline_hint.resources.followers": "關注者",
   "timeline_hint.resources.follows": "關注中",
-  "timeline_hint.resources.statuses": "更早的嘟文",
-  "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論",
-  "trends.trending_now": "目前趨勢",
+  "timeline_hint.resources.statuses": "更早的文章",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} 個人}other {{counter} 個人}}正在討論",
+  "trends.trending_now": "現在流行",
   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "將檔案拖放至此上載",
-  "upload_button.label": "上載媒體檔案",
+  "upload_button.label": "加入圖片、影片或音訊檔",
   "upload_error.limit": "已達到檔案上傳限制。",
   "upload_error.poll": "不允許在投票上傳檔案。",
   "upload_form.audio_description": "簡單描述內容給聽障人士",
@@ -464,7 +466,7 @@
   "upload_modal.analyzing_picture": "正在分析圖片…",
   "upload_modal.apply": "套用",
   "upload_modal.choose_image": "選擇圖片",
-  "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗",
+  "upload_modal.description_placeholder": "一隻敏捷的狐狸,輕巧地跳過那隻懶洋洋的狗",
   "upload_modal.detect_text": "從圖片偵測文字",
   "upload_modal.edit_media": "編輯媒體",
   "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。",
@@ -473,9 +475,9 @@
   "upload_progress.label": "上載中……",
   "video.close": "關閉影片",
   "video.download": "下載檔案",
-  "video.exit_fullscreen": "退出全熒幕",
+  "video.exit_fullscreen": "退出全螢幕",
   "video.expand": "展開影片",
-  "video.fullscreen": "全熒幕",
+  "video.fullscreen": "全螢幕",
   "video.hide": "隱藏影片",
   "video.mute": "靜音",
   "video.pause": "暫停",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index a38a7c07a..cc996e91b 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -4,27 +4,27 @@
   "account.badges.bot": "機器人",
   "account.badges.group": "群組",
   "account.block": "封鎖 @{name}",
-  "account.block_domain": "隱藏來自 {domain} 的所有內容",
+  "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.disable_notifications": "當 @{name} 嘟文時不要再通知我",
-  "account.domain_blocked": "已隱藏網域",
+  "account.disable_notifications": "取消來自 @{name} 嘟文的通知",
+  "account.domain_blocked": "已封鎖網域",
   "account.edit_profile": "編輯個人資料",
   "account.enable_notifications": "當 @{name} 嘟文時通知我",
   "account.endorse": "在個人資料推薦對方",
   "account.follow": "關注",
   "account.followers": "關注者",
-  "account.followers.empty": "尚沒有人關注這位使用者。",
+  "account.followers.empty": "尚未有人關注這位使用者。",
   "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注",
   "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}",
-  "account.follows.empty": "這位使用者尚未關注任何使用者。",
-  "account.follows_you": "關注了你",
-  "account.hide_reblogs": "隱藏來自 @{name} 的轉推",
-  "account.last_status": "上次活躍",
+  "account.follows.empty": "這位使用者尚未關注任何人。",
+  "account.follows_you": "關注了您",
+  "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
+  "account.last_status": "上次活躍時間",
   "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限",
-  "account.locked_info": "這隻帳戶的隱私狀態被設成鎖定。該擁有者會手動審核能關注這隻帳號的人。",
+  "account.locked_info": "此帳號的隱私狀態被設為鎖定。該擁有者會手動審核能關注此帳號的人。",
   "account.media": "媒體",
   "account.mention": "提及 @{name}",
   "account.moved_to": "{name} 已遷移至:",
@@ -40,13 +40,13 @@
   "account.show_reblogs": "顯示來自 @{name} 的嘟文",
   "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
   "account.unblock": "取消封鎖 @{name}",
-  "account.unblock_domain": "取消隱藏 {domain}",
+  "account.unblock_domain": "取消封鎖域名 {domain}",
   "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "取消靜音 @{name}",
   "account.unmute_notifications": "重新接收來自 @{name} 的通知",
   "account_note.placeholder": "按此添加備注",
-  "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試",
+  "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試",
   "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生了非預期的錯誤。",
   "alert.unexpected.title": "哎呀!",
@@ -59,17 +59,17 @@
   "bundle_modal_error.close": "關閉",
   "bundle_modal_error.message": "載入此元件時發生錯誤。",
   "bundle_modal_error.retry": "重試",
-  "column.blocks": "封鎖的使用者",
+  "column.blocks": "已封鎖的使用者",
   "column.bookmarks": "書籤",
   "column.community": "本機時間軸",
   "column.direct": "私訊",
   "column.directory": "瀏覽個人資料",
-  "column.domain_blocks": "隱藏的網域",
+  "column.domain_blocks": "已封鎖的網域",
   "column.favourites": "收藏",
   "column.follow_requests": "關注請求",
-  "column.home": "主頁",
+  "column.home": "首頁",
   "column.lists": "名單",
-  "column.mutes": "被靜音的使用者",
+  "column.mutes": "已靜音的使用者",
   "column.notifications": "通知",
   "column.pins": "釘選的嘟文",
   "column.public": "聯邦時間軸",
@@ -81,115 +81,116 @@
   "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": "這條嘟文只有被提及的使用者才看得到。",
   "compose_form.direct_message_warning_learn_more": "了解更多",
-  "compose_form.hashtag_warning": "由於這則嘟文被設定成「不公開」,所以它將不會被列在任何主題標籤下。只有公開的嘟文才能藉主題標籤找到。",
+  "compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不會被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤找到。",
   "compose_form.lock_disclaimer": "您的帳戶尚未{locked}。任何人都能關注您並看到您設定成只有關注者能看的嘟文。",
   "compose_form.lock_disclaimer.lock": "上鎖",
-  "compose_form.placeholder": "您正在想些什麼?",
-  "compose_form.poll.add_option": "新增選擇",
+  "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.option_placeholder": "第 {number} 個選項",
+  "compose_form.poll.remove_option": "移除此選項",
   "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
   "compose_form.poll.switch_to_single": "變更投票為允許單一選項",
   "compose_form.publish": "嘟出去",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "標記媒體為敏感內容",
   "compose_form.sensitive.marked": "此媒體被標記為敏感內容",
-  "compose_form.sensitive.unmarked": "此媒體未標記為敏感內容",
+  "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容",
   "compose_form.spoiler.marked": "正文已隱藏到警告之後",
   "compose_form.spoiler.unmarked": "正文未被隱藏",
   "compose_form.spoiler_placeholder": "請在此處寫入警告訊息",
   "confirmation_modal.cancel": "取消",
   "confirmations.block.block_and_report": "封鎖並檢舉",
   "confirmations.block.confirm": "封鎖",
-  "confirmations.block.message": "確定封鎖 {name} ?",
+  "confirmations.block.message": "確定要封鎖 {name} 嗎?",
   "confirmations.delete.confirm": "刪除",
-  "confirmations.delete.message": "你確定要刪除這條嘟文?",
+  "confirmations.delete.message": "您確定要刪除這則嘟文?",
   "confirmations.delete_list.confirm": "刪除",
   "confirmations.delete_list.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.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注您。",
   "confirmations.mute.message": "確定靜音 {name} ?",
   "confirmations.redraft.confirm": "刪除並重新編輯",
   "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及收藏,且回覆這則的嘟文將會變成獨立的嘟文。",
   "confirmations.reply.confirm": "回覆",
   "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
   "confirmations.unfollow.confirm": "取消關注",
-  "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?",
+  "confirmations.unfollow.message": "確定要取消關注 {name} 嗎?",
   "conversation.delete": "刪除對話",
-  "conversation.mark_as_read": "標為已讀",
+  "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": "要嵌入此嘟文,請將以下程式碼貼進你的網站。",
-  "embed.preview": "他會顯示成這樣:",
+  "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。",
+  "embed.preview": "它將顯示成這樣:",
   "emoji_button.activity": "活動",
   "emoji_button.custom": "自訂",
-  "emoji_button.flags": "旗標",
-  "emoji_button.food": "飲食",
+  "emoji_button.flags": "旗幟",
+  "emoji_button.food": "食物 & 飲料",
   "emoji_button.label": "插入表情符號",
-  "emoji_button.nature": "大自然",
+  "emoji_button.nature": "自然",
   "emoji_button.not_found": "啊就沒這表情符號吼!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "物件",
-  "emoji_button.people": "使用者",
+  "emoji_button.people": "人物",
   "emoji_button.recent": "最常使用",
   "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.blocks": "你還沒有封鎖任何使用者。",
-  "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。",
-  "empty_column.community": "本地時間軸是空的。快公開嘟些文搶頭香啊!",
+  "empty_column.blocks": "您還沒有封鎖任何使用者。",
+  "empty_column.bookmarked_statuses": "您還沒建立任何書籤。當您建立書簽時,它將於此顯示。",
+  "empty_column.community": "本機時間軸是空的。快公開嘟些文搶頭香啊!",
   "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
-  "empty_column.domain_blocks": "尚未隱藏任何網域。",
-  "empty_column.favourited_statuses": "你還沒收藏任何嘟文。這裡將會顯示你收藏的嘟文。",
-  "empty_column.favourites": "還沒有人收藏這則嘟文。這裡將會顯示被收藏的嘟文。",
+  "empty_column.domain_blocks": "尚未封鎖任何網域。",
+  "empty_column.favourited_statuses": "您還沒收藏過任何嘟文。當您收藏嘟文時,它將於此顯示。",
+  "empty_column.favourites": "還沒有人收藏過這則嘟文。當有人收藏嘟文時,它將於此顯示。",
   "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。",
   "empty_column.hashtag": "這個主題標籤下什麼也沒有。",
   "empty_column.home": "您的首頁時間軸是空的!前往 {public} 或使用搜尋功能來認識其他人。",
   "empty_column.home.public_timeline": "公開時間軸",
   "empty_column.list": "這份名單還沒有東西。當此名單的成員嘟出了新的嘟文時,它們就會顯示於此。",
-  "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。",
-  "empty_column.mutes": "你尚未靜音任何使用者。",
+  "empty_column.lists": "您還沒有建立任何名單。這裡將會顯示您所建立的名單。",
+  "empty_column.mutes": "您尚未靜音任何使用者。",
   "empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。",
   "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己關注其他伺服器的使用者後就會有嘟文出現了",
-  "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。",
+  "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,無法正常顯示此頁面。",
   "error.unexpected_crash.explanation_addons": "此頁面無法被正常顯示,這可能是由瀏覽器附加元件或網頁自動翻譯工具造成的。",
-  "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
-  "error.unexpected_crash.next_steps_addons": "請嘗試重新整理頁面。如果狀況沒有進展,您可以嘗試使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
-  "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
-  "errors.unexpected_crash.report_issue": "舉報問題",
+  "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。",
+  "error.unexpected_crash.next_steps_addons": "請嘗試關閉他們然後重新整理頁面。如果狀況沒有改善,您可以使用不同的瀏覽器或應用程式來檢視來使用 Mastodon。",
+  "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
+  "errors.unexpected_crash.report_issue": "回報問題",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
-  "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為可能想要自己審核這些帳號的追蹤請求。",
+  "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為您可能想要自己審核這些帳號的追蹤請求。",
   "generic.saved": "已儲存",
   "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.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_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.select.placeholder": "請輸入主題標籤…",
   "hashtag.column_settings.tag_mode.all": "全部",
   "hashtag.column_settings.tag_mode.any": "任一",
   "hashtag.column_settings.tag_mode.none": "全不",
@@ -203,14 +204,14 @@
   "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}",
   "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}",
   "introduction.federation.action": "下一步",
-  "introduction.federation.federated.headline": "站台聯盟",
-  "introduction.federation.federated.text": "來自聯盟宇宙中其他站台的公開嘟文將會在站點聯盟時間軸中顯示。",
+  "introduction.federation.federated.headline": "聯邦",
+  "introduction.federation.federated.text": "來自聯盟宇宙中其他伺服器的公開嘟文將會在聯邦時間軸中顯示。",
   "introduction.federation.home.headline": "首頁",
   "introduction.federation.home.text": "你關注使用者的嘟文將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!",
   "introduction.federation.local.headline": "本機",
   "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。",
   "introduction.interactions.action": "完成教學!",
-  "introduction.interactions.favourite.headline": "關注",
+  "introduction.interactions.favourite.headline": "收藏",
   "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。",
   "introduction.interactions.reblog.headline": "轉嘟",
   "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。",
@@ -218,23 +219,23 @@
   "introduction.interactions.reply.text": "您能回覆其他人或自己的嘟文,這麼做會把這些回覆串成一串對話。",
   "introduction.welcome.action": "開始旅程吧!",
   "introduction.welcome.headline": "第一步",
-  "introduction.welcome.text": "歡迎來到聯盟宇宙!等等你就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它寄管了你的個人資料,所以請記住它的名字。",
+  "introduction.welcome.text": "歡迎來到聯盟宇宙!稍候您就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它承載了您的個人資料,所以請記住它的名字。",
   "keyboard_shortcuts.back": "返回上一頁",
   "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單",
   "keyboard_shortcuts.boost": "轉嘟",
   "keyboard_shortcuts.column": "將焦點放在其中一欄的嘟文",
   "keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊",
-  "keyboard_shortcuts.description": "描述",
+  "keyboard_shortcuts.description": "說明",
   "keyboard_shortcuts.direct": "開啟私訊欄",
-  "keyboard_shortcuts.down": "往下移動名單項目",
+  "keyboard_shortcuts.down": "在名單中往下移動",
   "keyboard_shortcuts.enter": "檢視嘟文",
-  "keyboard_shortcuts.favourite": "收藏",
+  "keyboard_shortcuts.favourite": "加到收藏",
   "keyboard_shortcuts.favourites": "開啟收藏名單",
-  "keyboard_shortcuts.federated": "開啟站點聯盟時間軸",
+  "keyboard_shortcuts.federated": "開啟聯邦時間軸",
   "keyboard_shortcuts.heading": "鍵盤快速鍵",
   "keyboard_shortcuts.home": "開啟首頁時間軸",
   "keyboard_shortcuts.hotkey": "快速鍵",
-  "keyboard_shortcuts.legend": "顯示此列表",
+  "keyboard_shortcuts.legend": "顯示此圖例",
   "keyboard_shortcuts.local": "開啟本機時間軸",
   "keyboard_shortcuts.mention": "提及作者",
   "keyboard_shortcuts.muted": "開啟靜音使用者名單",
@@ -243,7 +244,7 @@
   "keyboard_shortcuts.open_media": "開啟媒體",
   "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單",
   "keyboard_shortcuts.profile": "開啟作者的個人資料頁面",
-  "keyboard_shortcuts.reply": "回覆",
+  "keyboard_shortcuts.reply": "回應嘟文",
   "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "將焦點移至搜尋框",
   "keyboard_shortcuts.spoilers": "顯示或隱藏被折疊的正文",
@@ -252,13 +253,12 @@
   "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
   "keyboard_shortcuts.toot": "開始發出新嘟文",
   "keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點",
-  "keyboard_shortcuts.up": "往上移動名單項目",
+  "keyboard_shortcuts.up": "在名單中往上移動",
   "lightbox.close": "關閉",
   "lightbox.compress": "折疊圖片檢視框",
   "lightbox.expand": "展開圖片檢視框",
   "lightbox.next": "下一步",
   "lightbox.previous": "上一步",
-  "lightbox.view_context": "檢視內文",
   "lists.account.add": "新增至名單",
   "lists.account.remove": "從名單中移除",
   "lists.delete": "刪除名單",
@@ -266,13 +266,13 @@
   "lists.edit.submit": "變更標題",
   "lists.new.create": "新增名單",
   "lists.new.title_placeholder": "新名單標題",
-  "lists.replies_policy.all_replies": "任何跟隨的使用者",
-  "lists.replies_policy.list_replies": "列表成員",
-  "lists.replies_policy.no_replies": "沒有人",
-  "lists.replies_policy.title": "顯示回覆",
+  "lists.replies_policy.followed": "任何跟隨的使用者",
+  "lists.replies_policy.list": "列表成員",
+  "lists.replies_policy.none": "沒有人",
+  "lists.replies_policy.title": "顯示回覆:",
   "lists.search": "搜尋您關注的使用者",
   "lists.subheading": "您的名單",
-  "load_pending": "{count, plural, other {# 個新項目}}",
+  "load_pending": "{count, plural, one {# 個新項目} other {# 個新項目}}",
   "loading_indicator.label": "讀取中...",
   "media_gallery.toggle_visible": "切換可見性",
   "missing_indicator.label": "找不到",
@@ -303,30 +303,30 @@
   "navigation_bar.preferences": "偏好設定",
   "navigation_bar.public_timeline": "聯邦時間軸",
   "navigation_bar.security": "安全性",
-  "notification.favourite": "{name} 把你的嘟文加入了最愛",
-  "notification.follow": "{name} 關注了你",
-  "notification.follow_request": "{name} 要求關注你",
-  "notification.mention": "{name} 提到了你",
+  "notification.favourite": "{name} 把您的嘟文加入了最愛",
+  "notification.follow": "{name} 關注了您",
+  "notification.follow_request": "{name} 要求關注您",
+  "notification.mention": "{name} 提到了您",
   "notification.own_poll": "您的投票已結束",
-  "notification.poll": "您投過的投票已經結束",
-  "notification.reblog": "{name}轉嘟了你的嘟文",
+  "notification.poll": "您曾投過的投票已經結束",
+  "notification.reblog": "{name} 轉嘟了您的嘟文",
   "notification.status": "{name} 剛剛嘟文",
   "notifications.clear": "清除通知",
-  "notifications.clear_confirmation": "確定要永久清除你的通知嗎?",
+  "notifications.clear_confirmation": "確定要永久清除您的通知嗎?",
   "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": "顯示",
   "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.push": "推播通知",
   "notifications.column_settings.reblog": "轉嘟:",
   "notifications.column_settings.show": "在欄位中顯示",
-  "notifications.column_settings.sound": "播放音效",
-  "notifications.column_settings.status": "新嘟文:",
+  "notifications.column_settings.sound": "播放聲音",
+  "notifications.column_settings.status": "新嘟文:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "轉嘟",
   "notifications.filter.favourites": "最愛",
@@ -334,12 +334,14 @@
   "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": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,你可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。",
+  "notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,您可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。",
   "notifications_permission_banner.title": "不要錯過任何東西!",
   "picture_in_picture.restore": "還原",
   "poll.closed": "已關閉",
@@ -347,37 +349,37 @@
   "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}",
   "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}",
   "poll.vote": "投票",
-  "poll.voted": "你已對此問題投票",
+  "poll.voted": "您已對此問題投票",
   "poll_button.add_poll": "建立投票",
   "poll_button.remove_poll": "移除投票",
-  "privacy.change": "調整隱私狀態",
-  "privacy.direct.long": "只有被提到的使用者能看到",
+  "privacy.change": "調整嘟文隱私狀態",
+  "privacy.direct.long": "只有被提及的使用者能看到",
   "privacy.direct.short": "私訊",
-  "privacy.private.long": "只有關注你的使用者能看到",
+  "privacy.private.long": "只有關注您的使用者能看到",
   "privacy.private.short": "僅關注者",
-  "privacy.public.long": "嘟到公開時間軸",
+  "privacy.public.long": "公開,且顯示於公開時間軸",
   "privacy.public.short": "公開",
   "privacy.unlisted.long": "公開,但不會顯示在公開時間軸",
   "privacy.unlisted.short": "不公開",
   "refresh": "重新整理",
   "regeneration_indicator.label": "載入中…",
-  "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!",
+  "regeneration_indicator.sublabel": "您的主頁時間軸正在準備中!",
   "relative_time.days": "{number} 天",
-  "relative_time.hours": "{number} 小時",
+  "relative_time.hours": "{number}小時前",
   "relative_time.just_now": "剛剛",
-  "relative_time.minutes": "{number} 分",
+  "relative_time.minutes": "{number} 分前",
   "relative_time.seconds": "{number} 秒",
   "relative_time.today": "今天",
   "reply_indicator.cancel": "取消",
   "report.forward": "轉寄到 {target}",
-  "report.forward_hint": "這個帳戶屬於其他站點。要像該站點發送匿名的檢舉訊息嗎?",
-  "report.hint": "這項訊息會發送到您伺服器的管理員。你可以提供檢舉這個帳戶的理由:",
-  "report.placeholder": "更多訊息",
+  "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?",
+  "report.hint": "這項訊息會發送到您伺服器的管理員。您可以提供檢舉這個帳戶的理由:",
+  "report.placeholder": "其他備註",
   "report.submit": "送出",
   "report.target": "檢舉 {target}",
   "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": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤",
@@ -392,32 +394,32 @@
   "status.block": "封鎖 @{name}",
   "status.bookmark": "書籤",
   "status.cancel_reblog_private": "取消轉嘟",
-  "status.cannot_reblog": "這篇嘟文無法被轉嘟",
+  "status.cannot_reblog": "這則嘟文無法被轉嘟",
   "status.copy": "複製嘟文連結",
   "status.delete": "刪除",
-  "status.detailed_status": "對話的詳細內容",
+  "status.detailed_status": "詳細的對話內容",
   "status.direct": "發送私訊給 @{name}",
-  "status.embed": "嵌入",
+  "status.embed": "內嵌",
   "status.favourite": "最愛",
   "status.filtered": "已過濾",
   "status.load_more": "載入更多",
   "status.media_hidden": "隱藏媒體內容",
-  "status.mention": "提到 @{name}",
+  "status.mention": "提及 @{name}",
   "status.more": "更多",
   "status.mute": "靜音 @{name}",
   "status.mute_conversation": "靜音對話",
-  "status.open": "展開嘟文",
+  "status.open": "展開此嘟文",
   "status.pin": "釘選到個人資料頁",
   "status.pinned": "釘選的嘟文",
   "status.read_more": "閱讀更多",
   "status.reblog": "轉嘟",
   "status.reblog_private": "轉嘟給原有關注者",
   "status.reblogged_by": "{name} 轉嘟了",
-  "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。",
+  "status.reblogs.empty": "還沒有人轉嘟過這則嘟文。當有人轉嘟時,它將於此顯示。",
   "status.redraft": "刪除 & 編輯",
   "status.remove_bookmark": "移除書籤",
   "status.reply": "回覆",
-  "status.replyAll": "回覆所有人",
+  "status.replyAll": "回覆討論串",
   "status.report": "檢舉 @{name}",
   "status.sensitive_warning": "敏感內容",
   "status.share": "分享",
@@ -428,15 +430,15 @@
   "status.show_thread": "顯示討論串",
   "status.uncached_media_warning": "無法使用",
   "status.unmute_conversation": "解除此對話的靜音",
-  "status.unpin": "解除置頂",
+  "status.unpin": "從個人頁面解除釘選",
   "suggestions.dismiss": "關閉建議",
   "suggestions.header": "您可能對這些東西有興趣…",
-  "tabs_bar.federated_timeline": "其他站點",
-  "tabs_bar.home": "主頁",
-  "tabs_bar.local_timeline": "本站",
+  "tabs_bar.federated_timeline": "聯邦宇宙",
+  "tabs_bar.home": "首頁",
+  "tabs_bar.local_timeline": "本機",
   "tabs_bar.notifications": "通知",
   "tabs_bar.search": "搜尋",
-  "time_remaining.days": "剩餘{number, plural, one {# 天數} other {# 天數}}",
+  "time_remaining.days": "剩餘{number, plural, one {# 天} other {# 天}}",
   "time_remaining.hours": "剩餘{number, plural, one {# 小時} other {# 小時}}",
   "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
   "time_remaining.moments": "剩餘時間",
@@ -447,27 +449,27 @@
   "timeline_hint.resources.statuses": "更早的嘟文",
   "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論",
   "trends.trending_now": "目前趨勢",
-  "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。",
+  "ui.beforeunload": "如果離開 Mastodon,您的草稿將會不見。",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "拖放來上傳",
-  "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "上傳圖像、影片、或音樂檔案",
   "upload_error.limit": "已達到檔案上傳限制。",
-  "upload_error.poll": "不允許在投票上傳檔案。",
-  "upload_form.audio_description": "簡單描述內容給聽障人士",
+  "upload_error.poll": "不允許在投票中上傳檔案。",
+  "upload_form.audio_description": "描述內容給聽障人士",
   "upload_form.description": "為視障人士增加文字說明",
   "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.choose_image": "選擇圖片",
-  "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗",
-  "upload_modal.detect_text": "從圖片偵測文字",
+  "upload_modal.description_placeholder": "我能吞下玻璃而不傷身體",
+  "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": "上傳中...",
diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js
index 46a9d5376..1d4874717 100644
--- a/app/javascript/mastodon/reducers/notifications.js
+++ b/app/javascript/mastodon/reducers/notifications.js
@@ -12,7 +12,6 @@ import {
   NOTIFICATIONS_MARK_AS_READ,
   NOTIFICATIONS_SET_BROWSER_SUPPORT,
   NOTIFICATIONS_SET_BROWSER_PERMISSION,
-  NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
 } from '../actions/notifications';
 import {
   ACCOUNT_BLOCK_SUCCESS,
@@ -251,8 +250,6 @@ export default function notifications(state = initialState, action) {
     return state.set('browserSupport', action.value);
   case NOTIFICATIONS_SET_BROWSER_PERMISSION:
     return state.set('browserPermission', action.value);
-  case NOTIFICATIONS_DISMISS_BROWSER_PERMISSION:
-    return state.set('browserPermission', 'denied');
   default:
     return state;
   }
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 057fa353a..357ab352a 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -44,6 +44,8 @@ const initialState = ImmutableMap({
       advanced: false,
     }),
 
+    dismissPermissionBanner: false,
+
     shows: ImmutableMap({
       follow: true,
       follow_request: false,
diff --git a/app/javascript/mastodon/rtl.js b/app/javascript/mastodon/rtl.js
deleted file mode 100644
index 89bed6de8..000000000
--- a/app/javascript/mastodon/rtl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// U+0590  to U+05FF  - Hebrew
-// U+0600  to U+06FF  - Arabic
-// U+0700  to U+074F  - Syriac
-// U+0750  to U+077F  - Arabic Supplement
-// U+0780  to U+07BF  - Thaana
-// U+07C0  to U+07FF  - N'Ko
-// U+0800  to U+083F  - Samaritan
-// U+08A0  to U+08FF  - Arabic Extended-A
-// U+FB1D  to U+FB4F  - Hebrew presentation forms
-// U+FB50  to U+FDFF  - Arabic presentation forms A
-// U+FE70  to U+FEFF  - Arabic presentation forms B
-
-const rtlChars = /[\u0590-\u083F]|[\u08A0-\u08FF]|[\uFB1D-\uFDFF]|[\uFE70-\uFEFF]/mg;
-
-export function isRtl(text) {
-  if (text.length === 0) {
-    return false;
-  }
-
-  text = text.replace(/(?:^|[^\/\w])@([a-z0-9_]+(@[a-z0-9\.\-]+)?)/ig, '');
-  text = text.replace(/(?:^|[^\/\w])#([\S]+)/ig, '');
-  text = text.replace(/\s+/g, '');
-  text = text.replace(/(\w\S+\.\w{2,}\S*)/g, '');
-
-  const matches = text.match(rtlChars);
-
-  if (!matches) {
-    return false;
-  }
-
-  return matches.length / text.length > 0.3;
-};
diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss
index e25a80c04..55ebd3091 100644
--- a/app/javascript/styles/mailer.scss
+++ b/app/javascript/styles/mailer.scss
@@ -58,6 +58,16 @@ td {
   vertical-align: top;
 }
 
+.auto-dir {
+  p {
+    unicode-bidi: plaintext;
+  }
+
+  a {
+    unicode-bidi: isolate;
+  }
+}
+
 .email-table,
 .content-section,
 .column,
@@ -96,7 +106,7 @@ body {
 .col-3,
 .col-4,
 .col-5,
-.col-6, {
+.col-6 {
   font-size: 0;
   display: inline-block;
   width: 100%;
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 7f7eee6fe..18d1f7ad0 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -355,11 +355,45 @@ html {
 .error-modal,
 .onboarding-modal,
 .report-modal__comment .setting-text__wrapper,
-.report-modal__comment .setting-text {
+.report-modal__comment .setting-text,
+.announcements,
+.picture-in-picture__header,
+.picture-in-picture__footer,
+.reactions-bar__item {
   background: $white;
   border: 1px solid lighten($ui-base-color, 8%);
 }
 
+.reactions-bar__item {
+  &:hover,
+  &:focus,
+  &:active {
+    background-color: $ui-base-color;
+  }
+}
+
+.reactions-bar__item.active {
+  background-color: mix($white, $ui-highlight-color, 80%);
+  border-color: mix(lighten($ui-base-color, 8%), $ui-highlight-color, 80%);
+}
+
+.media-modal__overlay .picture-in-picture__footer {
+  border: 0;
+}
+
+.picture-in-picture__header {
+  border-bottom: 0;
+}
+
+.announcements,
+.picture-in-picture__footer {
+  border-top: 0;
+}
+
+.icon-with-badge__badge {
+  border-color: $white;
+}
+
 .report-modal__comment {
   border-right-color: lighten($ui-base-color, 8%);
 }
@@ -512,6 +546,12 @@ html {
   }
 }
 
+.picture-in-picture-placeholder {
+  background: $white;
+  border-color: lighten($ui-base-color, 8%);
+  color: lighten($ui-base-color, 8%);
+}
+
 .brand__tagline {
   color: $ui-secondary-color;
 }
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index 3be0aee49..d6bd9e3c6 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -732,6 +732,7 @@ $small-breakpoint: 960px;
 
       &__column {
         flex: 1 1 50%;
+        overflow-x: hidden;
       }
     }
 
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index e0c33fb85..6ff640f8d 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -831,6 +831,7 @@
   p {
     margin-bottom: 20px;
     white-space: pre-wrap;
+    unicode-bidi: plaintext;
 
     &:last-child {
       margin-bottom: 0;
@@ -840,6 +841,7 @@
   a {
     color: $secondary-text-color;
     text-decoration: none;
+    unicode-bidi: isolate;
 
     &:hover {
       text-decoration: underline;
@@ -3457,6 +3459,12 @@ a.status-card.compact:hover {
   }
 }
 
+.column-header__permission-btn {
+  display: inline;
+  font-weight: inherit;
+  text-decoration: underline;
+}
+
 .column-header__setting-arrows {
   float: right;
 
@@ -3855,7 +3863,7 @@ a.status-card.compact:hover {
 }
 
 .column-settings__row {
-  .text-btn {
+  .text-btn:not(.column-header__permission-btn) {
     margin-bottom: 15px;
   }
 }
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index f7e03f028..5ace0d97c 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -371,11 +371,6 @@ code {
       box-shadow: none;
     }
 
-    &:focus:invalid:not(:placeholder-shown),
-    &:required:invalid:not(:placeholder-shown) {
-      border-color: lighten($error-red, 12%);
-    }
-
     &:required:valid {
       border-color: $valid-value-color;
     }
@@ -391,6 +386,16 @@ code {
     }
   }
 
+  input[type=text],
+  input[type=number],
+  input[type=email],
+  input[type=password] {
+    &:focus:invalid:not(:placeholder-shown),
+    &:required:invalid:not(:placeholder-shown) {
+      border-color: lighten($error-red, 12%);
+    }
+  }
+
   .input.field_with_errors {
     label {
       color: lighten($error-red, 12%);
diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss
index fbf26e30b..8051e4edb 100644
--- a/app/javascript/styles/mastodon/rtl.scss
+++ b/app/javascript/styles/mastodon/rtl.scss
@@ -17,15 +17,38 @@ body.rtl {
     margin-right: 15px;
   }
 
-  .display-name {
+  .display-name,
+  .announcements__item {
     text-align: right;
   }
 
+  .announcements__item__range {
+    padding-right: 0;
+    padding-left: 18px;
+  }
+
+  .reactions-bar {
+    margin-left: auto;
+    margin-right: -2px;
+    direction: rtl;
+  }
+
+  .reactions-bar__item__count {
+    margin-left: 0;
+    margin-right: 6px;
+  }
+
+  .announcements__pagination {
+    right: auto;
+    left: 0;
+  }
+
   .notification__message {
     margin-left: 0;
     margin-right: 68px;
   }
 
+  .announcements__mastodon,
   .drawer__inner__mastodon > img {
     transform: scaleX(-1);
   }
@@ -195,6 +218,7 @@ body.rtl {
     margin-right: 0;
   }
 
+  .picture-in-picture__header__account .display-name,
   .detailed-status__display-name .display-name {
     text-align: right;
   }
@@ -205,6 +229,21 @@ body.rtl {
     float: right;
   }
 
+  .picture-in-picture__header__account .account__avatar {
+    margin-right: 0;
+    margin-left: 10px;
+  }
+
+  .icon-button__counter {
+    margin-left: 0;
+    margin-right: 4px;
+  }
+
+  .notifications-permission-banner__close {
+    right: auto;
+    left: 10px;
+  }
+
   .detailed-status__favorites,
   .detailed-status__reblogs {
     margin-left: 0;
@@ -416,4 +455,9 @@ body.rtl {
     left: auto;
     right: 0;
   }
+
+  .picture-in-picture {
+    right: auto;
+    left: 20px;
+  }
 }
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index d56d47a2d..b9d43d74d 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -228,6 +228,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     emoji ||= CustomEmoji.new(domain: @account.domain, shortcode: shortcode, uri: uri)
     emoji.image_remote_url = image_url
     emoji.save
+  rescue Seahorse::Client::NetworkingError
+    nil
   end
 
   def process_attachments
@@ -250,6 +252,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         media_attachment.save
       rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
         RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
+      rescue Seahorse::Client::NetworkingError
+        nil
       end
     end
 
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index ebd25b398..ddd975c5f 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -279,6 +279,36 @@ class FeedManager
     end
   end
 
+  # Completely clear multiple feeds at once
+  # @param [Symbol] type
+  # @param [Array<Integer>] ids
+  # @return [void]
+  def clean_feeds!(type, ids)
+    reblogged_id_sets = {}
+
+    redis.pipelined do
+      ids.each do |feed_id|
+        redis.del(key(type, feed_id))
+        reblog_key = key(type, feed_id, 'reblogs')
+        # We collect a future for this: we don't block while getting
+        # it, but we can iterate over it later.
+        reblogged_id_sets[feed_id] = redis.zrange(reblog_key, 0, -1)
+        redis.del(reblog_key)
+      end
+    end
+
+    # Remove all of the reblog tracking keys we just removed the
+    # references to.
+    redis.pipelined do
+      reblogged_id_sets.each do |feed_id, future|
+        future.value.each do |reblogged_id|
+          reblog_set_key = key(type, feed_id, "reblogs:#{reblogged_id}")
+          redis.del(reblog_set_key)
+        end
+      end
+    end
+  end
+
   private
 
   # Trim a feed to maximum size by removing older items
diff --git a/app/models/account.rb b/app/models/account.rb
index b70978d2b..f6aba74c6 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -67,6 +67,7 @@ class Account < ApplicationRecord
   include Paginable
   include AccountCounters
   include DomainNormalizable
+  include DomainMaterializable
   include AccountMerging
 
   MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
@@ -103,11 +104,11 @@ class Account < ApplicationRecord
   scope :sensitized, -> { where.not(sensitized_at: nil) }
   scope :without_suspended, -> { where(suspended_at: nil) }
   scope :without_silenced, -> { where(silenced_at: nil) }
+  scope :without_instance_actor, -> { where.not(id: -99) }
   scope :recent, -> { reorder(id: :desc) }
   scope :bots, -> { where(actor_type: %w(Application Service)) }
   scope :groups, -> { where(actor_type: 'Group') }
   scope :alphabetic, -> { order(domain: :asc, username: :asc) }
-  scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') }
   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}%")) }
@@ -226,7 +227,7 @@ class Account < ApplicationRecord
   end
 
   def suspended?
-    suspended_at.present?
+    suspended_at.present? && !instance_actor?
   end
 
   def suspended_permanently?
@@ -440,10 +441,6 @@ class Account < ApplicationRecord
       super - %w(statuses_count following_count followers_count)
     end
 
-    def domains
-      reorder(nil).pluck(Arel.sql('distinct accounts.domain'))
-    end
-
     def inboxes
       urls = reorder(nil).where(protocol: :activitypub).group(:preferred_inbox_url).pluck(Arel.sql("coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url) AS preferred_inbox_url"))
       DeliveryFailureTracker.without_unavailable(urls)
@@ -583,17 +580,6 @@ class Account < ApplicationRecord
   end
 
   def clean_feed_manager
-    reblog_key       = FeedManager.instance.key(:home, id, 'reblogs')
-    reblogged_id_set = Redis.current.zrange(reblog_key, 0, -1)
-
-    Redis.current.pipelined do
-      Redis.current.del(FeedManager.instance.key(:home, id))
-      Redis.current.del(reblog_key)
-
-      reblogged_id_set.each do |reblogged_id|
-        reblog_set_key = FeedManager.instance.key(:home, id, "reblogs:#{reblogged_id}")
-        Redis.current.del(reblog_set_key)
-      end
-    end
+    FeedManager.instance.clean_feeds!(:home, [id])
   end
 end
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 7b6012e0f..2b001385f 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -45,7 +45,7 @@ class AccountFilter
   def scope_for(key, value)
     case key.to_s
     when 'local'
-      Account.local
+      Account.local.without_instance_actor
     when 'remote'
       Account.remote
     when 'by_domain'
diff --git a/app/models/concerns/domain_materializable.rb b/app/models/concerns/domain_materializable.rb
new file mode 100644
index 000000000..88337f8c0
--- /dev/null
+++ b/app/models/concerns/domain_materializable.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module DomainMaterializable
+  extend ActiveSupport::Concern
+
+  included do
+    after_create_commit :refresh_instances_view
+  end
+
+  def refresh_instances_view
+    Instance.refresh unless domain.nil? || Instance.where(domain: domain).exists?
+  end
+end
diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb
index 5fe0e3a29..4b0a89c18 100644
--- a/app/models/domain_allow.rb
+++ b/app/models/domain_allow.rb
@@ -12,6 +12,7 @@
 
 class DomainAllow < ApplicationRecord
   include DomainNormalizable
+  include DomainMaterializable
 
   validates :domain, presence: true, uniqueness: true, domain: true
 
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index 2b18e01fa..bba04c603 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -12,10 +12,12 @@
 #  reject_reports  :boolean          default(FALSE), not null
 #  private_comment :text
 #  public_comment  :text
+#  obfuscate       :boolean          default(FALSE), not null
 #
 
 class DomainBlock < ApplicationRecord
   include DomainNormalizable
+  include DomainMaterializable
 
   enum severity: [:silence, :suspend, :noop]
 
@@ -72,4 +74,23 @@ class DomainBlock < ApplicationRecord
     scope = suspend? ? accounts.where(suspended_at: created_at) : accounts.where(silenced_at: created_at)
     scope.count
   end
+
+  def public_domain
+    return domain unless obfuscate?
+
+    length        = domain.size
+    visible_ratio = length / 4
+
+    domain.chars.map.with_index do |chr, i|
+      if i > visible_ratio && i < length - visible_ratio && chr != '.'
+        '*'
+      else
+        chr
+      end
+    end.join
+  end
+
+  def domain_digest
+    Digest::SHA256.hexdigest(domain)
+  end
 end
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
index bf0ec4449..35028b7dd 100644
--- a/app/models/favourite.rb
+++ b/app/models/favourite.rb
@@ -36,7 +36,7 @@ class Favourite < ApplicationRecord
   end
 
   def decrement_cache_counters
-    return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?)
+    return if association(:status).loaded? && status.marked_for_destruction?
     status&.decrement_count!(:favourites_count)
   end
 end
diff --git a/app/models/follow.rb b/app/models/follow.rb
index 55a9da792..69a1722b3 100644
--- a/app/models/follow.rb
+++ b/app/models/follow.rb
@@ -26,7 +26,7 @@ class Follow < ApplicationRecord
   has_one :notification, as: :activity, dependent: :destroy
 
   validates :account_id, uniqueness: { scope: :target_account_id }
-  validates_with FollowLimitValidator, on: :create
+  validates_with FollowLimitValidator, on: :create, if: :rate_limit?
 
   scope :recent, -> { reorder(id: :desc) }
 
diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb
index c1f19149b..2d2a77b59 100644
--- a/app/models/follow_request.rb
+++ b/app/models/follow_request.rb
@@ -26,7 +26,7 @@ class FollowRequest < ApplicationRecord
   has_one :notification, as: :activity, dependent: :destroy
 
   validates :account_id, uniqueness: { scope: :target_account_id }
-  validates_with FollowLimitValidator, on: :create
+  validates_with FollowLimitValidator, on: :create, if: :rate_limit?
 
   def authorize!
     account.follow!(target_account, reblogs: show_reblogs, notify: notify, uri: uri)
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index fcec3e686..999d835e6 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -42,6 +42,7 @@ class Form::AdminSettings
     show_domain_blocks_rationale
     noindex
     outgoing_spoilers
+    require_invite_text
   ).freeze
 
   BOOLEAN_KEYS = %i(
@@ -62,6 +63,7 @@ class Form::AdminSettings
     trends
     trendable_by_default
     noindex
+    require_invite_text
   ).freeze
 
   UPLOAD_KEYS = %i(
diff --git a/app/models/import.rb b/app/models/import.rb
index 702453289..00a54892e 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -27,6 +27,7 @@ class Import < ApplicationRecord
   enum type: [:following, :blocking, :muting, :domain_blocking, :bookmarks]
 
   validates :type, presence: true
+  validates_with ImportValidator, on: :create
 
   has_attached_file :data
   validates_attachment_content_type :data, content_type: FILE_TYPES
diff --git a/app/models/instance.rb b/app/models/instance.rb
index 3c740f8a2..29be03662 100644
--- a/app/models/instance.rb
+++ b/app/models/instance.rb
@@ -1,26 +1,63 @@
 # frozen_string_literal: true
+# == Schema Information
+#
+# Table name: instances
+#
+#  domain         :string           primary key
+#  accounts_count :bigint(8)
+#
 
-class Instance
-  include ActiveModel::Model
+class Instance < ApplicationRecord
+  self.primary_key = :domain
 
-  attr_accessor :domain, :accounts_count, :domain_block
+  has_many :accounts, foreign_key: :domain, primary_key: :domain
 
-  def initialize(resource)
-    @domain         = resource.domain
-    @accounts_count = resource.respond_to?(:accounts_count) ? resource.accounts_count : nil
-    @domain_block   = resource.is_a?(DomainBlock) ? resource : DomainBlock.rule_for(domain)
-    @domain_allow   = resource.is_a?(DomainAllow) ? resource : DomainAllow.rule_for(domain)
+  belongs_to :domain_block, foreign_key: :domain, primary_key: :domain
+  belongs_to :domain_allow, foreign_key: :domain, primary_key: :domain
+
+  scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
+
+  def self.refresh
+    Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
   end
 
-  def countable?
-    @accounts_count.present?
+  def readonly?
+    true
   end
 
-  def to_param
-    domain
+  def delivery_failure_tracker
+    @delivery_failure_tracker ||= DeliveryFailureTracker.new(domain)
+  end
+
+  def following_count
+    @following_count ||= Follow.where(account: accounts).count
+  end
+
+  def followers_count
+    @followers_count ||= Follow.where(target_account: accounts).count
+  end
+
+  def reports_count
+    @reports_count ||= Report.where(target_account: accounts).count
   end
 
-  def cache_key
+  def blocks_count
+    @blocks_count ||= Block.where(target_account: accounts).count
+  end
+
+  def public_comment
+    domain_block&.public_comment
+  end
+
+  def private_comment
+    domain_block&.private_comment
+  end
+
+  def media_storage
+    @media_storage ||= MediaAttachment.where(account: accounts).sum(:file_file_size)
+  end
+
+  def to_param
     domain
   end
 end
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
index 9c467bc27..0598d8fea 100644
--- a/app/models/instance_filter.rb
+++ b/app/models/instance_filter.rb
@@ -13,18 +13,27 @@ class InstanceFilter
   end
 
   def results
-    if params[:limited].present?
-      scope = DomainBlock
-      scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present?
-      scope.order(id: :desc)
-    elsif params[:allowed].present?
-      scope = DomainAllow
-      scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present?
-      scope.order(id: :desc)
+    scope = Instance.includes(:domain_block, :domain_allow).order(accounts_count: :desc)
+
+    params.each do |key, value|
+      scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
+    end
+
+    scope
+  end
+
+  private
+
+  def scope_for(key, value)
+    case key.to_s
+    when 'limited'
+      Instance.joins(:domain_block).reorder(Arel.sql('domain_blocks.id desc'))
+    when 'allowed'
+      Instance.joins(:domain_allow).reorder(Arel.sql('domain_allows.id desc'))
+    when 'by_domain'
+      Instance.matches_domain(value)
     else
-      scope = Account.remote
-      scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present?
-      scope.by_domain_accounts
+      raise "Unknown filter: #{key}"
     end
   end
 end
diff --git a/app/models/list.rb b/app/models/list.rb
index 655d55ff6..cdc6ebdb3 100644
--- a/app/models/list.rb
+++ b/app/models/list.rb
@@ -34,17 +34,6 @@ class List < ApplicationRecord
   private
 
   def clean_feed_manager
-    reblog_key       = FeedManager.instance.key(:list, id, 'reblogs')
-    reblogged_id_set = Redis.current.zrange(reblog_key, 0, -1)
-
-    Redis.current.pipelined do
-      Redis.current.del(FeedManager.instance.key(:list, id))
-      Redis.current.del(reblog_key)
-
-      reblogged_id_set.each do |reblogged_id|
-        reblog_set_key = FeedManager.instance.key(:list, id, "reblogs:#{reblogged_id}")
-        Redis.current.del(reblog_set_key)
-      end
-    end
+    FeedManager.instance.clean_feeds!(:list, [id])
   end
 end
diff --git a/app/models/poll.rb b/app/models/poll.rb
index b5deafcc2..e1ca55252 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -25,7 +25,7 @@ class Poll < ApplicationRecord
   belongs_to :account
   belongs_to :status
 
-  has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :destroy
+  has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all
 
   has_many :notifications, as: :activity, dependent: :destroy
 
diff --git a/app/models/report.rb b/app/models/report.rb
index f31bcfd2e..cd08120e4 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -14,6 +14,7 @@
 #  target_account_id          :bigint(8)        not null
 #  assigned_account_id        :bigint(8)
 #  uri                        :string
+#  forwarded                  :boolean
 #
 
 class Report < ApplicationRecord
diff --git a/app/models/status.rb b/app/models/status.rb
index d1ac2e4f2..0d15304b6 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -234,14 +234,6 @@ class Status < ApplicationRecord
     @emojis = CustomEmoji.from_text(fields.join(' '), account.domain)
   end
 
-  def mark_for_mass_destruction!
-    @marked_for_mass_destruction = true
-  end
-
-  def marked_for_mass_destruction?
-    @marked_for_mass_destruction
-  end
-
   def replies_count
     status_stat&.replies_count || 0
   end
@@ -498,7 +490,7 @@ class Status < ApplicationRecord
   end
 
   def decrement_counter_caches
-    return if direct_visibility? || marked_for_mass_destruction?
+    return if direct_visibility?
 
     account&.decrement_count!(:statuses_count)
     reblog&.decrement_count!(:reblogs_count) if reblog?
@@ -508,7 +500,7 @@ class Status < ApplicationRecord
   def unlink_from_conversations
     return unless direct_visibility?
 
-    mentioned_accounts = mentions.includes(:account).map(&:account)
+    mentioned_accounts = (association(:mentions).loaded? ? mentions : mentions.includes(:account)).map(&:account)
     inbox_owners       = mentioned_accounts.select(&:local?) + (account.local? ? [account] : [])
 
     inbox_owners.each do |inbox_owner|
diff --git a/app/models/unavailable_domain.rb b/app/models/unavailable_domain.rb
index e2918b586..5e8870bde 100644
--- a/app/models/unavailable_domain.rb
+++ b/app/models/unavailable_domain.rb
@@ -12,6 +12,8 @@
 class UnavailableDomain < ApplicationRecord
   include DomainNormalizable
 
+  validates :domain, presence: true, uniqueness: true
+
   after_commit :reset_cache!
 
   private
diff --git a/app/models/user.rb b/app/models/user.rb
index 984f04b4e..9316eb228 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -82,7 +82,8 @@ class User < ApplicationRecord
   has_many :webauthn_credentials, dependent: :destroy
 
   has_one :invite_request, class_name: 'UserInviteRequest', inverse_of: :user, dependent: :destroy
-  accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? }
+  accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? && !Setting.require_invite_text }
+  validates :invite_request, presence: true, on: :create, if: :invite_text_required?
 
   validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale?
   validates_with BlacklistedEmailValidator, on: :create
@@ -127,7 +128,7 @@ class User < ApplicationRecord
            to: :settings, prefix: :setting, allow_nil: false
 
   attr_reader :invite_code, :sign_in_token_attempt
-  attr_writer :external
+  attr_writer :external, :bypass_invite_request_check
 
   def confirmed?
     confirmed_at.present?
@@ -428,6 +429,10 @@ class User < ApplicationRecord
     !!@external
   end
 
+  def bypass_invite_request_check?
+    @bypass_invite_request_check
+  end
+
   def sanitize_languages
     return if chosen_languages.nil?
     chosen_languages.reject!(&:blank?)
@@ -465,4 +470,8 @@ class User < ApplicationRecord
   def validate_email_dns?
     email_changed? && !(Rails.env.test? || Rails.env.development?)
   end
+
+  def invite_text_required?
+    Setting.require_invite_text && !invited? && !external? && !bypass_invite_request_check?
+  end
 end
diff --git a/app/policies/account_policy.rb b/app/policies/account_policy.rb
index 262ada42e..672e1786b 100644
--- a/app/policies/account_policy.rb
+++ b/app/policies/account_policy.rb
@@ -14,7 +14,7 @@ class AccountPolicy < ApplicationPolicy
   end
 
   def suspend?
-    staff? && !record.user&.staff?
+    staff? && !record.user&.staff? && !record.instance_actor?
   end
 
   def destroy?
@@ -62,6 +62,6 @@ class AccountPolicy < ApplicationPolicy
   end
 
   def memorialize?
-    admin? && !record.user&.admin?
+    admin? && !record.user&.admin? && !record.instance_actor?
   end
 end
diff --git a/app/policies/domain_block_policy.rb b/app/policies/domain_block_policy.rb
index 47c0a81af..543259cce 100644
--- a/app/policies/domain_block_policy.rb
+++ b/app/policies/domain_block_policy.rb
@@ -13,6 +13,10 @@ class DomainBlockPolicy < ApplicationPolicy
     admin?
   end
 
+  def update?
+    admin?
+  end
+
   def destroy?
     admin?
   end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index ee559037f..a37d904dc 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -29,7 +29,7 @@ class InstancePresenter
   end
 
   def domain_count
-    Rails.cache.fetch('distinct_domain_count') { Account.distinct.count(:domain) }
+    Rails.cache.fetch('distinct_domain_count') { Instance.count }
   end
 
   def sample_accounts
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 21ec0d4be..dafe8f55b 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -7,7 +7,7 @@ class ManifestSerializer < ActiveModel::Serializer
   attributes :name, :short_name, :description,
              :icons, :theme_color, :background_color,
              :display, :start_url, :scope,
-             :share_target
+             :share_target, :shortcuts
 
   def name
     object.site_title
@@ -64,4 +64,42 @@ class ManifestSerializer < ActiveModel::Serializer
       },
     }
   end
+
+  def shortcuts
+    [
+      {
+        name: 'New toot',
+        url: '/web/statuses/new',
+        icons: [
+          {
+            src: '/shortcuts/new-status.png',
+            type: 'image/png',
+            sizes: '192x192',
+          },
+        ],
+      },
+      {
+        name: 'Notifications',
+        url: '/web/notifications',
+        icons: [
+          {
+            src: '/shortcuts/notifications.png',
+            type: 'image/png',
+            sizes: '192x192',
+          },
+        ],
+      },
+      {
+        name: 'Direct messages',
+        url: '/web/timelines/direct',
+        icons: [
+          {
+            src: '/shortcuts/direct.png',
+            type: 'image/png',
+            sizes: '192x192',
+          },
+        ],
+      },
+    ]
+  end
 end
diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb
index e5bd0c47c..9d01f5386 100644
--- a/app/services/activitypub/fetch_remote_account_service.rb
+++ b/app/services/activitypub/fetch_remote_account_service.rb
@@ -28,7 +28,7 @@ class ActivityPub::FetchRemoteAccountService < BaseService
 
     return unless only_key || verified_webfinger?
 
-    ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key)
+    ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key, verified_webfinger: !only_key)
   rescue Oj::ParseError
     nil
   end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 0201c30b3..27b088240 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -28,6 +28,8 @@ class ActivityPub::ProcessAccountService < BaseService
         update_account
         process_tags
         process_attachments
+
+        process_duplicate_accounts! if @options[:verified_webfinger]
       else
         raise Mastodon::RaceConditionError
       end
@@ -70,34 +72,42 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.protocol            = :activitypub
 
     set_suspension!
+    set_immediate_protocol_attributes!
+    set_fetchable_key! unless @account.suspended? && @account.suspension_origin_local?
     set_immediate_attributes! unless @account.suspended?
-    set_fetchable_attributes! unless @options[:only_keys] || @account.suspended?
+    set_fetchable_attributes! unless @options[:only_key] || @account.suspended?
 
     @account.save_with_optional_media!
   end
 
-  def set_immediate_attributes!
+  def set_immediate_protocol_attributes!
     @account.inbox_url               = @json['inbox'] || ''
     @account.outbox_url              = @json['outbox'] || ''
     @account.shared_inbox_url        = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || ''
     @account.followers_url           = @json['followers'] || ''
-    @account.featured_collection_url = @json['featured'] || ''
-    @account.devices_url             = @json['devices'] || ''
     @account.url                     = url || @uri
     @account.uri                     = @uri
+    @account.actor_type              = actor_type
+  end
+
+  def set_immediate_attributes!
+    @account.featured_collection_url = @json['featured'] || ''
+    @account.devices_url             = @json['devices'] || ''
     @account.display_name            = @json['name'] || ''
     @account.note                    = @json['summary'] || ''
     @account.locked                  = @json['manuallyApprovesFollowers'] || false
     @account.fields                  = property_values || {}
     @account.also_known_as           = as_array(@json['alsoKnownAs'] || []).map { |item| value_or_id(item) }
-    @account.actor_type              = actor_type
     @account.discoverable            = @json['discoverable'] || false
   end
 
+  def set_fetchable_key!
+    @account.public_key        = public_key || ''
+  end
+
   def set_fetchable_attributes!
     @account.avatar_remote_url = image_url('icon')  || '' unless skip_download?
     @account.header_remote_url = image_url('image') || '' unless skip_download?
-    @account.public_key        = public_key || ''
     @account.statuses_count    = outbox_total_items    if outbox_total_items.present?
     @account.following_count   = following_total_items if following_total_items.present?
     @account.followers_count   = followers_total_items if followers_total_items.present?
@@ -142,6 +152,12 @@ class ActivityPub::ProcessAccountService < BaseService
     VerifyAccountLinksWorker.perform_async(@account.id)
   end
 
+  def process_duplicate_accounts!
+    return unless Account.where(uri: @account.uri).where.not(id: @account.id).exists?
+
+    AccountMergingWorker.perform_async(@account.id)
+  end
+
   def actor_type
     if @json['type'].is_a?(Array)
       @json['type'].find { |type| ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES.include?(type) }
diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb
index 707672ee0..2b649ee22 100644
--- a/app/services/batched_remove_status_service.rb
+++ b/app/services/batched_remove_status_service.rb
@@ -3,32 +3,41 @@
 class BatchedRemoveStatusService < BaseService
   include Redisable
 
-  # Delete given statuses and reblogs of them
-  # Dispatch PuSH updates of the deleted statuses, but only local ones
-  # Dispatch Salmon deletes, unique per domain, of the deleted statuses, but only local ones
-  # Remove statuses from home feeds
-  # Push delete events to streaming API for home feeds and public feeds
-  # @param [Enumerable<Status>] statuses A preferably batched array of statuses
+  # Delete multiple statuses and reblogs of them as efficiently as possible
+  # @param [Enumerable<Status>] statuses An array of statuses
   # @param [Hash] options
-  # @option [Boolean] :skip_side_effects
+  # @option [Boolean] :skip_side_effects Do not modify feeds and send updates to streaming API
   def call(statuses, **options)
-    statuses = Status.where(id: statuses.map(&:id)).includes(:account).flat_map { |status| [status] + status.reblogs.includes(:account).to_a }
+    ActiveRecord::Associations::Preloader.new.preload(statuses, options[:skip_side_effects] ? :reblogs : [:account, :tags, reblogs: :account])
 
-    @mentions = statuses.each_with_object({}) { |s, h| h[s.id] = s.active_mentions.includes(:account).to_a }
-    @tags     = statuses.each_with_object({}) { |s, h| h[s.id] = s.tags.pluck(:name) }
+    statuses_and_reblogs = statuses.flat_map { |status| [status] + status.reblogs }
 
-    @json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) }
+    # The conversations for direct visibility statuses also need
+    # to be manually updated. This part is not efficient but we
+    # rely on direct visibility statuses being relatively rare.
+    statuses_with_account_conversations = statuses.select(&:direct_visibility?)
 
-    # Ensure that rendered XML reflects destroyed state
-    statuses.each do |status|
-      status.mark_for_mass_destruction!
-      status.destroy
+    ActiveRecord::Associations::Preloader.new.preload(statuses_with_account_conversations, [mentions: :account])
+
+    statuses_with_account_conversations.each do |status|
+      status.send(:unlink_from_conversations)
+      unpush_from_direct_timelines(status)
     end
 
+    # We do not batch all deletes into one to avoid having a long-running
+    # transaction lock the database, but we use the delete method instead
+    # of destroy to avoid all callbacks. We rely on foreign keys to
+    # cascade the delete faster without loading the associations.
+    statuses_and_reblogs.each_slice(50) { |slice| Status.where(id: slice.map(&:id)).delete_all }
+
+    # Since we skipped all callbacks, we also need to manually
+    # deindex the statuses
+    Chewy.strategy.current.update(StatusesIndex, statuses_and_reblogs) if Chewy.enabled?
+
     return if options[:skip_side_effects]
 
     # Batch by source account
-    statuses.group_by(&:account_id).each_value do |account_statuses|
+    statuses_and_reblogs.group_by(&:account_id).each_value do |account_statuses|
       account = account_statuses.first.account
 
       next unless account
@@ -38,20 +47,18 @@ class BatchedRemoveStatusService < BaseService
     end
 
     # Cannot be batched
-    statuses.each do |status|
-      unpush_from_public_timelines(status)
-      unpush_from_direct_timelines(status) if status.direct_visibility?
+    @status_id_cutoff = Mastodon::Snowflake.id_at(2.weeks.ago)
+    redis.pipelined do
+      statuses.each do |status|
+        unpush_from_public_timelines(status)
+      end
     end
   end
 
   private
 
   def unpush_from_home_timelines(account, statuses)
-    recipients = account.followers_for_local_distribution.to_a
-
-    recipients << account if account.local?
-
-    recipients.each do |follower|
+    account.followers_for_local_distribution.includes(:user).reorder(nil).find_each do |follower|
       statuses.each do |status|
         FeedManager.instance.unpush_from_home(follower, status)
       end
@@ -59,7 +66,7 @@ class BatchedRemoveStatusService < BaseService
   end
 
   def unpush_from_list_timelines(account, statuses)
-    account.lists_for_local_distribution.select(:id, :account_id).each do |list|
+    account.lists_for_local_distribution.select(:id, :account_id).includes(account: :user).reorder(nil).find_each do |list|
       statuses.each do |status|
         FeedManager.instance.unpush_from_list(list, status)
       end
@@ -67,40 +74,27 @@ class BatchedRemoveStatusService < BaseService
   end
 
   def unpush_from_public_timelines(status)
-    return unless status.public_visibility?
+    return unless status.public_visibility? && status.id > @status_id_cutoff
 
-    payload = @json_payloads[status.id]
+    payload = Oj.dump(event: :delete, payload: status.id.to_s)
 
-    redis.pipelined do
-      redis.publish('timeline:public', payload)
-      if status.local?
-        redis.publish('timeline:public:local', payload)
-      else
-        redis.publish('timeline:public:remote', payload)
-      end
-      if status.media_attachments.any?
-        redis.publish('timeline:public:media', payload)
-        if status.local?
-          redis.publish('timeline:public:local:media', payload)
-        else
-          redis.publish('timeline:public:remote:media', payload)
-        end
-      end
+    redis.publish('timeline:public', payload)
+    redis.publish(status.local? ? 'timeline:public:local' : 'timeline:public:remote', payload)
 
-      @tags[status.id].each do |hashtag|
-        redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", payload)
-        redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", payload) if status.local?
-      end
+    if status.media_attachments.any?
+      redis.publish('timeline:public:media', payload)
+      redis.publish(status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', payload)
+    end
+
+    status.tags.map { |tag| tag.name.mb_chars.downcase }.each do |hashtag|
+      redis.publish("timeline:hashtag:#{hashtag}", payload)
+      redis.publish("timeline:hashtag:#{hashtag}:local", payload) if status.local?
     end
   end
 
   def unpush_from_direct_timelines(status)
-    payload = @json_payloads[status.id]
-    redis.pipelined do
-      @mentions[status.id].each do |mention|
-        FeedManager.instance.unpush_from_direct(mention.account, status) if mention.account.local?
-      end
-      FeedManager.instance.unpush_from_direct(status.account, status) if status.account.local?
+    status.mentions.each do |mention|
+      FeedManager.instance.unpush_from_direct(mention.account, status) if mention.account.local?
     end
   end
 end
diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb
index 9cb80c95a..2bb533cfb 100644
--- a/app/services/delete_account_service.rb
+++ b/app/services/delete_account_service.rb
@@ -6,15 +6,19 @@ class DeleteAccountService < BaseService
   ASSOCIATIONS_ON_SUSPEND = %w(
     account_pins
     active_relationships
+    aliases
     block_relationships
     blocked_by_relationships
     conversation_mutes
     conversations
     custom_filters
+    devices
     domain_blocks
-    favourites
+    featured_tags
     follow_requests
+    identity_proofs
     list_accounts
+    migrations
     mute_relationships
     muted_by_relationships
     notifications
@@ -25,6 +29,31 @@ class DeleteAccountService < BaseService
     status_pins
   ).freeze
 
+  # The following associations have no important side-effects
+  # in callbacks and all of their own associations are secured
+  # by foreign keys, making them safe to delete without loading
+  # into memory
+  ASSOCIATIONS_WITHOUT_SIDE_EFFECTS = %w(
+    account_pins
+    aliases
+    conversation_mutes
+    conversations
+    custom_filters
+    devices
+    domain_blocks
+    featured_tags
+    follow_requests
+    identity_proofs
+    list_accounts
+    migrations
+    mute_relationships
+    muted_by_relationships
+    notifications
+    owned_lists
+    scheduled_statuses
+    status_pins
+  )
+
   ASSOCIATIONS_ON_DESTROY = %w(
     reports
     targeted_moderation_notes
@@ -55,19 +84,25 @@ class DeleteAccountService < BaseService
 
     @options[:skip_activitypub] = true if @options[:skip_side_effects]
 
-    reject_follows!
-    undo_follows!
-    purge_user!
-    purge_profile!
+    distribute_activities!
     purge_content!
     fulfill_deletion_request!
   end
 
   private
 
-  def reject_follows!
-    return if @account.local? || !@account.activitypub? || @options[:skip_activitypub]
+  def distribute_activities!
+    return if skip_activitypub?
+
+    if @account.local?
+      delete_actor!
+    elsif @account.activitypub?
+      reject_follows!
+      undo_follows!
+    end
+  end
 
+  def reject_follows!
     # When deleting a remote account, the account obviously doesn't
     # actually become deleted on its origin server, i.e. unlike a
     # locally deleted account it continues to have access to its home
@@ -81,8 +116,6 @@ class DeleteAccountService < BaseService
   end
 
   def undo_follows!
-    return if @account.local? || !@account.activitypub? || @options[:skip_activitypub]
-
     # When deleting a remote account, the account obviously doesn't
     # actually become deleted on its origin server, but following relationships
     # are severed on our end. Therefore, make the remote server aware that the
@@ -97,7 +130,7 @@ class DeleteAccountService < BaseService
   def purge_user!
     return if !@account.local? || @account.user.nil?
 
-    if @options[:reserve_email]
+    if keep_user_record?
       @account.user.disable!
       @account.user.invites.where(uses: 0).destroy_all
     else
@@ -106,30 +139,74 @@ class DeleteAccountService < BaseService
   end
 
   def purge_content!
-    distribute_delete_actor! if @account.local? && !@options[:skip_side_effects]
+    purge_user!
+    purge_profile!
+    purge_statuses!
+    purge_media_attachments!
+    purge_polls!
+    purge_generated_notifications!
+    purge_favourites!
+    purge_bookmarks!
+    purge_feeds!
+    purge_other_associations!
+
+    @account.destroy unless keep_account_record?
+  end
 
-    @account.statuses.reorder(nil).find_in_batches do |statuses|
-      statuses.reject! { |status| reported_status_ids.include?(status.id) } if @options[:reserve_username]
-      BatchedRemoveStatusService.new.call(statuses, skip_side_effects: @options[:skip_side_effects])
+  def purge_statuses!
+    @account.statuses.reorder(nil).where.not(id: reported_status_ids).in_batches do |statuses|
+      BatchedRemoveStatusService.new.call(statuses, skip_side_effects: skip_side_effects?)
     end
+  end
 
+  def purge_media_attachments!
     @account.media_attachments.reorder(nil).find_each do |media_attachment|
-      next if @options[:reserve_username] && reported_status_ids.include?(media_attachment.status_id)
+      next if keep_account_record? && reported_status_ids.include?(media_attachment.status_id)
 
       media_attachment.destroy
     end
+  end
+
+  def purge_polls!
+    @account.polls.reorder(nil).where.not(status_id: reported_status_ids).in_batches.delete_all
+  end
+
+  def purge_generated_notifications!
+    # By deleting polls and statuses without callbacks, we've left behind
+    # polymorphically associated notifications generated by this account
 
-    @account.polls.reorder(nil).find_each do |poll|
-      next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id)
+    Notification.where(from_account: @account).in_batches.delete_all
+  end
+
+  def purge_favourites!
+    @account.favourites.in_batches do |favourites|
+      ids = favourites.pluck(:status_id)
+      StatusStat.where(status_id: ids).update_all('favourites_count = GREATEST(0, favourites_count - 1)')
+      Chewy.strategy.current.update(StatusesIndex, ids) if Chewy.enabled?
+      # Rails.cache.delete_multi would be better, but we don't have it yet
+      ids.each { |id| Rails.cache.delete("statuses/#{id}") }
+      favourites.delete_all
+    end
+  end
 
-      poll.destroy
+  def purge_bookmarks!
+    @account.bookmarks.in_batches do |bookmarks|
+      Chewy.strategy.current.update(StatusesIndex, bookmarks.pluck(:status_id)) if Chewy.enabled?
+      bookmarks.delete_all
     end
+  end
 
+  def purge_other_associations!
     associations_for_destruction.each do |association_name|
-      destroy_all(@account.public_send(association_name))
+      purge_association(association_name)
     end
+  end
 
-    @account.destroy unless @options[:reserve_username]
+  def purge_feeds!
+    return unless @account.local?
+
+    FeedManager.instance.clean_feeds!(:home, [@account.id])
+    FeedManager.instance.clean_feeds!(:list, @account.owned_lists.pluck(:id))
   end
 
   def purge_profile!
@@ -137,7 +214,7 @@ class DeleteAccountService < BaseService
     # there is no point wasting time updating
     # its values first
 
-    return unless @options[:reserve_username]
+    return unless keep_account_record?
 
     @account.silenced_at       = nil
     @account.suspended_at      = @options[:suspended_at] || Time.now.utc
@@ -152,6 +229,7 @@ class DeleteAccountService < BaseService
     @account.followers_count   = 0
     @account.following_count   = 0
     @account.moved_to_account  = nil
+    @account.also_known_as     = []
     @account.trust_level       = :untrusted
     @account.avatar.destroy
     @account.header.destroy
@@ -162,11 +240,17 @@ class DeleteAccountService < BaseService
     @account.deletion_request&.destroy
   end
 
-  def destroy_all(association)
-    association.in_batches.destroy_all
+  def purge_association(association_name)
+    association = @account.public_send(association_name)
+
+    if ASSOCIATIONS_WITHOUT_SIDE_EFFECTS.include?(association_name)
+      association.in_batches.delete_all
+    else
+      association.in_batches.destroy_all
+    end
   end
 
-  def distribute_delete_actor!
+  def delete_actor!
     ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url|
       [delete_actor_json, @account.id, inbox_url]
     end
@@ -193,10 +277,26 @@ class DeleteAccountService < BaseService
   end
 
   def associations_for_destruction
-    if @options[:reserve_username]
+    if keep_account_record?
       ASSOCIATIONS_ON_SUSPEND
     else
       ASSOCIATIONS_ON_SUSPEND + ASSOCIATIONS_ON_DESTROY
     end
   end
+
+  def keep_user_record?
+    @options[:reserve_email]
+  end
+
+  def keep_account_record?
+    @options[:reserve_username]
+  end
+
+  def skip_side_effects?
+    @options[:skip_side_effects]
+  end
+
+  def skip_activitypub?
+    @options[:skip_activitypub]
+  end
 end
diff --git a/app/services/import_service.rb b/app/services/import_service.rb
index 288e47f1e..0c6ef2238 100644
--- a/app/services/import_service.rb
+++ b/app/services/import_service.rb
@@ -27,7 +27,7 @@ class ImportService < BaseService
 
   def import_follows!
     parse_import_data!(['Account address'])
-    import_relationships!('follow', 'unfollow', @account.following, follow_limit, reblogs: { header: 'Show boosts', default: true })
+    import_relationships!('follow', 'unfollow', @account.following, ROWS_PROCESSING_LIMIT, reblogs: { header: 'Show boosts', default: true })
   end
 
   def import_blocks!
@@ -85,6 +85,7 @@ class ImportService < BaseService
 
     head_items = items.uniq { |acct, _| acct.split('@')[1] }
     tail_items = items - head_items
+
     Import::RelationshipWorker.push_bulk(head_items + tail_items) do |acct, extra|
       [@account.id, acct, action, extra]
     end
@@ -133,10 +134,6 @@ class ImportService < BaseService
     Paperclip.io_adapters.for(@import.data).read
   end
 
-  def follow_limit
-    FollowLimitValidator.limit_for_account(@account)
-  end
-
   def relations_map_for_account(account, account_ids)
     {
       blocking: {},
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 2918c6f6f..764ed288d 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -160,7 +160,7 @@ class RemoveStatusService < BaseService
   end
 
   def remove_from_direct
-    @mentions.each do |mention|
+    @status.active_mentions.each do |mention|
       FeedManager.instance.unpush_from_direct(mention.account, @status) if mention.account.local?
     end
   end
diff --git a/app/services/report_service.rb b/app/services/report_service.rb
index 1e955c1e7..9d9c7d6c9 100644
--- a/app/services/report_service.rb
+++ b/app/services/report_service.rb
@@ -24,7 +24,8 @@ class ReportService < BaseService
       target_account: @target_account,
       status_ids: @status_ids,
       comment: @comment,
-      uri: @options[:uri]
+      uri: @options[:uri],
+      forwarded: ActiveModel::Type::Boolean.new.cast(@options[:forward])
     )
   end
 
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 74b0b82d0..3301aaf51 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -49,7 +49,7 @@ class ResolveAccountService < BaseService
     # Now it is certain, it is definitely a remote account, and it
     # either needs to be created, or updated from fresh data
 
-    process_account!
+    fetch_account!
   rescue Webfinger::Error, Oj::ParseError => e
     Rails.logger.debug "Webfinger query for #{@uri} failed: #{e}"
     nil
@@ -104,16 +104,12 @@ class ResolveAccountService < BaseService
     acct.gsub(/\Aacct:/, '').split('@')
   end
 
-  def process_account!
+  def fetch_account!
     return unless activitypub_ready?
 
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
-        @account = Account.find_remote(@username, @domain)
-
-        next if actor_json.nil?
-
-        @account = ActivityPub::ProcessAccountService.new.call(@username, @domain, actor_json)
+        @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url)
       else
         raise Mastodon::RaceConditionError
       end
@@ -136,13 +132,6 @@ class ResolveAccountService < BaseService
     @actor_url ||= @webfinger.link('self', 'href')
   end
 
-  def actor_json
-    return @actor_json if defined?(@actor_json)
-
-    json        = fetch_resource(actor_url, false)
-    @actor_json = supported_context?(json) && equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) ? json : nil
-  end
-
   def gone_from_origin?
     @gone
   end
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index 2b10ac1e0..5981e4d98 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -34,16 +34,16 @@ class ResolveURLService < BaseService
 
     # It may happen that the resource is a private toot, and thus not fetchable,
     # but we can return the toot if we already know about it.
-    uris = [@url]
+    scope = Status.where(uri: @url)
 
     # We don't have an index on `url`, so try guessing the `uri` from `url`
     parsed_url = Addressable::URI.parse(@url)
     parsed_url.path.match(%r{/@(?<username>#{Account::USERNAME_RE})/(?<status_id>[0-9]+)\Z}) do |matched|
       parsed_url.path = "/users/#{matched[:username]}/statuses/#{matched[:status_id]}"
-      uris << parsed_url.to_s
+      scope = scope.or(Status.where(uri: parsed_url.to_s, url: @url))
     end
 
-    status = Status.find_by(uri: uris)
+    status = scope.first
 
     authorize_with @on_behalf_of, status, :show? unless status.nil?
     status
diff --git a/app/validators/import_validator.rb b/app/validators/import_validator.rb
new file mode 100644
index 000000000..a182abfa5
--- /dev/null
+++ b/app/validators/import_validator.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class ImportValidator < ActiveModel::Validator
+  KNOWN_HEADERS = [
+    'Account address',
+    '#domain',
+    '#uri',
+  ].freeze
+
+  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 KNOWN_HEADERS.include?(csv_data.first&.first)
+
+    import.errors.add(:data, I18n.t('imports.errors.over_rows_processing_limit', count: ImportService::ROWS_PROCESSING_LIMIT)) if row_count > ImportService::ROWS_PROCESSING_LIMIT
+
+    case import.type
+    when 'following'
+      validate_following_import(import, row_count)
+    end
+  end
+
+  private
+
+  def validate_following_import(import, row_count)
+    base_limit = FollowLimitValidator.limit_for_account(import.account)
+
+    limit = begin
+      if import.overwrite?
+        base_limit
+      else
+        base_limit - import.account.following_count
+      end
+    end
+
+    import.errors.add(:data, I18n.t('users.follow_limit_reached', limit: base_limit)) if row_count > limit
+  end
+end
diff --git a/app/views/about/_domain_blocks.html.haml b/app/views/about/_domain_blocks.html.haml
index e0c5df41d..35a30f16e 100644
--- a/app/views/about/_domain_blocks.html.haml
+++ b/app/views/about/_domain_blocks.html.haml
@@ -7,6 +7,6 @@
     - domain_blocks.each do |domain_block|
       %tr
         %td.nowrap
-          %span{ title: domain_block.domain }= domain_block.domain
+          %span{ title: "SHA-256: #{domain_block.domain_digest}" }= domain_block.public_domain
         %td
           = domain_block.public_comment if display_blocks_rationale?
diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml
index 6160ca4d4..e4d614d71 100644
--- a/app/views/about/_registration.html.haml
+++ b/app/views/about/_registration.html.haml
@@ -16,7 +16,7 @@
     - if approved_registrations?
       .fields-group
         = f.simple_fields_for :invite_request do |invite_request_fields|
-          = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false
+          = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text
 
     .fields-group
       = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: about_more_path, terms_path: terms_path), required: true, disabled: closed_registrations?
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index 0a12ab8d6..78f54ec5a 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -16,11 +16,11 @@
         .row__information-board
           .information-board__section
             %span= t 'about.user_count_before'
-            %strong= number_with_delimiter @instance_presenter.user_count
+            %strong= number_to_human @instance_presenter.user_count, strip_insignificant_zeros: true
             %span= t 'about.user_count_after', count: @instance_presenter.user_count
           .information-board__section
             %span= t 'about.status_count_before'
-            %strong= number_with_delimiter @instance_presenter.status_count
+            %strong= number_to_human @instance_presenter.status_count, strip_insignificant_zeros: true
             %span= t 'about.status_count_after', count: @instance_presenter.status_count
         .row__mascot
           .landing-page__mascot
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index d5978eddd..27e1f80a7 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -1,6 +1,10 @@
 - content_for :page_title do
   = @account.acct
 
+- if @account.instance_actor?
+  .flash-message.notice
+    %strong= t('accounts.instance_actor_flash')
+
 = render 'application/card', account: @account
 
 - account = @account
@@ -242,3 +246,13 @@
 
     .actions
       = f.button :button, t('admin.account_moderation_notes.create'), type: :submit
+
+  %hr.spacer/
+
+  - if @account.user&.invite_request&.text&.present?
+    %div.speech-bubble
+      %div.speech-bubble__bubble
+        = @account.user&.invite_request&.text
+      %div.speech-bubble__owner
+        = admin_account_link_to @account
+        = t('admin.accounts.invite_request_text')
diff --git a/app/views/admin/domain_blocks/edit.html.haml b/app/views/admin/domain_blocks/edit.html.haml
index 8669bb6d1..c76a7a7f8 100644
--- a/app/views/admin/domain_blocks/edit.html.haml
+++ b/app/views/admin/domain_blocks/edit.html.haml
@@ -17,6 +17,9 @@
   .fields-group
     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint')
 
+  .fields-group
+    = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint')
+
   .field-group
     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6
 
diff --git a/app/views/admin/domain_blocks/new.html.haml b/app/views/admin/domain_blocks/new.html.haml
index a643825df..b04ce7d9c 100644
--- a/app/views/admin/domain_blocks/new.html.haml
+++ b/app/views/admin/domain_blocks/new.html.haml
@@ -17,6 +17,9 @@
   .fields-group
     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint')
 
+  .fields-group
+    = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint')
+
   .field-group
     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6
 
diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml
new file mode 100644
index 000000000..188d0d984
--- /dev/null
+++ b/app/views/admin/instances/_instance.html.haml
@@ -0,0 +1,25 @@
+.directory__tag
+  = link_to admin_instance_path(instance) do
+    %h4
+      = instance.domain
+      %small
+        - if instance.domain_block
+          - first_item = true
+          - if !instance.domain_block.noop?
+            = t("admin.domain_blocks.severity.#{instance.domain_block.severity}")
+            - first_item = false
+          - unless instance.domain_block.suspend?
+            - if instance.domain_block.reject_media?
+              - unless first_item
+                &bull;
+              = t('admin.domain_blocks.rejecting_media')
+              - first_item = false
+            - if instance.domain_block.reject_reports?
+              - unless first_item
+                &bull;
+              = t('admin.domain_blocks.rejecting_reports')
+        - elsif whitelist_mode?
+          = t('admin.accounts.whitelisted')
+        - else
+          = t('admin.accounts.no_limits_imposed')
+    .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index 696ba3c7f..5f20e7ec0 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -32,32 +32,10 @@
 
 %hr.spacer/
 
-- @instances.each do |instance|
-  .directory__tag
-    = link_to admin_instance_path(instance) do
-      %h4
-        = instance.domain
-        %small
-          - if instance.domain_block
-            - first_item = true
-            - if !instance.domain_block.noop?
-              = t("admin.domain_blocks.severity.#{instance.domain_block.severity}")
-              - first_item = false
-            - unless instance.domain_block.suspend?
-              - if instance.domain_block.reject_media?
-                - unless first_item
-                  &bull;
-                = t('admin.domain_blocks.rejecting_media')
-                - first_item = false
-              - if instance.domain_block.reject_reports?
-                - unless first_item
-                  &bull;
-                = t('admin.domain_blocks.rejecting_reports')
-          - elsif whitelist_mode?
-            = t('admin.accounts.whitelisted')
-          - else
-            = t('admin.accounts.no_limits_imposed')
-      - if instance.countable?
-        .trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true
-
-= paginate paginated_instances
+- if @instances.empty?
+  %div.muted-hint.center-text
+    = t 'admin.instances.empty'
+- else
+  = render @instances
+
+= paginate @instances
diff --git a/app/views/admin/instances/show.html.haml b/app/views/admin/instances/show.html.haml
index 92e14c0df..0b9382771 100644
--- a/app/views/admin/instances/show.html.haml
+++ b/app/views/admin/instances/show.html.haml
@@ -3,57 +3,59 @@
 
 .dashboard__counters
   %div
+    = link_to admin_accounts_path(remote: '1', by_domain: @instance.domain) do
+      .dashboard__counters__num= number_with_delimiter @instance.accounts_count
+      .dashboard__counters__label= t 'admin.accounts.title'
+  %div
+    = link_to admin_reports_path(by_target_domain: @instance.domain) do
+      .dashboard__counters__num= number_with_delimiter @instance.reports_count
+      .dashboard__counters__label= t 'admin.instances.total_reported'
+  %div
     %div
-      .dashboard__counters__num= number_with_delimiter @following_count
-      .dashboard__counters__label= t 'admin.instances.total_followed_by_them'
+      .dashboard__counters__num= number_to_human_size @instance.media_storage
+      .dashboard__counters__label= t 'admin.instances.total_storage'
   %div
     %div
-      .dashboard__counters__num= number_with_delimiter @followers_count
-      .dashboard__counters__label= t 'admin.instances.total_followed_by_us'
+      .dashboard__counters__num= number_with_delimiter @instance.following_count
+      .dashboard__counters__label= t 'admin.instances.total_followed_by_them'
   %div
     %div
-      .dashboard__counters__num= number_to_human_size @media_storage
-      .dashboard__counters__label= t 'admin.instances.total_storage'
+      .dashboard__counters__num= number_with_delimiter @instance.followers_count
+      .dashboard__counters__label= t 'admin.instances.total_followed_by_us'
   %div
     %div
-      .dashboard__counters__num= number_with_delimiter @blocks_count
+      .dashboard__counters__num= number_with_delimiter @instance.blocks_count
       .dashboard__counters__label= t 'admin.instances.total_blocked_by_us'
-  %div
-    = link_to admin_reports_path(by_target_domain: @instance.domain) do
-      .dashboard__counters__num= number_with_delimiter @reports_count
-      .dashboard__counters__label= t 'admin.instances.total_reported'
+
   %div
     %div
       .dashboard__counters__num
-        - if @available
+        - if @instance.delivery_failure_tracker.available?
           = fa_icon 'check'
         - else
           = fa_icon 'times'
       .dashboard__counters__label= t 'admin.instances.delivery_available'
 
-- if @private_comment.present?
+- if @instance.private_comment.present?
   .speech-bubble
     .speech-bubble__bubble
-      = simple_format(h(@private_comment))
+      = simple_format(h(@instance.private_comment))
     .speech-bubble__owner= t 'admin.instances.private_comment'
 
-- if @public_comment.present?
+- if @instance.public_comment.present?
   .speech-bubble
     .speech-bubble__bubble
-      = simple_format(h(@public_comment))
+      = simple_format(h(@instance.public_comment))
     .speech-bubble__owner= t 'admin.instances.public_comment'
 
 %hr.spacer/
 
 %div.action-buttons
   %div
-    = link_to t('admin.accounts.title'), admin_accounts_path(remote: '1', by_domain: @instance.domain), class: 'button'
-
-  %div
-    - if @domain_allow
-      = link_to t('admin.domain_allows.undo'), admin_domain_allow_path(@domain_allow), class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete }
-    - elsif @domain_block
-      = link_to t('admin.domain_blocks.edit'), edit_admin_domain_block_path(@domain_block), class: 'button'
-      = link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@domain_block), class: 'button'
+    - if @instance.domain_allow
+      = link_to t('admin.domain_allows.undo'), admin_domain_allow_path(@instance.domain_allow), class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure'), method: :delete }
+    - elsif @instance.domain_block
+      = link_to t('admin.domain_blocks.edit'), edit_admin_domain_block_path(@instance.domain_block), class: 'button'
+      = link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@instance.domain_block), class: 'button'
     - else
       = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button'
diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml
index bb441380e..721c55f71 100644
--- a/app/views/admin/reports/index.html.haml
+++ b/app/views/admin/reports/index.html.haml
@@ -59,6 +59,10 @@
                 = fa_icon('camera')
                 = report.media_attachments.count
 
+              - if report.forwarded?
+                ·
+                = t('admin.reports.forwarded_to', domain: target_account.domain)
+
           .report-card__summary__item__assigned
             - if report.assigned_account.present?
               = admin_account_link_to report.assigned_account
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index 4ecc8dc93..167e96c03 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -43,6 +43,16 @@
         %td{ colspan: 2 }
           - if @report.action_taken?
             = table_link_to 'envelope-open', t('admin.reports.reopen'), admin_report_path(@report, outcome: 'reopen'), method: :put
+      - unless @report.target_account.local?
+        %tr
+          %th= t('admin.reports.forwarded')
+          %td{ colspan: 3 }
+            - if @report.forwarded.nil?
+              \-
+            - elsif @report.forwarded?
+              = t('simple_form.yes')
+            - else
+              = t('simple_form.no')
       - if !@report.action_taken_by_account.nil?
         %tr
           %th= t('admin.reports.action_taken_by')
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
index 108846ca9..fa8d8441e 100644
--- a/app/views/admin/settings/edit.html.haml
+++ b/app/views/admin/settings/edit.html.haml
@@ -41,7 +41,14 @@
   %hr.spacer/
 
   .fields-group
-    = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title')
+    = f.input :require_invite_text, as: :boolean, wrapper: :with_label, label: t('admin.settings.registrations.require_invite_text.title'), hint: t('admin.settings.registrations.require_invite_text.desc_html'), disabled: !approved_registrations?
+  .fields-group
+
+  %hr.spacer/
+
+  .fields-group
+    = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title'), hint: t('admin.settings.enable_bootstrap_timeline_accounts.desc_html')
+
   .fields-group
     = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html'), disabled: !Setting.enable_bootstrap_timeline_accounts
 
diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml
index de541847f..6981195ed 100644
--- a/app/views/auth/registrations/new.html.haml
+++ b/app/views/auth/registrations/new.html.haml
@@ -31,7 +31,7 @@
   - if approved_registrations? && !@invite.present?
     .fields-group
       = f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields|
-        = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false
+        = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text
 
   = f.input :invite_code, as: :hidden
 
diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml
index e992e5563..9b7e1b65c 100644
--- a/app/views/notification_mailer/_status.html.haml
+++ b/app/views/notification_mailer/_status.html.haml
@@ -26,11 +26,11 @@
                                       = "@#{status.account.acct}"
 
                               - if status.spoiler_text?
-                                %div{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }
+                                %div.auto-dir
                                   %p
                                     = Formatter.instance.format_spoiler(status)
 
-                              %div{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }
+                              %div.auto-dir
                                 = Formatter.instance.format(status)
 
                                 - if status.media_attachments.size > 0
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index a4dd8534f..4c879472d 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -20,7 +20,7 @@
       %p<
         %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)}&nbsp;
         %button.status__content__spoiler-link= t('statuses.show_more')
-    .e-content{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }
+    .e-content
       = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
       - if status.preloadable_poll
         = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index cbeefdffe..1b501a3ef 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -29,7 +29,7 @@
       %p<
         %span.p-summary> #{Formatter.instance.format_spoiler(status, autoplay: autoplay)}&nbsp;
         %button.status__content__spoiler-link= t('statuses.show_more')
-    .e-content{ dir: rtl_status?(status) ? 'rtl' : 'ltr' }<
+    .e-content<
       = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
       - if status.preloadable_poll
         = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.preloadable_poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
diff --git a/app/workers/account_deletion_worker.rb b/app/workers/account_deletion_worker.rb
index 98b67419d..fdf013e01 100644
--- a/app/workers/account_deletion_worker.rb
+++ b/app/workers/account_deletion_worker.rb
@@ -3,7 +3,7 @@
 class AccountDeletionWorker
   include Sidekiq::Worker
 
-  sidekiq_options queue: 'pull'
+  sidekiq_options queue: 'pull', lock: :until_executed
 
   def perform(account_id, options = {})
     reserve_username = options.with_indifferent_access.fetch(:reserve_username, true)
diff --git a/app/workers/account_merging_worker.rb b/app/workers/account_merging_worker.rb
new file mode 100644
index 000000000..8c234e7ac
--- /dev/null
+++ b/app/workers/account_merging_worker.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AccountMergingWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: 'pull'
+
+  def perform(account_id)
+    account = Account.find(account_id)
+
+    return true if account.nil? || account.local?
+
+    Account.where(uri: account.uri).where.not(id: account.id).find_each do |duplicate|
+      account.merge_with!(duplicate)
+      duplicate.destroy
+    end
+  end
+end
diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb
index 99e3440fe..96c17c578 100644
--- a/app/workers/scheduler/feed_cleanup_scheduler.rb
+++ b/app/workers/scheduler/feed_cleanup_scheduler.rb
@@ -15,41 +15,15 @@ class Scheduler::FeedCleanupScheduler
   private
 
   def clean_home_feeds!
-    clean_feeds!(inactive_account_ids, :home)
+    feed_manager.clean_feeds!(:home, inactive_account_ids)
   end
 
   def clean_list_feeds!
-    clean_feeds!(inactive_list_ids, :list)
+    feed_manager.clean_feeds!(:list, inactive_list_ids)
   end
 
   def clean_direct_feeds!
-    clean_feeds!(inactive_account_ids, :direct)
-  end
-
-  def clean_feeds!(ids, type)
-    reblogged_id_sets = {}
-
-    redis.pipelined do
-      ids.each do |feed_id|
-        redis.del(feed_manager.key(type, feed_id))
-        reblog_key = feed_manager.key(type, feed_id, 'reblogs')
-        # We collect a future for this: we don't block while getting
-        # it, but we can iterate over it later.
-        reblogged_id_sets[feed_id] = redis.zrange(reblog_key, 0, -1)
-        redis.del(reblog_key)
-      end
-    end
-
-    # Remove all of the reblog tracking keys we just removed the
-    # references to.
-    redis.pipelined do
-      reblogged_id_sets.each do |feed_id, future|
-        future.value.each do |reblogged_id|
-          reblog_set_key = feed_manager.key(type, feed_id, "reblogs:#{reblogged_id}")
-          redis.del(reblog_set_key)
-        end
-      end
-    end
+    feed_manager.clean_feeds!(:direct, inactive_account_ids)
   end
 
   def inactive_account_ids
diff --git a/app/workers/scheduler/instance_refresh_scheduler.rb b/app/workers/scheduler/instance_refresh_scheduler.rb
new file mode 100644
index 000000000..917404bec
--- /dev/null
+++ b/app/workers/scheduler/instance_refresh_scheduler.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class Scheduler::InstanceRefreshScheduler
+  include Sidekiq::Worker
+
+  sidekiq_options lock: :until_executed, retry: 0
+
+  def perform
+    Instance.refresh
+  end
+end
diff --git a/boxfile.yml b/boxfile.yml
index c4fd19ce6..c1d89bb15 100644
--- a/boxfile.yml
+++ b/boxfile.yml
@@ -110,6 +110,7 @@ worker.sidekiq:
     mailers: bundle exec sidekiq -c 5 -q mailers -L /app/log/sidekiq.log
     pull: bundle exec sidekiq -c 5 -q pull -L /app/log/sidekiq.log
     push: bundle exec sidekiq -c 5 -q push -L /app/log/sidekiq.log
+    scheduler: bundle exec sidekiq -c 5 -q scheduler -L /app/log/sidekiq.log
 
   writable_dirs:
     - tmp
diff --git a/chart/Chart.yaml b/chart/Chart.yaml
index 783569451..19f9c64c7 100644
--- a/chart/Chart.yaml
+++ b/chart/Chart.yaml
@@ -15,12 +15,12 @@ type: application
 # This is the chart version. This version number should be incremented each time you make changes
 # to the chart and its templates, including the app version.
 # Versions are expected to follow Semantic Versioning (https://semver.org/)
-version: 0.1.0
+version: 0.1.2
 
 # This is the version number of the application being deployed. This version number should be
 # incremented each time you make changes to the application. Versions are not expected to
 # follow Semantic Versioning. They should reflect the version the application is using.
-appVersion: 3.1.5
+appVersion: 3.3.0
 
 dependencies:
   - name: elasticsearch
diff --git a/chart/values.yaml.template b/chart/values.yaml.template
index c1dc29f57..9e50c6dac 100644
--- a/chart/values.yaml.template
+++ b/chart/values.yaml.template
@@ -4,7 +4,7 @@ image:
   repository: tootsuite/mastodon
   pullPolicy: Always
   # https://hub.docker.com/r/tootsuite/mastodon/tags
-  tag: v3.2.1
+  tag: v3.3.0
   # alternatively, use `latest` for the latest release or `edge` for the image
   # built from the most recent commit
   #
diff --git a/config/boot.rb b/config/boot.rb
index f3e36203a..6cde5319d 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,3 +1,8 @@
+unless ENV.key?('RAILS_ENV')
+  STDERR.puts 'ERROR: Missing RAILS_ENV environment variable, please set it to "production", "development", or "test".'
+  exit 1
+end
+
 ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
 
 require 'bundler/setup' # Set up gems listed in the Gemfile.
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index baa993c78..dcbfd02b4 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -103,6 +103,37 @@
       "note": ""
     },
     {
+      "warning_type": "Dynamic Render Path",
+      "warning_code": 15,
+      "fingerprint": "4704e8093e3e0561bf705f892e8fc6780419f8255f4440b1c0afd09339bd6446",
+      "check_name": "Render",
+      "message": "Render path contains parameter value",
+      "file": "app/views/admin/instances/index.html.haml",
+      "line": 39,
+      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
+      "code": "render(action => filtered_instances.page(params[:page]), {})",
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::InstancesController",
+          "method": "index",
+          "line": 10,
+          "file": "app/controllers/admin/instances_controller.rb",
+          "rendered": {
+            "name": "admin/instances/index",
+            "file": "app/views/admin/instances/index.html.haml"
+          }
+        }
+      ],
+      "location": {
+        "type": "template",
+        "template": "admin/instances/index"
+      },
+      "user_input": "params[:page]",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
       "warning_type": "Redirect",
       "warning_code": 18,
       "fingerprint": "5fad11cd67f905fab9b1d5739d01384a1748ebe78c5af5ac31518201925265a7",
@@ -125,6 +156,26 @@
     {
       "warning_type": "SQL Injection",
       "warning_code": 0,
+      "fingerprint": "6e4051854bb62e2ddbc671f82d6c2328892e1134b8b28105ecba9b0122540714",
+      "check_name": "SQL",
+      "message": "Possible SQL injection",
+      "file": "app/models/account.rb",
+      "line": 491,
+      "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
+      "code": "find_by_sql([\"          WITH first_degree AS (\\n            SELECT target_account_id\\n            FROM follows\\n            WHERE account_id = ?\\n            UNION ALL\\n            SELECT ?\\n          )\\n          SELECT\\n            accounts.*,\\n            (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n          FROM accounts\\n          LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?)\\n          WHERE accounts.id IN (SELECT * FROM first_degree)\\n            AND #{query} @@ #{textsearch}\\n            AND accounts.suspended_at IS NULL\\n            AND accounts.moved_to_account_id IS NULL\\n          GROUP BY accounts.id\\n          ORDER BY rank DESC\\n          LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, account.id, limit, offset])",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Account",
+        "method": "advanced_search_for"
+      },
+      "user_input": "textsearch",
+      "confidence": "Medium",
+      "note": ""
+    },
+    {
+      "warning_type": "SQL Injection",
+      "warning_code": 0,
       "fingerprint": "6f075c1484908e3ec9bed21ab7cf3c7866be8da3881485d1c82e13093aefcbd7",
       "check_name": "SQL",
       "message": "Possible SQL injection",
@@ -163,23 +214,23 @@
       "note": ""
     },
     {
-      "warning_type": "Mass Assignment",
-      "warning_code": 105,
-      "fingerprint": "8f63dec68951d9bcf7eddb15af9392b2e1333003089c41fb76688dfd3579f394",
-      "check_name": "PermitAttributes",
-      "message": "Potentially dangerous key allowed for mass assignment",
-      "file": "app/controllers/api/v1/crypto/deliveries_controller.rb",
-      "line": 23,
-      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
-      "code": "params.require(:device).permit(:account_id, :device_id, :type, :body, :hmac)",
+      "warning_type": "SQL Injection",
+      "warning_code": 0,
+      "fingerprint": "9251d682c4e2840e1b2fea91e7d758efe2097ecb7f6255c065e3750d25eb178c",
+      "check_name": "SQL",
+      "message": "Possible SQL injection",
+      "file": "app/models/account.rb",
+      "line": 460,
+      "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
+      "code": "find_by_sql([\"        SELECT\\n          accounts.*,\\n          ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n        FROM accounts\\n        WHERE #{query} @@ #{textsearch}\\n          AND accounts.suspended_at IS NULL\\n          AND accounts.moved_to_account_id IS NULL\\n        ORDER BY rank DESC\\n        LIMIT ? OFFSET ?\\n\".squish, limit, offset])",
       "render_path": null,
       "location": {
         "type": "method",
-        "class": "Api::V1::Crypto::DeliveriesController",
-        "method": "resource_params"
+        "class": "Account",
+        "method": "search_for"
       },
-      "user_input": ":account_id",
-      "confidence": "High",
+      "user_input": "textsearch",
+      "confidence": "Medium",
       "note": ""
     },
     {
@@ -274,6 +325,26 @@
       "note": ""
     },
     {
+      "warning_type": "SQL Injection",
+      "warning_code": 0,
+      "fingerprint": "e21d8fee7a5805761679877ca35ed1029c64c45ef3b4012a30262623e1ba8bb9",
+      "check_name": "SQL",
+      "message": "Possible SQL injection",
+      "file": "app/models/account.rb",
+      "line": 507,
+      "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
+      "code": "find_by_sql([\"          SELECT\\n            accounts.*,\\n            (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n          FROM accounts\\n          LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?)\\n          WHERE #{query} @@ #{textsearch}\\n            AND accounts.suspended_at IS NULL\\n            AND accounts.moved_to_account_id IS NULL\\n          GROUP BY accounts.id\\n          ORDER BY rank DESC\\n          LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, limit, offset])",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Account",
+        "method": "advanced_search_for"
+      },
+      "user_input": "textsearch",
+      "confidence": "Medium",
+      "note": ""
+    },
+    {
       "warning_type": "Mass Assignment",
       "warning_code": 105,
       "fingerprint": "e867661b2c9812bc8b75a5df12b28e2a53ab97015de0638b4e732fe442561b28",
@@ -294,6 +365,6 @@
       "note": ""
     }
   ],
-  "updated": "2020-06-01 18:18:02 +0200",
-  "brakeman_version": "4.8.0"
+  "updated": "2020-12-07 01:17:13 +0100",
+  "brakeman_version": "4.10.0"
 }
diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb
index 8f54abf77..9fc9b2f1a 100644
--- a/config/initializers/chewy.rb
+++ b/config/initializers/chewy.rb
@@ -12,6 +12,10 @@ Chewy.settings = {
   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.use_after_commit_callbacks = false
@@ -37,6 +41,7 @@ Elasticsearch::Transport::Client.prepend Module.new {
     super arguments
   end
 }
+
 Elasticsearch::API::Indices::IndicesClient.prepend Module.new {
   def create(arguments = {})
     arguments[:include_type_name] = true
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 25adcd8d6..9ad7fd814 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -113,3 +113,14 @@ else
 end
 
 Paperclip.options[:content_type_mappings] = { csv: Import::FILE_TYPES }
+
+# In some places in the code, we rescue this exception, but we don't always
+# load the S3 library, so it may be an undefined constant:
+
+unless defined?(Seahorse)
+  module Seahorse
+    module Client
+      class NetworkingError < StandardError; end
+    end
+  end
+end
diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml
index 24e2760da..d6b3c40e4 100644
--- a/config/locales/activerecord.kab.yml
+++ b/config/locales/activerecord.kab.yml
@@ -3,7 +3,7 @@ kab:
   activerecord:
     attributes:
       poll:
-        expires_at: Azemz n tagara
+        expires_at: Azemz n taggara
         options: Tifranin
     errors:
       models:
diff --git a/config/locales/activerecord.sc.yml b/config/locales/activerecord.sc.yml
index 646737269..cae24d30c 100644
--- a/config/locales/activerecord.sc.yml
+++ b/config/locales/activerecord.sc.yml
@@ -4,3 +4,14 @@ sc:
     attributes:
       poll:
         expires_at: Iscadèntzia
+        options: Seberos
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: petzi lìteras, nùmeros e tratigheddos bassos
+        status:
+          attributes:
+            reblog:
+              taken: de s'istadu esistet giai
diff --git a/config/locales/activerecord.tt.yml b/config/locales/activerecord.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales/activerecord.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 3de687ed6..ee3c554b4 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -60,6 +60,7 @@ ca:
       one: Seguidor
       other: Seguidors
     following: Seguint
+    instance_actor_flash: Aquest compte és un actor virtual usat per a representar el mateix servidor i no cap usuari individual. Es fa servir per a federar i no s'hauria d'esborrar.
     joined: Unit des de %{date}
     last_active: darrer actiu
     link_verified_on: La propietat d'aquest enllaç s'ha verificat el %{date}
@@ -131,6 +132,7 @@ ca:
       follows: Segueix
       header: Capçalera
       inbox_url: URL de la safata d'entrada
+      invite_request_text: Motiu del registre
       invited_by: Convidat per
       ip: IP
       joined: Unit
@@ -255,6 +257,7 @@ ca:
         unsuspend_account: Desfés la suspensió del compte
         update_announcement: Actualitza l'anunci
         update_custom_emoji: Actualitza l'emoji personalitzat
+        update_domain_block: Actualitza el Bloqueig de Domini
         update_status: Actualitza l'estat
       actions:
         assigned_to_self_report: "%{name} han assignat l'informe %{target} a ells mateixos"
@@ -295,6 +298,7 @@ ca:
         unsuspend_account: "%{name} ha llevat la suspensió del compte de %{target}"
         update_announcement: "%{name} ha actualitzat l'anunci %{target}"
         update_custom_emoji: "%{name} ha actualitzat l'emoji %{target}"
+        update_domain_block: "%{name} ha actualitzat el bloqueig de domini per %{target}"
         update_status: "%{name} estat actualitzat per %{target}"
       deleted_status: "(tut esborrat)"
       empty: No s’han trobat registres.
@@ -398,6 +402,8 @@ ca:
           silence: Silenci
           suspend: Suspensió
         title: Bloqueig de domini nou
+      obfuscate: Oculta el nom del domini
+      obfuscate_hint: Oculta parcialment el nom del domini si està activat mostrar la llista de dominis limitats
       private_comment: Comentari privat
       private_comment_hint: Comentari sobre aquesta limitació del domini per a ús intern dels moderadors.
       public_comment: Comentari públic
@@ -437,6 +443,7 @@ ca:
     instances:
       by_domain: Domini
       delivery_available: El lliurament està disponible
+      empty: No s'han trobat dominis.
       known_accounts:
         one: "%{count} compte conegut"
         other: "%{count} comptes coneguts"
@@ -514,6 +521,8 @@ ca:
       comment:
         none: Cap
       created_at: Reportat
+      forwarded: Reenviat
+      forwarded_to: Reenviat a %{domain}
       mark_as_resolved: Marca com a resolt
       mark_as_unresolved: Marcar com a sense resoldre
       notes:
@@ -557,6 +566,7 @@ ca:
       domain_blocks_rationale:
         title: Mostra el raonament
       enable_bootstrap_timeline_accounts:
+        desc_html: Fer que els nous usuaris segueixin automàticament als comptes configurats i la seva línia de temps no arrenqui buida
         title: Activa els seguiments per defecte per els usuaris nous
       hero:
         desc_html: Es mostra en pàgina frontal. Recomanat al menys 600x100px. Si no es configura es mostrarà el del servidor
@@ -583,6 +593,9 @@ ca:
         min_invite_role:
           disabled: Ningú
           title: Permet les invitacions de
+        require_invite_text:
+          desc_html: Quan el registre requereix aprovació manual, fer que sigui obligatori enlloc d'opcions l escriure el text de la solicitud d'invitació "Perquè vols unirte?"
+          title: Requerir als nous usuaris omplir el text de la solicitud d'invitació
       registrations_mode:
         modes:
           approved: Es requereix l’aprovació per registrar-se
@@ -751,6 +764,7 @@ ca:
       functional: El teu compte és plenament operatiu.
       pending: La vostra sol·licitud està pendent de revisió pel nostre personal. Això pot trigar una mica. Rebreu un correu electrònic quan sigui aprovada.
       redirecting_to: El teu compte és inactiu perquè actualment està redirigint a %{acct}.
+    too_fast: Formulari enviat massa ràpid, torna a provar-ho.
     trouble_logging_in: Problemes per iniciar la sessió?
     use_security_key: Usa clau de seguretat
   authorize_follow:
@@ -910,6 +924,8 @@ ca:
     status: Estat de verificació
     view_proof: Veure la prova
   imports:
+    errors:
+      over_rows_processing_limit: conté més de %{count} files
     modes:
       merge: Fusionar
       merge_long: Mantenir els registres existents i afegir-ne de nous
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 7cf6f2108..29ba79688 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -60,6 +60,7 @@ co:
       one: Abbunatu·a
       other: Abbunati
     following: Abbunamenti
+    instance_actor_flash: Stu contu virtuale riprisenta u servore stessu, micca un'utilizatore individuale. Hè utilizatu per scopi di federazione è ùn duveria mai esse suspesu.
     joined: Quì dapoi %{date}
     last_active: ultima attività
     link_verified_on: A pruprietà d'issu ligame hè stata verificata u %{date}
@@ -131,6 +132,7 @@ co:
       follows: Abbunamenti
       header: Ritrattu di cuprendula
       inbox_url: URL di l’inbox
+      invite_request_text: Ragione di l'arregistramentu
       invited_by: Invitatu da
       ip: IP
       joined: Ghjuntu
@@ -255,6 +257,7 @@ co:
         unsuspend_account: Ùn Suspende Più u Contu
         update_announcement: Cambià Annunziu
         update_custom_emoji: Cambià Emoji Persunalizata
+        update_domain_block: Mette à Ghjornu Blucchime di Duminiu
         update_status: Cambià Statutu
       actions:
         assigned_to_self_report: "%{name} s’hè assignatu u signalamentu %{target}"
@@ -295,6 +298,7 @@ co:
         unsuspend_account: "%{name} hà fattu che u contu di %{target} ùn hè più suspesu"
         update_announcement: "%{name} hà cambiatu u novu annunziu %{target}"
         update_custom_emoji: "%{name} hà messu à ghjornu l’emoji %{target}"
+        update_domain_block: "%{name} hà messu à ghjornu u blucchime di duminiu per %{target}"
         update_status: "%{name} hà cambiatu u statutu di %{target}"
       deleted_status: "(statutu sguassatu)"
       empty: Nunda trovu.
@@ -437,6 +441,7 @@ co:
     instances:
       by_domain: Duminiu
       delivery_available: Rimessa dispunibule
+      empty: Mancun duminiu trovu.
       known_accounts:
         one: "%{count} contu cunnisciutu"
         other: "%{count} conti cunnisciuti"
@@ -514,6 +519,8 @@ co:
       comment:
         none: Nisunu
       created_at: Palisatu
+      forwarded: Trasferitu
+      forwarded_to: Trasferistu à %{domain}
       mark_as_resolved: Indicà cum’è chjosu
       mark_as_unresolved: Indicà cum’è sempre apertu
       notes:
@@ -581,8 +588,10 @@ co:
           desc_html: Auturizà tuttu u mondu à sguassà u so propiu contu
           title: Auturizà à sguassà i conti
         min_invite_role:
-          disabled: Nisunu
+          disabled: Nimu
           title: Auturizà l’invitazione da
+        require_invite_text:
+          title: Richiede chì i novi utilizatori empiinu una dumanda d'invitazione
       registrations_mode:
         modes:
           approved: Apprubazione necessaria per arregistrassi
@@ -751,6 +760,7 @@ co:
       functional: U vostru contu hè uperaziunale.
       pending: A vostra dumanda hè in attesa di rivista da a squadra di muderazione. Quessa pò piglià un certu tempu. Avete da riceve un'e-mail s'ella hè appruvata.
       redirecting_to: U vostru contu hè inattivu perchè riindirizza versu %{acct}.
+    too_fast: Furmulariu mandatu troppu prestu, ripruvate.
     trouble_logging_in: Difficultà per cunnettavi?
     use_security_key: Utilizà a chjave di sicurità
   authorize_follow:
@@ -842,6 +852,7 @@ co:
       request: Dumandà u vostr’archiviu
       size: Pesu
     blocks: Bluccate
+    bookmarks: Segnalibri
     csv: CSV
     domain_blocks: Blucchime di duminiu
     lists: Liste
@@ -918,6 +929,7 @@ co:
     success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu
     types:
       blocking: Persone chì bluccate
+      bookmarks: Segnalibri
       domain_blocking: Lista di blucchimi di duminiu
       following: Persone chì seguitate
       muting: Persone chì piattate
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 78c7c6f15..34d03f808 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -60,6 +60,7 @@ de:
       one: Folgender
       other: Folgende
     following: Folgt
+    instance_actor_flash: Dieses Konto ist ein virtueller Akteur, der den Server selbst repräsentiert und nicht ein einzelner Benutzer. Es wird für Föderationszwecke verwendet und sollte nicht gesperrt werden.
     joined: Beigetreten am %{date}
     last_active: zuletzt aktiv
     link_verified_on: Besitz des Links wurde überprüft am %{date}
@@ -131,6 +132,7 @@ de:
       follows: Folgt
       header: Titelbild
       inbox_url: Posteingangs-URL
+      invite_request_text: Begründung für das beitreten
       invited_by: Eingeladen von
       ip: IP-Adresse
       joined: Beigetreten
@@ -255,6 +257,7 @@ de:
         unsuspend_account: Konto nicht mehr sperren
         update_announcement: Ankündigung aktualisieren
         update_custom_emoji: Benutzerdefiniertes Emoji aktualisieren
+        update_domain_block: Domain Block aktualisieren
         update_status: Beitrag aktualisieren
       actions:
         assigned_to_self_report: "%{name} hat sich die Meldung %{target} selbst zugewiesen"
@@ -295,6 +298,7 @@ de:
         unsuspend_account: "%{name} hat die Verbannung von %{target} aufgehoben"
         update_announcement: "%{name} aktualisierte Ankündigung %{target}"
         update_custom_emoji: "%{name} hat das %{target} Emoji geändert"
+        update_domain_block: "%{name} hat den Domain-Block für %{target} aktualisiert"
         update_status: "%{name} hat einen Beitrag von %{target} aktualisiert"
       deleted_status: "(gelöschter Beitrag)"
       empty: Keine Protokolle gefunden.
@@ -398,6 +402,8 @@ de:
           silence: Stummschaltung
           suspend: Sperre
         title: Neue Domain-Blockade
+      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.
       public_comment: Öffentlicher Kommentar
@@ -437,6 +443,7 @@ de:
     instances:
       by_domain: Domain
       delivery_available: Zustellung funktioniert
+      empty: Keine Domains gefunden.
       known_accounts:
         one: "%{count} bekanntes Konto"
         other: "%{count} bekannte Konten"
@@ -514,6 +521,8 @@ de:
       comment:
         none: Kein
       created_at: Gemeldet
+      forwarded: Weitergeleitet
+      forwarded_to: Weitergeleitet an %{domain}
       mark_as_resolved: Als gelöst markieren
       mark_as_unresolved: Als ungelöst markieren
       notes:
@@ -557,6 +566,7 @@ de:
       domain_blocks_rationale:
         title: Rationale anzeigen
       enable_bootstrap_timeline_accounts:
+        desc_html: Neue Benutzer automatisch den konfigurierten Konten folgen lassen, sodass ihr Home-Feed nicht leer startet
         title: Aktiviere die Option "Konten, denen Neu-Angemeldete automatisch folgen"
       hero:
         desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Server-Thumbnail dafür verwendet
@@ -583,6 +593,9 @@ de:
         min_invite_role:
           disabled: Niemand
           title: Einladungen erlauben von
+        require_invite_text:
+          desc_html: Wenn eine Registrierung manuell genehmigt werden muss, mache den "Warum möchtest du beitreten?" Text eher obligatorisch als optional
+          title: Neue Benutzer müssen einen Einladungstext ausfüllen
       registrations_mode:
         modes:
           approved: Zustimmung benötigt zur Registrierung
@@ -751,6 +764,7 @@ de:
       functional: Dein Konto ist voll funktionsfähig.
       pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde.
       redirecting_to: Dein Konto ist inaktiv, da es derzeit zu %{acct} umgeleitet wird.
+    too_fast: Formular zu schnell gesendet, versuchen Sie es erneut.
     trouble_logging_in: Schwierigkeiten beim Anmelden?
     use_security_key: Sicherheitsschlüssel verwenden
   authorize_follow:
@@ -910,6 +924,8 @@ de:
     status: Verifizierungsstatus
     view_proof: Zeige Nachweis
   imports:
+    errors:
+      over_rows_processing_limit: enthält mehr als %{count} Zeilen
     modes:
       merge: Zusammenführen
       merge_long: Behalte existierende Datensätze und füge neue hinzu
diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml
index 7b1aa3874..a60d2e88b 100644
--- a/config/locales/devise.hu.yml
+++ b/config/locales/devise.hu.yml
@@ -111,5 +111,5 @@ hu:
       not_found: nem található
       not_locked: nincs lezárva
       not_saved:
-        one: '1 hiba megakadályozta %{resource} mentését:'
-        other: "%{count} számú hiba megakadályozta %{resource} mentését:"
+        one: '1 hiba megakadályozta e %{resource} mentését:'
+        other: "%{count} hiba megakadályozta e %{resource} mentését:"
diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml
index 3916d92b1..92cda21ef 100644
--- a/config/locales/devise.ko.yml
+++ b/config/locales/devise.ko.yml
@@ -82,8 +82,8 @@ ko:
       success: 성공적으로 %{kind} 계정을 인증 했습니다.
     passwords:
       no_token: 패스워드 재설정 이메일을 거치지 않고는 여기에 올 수 없습니다. 만약 패스워드 재설정 메일에서 온 것이라면 URL이 맞는지 확인해 주세요.
-      send_instructions: 당신의 이메일 주소가 우리의 DB에 있아면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요.
-      send_paranoid_instructions: 당신의 이메일 주소가 우리의 DB에 있아면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요.
+      send_instructions: 당신의 이메일 주소가 우리의 DB에 있다면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요.
+      send_paranoid_instructions: 당신의 이메일 주소가 우리의 DB에 있다면 패스워드 복구 링크가 몇 분 이내에 메일로 발송 됩니다. 만약 메일을 받지 못 하신 경우 스팸 폴더를 확인해 주세요.
       updated: 패스워드가 재설정 되었습니다. 로그인 되었습니다.
       updated_not_active: 패스워드가 성공적으로 변경 되었습니다.
     registrations:
diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml
index 3ab4d9f11..fadc48126 100644
--- a/config/locales/devise.nl.yml
+++ b/config/locales/devise.nl.yml
@@ -60,6 +60,23 @@ nl:
         title: Herstelcodes tweestapsverificatie veranderd
       unlock_instructions:
         subject: 'Mastodon: Instructies om opschorten account ongedaan te maken'
+      webauthn_credential:
+        added:
+          explanation: De volgende beveiligingssleutel is aan uw account toegevoegd
+          subject: 'Mastodon: Nieuwe beveiligingssleutel'
+          title: Een nieuwe beveiligingssleutel is toegevoegd
+        deleted:
+          explanation: De volgende beveiligingssleutel is uit jouw account verwijderd
+          subject: 'Mastodon: Beveiligingssleutel verwijderd'
+          title: Een van jouw beveiligingssleutels is verwijderd
+      webauthn_disabled:
+        explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor jouw account. Inloggen is nu alleen mogelijk met het gebruik van een door een gepaarde TOTP-app genereerde sleutel.
+        subject: 'Mastodon: Verificatie met beveiligingssleutels is uitgeschakeld'
+        title: Beveiligingssleutels uitgeschakeld
+      webauthn_enabled:
+        explanation: Verificatie met beveiligingssleutels is ingeschakeld voor jouw account. Jouw beveiligingssleutel kan nu gebruikt worden om in te loggen.
+        subject: 'Mastodon: Verificatie met beveiligingssleutels is ingeschakeld'
+        title: Beveiligingssleutels ingeschakeld
     omniauth_callbacks:
       failure: Kon je niet inloggen met jouw %{kind} account, omdat "%{reason}".
       success: Succesvol met jouw %{kind} account ingelogd.
diff --git a/config/locales/devise.sc.yml b/config/locales/devise.sc.yml
index 91bd6d92f..0256c4674 100644
--- a/config/locales/devise.sc.yml
+++ b/config/locales/devise.sc.yml
@@ -1 +1,115 @@
+---
 sc:
+  devise:
+    confirmations:
+      confirmed: S'indiritzu tuo de posta eletrònica est istadu cunfirmadu.
+      send_instructions: As a retzire unu messàgiu de posta eletrònica cun is istrutziones pro sa cunfirma de s'indiritzu de posta eletrònica tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica.
+      send_paranoid_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire unu messàgiu de posta eletrònica cun is istrutziones pro sa cunfirma de s'indiritzu de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica.
+    failure:
+      already_authenticated: Ses giai intradu.
+      inactive: Su contu tuo no est ancora ativadu.
+      invalid: "%{authentication_keys} o crae de intrada non vàlida."
+      last_attempt: Tenes ancora un'àteru tentativu, in antis chi su contu tuo bèngiat blocadu.
+      locked: Su contu tuo est blocadu.
+      not_found_in_database: "%{authentication_keys} o crae de intrada non vàlida."
+      pending: Su contu tuo est ancora in revisione.
+      timeout: Sa sessione tua est iscadida. Torra·bi a intrare pro sighire.
+      unauthenticated: Tocat a ti autenticare o ti registrare prima de sighire.
+      unconfirmed: Deves cunfirmare s'indiritzu tuo de posta eletrònica prima de sighire.
+    mailer:
+      confirmation_instructions:
+        action: Verìfica s'indiritzu de posta eletrònica
+        action_with_app: Cunfirma e torra a %{app}
+        explanation: As creadu unu contu in %{host} cun custu indiritzu de posta eletrònica. T'ammancat unu clic pro s'ativatzione. Si non fias tue, non càrcules custu messàgiu de posta eletrònica.
+        explanation_when_pending: As pedidu un'invitu a %{host} cun custu indiritzu de posta eletrònica. Cunfirmadu s'indiritzu de posta eletrònica, amus a revisionare sa dimanda tua. Podes intrare pro cambiare is detàllios o cantzellare su contu tuo, ma non podes atzèdere a sa majoria de is funtziones finas a chi su contu tuo siat aprovadu. Si sa dimanda tua est refudada, is datos ant a èssere bogados, duncas no t'ant a pedire prus peruna atzione. Si non fias tue, non càrcules custu messàgiu de posta eletrònica.
+        extra_html: Verìfica puru <a href="%{terms_path}">is règulas de su server</a> e <a href="%{policy_path}">is cunditziones de servìtziu nostras</a>.
+        subject: 'Mastodon: Istrutziones de cunfirma pro %{instance}'
+        title: Verìfica s'indiritzu de posta eletrònica
+      email_changed:
+        explanation: 'Custu indiritzu de posta eletrònica pro su contu tuo est istadu mudadu a:'
+        extra: Si no as mudadu indiritzu de posta, forsis un'àtera persone at otentu s'atzessu de su contu tuo. Muda sa crae tua a sa lestra o chistiona cun s'amministratzione de su server si ses blocadu a foras dae su contu tuo.
+        subject: 'Mastodon: Indiritzu de posta mudadu'
+        title: Indiritzu de posta eletrònica nou
+      password_change:
+        explanation: Sa crae de su contu tuo est istada mudada.
+        extra: Si no as mudadu sa crae tua, forsis un'àtera persone at otentu s'atzessu de su contu tuo. Muda sa crae tua a sa lestra o chistiona cun s'amministratzione de su server si ses blocadu a foras dae su contu tuo.
+        subject: 'Mastodon: Crae mudada'
+        title: Crae mudada
+      reconfirmation_instructions:
+        explanation: Cunfirma s'indiritzu nou pro mudare s'indiritzu de posta eletrònica.
+        extra: Si custa muda no dd'as pedida tue, non càrcules custu messàgiu de posta eletrònica. Custu indiritzu de posta eletrònica pro su contu de Mastodon no at a mudare finas a s'atzessu tuo a su ligàmene in subra.
+        subject: 'Mastodon: Cunfirma indiritzu de posta eletrònica pro %{instance}'
+        title: Verìfica s'indiritzu de posta eletrònica
+      reset_password_instructions:
+        action: Muda sa crae
+        explanation: As pedidu una crae noa pro su contu tuo.
+        extra: Si no dd'as pedida tue, non càrcules custu messàgiu de posta eletrònica. Custa crae no at a mudare finas a s'atzessu tuo a su ligàmene in subra pro sa creatzione de una noa.
+        subject: 'Mastodon: Istrutziones pro resetare sa crae'
+        title: Crae resetada
+      two_factor_disabled:
+        explanation: S'autenticatzione a duos fatores est istada disativada pro su contu tuo. Immoe podes intrare impreende isceti indiritzu de posta eletrònica e crae.
+        subject: 'Mastodon: Autenticatzione a duos fatores disativada'
+        title: 2FA disativada
+      two_factor_enabled:
+        explanation: S'autenticatzione a duos fatores est istada ativada pro su contu tuo. Pro s'atzessu at èssere rechèdidu unu còdighe de autorizatzione generadu dae s'aplicatzione TOTP.
+        subject: 'Mastodon: Autenticatzione a duos fatores ativada'
+        title: 2FA ativada
+      two_factor_recovery_codes_changed:
+        explanation: Is còdighes de recùperu betzos sunt istados disativados e àteros noos generados.
+        subject: 'Mastodon: Còdighes de recùperu a duos fatores re-generados'
+        title: còdighes de recùperu 2FA mudados
+      unlock_instructions:
+        subject: 'Mastodon: Istrutziones pro s''isblocu'
+      webauthn_credential:
+        added:
+          explanation: Sa crae de seguresa chi sighit est istada agiunta a su contu tuo
+          subject: 'Mastodon: Crae de seguresa noa'
+          title: Est istada agiunta una crae de seguresa noa
+        deleted:
+          explanation: Sa crae de seguresa chi sighit est istada cantzellada dae su contu tuo
+          subject: 'Mastodon: Crae de seguresa cantzellada'
+          title: Una de is craes de seguresa tuas est istada cantzellada
+      webauthn_disabled:
+        explanation: S'autenticatzione cun craes de seguresa est istada disabilitada pro su contu tuo. S'intrada como est possìbile impreende isceti su getone ingendradu dae s'aplicatzione TOTP ligada.
+        subject: 'Mastodon: Autenticatzione cun craes de seguresa disabilitada'
+        title: Craes de seguresa disabilitadas
+      webauthn_enabled:
+        explanation: S'autenticatzione cun crae de seguresa est istada abilitada pro su contu tuo. Sa crae de seguresa tua como si podet èssere impreare pro intrare.
+        subject: 'Mastodon: Autenticatzione cun sa crae de seguresa ativada'
+        title: Craes de seguresa abilitadas
+    omniauth_callbacks:
+      failure: Autenticatzione dae %{kind} fallida, ca "%{reason}".
+      success: Autenticadu dae su contu de %{kind}.
+    passwords:
+      no_token: No podes intrare a custa pàgina chene passare dae unu messàgiu de posta eletrònica pro resetare sa crae. Si benes dae su messàgiu de posta pro resetare sa crae, faghe in modu de impreare s'URL intreu chi t'ant donadu.
+      send_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire una unu ligàmene de recùperu de sa crae a s'indiritzu tuo de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica.
+      send_paranoid_instructions: Si s'indiritzu de posta eletrònica tuo esistit in sa base de datos nostra, as a retzire una unu ligàmene de recùperu de sa crae a s'indiritzu tuo de posta eletrònica tra pagos minutos. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica.
+      updated: Sa crae tua est istada mudada. Immoe ses intradu.
+      updated_not_active: Sa crae tua est istada mudada.
+    registrations:
+      destroyed: A si bìdere! Su contu tuo est istadu cantzelladu. Isperamus de ti torrare a bìdere chitzi.
+      signed_up: Registratzione curreta. Ti donamus sa benebènnida!
+      signed_up_but_inactive: Registratzione curreta. Mancari de aici, si no ti faghimus intrare est ca su contu tuo no est ancora ativu.
+      signed_up_but_locked: Registratzione curreta. Mancari de aici, si no ti faghimus intrare est ca su contu tuo est blocadu.
+      signed_up_but_pending: Unu ligàmene de cunfirma est istadu imbiadu a s'indiritzu tuo de posta eletrònica. A pustis chi incarcas in su ligàmene, amus a revisionare sa dimanda tua. Si aprovada, t'at a arribare una notìfica.
+      signed_up_but_unconfirmed: Unu ligàmene de cunfirma est istadu imbiadu a s'indiritzu tuo de posta eletrònica. Sighi su ligàmene pro ativare su contu tuo. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica.
+      update_needs_confirmation: Su contu tuo est istadu atualizadu, ma devimus verificare s'indiritzu tuo de posta eletrònica nou. Controlla sa posta eletrònica e sighi su ligàmene pro cunfirmare s'indiritzu nou de posta eletrònica. Controlla sa cartella de s'àliga si no as retzidu custu messàgiu de posta eletrònica.
+      updated: Su contu tuo est istadu atualizadu.
+    sessions:
+      already_signed_out: Sessione serrada.
+      signed_in: Atzessu curretu.
+      signed_out: Sessione serrada.
+    unlocks:
+      send_instructions: As a retzire unu messàgiu de posta eletrònica cun is istrutziones pro isblocare su contu tuo tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica.
+      send_paranoid_instructions: Si su contu tuo esistit, as a retzire unu messàgiu de posta eletrònica cun istrutziones pro ddu isblocare tra pagos minutos. Controlla sa cartella de s'arga si no as retzidu custu messàgiu de posta eletrònica.
+      unlocked: Su contu tuo est istadu isblocadu. Intra pro sighire.
+  errors:
+    messages:
+      already_confirmed: fiat giai cunfirmadu, proa a intrare
+      confirmation_period_expired: tocat a ddu cunfirmare intro %{period}, pedi·nde unu nou
+      expired: est iscadidu, pedi·nde unu nou
+      not_found: no agatadu
+      not_locked: no fiat blocadu
+      not_saved:
+        one: '1 faddina at proibidu de sarvare custu %{resource}:'
+        other: "%{count} faddinas ant proibidu de sarvare %{resource}:"
diff --git a/config/locales/devise.tt.yml b/config/locales/devise.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales/devise.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml
index c1914093a..b0a240bf8 100644
--- a/config/locales/devise.vi.yml
+++ b/config/locales/devise.vi.yml
@@ -21,7 +21,7 @@ vi:
         action: Xác thực địa chỉ email
         action_with_app: Xác nhận và quay lại %{app}
         explanation: Bạn đã tạo một tài khoản trên %{host} với địa chỉ email này. Chỉ cần một cú nhấp chuột nữa để kích hoạt nó. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này.
-        explanation_when_pending: Bạn đã đăng ký %{host} với địa chỉ email này. Chúng tôi chỉ xem xét đơn đăng ký sau khi bạn xác thực địa chỉ email. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể truy cập hầu hết các chức năng cho đến khi tài khoản của bạn được chấp thuận. Nếu bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải thực hiện thêm hành động nào nữa. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này.
+        explanation_when_pending: Bạn vừa đăng ký %{host} với địa chỉ email này. Chúng tôi chỉ xem xét đơn đăng ký sau khi bạn xác thực địa chỉ email. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể sử dụng đầy đủ tính năng cho đến khi tài khoản được xác thực. Nếu bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải làm gì thêm nữa. Nếu không phải do bạn đăng ký, xin vui lòng bỏ qua email này.
         extra_html: Xin đọc kỹ <a href="%{terms_path}">quy tắc máy chủ</a> và <a href="%{policy_path}">chính sách riêng tư</a> của chúng tôi.
         subject: 'Mastodon: Xác thực email cho %{instance}'
         title: Xác thực địa chỉ email
@@ -79,7 +79,7 @@ vi:
         title: Đã kích hoạt khóa bảo mật
     omniauth_callbacks:
       failure: Không thể xác thực bạn từ %{kind} bởi vì "%{reason}".
-      success: Xác thực thành công từ tài khoản %{kind}.
+      success: Xác thực tài khoản %{kind} thành công.
     passwords:
       no_token: Bạn chỉ có thể truy cập trang này khi nhận được email phục hồi mật khẩu. Nếu vẫn không được, vui lòng chắc chắn rằng bạn đã dùng chính xác URL được cung cấp.
       send_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này.
@@ -87,7 +87,7 @@ vi:
       updated: Mật khẩu của bạn đã được thay đổi thành công. Hiện tại bạn đã đăng nhập.
       updated_not_active: Mật khẩu của bạn đã được thay đổi thành công.
     registrations:
-      destroyed: Tạm biệt! Tài khoản của bạn đã hủy thành công. Hi vọng chúng tôi sẽ sớm gặp lại bạn.
+      destroyed: Tạm biệt! Tài khoản của bạn đã bị hủy. Hi vọng chúng tôi sẽ sớm gặp lại bạn.
       signed_up: Chúc mừng! Bạn đã đăng ký thành công.
       signed_up_but_inactive: Bạn đã đăng ký thành công. Tuy nhiên, bạn cần phải kích hoạt tài khoản mới có thể đăng nhập.
       signed_up_but_locked: Bạn đã đăng ký thành công. Tuy nhiên, chúng tôi không thể đăng nhập cho bạn vì tài khoản của bạn bị khóa.
@@ -96,9 +96,9 @@ vi:
       update_needs_confirmation: Bạn đã cập nhật tài khoản thành công, nhưng chúng tôi cần xác thực địa chỉ email mới của bạn. Vui lòng kiểm tra email và nhấp vào liên kết xác thực. Nếu bạn không thấy email, hãy kiểm tra trong thư rác.
       updated: Tài khoản của bạn đã được cập nhật thành công.
     sessions:
-      already_signed_out: Hoàn tất đăng xuất.
+      already_signed_out: Đã đăng xuất.
       signed_in: Đã đăng nhập thành công.
-      signed_out: Hoàn tất đăng xuất.
+      signed_out: Đã đăng xuất.
     unlocks:
       send_instructions: Bạn sẽ nhận được một email hướng dẫn về cách mở khóa tài khoản của bạn trong vài phút tới. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này.
       send_paranoid_instructions: Nếu tài khoản của bạn tồn tại, bạn sẽ nhận được email hướng dẫn cách mở khóa trong vài phút tới. Xin kiểm tra thư mục thư rác nếu như bạn không thấy email này.
diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml
index 073898d1e..2d9e8ddea 100644
--- a/config/locales/devise.zh-HK.yml
+++ b/config/locales/devise.zh-HK.yml
@@ -2,16 +2,16 @@
 zh-HK:
   devise:
     confirmations:
-      confirmed: 你的電郵地址成功確認。
-      send_instructions: 你將會在幾分鐘內收到確認指示電郵,上面有確認你電郵地址的指示。
-      send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到電郵,確認你電郵地址的指示。
+      confirmed: 已確認你的電郵地址。
+      send_instructions: 你將會在幾分鐘內收到確認指示電郵,上面有確認你電郵地址的指示。如果它沒有出現在你的收件箱,請檢查一下你的垃圾郵件箱。
+      send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到電郵,確認你電郵地址的指示。如果它沒有出現在你的收件箱,請檢查一下你的垃圾郵件箱。
     failure:
       already_authenticated: 你之前已經登入了。
-      inactive: 您的帳號尚未啟用。
-      invalid: 不正確的 %{authentication_keys} 或密碼。
+      inactive: 你的帳號尚未被啟用。
+      invalid: 不正確的%{authentication_keys}或密碼。
       last_attempt: 若你再一次嘗試失敗,我們將鎖定你的帳號,以策安全。
       locked: 你的帳號已被鎖定。
-      not_found_in_database: 不正確的 %{authentication_keys} 或密碼。
+      not_found_in_database: 不正確的%{authentication_keys}或密碼。
       pending: 你的帳號仍在審核中
       timeout: 你的登入階段已經過期,請重新登入以繼續使用。
       unauthenticated: 你必須先登入或登記,以繼續使用。
@@ -20,46 +20,46 @@ zh-HK:
       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>。
+        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: 如果你沒有請求更改你的電子郵件地址,則他人很有可能已經入侵你的帳戶。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。
-        subject: Mastodon:電子郵件地址已被更改
-        title: 新電子郵件地址
+        explanation: 你的帳號的電郵地址即將變更為:
+        extra: 如果你沒有更改你的電郵地址,那很有可能已經有其他人入侵你的帳號。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。
+        subject: Mastodon:電郵地址已被更改
+        title: 新電郵地址
       password_change:
-        explanation: 你的帳戶的密碼已被更改。
-        extra: 如果你沒有請求更改你的密碼,則他人很有可能已經入侵你的帳戶。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。
-        subject: 'Mastodon: 更改密碼'
-        title: 密碼已被重設
+        explanation: 你的帳號的密碼已被更改。
+        extra: 如果你沒有更改你的密碼,那很有可能已經有其他人入侵你的帳號。請立即更改你的密碼;如果你已經無法訪問你的帳戶,請聯繫服務站的管理員請求協助。
+        subject: 'Mastodon: 密碼已被更改'
+        title: 密碼已被更改
       reconfirmation_instructions:
-        explanation: 點擊下面的連結來確認你的新電子郵件地址。
+        explanation: 點擊下面的連結來確認你的新電郵地址。
         extra: 如果你沒有請求本次變更,請忽略此郵件。 Mastodon 帳戶的電子郵件地址只有在你點擊上面的連結後才會更改。
-        subject: Mastodon:確認 %{instance} 電子郵件地址
-        title: 驗證電子郵件地址
+        subject: Mastodon:確認 %{instance} 電郵地址
+        title: 驗證電郵地址
       reset_password_instructions:
         action: 更改密碼
-        explanation: 點擊下面的連結來更改帳戶的密碼。
-        extra: 如果你沒有請求本次變更,請忽略此郵件。你的密碼只有在你點擊上面的連結並輸入新密碼後才會更改。
+        explanation: 點擊下面的連結來更改帳號的密碼。
+        extra: 如果你沒有請求修改帳號,請忽略此郵件。在你點擊進上面連結並設定新密碼前,帳號密碼會維持不變。
         subject: 'Mastodon: 重設密碼'
         title: 重設密碼
       two_factor_disabled:
-        explanation: 帳號的雙重認證已禁用。現在僅使用郵箱和密碼即可登錄。
-        subject: 長毛象:已關閉雙重認證
+        explanation: 帳號的雙重認證已被停用。現在只需使用電郵地址和密碼,即可登入。
+        subject: Mastodon:已關閉雙重認證
         title: 已關閉雙重認證
       two_factor_enabled:
-        explanation: 賬號的雙重認證已啟用。登錄時將需要用已配對的 TOTP 應用生成驗證碼。
-        subject: 長毛象:已啟用雙重認證
+        explanation: 賬號的雙重認證已被啟用。登錄時,將需要已配對 TOTP 應用程式生成的驗證碼。
+        subject: Mastodon:已啟用雙重認證
         title: 已啟用雙重認證
       two_factor_recovery_codes_changed:
         explanation: 之前的恢復碼失效了,新的已生成。
-        subject: 長毛象:已產生新的雙重認證恢復碼
+        subject: Mastodon:已產生新的雙重認證恢復碼
         title: 雙重認證恢復碼已更改
       unlock_instructions:
-        subject: 'Mastodon: 解除用戶鎖定'
+        subject: 'Mastodon: 解除帳號鎖定'
       webauthn_credential:
         added:
           explanation: 以下的安全鑰匙已經加進你的帳號
@@ -72,37 +72,37 @@ zh-HK:
       webauthn_disabled:
         explanation: 你的帳號的安全鑰匙身份驗證已經停用。你只可以用過去已經配對好的基於時間一次性密碼程式生成的密碼來登錄。
         subject: 'Mastodon: 安全鑰匙身份驗證已經停用'
-        title: 已啟用安全鑰匙
+        title: 已停用安全鑰匙
       webauthn_enabled:
         explanation: 安全鑰匙身份驗證已啟用。你的安全鑰匙現在可以用來登錄。
         subject: 'Mastodon: 安全鑰匙身份驗證已啟用'
         title: 已啟用安全鑰匙
     omniauth_callbacks:
-      failure: 無法以 %{kind} 登入你的用戶,原因是︰「%{reason}」。
+      failure: 無法以 %{kind} 登入你的帳號,原因是︰「%{reason}」。
       success: 成功以 %{kind} 登入你的用戶。
     passwords:
       no_token: 你必須使用重設密碼電郵內的網址進入本頁。如果你確是使用電郵內的網址,請確認你用了完整的網址。
-      send_instructions: 你將在幾分鐘內收到重設密碼的電郵指示。
-      send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將會在幾分鐘內收到重設密碼的電郵指示。
+      send_instructions: 如果你的電郵存在於我們的資料庫中,你將在幾分鐘內收到重設密碼的電郵指示。如果你未能在收件箱找到該電郵,請檢查垃圾郵件箱。
+      send_paranoid_instructions: 如果你的電郵存在於我們的資料庫中,你將在幾分鐘內收到重設密碼的電郵指示。如果你未能在收件箱找到該電郵,請檢查垃圾郵件箱。
       updated: 你的密碼已經更新,你現在正登入本站。
       updated_not_active: 你的密碼已經更新。
     registrations:
-      destroyed: 再見了!你的用戶已被取消,希望我們相有相見的機會吧。
-      signed_up: 歡迎你!你的登記已經成功。
-      signed_up_but_inactive: 你的登記已經成功,可是由於你的用戶還被被啟用,暫時還不能讓你登入。
-      signed_up_but_locked: 你的登記已經成功,可是由於你的用戶已被鎖定,我們無法讓你登入。
-      signed_up_but_pending: 確認連結已發送到您的電郵地址。點擊連結後我們會審核您的申請,一旦通過您將會收到通知。
-      signed_up_but_unconfirmed: 一條確認連結已經電郵到你的郵址。請使用讓連結啟用你的用戶。
-      update_needs_confirmation: 你的用戶已經更新,但我們需要確認你的電郵地址。請打開你的郵箱,使用確認電郵的連結來確認的地郵址。
-      updated: 你的用戶已經成功更新。
+      destroyed: 再見!你的帳號已被取消,希望日後能再見到你。
+      signed_up: 歡迎你!你已經成功登記。
+      signed_up_but_inactive: 你的登記已經成功,可是由於你的帳號還未被啟用,暫時還不能讓你登入。
+      signed_up_but_locked: 你的登記已經成功,可是由於你的帳號已被鎖定,我們無法讓你登入。
+      signed_up_but_pending: 確認連結已發送到你的電郵地址。在你點擊連結後,我們會審核你的申請。一旦通過審核,你將會收到進一步通知。
+      signed_up_but_unconfirmed: 一條確認連結已經電郵到你的郵址。請使用讓連結啟用你的帳號。
+      update_needs_confirmation: 你的帳號已經更新,但我們需要確認你的電郵地址。請打開你的郵箱,使用確認電郵的連結來確認的地郵址。如果未能在收件箱找相關電郵指示,請檢查垃圾郵件箱。
+      updated: 你的帳號已經成功更新。
     sessions:
       already_signed_out: 成功登出。
       signed_in: 成功登入。
       signed_out: 成功登出。
     unlocks:
-      send_instructions: 你將在幾分鐘內收到解除用戶鎖定的電郵指示。
-      send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將在幾分鐘內收到解除用戶鎖定的電郵指示。
-      unlocked: 你的用戶已經解鎖,請登入以繼續。
+      send_instructions: 你將在幾分鐘內收到解除用戶鎖定的電郵指示。如果未能在收件箱找到電郵指示,請檢查垃圾郵件箱。
+      send_paranoid_instructions: 如果你的電郵地址已經存在於我們的資料庫,你將在幾分鐘內收到解除用戶鎖定的電郵指示。如果未能在收件箱找到電郵指示,請檢查垃圾郵件箱。
+      unlocked: 你的帳號已經解鎖,請登入以繼續。
   errors:
     messages:
       already_confirmed: 先前已經確認,請嘗試登入
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index ef0da1a9c..f7b087824 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -21,18 +21,18 @@ zh-TW:
         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: 驗證電子信箱位址
       email_changed:
         explanation: 您帳戶的電子信箱位址將變更為:
-        extra: 若您未變更電子信箱,那麼很有可能是某人取得了你帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。
+        extra: 若您未變更電子信箱,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。
         subject: Mastodon:已變更電子信箱
         title: 新電子信箱位址
       password_change:
         explanation: 您帳戶的密碼已變更。
-        extra: 如果您未變更密碼,那麼很有可能是某人取得了帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。
+        extra: 若您未變更密碼,那麼很有可能是某人取得了您帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。
         subject: Mastodon:已變更密碼
         title: 密碼已變更
       reconfirmation_instructions:
@@ -43,7 +43,7 @@ zh-TW:
       reset_password_instructions:
         action: 變更密碼
         explanation: 您已請求帳戶的新密碼。
-        extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新連結前不會變更。
+        extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新密碼前不會變更。
         subject: Mastodon:重設密碼指引
         title: 重設密碼
       two_factor_disabled:
@@ -60,13 +60,30 @@ zh-TW:
         title: 2FA 復原碼已變更
       unlock_instructions:
         subject: Mastodon:解鎖指引
+      webauthn_credential:
+        added:
+          explanation: 下面的安全密鑰已經新增至您的帳戶
+          subject: Mastodon:新安全密鑰
+          title: 已新增新安全密鑰
+        deleted:
+          explanation: 以下的安全密鑰已經從您的帳戶中移除
+          subject: Mastodon:安全密鑰已移除
+          title: 您的一支安全密鑰已經被移除
+      webauthn_disabled:
+        explanation: 您的帳戶並沒有啟用安全密鑰認證方式。只能以 TOTP app 產生地成對 token 登入。
+        subject: Mastodon:安全密鑰認證方式已關閉
+        title: 已關閉安全密鑰
+      webauthn_enabled:
+        explanation: 您的帳戶已啟用安全密鑰認證。您可以使用安全密鑰登入了。
+        subject: Mastodon:已啟用安全密鑰認證
+        title: 已啟用安全密鑰
     omniauth_callbacks:
       failure: 無法透過 %{kind} 認證是否為您,因為「%{reason}」。
       success: 成功透過 %{kind} 帳戶登入。
     passwords:
       no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。
-      send_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
-      send_paranoid_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      send_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 若電子信箱位址存在於我們的資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
       updated: 您的密碼已成功變更,現在已經登入。
       updated_not_active: 您的密碼已成功變更。
     registrations:
@@ -76,14 +93,14 @@ zh-TW:
       signed_up_but_locked: 您已註冊成功,但由於您的帳戶已被鎖定,我們無法讓您登入。
       signed_up_but_pending: 包含確認連結的訊息已寄到您的電子信箱。按下此連結後我們將審核您的申請。核准後將通知您。
       signed_up_but_unconfirmed: 包含確認連結的訊息已寄到您的電子信箱。請前往連結以啟用帳號。若未收到請檢查垃圾郵件資料夾。
-      update_needs_confirmation: 已更新您的帳號,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱位址。若未收到請檢查垃圾郵件資料夾。
+      update_needs_confirmation: 已成功更新您的帳號,但仍需驗證您的新信箱。請檢查電子信箱並前往確認連結來確認新信箱位址。若未收到請檢查垃圾郵件資料夾。
       updated: 您的帳戶已成功更新。
     sessions:
       already_signed_out: 已成功登出。
       signed_in: 已成功登入。
       signed_out: 已成功登出。
     unlocks:
-      send_instructions: 幾分鐘後您將收到確認信件。若未收到此信件,請檢查垃圾郵件資料夾。
+      send_instructions: 幾分鐘後您將收到解鎖帳號的指引信件。若未收到請檢查垃圾郵件資料夾。
       send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
       unlocked: 已解鎖您的帳戶,請登入繼續。
   errors:
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index 2fbf0ffd7..61e6cb6a1 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -1 +1,151 @@
---- {}
+---
+es:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Nombre de aplicación
+        redirect_uri: URI para redirección
+        scopes: Ámbitos
+        website: Sitio web
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: no puede contener un fragmento.
+              invalid_uri: debe ser un URI válido.
+              relative_uri: debe ser una URI absoluta.
+              secured_uri: debe ser un URI HTTPS/SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autorizar
+        cancel: Cancelar
+        destroy: Destruir
+        edit: Editar
+        submit: Enviar
+      confirmations:
+        destroy: "¿Está seguro?"
+      edit:
+        title: Editar aplicación
+      form:
+        error: "¡Uuups! Compruebe su formulario"
+      help:
+        native_redirect_uri: Utilice %{native_redirect_uri} para pruebas locales
+        redirect_uri: Utilice una línea por URI
+        scopes: Separe los ámbitos con espacios. Déjelo en blanco para utilizar los ámbitos por defecto.
+      index:
+        application: Aplicación
+        callback_url: URL de callback
+        delete: Eliminar
+        empty: No tienes aplicaciones.
+        name: Nombre
+        new: Nueva aplicación
+        scopes: Ámbitos
+        show: Mostrar
+        title: Sus aplicaciones
+      new:
+        title: Nueva aplicación
+      show:
+        actions: Acciones
+        application_id: Id de la aplicación
+        callback_urls: URLs de callback
+        scopes: Ámbitos
+        secret: Secreto
+        title: 'Aplicación: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autorizar
+        deny: Desautorizar
+      error:
+        title: Ha ocurrido un error
+      new:
+        able_to: Será capaz de
+        prompt: La aplicación %{client_name} solicita tener acceso a su cuenta
+        title: Se requiere autorización
+      show:
+        title: Copia este código de autorización y pégalo en la aplicación.
+    authorized_applications:
+      buttons:
+        revoke: Revocar
+      confirmations:
+        revoke: "¿Está seguro?"
+      index:
+        application: Aplicación
+        created_at: Creado el
+        date_format: "%A-%m-%d %H:%M:%S"
+        scopes: Ámbitos
+        title: Sus aplicaciones autorizadas
+    errors:
+      messages:
+        access_denied: El propietario del recurso o servidor de autorización denegó la petición.
+        credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar.
+        invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado.
+        invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente.
+        invalid_redirect_uri: La URI de redirección incluida no es válida.
+        invalid_request: En la petición falta un parámetro necesario o incluye un valor de parámetro no soportado o tiene otro tipo de formato incorrecto.
+        invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado
+        invalid_scope: El ámbito pedido es inválido, desconocido o erróneo.
+        invalid_token:
+          expired: El autentificador de acceso expiró
+          revoked: El autentificador de acceso fue revocado
+          unknown: El autentificador de acceso es inválido
+        resource_owner_authenticator_not_configured: El propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_authenticator está sin configurar.
+        server_error: El servidor de la autorización entontró una condición inesperada que le impidió cumplir con la solicitud.
+        temporarily_unavailable: El servidor de la autorización es actualmente incapaz de manejar la petición debido a una sobrecarga temporal o un trabajo de mantenimiento del servidor.
+        unauthorized_client: El cliente no está autorizado a realizar esta petición utilizando este método.
+        unsupported_grant_type: El tipo de concesión de autorización no está soportado por el servidor de autorización.
+        unsupported_response_type: El servidor de autorización no soporta este tipo de respuesta.
+    flash:
+      applications:
+        create:
+          notice: Aplicación creada.
+        destroy:
+          notice: Aplicación eliminada.
+        update:
+          notice: Aplicación actualizada.
+      authorized_applications:
+        destroy:
+          notice: Aplicación revocada.
+    layouts:
+      admin:
+        nav:
+          applications: Aplicaciones
+          oauth2_provider: Proveedor OAuth2
+      application:
+        title: OAuth autorización requerida
+    scopes:
+      admin:read: leer todos los datos en el servidor
+      admin:read:accounts: leer información sensible de todas las cuentas
+      admin:read:reports: leer información sensible de todos los informes y cuentas reportadas
+      admin:write: modificar todos los datos en el servidor
+      admin:write:accounts: realizar acciones de moderación en cuentas
+      admin:write:reports: realizar acciones de moderación en informes
+      follow: seguir, bloquear, desbloquear y dejar de seguir cuentas
+      push: recibir tus notificaciones push
+      read: leer los datos de tu cuenta
+      read:accounts: ver información de cuentas
+      read:blocks: ver a quién has bloqueado
+      read:bookmarks: ver tus marcadores
+      read:favourites: ver tus favoritos
+      read:filters: ver tus filtros
+      read:follows: ver a quién sigues
+      read:lists: ver tus listas
+      read:mutes: ver a quién has silenciado
+      read:notifications: ver tus notificaciones
+      read:reports: ver tus informes
+      read:search: buscar en su nombre
+      read:statuses: ver todos los estados
+      write: publicar en tu nombre
+      write:accounts: modifica tu perfil
+      write:blocks: bloquear cuentas y dominios
+      write:bookmarks: guardar estados como marcadores
+      write:favourites: toots favoritos
+      write:filters: crear filtros
+      write:follows: seguir usuarios
+      write:lists: crear listas
+      write:media: subir archivos multimedia
+      write:mutes: silenciar usuarios y conversaciones
+      write:notifications: limpia tus notificaciones
+      write:reports: reportar a otras personas
+      write:statuses: publicar estados
diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml
index 91bd6d92f..2a6aeb2c1 100644
--- a/config/locales/doorkeeper.sc.yml
+++ b/config/locales/doorkeeper.sc.yml
@@ -1 +1,151 @@
+---
 sc:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Nòmine de s'aplicatzione
+        redirect_uri: URL de re-indiritzamentu
+        scopes: Àmbitos
+        website: Situ web de s'aplicatzione
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: non podet cuntènnere un'ascra.
+              invalid_uri: depet èssere un'URI vàlidu.
+              relative_uri: devet èssere un'URI assolutu.
+              secured_uri: depet èssere un'URI HTTPS/SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autoriza
+        cancel: Annulla
+        destroy: Distrue
+        edit: Modìfica
+        submit: Imbia
+      confirmations:
+        destroy: Seguru?
+      edit:
+        title: Modìfica s'aplicatzione
+      form:
+        error: Controlla si su formulàriu tuo tenet faddinas
+      help:
+        native_redirect_uri: Imprea %{native_redirect_uri} pro is tests locales
+        redirect_uri: Imprea una lìnia pro ogni URI
+        scopes: Iscroba is àmbitos cun ispàtzios. Lassa bòidu pro impreare is predefinidos.
+      index:
+        application: Aplicatzione
+        callback_url: URL de torrada
+        delete: Cantzella
+        empty: No tenes peruna aplicatzione.
+        name: Nòmine
+        new: Aplicatzione noa
+        scopes: Àmbitos
+        show: Ammustra
+        title: Is aplicatziones tuas
+      new:
+        title: Aplicatzione noa
+      show:
+        actions: Atziones
+        application_id: ID de s'aplicatzione
+        callback_urls: URLs de torrada
+        scopes: Àmbitos
+        secret: Segretu de cliente
+        title: 'Aplicatzione: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autoriza
+        deny: Refuda
+      error:
+        title: Faddina
+      new:
+        able_to: At a pòdere
+        prompt: S'aplicatzione %{client_name} est preguntende atzessu a su contu tuo
+        title: Autorizatzione rechesta
+      show:
+        title: Còpia custu còdighe de autorizatzione e incolla·ddu a s'aplicatzione.
+    authorized_applications:
+      buttons:
+        revoke: Rèvoca
+      confirmations:
+        revoke: Seguru?
+      index:
+        application: Aplicatzione
+        created_at: Autorizada
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Àmbitos
+        title: Is aplicatziones autorizadas tuas
+    errors:
+      messages:
+        access_denied: Sa propiedade sa resursa o su serbidore de autorizatziones at refudadu sa rechesta.
+        credential_flow_not_configured: Su flussu de is credentziales de sa crae de intrada de su mere de sa risursa est fallidu pro neghe de su fatu chi Doorkeeper.configure.resource_owner_from_credentials no est cunfiguradu.
+        invalid_client: S'autenticatzione de su cliente est fallida ca su cliente est disconnotu, s'atzessu a su cliente no est istadu incluidu, o sa manera de autenticatzione no est suportada.
+        invalid_grant: Su permissu de autorizatzione est invàlidu, iscadidu, revocadu, non currispondet a s'URI de re-indiritzamentu impreadu in sa rechesta de autorizatzione, o est istadu frunidu a un'àteru cliente.
+        invalid_redirect_uri: S'URI de re-indiritzamentu no est vàlidu.
+        invalid_request: In sa rechesta mancat unu paràmetru netzessàriu, ddoe est unu valore de unu paràmetru non suportadu o est fata male in carchi àtera manera.
+        invalid_resource_owner: Is credentziales de su mere de sa risursa frunidas non sunt vàlidas, o su mere de sa risursa non podet èssere agatadu
+        invalid_scope: S'àmbitu pedidu est invàlidu, disconnotu, o formuladu male.
+        invalid_token:
+          expired: Su getone de atzessu est iscadidu
+          revoked: Su getone de atzessu est istadu revocadu
+          unknown: Su getone de atzessu no est vàlidu
+        resource_owner_authenticator_not_configured: Su mere de sa risursa no est istadu agatadu pro neghe de su fatu chi Doorkeeper.configure.resource_owner_authenticator no est configuradu.
+        server_error: Su serbidore de autorizatzione at agatadu una cunditzione no isetada chi dd'at impedidu de esecutare sa rechesta tua.
+        temporarily_unavailable: Su serbidore de autorizatzione no est, in custu momentu, in gradu de gestire sa rechesta pro neghe de unu subracàricu temporàneu o de una manutentzione.
+        unauthorized_client: Su cliente no est autorizadu a esecutare custa rechesta in custa manera.
+        unsupported_grant_type: Sa casta de modalidade de autorizatzione no est suportada dae su serbidore de atzessu.
+        unsupported_response_type: Su serbidore de autorizatzione non suportat custa casta de risposta.
+    flash:
+      applications:
+        create:
+          notice: Aplicatzione creada.
+        destroy:
+          notice: Aplicatzione cantzellada.
+        update:
+          notice: Aplicatzione atualizada.
+      authorized_applications:
+        destroy:
+          notice: Aplicatzione revocada.
+    layouts:
+      admin:
+        nav:
+          applications: Aplicatziones
+          oauth2_provider: Frunidore OAuth2
+      application:
+        title: Autorizatzione OAuth netzessària
+    scopes:
+      admin:read: lèghere totu is datos de su serbidore
+      admin:read:accounts: lèghere informatziones sensìbiles de totu is contos
+      admin:read:reports: lèghere informatziones sensìbiles de totu is sinnalatziones e is contos sinnalados
+      admin:write: modificare totu is datos in su serbidore
+      admin:write:accounts: fàghere atziones de moderatzione in is contos
+      admin:write:reports: fàghere atziones de moderatzione in is sinnalatziones
+      follow: modificare is relatziones intre is contos
+      push: retzire is notìficas push tuas
+      read: lèghere totu is datos de su contu tuo
+      read:accounts: bìdere is informatziones in su contu
+      read:blocks: bìdere is blocos tuos
+      read:bookmarks: càstia is sinnalibros tuos
+      read:favourites: bìdere is preferidos tuos
+      read:filters: bìdere is filtros tuos
+      read:follows: bìdere is sighiduras tuas
+      read:lists: bìdere is listas tuas
+      read:mutes: bìdere is utentes chi as postu a sa muda
+      read:notifications: bìdere is notìficas tuas
+      read:reports: bìdere is sinnalatziones tuas
+      read:search: chircare a nùmene tuo
+      read:statuses: bìdere totu is istados
+      write: modificare totu is datos de su contu tuo
+      write:accounts: modificare su profilu tuo
+      write:blocks: blocare contos e domìnios
+      write:bookmarks: agiunghe is istados a is sinnalibros
+      write:favourites: pònnere istados in is preferidos
+      write:filters: creare filtros
+      write:follows: sighire persones
+      write:lists: creare listas
+      write:media: càrriga documentos multimediales
+      write:mutes: impostare persones e arresonadas a sa muda
+      write:notifications: isboidare is notìficas tuas
+      write:reports: sinnalare àteras persones
+      write:statuses: publicare istados
diff --git a/config/locales/doorkeeper.tt.yml b/config/locales/doorkeeper.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales/doorkeeper.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml
index caeba3b71..a51891fd0 100644
--- a/config/locales/doorkeeper.vi.yml
+++ b/config/locales/doorkeeper.vi.yml
@@ -67,7 +67,7 @@ vi:
         title: Sao chép mã này và dán nó vào ứng dụng.
     authorized_applications:
       buttons:
-        revoke: Thu hồi
+        revoke: Gỡ
       confirmations:
         revoke: Bạn có chắc không?
       index:
@@ -81,14 +81,14 @@ vi:
         access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu.
         credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình.
         invalid_client: Xác thực ứng dụng khách không thành công do máy khách mơ hồ, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ.
-        invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị thu hồi hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác.
+        invalid_grant: Yêu cầu không hợp lệ, hết hạn, bị gỡ hoặc không khớp với tài khoản đã cấp phép. Hoặc xung đột với ứng dụng khác.
         invalid_redirect_uri: URL chuyển hướng không hợp lệ.
         invalid_request: Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ hoặc không đúng định dạng.
         invalid_resource_owner: Thông tin xác thực chủ sở hữu tài nguyên được cung cấp không hợp lệ hoặc không thể tìm thấy chủ sở hữu tài nguyên
         invalid_scope: Quyền yêu cầu không hợp lệ, không có thật hoặc sai định dạng.
         invalid_token:
           expired: Mã thông báo truy cập đã hết hạn
-          revoked: Mã thông báo truy cập đã bị thu hồi
+          revoked: Mã token đăng nhập đã bị hủy
           unknown: Mã thông báo truy cập không hợp lệ
         resource_owner_authenticator_not_configured: Chủ sở hữu tài nguyên tìm thấy thất bại do Doorkeeper.configure.resource_owner_authenticator không được định cấu hình.
         server_error: Có một điều kiện không thể chấp nhận khiến máy chủ không thực hiện yêu cầu.
@@ -106,7 +106,7 @@ vi:
           notice: Ứng dụng cập nhật.
       authorized_applications:
         destroy:
-          notice: Ứng dụng bị thu hồi.
+          notice: Ứng dụng bị gỡ.
     layouts:
       admin:
         nav:
diff --git a/config/locales/doorkeeper.zgh.yml b/config/locales/doorkeeper.zgh.yml
index 5ec7e04b4..d34b8109c 100644
--- a/config/locales/doorkeeper.zgh.yml
+++ b/config/locales/doorkeeper.zgh.yml
@@ -4,6 +4,7 @@ zgh:
     attributes:
       doorkeeper/application:
         name: ⵉⵙⵏ ⵏ ⵜⵙⵏⵙⵉ
+        redirect_uri: ⵜⴰⵏⵙⴰ ⵏ ⵓⵙⵉⴼⴹ
         website: ⴰⵙⵉⵜ ⵡⵉⴱ ⵏ ⵜⵙⵏⵙⵉ
   doorkeeper:
     applications:
@@ -16,12 +17,16 @@ zgh:
         destroy: ⵉⵙ ⵏⵉⵜ?
       edit:
         title: ⵙⵏⴼⵍ ⵜⵉⵙⵏⵙⵉ
+      help:
+        native_redirect_uri: ⵙⵎⵔⵙ %{native_redirect_uri} ⵉ ⵉⵔⵉⵎⵏ ⵉⴷⵖⴰⵔⴰⵜⵏ
+        redirect_uri: ⵙⵎⵔⵙ ⵢⴰⵏ ⵓⵣⴳⵉⴳ ⵉ ⵢⴰⵜ ⵜⵖⵓⵏⵉ
       index:
         application: ⵜⵉⵙⵏⵙⵉ
         delete: ⴽⴽⵙ
         empty: ⵓⵔ ⵖⵓⵔⴽ ⴽⵔⴰ ⵏ ⵜⵙⵏⵙⵉⵡⵉⵏ.
         name: ⵉⵙⵎ
         new: ⵜⵉⵙⵏⵙⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ
+        show: ⵙⵎⴰⵍ
         title: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ ⵏⵏⴽ
       new:
         title: ⵜⵉⵙⵏⵙⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ
@@ -32,6 +37,8 @@ zgh:
       buttons:
         authorize: ⵙⵙⵓⵔⴳ
         deny: ⴰⴳⵢ
+      new:
+        prompt: ⵜⵙⵙⵓⵜⵓⵔ ⵜⵙⵏⵙⵉ %{client_name} ⴰⵙⴰⴷⴼ ⵖⵔ ⵓⵎⵉⴹⴰⵏ ⵏⵏⴽ
     authorized_applications:
       confirmations:
         revoke: ⵉⵙ ⵏⵉⵜ?
@@ -40,6 +47,34 @@ zgh:
         created_at: ⵜⴻⵜⵜⵓⵙⵓⵔⴳ
         date_format: "%d-%m-%Y %H:%M:%S"
         title: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ ⵏⵏⴽ ⵉⵜⵜⵓⵙⵓⵔⴷⵏ
+    flash:
+      applications:
+        create:
+          notice: ⵜⴻⵜⵜⵓⵙⵏⴼⵍⵓⵍ ⵜⵙⵏⵙⵉ.
+        destroy:
+          notice: ⵜⴻⵜⵜⵡⴰⴽⴽⵙ ⵜⵙⵏⵙⵉ.
+        update:
+          notice: ⵜⴻⵜⵜⵓⵙⴷⵖⵉ ⵜⵙⵏⵙⵉ.
+    layouts:
+      admin:
+        nav:
+          applications: ⵜⵉⵙⵏⵙⵉⵡⵉⵏ
     scopes:
+      admin:read: ⵖⵔ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⴳ ⵓⵎⴰⴽⴽⴰⵢ
+      admin:write: ⵙⵏⴼⵍ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⴳ ⵓⵎⴰⴽⴽⴰⵢ
+      read: ⵖⵔ ⵉⴼⵙⴽⴰ ⴰⴽⴽⵯ ⵏ ⵓⵎⵉⴹⴰⵏ
+      read:filters: ⵥⵕ ⵉⵙⵜⴰⵢⵏ ⵏⵏⴽ
+      read:follows: ⵥⵕ ⵉⵎⴹⴼⴰⵔⵏ ⵏⵏⴽ
+      read:lists: ⵥⵕ ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ
       read:notifications: ⵥⵕ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ
+      read:search: ⵔⵣⵓ ⵙ ⵢⵉⵙⵎ ⵏⵏⴽ
+      read:statuses: ⵥⵕ ⴰⴷⴷⴰⴷⵏ ⴰⴽⴽⵯ
+      write: ⵙⵏⴼⵍ ⵉⴼⵙⴽⴰ ⵏ ⵓⵎⵉⴹⴰⵏ ⵏⵏⴽ
+      write:accounts: ⵙⵏⴼⵍ ⵉⴼⵔⵙ ⵏⵏⴽ
+      write:blocks: ⴳⴷⵍ ⵉⵎⵉⴹⴰⵏⵏ ⴷ ⵢⵉⴳⵔⴰⵏ
+      write:follows: ⴹⴼⵕ ⵎⵉⴷⴷⵏ
+      write:lists: ⵙⵏⴼⵍⵓⵍ ⵜⵉⵍⴳⴰⵎⵉⵏ
+      write:mutes: ⵥⵥⵉⵥⵏ ⵎⵉⴷⴷⵏ ⴷ ⵉⵎⵙⴰⵡⴰⵍⵏ
       write:notifications: ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ ⵏⵏⴽ
+      write:reports: ⵎⵍ ⵎⵉⴷⴷⵏ ⵏⵏⵉⴹⵏ
+      write:statuses: ⴼⵙⵔ ⵜⵉⵥⵕⴰⴳⵉⵏ
diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml
index 83c552427..872727049 100644
--- a/config/locales/doorkeeper.zh-HK.yml
+++ b/config/locales/doorkeeper.zh-HK.yml
@@ -3,8 +3,8 @@ zh-HK:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: 應用名稱
-        redirect_uri: 轉接 URI
+        name: 應用程式名稱
+        redirect_uri: 重新導向 URI
         scopes: 權限範圍
         website: 應用網站
     errors:
@@ -12,10 +12,10 @@ zh-HK:
         doorkeeper/application:
           attributes:
             redirect_uri:
-              fragment_present: URI 不可包含 "#fragment" 部份。
-              invalid_uri: 必需有正確的 URI。
-              relative_uri: 必需為完整 URI。
-              secured_uri: 必需使用有 HTTPS/SSL 加密的 URI。
+              fragment_present: 不能包含 fragment。
+              invalid_uri: 必需是一個有效的 URI。
+              relative_uri: 必須為絕對 URI。
+              secured_uri: 必須為 HTTPS/SSL 加密的 URI。
   doorkeeper:
     applications:
       buttons:
@@ -32,26 +32,26 @@ zh-HK:
         error: 噢!請檢查你表格的錯誤訊息
       help:
         native_redirect_uri: 使用 %{native_redirect_uri} 作局部測試
-        redirect_uri: 每行輸入一個 URI
+        redirect_uri: 一行一個 URI
         scopes: 請用半形空格分開權限範圍 (scope)。留空表示使用預設的權限範圍。
       index:
-        application: 應用
-        callback_url: 回傳網址
+        application: 應用程式
+        callback_url: 回傳網址 (Callback URL)
         delete: 刪除
-        empty: 您沒有申請
+        empty: 你沒有應用程式
         name: 名稱
         new: 新增應用程式
-        scopes: 權限範圍
+        scopes: 權限範圍 (Scopes)
         show: 顯示
         title: 你的應用程式
       new:
         title: 新增應用程式
       show:
         actions: 操作
-        application_id: 應用程式 ID
-        callback_urls: 回傳網址
-        scopes: 權限範圍
-        secret: 密碼
+        application_id: 用戶程式鑰匙 (Client key)
+        callback_urls: 回傳網址 (Callback URL)
+        scopes: 權限範圍 (Scopes)
+        secret: 用戶程式密碼 (Client secret)
         title: 應用程式︰ %{name}
     authorizations:
       buttons:
@@ -60,7 +60,7 @@ zh-HK:
       error:
         title: 發生錯誤
       new:
-        able_to: 要求獲取權限
+        able_to: 它將可以
         prompt: 應用程式 %{client_name} 要求得到你用戶的部份權限
         title: 需要用戶授權
       show:
@@ -73,27 +73,27 @@ zh-HK:
       index:
         application: 應用程式
         created_at: 授權日期
-        date_format: "%Y-%m-%d %H:%M:%S"
-        scopes: 權限範圍
+        date_format: "%Y年%m月%d日 %H:%M:%S"
+        scopes: 權限範圍 (Scopes)
         title: 已獲你授權的程用程式
     errors:
       messages:
         access_denied: 資源擁有者或授權伺服器不接受請求。
-        credential_flow_not_configured: 資源擁有者密碼認證程序失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。
-        invalid_client: 用戶程式認證失敗,原因是用戶程式未有登記、沒有指定用戶程式、或者使用了不支援的認證方法。
-        invalid_grant: 授權申請不正確、過期、已被取消,或者無法對應授權請求內的轉接 URI,或者屬於別的用戶程式。
+        credential_flow_not_configured: 資源擁有者密碼認證程序 (Resource Owner Password Credentials flow) 失敗,原因是 Doorkeeper.configure.resource_owner_from_credentials 沒有設定。
+        invalid_client: 用戶程式認證 (Client Authentication) 失敗,原因是使用了未知的用戶程式、沒有傳回用戶認證資訊、或者使用了不支援的認證方法 (Authentication Method)。
+        invalid_grant: 所提供的認證申請 (authorization grant) 不正確、過期、已被取消、或者無法對應授權請求 (authorization request) 內的轉接 URI,或者屬於別的用戶程式。
         invalid_redirect_uri: 不正確的轉接網址。
-        invalid_request: 請求缺少了必要的參數、包含了不支援的參數、或者其他輸入錯誤。
-        invalid_resource_owner: 資源擁有者的登入資訊錯誤、或者無法找到該資源擁有者
-        invalid_scope: 請求的權限範圍 (scope) 不正確、未有定義、或者輸入錯誤。
+        invalid_request: 請求缺少必要的參數、有不支援的參數、或包含其他格式錯誤。
+        invalid_resource_owner: 資源擁有者的登入資訊無效、或者無法找到該資源擁有者
+        invalid_scope: 你所請求的權限範圍 (scope) 無效、未知、或格式錯誤。
         invalid_token:
-          expired: access token 已經過期
-          revoked: access token 已被取消
-          unknown: access token 不正確
+          expired: 存取憑證 (access token) 已過期
+          revoked: 存取憑證 (access token) 已被撤銷
+          unknown: 存取憑證 (access token) 無效
         resource_owner_authenticator_not_configured: 無法找到資源擁有者,原因是 Doorkeeper.configure.resource_owner_authenticator 沒有設定。
-        server_error: 認證伺服器遇上未知狀況,令請求無法通過。
+        server_error: 認證伺服器遇上未知狀況,令請求無法被正確處理。
         temporarily_unavailable: 認證伺服器由於臨時負荷過重或者維護,目前未能處理請求。
-        unauthorized_client: 用戶程式無權用此方法 (method) 請行這個請求。
+        unauthorized_client: 用戶程式無權使用所選的方法 (method) 進行這個請求。
         unsupported_grant_type: 授權伺服器不支援這個授權類型 (grant type)。
         unsupported_response_type: 授權伺服器不支援這個回應類型 (response type)。
     flash:
@@ -119,33 +119,33 @@ zh-HK:
       admin:read:accounts: 讀取所有帳戶的敏感資訊
       admin:read:reports: 讀取所有回報 / 被回報之帳戶的敏感資訊
       admin:write: 修改伺服器的所有資料
-      admin:write:accounts: 對帳戶進行仲裁管理動作
-      admin:write:reports: 對報告進行仲裁管理動作
-      follow: 關注、封鎖、解除封鎖及取消關注用戶
+      admin:write:accounts: 對帳號進行仲裁管理動作
+      admin:write:reports: 對回報進行仲裁管理動作
+      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: 檢視所有嘟文
+      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:favourites: 收藏嘟文
+      write:accounts: 修改你的個人檔案
+      write:blocks: 封鎖帳號及域名
+      write:bookmarks: 把文章加入最愛
+      write:favourites: 喜歡的文章
       write:filters: 建立過濾條件
       write:follows: 關注其他人
-      write:lists: 建立名單
+      write:lists: 建立清單
       write:media: 上傳媒體檔案
       write:mutes: 靜音使用者及對話
-      write:notifications: 清除您的通知
+      write:notifications: 清除你的通知
       write:reports: 檢舉其他人
       write:statuses: 發布嘟文
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 9b9eeaa8d..5442d38b8 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -131,6 +131,7 @@ el:
       follows: Ακολουθεί
       header: Επικεφαλίδα
       inbox_url: URL εισερχομένων
+      invite_request_text: Λόγοι για εγγραφή
       invited_by: Προσκλήθηκε από
       ip: IP
       joined: Γράφτηκε
@@ -188,6 +189,8 @@ el:
       search: Αναζήτηση
       search_same_email_domain: Άλλοι χρήστες με τον ίδιο τομέα e-mail
       search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP
+      sensitive: Ευαίσθητο
+      sensitized: σήμανση ως ευαίσθητο
       shared_inbox_url: URL κοινόχρηστων εισερχομένων
       show:
         created_reports: Αναφορές από αυτόν το λογαριασμό
@@ -202,6 +205,7 @@ el:
       time_in_queue: Σε αναμονή για %{time}
       title: Λογαριασμοί
       unconfirmed_email: Ανεπιβεβαίωτο email
+      undo_sensitized: Αναίρεση ευαίσθητου
       undo_silenced: Αναίρεση αποσιώπησης
       undo_suspension: Αναίρεση παύσης
       unsilenced_msg: Επιτυχής άρση περιορισμών λογαριασμού του/της %{username}
@@ -243,9 +247,11 @@ el:
         reopen_report: Ξανάνοιγμα Καταγγελίας
         reset_password_user: Επαναφορά Συνθηματικού
         resolve_report: Επίλυση Καταγγελίας
+        sensitive_account: Σήμανση των πολυμέσων στον λογαριασμό σας ως ευαίσθητων
         silence_account: Σίγαση Λογαριασμού
         suspend_account: Αναστολή Λογαριασμού
         unassigned_report: Αποδέσμευση Καταγγελίας
+        unsensitive_account: Αφαίρεση σήμανσης των πολυμέσων στον λογαριασμό σας ως ευαίσθητων
         unsilence_account: Άρση Σίγασης Λογαριασμού
         unsuspend_account: Άρση Αναστολής Λογαριασμού
         update_announcement: Ενημέρωση Ανακοίνωσης
@@ -506,6 +512,8 @@ el:
       comment:
         none: Κανένα
       created_at: Καταγγέλθηκε
+      forwarded: Προωθημένα
+      forwarded_to: Προώθημένα προς %{domain}
       mark_as_resolved: Σημειωμένο ως επιλυμένο
       mark_as_unresolved: Σημειωμένο ως ανεπίλυτο
       notes:
@@ -549,6 +557,7 @@ el:
       domain_blocks_rationale:
         title: Εμφάνιση σκεπτικού
       enable_bootstrap_timeline_accounts:
+        desc_html: Οι νέοι χρήστες να ακολουθούν τους προρυθμισμένουνς λογαριασμούς ώστε η αρχική ροή τους να μην είναι άδεια
         title: Προεπιλογή παρακολούθησης για τους νέους χρήστες
       hero:
         desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου
@@ -834,6 +843,7 @@ el:
       request: Αιτήσου το αρχείο σου
       size: Μέγεθος
     blocks: Μπλοκάρεις
+    bookmarks: Σελιδοδείκτες
     csv: CSV
     domain_blocks: Μπλοκαρίσματα κόμβων
     lists: Λίστες
@@ -901,6 +911,8 @@ el:
     status: Κατάσταση επαλήθευσης
     view_proof: Εμφάνιση απόδειξης
   imports:
+    errors:
+      over_rows_processing_limit: περιέχει περισσότερες από %{count} γραμμές
     modes:
       merge: Συγχώνευση
       merge_long: Διατήρηση των εγγράφων που υπάρχουν και προσθηκη των νέων
@@ -910,6 +922,7 @@ el:
     success: Τα δεδομένα σου μεταφορτώθηκαν επιτυχώς και θα επεξεργαστούν εν καιρώ
     types:
       blocking: Λίστα αποκλεισμού
+      bookmarks: Σελιδοδείκτες
       domain_blocking: Λίστα αποκλεισμένων τομέων
       following: Λίστα ακολούθων
       muting: Λίστα αποσιωπήσεων
@@ -1344,6 +1357,7 @@ el:
       title:
         disable: Παγωμένος λογαριασμός
         none: Προειδοποίηση
+        sensitive: Το πολυμέσο σας έχει σημανθεί ως ευαίσθητο
         silence: Περιορισμένος λογαριασμός
         suspend: Λογαριασμός σε αναστολή
     welcome:
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 59f561aa3..8245397d7 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -60,6 +60,7 @@ en:
       one: Follower
       other: Followers
     following: Following
+    instance_actor_flash: This account is a virtual actor used to represent the server itself and not any individual user. It is used for federation purposes and should not be suspended.
     joined: Joined %{date}
     last_active: last active
     link_verified_on: Ownership of this link was checked on %{date}
@@ -131,6 +132,7 @@ en:
       follows: Follows
       header: Header
       inbox_url: Inbox URL
+      invite_request_text: Reasons for joining
       invited_by: Invited by
       ip: IP
       joined: Joined
@@ -255,6 +257,7 @@ en:
         unsuspend_account: Unsuspend Account
         update_announcement: Update Announcement
         update_custom_emoji: Update Custom Emoji
+        update_domain_block: Update Domain Block
         update_status: Update Status
       actions:
         assigned_to_self_report: "%{name} assigned report %{target} to themselves"
@@ -295,6 +298,7 @@ en:
         unsuspend_account: "%{name} unsuspended %{target}'s account"
         update_announcement: "%{name} updated announcement %{target}"
         update_custom_emoji: "%{name} updated emoji %{target}"
+        update_domain_block: "%{name} updated domain block for %{target}"
         update_status: "%{name} updated status by %{target}"
       deleted_status: "(deleted status)"
       empty: No logs found.
@@ -398,6 +402,8 @@ en:
           silence: Silence
           suspend: Suspend
         title: New domain block
+      obfuscate: Obfuscate domain name
+      obfuscate_hint: Partially obfuscate the domain name in the list if advertising the list of domain limitations is enabled
       private_comment: Private comment
       private_comment_hint: Comment about this domain limitation for internal use by the moderators.
       public_comment: Public comment
@@ -437,6 +443,7 @@ en:
     instances:
       by_domain: Domain
       delivery_available: Delivery is available
+      empty: No domains found.
       known_accounts:
         one: "%{count} known account"
         other: "%{count} known accounts"
@@ -514,6 +521,8 @@ en:
       comment:
         none: None
       created_at: Reported
+      forwarded: Forwarded
+      forwarded_to: Forwarded to %{domain}
       mark_as_resolved: Mark as resolved
       mark_as_unresolved: Mark as unresolved
       notes:
@@ -557,6 +566,7 @@ en:
       domain_blocks_rationale:
         title: Show rationale
       enable_bootstrap_timeline_accounts:
+        desc_html: Make new users automatically follow configured accounts so their home feed doesn't start out empty
         title: Enable default follows for new users
       hero:
         desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail
@@ -583,6 +593,9 @@ en:
         min_invite_role:
           disabled: No one
           title: Allow invitations by
+        require_invite_text:
+          desc_html: When registrations require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
+          title: Require new users to enter a reason to join
       registrations_mode:
         modes:
           approved: Approval required for sign up
@@ -911,6 +924,8 @@ en:
     status: Verification status
     view_proof: View proof
   imports:
+    errors:
+      over_rows_processing_limit: contains more than %{count} rows
     modes:
       merge: Merge
       merge_long: Keep existing records and add new ones
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index e9256ad0c..64b7ccfc7 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -35,10 +35,13 @@ eo:
     status_count_before: Kie skribiĝis
     tagline: Sekvi amikojn kaj trovi iujn novajn
     terms: Uzkondiĉoj
-    unavailable_content: Nedisponebla enhavo
+    unavailable_content: Kontrolitaj serviloj
     unavailable_content_description:
       domain: Servilo
       reason: 'Kialo:'
+      rejecting_media_title: Filtritaj aŭdovidaĵoj
+      silenced_title: Silentigitaj serviloj
+      suspended_title: Haltigitaj serviloj
     user_count_after:
       one: uzanto
       other: uzantoj
@@ -86,6 +89,7 @@ eo:
       delete: Forigi
       destroyed_msg: Kontrola noto sukcese detruita!
     accounts:
+      add_email_domain_block: Bloki retadresan domajnon
       approve: Aprobi
       approve_all: Aprobi ĉiujn
       are_you_sure: Ĉu vi certas?
@@ -101,6 +105,7 @@ eo:
       confirm: Konfirmi
       confirmed: Konfirmita
       confirming: Konfirmante
+      delete: Forigi datumojn
       deleted: Forigita
       demote: Degradi
       disable: Malebligi
@@ -117,6 +122,7 @@ eo:
       follows: Sekvatoj
       header: Kapa bildo
       inbox_url: Enira URL
+      invite_request_text: 가입하려는 이유
       invited_by: Invitita de
       ip: IP
       joined: Aliĝis
@@ -128,6 +134,7 @@ eo:
       login_status: Ensaluta stato
       media_attachments: Ligitaj aŭdovidaĵoj
       memorialize: Ŝanĝi al memoro
+      memorialized: Memorita
       moderation:
         active: Aktivaj
         all: Ĉio
@@ -167,6 +174,8 @@ eo:
         user: Uzanto
       search: Serĉi
       search_same_ip: Aliaj uzantoj kun la sama IP
+      sensitive: Tikla
+      sensitized: markita tikla
       shared_inbox_url: URL de kunhavigita leterkesto
       show:
         created_reports: Kreitaj signaloj
@@ -179,15 +188,19 @@ eo:
       time_in_queue: Atendado en atendovico %{time}
       title: Kontoj
       unconfirmed_email: Nekonfirmita retadreso
+      undo_sensitized: Malfari sentema
       undo_silenced: Malfari kaŝon
       undo_suspension: Malfari haltigon
       unsubscribe: Malaboni
       username: Uzantnomo
+      view_domain: Vidi la resumon de la domajno
       warn: Averti
       web: Reto
       whitelisted: En la blanka listo
     action_logs:
       action_types:
+        assigned_to_self_report: Atribui Raporton
+        change_email_user: Ŝanĝi retadreson de uzanto
         confirm_user: Konfermi uzanto
         create_account_warning: Krei Averton
         create_announcement: Krei Anoncon
@@ -195,12 +208,14 @@ eo:
         create_domain_allow: Krei Domajnan Permeson
         create_domain_block: Krei blokadon de domajno
         create_email_domain_block: Krei blokadon de retpoŝta domajno
+        create_ip_block: Krei IP-regulon
         demote_user: Malpromocii uzanton
         destroy_announcement: Forigi Anoncon
         destroy_custom_emoji: Forigi Propran emoĝion
         destroy_domain_allow: Forigi Domajnan Permeson
         destroy_domain_block: Forigi blokadon de domajno
         destroy_email_domain_block: Forigi blokadon de retpoŝta domajno
+        destroy_ip_block: Forigi IP-regulon
         destroy_status: Forigi mesaĝon
         disable_2fa_user: Malebligi 2FA
         disable_custom_emoji: Malebligi Propran Emoĝion
@@ -212,8 +227,15 @@ eo:
         reopen_report: Remalfermi signalon
         reset_password_user: Restarigi pasvorton
         resolve_report: Solvitaj reporto
+        sensitive_account: Marki tikla la aŭdovidaĵojn de via konto
         silence_account: Silentigi konton
         suspend_account: Haltigi konton
+        unsilence_account: Malsilentigi konton
+        unsuspend_account: Malhaltigi konton
+        update_announcement: Ĝisdatigi anoncon
+        update_custom_emoji: Ĝisdatigi proprajn emoĝiojn
+        update_domain_block: Ĝigdatigi domajnan blokadon
+        update_status: Ĝisdatigi staton
       actions:
         assigned_to_self_report: "%{name} asignis signalon %{target} al si mem"
         change_email_user: "%{name} ŝanĝis retadreson de uzanto %{target}"
@@ -224,12 +246,14 @@ eo:
         create_domain_allow: "%{name} aldonis domajnon %{target} al la blanka listo"
         create_domain_block: "%{name} blokis domajnon %{target}"
         create_email_domain_block: "%{name} blokis retpoŝtan domajnon %{target}"
+        create_ip_block: "%{name} kreis regulon por IP %{target}"
         demote_user: "%{name} degradis uzanton %{target}"
         destroy_announcement: "%{name} forigis anoncon %{target}"
         destroy_custom_emoji: "%{name} neniigis la emoĝion %{target}"
         destroy_domain_allow: "%{name} forigis domajnon %{target} el la blanka listo"
         destroy_domain_block: "%{name} malblokis domajnon %{target}"
         destroy_email_domain_block: "%{name} malblokis retpoŝtan domajnon %{target}"
+        destroy_ip_block: "%{name} forigis regulon por IP %{target}"
         destroy_status: "%{name} forigis mesaĝojn de %{target}"
         disable_2fa_user: "%{name} malebligis dufaktoran aŭtentigon por uzanto %{target}"
         disable_custom_emoji: "%{name} malebligis emoĝion %{target}"
@@ -251,6 +275,9 @@ eo:
         update_custom_emoji: "%{name} ĝisdatigis emoĝion %{target}"
         update_status: "%{name} ĝisdatigis mesaĝon de %{target}"
       deleted_status: "(forigita mesaĝo)"
+      empty: Neniu protokolo trovita.
+      filter_by_action: Filtri per ago
+      filter_by_user: Filtri per uzanto
       title: Kontrola protokolo
     announcements:
       destroyed_msg: Anonco sukcese forigita!
@@ -289,6 +316,7 @@ eo:
       listed: Listigita
       new:
         title: Aldoni novan propran emoĝion
+      not_permitted: Vi ne rajtas plenumi ĉi tiun agon
       overwrite: Anstataŭigi
       shortcode: Mallonga kodo
       shortcode_hint: Almenaŭ 2 signoj, nur literoj, ciferoj kaj substrekoj
@@ -385,6 +413,7 @@ eo:
     instances:
       by_domain: Domajno
       delivery_available: Liverado disponeblas
+      empty: Neniuj domajnoj trovitaj.
       known_accounts:
         one: "%{count} konata konto"
         other: "%{count} konataj kontoj"
@@ -409,6 +438,9 @@ eo:
         title: Filtri
       title: Invitoj
     ip_blocks:
+      add_new: Krei regulon
+      created_msg: Nova IP-regulo sukcese aldonita
+      delete: Forigi
       expires_in:
         '1209600': 2 semajnoj
         '15778476': 6 monatoj
@@ -416,6 +448,10 @@ eo:
         '31556952': 1 jaro
         '86400': 1 tago
         '94670856': 3 jaroj
+      new:
+        title: Krei novan IP-regulon
+      no_ip_block_selected: Neniu IP-regulo estis ŝanĝita ĉar neniu estis elektita
+      title: IP-reguloj
     pending_accounts:
       title: Pritraktataj kontoj (%{count})
     relationships:
@@ -670,9 +706,11 @@ eo:
     status:
       account_status: Statuso de la konto
       functional: Via konto estas plene funkcianta.
+    too_fast: Formularo sendita tro rapide, klopodu denove.
     trouble_logging_in: Ĝeni ensaluti?
   authorize_follow:
     already_following: Vi jam sekvas tiun konton
+    already_requested: Vi jam sendis peton de sekvado al ĉi tiu konto
     error: Bedaŭrinde, estis eraro en la serĉado de la fora konto
     follow: Sekvi
     follow_request: 'Vi sendis peton de sekvado al:'
@@ -753,6 +791,7 @@ eo:
       request: Peti vian arkivon
       size: Grandeco
     blocks: Vi blokas
+    bookmarks: Legosignoj
     csv: CSV
     domain_blocks: Blokoj de domajnoj
     lists: Listoj
@@ -826,6 +865,7 @@ eo:
     success: Viaj datumoj estis sukcese alŝutitaj kaj estos traktitaj kiel planite
     types:
       blocking: Listo de blokitoj
+      bookmarks: Legosignoj
       domain_blocking: Listo de blokitaj domajnoj
       following: Listo de sekvatoj
       muting: Listo de silentigitoj
@@ -930,6 +970,8 @@ eo:
           quadrillion: Dd
           thousand: m
           trillion: Dn
+  otp_authentication:
+    enable: Ebligi
   pagination:
     newer: Pli nova
     next: Sekva
@@ -974,7 +1016,7 @@ eo:
     status: Statuso de la konto
   remote_follow:
     acct: Enmetu vian uzantnomo@domajno de kie vi volas agi
-    missing_resource: La URL de plusendado ne estis trovita
+    missing_resource: La bezonata URL de plusendado por via konto ne estis trovita
     no_account_html: Ĉu vi ne havas konton? Vi povas <a href='%{sign_up_path}' target='_blank'>registriĝi tie</a>
     proceed: Daŭrigi por eksekvi
     prompt: 'Vi eksekvos:'
@@ -1120,6 +1162,7 @@ eo:
   two_factor_authentication:
     add: Aldoni
     disable: Malebligi
+    disabled_success: Dufaktora aŭtentigo sukcese malebligita
     edit: Redakti
     enabled: Dufaktora aŭtentigo ebligita
     enabled_success: Dufaktora aŭtentigo sukcese ebligita
@@ -1179,3 +1222,4 @@ eo:
     verification: Kontrolo
   webauthn_credentials:
     delete: Forigi
+    registered_on: Registrigita je %{date}
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 0108f0784..32e079074 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -60,6 +60,7 @@ es-AR:
       one: Seguidor
       other: Seguidores
     following: Siguiendo
+    instance_actor_flash: Esta cuenta es un actor virtual usado para representar al servidor en sí mismo y no a ningún usuario individual. Se usa para propósitos de la federación y no debe ser suspendido.
     joined: En este servidor desde %{date}
     last_active: última actividad
     link_verified_on: La propiedad de este enlace fue verificada el %{date}
@@ -131,6 +132,7 @@ es-AR:
       follows: Seguidores
       header: Cabecera
       inbox_url: Dirección web de la bandeja de entrada
+      invite_request_text: Motivos para unirte
       invited_by: Invitado por
       ip: Dirección IP
       joined: Se unió en
@@ -255,6 +257,7 @@ es-AR:
         unsuspend_account: Dejar de suspender cuenta
         update_announcement: Actualizar anuncio
         update_custom_emoji: Actualizar emoji personalizado
+        update_domain_block: Actualizar bloque de dominio
         update_status: Actualizar toot
       actions:
         assigned_to_self_report: "%{name} se asignó la denuncia %{target} a sí"
@@ -295,6 +298,7 @@ es-AR:
         unsuspend_account: "%{name} quitó la suspensión de la cuenta de %{target}"
         update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
+        update_domain_block: "%{name} actualizó el bloqueo de dominio para %{target}"
         update_status: "%{name} actualizó el toot de %{target}"
       deleted_status: "[toot eliminado]"
       empty: No se encontraron registros.
@@ -398,6 +402,8 @@ es-AR:
           silence: Silenciar
           suspend: Suspender
         title: Nuevo bloqueo de dominio
+      obfuscate: Obfuscar nombre de dominio
+      obfuscate_hint: Obfusca parcialmente el nombre de dominio en la lista si el anuncio de la lista de limitaciones de dominio está habilitado
       private_comment: Comentario privado
       private_comment_hint: Comentario sobre la limitación de este dominio, para uso interno de los moderadores.
       public_comment: Comentario público
@@ -437,6 +443,7 @@ es-AR:
     instances:
       by_domain: Dominio
       delivery_available: La entrega está disponible
+      empty: No se encontraron dominios.
       known_accounts:
         one: "%{count} cuenta conocida"
         other: "%{count} cuentas conocidas"
@@ -514,6 +521,8 @@ es-AR:
       comment:
         none: Ninguno
       created_at: Denunciado
+      forwarded: Reenviado
+      forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resuelta
       mark_as_unresolved: Marcar como no resuelta
       notes:
@@ -557,6 +566,7 @@ es-AR:
       domain_blocks_rationale:
         title: Mostrar razonamiento
       enable_bootstrap_timeline_accounts:
+        desc_html: Hacer que los nuevos usuarios sigan automáticamente las cuentas configuradas para que su línea temporal principal no comience vacía
         title: Habilitar seguimientos predeterminados para nuevas cuentas
       hero:
         desc_html: Mostrado en la página principal. Se recomienda un tamaño mínimo de 600x100 píxeles. Predeterminadamente se establece a la miniatura del servidor
@@ -583,6 +593,9 @@ es-AR:
         min_invite_role:
           disabled: Nadie
           title: Permitir invitaciones de
+        require_invite_text:
+          desc_html: Cuando los registros requieran aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional
+          title: Requerir que los nuevos usuarios llenen un texto de solicitud de invitación
       registrations_mode:
         modes:
           approved: Se requiere aprobación para registrarse
@@ -751,6 +764,7 @@ es-AR:
       functional: Tu cuenta está totalmente operativa.
       pending: Tu solicitud está pendiente de revisión por nuestra administración. Eso puede tardar algún tiempo. Si se aprueba tu solicitud, vas a recibir un correo electrónico.
       redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}.
+    too_fast: Formulario enviado demasiado rápido, probá de nuevo.
     trouble_logging_in: "¿Tenés problemas para iniciar sesión?"
     use_security_key: Usar la llave de seguridad
   authorize_follow:
@@ -910,6 +924,8 @@ es-AR:
     status: Estado de verificación
     view_proof: Ver prueba
   imports:
+    errors:
+      over_rows_processing_limit: contiene más de %{count} filas
     modes:
       merge: Combinar
       merge_long: Mantener registros existentes y agregar nuevos
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 46285d84f..0582fd1f1 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -60,6 +60,7 @@ es:
       one: Seguidor
       other: Seguidores
     following: Siguiendo
+    instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al servidor en sí mismo y no a ningún usuario individual. Se utiliza para propósitos de la federación y no se debe suspender.
     joined: Se unió el %{date}
     last_active: última conexión
     link_verified_on: La propiedad de este vínculo fue verificada el %{date}
@@ -131,6 +132,7 @@ es:
       follows: Sigue
       header: Cabecera
       inbox_url: URL de la bandeja de entrada
+      invite_request_text: Razones para unirse
       invited_by: Invitado por
       ip: IP
       joined: Unido
@@ -255,6 +257,7 @@ es:
         unsuspend_account: Dejar de Suspender Cuenta
         update_announcement: Actualizar Anuncio
         update_custom_emoji: Actualizar Emoji Personalizado
+        update_domain_block: Actualizar el Bloqueo de Dominio
         update_status: Actualizar Estado
       actions:
         assigned_to_self_report: "%{name} se ha asignado la denuncia %{target} a sí mismo"
@@ -295,6 +298,7 @@ es:
         unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}"
         update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
+        update_domain_block: "%{name} actualizó el bloqueo de dominio para %{target}"
         update_status: "%{name} actualizó el estado de %{target}"
       deleted_status: "(estado borrado)"
       empty: No se encontraron registros.
@@ -398,6 +402,8 @@ es:
           silence: Silenciar
           suspend: Suspender
         title: Nuevo bloque de dominio
+      obfuscate: Ocultar nombre de dominio
+      obfuscate_hint: Oculta parcialmente el nombre de dominio en la lista si mostrar la lista de limitaciones de dominio está habilitado
       private_comment: Comentario privado
       private_comment_hint: Comentario sobre esta limitación de dominio para el uso interno por parte de los moderadores.
       public_comment: Comentario público
@@ -437,6 +443,7 @@ es:
     instances:
       by_domain: Dominio
       delivery_available: Entrega disponible
+      empty: No se encontraron dominios.
       known_accounts:
         one: "%{count} cuenta conocida"
         other: "%{count} cuentas conocidas"
@@ -514,6 +521,8 @@ es:
       comment:
         none: Ninguno
       created_at: Denunciado
+      forwarded: Reenviado
+      forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resuelto
       mark_as_unresolved: Marcar como no resuelto
       notes:
@@ -557,6 +566,7 @@ es:
       domain_blocks_rationale:
         title: Mostrar la razón de ser
       enable_bootstrap_timeline_accounts:
+        desc_html: Hacer que los nuevos usuarios sigan automáticamente las cuentas configuradas para que su línea temporal de inicio no comience vacía
         title: Habilitar seguimientos predeterminados para usuarios nuevos
       hero:
         desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia
@@ -583,6 +593,9 @@ es:
         min_invite_role:
           disabled: Nadie
           title: Permitir invitaciones de
+        require_invite_text:
+          desc_html: Cuando los registros requieren aprobación manual, haga obligatorio en la invitaciones el campo "¿Por qué quieres unirte?" en lugar de opcional
+          title: Requiere a los nuevos usuarios rellenar un texto de solicitud de invitación
       registrations_mode:
         modes:
           approved: Se requiere aprobación para registrarse
@@ -751,6 +764,7 @@ es:
       functional: Su cuenta está totalmente operativa.
       pending: Su solicitud está pendiente de revisión por nuestros administradores. Eso puede tardar algún tiempo. Usted recibirá un correo electrónico si el solicitud sea aprobada.
       redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}.
+    too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo.
     trouble_logging_in: "¿Problemas para iniciar sesión?"
     use_security_key: Usar la clave de seguridad
   authorize_follow:
@@ -910,6 +924,8 @@ es:
     status: Estado de la verificación
     view_proof: Ver prueba
   imports:
+    errors:
+      over_rows_processing_limit: contiene más de %{count} filas
     modes:
       merge: Unir
       merge_long: Mantener registros existentes y añadir nuevos
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 77740e9e3..cf094478a 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -62,6 +62,7 @@ fa:
       one: پیگیر
       other: پیگیر
     following: پی می‌گیرد
+    instance_actor_flash: این حساب یک عامل مجازی است که به نمایندگی از خود کارساز استفاده می‌شود و نه هیچ یکی از کاربران. این حساب به منظور اتصال به فدراسیون استفاده می‌شود و نباید معلق شود.
     joined: کاربر از %{date}
     last_active: آخرین فعالیت
     link_verified_on: مالکیت این پیوند در %{date} بررسی شد
@@ -128,10 +129,12 @@ fa:
       email_status: وضعیت ایمیل
       enable: به کار انداختن
       enabled: به کار افتاده
+      enabled_msg: حساب %{username} با موفقیت به کار انداخته شد
       followers: پیگیران
       follows: پی می‌گیرد
       header: تصویر زمینه
       inbox_url: نشانی صندوق ورودی
+      invite_request_text: دلایل‌تان برای پیوستن
       invited_by: دعوت‌شده از طرف
       ip: IP
       joined: عضو شده در
@@ -143,6 +146,8 @@ fa:
       login_status: وضعیت ورود
       media_attachments: پیوست‌های رسانه‌ای
       memorialize: تبدیل به یادمان
+      memorialized: یادمان‌سازی شده
+      memorialized_msg: "%{username} با موفقیت به یک حساب یادمانی تبدیل شد"
       moderation:
         active: فعّال
         all: همه
@@ -254,6 +259,7 @@ fa:
         unsuspend_account: رفع تعلیق حساب
         update_announcement: به‌روز رسانی اعلامیه
         update_custom_emoji: به‌روز رسانی اموجی سفارشی
+        update_domain_block: به‌روزرسانی مسدودسازی دامنه
         update_status: به‌روز رسانی وضعیت
       actions:
         assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرفت"
@@ -285,13 +291,16 @@ fa:
         reopen_report: "%{name} گزارش %{target} را دوباره به جریان انداخت"
         reset_password_user: "%{name} رمز کاربر %{target} را بازنشاند"
         resolve_report: "%{name} گزارش %{target} را رفع کرد"
+        sensitive_account: "%{name} رسانهٔ %{target} را به عنوان حساس علامت‌گذاری کرد"
         silence_account: "%{name} حساب کاربر %{target} را خاموش (بی‌صدا) کرد"
         suspend_account: "%{name} حساب کاربر %{target} را تعلیق کرد"
         unassigned_report: "%{name} بررسی گزارش %{target} را متوقف کرد"
+        unsensitive_account: "%{name} علامت حساس رسانهٔ %{target} را برداشت"
         unsilence_account: "%{name} حساب کاربر %{target} را روشن (باصدا) کرد"
         unsuspend_account: "%{name} حساب کاربر %{target} را از تعلیق خارج کرد"
         update_announcement: "%{name} اعلامیهٔ %{target} را به‌روز کرد"
         update_custom_emoji: "%{name} شکلک %{target} را به‌روز کرد"
+        update_domain_block: "%{name} مسدودسازی دامنه را برای %{target} به‌روزرسانی کرد"
         update_status: "%{name} نوشتهٔ %{target} را به‌روز کرد"
       deleted_status: "(نوشتهٔ پاک‌شده)"
       empty: هیچ گزارشی پیدا نشد.
@@ -434,6 +443,7 @@ fa:
     instances:
       by_domain: دامین
       delivery_available: پیام آماده است
+      empty: هیج دامنه‌ای پیدا نشد.
       known_accounts:
         one: "%{count} حساب شناخته‌شده"
         other: "%{count} حساب شناخته‌شده"
@@ -511,6 +521,8 @@ fa:
       comment:
         none: هیچ
       created_at: گزارش‌شده
+      forwarded: هدایت شده
+      forwarded_to: هدایت شده به %{domain}
       mark_as_resolved: علامت‌گذاری به عنوان حل‌شده
       mark_as_unresolved: علامت‌گذاری به عنوان حل‌نشده
       notes:
@@ -580,6 +592,9 @@ fa:
         min_invite_role:
           disabled: هیچ کس
           title: اجازهٔ دعوت به
+        require_invite_text:
+          desc_html: زمانی که نام‌نویسی نیازمند تایید دستی است، متن «چرا می‌خواهید عضو شود؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید
+          title: نیازمند پر کردن متن درخواست دعوت توسط کاربران جدید
       registrations_mode:
         modes:
           approved: ثبت نام نیازمند تأیید مدیران است
@@ -748,6 +763,7 @@ fa:
       functional: حساب شما قابل استفاده است.
       pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد.
       redirecting_to: حساب شما غیرفعال است زیرا هم‌اکنون به %{acct} منتقل شده است.
+    too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید.
     trouble_logging_in: برای ورود مشکلی دارید؟
     use_security_key: استفاده از کلید امنیتی
   authorize_follow:
@@ -1041,6 +1057,7 @@ fa:
     code_hint: برای تأیید، کدی را که برنامهٔ تأییدکننده ساخته است وارد کنید
     description_html: اگر <strong>ورود دومرحله‌ای</strong> را با استفاده از از یک کارهٔ تأییدکننده به کار بیندازید، لازم است برای ورود، به تلفن خود که برایتان یک ژتون خواهد ساخت دسترسی داشته باشید.
     enable: به کار انداختن
+    instructions_html: "<strong>این کد QR را با برنامهٔ Google Authenticator یا برنامه‌های TOTP مشابه اسکن کنید</strong>. از این به بعد، آن برنامه کدهایی موقتی خواهد ساخت که برای ورود باید آن‌ها را وارد کنید."
     manual_instructions: 'اگر نمی‌توانید رمز QR را بپویید و باید دستی واردظ کنید، متن رمز این‌جاست:'
     setup: برپا سازی
     wrong_code: رمز وارد شده نامعتبر بود! آیا زمان کارساز و زمان افزاره درستند؟
@@ -1072,6 +1089,7 @@ fa:
   relationships:
     activity: فعالیت حساب
     dormant: غیرفعال
+    follow_selected_followers: پیگیری پیگیران انتخاب شده
     followers: پی‌گیران
     following: پی می‌گیرد
     invited: مدعو
@@ -1207,6 +1225,8 @@ fa:
         other: "%{count} رأی"
       vote: رأی
     show_more: نمایش
+    show_newer: نمایش جدیدتر
+    show_older: نمایش قدیمی‌تر
     show_thread: نمایش رشته
     sign_in_to_participate: برای شرکت در گفتگو وارد حساب خود شوید
     title: '%{name}: "%{quote}"'
@@ -1352,6 +1372,7 @@ fa:
       subject:
         disable: حساب %{acct} شما متوقف شده است
         none: هشدار برای %{acct}
+        sensitive: رسانه‌های فرستاده شده توسط حساب %{acct} شما برچسب حساس خورده‌اند
         silence: حساب %{acct} شما محدود شده است
         suspend: حساب %{acct}  شما معلق شده است
       title:
@@ -1399,6 +1420,7 @@ fa:
       success: کلید امنیتیتان با موفّقیت افزوده شد.
     delete: حذف
     delete_confirmation: مطمئنید که می‌خواهید این کلید امنیتی را حذف کنید؟
+    description_html: اگر <strong>احراز هویت کلید امنیتی</strong> را فعال کنید، ورود نیازمند این خواهد بود که یکی از کلیدهای امنیتی‌تان را استفاده کنید.
     destroy:
       error: حذف کلید امنیتیتان با مشکل مواجه شد. لطفاً دوباره تلاش کنید.
       success: کلید امنیتیتان با موفّقیت حذف شد.
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 90ed7cbe8..0c96d462d 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -15,7 +15,7 @@ fr:
     browse_public_posts: Parcourir un flux en direct de messages publics sur Mastodon
     contact: Contact
     contact_missing: Non défini
-    contact_unavailable: N/D
+    contact_unavailable: Non disponible
     discover_users: Découvrez des utilisateur·rice·s
     documentation: Documentation
     federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre les gens sur n’importe quel serveur Mastodon et au-delà.
@@ -33,7 +33,7 @@ fr:
       one: statut
       other: statuts
     status_count_before: Ayant publié
-    tagline: Suivez vos ami·e·s et découvrez-en de nouveaux·elles
+    tagline: Suivez vos ami·e·s et découvrez en de nouveaux·elles
     terms: Conditions d’utilisation
     unavailable_content: Serveurs modérés
     unavailable_content_description:
@@ -60,6 +60,7 @@ fr:
       one: Abonné·e
       other: Abonné·e·s
     following: Abonnements
+    instance_actor_flash: Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un utilisateur individuel. Il est utilisé à des fins de fédération et ne doit pas être suspendu.
     joined: Inscrit·e en %{date}
     last_active: dernière activité
     link_verified_on: La propriété de ce lien a été vérifiée le %{date}
@@ -131,6 +132,7 @@ fr:
       follows: Abonnements
       header: Entête
       inbox_url: URL d’entrée
+      invite_request_text: Raisons de l’adhésion
       invited_by: Invité par
       ip: Adresse IP
       joined: Inscrit·e depuis
@@ -255,6 +257,7 @@ fr:
         unsuspend_account: Annuler la suspension du compte
         update_announcement: Modifier l’annonce
         update_custom_emoji: Mettre à jour les émojis personnalisés
+        update_domain_block: Mettre à jour le blocage de domaine
         update_status: Mettre à jour le statut
       actions:
         assigned_to_self_report: "%{name} s’est assigné·e le signalement de %{target}"
@@ -295,6 +298,7 @@ fr:
         unsuspend_account: "%{name} a réactivé le compte de %{target}"
         update_announcement: "%{name} a actualisé l’annonce %{target}"
         update_custom_emoji: "%{name} a mis à jour l’émoji %{target}"
+        update_domain_block: "%{name} a mis à jour le blocage de domaine pour %{target}"
         update_status: "%{name} a mis à jour le statut de %{target}"
       deleted_status: "(statut supprimé)"
       empty: Aucun journal trouvé.
@@ -398,6 +402,8 @@ fr:
           silence: Masqué
           suspend: Suspendre
         title: Nouveau blocage de domaine
+      obfuscate: Obfusquer le nom de domaine
+      obfuscate_hint: Obfusquer partiellement le nom de domaine dans la liste si la liste des limitations de domaine est activée
       private_comment: Commentaire privé
       private_comment_hint: Commenter sur cette limitation de domaine pour informer les modérateurs internes.
       public_comment: Commentaire public
@@ -437,6 +443,7 @@ fr:
     instances:
       by_domain: Domaine
       delivery_available: Livraison disponible
+      empty: Aucun domaine trouvé.
       known_accounts:
         one: "%{count} compte connu"
         other: "%{count} comptes connus"
@@ -514,6 +521,8 @@ fr:
       comment:
         none: Aucun
       created_at: Signalé
+      forwarded: Transféré
+      forwarded_to: Transféré à %{domain}
       mark_as_resolved: Marquer comme résolu
       mark_as_unresolved: Marquer comme non-résolu
       notes:
@@ -557,6 +566,7 @@ fr:
       domain_blocks_rationale:
         title: Montrer la raison
       enable_bootstrap_timeline_accounts:
+        desc_html: Faire suivre automatiquement les comptes configurés aux nouveaux·lles utilisateurs·rices afin que leur flux personnel ne démarre pas vide
         title: Activer les abonnements par défaut pour les nouveaux·elles utilisateur·rice·s
       hero:
         desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette du serveur
@@ -583,6 +593,9 @@ fr:
         min_invite_role:
           disabled: Personne
           title: Autoriser les invitations par
+        require_invite_text:
+          desc_html: Lorsque les enregistrements nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif
+          title: Exiger que les nouveaux utilisateurs remplissent un texte de demande d’invitation
       registrations_mode:
         modes:
           approved: Approbation requise pour s’inscrire
@@ -751,6 +764,7 @@ fr:
       functional: Votre compte est entièrement opérationnel.
       pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée.
       redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}.
+    too_fast: Formulaire envoyé trop rapidement, veuillez réessayer.
     trouble_logging_in: Vous avez un problème pour vous connecter ?
     use_security_key: Utiliser la clé de sécurité
   authorize_follow:
@@ -910,6 +924,8 @@ fr:
     status: État de la vérification
     view_proof: Voir la preuve
   imports:
+    errors:
+      over_rows_processing_limit: contient plus de %{count} lignes
     modes:
       merge: Fusionner
       merge_long: Garder les enregistrements existants et ajouter les nouveaux
@@ -1092,7 +1108,7 @@ fr:
     status: État du compte
   remote_follow:
     acct: Entrez l’adresse profil@serveur depuis laquelle vous voulez effectuer cette action
-    missing_resource: L’URL de redirection n’a pas pu être trouvée
+    missing_resource: L’URL de redirection requise pour votre compte n’a pas pu être trouvée
     no_account_html: Vous n’avez pas de compte ? Vous pouvez <a href='%{sign_up_path}' target='_blank'>vous inscrire ici</a>
     proceed: Confirmer l’abonnement
     prompt: 'Vous allez suivre :'
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 89da4bf82..48aaff0ad 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -60,6 +60,7 @@ gl:
       one: Seguidora
       other: Seguidoras
     following: Seguindo
+    instance_actor_flash: Esta conta é un actor virtual utilizado para representar ó servidor mesmo e non a unha usuaria individual. Utilízase por motivos de federación e non debería estar suspendida.
     joined: Uniuse en %{date}
     last_active: última actividade
     link_verified_on: A propiedade desta ligazón foi verificada en %{date}
@@ -131,6 +132,7 @@ gl:
       follows: Seguindo
       header: Cabeceira
       inbox_url: URL da caixa de entrada
+      invite_request_text: Razóns para unirte
       invited_by: Convidada por
       ip: IP
       joined: Uniuse
@@ -255,6 +257,7 @@ gl:
         unsuspend_account: Retirar suspensión de conta
         update_announcement: Actualizar anuncio
         update_custom_emoji: Actualizar emoticona personalizada
+        update_domain_block: Actualizar bloqueo do dominio
         update_status: Actualizar estado
       actions:
         assigned_to_self_report: "%{name} atribuíu a denuncia %{target} a el mesmo"
@@ -295,6 +298,7 @@ gl:
         unsuspend_account: "%{name} desactivou a suspensión da conta de %{target}"
         update_announcement: "%{name} actualizou o anuncio %{target}"
         update_custom_emoji: "%{name} actualizou a emoticona %{target}"
+        update_domain_block: "%{name} actualizou o bloqueo do dominio %{target}"
         update_status: "%{name} actualizou o estado de %{target}"
       deleted_status: "(estado eliminado)"
       empty: Non se atoparon rexistros.
@@ -398,6 +402,8 @@ gl:
           silence: Silenciar
           suspend: Suspender
         title: Novo bloqueo de dominio
+      obfuscate: Ofuscar o nome de dominio
+      obfuscate_hint: Ofuscar parcialmente o nome do dominio na lista se está activada a publicación da lista de limitacións de dominio
       private_comment: Comentario privado
       private_comment_hint: Comentar sobre esta limitación de dominio para uso interno polos moderadores.
       public_comment: Comentario público
@@ -437,6 +443,7 @@ gl:
     instances:
       by_domain: Dominio
       delivery_available: Entrega dispoñíbel
+      empty: Non se atopan dominios.
       known_accounts:
         one: "%{count} conta coñecida"
         other: "%{count} contas coñecidas"
@@ -514,6 +521,8 @@ gl:
       comment:
         none: Ningún
       created_at: Denunciado
+      forwarded: Reenviado
+      forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resolto
       mark_as_unresolved: Marcar como non resolto
       notes:
@@ -557,6 +566,7 @@ gl:
       domain_blocks_rationale:
         title: Amosar motivo
       enable_bootstrap_timeline_accounts:
+        desc_html: Facer que as novas usuarias sigan automáticamente certas contas para que así a cronoloxía inicial non esté baleira
         title: Activar seguimentos por omisión para novas usuarias
       hero:
         desc_html: Amosado na páxina principal. Polo menos 600x100px recomendados. Se non está definido, estará por defecto a miniatura do servidor
@@ -583,6 +593,9 @@ gl:
         min_invite_role:
           disabled: Ninguén
           title: Permitir convites por
+        require_invite_text:
+          desc_html: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo
+          title: Require que as novas usuarias completen solicitude de texto do convite
       registrations_mode:
         modes:
           approved: Precisa aprobación para rexistrarse
@@ -751,6 +764,7 @@ gl:
       functional: A súa conta está totalmente operativa.
       pending: A túa aplicación está pendente de revisión. Poderíanos levar algún tempo. Recibirás un correo se a aplicación está aprobada.
       redirecting_to: A túa conta está inactiva porque está redirixida a %{acct}.
+    too_fast: Formulario enviado demasiado rápido, inténtao outra vez.
     trouble_logging_in: Problemas para conectar?
     use_security_key: Usa chave de seguridade
   authorize_follow:
@@ -910,6 +924,8 @@ gl:
     status: Estado da validación
     view_proof: Ver proba
   imports:
+    errors:
+      over_rows_processing_limit: contén máis de %{count} filas
     modes:
       merge: Fusionar
       merge_long: Manter os rexistros actuais e engadir novos
@@ -1338,8 +1354,8 @@ gl:
     webauthn: Chaves de seguridade
   user_mailer:
     backup_ready:
-      explanation: Solicitou un respaldo completo da súa conta de Mastodon. Xa está listo para descargar!
-      subject: O seu ficheiro xa está listo para descargar
+      explanation: Solicitaches os datos completos da túa conta de Mastodon. Xa está preparados para descargar!
+      subject: O teu ficheiro xa está preparado para descargar
       title: Leve o ficheiro
     sign_in_token:
       details: 'Detalles sobre o intento:'
@@ -1370,7 +1386,7 @@ gl:
         suspend: Conta suspendida
     welcome:
       edit_profile_action: Configurar perfil
-      edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a tua conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots.
+      edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a túa conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots.
       explanation: Aquí ten alunhas endereitas para ir aprendendo
       final_action: Comece a publicar
       final_step: 'Publica! Incluso sen seguidoras as túas mensaxes serán vistas por outras, por exemplo na liña temporal local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.'
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 1a112c53a..97596ff0c 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -21,9 +21,9 @@ hu:
     federation_hint_html: Egy %{instance} fiókkal bármely más Mastodon szerveren vagy a föderációban lévő felhasználót követni tudsz.
     get_apps: Próbálj ki egy mobil appot
     hosted_on: "%{domain} Mastodon szerver"
-    instance_actor_flash: 'Ez a fiók egy virtuális szereplő, mely magát a szervert reprezentálja, nem egy felhasználót. Ez a föderáció támogatására készült, ezért nem szabad blokkolni, hacsak egy teljes szervert nem akarsz kitiltani, amire persze a domain blokkolása jobb megoldás.
-
-'
+    instance_actor_flash: |
+      Ez a fiók virtuális, magát a szervert reprezentálja, nem pedig konkrét
+      felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni, hacsak nem akarod a teljes szervert kitiltani, mely esetben a domain tiltásának használata javasolt.
     learn_more: Tudj meg többet
     privacy_policy: Adatvédelmi szabályzat
     see_whats_happening: Nézd, mi történik
@@ -60,6 +60,9 @@ hu:
       one: Követő
       other: Követő
     following: Követett
+    instance_actor_flash: |-
+      Ez a fiók virtuális, magát a szervert reprezentálja, nem pedig konkrét
+      felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni.
     joined: Csatlakozott %{date}
     last_active: utoljára aktív
     link_verified_on: A link tulajdonosát %{date} -n ellenőriztük
@@ -131,6 +134,7 @@ hu:
       follows: Követett
       header: Fejléc
       inbox_url: Beérkezett üzenetek URL-je
+      invite_request_text: Csatlakozás oka
       invited_by: Meghívta
       ip: IP
       joined: Csatlakozott
@@ -140,7 +144,7 @@ hu:
         remote: Távoli
         title: Hely
       login_status: Bejelentkezési állapot
-      media_attachments: Média-csatolmányok
+      media_attachments: Médiamellékletek
       memorialize: Emlékállítás
       memorialized: Emlékezetünkben
       memorialized_msg: A %{username} fiókot sikeresen emlékké nyilvánítottuk
@@ -224,15 +228,15 @@ hu:
         create_announcement: Közlemény létrehozása
         create_custom_emoji: Egyéni emodzsi létrehozása
         create_domain_allow: Domain engedélyezés létrehozása
-        create_domain_block: Domain blokkolás létrehozása
-        create_email_domain_block: E-mail domain blokkolás létrehozása
+        create_domain_block: Domain tiltás létrehozása
+        create_email_domain_block: E-mail domain tiltás létrehozása
         create_ip_block: IP szabály létrehozása
         demote_user: Felhasználó lefokozása
         destroy_announcement: Közlemény törlése
         destroy_custom_emoji: Egyéni emodzsi törlése
         destroy_domain_allow: Domain engedélyezés törlése
-        destroy_domain_block: Domain blokkolás törlése
-        destroy_email_domain_block: E-mail domain blokkolás törlése
+        destroy_domain_block: Domain tiltás törlése
+        destroy_email_domain_block: E-mail domain tiltás törlése
         destroy_ip_block: IP szabály törlése
         destroy_status: Állapot törlése
         disable_2fa_user: Kétlépcsős hitelesítés letiltása
@@ -255,6 +259,7 @@ hu:
         unsuspend_account: Fiók felfüggesztésének feloldása
         update_announcement: Közlemény frissítése
         update_custom_emoji: Egyéni emodzsi frissítése
+        update_domain_block: Domain tiltás frissítése
         update_status: Állapot frissítése
       actions:
         assigned_to_self_report: "%{name} a %{target} bejelentést magához rendelte"
@@ -265,14 +270,14 @@ hu:
         create_custom_emoji: "%{name} új emodzsit töltött fel: %{target}"
         create_domain_allow: "%{name} engedélyező listára vette %{target} domaint"
         create_domain_block: "%{name} letiltotta az alábbi domaint: %{target}"
-        create_email_domain_block: "%{name} feketelistára tette az alábbi e-mail domaint: %{target}"
+        create_email_domain_block: "%{name} letiltotta az e-mail domaint: %{target}"
         create_ip_block: "%{name} létrehozott egy szabályt a %{target} IP-vel kapcsolatban"
         demote_user: "%{name} lefokozta az alábbi felhasználót: %{target}"
         destroy_announcement: "%{name} törölte a közleményt %{target}"
         destroy_custom_emoji: "%{name} törölte az emodzsit: %{target}"
         destroy_domain_allow: "%{name} leszedte %{target} domaint az engedélyező listáról"
         destroy_domain_block: "%{name} engedélyezte az alábbi domaint: %{target}"
-        destroy_email_domain_block: "%{name} fehérlistára tette az alábbi e-mail domaint: %{target}"
+        destroy_email_domain_block: "%{name} engedélyezte az e-mail domaint: %{target}"
         destroy_ip_block: "%{name} törölt egy szabályt a %{target} IP-vel kapcsolatban"
         destroy_status: "%{name} eltávolította az alábbi felhasználó tülkjét: %{target}"
         disable_2fa_user: "%{name} kikapcsolta a kétlépcsős azonosítást %{target} felhasználó fiókján"
@@ -295,6 +300,7 @@ hu:
         unsuspend_account: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését"
         update_announcement: "%{name} frissítette a közleményt %{target}"
         update_custom_emoji: "%{name} frissítette az alábbi emodzsit: %{target}"
+        update_domain_block: "%{name} frissítette a %{target} domain tiltását"
         update_status: "%{name} frissítette %{target} felhasználó tülkjét"
       deleted_status: "(törölt tülk)"
       empty: Nem található napló.
@@ -398,6 +404,8 @@ hu:
           silence: Némítás
           suspend: Felfüggesztés
         title: Új domain tiltása
+      obfuscate: Domain név álcázása
+      obfuscate_hint: Részlegesen álcázza a domain nevet a listában, ha a domain korlátozások listájának közzététele engedélyezett
       private_comment: Privát megjegyzés
       private_comment_hint: Megjegyzés domain tiltásával kapcsolatban belső használatra, a többi moderátor részére.
       public_comment: Nyilvános megjegyzés
@@ -424,19 +432,20 @@ hu:
       view: Domain tiltásának megtekintése
     email_domain_blocks:
       add_new: Új hozzáadása
-      created_msg: E-mail domain sikeresen hozzáadva a feketelistához
+      created_msg: E-mail domain sikeresen letiltva
       delete: Törlés
-      destroyed_msg: E-mail domain sikeresen eltávolítva a feketelistáról
+      destroyed_msg: E-mail domain sikeresen engedélyezve
       domain: Domain
-      empty: Nincs email domain a feketelistán.
+      empty: Nincs letiltott email domain.
       from_html: "%{domain}-ról"
       new:
         create: Domain hozzáadása
-        title: Új e-mail feketelista bejegyzés
-      title: E-mail feketelista
+        title: Új e-mail domain tiltása
+      title: Tiltott e-mail domainek
     instances:
       by_domain: Domain
       delivery_available: Kézbesítés elérhető
+      empty: Nem található domain.
       known_accounts:
         one: "%{count} ismert fiók"
         other: "%{count} ismert fiók"
@@ -514,6 +523,8 @@ hu:
       comment:
         none: Egyik sem
       created_at: Jelentve
+      forwarded: Továbbítva
+      forwarded_to: 'Továbbítva ide: %{domain}'
       mark_as_resolved: Megjelölés megoldottként
       mark_as_unresolved: Megjelölés megoldatlanként
       notes:
@@ -557,6 +568,7 @@ hu:
       domain_blocks_rationale:
         title: Mutasd meg az indokolást
       enable_bootstrap_timeline_accounts:
+        desc_html: Az új felhasználók automatikusan követik a beállított fiókokat, így a Saját idővonaluk kezdéskor nem lesz üres
         title: Alapértelmezett követés engedélyezése új felhasználóknak
       hero:
         desc_html: A kezdőoldalon látszik. Legalább 600x100px méret javasolt. Ha nincs beállítva, a szerver bélyegképet használjuk
@@ -583,6 +595,9 @@ hu:
         min_invite_role:
           disabled: Senki
           title: Meghívások engedélyezése
+        require_invite_text:
+          desc_html: Ha a regisztrációhoz kézi jóváhagyásra van szükség, akkor a „Miért akarsz csatlakozni?” válasz kitöltése legyen kötelező, és ne opcionális
+          title: Az új felhasználóktól legyen megkövetelve a meghívási kérés szövegének kitöltése
       registrations_mode:
         modes:
           approved: A regisztráció engedélyhez kötött
@@ -751,6 +766,7 @@ hu:
       functional: A fiókod teljesen működőképes.
       pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha az elbírálás megtörtént.
       redirecting_to: A fiókod inaktív, mert jelenleg ide %{acct} van átirányítva.
+    too_fast: Túl gyorsan küldted el az űrlapot, próbáld később.
     trouble_logging_in: Problémád van a bejelentkezéssel?
     use_security_key: Biztonsági kulcs használata
   authorize_follow:
@@ -885,8 +901,8 @@ hu:
     order_by: Rendezés
     save_changes: Változások mentése
     validation_errors:
-      one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant
-      other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant
+      one: Valami nincs rendjén! Tekintsd meg a hibát lent
+      other: Valami nincs rendjén! Tekintsd meg a(z) %{count} hibát lent
   html_validator:
     invalid_markup: 'hibás HTML leíró: %{error}'
   identity_proofs:
@@ -910,6 +926,8 @@ hu:
     status: Ellenőrzés állapota
     view_proof: Tanúsítás megtekintése
   imports:
+    errors:
+      over_rows_processing_limit: több mint %{count} sort tartalmaz
     modes:
       merge: Összefésülés
       merge_long: Megtartjuk a meglévő bejegyzéseket és hozzávesszük az újakat
@@ -989,7 +1007,7 @@ hu:
   moderation:
     title: Moderáció
   move_handler:
-    carry_blocks_over_text: Ez a fiók elköltözött innen %{acct}, melyet blokkoltatok.
+    carry_blocks_over_text: Ez a fiók elköltözött innen %{acct}, melyet letiltottatok.
     carry_mutes_over_text: Ez a fiók elköltözött innen %{acct}, melyet lenémítottatok.
     copy_account_note_text: 'Ez a fiók elköltözött innen %{acct}, itt vannak a bejegyzéseitek róla:'
   notification_mailer:
@@ -1172,7 +1190,7 @@ hu:
     preferences: Beállítások
     profile: Profil
     relationships: Követések és követők
-    two_factor_authentication: Kétlépcsős azonosítás
+    two_factor_authentication: Kétlépcsős hitelesítés
     webauthn_authentication: Biztonsági kulcsok
   spam_check:
     spam_detected: Ez egy automatikus jelentés. Spamet érzékeltünk.
@@ -1211,7 +1229,7 @@ hu:
         one: "%{count} szavazat"
         other: "%{count} szavazat"
       vote: Szavazás
-    show_more: Mutass többet
+    show_more: Több megjelenítése
     show_newer: Újabbak mutatása
     show_older: Régebbiek mutatása
     show_thread: Szál mutatása
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 2ea895b63..48050d6a2 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -166,10 +166,12 @@ hy:
       roles:
         admin: Ադմինիստրատոր
         moderator: Մոդերատոր
+        staff: Անձնակազմ
         user: Oգտատէր
       search: Որոնել
       search_same_email_domain: Այլ օգտատէրեր նոյն էլ․ փոստի դոմէյնով
       search_same_ip: Այլ օգտատէրեր նոյն IP֊ով
+      sensitive: Զգայուն
       show:
         created_reports: Կազմել բողոքներ
         targeted_reports: Այլոց կողմից բողոքարկուած
@@ -194,6 +196,7 @@ hy:
         confirm_user: Հաստատել օգտատիրոջը
         create_account_warning: Ստեղծել զգուշացում
         create_announcement: Ստեղծել յայտարարութիւն
+        create_custom_emoji: Ստեղծել սեփական էմոջիները
         create_email_domain_block: Ստեղծել էլ․ հասցէի դոմէյնի արգելափակում
         create_ip_block: Ստեղծել IP կանոն
         destroy_announcement: Ջնջել յայտարարութիւնը
@@ -248,6 +251,7 @@ hy:
       empty: Ոչ մի գրառում չկայ։
       filter_by_action: Զտել ըստ գործողութեան
       filter_by_user: Զտել ըստ օգտատիրոջ
+      title: Ստուգման մատեան
     announcements:
       destroyed_msg: Յայտարարութիւնը բարեյաջող ջնջուեց
       edit:
@@ -277,7 +281,11 @@ hy:
       image_hint: PNG մինչեւ 50KB
       list: Ցանկ
       listed: Ցուցակագրուած
+      new:
+        title: Աւելացնել նոր էմոջի
       overwrite: Վերագրել
+      shortcode: Հապավում
+      title: Սեփական էմօջիներ
       uncategorized: Չդասակարգուած
       unlist: Ապացուցակագրում
       unlisted: Ծածուկ
@@ -288,6 +296,7 @@ hy:
       feature_invites: Հրաւէրի յղումներ
       feature_profile_directory: Օգտատիրոջ մատեան
       feature_registrations: Գրանցումներ
+      feature_spam_check: Հակա-սպամ
       feature_timeline_preview: Հոսքի նախադիտում
       features: Յատկանիշներ
       open_reports: բաց բողոքներ
@@ -344,6 +353,7 @@ hy:
       title: էլ․ փոստի արգելափակուած տիրոյթներ
     instances:
       by_domain: Դոմեն
+      empty: Դոմեյնները չեն գտնուել
       known_accounts:
         one: "%{count} յայտնի հաշիւ"
         other: "%{count} յայտնի հաշիւներ"
@@ -385,6 +395,7 @@ hy:
     relationships:
       title: "%{acct}ի յարաբերութիւններ"
     relays:
+      add_new: Աւելացնել նոր վերահեռարձակուիչ
       delete: Ջնջել
       disable: Անջատել
       disabled: Անջատված է
@@ -392,6 +403,7 @@ hy:
       enabled: Միացված է
       save_and_enable: Պահպանել եւ միացնել
       status: Կարգավիճակ
+      title: Վերահեռարձակիչներ
     reports:
       account:
         notes:
@@ -421,6 +433,7 @@ hy:
       updated_at: Թարմացուած
     settings:
       contact_information:
+        email: Գործնական էլփոստ
         username: Կոնտակտի ծածկանուն
       custom_css:
         title: Սեփական CSS
@@ -446,6 +459,10 @@ hy:
           approved: Գրանցման համար անհրաժեշտ է հաստատում
           none: Ոչ ոք չի կարող գրանցուել
           open: Բոլորը կարող են գրանցուել
+        title: Գրանցումային ռեժիմ
+      show_staff_badge:
+        desc_html: Ցուցադրել անձնակազմի անդամի նշանը օգտատիրոջ էջում
+        title: Ցուցադրել անձնակազմի անդամի նշանը
       site_description:
         title: Կայքի նկարագրութիւն
       site_short_description:
@@ -465,10 +482,13 @@ hy:
       back_to_account: Վերադառնալ անձնական էջ
       batch:
         delete: Ջնջել
+        nsfw_on: Նշել որպէս դիւրազգաց
       deleted: Ջնջված է
+      failed_to_execute: Կատարումը ձախողուեց
       media:
         title: Մեդիա
       no_media: Մեդիա չկայ
+      title: Օգտատիրոջ գրառումները
       with_media: Մեդիայի հետ
     tags:
       context: Համատեքստ
@@ -491,6 +511,7 @@ hy:
       subject: Նոր բողոք %{instance}ի համար(#%{id})
   appearance:
     advanced_web_interface: Սյունակավոր ինտերֆեյս
+    advanced_web_interface_hint: Եթէ ցանկանում ես օգտագործել էկրանիդ ամբողջ լայնքը, ապա ընդլայնուած վեբ ինտերֆեյսով հնարաւոր է էկրանը բաժանել սիւնակների՝ զուգահեռ տեսնելու տարբեր տիպի ինֆորմացիա՝ տեղական հոսքը, ծանուցումները, ֆեդերացված հոսքը, և ցանկացած թվի ցուցակ ու հեշթեգ։
     animations_and_accessibility: Անիմացիաներ եւ հասանելիութիւն
     discovery: Բացայայտում
     localization:
@@ -505,6 +526,7 @@ hy:
     view_status: Նայել գրառումը
   applications:
     invalid_url: Տրամադրուած URL անվաւեր է
+    your_token: Քո մուտքի բանալին
   auth:
     apply_for_account: Հրաւէրի հարցում
     change_password: Գաղտնաբառ
@@ -515,6 +537,7 @@ hy:
     login: Մտնել
     logout: Դուրս գալ
     migrate_account: Տեղափոխուել այլ հաշիւ
+    or_log_in_with: Կամ մուտք գործել օգտագործելով՝
     providers:
       cas: CAS
       saml: SAML
@@ -527,6 +550,7 @@ hy:
       title: Կարգավորում
     status:
       account_status: Հաշուի կարգավիճակ
+      pending: Դիմումը պէտք է քննուի մեր անձնակազմի կողմից, ինչը կարող է մի փոքր ժամանակ խլել։ Դիմումի հաստատուելու դէպքում, կտեղեկացնենք նամակով։
   authorize_follow:
     follow: Հետևել
     following: Յաջողութի՜ւն։ Դու այժմ հետեւում ես․
@@ -574,7 +598,7 @@ hy:
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
-    '404': The page you are looking for isn't here.
+    '404': Էջը, որը փնտրում ես գոյութիւն չունի։
     '406': This page is not available in the requested format.
     '410': The page you were looking for doesn't exist here anymore.
     '422': 
@@ -629,6 +653,7 @@ hy:
   identity_proofs:
     active: Ակտիվ
     authorize: Այո, նոյնականացնել
+    authorize_connection_prompt: Հաւաստագրէ՞լ այս ծածկագրման կապակցումը
     i_am_html: Ես %{username}ն եմ %{service}ում։
     identity: Ինքնութիւն
     inactive: Ոչ ակտիւ
@@ -646,6 +671,7 @@ hy:
       blocking: Արգելափակումների ցուցակ
       bookmarks: Էջանիշեր
       domain_blocking: Տիրոյթի արգելափակումների ցուցակ
+      following: Հետեւումների ցանկ
     upload: Վերբեռնել
   invites:
     delete: Ապաակտիւացնել
@@ -676,11 +702,14 @@ hy:
       not_found: չգտնուեց
     past_migrations: Նախոդ միգրացիաները
     proceed_with_move: Տեղափոխել հետեւորդներին
+    redirecting_to: Քո հաշիւը վերահասցեաորում է %{acct}-ին
     warning:
       followers: Այս քայլով քո բոլոր հետեւորդներին այս հաշուից կը տեղափոխես դէպի նորը
   moderation:
     title: Մոդերացիա
   notification_mailer:
+    digest:
+      title: Երբ բացակայ էիր...
     favourite:
       title: Նոր հաւանում
     follow:
@@ -691,6 +720,8 @@ hy:
       title: Նոր հետեւելու հայցեր
     mention:
       action: Պատասխանել
+  notifications:
+    other_settings: Ծանուցումների այլ կարգաւորումներ
   number:
     human:
       decimal_units:
@@ -710,11 +741,16 @@ hy:
     older: Ավելի հին
     prev: Նախորդ
     truncate: "&hellip;"
+  polls:
+    errors:
+      duration_too_short: շատ կարճ է
   preferences:
     other: Այլ
+    posting_defaults: Կանխադիր կարգաւորումներ
     public_timelines: Հանրային հոսք
   relationships:
     activity: Հաշուի ակտիւութիւնը
+    dormant: Չգօրծող
     followers: Հետեւորդներ
     following: Հետեւում ես
     invited: Հրաւիրուած է
@@ -727,6 +763,8 @@ hy:
     remove_selected_domains: Հեռացնել բոլոր հետեւորդներին նշուած դոմեյններից
     remove_selected_followers: Հեռացնել նշուած հետեւորդներին
     status: Հաշուի կարգավիճակ
+  scheduled_statuses:
+    too_soon: Նախադրուած ամսաթիւը պէտք է լինի ապագայում
   sessions:
     activity: Վերջին թութը
     browser: Դիտարկիչ
@@ -763,13 +801,18 @@ hy:
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
     revoke: Չեղարկել
+    title: Սեսսիա
   settings:
     account: Հաշիվ
+    account_settings: Հաշուի կարգաւորումներ
     appearance: Տեսք
+    back: Ետ գնալ մաստադոն
     delete: Հաշուի ջնջում
     development: Ծրագրավորում
     edit_profile: Խմբագրել պրոֆիլը
     export: Տվյալների արտահանում
+    featured_tags: Ընտրուած հէշթեգեր
+    identity_proofs: Անձի նոյնացումներ
     import: Ներմուծել
     import_and_export: Ներմուծել և արտահանել
     migrate: Հաշուի տեղափոխում
@@ -919,12 +962,21 @@ hy:
     otp: Նոյնականացման հավելված
     recovery_codes: Վերականգնման կոդեր
     recovery_codes_regenerated: Վերականգման կոդերը հաջողութեամբ ստեղծուել են
+    webauthn: Անվտանգութեան բանալիներ
   user_mailer:
+    sign_in_token:
+      title: Մուտքի փորձ
     warning:
+      get_in_touch: Կարող էք կապուել %{instance} հանգոյցի անձնակազմի հետ պատասխանելով այս նամակին։
+      statuses: Մասնաւորապէս, միայն՝
       title:
         none: Զգուշացում
+        sensitive: Մեդիաֆայլը պիտակուել է որպէս զգայուն։
+        suspend: Հաշիւը արգելափակուած է
     welcome:
+      edit_profile_action: Կարգաւորել հաշիւը
       final_action: Սկսել թթել
+      review_preferences_action: Փոփոխել կարգաւորումները
       subject: Բարի գալուստ Մաստոդոն
       tip_federated_timeline: Դաշնային հոսքում երևում է ամբողջ Մաստոդոնի ցանցը։ Բայց այն ներառում է միայն այն օգտատերերին որոնց բաժանորդագրուած են ձեր հարևաններ, այդ պատճառով այն կարող է լինել ոչ ամբողջական։
       tip_following: Դու հետեւում էս քո հանգոյցի ադմին(ներ)ին լռելայն։ Այլ հետաքրքիր անձանց գտնելու համար՝ թերթիր տեղական և դաշնային հոսքերը։
@@ -942,3 +994,4 @@ hy:
     verification: Ստուգում
   webauthn_credentials:
     delete: Ջնջել
+    registered_on: Գրանցուել է %{date}
diff --git a/config/locales/id.yml b/config/locales/id.yml
index cb9dcb149..bf63f62a4 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -57,6 +57,7 @@ id:
     followers:
       other: Pengikut
     following: Mengikuti
+    instance_actor_flash: Akun ini adalah aktor virtual yang merepresentasikan server itu sendiri dan bukan pengguna individu. Ini dipakai untuk tujuan gabungan dan seharusnya tidak ditangguhkan.
     joined: Bergabung pada %{date}
     last_active: terakhir aktif
     link_verified_on: Kepemilikan tautan ini telah dicek pada %{date}
@@ -127,6 +128,7 @@ id:
       follows: Mengikut
       header: Tajuk
       inbox_url: URL Kotak masuk
+      invite_request_text: Alasan bergabung
       invited_by: Diundang oleh
       ip: IP
       joined: Bergabung
@@ -251,6 +253,7 @@ id:
         unsuspend_account: Lepas Status Tangguh Akun
         update_announcement: Perbarui Pengumuman
         update_custom_emoji: Perbarui Emoji Khusus
+        update_domain_block: Perbarui Blokir Domain
         update_status: Perbarui Status
       actions:
         assigned_to_self_report: "%{name} menugaskan laporan %{target} kpd dirinya sendiri"
@@ -291,6 +294,7 @@ id:
         unsuspend_account: "%{name} menghapus penangguhan akun %{target}"
         update_announcement: "%{name} memperbarui pengumuman %{target}"
         update_custom_emoji: "%{name} memperbarui emoji %{target}"
+        update_domain_block: "%{name} memperbarui blokir domain untuk %{target}"
         update_status: "%{name} memperbarui status %{target}"
       deleted_status: "(status dihapus)"
       empty: Log tidak ditemukan.
@@ -432,6 +436,7 @@ id:
     instances:
       by_domain: Domain
       delivery_available: Pengiriman tersedia
+      empty: Domain tidak ditemukan.
       known_accounts:
         other: "%{count} akun yang dikenal"
       moderation:
@@ -506,6 +511,8 @@ id:
       comment:
         none: Tidak ada
       created_at: Dilaporkan
+      forwarded: Diteruskan
+      forwarded_to: Diteruskan ke %{domain}
       mark_as_resolved: Tandai telah diseleseikan
       mark_as_unresolved: Tandai belum terselesaikan
       notes:
@@ -549,6 +556,7 @@ id:
       domain_blocks_rationale:
         title: Tampilkan alasan
       enable_bootstrap_timeline_accounts:
+        desc_html: Buat pengguna baru mengikuti akun yang sudah dipilih agar beranda mereka tidak kosong
         title: Aktifkan opsi ikuti otomatis untuk pengguna baru
       hero:
         desc_html: Ditampilkan di halaman depan. Direkomendasikan minimal 600x100px. Jika tidak diatur, kembali ke server gambar kecil
@@ -575,6 +583,9 @@ id:
         min_invite_role:
           disabled: Tidak ada satu pun
           title: Izinkan undangan oleh
+        require_invite_text:
+          desc_html: Saat pendaftaran harus disetujui manual, buat input teks "Mengapa Anda ingin bergabung?" sebagai hal wajib bukan opsional
+          title: Pengguna baru harus memasukkan alasan bergabung
       registrations_mode:
         modes:
           approved: Persetujuan diperlukan untuk mendaftar
@@ -743,6 +754,7 @@ id:
       functional: Akun Anda kini beroperasi penuh.
       pending: Permintaan Anda sedang ditinjau oleh staf kami. Ini mungkin butuh beberapa waktu. Anda akan menerima email jika permintaan Anda diterima.
       redirecting_to: Akun Anda tidak aktif karena sekarang dialihkan ke %{acct}.
+    too_fast: Formulir dikirim terlalu cepat, coba lagi.
     trouble_logging_in: Kesulitan masuk?
     use_security_key: Gunakan kunci keamanan
   authorize_follow:
@@ -901,6 +913,8 @@ id:
     status: Status verifikasi
     view_proof: Lihat bukti
   imports:
+    errors:
+      over_rows_processing_limit: berisi lebih dari %{count} baris
     modes:
       merge: Gabung
       merge_long: Pertahankan rekaman yang sudah ada dan buat baru
diff --git a/config/locales/is.yml b/config/locales/is.yml
index a011322e4..2d6102d98 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -60,6 +60,7 @@ is:
       one: fylgjandi
       other: fylgjendur
     following: Fylgist með
+    instance_actor_flash: Þessi notandaaðgangur er sýndarnotandi sem stendur fyrir sjálfan netþjóninn en ekki neinn einstakling. Hann er notaður við skýjasambandsmiðlun og ætti ekki að setja hann í bið eða banna.
     joined: Gerðist þátttakandi %{date}
     last_active: síðasta virkni
     link_verified_on: Eignarhald á þessum tengli var athugað þann %{date}
@@ -131,6 +132,7 @@ is:
       follows: Fylgist með
       header: Haus
       inbox_url: Slóð á innhólf
+      invite_request_text: Ástæður fyrir þátttöku
       invited_by: Boðið af
       ip: IP-vistfang
       joined: Gerðist þátttakandi
@@ -255,6 +257,7 @@ is:
         unsuspend_account: Taka notandaaðgang úr bið
         update_announcement: Uppfæra tilkynningu
         update_custom_emoji: Uppfæra sérsniðið tjáningartákn
+        update_domain_block: Uppfæra útilokun léns
         update_status: Uppfæra stöðufærslu
       actions:
         assigned_to_self_report: "%{name} úthlutaði skýrslu %{target} til sín"
@@ -295,6 +298,7 @@ is:
         unsuspend_account: "%{name} tók notandaaðganginn %{target} úr bið"
         update_announcement: "%{name} uppfærði auglýsingu %{target}"
         update_custom_emoji: "%{name} uppfærði tjáningartákn %{target}"
+        update_domain_block: "%{name} uppfærði útilokun lénsins %{target}"
         update_status: "%{name} uppfærði stöðufærslu frá %{target}"
       deleted_status: "(eydd stöðufærsla)"
       empty: Engar atvikaskrár fundust.
@@ -398,6 +402,8 @@ is:
           silence: Hylja
           suspend: Setja í bið
         title: Ný útilokun á léni
+      obfuscate: Gera heiti léns ólæsilegt
+      obfuscate_hint: Gera heiti léns ólæsilegt að hluta í listanum ef auglýsing er virk fyrir lista yfir takmarkanir léna
       private_comment: Einkaathugasemd
       private_comment_hint: Athugasemd um þessa útilokun á léni til innanhússnotkunar fyrir umsjónarmenn.
       public_comment: Opinber athugasemd
@@ -437,6 +443,7 @@ is:
     instances:
       by_domain: Lén
       delivery_available: Afhending er til taks
+      empty: Engin lén fundust.
       known_accounts:
         one: "%{count} þekktur notandaaðgangur"
         other: "%{count} þekktir notendaaðgangar"
@@ -514,6 +521,8 @@ is:
       comment:
         none: Ekkert
       created_at: Tilkynnt
+      forwarded: Áframsent
+      forwarded_to: Áframsent á %{domain}
       mark_as_resolved: Merkja sem leyst
       mark_as_unresolved: Merkja sem óleyst
       notes:
@@ -557,6 +566,7 @@ is:
       domain_blocks_rationale:
         title: Birta röksemdafærslu
       enable_bootstrap_timeline_accounts:
+        desc_html: Láta nýja notendur sjálfkrafa fylgjast með uppsettum aðgöngum svo að heimastreymi þeirra byrji ekki autt
         title: Virkja sjálfgefnar fylgnistillingar fyrir nýja notendur
       hero:
         desc_html: Birt á forsíðunni. Mælt með að hún sé a.m.k. 600×100 mynddílar. Þegar þetta er ekki stillt, er notuð smámynd netþjónsins
@@ -583,6 +593,9 @@ is:
         min_invite_role:
           disabled: Enginn
           title: Leyfa boð frá
+        require_invite_text:
+          desc_html: Þegar nýskráningar krefjast handvirks samþykkis, skal gera "Hvers vegna viltu taka þátt?" boðstexta að skyldu fremur en valkvæðan
+          title: Krefja nýja notendur um að fylla út boðstexta
       registrations_mode:
         modes:
           approved: Krafist er samþykkt nýskráningar
@@ -751,6 +764,7 @@ is:
       functional: Notandaaðgangurinn þinn er með fulla virkni.
       pending: Umsóknin þín bíður eftir að starfsfólkið okkar fari yfir hana. Það gæti tekið nokkurn tíma. Þú munt fá tölvupóst ef umsóknin er samþykkt.
       redirecting_to: Notandaaðgangurinn þinn er óvirkur vegna þess að hann endurbeinist á %{acct}.
+    too_fast: Innfyllingarform sent inn of hratt, prófaðu aftur.
     trouble_logging_in: Vandræði við að skrá inn?
     use_security_key: Nota öryggislykil
   authorize_follow:
@@ -842,6 +856,7 @@ is:
       request: Biddu um safnskrána þína
       size: Stærð
     blocks: Þú útilokar
+    bookmarks: Bókamerki
     csv: CSV
     domain_blocks: Útilokanir á lénum
     lists: Listar
@@ -909,6 +924,8 @@ is:
     status: Staða sannvottunar
     view_proof: Skoða sönnun
   imports:
+    errors:
+      over_rows_processing_limit: inniheldur meira en %{count} raðir
     modes:
       merge: Sameina
       merge_long: Halda fyrirliggjandi færslum og bæta við nýjum
@@ -918,6 +935,7 @@ is:
     success: Það tókst að senda inn gögnin þín og verður unnið með þau þegar færi gefst
     types:
       blocking: Listi yfir útilokanir
+      bookmarks: Bókamerki
       domain_blocking: Listi yfir útilokanir léna
       following: Listi yfir þá sem fylgst er með
       muting: Listi yfir þagganir
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 24ccc7d76..1e0ab42f0 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -60,6 +60,7 @@ it:
       one: Seguace
       other: Seguaci
     following: Segui
+    instance_actor_flash: Questo account è un attore virtuale usato per rappresentare il server stesso e non un singolo utente. Viene utilizzato per scopi federativi e non dovrebbe essere sospeso.
     joined: Dal %{date}
     last_active: ultima attività
     link_verified_on: La proprietà di questo link è stata controllata il %{date}
@@ -131,6 +132,7 @@ it:
       follows: Segue
       header: Intestazione
       inbox_url: URL inbox
+      invite_request_text: Motivi per l'iscrizione
       invited_by: Invitato da
       ip: IP
       joined: Iscritto da
@@ -255,6 +257,7 @@ it:
         unsuspend_account: Annulla la sospensione dell'account
         update_announcement: Aggiorna annuncio
         update_custom_emoji: Aggiorna emoji personalizzata
+        update_domain_block: Aggiorna blocco di dominio
         update_status: Aggiorna stato
       actions:
         assigned_to_self_report: "%{name} ha assegnato il rapporto %{target} a se stesso"
@@ -295,6 +298,7 @@ it:
         unsuspend_account: "%{name} ha annullato la sospensione dell'account di %{target}"
         update_announcement: "%{name} ha aggiornato l'annuncio %{target}"
         update_custom_emoji: "%{name} ha aggiornato l'emoji %{target}"
+        update_domain_block: "%{name} ha aggiornato il blocco di dominio per %{target}"
         update_status: "%{name} stato aggiornato da %{target}"
       deleted_status: "(stato cancellato)"
       empty: Nessun log trovato.
@@ -398,6 +402,8 @@ it:
           silence: Silenzia
           suspend: Sospendi
         title: Nuovo blocco dominio
+      obfuscate: Nascondi nome di dominio
+      obfuscate_hint: Nascondere parzialmente il nome di dominio, se è abilitata la visualizzazione pubblica dell'elenco delle limitazioni di dominio
       private_comment: Commento privato
       private_comment_hint: Commento su questa limitazione di dominio per uso interno da parte dei moderatori.
       public_comment: Commento pubblico
@@ -437,6 +443,7 @@ it:
     instances:
       by_domain: Dominio
       delivery_available: Distribuzione disponibile
+      empty: Nessun dominio trovato.
       known_accounts:
         one: "%{count} account noto"
         other: "%{count} account noti"
@@ -514,6 +521,8 @@ it:
       comment:
         none: Nessuno
       created_at: Segnalato
+      forwarded: Inoltrato
+      forwarded_to: Inoltrato a %{domain}
       mark_as_resolved: Segna come risolto
       mark_as_unresolved: Segna come non risolto
       notes:
@@ -557,6 +566,7 @@ it:
       domain_blocks_rationale:
         title: Mostra motivazione
       enable_bootstrap_timeline_accounts:
+        desc_html: I nuovi utenti seguiranno automaticamente gli account configurati, in modo che il loro home feed all'inizio non sia vuoto
         title: Abilita seguiti predefiniti per i nuovi utenti
       hero:
         desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail del server
@@ -583,6 +593,9 @@ it:
         min_invite_role:
           disabled: Nessuno
           title: Permetti inviti da
+        require_invite_text:
+          desc_html: Quando le iscrizioni richiedono l'approvazione manuale, rendere la richiesta “Perché si desidera iscriversi?” obbligatoria invece che opzionale
+          title: Richiedi ai nuovi utenti di rispondere alla richiesta di motivazione per l'iscrizione
       registrations_mode:
         modes:
           approved: Approvazione richiesta per le iscrizioni
@@ -753,6 +766,7 @@ it:
       functional: Il tuo account è pienamente 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}.
+    too_fast: Modulo inviato troppo velocemente, riprova.
     trouble_logging_in: Problemi di accesso?
     use_security_key: Usa la chiave di sicurezza
   authorize_follow:
@@ -912,6 +926,8 @@ it:
     status: Stato della verifica
     view_proof: Vedi prova
   imports:
+    errors:
+      over_rows_processing_limit: contiene più di %{count} righe
     modes:
       merge: Fondi
       merge_long: Mantieni record esistenti e aggiungine di nuovi
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 4d195c448..db9e41f74 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -57,6 +57,7 @@ ja:
     followers:
       other: フォロワー
     following: フォロー中
+    instance_actor_flash: このアカウントは、個々のユーザーではなく、サーバー自体を表すために使用される仮想のユーザーです。 連合のために使用されるため、停止しないで下さい。
     joined: "%{date} に登録"
     last_active: 最後の活動
     link_verified_on: このリンクの所有権は %{date} に確認されました
@@ -127,6 +128,7 @@ ja:
       follows: フォロー数
       header: ヘッダー
       inbox_url: Inbox URL
+      invite_request_text: 登録理由
       invited_by: 招待した人
       ip: IP
       joined: 登録日
@@ -138,6 +140,7 @@ ja:
       login_status: ログイン
       media_attachments: 添付されたメディア
       memorialize: 追悼アカウント化
+      memorialized: 追悼化済み
       memorialized_msg: "%{username} を追悼アカウント化しました"
       moderation:
         active: アクティブ
@@ -159,6 +162,7 @@ ja:
       public: パブリック
       push_subscription_expires: PuSH購読期限
       redownload: プロフィールを更新
+      redownloaded_msg: "%{username} のプロフィールを正常に更新しました"
       reject: 却下
       reject_all: すべて却下
       rejected_msg: "%{username} の登録申請を却下しました"
@@ -201,7 +205,9 @@ ja:
       undo_sensitized: 閲覧注意から戻す
       undo_silenced: サイレンスから戻す
       undo_suspension: 停止から戻す
+      unsilenced_msg: "%{username} のサイレンス解除に成功しました"
       unsubscribe: 購読の解除
+      unsuspended_msg: "%{username} の無効化を解除しました"
       username: ユーザー名
       view_domain: ドメインの概要を表示
       warn: 警告
@@ -247,6 +253,7 @@ ja:
         unsuspend_account: アカウントの停止を解除
         update_announcement: お知らせを更新
         update_custom_emoji: カスタム絵文字を更新
+        update_domain_block: ドメインブロックを更新
         update_status: トゥートを更新
       actions:
         assigned_to_self_report: "%{name} さんが通報 %{target} を自身の担当に割り当てました"
@@ -287,6 +294,7 @@ ja:
         unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました"
         update_announcement: "%{name} さんがお知らせ %{target} を更新しました"
         update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました"
+        update_domain_block: "%{name} が %{target} のドメインブロックを更新しました"
         update_status: "%{name} さんが %{target} さんのトゥートを更新しました"
       deleted_status: "(削除済)"
       empty: ログが見つかりませんでした
@@ -428,6 +436,7 @@ ja:
     instances:
       by_domain: ドメイン
       delivery_available: 配送可能
+      empty: ドメインが見つかりませんでした。
       known_accounts:
         other: 既知のアカウント数 %{count}
       moderation:
@@ -502,6 +511,8 @@ ja:
       comment:
         none: なし
       created_at: 通報日時
+      forwarded: 転送済み
+      forwarded_to: "%{domain} に転送されました"
       mark_as_resolved: 解決済みとしてマーク
       mark_as_unresolved: 未解決として再び開く
       notes:
@@ -739,6 +750,7 @@ ja:
       functional: アカウントは完全に機能しています。
       pending: あなたの申請は現在サーバー管理者による審査待ちです。これにはしばらくかかります。申請が承認されるとメールが届きます。
       redirecting_to: アカウントは %{acct} に引っ越し設定されているため非アクティブになっています。
+    too_fast: フォームの送信が速すぎます。もう一度やり直してください。
     trouble_logging_in: ログインできませんか?
     use_security_key: セキュリティキーを使用
   authorize_follow:
@@ -765,6 +777,7 @@ ja:
   date:
     formats:
       default: "%Y年%m月%d日"
+      with_month_name: "%Y年%m月%d日"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}時間"
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index fe042301d..af83d5fc6 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -72,6 +72,8 @@ kab:
     unavailable: Ur nufi ara amaɣnu-a
     unfollow: Ur ṭṭafaṛ ara
   admin:
+    account_actions:
+      action: Eg tigawt
     account_moderation_notes:
       create: Eǧǧ tazmilt
       delete: Kkes
@@ -108,6 +110,7 @@ kab:
       follows: Yeṭafaṛ
       header: Ixef
       inbox_url: URL n yinekcam
+      invite_request_text: Timental n tmerna
       invited_by: Inced-it-id
       ip: Tansa IP
       joined: Ikcemed deg
@@ -183,6 +186,7 @@ kab:
         remove_avatar_user: Kkes avaṭar
         reset_password_user: Ales awennez n wawal n uffir
         silence_account: Sgugem amiḍan
+        update_domain_block: Leqqem iḥder n taɣult
       actions:
         assigned_to_self_report: "%{name} imudd aneqqis %{target} i yiman-nsen"
         change_email_user: "%{name} ibeddel imayl n umseqdac %{target}"
@@ -215,6 +219,7 @@ kab:
         unsilence_account: "%{name} yekkes asgugem n umiḍan n %{target}"
         update_announcement: "%{name} ileqqem taselɣut %{target}"
         update_custom_emoji: "%{name} yelqem imuji %{target}"
+        update_domain_block: "%{name} ileqqem iḥder n taɣult i %{target}"
         update_status: "%{name} yelqem tasuffeɣt n %{target}"
       deleted_status: "(tasuffeɣt tettwakkes)"
       empty: Ulac iɣmisen i yellan.
@@ -304,6 +309,7 @@ kab:
     instances:
       by_domain: Taγult
       delivery_available: Yella usiweḍ
+      empty: Ulac taɣultin yettwafen.
       known_accounts:
         one: "%{count} n umiḍan i yettwasnen"
         other: "%{count} n yimiḍanen i yettwassnen"
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index f8043534a..cc4ec52cd 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -57,6 +57,7 @@ ko:
     followers:
       other: 팔로워
     following: 팔로잉
+    instance_actor_flash: 이 계정은 서버 자신을 나타내기 위한 가상의 계정이며 개인 사용자가 아닙니다. 이 계정은 연합을 위해 사용되며 정지되지 않아야 합니다.
     joined: "%{date}에 가입함"
     last_active: 최근 활동
     link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다"
@@ -108,7 +109,7 @@ ko:
       confirm: 확인
       confirmed: 확인됨
       confirming: 확인 중
-      delete: 데이터 식제
+      delete: 데이터 삭제
       deleted: 삭제됨
       demote: 강등
       destroyed_msg: "%{username}의 데이터는 곧 삭제되도록 큐에 들어갔습니다"
@@ -127,6 +128,7 @@ ko:
       follows: 팔로잉 수
       header: 헤더
       inbox_url: 수신함 URL
+      invite_request_text: 가입 하려는 이유
       invited_by: 초대자
       ip: IP
       joined: 가입
@@ -251,6 +253,7 @@ ko:
         unsuspend_account: 계정 정지 취소
         update_announcement: 공지사항 업데이트
         update_custom_emoji: 커스텀 에모지 업데이트
+        update_domain_block: 도메인 차단 갱신
         update_status: 게시물 게시
       actions:
         assigned_to_self_report: "%{name}이 리포트 %{target}을 자신에게 할당했습니다"
@@ -291,6 +294,7 @@ ko:
         unsuspend_account: "%{name}이 %{target}에 대한 정지를 해제했습니다"
         update_announcement: "%{name} 님이 공지 %{target}을 갱신했습니다"
         update_custom_emoji: "%{name}이 에모지 %{target}를 업데이트 했습니다"
+        update_domain_block: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다"
         update_status: "%{name}이 %{target}의 상태를 업데이트 했습니다"
       deleted_status: "(삭제됨)"
       empty: 로그를 찾을 수 없습니다
@@ -396,6 +400,8 @@ ko:
           silence: 침묵
           suspend: 정지
         title: 새로운 도메인 차단
+      obfuscate: 도메인 이름 난독화
+      obfuscate_hint: 도메인 제한 목록을 공개하는 경우 도메인 이름의 일부를 난독화 합니다
       private_comment: 비공개 주석
       private_comment_hint: 이 도메인 제한에 대한 주석은 중재자를 위해 내부적으로 사용 됩니다.
       public_comment: 공개 주석
@@ -434,6 +440,7 @@ ko:
     instances:
       by_domain: 도메인
       delivery_available: 전송 가능
+      empty: 도메인이 하나도 없습니다.
       known_accounts:
         other: 알려진 계정 %{count}개
       moderation:
@@ -508,6 +515,8 @@ ko:
       comment:
         none: 없음
       created_at: 리포트 시각
+      forwarded: 전달됨
+      forwarded_to: "%{domain}에게 전달됨"
       mark_as_resolved: 해결 완료 처리
       mark_as_unresolved: 미해결로 표시
       notes:
@@ -551,6 +560,7 @@ ko:
       domain_blocks_rationale:
         title: 사유 보여주기
       enable_bootstrap_timeline_accounts:
+        desc_html: 새 사용자들이 자동으로 설정 된 계정들을 팔로우 하도록 해서 그들의 홈 피드가 빈 상태로 시작하지 않도록 합니다
         title: 새 유저가 팔로우할 계정을 보여주기
       hero:
         desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 서버의 썸네일이 사용 됩니다
@@ -577,6 +587,9 @@ ko:
         min_invite_role:
           disabled: 아무도 못 하게
           title: 초대링크를 만들 수 있는 권한
+        require_invite_text:
+          desc_html: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다
+          title: 새 사용자가 초대 요청 글을 작성해야 하도록
       registrations_mode:
         modes:
           approved: 가입하려면 승인이 필요함
@@ -745,6 +758,7 @@ ko:
       functional: 계정이 완벽히 작동합니다.
       pending: 당신의 가입 신청은 스태프의 검사를 위해 대기중입니다. 이것은 시간이 다소 소요됩니다. 가입 신청이 승인 될 경우 이메일을 받게 됩니다.
       redirecting_to: 계정이 %{acct}로 리다이렉트 중이기 때문에 비활성 상태입니다.
+    too_fast: 너무 빠르게 양식이 제출되었습니다, 다시 시도하세요.
     trouble_logging_in: 로그인 하는데 문제가 있나요?
     use_security_key: 보안 키 사용
   authorize_follow:
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index d7232b6ff..0d76e1b97 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -188,6 +188,8 @@ ku:
       search: گەڕان
       search_same_email_domain: بەکارهێنەرانی دیکە بە ئیمەیلی یەکسان
       search_same_ip: بەکارهێنەرانی تر بەهەمان ئای پی
+      sensitive: هەستیار
+      sensitized: وەک هەستیار نیشان کراوە
       shared_inbox_url: بەستەری سندوقی هاوبەشکراو
       show:
         created_reports: گوزارشتی تۆمارکراوە
@@ -202,6 +204,7 @@ ku:
       time_in_queue: چاوەڕوانی لە ڕیزدا %{time}
       title: هەژمارەکان
       unconfirmed_email: ئیمەیڵی پشتڕاستنەکراو
+      undo_sensitized: " هەستیار نەکردن"
       undo_silenced: بێدەنگ ببە
       undo_suspension: دووبارە ڕاگرتن
       unsilenced_msg: هەژماری %{username} بە سەرکەوتوویی بێسنوور کرا
@@ -243,9 +246,11 @@ ku:
         reopen_report: دووبارە کردنەوەی گوزارشت
         reset_password_user: گەڕانەوەی تێپەڕوشە
         resolve_report: گوزارشت چارەسەربکە
+        sensitive_account: میدیاکە لە هەژمارەکەت وەک هەستیار نیشانە بکە
         silence_account: هەژماری بێدەنگی
         suspend_account: ڕاگرتنی هەژمارە
         unassigned_report: گوزارشتی دیارینەکراو
+        unsensitive_account: میدیاکە لە هەژمارەکەت وەک هەستیار نیشانە مەکە
         unsilence_account: هەژماری بێ دەنگ
         unsuspend_account: هەژماری هەڵنەوەستێنراو
         update_announcement: بەڕۆژکردنەوەی راگەیەندراو
@@ -281,9 +286,11 @@ ku:
         reopen_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە"
         reset_password_user: "%{name} تێپەروشەی بەکارهێنەری %{target} گەڕانەوە"
         resolve_report: "%{name} گوزارشتی %{target} دووبارە وەگڕخستەوە"
+        sensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری کراوە"
         silence_account: "%{name} هەژماری %{target}'s بێدەنگ کرا"
         suspend_account: "%{name} هەژماری %{target}'ی ڕاگیرا"
         unassigned_report: "%{name} ڕاپۆرتی دیاری نەکراوی %{target}"
+        unsensitive_account: "%{name} بە %{target}'s میدیا وەک هەستیار دیاری نەکراوە"
         unsilence_account: "%{name} هەژماری %{target}'s بێ دەنگ"
         unsuspend_account: "%{name} هەژماری %{target}'s هەڵنەپەسێردراو"
         update_announcement: "%{name} بەڕۆژکراوەی راگەیاندنی %{target}"
@@ -835,6 +842,7 @@ ku:
       request: داوای ئەرشیفەکەت بکە
       size: قەبارە
     blocks: تۆ بلۆک دەکەیت
+    bookmarks: نیشانکراوەکان
     csv: CSV
     domain_blocks: دۆمەین قەپاتکرا
     lists: لیستەکان
@@ -911,6 +919,7 @@ ku:
     success: داتاکەت بە سەرکەوتوویی بارکرا و ئێستا لە کاتی خۆیدا پرۆسێس دەکرێت
     types:
       blocking: لیستی بلۆککردن
+      bookmarks: نیشانەکان
       domain_blocking: لیستی بلۆککردنی دۆمەین
       following: لیستی خوارەوە
       muting: لیستی کپکردنەوە
@@ -961,6 +970,7 @@ ku:
     incoming_migrations: گواستنەوە لە هەژمارەی جیاواز
     incoming_migrations_html: بۆ گواستنەوە لە هەژمارەیەکی ترەوە بۆ ئەم هەژمارە، سەرەتا پێویستە <href="%{path}"> ئەژمێرێک دروست </a> بکەی.
     moved_msg: هەژمارەکەت ئێستا دووبارە ئاڕاستە دەکرێتەوە بۆ %{acct} و شوێنکەوتوانی تۆ گواستراوەتەوە بۆ ئەوێ.
+    not_redirecting: هەژمارەکەت لە ئێستادا دووبارە ئاڕاستە ناکرێتەوە بۆ هیچ هەژمارەیەکی دیکە.
     on_cooldown: تۆ بەم دواییە هەژمارەکەت کۆچ کردووە. ئەم کارە لە رۆژەکانی %{count} دا جارێکی تر بەردەست دەبێت.
     past_migrations: گەواستنەوەکانی ڕابردوو
     proceed_with_move: شوێنکەوتوان بگوازەوە
@@ -1066,6 +1076,7 @@ ku:
   relationships:
     activity: چالاکی هەژمارە
     dormant: ناچالاک
+    follow_selected_followers: شوێنکەوتوان دیاریکراو بکە
     followers: شوێنکەوتوان
     following: شوێن‌کەوتووی
     invited: بانگهێشتەکان
@@ -1201,6 +1212,8 @@ ku:
         other: "%{count} دەنگەکان"
       vote: دەنگ
     show_more: زیاتر پیشان بدە
+    show_newer: نوێتر پیشان بدە
+    show_older: پیشاندانی کۆنتر
     show_thread: نیشاندانی ڕشتە
     sign_in_to_participate: بچۆ ژوورەوە بۆ بەشداریکردن لە گفتوگۆکەدا
     title: '%{name}: "%{quote}"'
@@ -1333,6 +1346,7 @@ ku:
     warning:
       explanation:
         disable: تا کاتێک هەژمارەی ئێوە نەوێستاوە، دراوەکانی ئێوە دەستکاری ناکرێت.بەڵام تا کاتێک کە هەژمارەکەتان ناکرێتەوە. ناتوانن هیچ ئیشێکی لەسەر بکەن.
+        sensitive: پەڕگە میدیایە بارکراوەکانت و میدیا لینککراوەکانت وەک هەستیار مامەڵەیان لەگەڵ دەکرێت.
         silence: تا کاتیک هەژمارەکەتان سنووردار بێت، تەنها ئەو کەسانە کە پێشتر شوێنکەوتووی ئێوە بوون نووسراوەکانی ئێوە لەم ڕاژە دەبینن. شایەد ئێوە لە زۆر پێرستی گشتی دیار نەکەون؛ بەڵام خەڵکانی دیکە دەتوانن بە دڵی خۆیان پەیگیری ئێوە بن.
         suspend: هەژمارەکەتان هەڵواسراوە، وە تەواو توت و میدیاکان کە لەسەر ئەم ڕاژە بارتان کردووە یان ئەو ڕاژانە کە شوێنکەوتووتان لە سەری بووە ئیتر ناگەڕێنەوە.
       get_in_touch: بە وڵام دانەوەی ئەم ئیمەیلە دەتوانن لە گەڵ لیژنەی %{instance} لە پەیوەندی بن.
@@ -1341,11 +1355,13 @@ ku:
       subject:
         disable: هەژمارەکەت %{acct} بەستراوە
         none: ئاگاداری بۆ %{acct}
+        sensitive: هەژمارەکەت %{acct} میدیایەکی پۆست کردن بە هەستیار نیشان کراوە
         silence: هەژمارەکەی %{acct} سنووردار کراوە
         suspend: هەژمارەکەی %{acct} ڕاگیرا
       title:
         disable: هەژمارە بەستراوە
         none: ئاگاداری
+        sensitive: میدیاکەت بە هەستیار نیشان کراوە
         silence: هەژماری سنووردار
         suspend: هەژمار ڕاگیرا
     welcome:
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 603bf157a..2f24ee3ec 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -1,32 +1,52 @@
 ---
 ml:
   about:
+    about_this: കുറിച്ച്
+    api: API
+    apps: മൊബൈൽ ആപ്പുകൾ
+    contact: ബന്ധപ്പെടുക
     contact_missing: സജ്ജമാക്കിയിട്ടില്ല
     contact_unavailable: ലഭ്യമല്ല
     discover_users: ഉപയോഗ്‌താക്കളെ കണ്ടെത്തുക
+    get_apps: മൊബൈൽ ആപ്പ് പരീക്ഷിക്കുക
     learn_more: കൂടുതൽ പഠിക്കുക
     privacy_policy: സ്വകാര്യതാ നയം
     see_whats_happening: എന്തൊക്കെ സംഭവിക്കുന്നു എന്ന് കാണുക
+    source_code: സോഴ്സ് കോഡ്
     status_count_before: ആരാൽ എഴുതപ്പെട്ടു
     tagline: സുഹൃത്തുക്കളെ പിന്തുടരുകയും പുതിയവരെ കണ്ടെത്തുകയും ചെയ്യുക
     terms: സേവന വ്യവസ്ഥകൾ
     unavailable_content: ലഭ്യമല്ലാത്ത ഉള്ളടക്കം
     unavailable_content_description:
+      domain: സെർവർ
       reason: കാരണം
     what_is_mastodon: എന്താണ് മാസ്റ്റഡോൺ?
   accounts:
     follow: പിന്തുടരുക
-    following: നിങ്ങൾ പിന്തുടരുന്നവർ
+    following: പിന്തുടരുന്നു
     joined: "%{date} ൽ ചേർന്നു"
     last_active: അവസാനം സജീവമായിരുന്നത്
     link_verified_on: സന്ധിയുടെ ഉടമസ്ഥാവസ്‌കാശം %{date} ൽ പരിശോധിക്കപ്പെട്ടു
     media: മാധ്യമങ്ങൾ
     moved_html: "%{name}, %{new_profile_link} ലേക്ക് നീങ്ങിയിരിക്കുന്നു:"
+    network_hidden: ഈ വിവരം ലഭ്യമല്ല
+    nothing_here: ഇവിടെ ഒന്നുമില്ല!
+    posts_tab_heading: ടൂട്ടുകൾ
+    posts_with_replies: ടൂട്ടുകളും മറുപടികളും
+    roles:
+      admin: അഡ്‌മിന്‍
+      bot: ബോട്ട്
+      group: ഗ്രൂപ്പ്
+    unavailable: പ്രൊഫൈൽ ലഭ്യമല്ല
   admin:
     account_moderation_notes:
       delete: മായ്ക്കുക
     accounts:
+      add_email_domain_block: ഇ-മെയിൽ ഡൊമെയ്ൻ തടയുക
       approve: അംഗീകരിക്കുക
+      approve_all: എല്ലാം അംഗീകരിക്കുക
+      are_you_sure: നിങ്ങൾക്ക് ഉറപ്പാണോ?
+      avatar: അവതാർ
       by_domain: മേഖല
       change_email:
         changed_msg: അംഗത്തിന്റെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം വിജയകരമായി മാറ്റിയിരിക്കുന്നു!
@@ -37,6 +57,8 @@ ml:
         title: "%{username} ന്റെ ഇലക്ട്രോണിക് കത്ത് മേൽവിലാസം മാറ്റുക"
       confirm: നിജപ്പെടുത്തുക
       confirmed: നിജപ്പെടുത്തി
+      confirming: സ്ഥിരീകരിക്കുന്നു
+      delete: ഡാറ്റ ഇല്ലാതാക്കുക
       deleted: മായിച്ചു
       demote: തരം താഴ്ത്തുക
       disable: പ്രവര്‍ത്തന രഹിതമാക്കുക
@@ -44,6 +66,56 @@ ml:
       disabled: പ്രവർത്തന രഹിതമാക്കപ്പെട്ടിരിക്കുന്നു
       display_name: കാണപ്പെടുന്ന നാമം
       domain: മേഖല
+      edit: തിരുത്തുക
+      email: ഇമെയിൽ
+      header: തലക്കെട്ട്
+      location:
+        all: എല്ലാം
+      moderation:
+        active: സജീവമാണ്
+        all: എല്ലാം
+      resend_confirmation:
+        send: സ്ഥിരീകരണ ഇമെയിൽ വീണ്ടും അയയ്ക്കുക
+        success: സ്ഥിരീകരണ ഇമെയിൽ വിജയകരമായി അയച്ചു!
+      reset: പുനഃക്രമീകരിക്കുക
+      reset_password: പാസ്‌വേഡ് പുനഃക്രമീകരിക്കുക
+      role: അനുമതികൾ
+      roles:
+        user: ഉപയോക്താവ്
+      search: തിരയുക
+      title: അക്കൗണ്ടുകൾ
+      unconfirmed_email: സ്ഥിരീകരിക്കാത്ത ഇമെയിൽ
+      username: ഉപയോക്തൃനാമം
+      web: വെബ്
+    action_logs:
+      action_types:
+        confirm_user: ഉപയോക്താവിനെ സ്ഥിരീകരിക്കുക
+        remove_avatar_user: അവതാർ നീക്കംചെയ്യുക
+        reset_password_user: പാസ്‌വേഡ് പുനഃക്രമീകരിക്കുക
+    custom_emojis:
+      copy: പകര്‍ത്തുക
+      create_new_category: പുതിയ വിഭാഗം സൃഷ്ടിക്കുക
+      delete: ഇല്ലാതാക്കുക
+      emoji: ഇമോജി
+    dashboard:
+      feature_profile_directory: പ്രൊഫൈൽ ഡയറക്ടറി
+      features: സവിശേഷതകൾ
+      title: ഡാഷ്ബോർഡ്
+      total_users: മൊത്തം ഉപയോക്താക്കൾ
+      trends: ട്രെൻഡുകൾ
+    email_domain_blocks:
+      add_new: പുതിയത് ചേര്‍ക്കുക
+      delete: ഇല്ലാതാക്കുക
+      domain: ഡൊമൈന്‍
+      new:
+        create: ഡൊമൈൻ ചേര്‍ക്കുക
+    invites:
+      filter:
+        all: എല്ലാം
+  authorize_follow:
+    following: 'വിജയകരം! നിങ്ങൾ ഇപ്പോൾ പിന്തുടരുന്നു:'
+  directories:
+    directory: പ്രൊഫൈൽ ഡയറക്ടറി
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
@@ -54,3 +126,18 @@ ml:
     '429': Too many requests
     '500': 
     '503': The page could not be served due to a temporary server failure.
+  filters:
+    contexts:
+      notifications: അറിയിപ്പുകൾ
+  generic:
+    all: എല്ലാം
+  notification_mailer:
+    digest:
+      action: എല്ലാ അറിയിപ്പുകളും കാണിക്കുക
+    follow:
+      body: "%{name} ഇപ്പോൾ നിങ്ങളെ പിന്തുടരുന്നു!"
+      subject: "%{name} ഇപ്പോൾ നിങ്ങളെ പിന്തുടരുന്നു"
+  relationships:
+    following: പിന്തുടരുന്നു
+  settings:
+    notifications: അറിയിപ്പുകൾ
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index fe268d546..a419e0b47 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -60,6 +60,7 @@ nl:
       one: Volger
       other: Volgers
     following: Volgend
+    instance_actor_flash: Dit account is een 'virtual actor' waarmee de server zichzelf vertegenwoordigd en is dus geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden opgeschort.
     joined: Geregistreerd in %{date}
     last_active: laatst actief
     link_verified_on: Eigendom van deze link is gecontroleerd op %{date}
@@ -98,6 +99,7 @@ nl:
       add_email_domain_block: E-maildomein blokkeren
       approve: Goedkeuren
       approve_all: Alles goedkeuren
+      approved_msg: Het goedkeuren van het registratieverzoek van %{username} is geslaagd
       are_you_sure: Weet je het zeker?
       avatar: Avatar
       by_domain: Domein
@@ -111,8 +113,10 @@ nl:
       confirm: Bevestigen
       confirmed: Bevestigd
       confirming: Bevestiging
+      delete: Gegevens verwijderen
       deleted: Verwijderd
       demote: Degraderen
+      destroyed_msg: De verwijdering van de gegevens van %{username} staat nu in de wachtrij
       disable: Bevriezen
       disable_two_factor_authentication: 2FA uitschakelen
       disabled: Bevroren
@@ -123,10 +127,12 @@ nl:
       email_status: E-mailstatus
       enable: Ontdooien
       enabled: Ingeschakeld
+      enabled_msg: Het ontdooien van het account van %{username} is geslaagd
       followers: Volgers
       follows: Volgt
       header: Omslagfoto
       inbox_url: Inbox-URL
+      invite_request_text: Redenen om te registreren
       invited_by: Uitgenodigd door
       ip: IP
       joined: Geregistreerd in
@@ -137,7 +143,9 @@ nl:
         title: Locatie
       login_status: Loginstatus
       media_attachments: Mediabijlagen
-      memorialize: In gedenkpagina veranderen
+      memorialize: Naar een In memoriam veranderen
+      memorialized: In memoriam
+      memorialized_msg: Het naar een In memoriam veranderen van het account van %{username} is geslaagd
       moderation:
         active: Actief
         all: Alles
@@ -158,10 +166,14 @@ nl:
       public: Openbaar
       push_subscription_expires: PuSH-abonnement verloopt op
       redownload: Profiel vernieuwen
+      redownloaded_msg: Het herstellen van het oorspronkelijke profiel van %{username} is geslaagd
       reject: Afkeuren
       reject_all: Alles afkeuren
+      rejected_msg: Het afwijzen van het registratieverzoek van %{username} is geslaagd
       remove_avatar: Avatar verwijderen
       remove_header: Omslagfoto verwijderen
+      removed_avatar_msg: Het verwijderen van de avatar van %{username} is geslaagd
+      removed_header_msg: Het verwijderen van de omslagfoto van %{username} is geslaagd
       resend_confirmation:
         already_confirmed: Deze gebruiker is al bevestigd
         send: Verzend bevestigingsmail opnieuw
@@ -178,6 +190,8 @@ nl:
       search: Zoeken
       search_same_email_domain: Andere gebruikers met hetzelfde e-maildomein
       search_same_ip: Andere gebruikers met hetzelfde IP-adres
+      sensitive: Gevoelig
+      sensitized: als gevoelig gemarkeerd
       shared_inbox_url: Gedeelde inbox-URL
       show:
         created_reports: Aangemaakte rapportages
@@ -187,13 +201,19 @@ nl:
       statuses: Toots
       subscribe: Abonneren
       suspended: Opgeschort
+      suspension_irreversible: De gegevens van dit account zijn onomkeerbaar verwijderd. Je kunt het opschorten van dit account ongedaan maken zodat het weer valt te gebruiken, maar de verwijderde gegevens worden hiermee niet hersteld.
+      suspension_reversible_hint_html: Dit account is opgeschort en de gegevens worden volledig verwijderd op %{date}. Tot die tijd kan dit account worden hersteld zonder nadelige gevolgen. Wanneer je alle gegevens van dit account onmiddellijk wilt verwijderen, kun je dit hieronder doen.
       time_in_queue: "%{time} in de wachtrij"
       title: Accounts
       unconfirmed_email: Onbevestigd e-mailadres
+      undo_sensitized: Niet meer als gevoelig markeren
       undo_silenced: Niet langer negeren
       undo_suspension: Niet langer opschorten
+      unsilenced_msg: Het opheffen van de beperkingen van %{username} zijn geslaagd
       unsubscribe: Opzeggen
+      unsuspended_msg: Het niet langer opschorten van %{username} is geslaagd
       username: Gebruikersnaam
+      view_domain: Samenvatting voor domein bekijken
       warn: Waarschuwen
       web: Webapp
       whitelisted: Goedgekeurd voor federatie
@@ -208,31 +228,36 @@ nl:
         create_domain_allow: Domeingoedkeuring aanmaken
         create_domain_block: Domeinblokkade aanmaken
         create_email_domain_block: E-maildomeinblokkade aanmaken
+        create_ip_block: IP-regel aanmaken
         demote_user: Gebruiker degraderen
         destroy_announcement: Mededeling verwijderen
         destroy_custom_emoji: Lokale emoji verwijderen
         destroy_domain_allow: Domeingoedkeuring verwijderen
         destroy_domain_block: Domeinblokkade verwijderen
         destroy_email_domain_block: E-maildomeinblokkade verwijderen
+        destroy_ip_block: IP-regel verwijderen
         destroy_status: Toot verwijderen
         disable_2fa_user: Tweestapsverificatie uitschakelen
         disable_custom_emoji: Lokale emojij uitschakelen
         disable_user: Gebruiker uitschakelen
         enable_custom_emoji: Lokale emoji inschakelen
         enable_user: Gebruiker inschakelen
-        memorialize_account: Account in gedenkpagina veranderen
+        memorialize_account: Het account in een In memoriam veranderen
         promote_user: Gebruiker promoveren
         remove_avatar_user: Avatar verwijderen
         reopen_report: Rapportage heropenen
         reset_password_user: Wachtwoord opnieuw instellen
         resolve_report: Rapportage oplossen
+        sensitive_account: De media in jouw account als gevoelig markeren
         silence_account: Account negeren
         suspend_account: Account opschorten
         unassigned_report: Rapportage niet langer toewijzen
+        unsensitive_account: De media in jouw account niet langer als gevoelig markeren
         unsilence_account: Account niet langer negeren
         unsuspend_account: Account niet langer opschorten
         update_announcement: Mededeling bijwerken
         update_custom_emoji: Lokale emoji bijwerken
+        update_domain_block: Domeinblokkade bijwerken
         update_status: Toot bijwerken
       actions:
         assigned_to_self_report: "%{name} heeft rapportage %{target} aan zichzelf toegewezen"
@@ -256,7 +281,7 @@ nl:
         disable_user: Inloggen voor %{target} is door %{name} uitgeschakeld
         enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld
         enable_user: Inloggen voor %{target} is door %{name} ingeschakeld
-        memorialize_account: Account %{target} is door %{name} in een gedenkpagina veranderd
+        memorialize_account: Het account %{target} is door %{name} in een In memoriam veranderd
         promote_user: Gebruiker %{target} is door %{name} gepromoveerd
         remove_avatar_user: "%{name} verwijderde de avatar van %{target}"
         reopen_report: "%{name} heeft rapportage %{target} heropend"
@@ -411,6 +436,7 @@ nl:
     instances:
       by_domain: Domein
       delivery_available: Bezorging is mogelijk
+      empty: Geen domeinen gevonden.
       known_accounts:
         one: "%{count} bekend account"
         other: "%{count} bekende accounts"
@@ -434,6 +460,21 @@ nl:
         expired: Verlopen
         title: Filter
       title: Uitnodigingen
+    ip_blocks:
+      add_new: Regel aanmaken
+      created_msg: Het toevoegen van een nieuwe IP-regel is geslaagd
+      delete: Verwijderen
+      expires_in:
+        '1209600': 2 weken
+        '15778476': 6 maanden
+        '2629746': 1 maand
+        '31556952': 1 jaar
+        '86400': 1 dag
+        '94670856': 3 jaar
+      new:
+        title: Nieuwe IP-regel aanmaken
+      no_ip_block_selected: Er zijn geen IP-regels veranderd, omdat er geen een was geselecteerd
+      title: IP-regels
     pending_accounts:
       title: Accounts in afwachting (%{count})
     relationships:
@@ -473,6 +514,8 @@ nl:
       comment:
         none: Geen
       created_at: Gerapporteerd op
+      forwarded: Doorgestuurd
+      forwarded_to: Doorgestuurd naar %{domain}
       mark_as_resolved: Markeer als opgelost
       mark_as_unresolved: Markeer als onopgelost
       notes:
@@ -681,8 +724,11 @@ nl:
       prefix_sign_up: Registreer je vandaag nog op Mastodon!
       suffix: Met een account ben je in staat om mensen te volgen, berichten te plaatsen en uit te wisselen met mensen die zich op andere Mastodonservers bevinden en meer!
     didnt_get_confirmation: Geen bevestigingsinstructies ontvangen?
+    dont_have_your_security_key: Heb je jouw beveiligingssleutel niet bij de hand?
     forgot_password: Wachtwoord vergeten?
     invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan.
+    link_to_otp: Voer een tweestapsverificatiecode van je telefoon of een herstelcode in
+    link_to_webauth: Jouw apparaat met de authenticatie-app gebruiken
     login: Inloggen
     logout: Uitloggen
     migrate_account: Naar een ander account verhuizen
@@ -707,7 +753,9 @@ nl:
       functional: Jouw account is volledig operationeel.
       pending: Jouw aanvraag moet nog worden beoordeeld door een van onze medewerkers. Dit kan misschien eventjes duren. Je ontvangt een e-mail wanneer jouw aanvraag is goedgekeurd.
       redirecting_to: Jouw account is inactief omdat het momenteel wordt doorverwezen naar %{acct}.
+    too_fast: Formulier is te snel ingediend. Probeer het nogmaals.
     trouble_logging_in: Problemen met inloggen?
+    use_security_key: Beveiligingssleutel gebruiken
   authorize_follow:
     already_following: Je volgt dit account al
     already_requested: Je hebt al een volgverzoek naar dat account verstuurd
@@ -732,6 +780,7 @@ nl:
   date:
     formats:
       default: "%d %b %Y"
+      with_month_name: "%d %B %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}u"
@@ -796,6 +845,7 @@ nl:
       request: Jouw archief opvragen
       size: Omvang
     blocks: Jij blokkeert
+    bookmarks: Bladwijzers
     csv: CSV
     domain_blocks: Domeinblokkades
     lists: Lijsten
@@ -809,7 +859,7 @@ nl:
   filters:
     contexts:
       account: Profielen
-      home: Starttijdlijn
+      home: Starttijdlijn en lijsten
       notifications: Meldingen
       public: Openbare tijdlijnen
       thread: Gesprekken
@@ -863,6 +913,8 @@ nl:
     status: Verificatiestatus
     view_proof: Bekijk bewijs
   imports:
+    errors:
+      over_rows_processing_limit: bevat meer dan %{count} rijen
     modes:
       merge: Samenvoegen
       merge_long: Bestaande gegevens behouden en nieuwe toevoegen
@@ -872,6 +924,7 @@ nl:
     success: Jouw gegevens zijn succesvol geüpload en worden binnenkort verwerkt
     types:
       blocking: Blokkeerlijst
+      bookmarks: Bladwijzers
       domain_blocking: Lijst met genegeerde servers
       following: Volglijst
       muting: Negeerlijst
@@ -992,6 +1045,14 @@ nl:
           quadrillion: qdn.
           thousand: K
           trillion: bln.
+  otp_authentication:
+    code_hint: Voer de code in die door de authenticatie-app werd gegenereerd
+    description_html: Na het instellen van <strong>tweestapsverificatie</strong> met een authenticatie-app, kun je alleen inloggen als je jouw mobiele telefoon bij je hebt. Hiermee genereer je namelijk de in te voeren aanmeldcode.
+    enable: Inschakelen
+    instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het inloggen moet invoeren."
+    manual_instructions: 'Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder de geheime code in platte tekst:'
+    setup: Instellen
+    wrong_code: De ingevoerde code is ongeldig! Klopt de systeemtijd van de server en die van jouw apparaat?
   pagination:
     newer: Nieuwer
     next: Volgende
@@ -1020,6 +1081,7 @@ nl:
   relationships:
     activity: Accountactiviteit
     dormant: Sluimerend
+    follow_selected_followers: Geselecteerde volgers volgen
     followers: Volgers
     following: Volgend
     invited: Uitgenodigd
@@ -1116,6 +1178,7 @@ nl:
     profile: Profiel
     relationships: Volgers en gevolgden
     two_factor_authentication: Tweestapsverificatie
+    webauthn_authentication: Beveiligingssleutels
   spam_check:
     spam_detected: Dit is een automatisch gegenereerde rapportage. Er is spam gedetecteerd.
   statuses:
@@ -1154,6 +1217,8 @@ nl:
         other: "%{count} stemmen"
       vote: Stemmen
     show_more: Meer tonen
+    show_newer: Nieuwere tonen
+    show_older: Oudere tonen
     show_thread: Gesprek tonen
     sign_in_to_participate: Meld je aan om aan dit gesprek mee te doen
     title: '%{name}: "%{quote}"'
@@ -1262,14 +1327,20 @@ nl:
       default: "%d %B %Y om %H:%M"
       month: "%b %Y"
   two_factor_authentication:
+    add: Toevoegen
     disable: Tweestapsverificatie uitschakelen
+    disabled_success: Uitschakelen tweestapsverificatie is geslaagd
+    edit: Bewerken
     enabled: Tweestapsverificatie is ingeschakeld
     enabled_success: Inschakelen tweestapsverificatie geslaagd
     generate_recovery_codes: Herstelcodes genereren
     lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig.
+    methods: Methoden voor tweestapsverificatie
+    otp: Authenticatie-app
     recovery_codes: Herstelcodes back-uppen
     recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd
     recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. <strong>Zorg ervoor dat je de herstelcodes op een veilige plek bewaard</strong>. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.
+    webauthn: Beveiligingssleutels
   user_mailer:
     backup_ready:
       explanation: Je hebt een volledige back-up van jouw Mastodon-account opgevraagd. Het staat nu klaar om te worden gedownload!
@@ -1284,6 +1355,7 @@ nl:
     warning:
       explanation:
         disable: Zolang jouw account is bevroren blijven jouw accountgegevens intact, maar kun je geen handelingen uitvoeren totdat het account is vrijgegeven.
+        sensitive: De mediabestanden die je upload en gekoppelde media worden als gevoelig behandeld.
         silence: Zolang jouw account wordt beperkt, kunnen alleen mensen die jou al volgen jouw toots op deze server zien. Tevens ben je niet zichtbaar in meldingen, gesprekken en op openbare tijdlijnen. Anderen kunnen je echter wel handmatig volgen.
         suspend: Jouw account is opgeschort. Jouw toots en geüploade media zijn onomkeerbaar van deze server verwijderd, en ook o.a. van de servers waar jij volgers had.
       get_in_touch: Je kunt deze e-mail beantwoorden om in contact te komen met de medewerkers van %{instance}.
@@ -1292,11 +1364,13 @@ nl:
       subject:
         disable: Jouw account %{acct} is bevroren
         none: Waarschuwing voor %{acct}
+        sensitive: De door jouw account %{acct} geplaatste media is als gevoelig gemarkeerd
         silence: Jouw account %{acct} is nu beperkt
         suspend: Jouw account %{acct} is opgeschort
       title:
         disable: Account bevroren
         none: Waarschuwing
+        sensitive: Jouw media is als gevoelig gemarkeerd
         silence: Account beperkt
         suspend: Account opgeschort
     welcome:
@@ -1317,9 +1391,11 @@ nl:
       tips: Tips
       title: Welkom aan boord %{name}!
   users:
+    blocked_email_provider: Deze e-mailprovider is niet toegestaan
     follow_limit_reached: Je kunt niet meer dan %{limit} accounts volgen
     generic_access_help_html: Problemen met toegang tot je account? Neem dan contact op met %{email} voor assistentie
     invalid_email: E-mailadres is ongeldig
+    invalid_email_mx: Het e-mailadres lijkt niet te bestaan
     invalid_otp_token: Ongeldige tweestaps-aanmeldcode
     invalid_sign_in_token: Ongeldige beveiligingscode
     otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email}
@@ -1329,3 +1405,20 @@ nl:
   verification:
     explanation_html: 'Je kunt <strong>jezelf verifiëren als de eigenaar van de links in de metadata van jouw profiel</strong>. Hiervoor moet op de gelinkte website een link terug naar jouw Mastodonprofiel staan. Deze link <strong>moet</strong> het <code>rel="me"</code>-attribuut bevatten. De omschrijving van de link maakt niet uit. Hier is een voorbeeld:'
     verification: Verificatie
+  webauthn_credentials:
+    add: Nieuwe beveiligingssleutel toevoegen
+    create:
+      error: Er deed zich een probleem voor met het toevoegen van jouw beveiligingssleutel. Probeer het nogmaals.
+      success: Het toevoegen van je beveiligingssleutel is geslaagd.
+    delete: Verwijderen
+    delete_confirmation: Weet je zeker dat je deze beveiligingssleutel wilt verwijderen?
+    description_html: Wanneer je <strong>verificatie met beveiligingssleutels</strong> inschakelt, moet je tijdens het inloggen een van jouw beveiligingssleutels gebruiken.
+    destroy:
+      error: Er deed zich een probleem voor met het verwijderen van jouw beveiligingssleutel. Probeer het nogmaals.
+      success: Het verwijderen van jouw beveiligingssleutel is geslaagd.
+    invalid_credential: Ongeldige beveiligingssleutel
+    nickname_hint: Voer de bijnaam in van jouw nieuwe beveiligingssleutel
+    not_enabled: Je hebt WebAuthn nog niet ingeschakeld
+    not_supported: Deze browser ondersteunt geen beveiligingssleutels
+    otp_required: Om beveiligingssleutels te kunnen gebruiken, moet je eerst tweestapsverificatie inschakelen.
+    registered_on: Geregistreerd op %{date}
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 18d81bae3..a53f0cee7 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -132,6 +132,7 @@ oc:
       login_status: Estat formulari de connexion
       media_attachments: Mèdias enviats
       memorialize: Passar en memorial
+      memorialized: Memorizat
       moderation:
         active: Actius
         all: Totes
@@ -773,6 +774,7 @@ oc:
       request: Demandar vòstre archiu
       size: Talha
     blocks: Personas que blocatz
+    bookmarks: Marcadors
     csv: CSV
     domain_blocks: Blocatge de domenis
     lists: Listas
@@ -847,6 +849,7 @@ oc:
     success: Vòstras donadas son ben estadas mandadas e seràn tractadas tre que possible
     types:
       blocking: Lista de blocatge
+      bookmarks: Marcadors
       domain_blocking: Lista dels domenis blocats
       following: Lista de monde que seguètz
       muting: Lista de monde que volètz pas legir
@@ -953,6 +956,7 @@ oc:
           trillion: T
   otp_authentication:
     enable: Activar
+    setup: Parametrar
   pagination:
     newer: Mai recents
     next: Seguent
@@ -1077,10 +1081,14 @@ oc:
     profile: Perfil
     relationships: Abonaments e seguidors
     two_factor_authentication: Autentificacion en dos temps
+    webauthn_authentication: Claus de seguretat
   spam_check:
     spam_detected: Aquò es un senhalament automatic. D’spam es estat detectat.
   statuses:
     attached:
+      audio:
+        one: "%{count} àudio"
+        other: "%{count} àudios"
       description: 'Ajustat : %{attached}'
       image:
         one: "%{count} imatge"
@@ -1220,7 +1228,9 @@ oc:
       default: Lo %e %B de %Y a %Ho%M
       month: "%B de %Y"
   two_factor_authentication:
+    add: Ajustar
     disable: Desactivar
+    edit: Modificar
     enabled: Autentificacion en dos temps activada
     enabled_success: L’autentificacion en dos temps es ben activada
     generate_recovery_codes: Generar los còdis de recuperacion
@@ -1228,6 +1238,7 @@ oc:
     recovery_codes: Salvar los còdis de recuperacion
     recovery_codes_regenerated: Los còdis de recuperacion son ben estats tornats generar
     recovery_instructions_html: Se vos arriba de perdre vòstre mobil, podètz utilizar un dels còdis de recuperacion cai-jos per poder tornar accedir a vòstre compte. <strong>Gardatz los còdis en seguretat</strong>, per exemple, imprimissètz los e gardatz los amb vòstres documents importants.
+    webauthn: Claus de seguretat
   user_mailer:
     backup_ready:
       explanation: Avètz demandat una salvagarda complèta de vòstre compte Mastodon. Es prèsta per telecargament !
@@ -1279,3 +1290,8 @@ oc:
   verification:
     explanation_html: 'Podètz <strong>verificar vosautres meteisses coma proprietari dels ligams per las metadonadas de vòstre perfil</strong>. Per aquò far, lo site Web ligat deu conténer un ligam cap a vòstre perfil Mastodon. Lo ligam <strong>deu</strong> aver un atribut <code>rel="me"</code>. Lo contengut tèxte del ligam impòrta pas. Vaquí un exemple :'
     verification: Verificacion
+  webauthn_credentials:
+    add: Apondre una clau de seguretat novèla
+    delete: Suprimir
+    invalid_credential: Cau de seguretat invalida
+    registered_on: Inscripcion del %{date}
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 1e77ef21d..23c67267e 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -66,6 +66,7 @@ pl:
       one: śledzący
       other: Śledzących
     following: śledzonych
+    instance_actor_flash: To konto jest wirtualnym profilem używanym do reprezentowania samego serwera, a nie żadnego indywidualnego użytkownika. Jest ono stosowane do celów federacji i nie powinien być zawieszany.
     joined: Dołączył(a) %{date}
     last_active: ostatnio aktywny(-a)
     link_verified_on: Własność tego odnośnika została sprawdzona %{date}
@@ -139,6 +140,7 @@ pl:
       follows: Śledzeni
       header: Nagłówek
       inbox_url: Adres skrzynki
+      invite_request_text: Powody rejestracji
       invited_by: Zaproszony(-a) przez
       ip: Adres IP
       joined: Dołączył(-a)
@@ -263,6 +265,7 @@ pl:
         unsuspend_account: Cofnij zawieszenie konta
         update_announcement: Aktualizuj ogłoszenie
         update_custom_emoji: Aktualizuj niestandardowe emoji
+        update_domain_block: Zaktualizuj blokadę domeny
         update_status: Aktualizuj wpis
       actions:
         assigned_to_self_report: "%{name} przypisał(a) sobie zgłoszenie %{target}"
@@ -303,6 +306,7 @@ pl:
         unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}"
         update_announcement: "%{name} zaktualizował(-a) ogłoszenie %{target}"
         update_custom_emoji: "%{name} zaktualizował(a) emoji %{target}"
+        update_domain_block: "%{name} zaktualizował(-a) blokadę domeny dla %{target}"
         update_status: "%{name} zaktualizował(a) wpis użytkownika %{target}"
       deleted_status: "(usunięty wpis)"
       empty: Nie znaleziono aktywności w dzienniku.
@@ -406,6 +410,8 @@ pl:
           silence: Wycisz
           suspend: Zawieś
         title: Nowa blokada domen
+      obfuscate: Ukryj nazwę domeny
+      obfuscate_hint: Częściowo ukryj nazwę domeny na liście, gdy reklamowanie listy limitów domen jest włączone
       private_comment: Prywatny komentarz
       private_comment_hint: Komentarz na temat ograniczeń dla tej domeny do wewnętrznej informacji dla moderatorów.
       public_comment: Publiczny komentarz
@@ -447,6 +453,7 @@ pl:
     instances:
       by_domain: Domena
       delivery_available: Doręczanie jest dostępne
+      empty: Nie znaleziono domen.
       known_accounts:
         few: "%{count} znane konta"
         many: "%{count} znane konta"
@@ -530,6 +537,8 @@ pl:
       comment:
         none: Brak
       created_at: Zgłoszono
+      forwarded: Przekazano
+      forwarded_to: Przekazano do %{domain}
       mark_as_resolved: Oznacz jako rozwiązane
       mark_as_unresolved: Oznacz jako nierozwiązane
       notes:
@@ -573,6 +582,7 @@ pl:
       domain_blocks_rationale:
         title: Pokaż uzasadnienia
       enable_bootstrap_timeline_accounts:
+        desc_html: Niech nowi użytkownicy automatycznie śledzą ustawione konta, aby ich główna oś czasu nie był początkowo pusta
         title: Dodawaj domyślne obserwacje nowym użytkownikom
       hero:
         desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura serwera
@@ -599,6 +609,9 @@ pl:
         min_invite_role:
           disabled: Nikt
           title: Kto może zapraszać użytkowników
+        require_invite_text:
+          desc_html: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne
+          title: Wymagaj od nowych użytkowników wypełnienia tekstu prośby o zaproszenie
       registrations_mode:
         modes:
           approved: Przyjęcie jest wymagane do rejestracji
@@ -767,6 +780,7 @@ pl:
       functional: Twoje konto całkowicie funkcjonuje.
       pending: Twoje zgłoszenie czeka na zatwierdzenie przez nas. Może to trochę potrwać. Jeżeli zgłoszenie zostanie przyjęte, otrzymasz wiadomość e-mail.
       redirecting_to: Twoje konto jest nieaktywne, ponieważ obecnie przekierowuje je na %{acct}.
+    too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie.
     trouble_logging_in: Masz problem z zalogowaniem się?
     use_security_key: Użyj klucza bezpieczeństwa
   authorize_follow:
@@ -928,6 +942,8 @@ pl:
     status: Stan weryfikacji
     view_proof: Wyświetl dowód
   imports:
+    errors:
+      over_rows_processing_limit: zawiera więcej niż %{count} wierszy
     modes:
       merge: Połącz
       merge_long: Zachowaj obecne wpisy i dodaj nowe
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 28c7a3204..529548225 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -60,6 +60,7 @@ pt-BR:
       one: Seguidor
       other: Seguidores
     following: Seguindo
+    instance_actor_flash: Esta conta é um ator virtual usado para representar o próprio servidor e não um usuário individual. É utilizada para fins de federação e não deve ser suspensa.
     joined: Entrou em %{date}
     last_active: última atividade
     link_verified_on: O link foi verificado em %{date}
@@ -131,6 +132,7 @@ pt-BR:
       follows: Seguindo
       header: Capa
       inbox_url: URL da caixa de entrada
+      invite_request_text: Motivos para entrar
       invited_by: Convidado por
       ip: IP
       joined: Entrou
@@ -255,6 +257,7 @@ pt-BR:
         unsuspend_account: Remover suspensão de conta
         update_announcement: Editar anúncio
         update_custom_emoji: Editar Emoji Personalizado
+        update_domain_block: Atualizar bloqueio de domínio
         update_status: Editar Status
       actions:
         assigned_to_self_report: "%{name} pegou a denúncia %{target}"
@@ -295,6 +298,7 @@ pt-BR:
         unsuspend_account: "%{name} removeu a suspensão da conta de %{target}"
         update_announcement: "%{name} atualizou o anúncio %{target}"
         update_custom_emoji: "%{name} atualizou o emoji %{target}"
+        update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}"
         update_status: "%{name} atualizou o status de %{target}"
       deleted_status: "(status excluído)"
       empty: Nenhum registro encontrado.
@@ -437,6 +441,7 @@ pt-BR:
     instances:
       by_domain: Domínio
       delivery_available: Envio disponível
+      empty: Nenhum domínio encontrado.
       known_accounts:
         one: "%{count} conta conhecida"
         other: "%{count} contas conhecidas"
@@ -514,6 +519,8 @@ pt-BR:
       comment:
         none: Nenhum
       created_at: Denunciado
+      forwarded: Encaminhados
+      forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
       mark_as_unresolved: Marcar como não resolvido
       notes:
@@ -583,6 +590,9 @@ pt-BR:
         min_invite_role:
           disabled: Ninguém
           title: Permitir convites de
+        require_invite_text:
+          desc_html: Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite em "Por que você deseja criar uma conta aqui?"
+          title: Exigir que novos usuários preencham um texto de solicitação de convite
       registrations_mode:
         modes:
           approved: Aprovação necessária para criar conta
@@ -751,6 +761,7 @@ pt-BR:
       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}.
+    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
   authorize_follow:
@@ -842,6 +853,7 @@ pt-BR:
       request: Solicitar o seu arquivo
       size: Tamanho
     blocks: Você bloqueou
+    bookmarks: Marcadores
     csv: CSV
     domain_blocks: Bloqueios de domínio
     lists: Listas
@@ -918,6 +930,7 @@ pt-BR:
     success: Os seus dados foram enviados com sucesso e serão processados em instantes
     types:
       blocking: Lista de bloqueio
+      bookmarks: Marcadores
       domain_blocking: Lista de domínios bloqueados
       following: Pessoas que você segue
       muting: Lista de silenciados
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 8d66efba9..f7b47fb10 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -60,6 +60,7 @@ pt-PT:
       one: Seguidor
       other: Seguidores
     following: A seguir
+    instance_actor_flash: Esta conta é um actor virtual usado para representar a própria instância e não um utilizador individual. É usada para motivos de federação e não deve ser suspenso.
     joined: Aderiu %{date}
     last_active: última vez activo
     link_verified_on: A posse deste link foi verificada em %{date}
@@ -131,6 +132,7 @@ pt-PT:
       follows: A seguir
       header: Cabeçalho
       inbox_url: URL da caixa de entrada
+      invite_request_text: Razões para se juntar a nós
       invited_by: Convidado(a) por
       ip: IP
       joined: Aderiu
@@ -255,6 +257,7 @@ pt-PT:
         unsuspend_account: Retirar Suspensão à Conta
         update_announcement: Atualizar Anúncio
         update_custom_emoji: Atualizar Emoji Personalizado
+        update_domain_block: Atualizar Bloqueio de Domínio
         update_status: Atualizar Estado
       actions:
         assigned_to_self_report: "%{name} atribuiu o relatório %{target} a si próprios"
@@ -295,6 +298,7 @@ pt-PT:
         unsuspend_account: "%{name} desativou a suspensão de  %{target}"
         update_announcement: "%{name} atualizou o anúncio %{target}"
         update_custom_emoji: "%{name} atualizou o emoji %{target}"
+        update_domain_block: "%{name} atualizou o bloqueio de domínio para %{target}"
         update_status: "%{name} atualizou o estado de %{target}"
       deleted_status: "(apagou a publicação)"
       empty: Não foram encontrados registos.
@@ -398,6 +402,8 @@ pt-PT:
           silence: Silenciar
           suspend: Suspender
         title: Novo bloqueio de domínio
+      obfuscate: Ofuscar nome de domínio
+      obfuscate_hint: Ofuscar parcialmente o nome de domínio na lista, se estiverem habilitadas as limitações na publicação da lista de domínios
       private_comment: Comentário privado
       private_comment_hint: Comentário sobre essa limitação de domínio para uso interno pelos moderadores.
       public_comment: Comentário público
@@ -437,6 +443,7 @@ pt-PT:
     instances:
       by_domain: Domínio
       delivery_available: Entrega disponível
+      empty: Não foram encontrados domínios.
       known_accounts:
         one: "%{count} conta conhecida"
         other: "%{count} contas conhecidas"
@@ -514,6 +521,8 @@ pt-PT:
       comment:
         none: Nenhum
       created_at: Relatado
+      forwarded: Encaminhado
+      forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
       mark_as_unresolved: Marcar como não resolvido
       notes:
@@ -557,6 +566,7 @@ pt-PT:
       domain_blocks_rationale:
         title: Mostrar motivo
       enable_bootstrap_timeline_accounts:
+        desc_html: Faça com que novos utilizadores sigam automaticamente contas configuradas, para que a cronologia destes não se apresente inicialmente vazia
         title: Habilitar seguidores predefinidos para novos utilizadores
       hero:
         desc_html: Apresentado na primeira página. Pelo menos 600x100px recomendados. Quando não é definido, é apresentada a miniatura da instância
@@ -583,6 +593,9 @@ pt-PT:
         min_invite_role:
           disabled: Ninguém
           title: Permitir convites de
+        require_invite_text:
+          desc_html: Quando os registos exigirem aprovação manual, faça o texto "Porque se quer juntar a nós?" da solicitação de convite obrigatório, em vez de opcional
+          title: Exigir que novos utilizadores preencham um texto de solicitação de convite
       registrations_mode:
         modes:
           approved: Registo sujeito a aprovação
@@ -751,6 +764,7 @@ pt-PT:
       functional: A sua conta está totalmente operacional.
       pending: A sua inscrição está pendente de revisão pela nossa equipa. Isso pode demorar algum tempo. Receberá um e-mail se a sua conta for aprovada.
       redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}.
+    too_fast: Formulário enviado muito rapidamente, tente novamente.
     trouble_logging_in: Problemas em iniciar sessão?
     use_security_key: Usar chave de segurança
   authorize_follow:
@@ -910,6 +924,8 @@ pt-PT:
     status: Estado da verificação
     view_proof: Ver prova
   imports:
+    errors:
+      over_rows_processing_limit: contém mais de %{count} linhas
     modes:
       merge: Juntar
       merge_long: Manter os registos existentes e adicionar novos registos
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 2de389864..9895f9a55 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -66,6 +66,7 @@ ru:
       one: подписчик
       other: подписчиков
     following: подписки
+    instance_actor_flash: Эта учетная запись - виртуальный пользователь, используемый для представления самого сервера, а не отдельного пользователя. Она используется для организационных целей и не может быть заморожена.
     joined: 'Дата регистрации: %{date}'
     last_active: последняя активность
     link_verified_on: Владение этой ссылкой было проверено %{date}
@@ -139,6 +140,7 @@ ru:
       follows: Подписки
       header: Шапка
       inbox_url: URL входящих
+      invite_request_text: Причины для присоединения
       invited_by: Приглашение выдал(а)
       ip: IP
       joined: Дата регистрации
@@ -263,6 +265,7 @@ ru:
         unsuspend_account: Разблокировка пользователей
         update_announcement: Обновление объявлений
         update_custom_emoji: Обновление эмодзи
+        update_domain_block: Изменить блокировку домена
         update_status: Изменение постов
       actions:
         assigned_to_self_report: "%{name} назначил(а) себя для решения жалобы %{target}"
@@ -303,6 +306,7 @@ ru:
         unsuspend_account: "%{name} снял(а) блокировку с пользователя %{target}"
         update_announcement: "%{name} обновил объявление %{target}"
         update_custom_emoji: "%{name} обновил(а) эмодзи %{target}"
+        update_domain_block: "%{name} обновил блокировку домена для %{target}"
         update_status: "%{name} изменил(а) пост пользователя %{target}"
       deleted_status: "(удалённый пост)"
       empty: Журнал пуст.
@@ -452,6 +456,7 @@ ru:
     instances:
       by_domain: Домен
       delivery_available: Доставка возможна
+      empty: Домены не найдены.
       known_accounts:
         few: "%{count} известные учётные записи"
         many: "%{count} известных учётных записей"
@@ -535,6 +540,8 @@ ru:
       comment:
         none: Нет
       created_at: Создана
+      forwarded: Переслано
+      forwarded_to: Переслано на %{domain}
       mark_as_resolved: Отметить как решённую
       mark_as_unresolved: Отметить как нерешённую
       notes:
@@ -604,6 +611,9 @@ ru:
         min_invite_role:
           disabled: Никого
           title: Разрешать приглашения от
+        require_invite_text:
+          desc_html: Когда регистрация требует ручного подтверждения, сделать ответ на вопрос "Почему вы хотите присоединиться?" обязательным, а не опциональным
+          title: Обязать новых пользователей заполнять текст запроса на приглашение
       registrations_mode:
         modes:
           approved: Для регистрации требуется подтверждение
@@ -772,6 +782,7 @@ ru:
       functional: Ваша учётная запись в полном порядке.
       pending: Ваша заявка ожидает одобрения администраторами, это может занять немного времени. Вы получите письмо, как только заявку одобрят.
       redirecting_to: Ваша учётная запись деактивированна, потому что вы настроили перенаправление на %{acct}.
+    too_fast: Форма отправлена слишком быстро, попробуйте еще раз.
     trouble_logging_in: Не удаётся войти?
     use_security_key: Использовать ключ безопасности
   authorize_follow:
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index 4e3322589..626c7671c 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -1,12 +1,1420 @@
 ---
 sc:
+  about:
+    about_hashtag_html: Custos sunt tuts pùblicos etichetados cun <strong>#%{hashtag}</strong>. Bi podes intrare in cuntatu si tenes unu contu in cale si siat logu de su fediversu.
+    about_mastodon_html: 'Sa rete sotziale de su benidore: sena publitzidade, sena vigilàntzia corporativa, disignu èticu e detzentralizatzione! Sias mere de is datos tuos cun Mastodon!'
+    about_this: Informatziones
+    active_count_after: ativu
+    active_footnote: Utentes Ativos Mensiles (UAM)
+    administered_by: 'Amministradu dae:'
+    api: "*API"
+    apps: Aplicatziones mòbiles
+    apps_platforms: Imprea Mastodon dae iOS, Android e àteras prataformas
+    browse_directory: Nàviga su diretòriu de profilos e filtra segundu interessos
+    browse_local_posts: Nàviga unu flussu in direta de messàgios pùblicos de custu serbidore
+    browse_public_posts: Nàviga unu flussu in direta de messàgios pùblicos in Mastodon
+    contact: Cuntatu
+    contact_missing: No impostadu
+    contact_unavailable: No a disponimentu
+    discover_users: Iscoberi utentes
+    documentation: Documentatzione
+    federation_hint_html: Cun unu contu in %{instance} as a pòdere sighire persones in cale si siat serbidore de Mastodon o de su fediversu.
+    get_apps: Proa un'aplicatzione mòbile
+    hosted_on: Mastodon acasagiadu in %{domain}
+    instance_actor_flash: 'Custu contu est un''atore virtuale impreadu pro rapresentare su serbidore matessi, no est un''utente individuale. Benit impreadu pro punnas de federatzione e non lu dias dèpere blocare si non cheres blocare su domìniu intreu, e in cussu casu dias dèpere impreare unu blocu de domìniu.
+
+'
+    learn_more: Àteras informatziones
+    privacy_policy: Polìtica de riservadesa
+    see_whats_happening: Càstia su chi est acontessende
+    server_stats: 'Istatìsticas de su serbidore:'
+    source_code: Còdighe mitza
+    status_count_after:
+      one: istadu
+      other: istados
+    status_count_before: Autores de
+    tagline: Sighi is amigos tuos e iscoberi·nde de noos
+    terms: Cunditziones de su servìtziu
+    unavailable_content: Serbidores moderados
+    unavailable_content_description:
+      domain: Serbidore
+      reason: Resone
+      rejecting_media: 'Is documentos multimediales de custos serbidores no at a èssere protzessadu o sarvadu e peruna miniadura at a èssere ammustradas, ca tenent bisòngiu de un''incarcu manuale in su documentu originale:'
+      rejecting_media_title: Mèdios filtrados
+      silenced: 'Is messàgios dae custos serbidores ant a èssere cuados in is lìnias de tempus e is arresonadas pùblicas, e no at a èssere generada peruna notìfica dae is interatziones de is utentes, francu chi nde sias sighende:'
+      silenced_title: Serbidores a sa muda
+      suspended: 'Perunu datu de custos serbidores at a èssere protzessadu, immagasinadu o cuncambiadu; est impossìbile duncas cale si siat interatzione o comunicatzione cun is utentes de custos serbidores:'
+      suspended_title: Serbidores suspèndidos
+    unavailable_content_html: Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones chi fatas in custu serbidore particulare.
+    user_count_after:
+      one: utente
+      other: utentes
+    user_count_before: Allogiadu dae
+    what_is_mastodon: Ite est Mastodon?
+  accounts:
+    choices_html: 'Sèberos de %{name}:'
+    endorsements_hint: Podes cussigiare gente chi sighis dae s'interfache web, e at a aparèssere inoghe.
+    featured_tags_hint: Podes evidentziare etichetas ispetzìficas chi ant a èssere ammustradas inoghe.
+    follow: Sighi
+    followers:
+      one: Sighidura
+      other: Sighiduras
+    following: Sighende
+    joined: At aderidu su %{date}
+    last_active: ùrtima atividade
+    link_verified_on: Sa propiedade de custu ligàmene est istada controllada su %{date}
+    media: Elementos multimediales
+    moved_html: "%{name} est istadu trasferidu a %{new_profile_link}:"
+    network_hidden: Custa informatzione no a disponimentu
+    never_active: Mai
+    nothing_here: Nudda inoghe.
+    people_followed_by: Gente sighida dae %{name}
+    people_who_follow: Gente chi sighit a %{name}
+    pin_errors:
+      following: Depes sighire sa persone chi boles promòvere
+    posts:
+      one: Tut
+      other: Tuts
+    posts_tab_heading: Tuts
+    posts_with_replies: Tuts e rispostas
+    reserved_username: Custu nòmine de utente est giai impreadu
+    roles:
+      admin: Admin
+      bot: Bot
+      group: Grupu
+      moderator: Moderadore
+    unavailable: Su profilu no est a disponimentu
+    unfollow: Non sigas prus
+  admin:
+    account_actions:
+      action: Faghe un'atzione
+      title: Faghe un'atzione de moderatzione in %{acct}
+    account_moderation_notes:
+      create: Lassa una nota
+      created_msg: As creadu una nota de moderatzione.
+      delete: Cantzella
+      destroyed_msg: As cantzelladu una nota de moderatzione.
+    accounts:
+      add_email_domain_block: Bloca domìniu de posta eletrònica
+      approve: Aprova
+      approve_all: Aprova totus
+      approved_msg: Sa dimanda de registru de %{username} est istada aprovada
+      are_you_sure: Seguru?
+      avatar: Immàgine de profilu
+      by_domain: Domìniu
+      change_email:
+        changed_msg: As cambiadu s'indiritzu eletrònicu.
+        current_email: Indiritzu eletrònicu atuale
+        label: Muda s'indiritzu eletrònicu
+        new_email: Indiritzu de eletrònicu nou
+        submit: Muda s'indiritzu eletrònicu
+        title: Muda s'indiritzu eletrònicu de %{username}
+      confirm: Cunfirma
+      confirmed: Cunfirmadu
+      confirming: Cunfirmende
+      delete: Cantzella datos
+      deleted: Cantzelladu
+      demote: Degrada
+      destroyed_msg: Is datos de %{username} sunt a sa coa pro èssere cantzellados luego
+      disable: Disativa
+      disable_two_factor_authentication: Disativa 2FA
+      disabled: Disativadu
+      display_name: Nòmine visìbile
+      domain: Domìniu
+      edit: Modìfica
+      email: Posta eletrònica
+      email_status: Istadu de s'indiritzu eletrònicu
+      enable: Ativa
+      enabled: Ativadu
+      enabled_msg: Su contu de %{username} est istadu ativadu
+      followers: Sighiduras
+      follows: Sighende
+      header: Intestatzione
+      inbox_url: URL de intrada
+      invited_by: Invitu dae
+      ip: IP
+      joined: At aderidu
+      location:
+        all: Totus
+        local: Locale
+        remote: Remotu
+        title: Positzione
+      login_status: Istadu de atzessu
+      media_attachments: Allegados multimediales
+      memorialize: Cunverte in memoriam
+      memorialized: Memorializadu
+      memorialized_msg: As trasformadu %{username} in unu contu de ammentu
+      moderation:
+        active: Ativu
+        all: Totus
+        pending: De imbiare
+        silenced: A sa muda
+        suspended: Suspèndidu
+        title: Moderatzione
+      moderation_notes: Notas de moderatzione
+      most_recent_activity: Atividade prus reghente
+      most_recent_ip: IP prus reghente
+      no_account_selected: Perunu contu est istadu mudadu, dae chi non nd'as seletzionadu
+      no_limits_imposed: Sena lìmites
+      not_subscribed: Sena sutiscritzione
+      pending: De revisionare
+      perform_full_suspension: Suspèndidu
+      promote: Promove
+      protocol: Protocollu
+      public: Pùblicu
+      push_subscription_expires: Sa sutiscritzione PuSH iscadit
+      redownload: Atualiza su profilu
+      redownloaded_msg: Su profilu de %{username} est istadu agiornadu dae s'orìgine
+      reject: Refuda
+      reject_all: Refuda totu
+      rejected_msg: Sa dimanda de registru de %{username} est istada refudada
+      remove_avatar: Boga immàgine de profilu
+      remove_header: Boga s'intestatzione
+      removed_avatar_msg: S'immàgine de d'àvatar de %{username} est istada bogada
+      removed_header_msg: S'immàgine de intestatzione de %{username} est istada bogada
+      resend_confirmation:
+        already_confirmed: Custa persone est giai cunfirmada
+        send: Torra a imbiare messàgiu eletrònicu de cunfirmatzione
+        success: Messàgiu eletrònicu de cunfirmatzione imbiadu.
+      reset: Reseta
+      reset_password: Reseta sa crae
+      resubscribe: Torra a sutascrìere
+      role: Permissos
+      roles:
+        admin: Admin
+        moderator: Mod
+        staff: Personale
+        user: Utente
+      search: Chirca
+      search_same_email_domain: Àteras persones cun su pròpiu domìniu de posta
+      search_same_ip: Àteras persones cun sa pròpiu IP
+      sensitive: Sensìbile
+      sensitized: marcadu comente a sensìbile
+      shared_inbox_url: URL de intrada cumpartzida
+      show:
+        created_reports: Informes creados
+        targeted_reports: Informes de àtere
+      silence: Lìmita
+      silenced: Limitadas
+      statuses: Tuts
+      subscribe: Sutascrie·ti
+      suspended: Suspèndidu
+      suspension_irreversible: Is datos de custu contu sunt istados cantzellados in manera irreversìbile. Podes bogare sa suspensione a su contu pro chi si potzat impreare, ma no at a recuperare datu perunu de is chi teniat in antis.
+      suspension_reversible_hint_html: Su contu est istadu suspèndidu, e is datos ant a èssere cantzelladu de su totu su %{date}. Finas a tando, su contu si podet ripristinare sena efetu malu perunu. Si boles cantzellare totu is datos de su contu immediatamente ddu podes fàghere inoghe in bassu.
+      time_in_queue: Isetende in coa %{time}
+      title: Contos
+      unconfirmed_email: Posta eletrònica sena cunfirmare
+      undo_sensitized: Boga sa marcadura comente "sensìbile"
+      undo_silenced: Non pòngias a sa muda
+      undo_suspension: Iscontza sa suspensione
+      unsilenced_msg: As bogadu is lìmites a su contu de %{username}
+      unsubscribe: Annulla sa sutiscritzione
+      unsuspended_msg: As bogadu sa suspensione a su contu de %{username}
+      username: Nòmine utente
+      view_domain: Càstia unu resumu pro su domìniu
+      warn: Avisu
+      web: Web
+      whitelisted: Federatzione permìtida
+    action_logs:
+      action_types:
+        assigned_to_self_report: Assigna s'informe
+        change_email_user: Muda s'indiritzu eletrònicu pro s'utente
+        confirm_user: Cunfirma s'utente
+        create_account_warning: Crea un'avisu
+        create_announcement: Crea un'annùntziu
+        create_custom_emoji: Crea un'emoji personalizadu
+        create_domain_allow: Crea unu domìniu permìtidu
+        create_domain_block: Crea unu blocu de domìniu
+        create_email_domain_block: Crea unu blocu de domìniu de indiritzu de posta
+        create_ip_block: Crea una règula IP
+        demote_user: Degrada s'utente
+        destroy_announcement: Cantzella s'annùntziu
+        destroy_custom_emoji: Cantzella s'emoji personalizadu
+        destroy_domain_allow: Cantzella su domìniu permìtidu
+        destroy_domain_block: Cantzella su blocu de domìniu
+        destroy_email_domain_block: Cantzella su blocu de domìniu de s'indiritzu de posta
+        destroy_ip_block: Cantzella sa règula IP
+        destroy_status: Cantzella s'istadu
+        disable_2fa_user: Disativa 2FA
+        disable_custom_emoji: Disativa s'emoji personalizadu
+        disable_user: Disativa utente
+        enable_custom_emoji: Ativa s'emoji personalizadu
+        enable_user: Ativa utente
+        memorialize_account: Regorda su contu
+        promote_user: Promove utente
+        remove_avatar_user: Cantzella immàgine de profilu
+        reopen_report: Torra a abèrrere s'informe
+        reset_password_user: Reseta sa crae
+        resolve_report: Isorve s'informe
+        sensitive_account: Marca sos cuntenutos multimediales in su contu tuo comente sensìbile
+        silence_account: Pone custu contu a sa muda
+        suspend_account: Suspende custu contu
+        unassigned_report: Boga s'assignatzione de custu informe
+        unsensitive_account: Boga sa marcadura "sensìbiles" a is elementos multimediales in su contu tuo
+        unsilence_account: Boga custu contu de is contos a sa muda
+        unsuspend_account: Boga custu contu de is contos suspèndidos
+        update_announcement: Atualiza s'annùntziu
+        update_custom_emoji: Atualiza s'emoji personalizadu
+        update_status: Atualiza s'istadu
+      actions:
+        assigned_to_self_report: "%{name} s'est auto-assignadu s'informe %{target}"
+        change_email_user: "%{name} at mudadu s'indiritzu de posta eletrònica de s'utente %{target}"
+        confirm_user: "%{name} at cunfirmadu s'indiritzu de posta eletrònica de s'utente %{target}"
+        create_account_warning: "%{name} at imbiadu un'avisu a %{target}"
+        create_announcement: "%{name} at creadu un'annùntziu nou %{target}"
+        create_custom_emoji: "%{name} at carrigadu un'emoji nou%{target}"
+        create_domain_allow: "%{name} at permìtidu sa federatzione cun su domìniu %{target}"
+        create_domain_block: "%{name} at blocadu su domìniu %{target}"
+        create_email_domain_block: "%{name} at blocadu su domìniu de posta eletrònica %{target}"
+        create_ip_block: "%{name} at creadu una règula pro s'IP %{target}"
+        demote_user: "%{name} at degradadu s'utente %{target}"
+        destroy_announcement: "%{name} at cantzelladu s'annùntziu %{target}"
+        destroy_custom_emoji: "%{name} at cantzelladu s'emoji %{target}"
+        destroy_domain_allow: "%{name} no at permìtidu sa federatzione cun su domìniu %{target}"
+        destroy_domain_block: "%{name} at isblocadu su domìniu %{target}"
+        destroy_email_domain_block: "%{name} at isblocadu su domìniu de posta eletrònica %{target}"
+        destroy_ip_block: "%{name} at cantzelladu sa règula pro s'IP %{target}"
+        destroy_status: "%{name} at eliminadu s'istadu de %{target}"
+        disable_2fa_user: "%{name} at disativadu su rechisitu de duos fatores pro s'utente %{target}"
+        disable_custom_emoji: "%{name} at disativadu s'emoji %{target}"
+        disable_user: "%{name} at disativadu s'atzessu pro s'utente %{target}"
+        enable_custom_emoji: "%{name} at ativadu s'emoji %{target}"
+        enable_user: "%{name} at ativadu s'atzessu pro s'utente %{target}"
+        memorialize_account: "%{name} at cunvertidu su contu %{target} in una pàgina in memoriam"
+        promote_user: "%{name} at promòvidu s'utente %{target}"
+        remove_avatar_user: "%{name} at cantzelladu s'immàgine de profilu de %{target}"
+        reopen_report: "%{name} at torradu a abèrrere s'informe %{target}"
+        reset_password_user: "%{name} at restadu sa crae de s'utente %{target}"
+        resolve_report: "%{name} at isòrvidu s'informe %{target}"
+        sensitive_account: "%{name} at marcadu s'elementu multimediale de %{target} comente sensìbile"
+        silence_account: "%{name} at postu su contu de %{target} a sa muda"
+        suspend_account: "%{name} at suspèndidu su contu de %{target}"
+        unassigned_report: "%{name} at bogadu s'assignatzione de s'informe %{target}"
+        unsensitive_account: '%{name} at bogadu sa marcadura "sensìbile" a s''elementu multimediale de %{target}'
+        unsilence_account: "%{name} at postu su contu de %{target} a sa muda"
+        unsuspend_account: "%{name} at bogadu sa suspensione de su contu de %{target}"
+        update_announcement: "%{name} at atualizadu s'annùntziu %{target}"
+        update_custom_emoji: "%{name} at atualizadu s'emoji %{target}"
+        update_status: "%{name} at atualizadu s'istadu de %{target}"
+      deleted_status: "(istadu cantzelladu)"
+      empty: Perunu registru agatadu.
+      filter_by_action: Filtra pro atzione
+      filter_by_user: Filtra pro utente
+      title: Registru de controllu
+    announcements:
+      destroyed_msg: As cantzelladu s'annùntziu.
+      edit:
+        title: Modìfica s'annùntziu
+      empty: Perunu annùntziu agatadu.
+      live: In direta
+      new:
+        create: Crea un'annùntziu
+        title: Annùntziu nou
+      published_msg: As publicadu s'annùntziu.
+      scheduled_for: Programmadu pro %{time}
+      scheduled_msg: As programmadu s'annùntziu pro èssere publicadu!
+      title: Annùntzios
+      unpublished_msg: As ritiradu s'annùntziu!
+      updated_msg: As atualizadu s'annùntziu.
+    custom_emojis:
+      assign_category: Assigna a una categoria
+      by_domain: Domìniu
+      copied_msg: As creadu sa còpia locale de s'emoji
+      copy: Còpia
+      copy_failed_msg: Impossìbile fàghere una còpia locale de custu emoji
+      create_new_category: Crea una categoria noa
+      created_msg: As creadu s'emoji.
+      delete: Cantzella
+      destroyed_msg: As cantzelladu s'emoji.
+      disable: Disativa
+      disabled: Disativu
+      disabled_msg: As disativadu s'emoji
+      emoji: Emoji
+      enable: Ativa
+      enabled: Ativadu
+      enabled_msg: As ativadu s'emoji
+      image_hint: PNG de finas a 50 KB
+      list: Lista
+      listed: Listadu
+      new:
+        title: Agiunghe emoji personalizadu nou
+      not_permitted: Non tenes su permissu de fàghere custa atzione
+      overwrite: Subraiscrie
+      shortcode: Incurtzadura
+      shortcode_hint: Mìnimu 2 caràteres, isceti caràteres alfanumèricos e tratigheddos bàscios
+      title: Emojis personalizados
+      uncategorized: Sena categoria
+      unlist: Esclude de sa lista
+      unlisted: Esclùidu de sa lista
+      update_failed_msg: Impossìbile atualizare custu emoji
+      updated_msg: Emoji atualizadu
+      upload: Càrriga
+    dashboard:
+      authorized_fetch_mode: Modalidade segura
+      backlog: tareas arretradas
+      config: Cunfiguratzione
+      feature_deletions: Eliminatzione de contos
+      feature_invites: Ligàmenes de invitu
+      feature_profile_directory: Diretòriu de profilos
+      feature_registrations: Registradas
+      feature_relay: Ripetidore de federatzione
+      feature_spam_check: Anti-àliga
+      feature_timeline_preview: Pre-visualizatzione de sa lìnia de tempus
+      features: Caraterìsticas
+      hidden_service: Federatzione cun servìtzios cuados
+      open_reports: informes abertos
+      pending_tags: etichetas de revisionare
+      pending_users: persones de revisionare
+      recent_users: Persones reghentes
+      search: Chirca de testu cumpletu
+      single_user_mode: Modalidade de utente ùnicu
+      software: Programmas
+      space: Impreu de ispàtziu
+      title: Pannellu
+      total_users: persones in totale
+      trends: Tendèntzias
+      week_interactions: interatziones de custa chida
+      week_users_active: persones ativas custa chida
+      week_users_new: persones noas de custa chida
+      whitelist_mode: Modalidade de federatzione limitada
+    domain_allows:
+      add_new: Permite sa federatzione cun domìniu
+      created_msg: Sa federatzione cun su domìniu est istada permìtida
+      destroyed_msg: Sa federatzione cun su domìniu no est istada permìtida
+      undo: Non permitas sa federatzione cun su domìniu
+    domain_blocks:
+      add_new: Agiunghe blocu de domìniu nou
+      created_msg: Protzessende su blocu de domìniu
+      destroyed_msg: Su blocu de domìniu est istadu iscontzadu
+      domain: Domìniu
+      edit: Modìfica su blocu de su domìniu
+      existing_domain_block_html: As giai impostu lìmites prus astrintos a %{name}, ddu dias dèpere <a href="%{unblock_url}">isblocare</a> prima.
+      new:
+        create: Crea unu blocu
+        hint: Su blocu de domìniu no at a impedire sa creatzione de contos noos in sa base de datos, ma ant a èssere aplicados in manera retroativa mètodos de moderatzione ispetzìficos subra custos contos.
+        severity:
+          desc_html: "<strong>A sa muda</strong> at a pònnere is messàgios de custos contos comente invisìbiles a sa gente chi no ddi siat sighende. <strong>Sa suspensione</strong> at a cantzellare totu su cuntenutu de su contu, elementos multimediales e datos de profilu. Imprea <strong>Perunu</strong> si boles isceti refudare is archìvios multimediales."
+          noop: Perunu
+          silence: A sa muda
+          suspend: Suspèndidu
+        title: Blocu de domìniu nou
+      private_comment: Cummentu privadu
+      private_comment_hint: Lassa unu cummentu a subra de custa limitatzione de domìniu pro impreu internu de s'iscuadra de moderatzione.
+      public_comment: Cummentu pùblicu
+      public_comment_hint: Lassa unu cummentu pro su pùblicu generale a subra de custa limitatzione de su domìniu, si sa publicatzione de sa lista de limitatziones de domìniu est abilitada.
+      reject_media: Refuda documentos multimediales
+      reject_media_hint: Cantzellat documentos multimediales sarvados in locale e refudat iscarrigamentos in su benidore. Non rilevante pro is suspensiones
+      reject_reports: Refuda informes
+      reject_reports_hint: Iscarta informes chi benint de custu domìniu. Non rilevante pro is suspensiones
+      rejecting_media: refudende documentos multimediales
+      rejecting_reports: refudende informes
+      severity:
+        silence: a sa muda
+        suspend: suspèndidu
+      show:
+        affected_accounts:
+          one: Unu contu de sa base de datos implicadu
+          other: "%{count} contos de sa base de datos implicados"
+        retroactive:
+          silence: Boga de is contos a sa muda is contos de custu domìniu implicados
+          suspend: Boga sa suspensione de is contos de custu domìniu implicados
+        title: Iscontza su blocu de domìniu de %{domain}
+        undo: Iscontza
+      undo: Iscontza su blocu de domìniu
+      view: Bide su blocu de domìniu
+    email_domain_blocks:
+      add_new: Agiunghe noa
+      created_msg: Domìniu de posta eletrònica blocadu
+      delete: Cantzella
+      destroyed_msg: Domìniu de posta eletrònica isblocadu
+      domain: Domìniu
+      empty: Perunu domìniu de posta eletrònica blocadu.
+      from_html: dae %{domain}
+      new:
+        create: Agiunghe unu domìniu
+        title: Bloca su domìniu de posta eletrònica nou
+      title: Domìnios de posta eletrònica blocados
+    instances:
+      by_domain: Domìniu
+      delivery_available: Sa cunsigna est a disponimentu
+      known_accounts:
+        one: "%{count} contu connòschidu"
+        other: "%{count} contos connòschidos"
+      moderation:
+        all: Totus
+        limited: Limitadas
+        title: Moderatzione
+      private_comment: Cummentu privadu
+      public_comment: Cummentu pùblicu
+      title: Federatzione
+      total_blocked_by_us: Blocados dae nois
+      total_followed_by_them: Sighidos dae àtere
+      total_followed_by_us: Sighidos dae nois
+      total_reported: Informes a subra de àtere
+      total_storage: Allegados multimediales
+    invites:
+      deactivate_all: Disativa totu
+      filter:
+        all: Totus
+        available: A disponimentu
+        expired: Iscadidu
+        title: Filtru
+      title: Invitos
+    ip_blocks:
+      add_new: Crea una règula
+      created_msg: As agiuntu una règula IP noa
+      delete: Cantzella
+      expires_in:
+        '1209600': 2 chidas
+        '15778476': 6 meses
+        '2629746': 1 mese
+        '31556952': 1 annu
+        '86400': 1 die
+        '94670856': 3 annos
+      new:
+        title: Crea una règula IP noa
+      no_ip_block_selected: Peruna règula IP est istada mudada dae chi non nd'as seletzionadu
+      title: Règulas IP
+    pending_accounts:
+      title: Contos in ispera (%{count})
+    relationships:
+      title: relatziones de %{acct}
+    relays:
+      add_new: Agiunghe unu ripetidore nou
+      delete: Cantzella
+      description_html: Unu <strong>ripetidore de federatzione</strong> est unu serbidore intermediàriu chi cuncàmbiat volùmenes mannos de tuts pùblicos intre serbidores chi si connetent e bi pùblicant. <strong>Podet agiudare a serbidores minores e medianos a iscobèrrere cuntenutu de su fediversu</strong>, in manera chi is utentes locales non tèngiant bisòngiu de sighire a manu àtera gente de serbidores remotos.
+      disable: Disativa
+      disabled: Disativu
+      enable: Ativa
+      enable_hint: Si abilitadu, su serbidore tuo at a èssere sutascritu a totu is tuts pùblicos de custu ripetidore e bi at a cumintzare a imbiare totu is tuts pùblicos de custu serbidore.
+      enabled: Ativadu
+      inbox_url: URL de su ripetidore
+      pending: Isetende s'aprovatzione de su ripetidore
+      save_and_enable: Sarva e ativa
+      setup: Cunfigura una connessione cun unu ripetidore
+      signatures_not_enabled: Is ripetidores no ant a funtzionare comente si tocat si sa modalidade segura o sa modalidade a federatzione limitada sunt abilitadas
+      status: Istadu
+      title: Ripetidores
+    report_notes:
+      created_msg: As creadu sa nota de s'informe
+      destroyed_msg: As cantzelladu sa nota de s'informe
+    reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} informe"
+          other: "%{count} informes"
+      action_taken_by: Mesuras adotadas dae
+      are_you_sure: Seguru?
+      assign_to_self: Assigna a mie
+      assigned: Moderatzione assignada
+      by_target_domain: Domìniu de su contu signaladu
+      comment:
+        none: Perunu
+      created_at: Signaladu
+      mark_as_resolved: Marca comente a isòrvidu
+      mark_as_unresolved: Marcare comente a non isòrvidu
+      notes:
+        create: Agiunghe una nota
+        create_and_resolve: Isorve cun una nota
+        create_and_unresolve: Torra a abèrrere cun una nota
+        delete: Cantzella
+        placeholder: Descrie is atziones chi as pigadu o cale si siat àtera atualizatzione de importu...
+      reopen: Torra a abèrrere s'informe
+      report: 'Informe #%{id}'
+      reported_account: Contu signaladu
+      reported_by: Signaladu dae
+      resolved: Isòrvidu
+      resolved_msg: Informe isòrvidu.
+      status: Istadu
+      title: Informes
+      unassign: Boga s'assignatzione
+      unresolved: No isòrvidu
+      updated_at: Atualizadu
+    settings:
+      activity_api_enabled:
+        desc_html: Nùmeru de tuts publicados in locale, utentes ativos e registros noos in perìodos chidajolos
+        title: Pùblica istatìsticas agregadas subra s'atividade de s'utente
+      bootstrap_timeline_accounts:
+        desc_html: Imprea vìrgulas intre is nòmines de utente. Isceti is contos locales e isblocados ant a funtzionare. Su valore predefinidu cando est bòidu est totu is admins locales.
+        title: Sighidura predefinida pro persones noas
+      contact_information:
+        email: Indiritzu eletrònicu de impresa
+        username: Nòmine de utente de su cuntatu
+      custom_css:
+        desc_html: Modìfica s'aspetu cun CSS carrigadu in cada pàgina
+        title: CSS personalizadu
+      default_noindex:
+        desc_html: Ìmplicat a totu is utentes chi no apant modificadu custa cunfiguratzione
+        title: Esclude in manera predefinida is utentes dae s'inditzamentu de is motores de chirca
+      domain_blocks:
+        all: Pro totus
+        disabled: Pro nemos
+        title: Ammustra blocos de domìniu
+        users: Pro utentes locales in lìnia
+      domain_blocks_rationale:
+        title: Ammustra sa resone
+      enable_bootstrap_timeline_accounts:
+        title: Ativa s sighiduras predefinidas pro is persones noas
+      hero:
+        desc_html: Ammustradu in sa pàgina printzipale. Cussigiadu a su mancu 600x100px. Si no est cunfiguradu, at a èssere ammustradu cussu de su serbidore
+        title: Immàgine de eroe
+      mascot:
+        desc_html: Ammustrada in vàrias pàginas. Cussigiadu a su mancu 293x205px. Si no est cunfiguradu, torra a su personàgiu predefinidu
+        title: Immàgine de su personàgiu
+      peers_api_enabled:
+        desc_html: Is nòmines de domìniu chi custu serbidore at agatadu in su fediversu
+        title: Pùblica sa lista de serbidores iscobertos
+      preview_sensitive_media:
+        desc_html: Is antiprimas de ligòngios de àteros sitos web ant a ammustrare una miniadura mancari is mèdios de comunicatzione siant marcados comente a sensìbiles
+        title: Ammustra mèdios sensìbiles in sas previsualizatziones de OpenGraph
+      profile_directory:
+        desc_html: Permite a is persone de èssere iscobertas
+        title: Ativa diretòriu de profilos
+      registrations:
+        closed_message:
+          desc_html: Ammustradu in sa prima pàgina cando is registratziones sunt serradas. Podes impreare etichetas HTML
+          title: Messàgiu de registru serradu
+        deletion:
+          desc_html: Permite a chie si siat de cantzellare su contu suo
+          title: Aberi s'eliminatzione de su contu
+        min_invite_role:
+          disabled: Perunu
+          title: Permite invitos de
+      registrations_mode:
+        modes:
+          approved: Aprovatzione rechesta pro si registrare
+          none: Nemos si podet registrare
+          open: Chie si siat si podet registrare
+        title: Modu de registratzione
+      show_known_fediverse_at_about_page:
+        desc_html: Cando ativu, ammustrat in sa previsualizatzione is tuts de totu is istàntzias connòschidas. Si nono, ammustrat isceti is cuntenutos locales
+        title: Include su cuntenutu federadu in sa pàgina no autenticada de sa lìnia de tempus pùblica
+      show_staff_badge:
+        desc_html: Ammustra un'insigna de personale in sa pàgina de utente
+        title: Ammustra insigna de personale
+      site_description:
+        desc_html: Paràgrafu de introdutzione a s'API. Descrie ite rendet ispatziale custu serbidore de Mastodon e cale si siat àtera cosa de importu. Podes impreare etichetas HTML, mescamente <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
+        title: Descritzione de su serbidore
+      site_description_extended:
+        desc_html: Unu logu adatu pro publicare su còdighe de cumportamentu, règulas, diretivas e àteras caraterìsticas ispetzìficas de su serbidore tuo. Podes impreare etichetas HTML
+        title: Descritzione estèndida de su logu
+      site_short_description:
+        desc_html: Ammustradu in sa barra laterale e in is meta-etichetas. Descrie ite est Mastodon e pro ite custu serbidore est ispetziale in unu paràgrafu.
+        title: Descritzione curtza de su serbidore
+      site_terms:
+        desc_html: Podes iscriere sa tua normativa de riservadesa pròpia, cunditziones de servìtziu e àteras normas legales. Podes impreare etichetas HTML
+        title: Termes de su servìtziu personalizados
+      site_title: Nòmine de su serbidore
+      spam_check_enabled:
+        desc_html: Mastodon podet signalare in automàticu contos chi imbiant messàgios non rechestos in manera repetitiva. Bi podent èssere falsos positivos.
+        title: Automatzione anti-spam
+      thumbnail:
+        desc_html: Impreadu pro otènnere pre-visualizatziones pro mèdiu de OpenGraph e API. Cussigiadu 1200x630px
+        title: Miniadura de su serbidore
+      timeline_preview:
+        desc_html: Ammustra su ligàmene a sa lìnia de tempus pùblica in sa pàgina initziale e permite s'atzessu pro mèdiu de s'API a sa lìnia de tempus pùblica sena autenticatzione
+        title: Permite s'atzessu no autenticadu a sa lìnia de tempus pùblica
+      title: Cunfiguratzione de su logu
+      trendable_by_default:
+        desc_html: Tocat a is etichetas chi non siant istadas refudadas prima
+        title: Permite chi is etichetas divenant tendèntzia sena revisione pretzedente
+      trends:
+        desc_html: Ammustra in pùblicu is etichetas chi siant istadas revisionadas in passadu e chi oe siant in tendèntzia
+        title: Etichetas de tendèntzia
+    site_uploads:
+      delete: Cantzella s'archìviu carrigadu
+      destroyed_msg: Càrriga de su situ cantzellada.
+    statuses:
+      back_to_account: Torra a sa pàgina de su contu
+      batch:
+        delete: Cantzella
+        nsfw_off: Signala comente a non sensìbile
+        nsfw_on: Signala comente a sensìbile
+      deleted: Cantzelladu
+      failed_to_execute: Faddina in s'esecutzione
+      media:
+        title: Elementos multimediales
+      no_media: Perunu elementu multimediale
+      no_status_selected: Perunu istadu est istadu mudadu dae chi non nd'as seletzionadu
+      title: Istados de su contu
+      with_media: Cun elementos multimediales
+    tags:
+      accounts_today: Impreos ùnicos atuales
+      accounts_week: Impreos ùnicos de custa chida
+      breakdown: Detàllios de s'impreu atuale pro orìgine
+      context: Cuntestu
+      directory: In su diretòriu
+      in_directory: "%{count} in su diretòriu"
+      last_active: Ùrtima atividade
+      most_popular: Prus populares
+      most_recent: Prus reghentes
+      name: Eticheta
+      review: Revisiona s'istadu
+      reviewed: Revisionadas
+      title: Etichetas
+      trending_right_now: In tendèntzia immoe
+      unique_uses_today: "%{count} publicatziones de oe"
+      unreviewed: Sena revisionare
+      updated_msg: Cunfiguratzione de etichetas atualizada
+    title: Amministratzione
+    warning_presets:
+      add_new: Agiunghe noa
+      delete: Cantzella
+      edit_preset: Modìfica s'avisu predefinidu
+      title: Gesti is cunfiguratziones predefinidas de is avisos
+  admin_mailer:
+    new_pending_account:
+      body: Is detàllios de su contu nou sunt a suta. Podes aprovare o refudare custa rechesta.
+      subject: Contu nou de revisionare in %{instance} (%{username})
+    new_report:
+      body: "%{reporter} at signaladu %{target}"
+      body_remote: Calicunu de su domìniu %{domain} at signaladu %{target}
+      subject: Informe nou pro %{instance} (#%{id})
+    new_trending_tag:
+      body: 'S''eticheta #%{name} est in tendèntzia oe, ma non est istada revisionada in passadu. No at a èssere ammustrada in pùblicu francu chi ddu permitas; si sarvas formulàriu sena ddu modificare no ddu as a bìdere mai prus.'
+      subject: Eticheta noa de revisionare in %{instance} (#%{name})
+  aliases:
+    add_new: Crea unu nomìngiu
+    created_msg: Nomìngiu creadu. Immoe podes cumintzare a tramudare dae su contu betzu.
+    deleted_msg: Nomìngiu bogadu. Sa tràmuda dae cussu contu a custu no at a èssere prus possìbile.
+    empty: No tenes perunu nomìngiu.
+    hint_html: Si boles mudare dae un'àteru contu a custu, inoghe as a pòdere creare unu nomìngiu, chi est rechestu in antis de sighire cun sa tràmuda de is persones chi ti sighint dae su contu betzu a custu. Custa atzione est <strong>innòcua e reversìbile</strong>. <strong>Tràmuda de su contu betzu cumintzada</strong>.
+    remove: Disconnete su nomìngiu
+  appearance:
+    advanced_web_interface: Interfache web avantzada
+    advanced_web_interface_hint: 'Si impreare totu sa largària de s''ischermu, s''interfache web avantzada ti permitit de cunfigurare diversas colunnas pro bìdere meda prus informatzione in contemporànea: printzipale, notìficas, lìnia de tempus federada e cale si siat nùmeru de listas e etichetas.'
+    animations_and_accessibility: Animatziones e atzessibilidade
+    confirmation_dialogs: Diàlogos de cunfirmatzione
+    discovery: Iscoberta
+    localization:
+      body: Mastodon est bortadu in manera voluntària.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Chie si siat podet contribuire.
+    sensitive_content: Cuntenutu sensìbile
+    toot_layout: Dispositzione de is tuts
+  application_mailer:
+    notification_preferences: Muda is preferèntzias de posta
+    salutation: "%{name},"
+    settings: 'Muda is preferèntzias de posta: %{link}'
+    view: 'Visualizatzione:'
+    view_profile: Visualiza profilu
+    view_status: Ammustra s'istadu
+  applications:
+    created: Aplicatzione creada
+    destroyed: Aplicatzione cantzellada
+    invalid_url: S'URL frunidu no est curretu
+    regenerate_token: Torra a generare s'identificadore de atzessu
+    token_regenerated: Identificadore de atzessu generadu
+    warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos!
+    your_token: S'identificadore tuo de atzessu
+  auth:
+    apply_for_account: Pedi un'invitu
+    change_password: Crae
+    checkbox_agreement_html: So de acòrdiu cun is <a href="%{rules_path}" target="_blank">règulas de su serbidore</a> e is <a href="%{terms_path}" target="_blank">cunditziones de su servìtziu</a>
+    checkbox_agreement_without_rules_html: So de acòrdiu cun is <a href="%{terms_path}" target="_blank">cunditziones de su servìtziu</a>
+    delete_account: Cantzella su contu
+    delete_account_html: Si boles cantzellare su contu, ddu podes <a href="%{path}">fàghere inoghe</a>. T'amus a dimandare una cunfirmatzione.
+    description:
+      prefix_invited_by_user: "@%{name} t'at invitadu a custu serbidore de Mastodon!"
+      prefix_sign_up: Registra·ti oe a Mastodon!
+      suffix: Cun unu contu as a pòdere sighire gente, publicare e cuncambiare messàgios cun persones de cale si siat serbidore de Mastodon e àteru!
+    didnt_get_confirmation: No as retzidu su messàgiu de cunfirmatzione?
+    dont_have_your_security_key: Non tenes sa crae de seguresa tua?
+    forgot_password: Ti ses iscarèssidu de sa crae?
+    invalid_reset_password_token: Su còdighe de autorizatzione pro resetare sa crae no est vàlidu o est iscadidu. Dimanda·nde un'àteru.
+    link_to_otp: Inserta unu còdighe a duas fases dae su telèfono tuo o unu còdighe de recùperu
+    link_to_webauth: Imprea su dispositivu tuo de crae de seguresa
+    login: Intra
+    logout: Essi
+    migrate_account: Moe a unu contu diferente
+    migrate_account_html: Si boles torrare a indiritzare custu contu a un'àteru, ddu as a pòdere <a href="%{path}">fàghere inoghe</a>.
+    or_log_in_with: O intra cun
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Registru
+    registration_closed: "%{instance} no atzetat àteras persones"
+    resend_confirmation: Torra a imbiare is istrutziones de cunfirmatzione
+    reset_password: Reseta sa crae
+    security: Seguresa
+    set_new_password: Cunfigura una crae noa
+    setup:
+      email_below_hint_html: Si s'indiritzu de posta eletrònica imbeniente no est curreta, dda podes mudare inoghe e as a retzire unu messàgiu de cunfirmatzione nou.
+      email_settings_hint_html: Messàgiu de cunfirmatzione imbiadu a %{email}. Si custu indiritzu de posta eletrònica no est curretu, ddu podes mudare dae is cunfiguratziones de su contu.
+      title: Cunfiguratzione
+    status:
+      account_status: Istadu de su contu
+      confirming: Isetende chi sa posta eletrònica siat cumpletada.
+      functional: Su contu tuo est operativu.
+      pending: Sa dimanda tua est in protzessu de revisione dae su personale nostru. Podet serbire unu pagu de tempus. As a retzire unu messàgiu eletrònicu si sa dimanda est aprovada.
+      redirecting_to: Su contu tuo est inativu ca in die de oe est torrende a indiritzare a %{acct}.
+    too_fast: Mòdulu imbiadu tropu a lestru, torra a proare.
+    trouble_logging_in: Tenes problemas de atzessu?
+    use_security_key: Imprea una crae de seguresa
+  authorize_follow:
+    already_following: Ses giai sighende custu contu
+    already_requested: As giai imbiadu una dimanda de sighidura a custa persone
+    error: Faddina in sa chirca de su contu remotu
+    follow: Sighi
+    follow_request: 'As imbiadu una dimanda de sighidura a:'
+    following: 'Fatu! Immoe ses sighende:'
+    post_follow:
+      close: O, podes serrare custa ventana.
+      return: Ammustra su profilu de custa persone
+      web: Bae a su situ web
+    title: Sighi %{acct}
+  challenge:
+    confirm: Sighi
+    hint_html: "<strong>Cussìgiu:</strong> No t'amus a torrare a dimandare sa crae in s'ora imbeniente."
+    invalid_password: Sa crae no est vàlida
+    prompt: Cunfirma sa crae pro sighire
+  crypto:
+    errors:
+      invalid_key: no est una crae Ed25519 o Curve25519 vàlida
+      invalid_signature: no est una firma Ed25519 vàlida
+  date:
+    formats:
+      default: "%d %b %Y"
+      with_month_name: "%d %B %Y"
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count} o"
+      about_x_months: "%{count} me"
+      about_x_years: "%{count} an"
+      almost_x_years: "%{count} an"
+      half_a_minute: Immoe etotu
+      less_than_x_minutes: "%{count} m"
+      less_than_x_seconds: Immoe etotu
+      over_x_years: "%{count} an"
+      x_days: "%{count} d"
+      x_minutes: "%{count} m"
+      x_months: "%{count} me"
+      x_seconds: "%{count} s"
+  deletes:
+    challenge_not_passed: S'informatzione insertada no est curreta
+    confirm_password: Inserta·nche sa crae atuale pro verificare s'identidade
+    confirm_username: Iscrie su nòmine de utente tuo cunfirmare su protzedimentu
+    proceed: Cantzella su contu
+    success_msg: Contu cantzelladu
+    warning:
+      before: 'In antis de sighire, leghe custu cun atentzione:'
+      caches: Su cuntenutu chi siat istadu sarvadu in sa memòria temporànea de àteros serbidores podet sighire a esìstere
+      data_removal: Is publicatziones tuas e àteros datos ant a èssere cantzellados in manera permanente
+      email_change_html: Podes <a href="%{path}">mudare s'indiritzu tuo de posta eletrònica</a> sena cantzellare su contu
+      email_contact_html: Si no est ancora arribada, podes imbiare unu messàgiu a <a href="mailto:%{email}">%{email}</a> e dimandare agiudu
+      email_reconfirmation_html: Si no ses retzende su messàgiu de cunfirmatzione, ddu podes <a href="%{path}">torrare a dimandare</a>
+      irreversible: No as a pòdere ripristinare o torrare a ativare su contu tuo
+      more_details_html: Pro àteros detàllios, bide sa <a href="%{terms_path}">normativa de riservadesa</a>.
+      username_available: Su nòmine de utente tuo at a torrare a èssere a disponimentu
+      username_unavailable: Su nòmine de utente tuo no at a abarrare a disponimentu
+  directories:
+    directory: Diretòriu de profilos
+    explanation: Iscoberi gente segundu is interessos suos
+    explore_mastodon: Esplora %{title}
+  domain_validator:
+    invalid_domain: no est unu nòmine de domìniu vàlidu
   errors:
-    '400': The request you submitted was invalid or malformed.
-    '403': You don't have permission to view this page.
-    '404': The page you are looking for isn't here.
-    '406': This page is not available in the requested format.
-    '410': The page you were looking for doesn't exist here anymore.
-    '422': 
-    '429': Too many requests
-    '500': 
-    '503': The page could not be served due to a temporary server failure.
+    '400': Sa dimanda chi as imbiadu non fiat vàlida o non fiat curreta.
+    '403': Non tenes permissu pro bìdere custa pàgina.
+    '404': Sa pàgina chi ses chirchende no est inoghe.
+    '406': Custa pàgina no est a disponimentu in su formadu chi as pregontadu.
+    '410': Sa pàgina chi ses chirchende no esistet prus.
+    '422':
+      content: Faddina in sa verìfica de seguresa. Ses blochende is boboettos?
+      title: Faddina in sa verìfica de seguresa
+    '429': Tropu rechestas
+    '500':
+      content: Faddina dae s'ala nostra.
+      title: Custa pàgina no est curreta
+    '503': Faddina in sa trasmissione de sa pàgina pro more de una faddina temporànea de su serbidore.
+    noscript_html: Pro impreare s'aplicatzione web de Mastodon, ativa JavaScript. In alternativa, proa una de is <a href="%{apps_path}">aplicatziones nativas</a> pro Mastodon in sa prataforma tua.
+  existing_username_validator:
+    not_found: impossìbile agatare utentes locales cun cussu nòmine
+    not_found_multiple: impossìbile agatare %{usernames}
+  exports:
+    archive_takeout:
+      date: Data
+      download: Iscàrriga s'archìviu
+      hint_html: Podes dimandare un'archìviu cun is <strong>tuts tuos e is mèdias chi as carrigadu</strong>. Is datos sunt in formadu ActivityPub, leghìbile dae is programmas cumpatìbiles. Podes pregontare un'archìviu cada 7 dies.
+      in_progress: Compilende s'archìviu tuo...
+      request: Pregonta s'archìviu tuo
+      size: Mannària
+    blocks: Ses blochende
+    bookmarks: Sinnalibros
+    csv: CSV
+    domain_blocks: Blocos de domìnios
+    lists: Listas
+    mutes: Ses ponende a sa muda
+    storage: Immagasinamentu
+  featured_tags:
+    add_new: Agiunghe noa
+    errors:
+      limit: As giai evidentziadu sa cantidade màssima de etichetas
+    hint_html: "<strong>Ite sunt is etichetas in evidèntzia?</strong> Sunt ammustradas in evidèntzia in su profilu pùblicu tuo e permitint a sa gente de navigare is messàgios pùblicos tuos in cussas etichetas ispetzìficas. Sunt un'aina perfeta pro tènnere unu registru de òperas creativas o progetos longos."
+  filters:
+    contexts:
+      account: Profilos
+      home: Pàgina printzipale e listas
+      notifications: Notìficas
+      public: Lìnias de tempos pùblicas
+      thread: Arresonadas
+    edit:
+      title: Modìfica filtru
+    errors:
+      invalid_context: Cuntestu mancante o non vàlidu
+      invalid_irreversible: Su filtràgiu non reversìbile funtzionat isceti in is cuntestos printzipale o de notìficas
+    index:
+      delete: Cantzella
+      empty: Non tenes perunu filtru.
+      title: Filtros
+    new:
+      title: Agiunghe unu filtru nou
+  footer:
+    developers: Iscuadra de isvilupu
+    more: Àteru…
+    resources: Resursas
+    trending_now: Est tendèntzia immoe
+  generic:
+    all: Totus
+    changes_saved_msg: Modìficas sarvadas.
+    copy: Còpia
+    delete: Cantzella
+    no_batch_actions_available: Peruna atzione in blocu a disponimentu dae custa pàgina
+    order_by: Òrdina pro
+    save_changes: Sarva is modìficas
+    validation_errors:
+      one: Calicuna cosa ancora no est andende. Bide sa faddina in bàsciu
+      other: Calicuna cosa ancora no est andende. Bide is %{count} faddinas in bàsciu
+  html_validator:
+    invalid_markup: 'cuntenet etichetas HTML non vàlidas: %{error}'
+  identity_proofs:
+    active: Ativu
+    authorize: Eja, autoriza
+    authorize_connection_prompt: Boles autorizare custa connessione critografada?
+    errors:
+      failed: Faddina in sa connessione critografada. Torra·bi a proare dae %{provider}.
+      keybase:
+        invalid_token: Is còdighes de autorizatzione de Keybase sunt hash de firmas e depent tènnere 66 caràteres esadetzimales
+        verification_failed: Keybase non reconnoschet custu còdighe de autorizatzione che a firma de s'utente de Keybase %{kb_username}. Torra·bi a proare dae Keybase.
+      wrong_user: Impossìbile creare una proa pro %{proving} cando as fatu s'atzessu che a %{current}. Intra che a %{proving} e torra·bi a proare.
+    explanation_html: Inoghe podes collegare critograficamente is àteras identidades tuas dae àteras prataformas, che a Keybase. Custu permitit a àteras persones de t'imbiare messàgios tzifrados in cussas prataformas e de tènnere sa seguresa chi sos cuntenutos chi lis mandas benit dae tene.
+    i_am_html: So %{username} in %{service}.
+    identity: Identidade
+    inactive: Inativu
+    publicize_checkbox: 'E imbiat custu tut:'
+    publicize_toot: 'Verificadu! So %{username} in %{service}: %{url}'
+    remove: Boga sa proa dae su contu
+    removed: Proa bogada dae su contu
+    status: Istadu de verìfica
+    view_proof: Bìdere sa proa
+  imports:
+    modes:
+      merge: Uni
+      merge_long: Mantene is registros chi esistint e agiunghe·nde àteros
+      overwrite: Subraiscrie
+      overwrite_long: Sostitui is registros atuales cun cussos noos
+    preface: Podes importare datos chi as esportadu dae unu àteru serbidore, che a sa lista de sa gente chi ses sighende o blochende.
+    success: Datos carrigados; ant a èssere protzessados luego
+    types:
+      blocking: Lista de blocados
+      bookmarks: Sinnalibros
+      domain_blocking: Lista domìnios blocados
+      following: Lista de sighiduras
+      muting: Lista gente a sa muda
+    upload: Càrriga
+  in_memoriam_html: In memoriam.
+  invites:
+    delete: Disativa
+    expired: Iscadidu
+    expires_in:
+      '1800': 30 minutos
+      '21600': 6 oras
+      '3600': 1 ora
+      '43200': 12 oras
+      '604800': 1 chida
+      '86400': 1 die
+    expires_in_prompt: Mai
+    generate: Gènera ligàmene de invitu
+    invited_by: 'As retzidu unu messàgiu de invitu dae:'
+    max_uses:
+      one: 1 impreu
+      other: "%{count} impreos"
+    max_uses_prompt: Sena lìmite
+    prompt: Gènera e cumpartzi ligàmenes cun àteras persones pro dare atzessu a custu serbidore
+    table:
+      expires_at: Iscadit
+      uses: Impreos
+    title: Invita gente
+  lists:
+    errors:
+      limit: Cantidade màssima de listas cròmpida
+  media_attachments:
+    validations:
+      images_and_video: Non si podet allegare unu vìdeu in una publicatzione chi cuntenet giai immàgines
+      not_ready: Impossìbile allegare archìvios chi no siant istados protzessados in manera totale. Torra·bi a proare a pustis
+      too_many: Impossìbile allegare prus de 4 archìvios
+  migrations:
+    acct: Mòidu a
+    cancel: Annulla s'indiritzamentu
+    cancel_explanation: Si annullas s'indiritzamentu, su contu tuo at a èssere torradu a ativare, però is sighiduras chi apas tramudadu a cussu contu no ant a pòdere èssere recuperadas.
+    cancelled_msg: Indiritzamentu annulladu.
+    errors:
+      already_moved: est su pròpiu contu a su chi as giai tramudadu
+      missing_also_known_as: no est unu nomìngiu de custu countu
+      move_to_self: non podet èssere su contu atuale
+      not_found: no agatadu
+      on_cooldown: Ses in perìodu de pàusa intre una tràmuda e s'àtera
+    followers_count: Gente chi ti sighiat in su momentu de sa tràmuda
+    incoming_migrations: Tramudada dae unu contu diferente
+    incoming_migrations_html: Pro tramudare cuntenutos dae un'àteru contu a custu, prima depes <a href="%{path}">creare unu nomìngiu</a>.
+    moved_msg: Su contu tuo immoe est torrende a indiritzare a %{acct} e sa gente chi ti sighit at a èssere tramudada.
+    not_redirecting: Su contu tuo no est torrende a indiritzare a perunu àteru contu immoe.
+    on_cooldown: As tramudadu su contu tuo de reghente. Custa funtzionalidade at a torrare a èssere a disponimentu de immoe a %{count} dies.
+    past_migrations: Tràmudas pretzedentes
+    proceed_with_move: Tràmuda sa gente chi ti sighit
+    redirected_msg: Su contu tuo immoe est torrende a indiritzare a %{acct}.
+    redirecting_to: Su contu tuo est torrende a indiritzare a %{acct}.
+    set_redirect: Cunfigura s'indiritzamentu
+    warning:
+      backreference_required: Su contu nou depet èssere prima cunfiguradu pro pòdere fàghere riferimentu a custu
+      before: 'In antis de sighire, leghe custu cun atentzione:'
+      cooldown: A pustis de tramudare, ddoe at a èssere unu perìodu de pàusa in su chi no as a pòdere torrare a tramudare
+      disabled_account: A pustis, su contu atuale tuo no at a èssere prus operativu in manera cumpleta. Sende gasi, as a tènnere atzessu a s'esportatzione de datos e a sa re-ativatzione.
+      followers: Custa atzione at a tramudare totu sa gente chi ti sighit dae su contu atuale a su contu nou
+      only_redirect_html: In alternativa, podes isceti <a href="%{path}">cunfigurare un'indiritzamentu in su profilu tuo</a>.
+      other_data: Perunu àteru datu at a èssere tramudadu in automàticu
+      redirect: Su profilu de su contu atuale tuo at a èssere atualizadu cun un'avisu de indiritzamentu e at a èssere esclùidu dae is chircas
+  moderation:
+    title: Moderatzione
+  move_handler:
+    carry_blocks_over_text: Custu utente s'est tramudadu dae %{acct}, chi as blocadu.
+    carry_mutes_over_text: Custu utente s'est tramudadu dae %{acct}, chi as impostadu a sa muda.
+    copy_account_note_text: 'Custu utente s''est tramudadu dae %{acct}, custas sunt sas notas antepostas tuas chi li pertocant:'
+  notification_mailer:
+    digest:
+      action: Ammustra totu is notìficas
+      body: Custu est unu resumu de su chi ti est sutzèdidu dae sa visita ùrtima tua su %{since}
+      mention: "%{name} t'at mentovadu in:"
+      new_followers_summary:
+        one: In prus, %{count} persone noa ti sighit dae cando fias assente. Incredìbile!
+        other: In prus, %{count} persones noas ti sighint dae cando fias assente. Incredìbile!
+      subject:
+        one: "1 notìfica noa dae s'ùrtima visita tua \U0001F418"
+        other: "%{count} notìficas noas dae s'ùrtima visita tua \U0001F418"
+      title: Durante s'ausèntzia tua...
+    favourite:
+      body: "%{name} at marcadu comente a preferidu s'istadu tuo:"
+      subject: "%{name} at marcadu comente a preferidu s'istadu tuo"
+      title: Preferidu nou
+    follow:
+      body: "%{name} t'est sighende!"
+      subject: "%{name} t'est sighende"
+      title: Una sighidura noa
+    follow_request:
+      action: Gesti is rechestas de sighidura
+      body: "%{name} at rechestu de ti sighire"
+      subject: 'Sighidura in ispera: %{name}'
+      title: Rechesta de sighidura noa
+    mention:
+      action: Risponde
+      body: "%{name} t'at mentovadu in:"
+      subject: "%{name} t'at mentovadu"
+      title: Mentovu nou
+    reblog:
+      body: "%{name} at cumpartzidu s'istadu tuo:"
+      subject: "%{name} at cumpartzidu s'istadu tuo"
+      title: Cumpartzidura noa
+  notifications:
+    email_events: Eventos pro notìficas cun posta eletrònica
+    email_events_hint: 'Seletziona eventos pro is chi boles retzire notìficas:'
+    other_settings: Àteras configuratziones de notìficas
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: Mrd
+          million: M
+          quadrillion: Blr
+          thousand: m
+          trillion: Bln
+  otp_authentication:
+    code_hint: Inserta·nche su còdighe generadu dae s'aplicatzione di autenticatzione pro cunfirmare
+    description_html: Si as a abilitare <strong>s'autenticatzione in duas fases</strong> impreende un'aplicatzione de autenticatzione, pro s'intrada as a dèpere tènnere in fatu su telèfonu tuo, chi at a ingendrare getones pro ti fàghere intrare.
+    enable: Ativa
+    instructions_html: "<strong>Iscansi custu còdighe QR in s'autenticadore de Google o in un'aplicatzione TOTP simigiante in su telèfonu tuo</strong>. Dae como a in antis, cuss'aplicatzione at a ingendrare getones chi as a dèpere insertare pro pòdere fàghere s'atzessu."
+    manual_instructions: 'Si non podet iscansire su còdighe QR e tenes bisòngiu de dd''insertare manualmente, inoghe ddoe est su còdighe segretu in testu craru:'
+    setup: Cunfigura
+    wrong_code: Su còdighe insertadu no est vàlidu! S'ora de su serbidore e de su dispositivu sunt curretas?
+  pagination:
+    newer: Prus reghente
+    next: Sighi
+    older: Prus betzu
+    prev: A coa
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: As giai votadu in custu sondàgiu
+      duplicate_options: cuntenet elementos duplicados
+      duration_too_long: est tropu a tesu in su benidore
+      duration_too_short: est tropu chitzi
+      expired: Su sondàgiu est giai concruidu
+      invalid_choice: Su sèberu de votu chi as seberadu no esistet
+      over_character_limit: non podet èssere superiore a %{max} caràteres cadaunu
+      too_few_options: depet tènnere prus de un'elementu
+      too_many_options: non podet cuntènnere prus de %{max} elementos
+  preferences:
+    other: Àteru
+    posting_defaults: Valores predefinidos de publicatzione
+    public_timelines: Lìnias de tempos pùblicas
+  reactions:
+    errors:
+      limit_reached: Lìmite de reatziones diferentes cròmpidu
+      unrecognized_emoji: no est un'emoji reconnotu
+  relationships:
+    activity: Atividade de su contu
+    dormant: Firmu
+    follow_selected_followers: Sighi is persones seletzionadas
+    followers: Sighiduras
+    following: Sighende
+    invited: Invitos
+    last_active: Ùrtima atividade
+    most_recent: Prus reghentes
+    moved: Tramudadu
+    mutual: Pari-pari
+    primary: Primàriu
+    relationship: Relatzione
+    remove_selected_domains: Boga totu is sighiduras de is domìnios seletzionados
+    remove_selected_followers: Boga is sighiduras seletzionadas
+    remove_selected_follows: Non sigas prus is persones seletzionadas
+    status: Istadu de su contu
+  remote_follow:
+    acct: Inserta·nche s'utente@domìniu tuo dae su chi boles sighire custa persone
+    missing_resource: Impossìbile agatare sa rechesta de indiritzamentu URL pro su contu tuo
+    no_account_html: Non tenes ancora unu contu? Ti podes <a href='%{sign_up_path}' target='_blank'>registrare inoghe</a>
+    proceed: Cumintza a sighire
+    prompt: 'As a sighire a:'
+    reason_html: "<strong>Pro ite serbit custu?</strong> Podet èssere chi <code>%{instance}</code> non siat su serbidore aunde ses registradu, pro custu tenimus bisòngiu de ti torrare a indiritzare prima a su serbidore tuo."
+  remote_interaction:
+    favourite:
+      proceed: Sighi pro marcare che a preferidu
+      prompt: 'Boles marcare comente a preferidu custu tut:'
+    reblog:
+      proceed: Sighi pro cumpartzire
+      prompt: 'Boles cumpartzire custu tut:'
+    reply:
+      proceed: Sighi pro rispòndere
+      prompt: 'Boles rispòndere a custu tut:'
+  scheduled_statuses:
+    over_daily_limit: As superadu su lìmite de %{limit} tuts programmados pro cudda die
+    over_total_limit: As superadu su lìmite de %{limit} tuts programmados
+    too_soon: Sa data programmada depet èssere benidora
+  sessions:
+    activity: Ùrtima atividade
+    browser: Navigadore
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Navigadore disconnotu
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Navigadore Nokia S40 Ovi
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Sessione atuale
+    description: "%{browser} de %{platform}"
+    explanation: Custos sunt is navigadores web de is chi ses intradu in su contu tuo de Mastodon.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: macOS
+      other: prataforma disconnota
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Rèvoca
+    revoke_success: Sessione revocada
+    title: Sessiones
+  settings:
+    account: Contu
+    account_settings: Cunfiguratziones de su contu
+    aliases: Nomìngios de su contu
+    appearance: Aspetu
+    authorized_apps: Aplicatziones autorizadas
+    back: Torra a Mastodon
+    delete: Eliminatzione de su contu
+    development: Isvilupu
+    edit_profile: Modìfica profilu
+    export: Esportatzione de datos
+    featured_tags: Etichetas in evidèntzia
+    identity_proofs: Proas de identidade
+    import: Importatzione
+    import_and_export: Importatzione e esportatzione
+    migrate: Tràmuda de contu
+    notifications: Notìficas
+    preferences: Preferèntzias
+    profile: Profilu
+    relationships: Persones chi sighis e chi ti sighint
+    two_factor_authentication: Autenticatzione de duos fatores
+    webauthn_authentication: Craes de seguresa
+  spam_check:
+    spam_detected: Custu est un'informe automàticu. Àliga rilevada.
+  statuses:
+    attached:
+      audio:
+        one: "%{count} àudio"
+        other: "%{count} àudios"
+      description: 'Allegadu: %{attached}'
+      image:
+        one: "%{count} immàgine"
+        other: "%{count} immàgines"
+      video:
+        one: "%{count} vìdeu"
+        other: "%{count} vìdeos"
+    boosted_from_html: Cumpartzidu dae %{acct_link}
+    content_warning: 'Avisu de cuntenutu: %{warning}'
+    disallowed_hashtags:
+      one: 'cuntenet un''eticheta non permìtida: %{tags}'
+      other: 'cuntenet is etichetas non permìtidas: %{tags}'
+    errors:
+      in_reply_not_found: Ses chirchende de rispòndere a unu tut chi no esistit prus.
+    language_detection: Rileva sa limba in automàticu
+    open_in_web: Aberi in sa web
+    over_character_limit: lìmite de caràteres de %{max} superadu
+    pin_errors:
+      limit: As giai apicadu su nùmeru màssimu de tuts
+      ownership: Is tuts de àtere non podent èssere apicados
+      private: Is tuts non pùblicos non podent èssere apicados
+      reblog: Is cumpartziduras non podent èssere apicadas
+    poll:
+      total_people:
+        one: "%{count} persone"
+        other: "%{count} persones"
+      total_votes:
+        one: "%{count} votu"
+        other: "%{count} votos"
+      vote: Vota
+    show_more: Ammustra·nde prus
+    show_newer: Ammustra is prus noos
+    show_older: Ammustra is prus betzos
+    show_thread: Ammustra su tema
+    sign_in_to_participate: Cumintzat sa sessione pro partetzipare in s'arresonada
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Isceti pro chie ti sighit
+      private_long: Ammustra isceti a chie ti sighit
+      public: Pùblicu
+      public_long: Podet èssere bidu dae chie si siat
+      unlisted: Esclùidu de sa lista
+      unlisted_long: Podet èssere bidu dae chie si siat, però non podet èssere ammustradu in lìnias de tempus pùblicas
+  stream_entries:
+    pinned: Tut apicadu
+    reblogged: cumpartzidu
+    sensitive_content: Cuntenutu sensìbile
+  tags:
+    does_not_match_previous_name: non cointzidet cun su nòmine anteriore
+  terms:
+    body_html: |
+      <h2>Polìtica de riservadesa</h2>
+      <h3 id="collect">Ite informatziones collimus?</h3>
+
+      <ul>
+      <li><em>Informatziones de base de su contu</em>: Si t'as a registrare in custu serbidore, ti diant pòdere pedire de insertare unu nòmine utente, un'indiritzu de posta eletrònica e una crae de intrada. Dias pòdere insertare fintzas àteras informatziones de profilu, che a unu nòmine de ammustrare e una biografia, e carrigare un'immàgine de profilu e una de cobertedda. Su nòmine utente, cussu ammustradu, sa biografia, s'immàgine de profilu e de cobertedda sunt semper allistados in pùblicu.</li>
+      <li><em>Publicatziones, sighidores e àteras informatziones pùblicas</em>: Sa lista de is persones chi sighis est allistada in pùblicu, e sa matessi cosa balet pro is chi ti sighint. Cando imbias unu messàgiu sa data e s'ora benint sarbadas, gasi comente s'aplicatzione dae sa cale as imbiadu su messàgiu. Is messàgios diant pòdere cuntènnere cuntenutos multimediales allongiados, che a immàgines e vìdeos. Is publicatziones pùblicas e no allistadas sunt a disponimentu in abertu. Cando ammustras una publicatzione in su profilu tuo, fintzas cussa est un'informatzione a disponimentu pùblicu. Is publicatziones tuas benint imbiadas a is sighidores tuos, cosa chi a bortas bolet nàrrere chi benint intregadas a serbidores diferentes chi nde sarbant còpias in cue. Cando cantzellas publicatziones, custu acontessimentu benit imbiadu fintzas issu a is sighidores tuos. S'atzione de torrare a cumpartzire o de pònnere in is preferidos un'àtera publicatzione est semper pùblica.</li>
+      <li><em>Publicatziones diretas e pro is sighidores ebbia</em>: Totu is publicatziones benint archiviadas e protzessadas in su serbidore. Is publicatziones pro is sighidores ebbia benint intregadas a is sighidores tuos e a is utentes chi ddoe sunt mentovados in intro, e is publicatziones diretas benint intregadas isceti a is sighidores chi ddoe sunt mentovados in intro. In unos cantos casos bolet nàrrere chi benint intregados a serbidores diferentes e chi còpias issoro benint sarvadas in cue. Nois chircamus de limitare s'atzessu a custas publicatziones a is persones autorizadas ebbia, ma àteros serbidores bi diant pòdere non resessere. Pro custa resone est de importu mannu su de revisionare is serbidores a is cales faghent parte is sighidores tuos. Podes impreare un'optzione pro aprovare o refudare in manera automàtica sighidores noos in is cunfiguratziones. <em>Ammenta·ti chi is operadores de su serbidore e cale si siat serbidore chi ddos retzit podent castiare custos messàgios</em>, e chi is retzidores ddos diant pòdere sarvare faghende caturas, copiende·los o torrende·los a cumpartzire in àteras maneras. <em>Non cumpartzas peruna informatzione perigulosa impreende Mastodon.</em></li>
+      <li><em>IP e àteros metadatos</em>: Cando intras in su contu tuo sarvamus s'indiritzu IP dae su cale lu ses faghende, e fintzas su nòmine de s'aplicatzione chi impreas comente navigadore. Totu is sessiones de atzessu abertas sunt a disponimentu pro sa revisione e sa rèvoca in is cunfiguratziones tuas. S'ùrtimu indiritzu IP impreadu benit sarvadu finas a 12 meses. Diamus pòdere archiviare fintzas raportos chi includent is indiritzos IP de totu is rechestas a su serbidore nostru.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Pro ite cosas impreamus is informatziones tuas?</h3>
+
+      <p>Totu is informatziones chi collimus dae tene diat pòdere èssere impreadas in is maneras chi sighint:</p>
+
+      <ul>
+      <li>Pro frunire sa funtzionalidade de base de Mastodon. Podes interagire cun is cuntenutos de is àteras persones, e cumpartzire is tuos, isceti cando ses intradu in su contu tuo. A esèmpiu, podes sighire àteras persones pro castiare is publicatziones cumbinadas issoro in sa lìnia de tempus personalizada printzipale tua.</li>
+      <li>Pro agiudare sa moderatzione de sa comunidade, a esèmpiu cunfrontende s'indiritzu IP tuo cun àteros giai connotos pro verificare evasiones de blocos o àteras violatziones.</li>
+      <li>S'indiritzu de posta eletrònica chi as a frunire diat pòdere èssere impreadu pro t'imbiare informatziones, notìficas a pitzu de àteras persones chi ant a interagire cun is cuntenutos tuos o chi t'ant a imbiare messàgios, e pro rispòndere a interrogativos e/o àteras rechestas o preguntas.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Comente amparamus is informatziones tuas?</h3>
+
+      <p>Impreamus medidas de seguresa vàrias pro amparare sa seguresa de is informatziones personales tuas cando insertas o imbias is informatziones personales tuas, o cando b'atzedes. In paris a àteras cosas, sa sessione de su navigadore tuo, e fintzas su tràficu intre s'aplicatzione tua e s'API, benint amparados cun SSL, e sa crae tua benit tzifrada impreende un'algoritmu forte a una diretzione. Pro afortiare sa seguresa de s'atzessu a su contu tuo galu de prus podes abilitare s'autenticatzione in duos fatores.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Cale est sa polìtica nostra de archiviatzione de is datos?</h3>
+
+      <p>Amus a fàghere un'isfortzu in fide bona pro chircare de:</p>
+
+      <ul>
+      <li>Mantènnere in archìviu is raportos chi cuntenent is indiritzos IP de totu is rechestas a custu serbidore, cando cussas rechestas benint registradas, pro non prus de 90 dies.</li>
+      <li>Mantènnere in archìviu is indiritzos IP assotziados a is utentes registrados pro non prus de 12 meses.</li>
+      </ul>
+
+      <p>Podes pedire e iscarrigare un'archìviu de is cuntenutos tuos chi includet is publicatziones tuas, is elementos multimediales allongiados, s'immàgine de profilu e cussa de cobertedda.</p>
+
+      <p>Podes cantzellare su contu tuo in manera irreversìbile in cale si siat momentu.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Impreamus is testimòngios?</h3>
+
+      <p>Eja. Is testimòngios ("cookies") sunt documentos minores chi unu situ o su frunidore de servìtzios suos tramudant a su discu tèteru de s'elaboradore tuo pro mèdiu de su navigadore web tuo (si bi lu permitis). Custos testimòngios permitint a su situ de reconnòschere su navigadore tuo e, si tenes unu contu registradu, de dd'assotziare cun su contu tuo.</p>
+
+      <p>Impreamus is testimòngios pro cumprèndere e sarvare is preferèntzias tuas pro is bìsitas imbenientes.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Rivelamus carchi informatzione a tertzas partes?</h3>
+
+      <p>Non bendimus, cuncambiamus, o tramudamus in àteras maneras is informatziones tuas chi ti diant pòdere individuare in manera personale. Custu no incluit sugetos de tertzas partes fidados chi nos agiudant a amministrare su situ, fàghere is fainas nostras, o a t'agiudare, finas a cando cussos sugetos atzetant de mantènnere cunfidentziales cussas informatziones. Diamus fintzas pòdere frunire is informatziones tuas si amus a èssere cumbintos chi siat apropriadu pro sighire is leges, aplicare is polìticas de su situ nostru, e amparare is deretos, propiedades o seguresas nostros o de àteros.</p>
+
+      <p>Is cuntenutos pùblicos tuos diant pòdere èssere iscarrigados dae àteros serbidores in sa retza. Is publicatziones pùblicas e pro is sighidores ebbia benint intregadas a is serbidores in ue istant is retzidores, si istant in unu serbidore chi no est custu.</p>
+
+      <p>Cando autorizas un'aplicatzione a impreare su contu tuo, a segunda de sa mannària de is permissos chi frunis, cussa diat pòdere atzèdere a is informatziones pùblicas de profilu tuas, a sa lista de is persones chi sighis e chi ti sighint, a is listas tuas, a totu is publicatziones tuas e a is referidos tuos. Is aplicatziones non podent mai tènnere atzessu a s'indiritzu de posta eletrònica tuo e a sa crae de intrada tua.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Impreu de custu situ dae arte de pitzinnos</h3>
+
+      <p>Si custu serbidore est in s'UE o in s'ÀEE: Su situ nostru, is produtos nostros e is servìtzios nostros sunt totu cantos pensados pro persones chi tenent a su mancu 16 annos de edade. Si tenes de mancu de 16 annos, in aplicatzione de is rechisitos de su GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) no imprees custu situ.</p>
+
+      <p>Si custu serbidore est in sos IUA: Su situ nostru, is produtos e is servìtzios suos sunt totu cantos pensados pro persones chi tenent a su mancu 13 annos de edade. Si tenes de mancu de 13 annos, in aplicatzione de su COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) no imprees custu situ.</p>
+
+      <p>Is rechisidos de sa lege diant pòdere èssere diferentes si custu serbidore est in suta de un'àtera giurisditzione.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Modìficas a sa polìtica de riservadesa nostra</h3>
+
+      <p>Si amus a isseberare de cambiare sa polìtica de riservadesa nostra amus a publicare is modìficas in custa pàgina.</p>
+
+      <p>Custu documentu tenet una litzèntzia CC-BY-SA. Est istadu agiornadu s'ùrtima borta su 7 de martzu de su 2018.</p>
+
+      <p>Adatadu, in orìgine, dae sa <a href="https://github.com/discourse/discourse">Polìtica de riservadesa de Discourse</a>.</p>
+    title: "%{instance} Cunditziones de su servìtziu e polìtica de riservadesa"
+  themes:
+    contrast: Mastodon (cuntrastu artu)
+    default: Mastodon (iscuru)
+    mastodon-light: Mastodon (craru)
+  time:
+    formats:
+      default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    add: Agiunghe
+    disable: Disativa 2FA
+    disabled_success: Autenticatzione de duos fatores disativada
+    edit: Modìfica
+    enabled: Autenticatzione de duos fatores ativada
+    enabled_success: Autenticatzione de duos fatores ativada
+    generate_recovery_codes: Gènera còdighes de recùperu
+    lost_recovery_codes: Is còdighes de recùperu ti permitint de recuperare s'atzessu a su contu tuo si as a pèrdere su telèfonu tuo. Si perdes is còdighes de recùperu tuos, ddos podes torrare a ingendrare inoghe. Is còdighes betzos tuos s'ant a invalidare.
+    methods: Mètodos in duos fatores
+    otp: Aplicatzione de autenticatzione
+    recovery_codes: Còdighes de recùperu de còpia de seguridade
+    recovery_codes_regenerated: Còdighes de recùperu torrados a generare
+    recovery_instructions_html: Si una die as a pèrdere s'atzessu a su telèfonu tuo, as a pòdere impreare unu de is còdighes de recùperu inoghe in suta pro recuperare s'atzessu a su contu tuo. <strong>Cunserva is còdighes in manera segura</strong>. A esèmpiu, ddos dias pòdere imprentare e archiviare in paris a àteros documentos de importu.
+    webauthn: Craes de seguresa
+  user_mailer:
+    backup_ready:
+      explanation: As pedidu una còpia de seguresa totale de su contu de Mastodon tuo. Como est pronta pro s'iscarrigamentu!
+      subject: S'archìviu tuo est prontu pro èssere iscarrigadu
+      title: Collida dae s'archìviu
+    sign_in_token:
+      details: 'Custos sunt is detàllios de su tentativu:'
+      explanation: 'Amus rilevadu unu tentativu de identificatzione in su contu tuo dae un''indiritzu IP non reconnotu. Si fias tue, inserta su còdighe de seguresa in bàsciu in sa pàgina disafiu de identificatzione:'
+      further_actions: 'Si no fias tue, càmbia sa crae tua e ativa s''autenticatzione in duos passos in su contu tuo. Ddu podes fàghere inoghe:'
+      subject: Cunfirma su tentativu de identificatzione
+      title: Tentativu de identificatzione
+    warning:
+      explanation:
+        disable: Non podes prus intrare in su contu tuo o dd'impreare in cale si siat àtera manera, ma su profilu e is àteros datos tuos abarrant intatos.
+        sensitive: Is elementos e documentos multimediales carrigados e ligados tuos ant a èssere tratados che a sensìbiles.
+        silence: Podes ancora impreare so contu tuo, ma isceti is persones chi ti sunt giai sighende ant a bìdere is tuts tuos in custu serbidore, e dias pòdere èssere esclùdidu dae unas cantas listas pùblicas. Nointames custu, is àteros ti diant pòdere galu sighire in manera manuale.
+        suspend: Non podes prus impreare su contu tuo, e su profilu e àteros datos non sunt prus atzessìbiles. Bi podes galu intrare pro pedire una còpia de seguresa de is datos tuos finas a cando no ant a èssere cantzellados de su totu, ma nd'amus a mantènnere unos cantos pro non ti permìtere de evàdere sa suspensione.
+      get_in_touch: Podes rispòndere a custu indiritzu de posta eletrònica pro cuntatare cun su personale de %{instance}.
+      review_server_policies: Revisionat sas polìticas de su serbidore
+      statuses: 'In manera cuncreta, pro:'
+      subject:
+        disable: Su contu tuo %{acct} est istadu cungeladu
+        none: Avisu pro %{acct}
+        sensitive: Is elementos multimediales de publicatzione de su contu tuo %{acct} sunt istados marcados comente sensìbiles
+        silence: Su contu tuo %{acct} est istadu limitadu
+        suspend: Su contu tuo %{acct} est istadu suspèndidu
+      title:
+        disable: Contu congeladu
+        none: Atentzione
+        sensitive: S'elementu multimediale tuo est istadu marcadu comente sensìbile
+        silence: Contu limitadu
+        suspend: Contu suspèndidu
+    welcome:
+      edit_profile_action: Cunfigura su profilu
+      edit_profile_step: Podes personalizare su profilu tuo carrighende un'àvatar o un'intestatzione, cambiende su nòmine visìbile tuo e faghende fintzas àteru. Si boles revisionare is sighidores noos in antis chi tèngiant su permissu de ti sighire podes blocare su contu tuo.
+      explanation: Inoghe b'ant una paja de impòsitos pro cumintzare
+      final_action: Cumintza a publicare
+      final_step: 'Cumintza a publicare! Fintzas si no ti sighit nemos is àteros podent bìdere is messàgios pùblicos tuos, pro esèmpiu in sa lìnia de tempus locale e in is etichetas ("hashtags"). Ti dias pòdere bòlere introduire a sa comunidade cun s''eticheta #introductions.'
+      full_handle: Su nòmine utente intreu tuo
+      full_handle_hint: Custu est su chi dias nàrrere a is amigos tuos pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore.
+      review_preferences_action: Muda is preferèntzias
+      review_preferences_step: Ammenta·ti de impostare is preferèntzias tuas, che a is lìteras de posta eletrònicas chi boles retzire, o ite livellu de riservadesa dias bòlere chi siat predefinidu pro is messàgios tuos. Si is immàgines in movimentu non ti infadant podes isseberare de abilitare sa riprodutzione automàtica de is GIF.
+      subject: Ti donamus su benebènnidu a Mastodon
+      tip_federated_timeline: Sa lìnia de tempus federada est una vista globale de sa retza de Mastodon. Ma incluit isceti is persones sighidas dae is bighinos tuos, duncas no est totale.
+      tip_following: Pro more de is cunfiguratziones predefinidas sighis s'amministratzione de su serbidore tuo. Pro agatare àteras persones de interessu, càstia is lìnias de su tempus locale e federada.
+      tip_local_timeline: Sa lìnia de tempus locale est una vista globale de is persones in %{instance}. Custos sunt is bighinos tuos!
+      tip_mobile_webapp: Si su navigadore mòbile tuo t'oferit de agiùnghere Mastodon a s'ischermada printzipale tua podes retzire notìficas push. Funtzionat che a un'aplicatzione nativa in maneras medas!
+      tips: Impòsitos
+      title: Bene bènnidu a bordu, %{name}!
+  users:
+    blocked_email_provider: Custu frunidore de posta eletrònica no est permìtidu
+    follow_limit_reached: Non podes sighire prus de %{limit} persones
+    generic_access_help_html: Tenes problemas a intrare in su contu tuo? Podes cuntatare a %{email} pro retzire agiudu
+    invalid_email: Custu indiritzu de posta eletrònica no est vàlidu
+    invalid_email_mx: Custu indiritzu de posta eletrònica paret chi no esistat
+    invalid_otp_token: Còdighe a duas fases non vàlidu
+    invalid_sign_in_token: Còdighe de seguresa non vàlidu
+    otp_lost_help_html: Si as pèrdidu s'atzessu a ambos, podes cuntatare a %{email}
+    seamless_external_login: Ses intradu pro mèdiu de unu servìtziu esternu, e pro custa resone is impostatziones de sa crae de intrada e de posta eletrònica non sunt a disponimentu.
+    signed_in_as: 'Sessione aberta comente:'
+    suspicious_sign_in_confirmation: Paret chi tue non sias giai intradu dae custu dispositivu e non ses intradu dae unu pagu de tempus, duncas ti semus mandende unu còdighe de seguresa a s'indiritzu de posta eletrònica tuo pro cunfirmare chi ses tue.
+  verification:
+    explanation_html: 'Ti podes <strong>verificare a sa sola comente mere de is ligòngios in is metadatos de su profilu tuo</strong>. Pro ddu fàghere su situ ligadu depet cuntènnere unu ligòngiu chi torret a su profilu de Mastodon tuo. Su ligòngiu in su situ <strong>depet</strong> tènnere un''atributu <code>rel="me"</code>. Su testu cuntenutu in su ligòngiu no est de importu. Custu est un''esèmpiu:'
+    verification: Verìfica
+  webauthn_credentials:
+    add: Agiunghe una crae de seguresa noa
+    create:
+      error: Ddoe est istadu unu problema cun s'agiunta de sa crae de seguresa tua. Torra a proare.
+      success: Sa crae de seguresa tua est istada agiunta.
+    delete: Cantzella
+    delete_confirmation: Seguru chi boles cantzellare custa crae de seguresa?
+    description_html: Si permites s'<strong>autenticatzione cun crae de seguresa</strong>, as a tènnere bisòngiu de impreare una de is craes de seguresa tuas pro ti identificare.
+    destroy:
+      error: Ddoe est istadu unu problema cun sa cantzelladura de sa crae de seguresa tua. Torra a proare.
+      success: Sa crae de seguresa tua est istada cantzellada.
+    invalid_credential: Crae de seguresa non vàlida
+    nickname_hint: Inserta su nomìngiu de sa crae de seguresa tua noa
+    not_enabled: No as ativadu ancora WebAuthn
+    not_supported: Custu navigadore no est cumpatìbile cun is craes de seguresa
+    otp_required: Pro impreare is craes de seguresa depes ativare prima s'autenticatzione in duos passos.
+    registered_on: 'Registratzione: %{date}'
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 2cf27f932..181f7d504 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -126,6 +126,7 @@ ca:
         expires_in: Expira després
         fields: Metadades del perfil
         header: Capçalera
+        honeypot: "%{label} (no omplir)"
         inbox_url: URL de la safata d'entrada del relay
         irreversible: Cau en lloc d'ocultar
         locale: Llengua de la interfície
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index cb5bbb8ec..a36ad17c6 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -126,6 +126,7 @@ co:
         expires_in: Spira dopu à
         fields: Metadata di u prufile
         header: Ritrattu di cuprendula
+        honeypot: "%{label} (ùn empie micca)"
         inbox_url: URL di l'inbox di u ripetitore
         irreversible: Sguassà invece di piattà
         locale: Lingua di l'interfaccia
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 8fa7ccff8..48c2b08f8 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -126,6 +126,7 @@ de:
         expires_in: Läuft ab
         fields: Tabellenfelder
         header: Titelbild
+        honeypot: "%{label} (nicht ausfüllen)"
         inbox_url: Inbox-URL des Relais
         irreversible: Verwerfen statt verstecken
         locale: Sprache der Benutzeroberfläche
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 503adafd2..9cb84bddd 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -65,6 +65,12 @@ el:
         data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon
       invite_request:
         text: Αυτό θα μας βοηθήσει να επιθεωρήσουμε την αίτησή σου
+      ip_block:
+        comment: Προαιρετικό. Θυμηθείτε γιατί προσθέσατε αυτόν τον κανόνα.
+        severities:
+          no_access: Αποκλεισμός πρόσβασης σε όλους τους πόρους
+          sign_up_requires_approval: Νέες εγγραφές θα απαιτούν την έγκριση σας
+        severity: Επιλέξτε τι θα γίνεται με αιτήσεις από αυτήν την διεύθυνση IP
       sessions:
         otp: 'Βάλε τον κωδικό δυο παραγόντων (2FA) από την εφαρμογή του τηλεφώνου σου ή χρησιμοποίησε κάποιον από τους κωδικούς ανάκτησης σου:'
         webauthn: Αν πρόκειται για ένα κλειδί USB βεβαιωθείτε ότι είναι συνδεδεμένο και αν απαιτείται πατήστε το ελαφρά.
@@ -92,6 +98,7 @@ el:
         types:
           disable: Απενεργοποίηση
           none: Καμία ενέργεια
+          sensitive: Ευαίσθητο
           silence: Αποσιώπηση
           suspend: Αναστολή και αμετάκλητη διαγραφή στοιχείων λογαριασμού
         warning_preset_id: Χρήση προκαθορισμένης προειδοποίησης
@@ -117,6 +124,7 @@ el:
         expires_in: Λήξη μετά από
         fields: Μεταδεδομένα προφίλ
         header: Επικεφαλίδα
+        honeypot: "%{label} (μη συμπληρώνετε)"
         inbox_url: Το URL του inbox του ανταποκριτή (relay)
         irreversible: Απόρριψη αντί για κρύψιμο
         locale: Γλώσσα χρήσης
@@ -136,6 +144,7 @@ el:
         setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων
         setting_default_sensitive: Σημείωση όλων των πολυμέσων ως ευαίσθητου περιεχομένου
         setting_delete_modal: Επιβεβαίωση πριν τη διαγραφή ενός τουτ
+        setting_disable_swiping: Απενεργοποίηση κινήσεων συρσίματος
         setting_display_media: Εμφάνιση πολυμέσων
         setting_display_media_default: Προκαθορισμένο
         setting_display_media_hide_all: Απόκρυψη όλων
@@ -172,6 +181,9 @@ el:
       ip_block:
         comment: Σχόλιο
         ip: IP
+        severities:
+          no_access: Αποκλεισμός πρόσβασης
+          sign_up_requires_approval: Περιορισμός εγγραφών
         severity: Κανόνας
       notification_emails:
         digest: Αποστολή συνοπτικών email
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index 52b5409c8..16b3f7d18 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -47,6 +47,9 @@ eo:
         data: CSV-dosiero el alia Mastodon-servilo
       invite_request:
         text: Ĉi tio helpos nin revizii vian kandidatiĝon
+      ip_block:
+        severities:
+          sign_up_requires_approval: Novaj registriĝoj devigos vian aprobon
       sessions:
         otp: 'Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el viaj realiraj kodoj:'
       user:
@@ -70,6 +73,7 @@ eo:
         types:
           disable: Malebligi
           none: Fari nenion
+          sensitive: Tikla
           silence: Silentigi
           suspend: Haltigi kaj nemalfereble forigi kontajn datumojn
         warning_preset_id: Uzi antaŭagorditan averton
@@ -95,6 +99,7 @@ eo:
         expires_in: Eksvalidiĝas post
         fields: Profilaj metadatumoj
         header: Fonbildo
+        honeypot: "%{label} (ne plenigi)"
         inbox_url: URL de la ripetila enirkesto
         irreversible: Forĵeti anstataŭ kaŝi
         locale: Interfaca lingvo
@@ -108,12 +113,12 @@ eo:
         setting_advanced_layout: Ebligi altnivelan retpaĝan interfacon
         setting_aggregate_reblogs: Grupigi diskonigojn en tempolinioj
         setting_auto_play_gif: Aŭtomate ekigi GIF-ojn
-        setting_boost_modal: Montri fenestron por konfirmi antaŭ ol diskonigi mesaĝon
+        setting_boost_modal: Montri konfirman fenestron antaŭ ol diskonigi mesaĝon
         setting_crop_images: Stuci bildojn en negrandigitaj mesaĝoj al 16x9
         setting_default_language: Publikada lingvo
         setting_default_privacy: Mesaĝa videbleco
         setting_default_sensitive: Ĉiam marki aŭdovidaĵojn tiklaj
-        setting_delete_modal: Montri fenestron por konfirmi antaŭ ol forigi mesaĝon
+        setting_delete_modal: Montri konfirman fenestron antaŭ ol forigi mesaĝon
         setting_display_media: Aŭdovidaĵa montrado
         setting_display_media_default: Dekomenca
         setting_display_media_hide_all: Kaŝi ĉiujn
@@ -126,7 +131,7 @@ eo:
         setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo
         setting_theme: Reteja etoso
         setting_trends: Montri hodiaŭajn furoraĵojn
-        setting_unfollow_modal: Montri fenestron por konfirmi antaŭ ol ĉesi sekvi iun
+        setting_unfollow_modal: Montri konfirman fenestron antaŭ ol ĉesi sekvi iun
         setting_use_blurhash: Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj
         setting_use_pending_items: Malrapida reĝimo
         severity: Graveco
@@ -145,6 +150,13 @@ eo:
         comment: Komento
       invite_request:
         text: Kial vi volas aliĝi?
+      ip_block:
+        comment: Komento
+        ip: IP
+        severities:
+          no_access: Bloki atingon
+          sign_up_requires_approval: Limigi registriĝojn
+        severity: Regulo
       notification_emails:
         digest: Sendi resumajn retmesaĝojn
         favourite: Sendi retmesaĝon kiam iu stelumas vian mesaĝon
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index b109b69a8..64bf8c799 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -126,6 +126,7 @@ es-AR:
         expires_in: Vence después de
         fields: Metadatos de perfil
         header: Cabecera
+        honeypot: "%{label} (no rellenar)"
         inbox_url: Dirección web de la bandeja de entrada del relé
         irreversible: Dejar en lugar de ocultar
         locale: Idioma de la interface
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 853c572d5..5608b529c 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -126,6 +126,7 @@ es:
         expires_in: Expirar tras
         fields: Metadatos de perfil
         header: Img. cabecera
+        honeypot: "%{label} (no rellenar)"
         inbox_url: URL de la entrada de relés
         irreversible: Dejar en lugar de ocultar
         locale: Idioma
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index fff056eab..a081f81e5 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -126,6 +126,7 @@ fa:
         expires_in: تاریخ انقضا
         fields: اطلاعات تکمیلی نمایه
         header: تصویر زمینه
+        honeypot: "%{label} (پر نکنید)"
         inbox_url: نشانی صندوق ورودی رله
         irreversible: به جای پنهان‌سازی، حذف کن
         locale: زبان محیط کاربری
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 42673a640..fa90dfe55 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -126,6 +126,7 @@ fr:
         expires_in: Expire après
         fields: Métadonnées du profil
         header: Image d’en-tête
+        honeypot: "%{label} (ne pas remplir)"
         inbox_url: URL de la boîte de relais
         irreversible: Supprimer plutôt que masquer
         locale: Langue de l’interface
@@ -172,15 +173,15 @@ fr:
       featured_tag:
         name: Hashtag
       interactions:
-        must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas
-        must_be_following: Masquer les notifications des personnes que vous ne suivez pas
+        must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas
+        must_be_following: Bloquer les notifications des personnes que vous ne suivez pas
         must_be_following_dm: Bloquer les messages directs des personnes que vous ne suivez pas
       invite:
         comment: Commentaire
       invite_request:
         text: Pourquoi voulez-vous vous inscrire ?
       ip_block:
-        comment: Commenter
+        comment: Commentaire
         ip: IP
         severities:
           no_access: Bloquer l’accès
@@ -188,13 +189,13 @@ fr:
         severity: Règle
       notification_emails:
         digest: Envoyer des courriels récapitulatifs
-        favourite: Envoyer un courriel lorsque quelqu’un ajoute mes statuts à ses favoris
-        follow: Envoyer un courriel lorsque quelqu’un me suit
-        follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre
-        mention: Envoyer un courriel lorsque quelqu’un me mentionne
+        favourite: Quelqu’un ajoute mon pouet à ses favoris
+        follow: Quelqu’un vient de me suivre
+        follow_request: Quelqu’un demande à me suivre
+        mention: Quelqu’un me mentionne
         pending_account: Nouveau compte en attente d’approbation
-        reblog: Quelqu’un a partagé votre pouet
-        report: Envoyer un courriel lorsqu’un nouveau rapport est soumis
+        reblog: Quelqu’un partage mon pouet
+        report: Un nouveau rapport est envoyé
         trending_tag: Un hashtag non approuvé est dans les tendances
       tag:
         listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 5a277e665..e9a33cd0d 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -56,7 +56,7 @@ gl:
         domain: Este dominio estará en disposición de obter datos desde este servidor e datos de entrada a el poderán ser procesados e gardados
       email_domain_block:
         domain: Esto pode ser o nome de dominio que aparece no enderezo do correo, o rexistro MX que resolve o dominio, ou o IP do servidor que resolve o rexistro MX. Estos confrontaranse contra o rexistro da usuaria e o rexistro será rexeitado.
-        with_dns_records: Vaise facer un intento de resolver os rexistros DNS propocionados e os resultados tamén irán a lista negra
+        with_dns_records: Vaise facer un intento de resolver os rexistros DNS proporcionados e os resultados tamén irán a lista de bloqueo
       featured_tag:
         name: 'Poderías usar algunha destas:'
       form_challenge:
@@ -98,11 +98,11 @@ gl:
         text: Aviso personalizado
         type: Acción
         types:
-          disable: Desactivar conexión
-          none: Non facer nada
+          disable: Desactivar
+          none: Enviar un aviso
           sensitive: Sensible
-          silence: Acalar
-          suspend: Suspender e eliminar irreversiblemente datos da conta
+          silence: Limitar
+          suspend: Suspender
         warning_preset_id: Utilizar un aviso preestablecido
       announcement:
         all_day: Evento para todo o día
@@ -126,6 +126,7 @@ gl:
         expires_in: Caduca tras
         fields: Metadatos do perfil
         header: Cabeceira
+        honeypot: "%{label} (non completar)"
         inbox_url: URL da caixa de entrada do repetidor
         irreversible: Soltar en lugar de agochar
         locale: Idioma da interface
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 388aacca0..276a3a1b4 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -126,6 +126,7 @@ hu:
         expires_in: Elévül
         fields: Profil metaadatok
         header: Fejléc
+        honeypot: "%{label} (ne töltsd ki)"
         inbox_url: Relé inbox-hoz tartozó URL
         irreversible: Eldobás elrejtés helyett
         locale: Felhasználói felület nyelve
diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml
index 2b1033308..84c6322ad 100644
--- a/config/locales/simple_form.hy.yml
+++ b/config/locales/simple_form.hy.yml
@@ -66,6 +66,7 @@ hy:
       invite_request:
         text: Սա կօգնի մեզ ստուգել քո յաւելուածը
       ip_block:
+        expires_in: IP հասցէները սահմանափակ են, դրանք երբեմն օգտագործուում են ընդհանուր կամ անցնում ձեռքից ձեռք։ Այդ պատճառով խորհուրդ չի տրւում IP-ների անժամկետ արգելափակումը։
         ip: Ներմուծէք IPv4 կամ IPv6 հասցէն։ Նաև կարող ես արգելափակել հասցէների միջակայքեր օգտագործելով CIDR սինտաքսը։ Զգոյշ եղիր՝ ինքդ քեզ չարգելափակես։
       sessions:
         otp: Մուտքագրիր երկքայլ նոյնականացման կոդը, որը գեներացուես ես քո բջջային յաւելուածի օգնութեամբ կամ օգտագործիր այս կոդերից կէկը՝
@@ -93,6 +94,7 @@ hy:
         types:
           disable: Փակել մուտքը
           none: Ոչինչ չանել
+          sensitive: Զգայուն
           silence: Լուռ
           suspend: Արգելափակել եւ անվերադարձ ջնջել հաշուի ամբողջ ինֆորմացիան
         warning_preset_id: Օգտագործել զգուշացնող նախադիր
@@ -118,6 +120,7 @@ hy:
         expires_in: Սպառուում է
         fields: Հաշուի մետադատա
         header: Վերնագիր
+        honeypot: "%{label} (չլրացնել)"
         inbox_url: Ներմուծման շերտի URL
         irreversible: Թաքցնելու փոխարէն ջնջել
         locale: Ինտերֆեյսի լեզու
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index c15907f05..0ae63f356 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -126,6 +126,7 @@ id:
         expires_in: Kedaluwarsa setelah
         fields: Metadata profil
         header: Tajuk
+        honeypot: "%{label} (jangan diisi)"
         inbox_url: URL kotak relai
         irreversible: Hapus alih-alih sembunyikan
         locale: Bahasa
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index 4c1f0ce93..6e64f0478 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -126,6 +126,7 @@ is:
         expires_in: Rennur út eftir
         fields: Lýsigögn notandasniðs
         header: Síðuhaus
+        honeypot: "%{label} (ekki fylla út)"
         inbox_url: URL-slóð á innhólf endurvarpa
         irreversible: Fella niður í staðinn fyrir að fela
         locale: Tungumál viðmóts
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index a0c3f0057..cc660fd8d 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -126,6 +126,7 @@ it:
         expires_in: Scade dopo
         fields: Metadati del profilo
         header: Intestazione
+        honeypot: "%{label} (non compilare)"
         inbox_url: URL della inbox del ripetitore
         irreversible: Elimina invece di nascondere
         locale: Lingua dell'interfaccia
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index b6b3b40a2..18f60dd9e 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -126,6 +126,7 @@ ko:
         expires_in: 만료시각
         fields: 프로필 메타데이터
         header: 헤더
+        honeypot: "%{label} (채우지 마시오)"
         inbox_url: 릴레이 서버의 inbox URL
         irreversible: 숨기는 대신 삭제
         locale: 인터페이스 언어
diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml
index 2a0cdc66b..8ff8a5a46 100644
--- a/config/locales/simple_form.ku.yml
+++ b/config/locales/simple_form.ku.yml
@@ -100,6 +100,7 @@ ku:
         types:
           disable: بەستن
           none: ناردنی ئاگاداری
+          sensitive: هەستیار
           silence: سنوور
           suspend: ڕاگرتن
         warning_preset_id: بەکاهێنانی ئاگاداری پێش وەختە
diff --git a/config/locales/simple_form.ml.yml b/config/locales/simple_form.ml.yml
index df04a15e8..c60cd9699 100644
--- a/config/locales/simple_form.ml.yml
+++ b/config/locales/simple_form.ml.yml
@@ -14,3 +14,7 @@ ml:
         acct: പഴയ അംഗത്വത്തിലേക്കുള്ള പിടി
       account_migration:
         acct: പുതിയ അംഗത്വത്തിലേക്കുള്ള പിടി
+      defaults:
+        email: ഇ-മെയിൽ വിലാസം
+      notification_emails:
+        follow: ആരോ നിങ്ങളെ പിന്തുടർന്നു
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 454180007..41dc2f28b 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -65,6 +65,10 @@ nl:
         data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd
       invite_request:
         text: Dit helpt ons om jouw aanvraag te beoordelen
+      ip_block:
+        comment: Optioneel. Vergeet niet te onthouden waarom je deze regel hebt toegevoegd.
+        severities:
+          sign_up_requires_approval: Nieuwe registraties vereisen jouw goedkeuring
       sessions:
         otp: 'Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes:'
       tag:
@@ -91,6 +95,7 @@ nl:
         types:
           disable: Bevriezen
           none: Waarschuwing sturen
+          sensitive: Gevoelig
           silence: Beperken
           suspend: Opschorten en onomkeerbaar accountgegevens verwijderen
         warning_preset_id: Gebruik een voorinstelling van een waarschuwing
@@ -116,6 +121,7 @@ nl:
         expires_in: Vervalt na
         fields: Metadata profiel
         header: Omslagfoto
+        honeypot: "%{label} (niet invullen)"
         inbox_url: Inbox-URL van de relayserver
         irreversible: Verwijderen in plaats van verbergen
         locale: Taal van de gebruikersomgeving
@@ -135,6 +141,7 @@ nl:
         setting_default_privacy: Standaardzichtbaarheid van jouw toots
         setting_default_sensitive: Media altijd als gevoelig markeren
         setting_delete_modal: Vraag voor het verwijderen van een toot een bevestiging
+        setting_disable_swiping: Swipebewegingen uitschakelen
         setting_display_media: Mediaweergave
         setting_display_media_default: Standaard
         setting_display_media_hide_all: Alles verbergen
@@ -167,7 +174,14 @@ nl:
       invite:
         comment: Opmerking
       invite_request:
-        text: Waarom wil jij je aanmelden?
+        text: Waarom wil je je hier registreren?
+      ip_block:
+        comment: Opmerking
+        ip: IP
+        severities:
+          no_access: Toegang blokkeren
+          sign_up_requires_approval: Registraties beperken
+        severity: Regel
       notification_emails:
         digest: Periodiek e-mails met een samenvatting versturen
         favourite: Wanneer iemand jouw toot aan hun favorieten heeft toegevoegd
@@ -187,4 +201,7 @@ nl:
     required:
       mark: "*"
       text: vereist
+    title:
+      sessions:
+        webauthn: Gebruik een van uw beveiligingssleutels om in te loggen
     'yes': Ja
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index b6e6ee66f..28dfd05d8 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -126,6 +126,7 @@ oc:
         expires_in: Expira aprèp
         fields: Metadonada del perfil
         header: Bandièra
+        honeypot: "%{label} (emplenar pas)"
         inbox_url: URL de la bóstia de recepcion del relai
         irreversible: Suprimir allòc de rescondre
         locale: Lenga de l’interfàcia
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 4f71f974c..865b26d91 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -126,6 +126,7 @@ pl:
         expires_in: Wygaśnie po
         fields: Metadane profilu
         header: Nagłówek
+        honeypot: "%{label} (nie wypełniaj)"
         inbox_url: Adres skrzynki przekaźnika
         irreversible: Usuwaj zamiast ukrywać
         locale: Język interfejsu
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index c4819484f..bc1dc0d12 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -67,7 +67,7 @@ pt-BR:
         text: Isso vai nos ajudar a revisar sua aplicação
       ip_block:
         comment: Opcional. Lembrar de por que você adicionou esta regra.
-        expires_in: Endereços IP são um recurso limitado, algumas vezes são compartilhados e muitas vezes mudam de mãos. Por essa razão, blocos de IP indefinidos não são recomendados.
+        expires_in: Endereços IP são um recurso limitado, algumas vezes são compartilhados e muitas vezes mudam de mãos. Por esse motivo, blocos de IP indefinidos não são recomendados.
         ip: Digite um endereço IPv4 ou IPv6. Você pode bloquear intervalos inteiros usando a sintaxe CIDR. Tenha cuidado para não bloquear a si mesmo!
         severities:
           no_access: Bloquear o acesso a todos os recursos
@@ -126,6 +126,7 @@ pt-BR:
         expires_in: Expira em
         fields: Metadados do perfil
         header: Cabeçalho
+        honeypot: "%{label} (não preencher)"
         inbox_url: Link da caixa de entrada do repetidor
         irreversible: Ignorar ao invés de ocultar
         locale: Idioma da interface
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 3c0bf994b..6cd5511eb 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -126,6 +126,7 @@ pt-PT:
         expires_in: Expira em
         fields: Meta-dados de perfil
         header: Cabeçalho
+        honeypot: "%{label} (não preencher)"
         inbox_url: URL da caixa de entrada do repetidor
         irreversible: Expandir em vez de esconder
         locale: Idioma
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 40003b1ac..ad9fc3323 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -126,6 +126,7 @@ ru:
         expires_in: Истекает через
         fields: Метаданные профиля
         header: Шапка
+        honeypot: "%{label} (не заполнять)"
         inbox_url: URL для входящих от ретрансляторов
         irreversible: Удалять, а не скрывать
         locale: Язык интерфейса
diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml
index 91bd6d92f..99d5ab429 100644
--- a/config/locales/simple_form.sc.yml
+++ b/config/locales/simple_form.sc.yml
@@ -1 +1,213 @@
+---
 sc:
+  simple_form:
+    hints:
+      account_alias:
+        acct: Dislinda su nòmineutente@domìniu de su contu dae su cale ti boles mòere
+      account_migration:
+        acct: Dislinda su nòmineutente@domìniu de su contu cara a su cale ti boles mòere
+      account_warning_preset:
+        text: Podes impreare sa sintassi de is tuts, che a is URL, is etichetas e is mentovos
+        title: Optzionale. Invisìbile a s'àtera persone
+      admin_account_action:
+        include_statuses: S'utente at a bìdere is tuts chi ant causadu s'atzione o s'avisu de moderatzione
+        send_email_notification: S'utente at a retzire un'ispiegatzione de su chi siat sutzèdidu in su contu suo
+        text_html: Optzionale. Podes impreare sa sintassi de is tuts. Podes <a href="%{path}">agiùnghere avisos pre-impostados</a> pro risparmiare tempus
+        type_html: Sèbera ite fàghere cun <strong>%{acct}</strong>
+        warning_preset_id: Optzionale. Podes ancora agiùnghere testu personalizadu a s'acabu de cussu predefinidu
+      announcement:
+        all_day: Si est marcadu, ant a èssere ammustradas isceti is datas de s'intervallu de tempus
+        ends_at: Optzionale. S'annùntziu at a acabbare de abarrare publicadu in custu momentu
+        scheduled_at: Lassa bòidu pro publicare s'annùntziu immediatamente
+        starts_at: Optzionale. S'in casu chi s'annùntziu tuo siat ligadu a un'intervallu de tempus ispetzìficu
+        text: Podes impreare sa sintassi de is tuts. Dae cara a su tretu chi s'annùntziu at a pigare in s'ischermu de s'utente
+      defaults:
+        autofollow: Is persones chi s'ant a registrare pro mèdiu de s'invitu t'ant a sighire in manera automàtica
+        avatar: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px
+        bot: Custu contu faghet pro su prus atziones automatizadas e diat pòdere no èssere monitoradu
+        context: Unu o prus cuntestos in ue su filtru si diat dèpere aplicare
+        current_password: Pro chistiones de seguresa inserta sa crae de intrada de su contu atuale
+        current_username: Pro cunfirmare inserta su nòmine utente de su contu atuale
+        digest: Imbiadu isceti a pustis de unu perìodu longu de inatividade, e isceti si as retzidu carchi messàgiu personale cando non bi fias
+        discoverable: Sa cartella de is profilos est un'àtera manera pro fàghere otènnere unu pùblicu prus mannu a su contu tuo
+        email: T'amus a mandare unu messàgiu eletrònicu de cunfirma
+        fields: Podes tènnere finas a 4 elementos ammustrados in una tabella in su profilu tuo
+        header: PNG, GIF o JPG. Màssimu %{size}. Ant a èssere iscaladas a %{dimensions}px
+        inbox_url: Còpia s'URL dae sa pàgina printzipale de su ripetidore chi boles impreare
+        irreversible: Is tuts filtrados ant a isparèssere in manera irreversìbile, fintzas si prus a tardu s'at a bogare su filtru
+        locale: Sa limba de s'interfache de s'utente, de is lìteras de posta eletrònica e de is notìficas push
+        locked: Tenet bisòngiu chi aproves a manu is sighiduras
+        password: Imprea a su mancu 8 caràteres
+        phrase: Su cunfrontu s'at a fàghere chena pigare in cunsideru si su testu de sa publicatzione est minùsculu o majùsculu o si tenet un'avisu de cuntenutu
+        scopes: A ite API s'aplicatzione at a pòdere atzèdere. Si seletziones un'àmbitu de livellu artu no tenes bisòngiu de nde seletzionare de sìngulos.
+        setting_aggregate_reblogs: No ammustres cumpartziduras noas pro tuts chi sunt istados cumpartzidos dae pagu (tenet efetu isceti pro is cumpartziduras retzidas noas)
+        setting_default_sensitive: Is elementos multimediales sensìbiles benint cuados dae is cunfiguratziones predefinidas e si podent rivelare cun un'incarcu
+        setting_display_media_default: Cua elementos multimediales marcados comente sensìbiles
+        setting_display_media_hide_all: Cua semper is elementos multimediales
+        setting_display_media_show_all: Ammustra semper is elementos multimediales
+        setting_hide_network: Sa gente chi sighis o chi ti sighit no at a èssere ammustrada in su profilu tuo
+        setting_noindex: Tenet efetu in su profilu pùblicu tuo e in is pàginas de is istados
+        setting_show_application: S'aplicatzione chi impreas pro publicare tuts at a èssere ammustrada in sa visualizatzione de detàlliu de is tuts
+        setting_use_blurhash: Is gradientes sunt basados in subra de is colores de is immàgines cuadas ma imbelant totu is minujas
+        setting_use_pending_items: Cua is atualizatziones in segus de un'incarcu imbetzes de iscùrrere in automàticu su flussu de publicatziones
+        username: Su nòmine de utente tuo at a èssere ùnicu in %{domain}
+        whole_word: Cando sa paràula o sa fràsia crae est alfanumèrica ebbia s'at a aplicare isceti si currispondet a sa paràula intrea
+      domain_allow:
+        domain: Custu domìniu at a pòdere recuperare datos dae custu serbidore e is datos in intrada dae cue ant a èssere protzessados e archiviados
+      email_domain_block:
+        domain: Custu podet èssere su nòmine de domìniu chi benit ammustradu in s'indiritzu de posta eletrònica, in su registru MX in ue si risolvet su domìniu o s'IP de su serbidore in ue si risolvet su registru MX. Custos ant a èssere verificados a pustis de sa registratzione e sa registratzione at a èssere refudada.
+        with_dns_records: S'at a fàghere unu tentativu de risòlvere is registros DNS de su domìniu e fintzas is risultados ant a èssere blocados
+      featured_tag:
+        name: 'Forsis boles impreare unu de custos:'
+      form_challenge:
+        current_password: Ses intrende in un'àrea segura
+      imports:
+        data: Archìviu CSV esportadu dae un'àteru serbidore de Mastodon
+      invite_request:
+        text: Custu si at a agiudare a revisionare sa dimanda tua
+      ip_block:
+        comment: Optzionale. Regorda pro ite as agiuntu custa règula.
+        expires_in: Is indiritzos IP sunt una risursa limitada, fatu-fatu benint cumpartzidos e podent mudare de mere. Pro custa resone is blocos indefinidos de indiritzos IP non sunt racumandados.
+        ip: Inserta un'indiritzu IPv4 o IPv6. Podes blocare intervallos intreos impreende sa sintassi CIDR. Dae cara e non ti bloches a sa sola!
+        severities:
+          no_access: Bloca s'atzessu a totu is resursas
+          sign_up_requires_approval: As a dèpere aprovare is iscritziones noas
+        severity: Sèbera ite at a sutzèdere cun is rechestas de custa IP
+      sessions:
+        otp: 'Inserta su còdighe de atzessu in duos passos generadu dae s''aplicatzione mòbile tua o imprea unu de custos còdighes de recùperu:'
+        webauthn: Si est una crae USB assegura·ti de l'insertare e, si serbit, de la tocare.
+      tag:
+        name: Podes isceti cambiare su minùsculu/maiùsculu de is lìteras, a esèmpiu, pro fàghere in manera chi siant prus fàtziles de lèghere
+      user:
+        chosen_languages: Cando est incarcadu, isceti is tuts in is limbas ischertadas ant a èssere ammustrados in is lìnias de tempus pùblicas
+    labels:
+      account:
+        fields:
+          name: Eticheta
+          value: Cuntenutu
+      account_alias:
+        acct: Nòmine utente de su contu betzu
+      account_migration:
+        acct: Nòmine utente de su contu nou
+      account_warning_preset:
+        text: Testu predefinidu
+        title: Tìtulu
+      admin_account_action:
+        include_statuses: Include is tuts sinnalados in sa lìtera eletrònica
+        send_email_notification: Notìfica s'utente pro mèdiu de posta eletrònica
+        text: Avisu personalizadu
+        type: Atzione
+        types:
+          disable: Disativa
+          none: Imbia un'avisu
+          sensitive: Sensìbile
+          silence: A sa muda
+          suspend: Suspende
+        warning_preset_id: Imprea un'avisu predefinidu
+      announcement:
+        all_day: Eventu de totu sa die
+        ends_at: Fine de s'eventu
+        scheduled_at: Programma sa publicatzione
+        starts_at: Cumintzu de s'eventu
+        text: Annùntziu
+      defaults:
+        autofollow: Invita a sighire su contu tuo
+        avatar: Immàgine de profilu
+        bot: Custu contu est unu bot
+        chosen_languages: Filtra limbas
+        confirm_new_password: Cunfirma sa crae noa
+        confirm_password: Cunfirma sa crae
+        context: Filtra cuntestos
+        current_password: Crae atuale
+        data: Data
+        discoverable: Ammustra custu contu in su diretòriu
+        display_name: Nòmine visìbile
+        email: Indiritzu de posta eletrònica
+        expires_in: Iscadit a pustis de
+        fields: Metadatos de su profilu
+        header: Intestatzione
+        honeypot: "%{label} (non compiles)"
+        inbox_url: URL de sa cartella de intrada de su ripetidore
+        irreversible: Cantzella imbetzes de cuare
+        locale: Limba de s'interfache
+        locked: Bloca su contu
+        max_uses: Nùmeru màssimu de impreos
+        new_password: Crae noa
+        note: Biografia
+        otp_attempt: Còdighe in duos fatores
+        password: Crae
+        phrase: Paràula o fràsia crae
+        setting_advanced_layout: Abìlita s'interfache web avantzada
+        setting_aggregate_reblogs: Agrupa is cumpartziduras in is lìnias de tempus
+        setting_auto_play_gif: Riprodui is GIFs animadas in manera automàtica
+        setting_boost_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cumpartzire
+        setting_crop_images: Retàllia is immàgines in is tuts no ismanniados a 16x9
+        setting_default_language: Limba de publicatzione
+        setting_default_privacy: Riservadesa de publicatzione
+        setting_default_sensitive: Marca semper is elementos multimediales comente sensìbiles
+        setting_delete_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de cantzellare unu tut
+        setting_disable_swiping: Disabìlita is movimentos de trisinadura
+        setting_display_media: Visualizatzione de is elementos multimediales
+        setting_display_media_default: Predefinida
+        setting_display_media_hide_all: Cua totu
+        setting_display_media_show_all: Ammustra totu
+        setting_expand_spoilers: Ismànnia semper is tuts marcados cun avisos de cuntenutu
+        setting_hide_network: Cua sa retza tua
+        setting_noindex: Pedi de non ti fàghere inditzizare dae is motores de chirca
+        setting_reduce_motion: Mìnima su movimentu in is animatziones
+        setting_show_application: Rivela s'aplicatzione impreada pro imbiare tuts
+        setting_system_font_ui: Imprea su caràtere predefinidu de su sistema
+        setting_theme: Tema de su situ
+        setting_trends: Ammustra is tendèntzias de oe
+        setting_unfollow_modal: Ammustra una ventanedda de diàlogu de cunfirma in antis de acabbare de sighire a calicunu
+        setting_use_blurhash: Ammustra gradientes colorados pro is elementos multimediales cuados
+        setting_use_pending_items: Modalidade lenta
+        severity: Severidade
+        sign_in_token_attempt: Còdighe de seguresa
+        type: Casta de importatzione
+        username: Nòmine utente
+        username_or_email: Nòmine utente o indiritzu de posta eletrònica
+        whole_word: Paràula intrea
+      email_domain_block:
+        with_dns_records: Include registros MX e indiritzos IP de su domìniu
+      featured_tag:
+        name: Eticheta
+      interactions:
+        must_be_follower: Bloca is notìficas dae chie non ti sighit
+        must_be_following: Bloca is notìficas dae persones chi non sighis
+        must_be_following_dm: Bloca is messàgios diretos dae persones chi non sighis
+      invite:
+        comment: Cummenta
+      invite_request:
+        text: Proite ti cheres iscrìere?
+      ip_block:
+        comment: Cummentu
+        ip: IP
+        severities:
+          no_access: Bloca s'atzessu
+          sign_up_requires_approval: Lìmita is registratziones
+        severity: Règula
+      notification_emails:
+        digest: Imbia lìteras eletrònicas de resumu
+        favourite: Calicunu at postu s'istadu tuo in is preferidos suos
+        follow: Calicunu at incumentzadu a ti sighire
+        follow_request: Calicunu at pedidu de ti sighire
+        mention: Calicunu t'at mentovadu
+        pending_account: Unu contu nou bisòngiat de una revisione
+        reblog: Calicunu at cumpartzidu s'istadu tuo
+        report: Est istadu imbiadu unu raportu nou
+        trending_tag: Un'eticheta non revisionada est in tendèntzia
+      tag:
+        listable: Permite a cust'eticheta de apàrrere in is chircas e in sa cartella de is profilos
+        name: Eticheta
+        trendable: Permite a cust'eticheta de apàrrere in is tendèntzias
+        usable: Permite a is tuts de impreare cust'eticheta
+    'no': Nono
+    recommended: Racumandadu
+    required:
+      mark: "*"
+      text: netzessàriu
+    title:
+      sessions:
+        webauthn: Imprea una de is craes de seguresa tuas pro intrare
+    'yes': Eja
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index 1b2a2e7fd..f00030ccf 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -126,6 +126,7 @@ sq:
         expires_in: Skadon pas
         fields: Tejtëdhëna profili
         header: Krye
+        honeypot: "%{label} (mos plotësoni gjë këtu)"
         inbox_url: URL e Të marrëve të relesë
         irreversible: Heqje, në vend se fshehje
         locale: Gjuhë ndërfaqeje
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index 7c7eae49c..0bfcd8fca 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -73,6 +73,7 @@ sv:
         expires_in: Förfaller efter
         fields: Profil-metadata
         header: Bakgrundsbild
+        honeypot: "%{label} (fyll inte i)"
         locale: Språk
         locked: Lås konto
         max_uses: Högst antal  användningar
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index 514500e49..0e2187c5a 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -91,10 +91,11 @@ th:
         text: คำเตือนที่กำหนดเอง
         type: การกระทำ
         types:
-          disable: แช่แข็ง
-          none: ไม่ทำสิ่งใด
-          silence: ทำให้เงียบ
-          suspend: ระงับและลบข้อมูลบัญชีอย่างถาวร
+          disable: อายัด
+          none: ส่งคำเตือน
+          sensitive: ละเอียดอ่อน
+          silence: จำกัด
+          suspend: ระงับ
         warning_preset_id: ใช้คำเตือนที่ตั้งไว้ล่วงหน้า
       announcement:
         all_day: เหตุการณ์ตลอดทั้งวัน
@@ -137,6 +138,7 @@ th:
         setting_default_privacy: ความเป็นส่วนตัวของการโพสต์
         setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ
         setting_delete_modal: แสดงกล่องโต้ตอบการยืนยันก่อนลบโพสต์
+        setting_disable_swiping: ปิดใช้งานการเคลื่อนไหวในการปัด
         setting_display_media: การแสดงสื่อ
         setting_display_media_default: ค่าเริ่มต้น
         setting_display_media_hide_all: ซ่อนทั้งหมด
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 8653085c4..834a22207 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -126,6 +126,7 @@ tr:
         expires_in: Bitiş tarihi
         fields: Profil meta verisi
         header: Kapak resmi
+        honeypot: "%{label} (doldurmayın)"
         inbox_url: Aktarıcı gelen kutusunun URL'si
         irreversible: Gizlemek yerine bırak
         locale: Arayüz dili
diff --git a/config/locales/simple_form.tt.yml b/config/locales/simple_form.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales/simple_form.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index 98154ce58..b9b15cc0e 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -10,7 +10,7 @@ vi:
         text: Bạn có thể dùng URL, hashtag và nhắc đến
         title: Tùy chọn. Không cho người nhận xem
       admin_account_action:
-        include_statuses: Người dùng sẽ thấy các tút bị kiểm duyệt
+        include_statuses: Người dùng sẽ thấy các tút nào của họ bị kiểm duyệt
         send_email_notification: Người dùng sẽ nhận được lời giải thích về những gì xảy ra với tài khoản của họ
         text_html: Tùy chọn. Bạn nên dùng <a href="%{path}">cảnh cáo cài sẵn</a> để tiết kiệm thời gian
         type_html: Chọn làm gì với <strong>%{acct}</strong>
@@ -126,6 +126,7 @@ vi:
         expires_in: Hết hạn sau
         fields: Metadata
         header: Ảnh bìa
+        honeypot: "%{label} (đừng điền vào)"
         inbox_url: Hộp thư relay
         irreversible: Xóa bỏ vĩnh viễn
         locale: Ngôn ngữ
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 76c97ffd5..0e7b1e665 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -126,6 +126,7 @@ zh-CN:
         expires_in: 失效时间
         fields: 个人资料附加信息
         header: 个人资料页横幅图片
+        honeypot: "%{label} (请勿填写)"
         inbox_url: 中继站收件箱的 URL
         irreversible: 丢弃而非隐藏
         locale: 界面语言
diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index 57b20fd4a..ffa2fcde5 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -3,72 +3,81 @@ zh-HK:
   simple_form:
     hints:
       account_alias:
-        acct: 指定欲移動之帳戶的 使用者名稱@站台
+        acct: 指定欲移動之帳戶的「使用者名稱@域名」
       account_migration:
-        acct: 指定欲移動至之帳戶的 使用者名稱@站台
+        acct: 指定欲移動至之帳戶的「使用者名稱@域名」
       account_warning_preset:
-        text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能
-        title: 可選,對接收者不可見
+        text: 你可使用 toot 格式,例如網址、「#」標籤和提及功能
+        title: 可選,接收者不會見到
       admin_account_action:
-        include_statuses: 用戶將會看到哪些嘟文導致檢舉或警告
+        include_statuses: 使用者將會看到哪些文章導致檢舉或警告
         send_email_notification: 使用者將收到帳戶發生之事情的解釋
-        text_html: 選用。您能使用嘟文語法。您可 <a href="%{path}">新增警告預設</a> 來節省時間
+        text_html: 選用。你能使用 toot 語法。你可 <a href="%{path}">新增警告預設</a> 來節省時間
         type_html: 設定要使用 <strong>%{acct}</strong> 做的事
-        warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字
+        warning_preset_id: 選用。你仍可在預設訊息的結尾加入自訂文字
       announcement:
-        all_day: 核取後,只會顯示出時間範圍中的日期部分
+        all_day: 勾選後,只會顯示出時間範圍中的日期部分
         ends_at: 可選,公告會在該時間點自動取消發布
-        scheduled_at: 空白則立即發布公告
+        scheduled_at: 留空此項以立即發布公告
         starts_at: 可選,你可以讓公告在指定時間範圍內顯示
-        text: 你可以使用嘟文格式,但請注意不要讓公告佔據太多用戶屏幕空間。
+        text: 你可以使用文章格式,但請小心別讓公告佔據太大的使用者畫面空間。
       defaults:
         autofollow: 通過邀請網址註冊的用戶將會自動關注你
         avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
-        bot: 提醒用戶本帳號是機械人
-        context: 應該套用過濾器的一項或多項內容
-        current_password: 因安全因素,請輸入目前帳戶的密碼
+        bot: 這個帳號是機械人,所做的事情可能沒有經人為監察
+        context: 過濾器應該套用的一項或多項條件
+        current_password: 基於保安緣故,請輸入目前帳號的密碼
         current_username: 請輸入目前帳戶的使用者名稱以確認
         digest: 僅在你長時間未登錄,且收到了私信時發送
-        discoverable: 用戶目錄可以讓您的帳戶被更多人知道
-        email: 您將收到一封確認電子郵件
+        discoverable: 個人資料目錄可以讓你的帳號更廣為人知
+        email: 你將收到一封確認電郵
         fields: 個人資料頁可顯示多至 4 個項目
         header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
-        inbox_url: 從您想要使用的中繼首頁複製網址
-        irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器移除之後也一樣
+        inbox_url: 在你想要使用的中繼站首頁,複製它的網址
+        irreversible: 文章過濾是不可還原的,即使日後過濾器被移除,也無法重新看到被它濾走的文章
         locale: 使用者介面、電郵和通知的語言
-        locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」
+        locked: 你必須手動審核每個人對你的關注請求
         password: 使用至少 8 個字元
-        phrase: 無論是嘟文的本文或是內容警告都會被過濾
-        scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。
-        setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文)
+        phrase: 過濾器會閱讀文章和內容警告標語的字眼,然後決定過濾與否
+        scopes: 選擇應用程式可以存取的 API。 若你選擇最高階的權限範圍,則無須選擇個別項目。
+        setting_aggregate_reblogs: 請勿顯示新近被轉推的文章(只影響最新被推的文章)
         setting_default_sensitive: 敏感媒體預設隱藏,且按一下即可重新顯示
         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: 漸變基於隱藏的視覺效果顏色,但會模糊所有細節
+        setting_show_application: 你用來發表文章的應用程式,將會顯示在你文章的詳細檢視中
+        setting_use_blurhash: 漸變圖樣會基於隱藏媒體內容產生,但所有細節會變得模糊
         setting_use_pending_items: 關閉自動滾動更新,時間軸會在點擊後更新
-        username: 您的使用者名稱將在 %{domain} 是獨一無二的
+        username: 你的使用者名稱在 %{domain} 將是獨一無二的
         whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用
       domain_allow:
-        domain: 此域將能從此站獲取數據,而此站發出的數據也會被處理和存儲。
+        domain: 此網域將能從此站獲取資料,而此站發出的數據也會被處理和存儲。
       email_domain_block:
         domain: 這裡可以是電郵地址中的域名、域名解析到的MX記錄、或MX紀錄解析到的服務器IP。如果上述資料被封禁,那麼註冊將被拒絕。
         with_dns_records: Mastodon 會嘗試解析所給域名的 DNS 記錄,然後與解析結果一併封禁
       featured_tag:
-        name: 您可能想使用其中一個:
+        name: 你可能想使用其中一個:
       form_challenge:
-        current_password: 您正要進入安全區域
+        current_password: 你正要進入安全區域
       imports:
         data: 自其他服務站匯出的 CSV 檔案
       invite_request:
-        text: 這會協助我們審核您的應用程式
+        text: 這將有助我們審核你的應用程式
+      ip_block:
+        comment: 可選,但請記得自己為甚麼添加了這個規則。
+        expires_in: 因為 IP 位址是經常被分享或轉手的有限資源,所以我們不建議你無限期地封鎖 IP 位址。
+        ip: 請輸入 IPv4 或 IPv6 位址,你亦可以用 CIDR 語法來封鎖整個 IP 區段。請小心使用,不要把自己給一併封鎖!
+        severities:
+          no_access: 封鎖所有資源存取
+          sign_up_requires_approval: 新登記申請正等候你審批
+        severity: 請設定伺服器將如何處理來自這個 IP 位址的請求
       sessions:
         otp: 輸入你手機上生成的雙重認證碼,或者任意一個恢復代碼:
+        webauthn: 如果它是 USB 安全鑰匙的話,請先插入電腦。如鑰匙設計有需要,請按鍵啟用。
       tag:
-        name: 您只能變更大小寫,例如,以使其更易讀。
+        name: 你只能變更大小寫(以使其更易讀)。
       user:
         chosen_languages: 只有被選擇的語言會在公開時間軸內顯示
     labels:
@@ -77,23 +86,24 @@ zh-HK:
           name: 標籤
           value: 內容
       account_alias:
-        acct: 處理舊帳戶
+        acct: 舊帳號名稱
       account_migration:
-        acct: 處理新帳戶
+        acct: 新帳號名稱
       account_warning_preset:
         text: 預設文字
         title: 標題
       admin_account_action:
-        include_statuses: 在電子郵件中加入檢舉的嘟文
+        include_statuses: 在電郵中加入被檢舉的文章
         send_email_notification: 透過電子信件通知使用者
         text: 自訂警告
-        type: 動作
+        type: 操作
         types:
           disable: 停用
-          none: 什麼也不做
-          silence: 安靜
-          suspend: 停權並不可逆的刪除帳戶資料
-        warning_preset_id: 使用警告預設
+          none: 發送警告
+          sensitive: 敏感内容
+          silence: 限制
+          suspend: 停權
+        warning_preset_id: 使用預設警告
       announcement:
         all_day: 全天活動
         ends_at: 活動結束時間
@@ -101,25 +111,26 @@ zh-HK:
         starts_at: 活動開始時間
         text: 公告
       defaults:
-        autofollow: 邀請別人關注你的賬號
+        autofollow: 邀請別人關注你的帳號
         avatar: 個人頭像
         bot: 這帳號是機械人
-        chosen_languages: 語言過濾
+        chosen_languages: 所過濾語言
         confirm_new_password: 確認新密碼
         confirm_password: 確認密碼
-        context: 過濾情境
+        context: 所過濾情境
         current_password: 目前密碼
         data: 資料
-        discoverable: 在目錄列出此帳戶
+        discoverable: 在目錄列出此帳號
         display_name: 顯示名稱
         email: 電郵地址
         expires_in: 失效時間
         fields: 資料
         header: 個人頁面頂部
+        honeypot: "%{label} (請不要填寫)"
         inbox_url: 中繼收件匣的 URL
-        irreversible: 放棄而非隱藏
+        irreversible: 丟棄而非隱藏
         locale: 介面語言
-        locked: 將用戶轉為「私人」
+        locked: 將帳號轉為「私人」
         max_uses: 最大使用次數
         new_password: 新密碼
         note: 簡介
@@ -127,66 +138,75 @@ zh-HK:
         password: 密碼
         phrase: 關鍵字或片語
         setting_advanced_layout: 啟用進階網頁介面
-        setting_aggregate_reblogs: 時間軸中的群組轉嘟
+        setting_aggregate_reblogs: 時間軸中的群組轉推
         setting_auto_play_gif: 自動播放 GIF
         setting_boost_modal: 在轉推前詢問我
-        setting_crop_images: 把未展開嘟文中的圖片裁剪到 16x9
+        setting_crop_images: 將未展開文章中的圖片裁剪到 16x9
         setting_default_language: 文章語言
         setting_default_privacy: 文章預設為
         setting_default_sensitive: 預設我的內容為敏感內容
-        setting_delete_modal: 刪推前詢問我
+        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_expand_spoilers: 永遠展開標有內容警告的文章
         setting_hide_network: 隱藏你的社交網絡
-        setting_noindex: 阻止搜尋引擎檢索
-        setting_reduce_motion: 減低動畫效果
-        setting_show_application: 顯示用來傳送嘟文的應用程式
+        setting_noindex: 聲明本站不希望搜尋器讓外界搜尋
+        setting_reduce_motion: 減少動畫效果
+        setting_show_application: 顯示用來發表文章的應用程式
         setting_system_font_ui: 使用系統預設字型
         setting_theme: 網站主題
-        setting_trends: 顯示本日趨勢
-        setting_unfollow_modal: 取消關注前跳出詢問我
-        setting_use_blurhash: 將隱藏媒體顯示為彩色漸變
+        setting_trends: 顯示今天熱門主題
+        setting_unfollow_modal: 取消關注前請讓我確定
+        setting_use_blurhash: 將隱藏媒體以彩色漸變圖樣表示
         setting_use_pending_items: 限速模式
         severity: 等級
         sign_in_token_attempt: 安全碼
         type: 匯入資料類型
-        username: 用戶名稱
-        username_or_email: 用戶名稱或電郵
+        username: 使用者名稱
+        username_or_email: 使用者名稱或電郵
         whole_word: 整個詞彙
       email_domain_block:
-        with_dns_records: 包括域名的 MX 記錄和 IP 地址
+        with_dns_records: 包括域名的 MX 記錄和 IP 位址
       featured_tag:
-        name: "「#」標籤"
+        name: 主題標籤 (Hashtag)
       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:
         text: 加入的原因
       ip_block:
-        ip: IP 地址
+        comment: 備註
+        ip: IP 位址
+        severities:
+          no_access: 封鎖
+          sign_up_requires_approval: 限制註冊
+        severity: 規則
       notification_emails:
         digest: 定期電郵摘要
-        favourite: 當有用戶喜歡你的文章時,發電郵通知
-        follow: 當有用戶關注你時,發電郵通知
-        follow_request: 當有用戶要求關注你時,發電郵通知
-        mention: 當有用戶在文章提及你時,發電郵通知
-        pending_account: 需要審核的新帳戶
-        reblog: 當有用戶轉推你的文章時,發電郵通知
-        report: 當提交新檢舉時傳送電子郵件
-        trending_tag: 當未審核的話題成為當前熱門時發郵件提醒
+        favourite: 有人喜歡你的文章
+        follow: 當有人關注你時
+        follow_request: 當有人要求關注你時
+        mention: 當有人在文章提及你時
+        pending_account: 有新帳號需要審核時
+        reblog: 當有人轉推你的文章時
+        report: 收到新檢舉時
+        trending_tag: 當未審核的標籤成為當前熱門時
       tag:
         listable: 允許此主題標籤在搜尋及個人檔案目錄中顯示
         name: 主題標籤
         trendable: 允許此主題標籤在趨勢下顯示
-        usable: 允許嘟文使用此主題標籤
+        usable: 允許文章使用此主題標籤
     'no': 否
     required:
       mark: "*"
       text: 必須填寫
+    title:
+      sessions:
+        webauthn: 使用你的安全密鑰裝置來登入
     'yes': 是
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index a563443d7..fbc2ff98b 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -75,6 +75,7 @@ zh-TW:
         types:
           disable: 停用
           none: 什麼也不做
+          sensitive: 有雷小心
           silence: 安靜
           suspend: 停權並不可逆的刪除帳戶資料
         warning_preset_id: 使用警告預設
@@ -147,6 +148,13 @@ zh-TW:
         comment: 備註
       invite_request:
         text: 加入的原因
+      ip_block:
+        comment: 備註
+        ip: IP 位址
+        severities:
+          no_access: 封鎖
+          sign_up_requires_approval: 限制註冊
+        severity: 規則
       notification_emails:
         digest: 傳送摘要信件
         favourite: 當有使用者喜歡你的嘟文時,傳送電子信件通知
@@ -165,4 +173,7 @@ zh-TW:
     required:
       mark: "*"
       text: 必須填寫
+    title:
+      sessions:
+        webauthn: 使用您的安全金鑰來登入
     'yes': 是
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index d08d726c0..e841ab690 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -60,6 +60,7 @@ sq:
       one: Ndjekës
       other: Ndjekës
     following: Ndjekje
+    instance_actor_flash: Kjo llogari është një aktor virtual, i përdorur për të përfaqësuar vetë shërbyesin dhe jo ndonjë përdorues individual. Përdoret për qëllime federimi dhe s’duhet pezulluar.
     joined: U bë pjesë më %{date}
     last_active: aktiv së fundi
     link_verified_on: Pronësia e kësaj lidhjeje qe kontrolluar më %{date}
@@ -131,6 +132,7 @@ sq:
       follows: Ndjekje
       header: Krye
       inbox_url: URL Mesazhesh të Marrë
+      invite_request_text: Arsye për pjesëmarrje
       invited_by: Ftuar nga
       ip: IP
       joined: U bë pjesë
@@ -255,6 +257,7 @@ sq:
         unsuspend_account: Hiqe Pezullimin e Llogarisë
         update_announcement: Përditëso Lajmërimin
         update_custom_emoji: Përditëso Emotikon Vetjak
+        update_domain_block: Përditëso Bllok Përkatësish
         update_status: Përditëso Gjendjen
       actions:
         assigned_to_self_report: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes"
@@ -295,6 +298,7 @@ sq:
         unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}"
         update_announcement: "%{name} përditësoi lajmërimin %{target}"
         update_custom_emoji: "%{name} përditësoi emotikonin %{target}"
+        update_domain_block: "%{name} përditësoi bllok përkatësish për %{target}"
         update_status: "%{name} përditësoi gjendjen me %{target}"
       deleted_status: "(fshiu gjendjen)"
       empty: S’u gjetën regjistra.
@@ -398,6 +402,8 @@ sq:
           silence: Heshtoji
           suspend: Pezulloje
         title: Bllokim i ri përkatësie
+      obfuscate: Errësoje emrin e përkatësisë
+      obfuscate_hint: Errësoje pjesërisht emrin e përkatësisë te lista, nëse është aktivizuar publikimi i listës së kufizimeve të përkatësive
       private_comment: Koment privat
       private_comment_hint: Koment mbi këtë kufizim përkatësie për përdorim të brendshëm nga moderatorët.
       public_comment: Koment publik
@@ -437,6 +443,7 @@ sq:
     instances:
       by_domain: Përkatësi
       delivery_available: Ka shpërndarje të mundshme
+      empty: S’u gjetën përkatësi.
       known_accounts:
         one: "%{count} llogari e njohur"
         other: "%{count} llogari të njohura"
@@ -514,6 +521,8 @@ sq:
       comment:
         none: Asnjë
       created_at: Raportuar më
+      forwarded: U përcoll
+      forwarded_to: U përcoll te %{domain}
       mark_as_resolved: Vëri shenjë si i zgjidhur
       mark_as_unresolved: Vëri shenjë si të pazgjidhur
       notes:
@@ -557,6 +566,7 @@ sq:
       domain_blocks_rationale:
         title: Shfaq arsye
       enable_bootstrap_timeline_accounts:
+        desc_html: Bëj që përdoruesit e rinj automatikisht të ndjekin llogaritë e formësuara, që prurja e tyre bazë të mos nisë e zbrazët
         title: Aktivizo ndjekje parazgjedhje për përdorues të rinj
       hero:
         desc_html: E shfaqur në faqen ballore. Këshillohet të paktën 600x100px. Kur nuk caktohet gjë, përdoret miniaturë e shërbyesit
@@ -583,6 +593,9 @@ sq:
         min_invite_role:
           disabled: Asnjë
           title: Lejo ftesa nga
+        require_invite_text:
+          desc_html: Kur regjistrimet lypin miratim dorazi, tekstin e kërkesës për ftesë “Pse doni të merrni pjesë?” bëje të detyrueshëm, në vend se opsional
+          title: Kërkoju përdoruesve të rinj të plotësojnë doemos një tekst kërkese për ftesë
       registrations_mode:
         modes:
           approved: Për regjistrim, lypset miratimi
@@ -751,6 +764,7 @@ sq:
       functional: Llogaria juaj është tërësisht funksionale.
       pending: Aplikimi juaj është në pritje të shqyrtimit nga stafi ynë. Kjo mund të dojë ca kohë. Nëse aplikimi juaj miratohet, do të merrni një email.
       redirecting_to: Llogaria juaj është joaktive, ngaqë aktualisht ridrejton te %{acct}.
+    too_fast: Formulari u parashtrua shumë shpejt, riprovoni.
     trouble_logging_in: Probleme me hyrjen?
     use_security_key: Përdor kyç sigurie
   authorize_follow:
@@ -910,6 +924,8 @@ sq:
     status: Gjendje verifikimi
     view_proof: Shihni provën
   imports:
+    errors:
+      over_rows_processing_limit: përmban më shumë se %{count} rreshta
     modes:
       merge: Përzieji
       merge_long: Mbaji zërat ekzistues dhe shto të rinjtë
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index a84d5cdbd..36154b49b 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -221,6 +221,7 @@ sv:
         unsuspend_account: Återaktivera konto
         update_announcement: Uppdatera meddelande
         update_custom_emoji: Uppdatera egna emojis
+        update_domain_block: Uppdatera blockerad domän
         update_status: Uppdatera status
       actions:
         assigned_to_self_report: "%{name} tilldelade anmälan %{target} till sig själv"
@@ -256,6 +257,7 @@ sv:
         unsilence_account: "%{name} återljudade %{target}s konto"
         unsuspend_account: "%{name} aktiverade %{target}s konto"
         update_custom_emoji: "%{name} uppdaterade emoji %{target}"
+        update_domain_block: "%{name} uppdaterade blockerad domän för %{target}"
         update_status: "%{name} uppdaterade status för %{target}"
       deleted_status: "(raderad status)"
       empty: Inga loggar hittades.
@@ -344,6 +346,8 @@ sv:
           silence: Tysta ner
           suspend: Suspendera
         title: Nytt domänblock
+      obfuscate: Dölj domännamn
+      obfuscate_hint: Dölj domännamnet i listan till viss del, om underrättelser för listan över domänbegränsningar aktiverats
       private_comment: Privat kommentar
       private_comment_hint: Kommentar för moderatorer om denna domänbegränsning.
       public_comment: Offentlig kommentar
@@ -376,6 +380,7 @@ sv:
       title: E-postdomänblock
     instances:
       by_domain: Domän
+      empty: Inga domäner hittades.
       moderation:
         all: Alla
         limited: Begränsad
@@ -417,6 +422,8 @@ sv:
       comment:
         none: Ingen
       created_at: Anmäld
+      forwarded: Vidarebefordrad
+      forwarded_to: Vidarebefordrad till %{domain}
       mark_as_resolved: Markera som löst
       mark_as_unresolved: Markera som olöst
       notes:
@@ -479,6 +486,9 @@ sv:
         min_invite_role:
           disabled: Ingen
           title: Tillåt inbjudningar av
+        require_invite_text:
+          desc_html: När nyregistrering kräver manuellt godkännande, gör det obligatoriskt att fylla i text i fältet "Varför vill du gå med?"
+          title: Kräv att nya användare fyller i en inbjudningsförfrågan
       show_known_fediverse_at_about_page:
         desc_html: När den växlas, kommer toots från hela fediverse visas på förhandsvisning. Annars visas bara lokala toots.
         title: Visa det kända fediverse på tidslinjens förhandsgranskning
@@ -577,6 +587,7 @@ sv:
     status:
       account_status: Kontostatus
       redirecting_to: Ditt konto är inaktivt eftersom det för närvarande dirigeras om till %{acct}.
+    too_fast: Formuläret har skickats för snabbt, försök igen.
   authorize_follow:
     already_following: Du följer redan detta konto
     already_requested: Du har redan skickat en vänförfrågan till det kontot
@@ -675,6 +686,8 @@ sv:
     active: Aktiv
     inactive: Inaktiv
   imports:
+    errors:
+      over_rows_processing_limit: innehåller fler än %{count} rader
     preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar.
     success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast
     types:
@@ -778,6 +791,7 @@ sv:
     missing_resource: Det gick inte att hitta den begärda omdirigeringsadressen för ditt konto
     proceed: Fortsätt för att följa
     prompt: 'Du kommer att följa:'
+    reason_html: "<strong>Varför är det här steget nödvändigt?</strong> <code>%{instance}</code> är kanske inte den server du är registrerad vid, så vi behöver dirigera dig till din hemserver först."
   sessions:
     activity: Senaste aktivitet
     browser: Webbläsare
diff --git a/config/locales/th.yml b/config/locales/th.yml
index fcfa2fbc9..63ce98d4b 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -102,20 +102,21 @@ th:
       delete: ลบข้อมูล
       deleted: ลบแล้ว
       demote: ลดขั้น
-      disable: ปิดใช้งาน
+      disable: อายัด
       disable_two_factor_authentication: ปิดใช้งาน 2FA
-      disabled: ปิดใช้งานอยู่
+      disabled: อายัดอยู่
       display_name: ชื่อที่แสดง
       domain: โดเมน
       edit: แก้ไข
       email: อีเมล
       email_status: สถานะอีเมล
-      enable: เปิดใช้งาน
+      enable: เลิกอายัด
       enabled: เปิดใช้งานอยู่
       followers: ผู้ติดตาม
       follows: การติดตาม
       header: ส่วนหัว
       inbox_url: URL กล่องขาเข้า
+      invite_request_text: เหตุผลสำหรับการเข้าร่วม
       invited_by: เชิญโดย
       ip: IP
       joined: เข้าร่วมเมื่อ
@@ -172,8 +173,8 @@ th:
       show:
         created_reports: รายงานที่สร้าง
         targeted_reports: รายงานโดยผู้อื่น
-      silence: ทำให้เงียบ
-      silenced: เงียบอยู่
+      silence: จำกัด
+      silenced: จำกัดอยู่
       statuses: สถานะ
       subscribe: บอกรับ
       suspended: ระงับอยู่
@@ -228,6 +229,7 @@ th:
         unsuspend_account: เลิกระงับบัญชี
         update_announcement: อัปเดตประกาศ
         update_custom_emoji: อัปเดตอีโมจิที่กำหนดเอง
+        update_domain_block: อัปเดตการปิดกั้นโดเมน
         update_status: อัปเดตสถานะ
       actions:
         assigned_to_self_report: "%{name} ได้มอบหมายรายงาน %{target} ให้กับตนเอง"
@@ -268,6 +270,7 @@ th:
         unsuspend_account: "%{name} ได้เลิกระงับบัญชีของ %{target}"
         update_announcement: "%{name} ได้อัปเดตประกาศ %{target}"
         update_custom_emoji: "%{name} ได้อัปเดตอีโมจิ %{target}"
+        update_domain_block: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}"
         update_status: "%{name} ได้อัปเดตสถานะโดย %{target}"
       deleted_status: "(สถานะที่ลบแล้ว)"
       empty: ไม่พบรายการบันทึก
@@ -403,6 +406,7 @@ th:
       title: โดเมนอีเมลที่ปิดกั้นอยู่
     instances:
       by_domain: โดเมน
+      empty: ไม่พบโดเมน
       known_accounts:
         other: "%{count} บัญชีที่รู้จัก"
       moderation:
@@ -471,6 +475,8 @@ th:
       comment:
         none: ไม่มี
       created_at: รายงานเมื่อ
+      forwarded: ส่งต่อแล้ว
+      forwarded_to: ส่งต่อไปยัง %{domain} แล้ว
       mark_as_resolved: ทำเครื่องหมายว่าแก้ปัญหาแล้ว
       mark_as_unresolved: ทำเครื่องหมายว่ายังไม่ได้แก้ปัญหา
       notes:
@@ -602,6 +608,8 @@ th:
       edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า
       title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า
   admin_mailer:
+    new_pending_account:
+      body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้
     new_report:
       body: "%{reporter} ได้รายงาน %{target}"
       body_remote: ใครสักคนจาก %{domain} ได้รายงาน %{target}
@@ -660,6 +668,7 @@ th:
       cas: CAS
       saml: SAML
     register: ลงทะเบียน
+    registration_closed: "%{instance} ไม่ได้กำลังเปิดรับสมาชิกใหม่"
     resend_confirmation: ส่งคำแนะนำการยืนยันใหม่
     reset_password: ตั้งรหัสผ่านใหม่
     security: ความปลอดภัย
@@ -764,7 +773,7 @@ th:
   filters:
     contexts:
       account: โปรไฟล์
-      home: เส้นเวลาหน้าแรก
+      home: หน้าแรกและรายการ
       notifications: การแจ้งเตือน
       public: เส้นเวลาสาธารณะ
       thread: การสนทนา
@@ -803,6 +812,8 @@ th:
     status: สถานะการตรวจสอบ
     view_proof: ดูการพิสูจน์
   imports:
+    errors:
+      over_rows_processing_limit: มีมากกว่า %{count} แถว
     modes:
       merge: ผสาน
       merge_long: เก็บระเบียนที่มีอยู่และเพิ่มระเบียนใหม่
@@ -818,6 +829,7 @@ th:
   in_memoriam_html: เพื่อระลึกถึง
   invites:
     delete: ปิดใช้งาน
+    expired: หมดอายุแล้ว
     expires_in:
       '1800': 30 นาที
       '21600': 6 ชั่วโมง
@@ -1074,7 +1086,7 @@ th:
       month: "%b %Y"
   two_factor_authentication:
     add: เพิ่ม
-    disable: ปิดใช้งาน
+    disable: ปิดใช้งาน 2FA
     disabled_success: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำเร็จ
     edit: แก้ไข
     enabled: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว
@@ -1129,4 +1141,5 @@ th:
     invalid_credential: กุญแจความปลอดภัยไม่ถูกต้อง
     not_enabled: คุณยังไม่ได้เปิดใช้งาน WebAuthn
     not_supported: เบราว์เซอร์นี้ไม่รองรับกุญแจความปลอดภัย
+    otp_required: เพื่อใช้กุญแจความปลอดภัย โปรดเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยก่อน
     registered_on: ลงทะเบียนเมื่อ %{date}
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index bc5c9a43f..62247bf56 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -255,6 +255,7 @@ tr:
         unsuspend_account: Hesabı Askıdan Kaldır
         update_announcement: Duyuruyu Güncelle
         update_custom_emoji: Özel İfadeyi Güncelle
+        update_domain_block: Engellenen Alan Adını Güncelle
         update_status: Durumu Güncelle
       actions:
         assigned_to_self_report: "%{name} kendilerine %{target} adlı raporu verdi"
@@ -295,6 +296,7 @@ tr:
         unsuspend_account: "%{name} %{target}'in hesabının uzaklaştırmasını kaldırdı"
         update_announcement: "%{name}, %{target} duyurusunu güncelledi"
         update_custom_emoji: "%{name} %{target} emojiyi güncelledi"
+        update_domain_block: "%{name}, %{target} için alan adı engelini güncelledi"
         update_status: "%{name}, %{target} kullanıcısının durumunu güncelledi"
       deleted_status: "(silinmiş durum)"
       empty: Kayıt bulunamadı.
@@ -437,6 +439,7 @@ tr:
     instances:
       by_domain: Alan adı
       delivery_available: Teslimat mevcut
+      empty: Alan adı bulunamadı.
       known_accounts:
         one: "%{count} bilinen hesap"
         other: "%{count} bilinen hesap"
@@ -751,6 +754,7 @@ tr:
       functional: Hesabınız tamamen kullanıma hazır.
       pending: Başvurunuz personelimiz tarafından gözden geçirilmeyi beklemektedir. Bu biraz zaman alabilir. Başvurunuz onaylanırsa bir e-posta alacaksınız.
       redirecting_to: Hesabınız aktif değil çünkü şu anda %{acct} adresine yönlendirilmektedir.
+    too_fast: Form çok hızlı gönderildi, tekrar deneyin.
     trouble_logging_in: Oturum açarken sorun mu yaşıyorsunuz?
     use_security_key: Güvenlik anahtarını kullan
   authorize_follow:
diff --git a/config/locales/tt.yml b/config/locales/tt.yml
new file mode 100644
index 000000000..e35b5da21
--- /dev/null
+++ b/config/locales/tt.yml
@@ -0,0 +1,12 @@
+---
+tt:
+  errors:
+    '400': The request you submitted was invalid or malformed.
+    '403': You don't have permission to view this page.
+    '404': The page you are looking for isn't here.
+    '406': This page is not available in the requested format.
+    '410': The page you were looking for doesn't exist here anymore.
+    '422': 
+    '429': Too many requests
+    '500': 
+    '503': The page could not be served due to a temporary server failure.
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 0170185f1..48bc6c844 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -1,16 +1,16 @@
 ---
 vi:
   about:
-    about_hashtag_html: Đây là các tút công khai trong mạng liên hợp được gắn thẻ <strong>#%{hashtag}</strong>. Bạn có thể tương tác với chúng nếu đã đăng nhập.
+    about_hashtag_html: Đây là các tút <strong>#%{hashtag}</strong> trên mạng liên hợp. Bạn có thể tương tác với chúng sau khi đăng nhập.
     about_mastodon_html: 'Mạng xã hội của tương lai: Không quảng cáo, không theo dõi người dùng và phi tập quyền! Làm chủ quyền riêng tư của bạn với Mastodon!'
     about_this: Giới thiệu
     active_count_after: hoạt động
-    active_footnote: Người dùng hoạt động hàng tháng
+    active_footnote: Người dùng hoạt động hàng tháng (MAU)
     administered_by: 'Quản trị viên:'
     api: API
     apps: Ứng dụng di động
     apps_platforms: Lướt Mastodon trên iOS, Android và các nền tảng khác
-    browse_directory: Tìm những người có sở thích giống bạn
+    browse_directory: Tìm những người cùng chung sở thích
     browse_local_posts: Xem những gì đang xảy ra
     browse_public_posts: Xem thử những tút công khai trên mạng Mastodon
     contact: Liên lạc
@@ -21,10 +21,10 @@ vi:
     federation_hint_html: Đăng ký tài khoản %{instance} là bạn có thể giao tiếp với mọi người trên bất kỳ máy chủ Mastodon nào và còn hơn thế nữa.
     get_apps: Ứng dụng di động
     hosted_on: "%{domain} vận hành nhờ Mastodon"
-    instance_actor_flash: 'Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ máy chủ.
+    instance_actor_flash: 'Đây là một tài khoản ảo được sử dụng để đại diện cho máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên chặn trừ khi bạn muốn chặn toàn bộ máy chủ.
 
 '
-    learn_more: Tìm hiểu thêm
+    learn_more: Tìm hiểu
     privacy_policy: Chính sách bảo mật
     see_whats_happening: Dòng thời gian
     server_stats: 'Cộng đồng:'
@@ -32,7 +32,7 @@ vi:
     status_count_after:
       other: tút
     status_count_before: Nơi lưu giữ
-    tagline: Mạng xã hội liên hợp lớn nhất
+    tagline: Theo dõi bạn bè và khám phá thế giới
     terms: Điều khoản dịch vụ
     unavailable_content: Giới hạn chung
     unavailable_content_description:
@@ -57,12 +57,13 @@ vi:
     followers:
       other: Người theo dõi
     following: Theo dõi
+    instance_actor_flash: Tài khoản này được dùng để đại diện cho máy chủ và không phải là người thật. Đừng bao giờ vô hiệu hóa tài khoản này.
     joined: Đã tham gia %{date}
     last_active: online
     link_verified_on: Liên kết này đã được xác thực quyền sở hữu vào %{date}
     media: Bộ sưu tập
     moved_html: "%{name} đã dời sang %{new_profile_link}:"
-    network_hidden: Người dùng đã ẩn thông tin này
+    network_hidden: Dữ liệu đã bị ẩn
     never_active: Chưa có
     nothing_here: Trống trơn!
     people_followed_by: Những người %{name} theo dõi
@@ -73,7 +74,7 @@ vi:
       other: Tút
     posts_tab_heading: Tút
     posts_with_replies: Tương tác
-    reserved_username: Tên người dùng đã có rồi
+    reserved_username: Tên này đã sử dụng rồi
     roles:
       admin: Quản trị viên
       bot: Tài khoản Bot
@@ -83,7 +84,7 @@ vi:
     unfollow: Ngưng theo dõi
   admin:
     account_actions:
-      action: Thực hiện các hành động
+      action: Thực hiện hành động
       title: Áp đặt kiểm duyệt với %{acct}
     account_moderation_notes:
       create: Gửi tin nhắn kiểm duyệt
@@ -91,7 +92,7 @@ vi:
       delete: Xóa bỏ
       destroyed_msg: Đã ghi chú kiểm duyệt xong!
     accounts:
-      add_email_domain_block: Chặn địa chỉ email
+      add_email_domain_block: Chặn tên miền email
       approve: Phê duyệt
       approve_all: Phê duyệt tất cả
       approved_msg: Đã phê duyệt %{username} đăng ký thành công
@@ -110,7 +111,7 @@ vi:
       confirming: Chờ xác nhận
       delete: Xóa dữ liệu
       deleted: Đã xóa
-      demote: Gỡ bỏ chức vụ
+      demote: Xóa chức vụ
       destroyed_msg: Dữ liệu %{username} sẽ được lên lịch xóa ngay bây giờ
       disable: Tạm khóa
       disable_two_factor_authentication: Vô hiệu hóa xác thực hai bước
@@ -127,6 +128,7 @@ vi:
       follows: Đang theo dõi
       header: Ảnh bìa
       inbox_url: Hộp thư của người này
+      invite_request_text: Lý do đăng ký
       invited_by: Được mời bởi
       ip: IP
       joined: Đã tham gia
@@ -139,7 +141,7 @@ vi:
       media_attachments: Tệp đính kèm
       memorialize: Chuyển sang tài khoản tưởng niệm
       memorialized: Tưởng nhớ
-      memorialized_msg: Đã chuyển thành công %{username} thành tài khoản tưởng nhớ
+      memorialized_msg: Đã chuyển %{username} thành tài khoản tưởng nhớ
       moderation:
         active: Hoạt động
         all: Toàn bộ
@@ -160,14 +162,14 @@ vi:
       public: Công khai
       push_subscription_expires: Đăng ký PuSH hết hạn
       redownload: Làm mới trang cá nhân
-      redownloaded_msg: Đã làm tươi tài khoản %{username} thành công
+      redownloaded_msg: Đã tiếp nhận tài khoản %{username} thành công
       reject: Từ chối
       reject_all: Từ chối tất cả
-      rejected_msg: Đã từ chối đăng ký tài khoản %{username} thành công
+      rejected_msg: Đã từ chối đăng ký tài khoản %{username}
       remove_avatar: Xóa ảnh đại diện
       remove_header: Xóa ảnh bìa
-      removed_avatar_msg: Đã xóa bỏ ảnh đại diện của %{username} thành công
-      removed_header_msg: Đã xóa bỏ ảnh bìa của %{username} thành công
+      removed_avatar_msg: Đã xóa bỏ ảnh đại diện của %{username}
+      removed_header_msg: Đã xóa bỏ ảnh bìa của %{username}
       resend_confirmation:
         already_confirmed: Người dùng này đã được xác thực
         send: Gửi lại email xác nhận
@@ -182,8 +184,8 @@ vi:
         staff: Đội ngũ quản lý
         user: Người dùng
       search: Tìm kiếm
-      search_same_email_domain: Tìm người dùng giống địa chỉ email
-      search_same_ip: Tìm người dùng giống IP
+      search_same_email_domain: Tra cứu email
+      search_same_ip: Tra cứu IP
       sensitive: Nhạy cảm
       sensitized: đánh dấu nhạy cảm
       shared_inbox_url: Hộp thư của máy chủ người này
@@ -196,7 +198,7 @@ vi:
       subscribe: Đăng ký
       suspended: Đã vô hiệu hóa
       suspension_irreversible: Toàn bộ dữ liệu của người dùng này sẽ bị xóa hết. Bạn vẫn có thể ngừng vô hiệu hóa nhưng dữ liệu sẽ không thể phục hồi.
-      suspension_reversible_hint_html: Dữ liệu của tài khoản này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, tài khoản vẫn có thể phục hồi dữ liệu. Nếu bạn muốn xóa dữ liệu của người này ngay bây giờ, hãy tiếp tục.
+      suspension_reversible_hint_html: Mọi dữ liệu của người này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, dữ liệu vẫn có thể phục hồi. Nếu bạn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục.
       time_in_queue: Đang chờ cách đây %{time}
       title: Tài khoản
       unconfirmed_email: Email chưa được xác thực
@@ -205,7 +207,7 @@ vi:
       undo_suspension: Ngừng vô hiệu hóa
       unsilenced_msg: Bỏ ẩn %{username} thành công
       unsubscribe: Hủy đăng ký
-      unsuspended_msg: Đã kích hoạt lại tài khoản %{username} thành công
+      unsuspended_msg: Đã kích hoạt lại %{username} thành công
       username: Tài khoản
       view_domain: Xem mô tả tài khoản này
       warn: Cấm upload
@@ -213,19 +215,19 @@ vi:
       whitelisted: Danh sách trắng
     action_logs:
       action_types:
-        assigned_to_self_report: Báo cáo từ đội ngũ
+        assigned_to_self_report: Xử lý báo cáo được giao
         change_email_user: Đổi email cho người dùng
         confirm_user: Xác nhận người dùng
-        create_account_warning: Tạo cảnh cáo cài sẵn
+        create_account_warning: Gửi cảnh cáo
         create_announcement: Tạo thông báo
         create_custom_emoji: Tạo Emoji mới
-        create_domain_allow: Tạo danh sách máy chủ cho phép
-        create_domain_block: Tạo danh sách máy chủ chặn
-        create_email_domain_block: Tạo danh sách địa chỉ email chặn
+        create_domain_allow: Cho phép máy chủ
+        create_domain_block: Chặn máy chủ
+        create_email_domain_block: Chặn tên miền email
         create_ip_block: Chặn IP
-        demote_user: Gỡ bỏ chức vụ
-        destroy_announcement: Gỡ thông báo
-        destroy_custom_emoji: Gỡ Emoji
+        demote_user: Xóa chức vụ
+        destroy_announcement: Xóa thông báo
+        destroy_custom_emoji: Xóa Emoji
         destroy_domain_allow: Gỡ máy chủ cho phép
         destroy_domain_block: Gỡ máy chủ chặn
         destroy_email_domain_block: Gỡ email đã chặn
@@ -233,27 +235,28 @@ vi:
         destroy_status: Xóa tút
         disable_2fa_user: Vô hiệu hóa xác thực hai bước
         disable_custom_emoji: Vô hiệu hóa Emoji
-        disable_user: Vô hiệu hóa người dùng
-        enable_custom_emoji: Bật Emoji
-        enable_user: Mở lại người dùng
+        disable_user: Tạm khóa người dùng
+        enable_custom_emoji: Cho phép Emoji
+        enable_user: Mở khóa người dùng
         memorialize_account: Tài khoản tưởng niệm
         promote_user: Chỉ định chức vụ
-        remove_avatar_user: Gỡ bỏ ảnh đại diện
+        remove_avatar_user: Xóa ảnh đại diện
         reopen_report: Mở lại báo cáo
         reset_password_user: Đặt lại mật khẩu
-        resolve_report: Xem xét lại báo cáo
-        sensitive_account: Đánh dấu nhạy cảm cho ảnh và video trên tài khoản của bạn
+        resolve_report: Xử lý báo cáo
+        sensitive_account: Đánh dấu nhạy cảm cho tài khoản
         silence_account: Tài khoản bị ẩn
-        suspend_account: Tài khoản bị vô hiệu hóa
-        unassigned_report: Báo cáo chưa xem
-        unsensitive_account: Ảnh và video trên tài khoản của bạn là bình thường
+        suspend_account: Vô hiệu hóa người dùng
+        unassigned_report: Báo cáo chưa xử lý
+        unsensitive_account: Đánh dấu tài khoản là bình thường
         unsilence_account: Tài khoản bỏ ẩn
-        unsuspend_account: Tài khoản đã ngừng vô hiệu hóa
+        unsuspend_account: Ngừng vô hiệu hóa
         update_announcement: Cập nhật thông báo
         update_custom_emoji: Cập nhật Emoji mới
-        update_status: Cập nhật trạng thái máy chủ
+        update_domain_block: Cập nhật máy chủ chặn
+        update_status: Cập nhật tút
       actions:
-        assigned_to_self_report: "%{name} đã xuất báo cáo %{target} cho chính họ"
+        assigned_to_self_report: "%{name} đã xử lý báo cáo được giao %{target}"
         change_email_user: "%{name} đã thay đổi địa chỉ email cho %{target}"
         confirm_user: "%{name} xác nhận địa chỉ email của người dùng %{target}"
         create_account_warning: "%{name} đã gửi cảnh cáo %{target}"
@@ -261,21 +264,21 @@ vi:
         create_custom_emoji: "%{name} đã tải lên biểu tượng cảm xúc mới %{target}"
         create_domain_allow: "%{name} kích hoạt liên hợp với %{target}"
         create_domain_block: "%{name} chặn máy chủ %{target}"
-        create_email_domain_block: "%{name} chặn địa chỉ email %{target}"
+        create_email_domain_block: "%{name} chặn tên miền email %{target}"
         create_ip_block: "%{name} đã chặn IP %{target}"
-        demote_user: "%{name} đã gỡ bỏ chức vụ %{target}"
-        destroy_announcement: "%{name} gỡ thông báo %{target}"
-        destroy_custom_emoji: "%{name} biểu tượng cảm xúc bị phá hủy %{target}"
+        demote_user: "%{name} đã xóa chức vụ %{target}"
+        destroy_announcement: "%{name} xóa thông báo %{target}"
+        destroy_custom_emoji: "%{name} đã xóa emoji %{target}"
         destroy_domain_allow: "%{name} đã xóa tên miền %{target} khỏi danh sách trắng"
         destroy_domain_block: "%{name} bỏ chặn máy chủ %{target}"
-        destroy_email_domain_block: "%{name} bỏ chặn địa chỉ email %{target}"
+        destroy_email_domain_block: "%{name} bỏ chặn tên miền email %{target}"
         destroy_ip_block: "%{name} bỏ chặn IP %{target}"
-        destroy_status: "%{name} đã gỡ bỏ tút của %{target}"
+        destroy_status: "%{name} đã xóa tút của %{target}"
         disable_2fa_user: "%{name} đã vô hiệu hóa xác thực hai yếu tố của %{target}"
-        disable_custom_emoji: "%{name} đã gỡ bỏ Emoji %{target}"
-        disable_user: "%{name} vô hiệu hóa đăng nhập của người dùng %{target}"
-        enable_custom_emoji: "%{name} kích hoạt Emoji %{target}"
-        enable_user: "%{name} phê duyệt đăng nhập cho người dùng %{target}"
+        disable_custom_emoji: "%{name} đã ẩn emoji %{target}"
+        disable_user: "%{name} tạm khóa %{target}"
+        enable_custom_emoji: "%{name} cho phép Emoji %{target}"
+        enable_user: "%{name} mở khóa cho người dùng %{target}"
         memorialize_account: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm"
         promote_user: "%{name} đã chỉ định chức vụ cho %{target}"
         remove_avatar_user: "%{name} đã xóa ảnh đại diện của %{target}"
@@ -291,11 +294,12 @@ vi:
         unsuspend_account: "%{name} đã ngừng vô hiệu hóa %{target}"
         update_announcement: "%{name} cập nhật thông báo cho %{target}"
         update_custom_emoji: "%{name} đã cập nhật biểu tượng cảm xúc %{target}"
+        update_domain_block: "%{name} cập nhật chặn máy chủ %{target}"
         update_status: "%{name} cập nhật tút của %{target}"
       deleted_status: "(tút đã xóa)"
       empty: Không tìm thấy bản ghi.
       filter_by_action: Lọc theo hành động
-      filter_by_user: Lọc theo người dùng
+      filter_by_user: Lọc theo người
       title: Nhật ký kiểm duyệt
     announcements:
       destroyed_msg: Xóa thông báo thành công!
@@ -310,7 +314,7 @@ vi:
       scheduled_for: Đã lên lịch %{time}
       scheduled_msg: Thông báo đã lên lịch!
       title: Thông báo
-      unpublished_msg: Gỡ bỏ thông báo thành xong!
+      unpublished_msg: Xóa bỏ thông báo thành xong!
       updated_msg: Cập nhật thông báo thành công!
     custom_emojis:
       assign_category: Xếp vào danh mục
@@ -321,14 +325,14 @@ vi:
       create_new_category: Tạo danh mục mới
       created_msg: Emoji được tạo thành công!
       delete: Xóa bỏ
-      destroyed_msg: Đã gỡ Emoji thành công!
+      destroyed_msg: Đã xóa Emoji thành công!
       disable: Vô hiệu hóa
       disabled: Đã vô hiệu hóa
       disabled_msg: Vô hiệu hóa thành công Emoji này
       emoji: Emoji
       enable: Cho phép
-      enabled: Đã kích hoạt
-      enabled_msg: Kích hoạt thành công Emoji này
+      enabled: Đã cho phép
+      enabled_msg: Đã cho phép thành công Emoji này
       image_hint: PNG tối đa 50KB
       list: Danh sách
       listed: Liệt kê
@@ -341,7 +345,7 @@ vi:
       title: Emoji
       uncategorized: Chưa phân loại
       unlist: Bỏ danh sách
-      unlisted: Chưa niêm yết
+      unlisted: Chưa cho phép
       update_failed_msg: Không thể cập nhật Emoji này
       updated_msg: Cập nhật thành công Emoji!
       upload: Tải lên
@@ -394,6 +398,8 @@ vi:
           silence: Ẩn
           suspend: Vô hiệu hóa
         title: Máy chủ bị chặn mới
+      obfuscate: Làm mờ tên máy chủ
+      obfuscate_hint: Làm mờ tên máy chủ trong danh sách nếu giới hạn máy chủ đã bật
       private_comment: Bình luận riêng
       private_comment_hint: Cho biết vì sao chặn máy chủ này để tiện kiểm duyệt viên tham khảo.
       public_comment: Bình luận công khai
@@ -419,21 +425,22 @@ vi:
       view: Xem máy chủ chặn
     email_domain_blocks:
       add_new: Thêm mới
-      created_msg: Đã chặn địa chỉ email này
+      created_msg: Đã chặn tên miền email này
       delete: Xóa bỏ
-      destroyed_msg: Đã bỏ chặn địa chỉ email này
+      destroyed_msg: Đã bỏ chặn tên miền email này
       domain: Địa chỉ email
-      empty: Chưa chặn địa chỉ email nào.
+      empty: Chưa chặn tên miền email nào.
       from_html: từ %{domain}
       new:
         create: Thêm địa chỉ
-        title: Chặn địa chỉ email mới
-      title: Địa chỉ email đã chặn
+        title: Chặn tên miền email mới
+      title: Tên miền email đã chặn
     instances:
       by_domain: Máy chủ
       delivery_available: Cho phép liên kết
+      empty: Không có máy chủ nào.
       known_accounts:
-        other: "%{count} tài khoản đã xác thực"
+        other: "%{count} tài khoản đã biết"
       moderation:
         all: Tất cả
         limited: Hạn chế
@@ -444,7 +451,7 @@ vi:
       total_blocked_by_us: Bị chặn bởi chúng ta
       total_followed_by_them: Được họ theo dõi
       total_followed_by_us: Được quản trị viên theo dõi
-      total_reported: Báo cáo tổng hợp
+      total_reported: Toàn bộ báo cáo
       total_storage: Ảnh và video
     invites:
       deactivate_all: Vô hiệu hóa tất cả
@@ -490,7 +497,7 @@ vi:
       status: Trạng thái hiện tại
       title: Mạng liên hợp
     report_notes:
-      created_msg: Báo cáo tổng hợp kiểm duyệt đã tạo xong!
+      created_msg: Ghi chú kiểm duyệt đã tạo xong!
       destroyed_msg: Đã xóa báo cáo kiểm duyệt!
     reports:
       account:
@@ -501,11 +508,13 @@ vi:
       action_taken_by: Hành động được thực hiện bởi
       are_you_sure: Bạn có chắc không?
       assign_to_self: Giao cho tôi
-      assigned: Phân công kiểm duyệt
+      assigned: Người xử lý
       by_target_domain: Tên tài khoản bị báo cáo
       comment:
         none: Không có mô tả
       created_at: Báo cáo lúc
+      forwarded: Chuyển tiếp
+      forwarded_to: Chuyển tiếp tới %{domain}
       mark_as_resolved: Đánh dấu là đã giải quyết
       mark_as_unresolved: Đánh dấu là chưa giải quyết
       notes:
@@ -527,7 +536,7 @@ vi:
       updated_at: Cập nhật lúc
     settings:
       activity_api_enabled:
-        desc_html: Số lượng trạng thái được đăng tại địa phương, người dùng hoạt động và đăng ký mới trong nhóm hàng tuần
+        desc_html: Thu thập số lượng tút được đăng, người dùng hoạt động và người dùng đăng ký mới hàng tuần
         title: Công khai số liệu thống kê về hoạt động người dùng
       bootstrap_timeline_accounts:
         desc_html: Tách tên người dùng bằng dấu phẩy. Chỉ có hiệu lực với các tài khoản công khai thuộc máy chủ. Mặc định khi trống là tất cả quản trị viên.
@@ -549,6 +558,7 @@ vi:
       domain_blocks_rationale:
         title: Hiển thị lý do
       enable_bootstrap_timeline_accounts:
+        desc_html: Thiết lập người mới đăng ký sẽ tự động theo dõi những tài khoản cho trước nhằm tránh việc bảng tin trống
         title: Gợi ý theo dõi cho người dùng mới
       hero:
         desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Mặc định dùng hình thu nhỏ của máy chủ
@@ -575,6 +585,9 @@ vi:
         min_invite_role:
           disabled: Không một ai
           title: Cho phép lời mời bằng cách
+        require_invite_text:
+          desc_html: Khi chọn phê duyệt người dùng thủ công, hiện “Tại sao bạn muốn đăng ký?” thay cho tùy chọn nhập
+          title: Người đăng ký mới phải nhập mã mời tham gia
       registrations_mode:
         modes:
           approved: Yêu cầu phê duyệt để đăng ký
@@ -743,11 +756,12 @@ vi:
       functional: Tài khoản của bạn đã được xác thực.
       pending: Đơn đăng ký của bạn đang chờ phê duyệt. Điều này có thể mất một thời gian. Bạn sẽ nhận được email nếu đơn đăng ký của bạn được chấp thuận.
       redirecting_to: Tài khoản của bạn không hoạt động vì hiện đang chuyển hướng đến %{acct}.
-    trouble_logging_in: Gặp sự cố khi đăng nhập?
+    too_fast: Nghi vấn đăng ký spam, xin thử lại.
+    trouble_logging_in: Quên mật khẩu?
     use_security_key: Dùng khóa bảo mật
   authorize_follow:
-    already_following: Bạn đang theo dõi người dùng này
-    already_requested: Bạn vừa gửi một yêu cầu theo dõi tới người dùng này
+    already_following: Bạn đang theo dõi người này
+    already_requested: Bạn vừa gửi một yêu cầu theo dõi tới người này
     error: Rất tiếc, đã xảy ra lỗi khi tìm kiếm tài khoản từ nơi khác
     follow: Theo dõi
     follow_request: Bạn đã gửi yêu cầu theo dõi tới
@@ -768,7 +782,7 @@ vi:
       invalid_signature: không phải là chữ ký số Ed25519 đúng
   date:
     formats:
-      default: "%d.%m.%Y"
+      default: "%-d %B, %Y"
       with_month_name: "%B %d, %Y"
   datetime:
     distance_in_words:
@@ -802,8 +816,8 @@ vi:
       username_available: Tên người dùng của bạn sẽ có thể đăng ký lại
       username_unavailable: Tên người dùng của bạn sẽ không thể đăng ký mới
   directories:
-    directory: Kết bạn
-    explanation: Tìm và kết bạn với những người cùng sở thích
+    directory: Khám phá
+    explanation: Tìm và theo dõi những người cùng sở thích
     explore_mastodon: Thành viên %{title}
   domain_validator:
     invalid_domain: không phải là một tên miền hợp lệ
@@ -890,7 +904,7 @@ vi:
         invalid_token: Mã đăng nhập Keybase giống như chữ ký số và phải đảm bảo 66 ký tự hex
         verification_failed: Keybase không nhận ra mã đăng nhập này là chữ ký của người dùng Keybase %{kb_username}. Vui lòng thử lại từ Keybase.
       wrong_user: Không thể tạo bằng chứng cho %{proving} trong khi đăng nhập là %{current}. Đăng nhập bằng %{proving} và thử lại.
-    explanation_html: Tại đây, bạn có thể kết nối mật mã các danh tính khác của mình, chẳng hạn như hồ sơ Keybase. Điều này cho phép người khác gửi cho bạn tin nhắn được mã hóa và tin tưởng nội dung bạn gửi cho họ.
+    explanation_html: Tại đây, bạn có thể kết nối mã hóa tài khoản của bạn trên các nền tảng khác, chẳng hạn như Keybase. Điều này cho phép người khác gửi cho bạn tin nhắn được mã hóa và tin tưởng nội dung bạn gửi cho họ.
     i_am_html: Tôi là %{username} trên %{service}.
     identity: Danh tính
     inactive: Không hoạt động
@@ -901,6 +915,8 @@ vi:
     status: Tình trạng xác minh
     view_proof: Xem bằng chứng
   imports:
+    errors:
+      over_rows_processing_limit: chứa nhiều hơn %{count} hàng
     modes:
       merge: Hợp nhất
       merge_long: Giữ hồ sơ hiện có và thêm hồ sơ mới
@@ -913,7 +929,7 @@ vi:
       bookmarks: Đã lưu
       domain_blocking: Danh sách máy chủ đã chặn
       following: Danh sách người theo dõi
-      muting: Danh sách người dùng ẩn
+      muting: Danh sách người đã ẩn
     upload: Tải lên
   in_memoriam_html: Tưởng Niệm
   invites:
@@ -961,7 +977,7 @@ vi:
     incoming_migrations_html: Để chuyển từ tài khoản khác sang tài khoản này, trước tiên bạn cần <a href="%{path}">tạo tham chiếu tài khoản</a>.
     moved_msg: Tài khoản của bạn hiện đang chuyển hướng đến %{acct} và những người theo dõi bạn cũng sẽ được chuyển đi.
     not_redirecting: Tài khoản của bạn hiện không chuyển hướng đến bất kỳ tài khoản nào khác.
-    on_cooldown: Gần đây bạn đã di chuyển tài khoản của bạn. Chức năng này sẽ trở nên khả dụng một lần nữa sau %{count} ngày.
+    on_cooldown: Bạn vừa mới chuyển tài khoản của bạn đi nơi khác. Chỉ có thể sử dụng tiếp tính năng này sau %{count} ngày.
     past_migrations: Những lần dời nhà cũ
     proceed_with_move: Chuyển hướng người theo dõi
     redirected_msg: Tài khoản của bạn đã chuyển hướng đến %{acct}.
@@ -1044,7 +1060,7 @@ vi:
     truncate: "&hellip;"
   polls:
     errors:
-      already_voted: Bạn đã bình chọn rồi
+      already_voted: Bạn đã bình chọn xong rồi
       duplicate_options: chứa các lựa chọn trùng lặp
       duration_too_long: quá xa so với thời điểm hiện tại
       duration_too_short: quá sớm
@@ -1071,12 +1087,12 @@ vi:
     last_active: Hoạt động lần cuối
     most_recent: Mới nhất
     moved: Đã xóa
-    mutual: Cả hai
+    mutual: Đồng thời
     primary: Bình thường
     relationship: Mối quan hệ
     remove_selected_domains: Xóa hết người theo dõi từ các máy chủ đã chọn
     remove_selected_followers: Xóa những người theo dõi đã chọn
-    remove_selected_follows: Hủy theo dõi người dùng đã chọn
+    remove_selected_follows: Ngưng theo dõi những người đã chọn
     status: Trạng thái tài khoản
   remote_follow:
     acct: Nhập địa chỉ Mastodon của bạn (tên@máy chủ)
@@ -1137,11 +1153,11 @@ vi:
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Điện thoại Windows
-    revoke: Thu hồi
-    revoke_success: Thu hồi phiên thành công
+    revoke: Gỡ
+    revoke_success: Gỡ phiên thành công
     title: Phiên
   settings:
-    account: Tài khoản
+    account: Bảo mật
     account_settings: Cài đặt tài khoản
     aliases: Kết nối tài khoản
     appearance: Giao diện
@@ -1149,12 +1165,12 @@ vi:
     back: Quay lại Mastodon
     delete: Xóa tài khoản
     development: Lập trình
-    edit_profile: Giới thiệu bản thân
+    edit_profile: Cá nhân hóa
     export: Xuất dữ liệu
     featured_tags: Hashtags thường dùng
     identity_proofs: Bằng chứng nhận dạng
     import: Nhập dữ liệu
-    import_and_export: Nhập và xuất dữ liệu
+    import_and_export: Dữ liệu
     migrate: Chuyển tài khoản sang máy chủ khác
     notifications: Thông báo
     preferences: Chung
@@ -1167,7 +1183,7 @@ vi:
   statuses:
     attached:
       audio:
-        other: "%{count} bài hát"
+        other: "%{count} âm thanh"
       description: 'Đính kèm: %{attached}'
       image:
         other: "%{count} hình ảnh"
@@ -1180,7 +1196,7 @@ vi:
     errors:
       in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại.
     language_detection: Tự động phát hiện ngôn ngữ
-    open_in_web: Mở trên web
+    open_in_web: Xem trong Mastodon
     over_character_limit: vượt quá giới hạn %{max} ký tự
     pin_errors:
       limit: Bạn đã ghim quá số lượng tút cho phép
@@ -1191,7 +1207,7 @@ vi:
       total_people:
         other: "%{count} người"
       total_votes:
-        other: "%{count} bình chọn"
+        other: "%{count} người"
       vote: Bình chọn
     show_more: Đọc thêm
     show_newer: Mới hơn
@@ -1200,12 +1216,12 @@ vi:
     sign_in_to_participate: Đăng nhập để trả lời chủ đề này
     title: '%{name}: "%{quote}"'
     visibilities:
-      private: Đóng
+      private: Người theo dõi
       private_long: Chỉ người theo dõi mới xem được tút
       public: Công khai
       public_long: Ai cũng có thể thấy
-      unlisted: Mở
-      unlisted_long: Công khai nhưng không hiện trên bảng tin máy chủ
+      unlisted: Riêng tư
+      unlisted_long: Không hiện trên bảng tin máy chủ
   stream_entries:
     pinned: Tút được ghim
     reblogged: chia sẻ
@@ -1219,28 +1235,28 @@ vi:
 
       <ul>
       <li><em>Thông tin tài khoản cơ bản</em>: Nếu bạn đăng ký trên máy chủ này, bạn phải cung cấp tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể tùy chọn bổ sung tên hiển thị, mô tả, ảnh đại diện, ảnh bìa. Tên người dùng, tên hiển thị, mô tả, ảnh hồ sơ và ảnh bìa luôn được hiển thị công khai.</li>
-      <li><em>Tút, lượt theo dõi và thông tin công khai khác</em>: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn gửi tin nhắn, ngày giờ và ứng dụng sử dụng được lưu trữ. Tin nhắn có thể chứa tệp đính kèm hình ảnh và video. Bài viết công khai và bài viết đóng sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là thông tin công khai. Tút của bạn được gửi đến những người theo dõi của bạn, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và sẽ có các bản sao được lưu trữ ở đó. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.</li>
-      <li><em>Tin nhắn và tút chỉ dành cho người theo dõi</em>: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút chỉ dành cho người theo dõi được gửi đến những người theo dõi và người dùng của bạn được gắn thẻ trong đó. Còn các tin nhắn chỉ được gửi cho người dùng được gắn thẻ trong đó. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi khuyến nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét các máy chủ của người theo dõi của bạn. Bạn có thể thiết lập phê duyệt và từ chối người theo dõi mới theo cách thủ công trong cài đặt. <em>Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn</em>. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. <em>Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.</em></li>
-      <li> <em>Địa chỉ IP và siêu dữ liệu khác</em>: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP bạn đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những yêu cầu truy cập máy chủ của chúng tôi. </li>
+      <li><em>Tút, lượt theo dõi và nội dung công khai khác</em>: Danh sách những người bạn theo dõi được liệt kê công khai, cũng tương tự như danh sách những người theo dõi bạn. Khi bạn đăng tút, ngày giờ và ứng dụng sử dụng được lưu trữ. Tút có thể chứa tệp đính kèm hình ảnh và video. Tút công khai và tút mở sẽ hiển thị công khai. Khi bạn đăng một tút trên trang cá nhân của bạn, đó là nội dung công khai. Tút của bạn sẽ gửi đến những người theo dõi của bạn, đồng nghĩa với việc sẽ có các bản sao được lưu trữ ở máy chủ của họ. Khi bạn xóa bài viết, bản sao từ những người theo dõi của bạn cũng bị xóa theo. Hành động chia sẻ hoặc thích một tút luôn luôn là công khai.</li>
+      <li><em>Tin nhắn và tút dành cho người theo dõi</em>: Tất cả tút được lưu trữ và xử lý trên máy chủ. Các tút dành cho người theo dõi được gửi đến những người theo dõi và những người được gắn thẻ trong tút. Còn các tin nhắn chỉ được gửi đến cho người nhận. Điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và có các bản sao được lưu trữ ở đó. Chúng tôi đề nghị chỉ cho những người được ủy quyền truy cập vào đó, nhưng không phải máy chủ nào cũng làm như vậy. Do đó, điều quan trọng là phải xem xét kỹ máy chủ của người theo dõi của bạn. Bạn có thể thiết lập tự mình phê duyệt và từ chối người theo dõi mới trong cài đặt. <em>Xin lưu ý rằng quản trị viên máy chủ của bạn và bất kỳ máy chủ của người nhận nào cũng có thể xem các tin nhắn</em>. Người nhận tin nhắn có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. <em>Không nên chia sẻ bất kỳ thông tin rủi ro nào trên Mastodon.</em></li>
+      <li> <em>Địa chỉ IP và siêu dữ liệu khác</em>: Khi bạn đăng nhập, chúng tôi ghi nhớ địa chỉ IP đăng nhập cũng như tên trình duyệt của bạn. Tất cả các phiên đăng nhập sẽ để bạn xem xét và hủy bỏ trong phần cài đặt. Địa chỉ IP sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của những lượt đăng ký tài khoản trên máy chủ của chúng tôi. </li>
       </ul><hr class="spacer" />
       <h3 id="use"> Chúng tôi sử dụng thông tin của bạn để làm gì? </h3>
       <p> Bất kỳ thông tin nào chúng tôi thu thập từ bạn là: </p>
       <ul>
-      <li>Để cung cấp các chức năng cốt lõi của Mastodon. Bạn chỉ có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn khi bạn đã đăng nhập. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin cá nhân hóa của bạn.</li>
-      <li>Để hỗ trợ kiểm duyệt cộng đồng, ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc vi phạm khác.</li>
-      <li>Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi cho bạn thông tin, thông báo về những người khác tương tác với nội dung của bạn hoặc gửi tin nhắn cho bạn hoặc để trả lời các câu hỏi cũng như các yêu cầu khác từ chính bạn.</li>
+      <li>Để cung cấp các chức năng cốt lõi của Mastodon. Sau khi đăng nhập, bạn mới có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn. Ví dụ: bạn có thể theo dõi người khác để xem các tút của họ trong bảng tin của bạn.</li>
+      <li>Để hỗ trợ kiểm duyệt. Ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định hacker hoặc spammer.</li>
+      <li>Địa chỉ email bạn cung cấp chỉ được sử dụng để gửi các thông báo quan trọng, trả lời các câu hỏi cũng như yêu cầu khác từ chính bạn.</li>
       </ul>
       <hr class="spacer" />
       <h3 id="protect">Chúng tôi bảo vệ thông tin của bạn như thế nào? </h3>
-      <p>Chúng tôi thực hiện nhiều biện pháp bảo mật để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là biện pháp kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API của bạn, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.</p>
+      <p>Chúng tôi thực hiện nhiều biện pháp để duy trì sự an toàn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Một vài trong số đó như là kiểm soát phiên đăng nhập của bạn, lưu lượng giữa các ứng dụng và API, bảo mật bằng SSL và băm nhỏ mật khẩu nhờ thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình.</p>
       <hr class="spacer" />
       <h3 id="data-retention">Chúng tôi lưu trữ dữ liệu như thế nào?</h3>
-      <p>Chúng tôi sẽ thực hiện:</p>
+      <p>Chúng tôi tiến hành:</p>
       <ul>
-      <li>Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó được lưu giữ, không quá 90 ngày.</li>
-      <li>Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký không quá 12 tháng.</li>
+      <li>Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó bị xóa đi trong vòng 90 ngày.</li>
+      <li>Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký trong vòng 12 tháng.</li>
       </ul>
-      <p>Bạn có thể tải xuống một bản sao nội dung lưu trữ của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và hảnh bìa.</p>
+      <p>Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và ảnh bìa.</p>
       <p> Bạn có thể xóa tài khoản của mình bất cứ lúc nào.</p>
       <hr class="spacer"/>
       <h3 id="cookies">Chúng tôi có sử dụng cookie không?</h3>
@@ -1248,9 +1264,9 @@ vi:
       <p> Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.</p>
       <hr class="spacer" />
       <h3 id="disclose">Chúng tôi có tiết lộ bất cứ thông tin nào ra ngoài không?</h3>
-      <p>Chúng tôi thề danh dự không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn khi chúng tôi tin rằng việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc của ai đó.</p>
-      <p>Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên kết. Các tút công khai và chỉ dành cho người theo dõi của bạn được gửi đến các máy chủ nơi người theo dõi của bạn thuộc về và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.</p>
-      <p> Khi bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.</p>
+      <p>Chúng tôi không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn nếu việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc bất kỳ ai.</p>
+      <p>Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng liên hợp. Các tút công khai hay dành cho người theo dõi được gửi đến các máy chủ nơi người theo dõi của bạn là thành viên và tin nhắn được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó chuyển sang một máy chủ khác.</p>
+      <p>Nếu bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.</p>
       <hr class="spacer" />
       <h3 id="children">Cấm trẻ em sử dụng</h3>
       <p>Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">Quy định bảo vệ dữ liệu chung</a>) thì không được sử dụng trang web này. </p>
@@ -1259,8 +1275,8 @@ vi:
       <hr class="spacer" />
       <h3 id="changes">Cập nhật thay đổi</h3>
       <p>Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.</p>
-      <p>Tài liệu này phát hành dưới hình thức CC-BY-SA. Nó được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.</p>
-      <p>Biên tập từ <a href="https://github.com/discourse/discourse">Discourse</a>.</p>
+      <p>Tài liệu này phát hành dưới hình thức CC-BY-SA và được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.</p>
+      <p>Chỉnh sửa và hoàn thiện từ <a href="https://github.com/discourse/discourse">Discourse</a>.</p>
     title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật"
   themes:
     contrast: Mastodon (Độ tương phản cao)
diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml
index 8e4867b2f..0123836ec 100644
--- a/config/locales/zgh.yml
+++ b/config/locales/zgh.yml
@@ -5,15 +5,23 @@ zgh:
     api: API
     contact: ⴰⵎⵢⴰⵡⴰⴹ
     learn_more: ⵙⵙⵏ ⵓⴳⴳⴰⵔ
+    status_count_after:
+      one: ⴰⴷⴷⴰⴷ
+      other: ⴰⴷⴷⴰⴷⵏ
     unavailable_content_description:
       domain: ⴰⵎⴰⴽⴽⴰⵢ
     what_is_mastodon: ⵎⴰ'ⵢⴷ ⵉⴳⴰⵏ ⵎⴰⵙⵜⵔⴷⵓⵎ?
   accounts:
     follow: ⴹⴼⵕ
+    followers:
+      one: ⴰⵎⴹⴼⴰⵕ
+      other: ⵉⵎⴹⴼⴰⵕⵏ
+    media: ⵉⵙⵏⵖⵎⵉⵙⵏ
     never_active: ⵓⵙⴰⵔ
     roles:
       bot: ⴰⴱⵓⵜ
       group: ⵜⴰⵔⴰⴱⴱⵓⵜ
+    unfollow: ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ
   admin:
     account_moderation_notes:
       delete: ⴽⴽⵙ
@@ -28,6 +36,7 @@ zgh:
       edit: ⵙⵏⴼⵍ
       email: ⵉⵎⴰⵢⵍ
       email_status: ⴰⴷⴷⴰⴷ ⵏ ⵢⵉⵍⴰⵢⵍ
+      followers: ⵉⵎⴹⴼⴰⵕⵏ
       location:
         all: ⵎⴰⵕⵕⴰ
         local: ⴰⴷⵖⴰⵔⴰⵏ
@@ -137,8 +146,12 @@ zgh:
   notification_mailer:
     mention:
       action: ⵔⴰⵔ
+  relationships:
+    remove_selected_follows: ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ ⵉ ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⵙⵜⵢⵏⵉⵏ
   settings:
     account: ⴰⵎⵉⴹⴰⵏ
     account_settings: ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵎⵉⴹⴰⵏ
+    back: ⴰⵖⵓⵍ ⵖⵔ ⵎⴰⵙⵜⵓⴷⵓⵏ
+    edit_profile: ⵙⵏⴼⵍ ⵉⴼⵔⵙ
     notifications: ⵜⵉⵏⵖⵎⵉⵙⵉⵏ
     profile: ⵉⴼⵔⵙ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index f93d6c03f..c44e2ce5b 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -57,6 +57,7 @@ zh-CN:
     followers:
       other: 关注者
     following: 正在关注
+    instance_actor_flash: 这个账户是虚拟账户,用来代表服务器自身,不代表任何实际用户。它用于互通功能,不应该封禁。
     joined: 加入于 %{date}
     last_active: 最近活动
     link_verified_on: 此链接的所有权已在 %{date} 检查
@@ -127,6 +128,7 @@ zh-CN:
       follows: 正在关注
       header: 个人资料页横幅图片
       inbox_url: 收件箱(Inbox)URL
+      invite_request_text: 加入理由
       invited_by: 邀请者为
       ip: IP 地址
       joined: 加入于
@@ -251,6 +253,7 @@ zh-CN:
         unsuspend_account: 解除账号封禁
         update_announcement: 更新公告
         update_custom_emoji: 更新自定义表情符号
+        update_domain_block: 更新域名屏蔽
         update_status: 更新嘟文
       actions:
         assigned_to_self_report: "%{name} 接管了举报 %{target}"
@@ -291,6 +294,7 @@ zh-CN:
         unsuspend_account: "%{name} 解除了用户 %{target} 的封禁状态"
         update_announcement: "%{name} 更新了公告 %{target}"
         update_custom_emoji: "%{name} 更新了自定义表情 %{target}"
+        update_domain_block: "%{name} 更新了对 %{target} 的域名屏蔽"
         update_status: "%{name} 刷新了 %{target} 的嘟文"
       deleted_status: "(嘟文已删除)"
       empty: 没有找到日志
@@ -394,6 +398,8 @@ zh-CN:
           silence: 自动隐藏
           suspend: 自动封禁
         title: 新增域名屏蔽
+      obfuscate: 混淆域名
+      obfuscate_hint: 如果启用了域名列表公开限制,就部分混淆列表中的域名
       private_comment: 私密评论
       private_comment_hint: 给这一域名限制添加备注,供监察员内部使用
       public_comment: 公开评论
@@ -432,6 +438,7 @@ zh-CN:
     instances:
       by_domain: 域名
       delivery_available: 可投递
+      empty: 暂无域名。
       known_accounts:
         other: "%{count} 个已知帐户"
       moderation:
@@ -506,6 +513,8 @@ zh-CN:
       comment:
         none: 没有
       created_at: 举报时间
+      forwarded: 已转发
+      forwarded_to: 转发举报至 %{domain}
       mark_as_resolved: 标记为“已处理”
       mark_as_unresolved: 标记为“未处理”
       notes:
@@ -549,6 +558,7 @@ zh-CN:
       domain_blocks_rationale:
         title: 显示理由
       enable_bootstrap_timeline_accounts:
+        desc_html: 让新用户自动关注指定用户,这样,他们的主页时间线就不会在一开始的时候空空荡荡
         title: 开启新用户默认关注功能
       hero:
         desc_html: 将用于在首页展示。推荐使用分辨率 600×100px 以上的图片。如未设置,将默认使用本站缩略图。
@@ -575,6 +585,9 @@ zh-CN:
         min_invite_role:
           disabled: 没有人
           title: 允许发送邀请的用户组
+        require_invite_text:
+          desc_html: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项
+          title: 要求新用户填写申请注册的原因
       registrations_mode:
         modes:
           approved: 注册时需要批准
@@ -743,6 +756,7 @@ zh-CN:
       functional: 您的帐号可以正常使用了。
       pending: 工作人员正在审核您的申请。这需要花点时间。在申请被批准后,您将收到一封电子邮件。
       redirecting_to: 您的帐户无效,因为它已被设置为跳转到 %{acct}
+    too_fast: 表单提交过快,请重试。
     trouble_logging_in: 登录有问题?
     use_security_key: 使用安全密钥
   authorize_follow:
@@ -901,6 +915,8 @@ zh-CN:
     status: 验证状态
     view_proof: 查看证明
   imports:
+    errors:
+      over_rows_processing_limit: 包含行数超过了 %{count}
     modes:
       merge: 合并
       merge_long: 保留现有记录并添加新的记录
@@ -1332,7 +1348,7 @@ zh-CN:
     warning:
       explanation:
         disable: 虽然您的帐户被冻结,您的帐户数据仍然完整;但是您无法在解锁前执行任何操作。
-        sensitive: 你上传的媒体文件和链接的媒体将被视作敏感内容。
+        sensitive: 你上传的媒体文件和媒体链接将被视作敏感内容。
         silence: 当您的帐户受限时,只有已经关注过你的人才会这台服务器上看到你的嘟文,并且您会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。
         suspend: 您的帐户已被封禁,所有的嘟文和您上传的媒体文件都已经从该服务器和您的关注者的服务器上删除并且不可恢复。
       get_in_touch: 您可回复该邮件以联系 %{instance} 的工作人员。
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index bb0cc716d..2140db4aa 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -1,116 +1,136 @@
 ---
 zh-HK:
   about:
-    about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要你有任何 Mastodon 服務站、或者聯盟網站的用戶,便可以與他們互動。
-    about_mastodon_html: Mastodon(萬象)是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
+    about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要你是任何聯盟網站的用戶,便可以與他們互動。
+    about_mastodon_html: Mastodon(萬象)是屬於未來的社交網絡︰無廣告煩擾、無企業監控、設計講道義、分散無大台!立即重奪個人資料的控制權,使用 Mastodon 吧!
     about_this: 關於本服務站
     active_count_after: 活躍
     active_footnote: 每月活躍使用者 (MAU)
     administered_by: 管理者:
     api: API
-    apps: 行動應用程式
+    apps: 手機 App
     apps_platforms: 在 iOS、Android 和其他平台使用 Mastodon
     browse_directory: 依興趣瀏覽個人資料目錄和過濾器
-    browse_local_posts: 瀏覽這台伺服器中公開嘟文的直播串流
-    browse_public_posts: 在 Mastodon 瀏覽公開嘟文的即時串流
+    browse_local_posts: 瀏覽這個伺服器的公開文章即時串流
+    browse_public_posts: 在 Mastodon 瀏覽公開文章的即時串流
     contact: 聯絡
     contact_missing: 未設定
-    contact_unavailable: 未公開
+    contact_unavailable: 不適用
     discover_users: 探索使用者
-    documentation: 文件
-    federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。
-    get_apps: 嘗試行動應用程式
-    hosted_on: 在 %{domain} 運作的 Mastodon 服務站
+    documentation: 說明文件
+    federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤任何 Mastodon 服務站上的人!
+    get_apps: 嘗試使用手機 App
+    hosted_on: 在 %{domain} 運作的 Mastodon 伺服器
+    instance_actor_flash: |
+      這個帳戶是代表伺服器,而非代表任何個人用戶的虛擬帳號。
+      此帳戶是為聯盟協定而設。除非你想封鎖整個伺服器的話,否則請不要封鎖這個帳戶。如果你想封鎖伺服器,請使用網域封鎖以達到相同效果。
     learn_more: 了解更多
     privacy_policy: 隱私權政策
     see_whats_happening: 看看發生什麼事
     server_stats: 伺服器統計:
     source_code: 源代碼
     status_count_after:
-      other: 條嘟文
-    status_count_before: 他們共發佈了
+      other: 篇文章
+    status_count_before: 共發佈了
     tagline: 關注朋友並探索新朋友
     terms: 使用條款
-    unavailable_content: 無法取得的內容
+    unavailable_content: 受限制的伺服器
     unavailable_content_description:
       domain: 伺服器
       reason: 原因
+      rejecting_media: 這些伺服器的媒體檔案將不會被處理或儲存,我們亦不會展示其縮圖。請手動點擊以觀看原始檔:
+      rejecting_media_title: 被篩選的媒體檔案
+      silenced: 除非你已經關注個別使用者,否則來自這些伺服器的文章和通知將會被隱藏。
+      silenced_title: 已靜音的伺服器
+      suspended: 來自這些伺服器的所有數據將不會被處理。你將不可能聯絡來自這些伺服器的使用者。
+      suspended_title: 已停權的伺服器
+    unavailable_content_html: Mastodon 通常讓你瀏覽其他社交聯盟網站的所有內容,但是對於這個特定網站,有這些特別的例外規則。
     user_count_after:
       other: 位使用者
-    user_count_before: 這裏共註冊有
-    what_is_mastodon: Mastodon 是甚麼?
+    user_count_before: 本站共有
+    what_is_mastodon: Mastodon (萬象)是甚麼?
   accounts:
     choices_html: "%{name} 的選擇:"
+    endorsements_hint: 你可以推薦正在關注的人,他們會被顯示在你的個人頁面。
+    featured_tags_hint: 你可以推薦不同標籤,它們也會在此處出現。
     follow: 關注
     followers:
       other: 關注者
     following: 正在關注
-    joined: 加入於 %{date}
+    instance_actor_flash: 這個帳戶是結盟用的本伺服器的虛擬象徵,並不代表任何個別用戶。請不要把帳號停權。
+    joined: 於 %{date} 加入
     last_active: 上次活躍時間
     link_verified_on: 此連結的所有權已在 %{date} 檢查過
     media: 媒體
     moved_html: "%{name} 已經轉移到 %{new_profile_link}:"
     network_hidden: 此信息不可用
     never_active: 永不
-    nothing_here: 暫時未有內容可以顯示。
+    nothing_here: 暫時未有內容可以顯示!
     people_followed_by: "%{name} 關注的人"
     people_who_follow: 關注 %{name} 的人
+    pin_errors:
+      following: 你只能推薦你正在關注的使用者。
     posts:
-      other: 嘟文
-    posts_tab_heading: 嘟文
-    posts_with_replies: 文章和回覆
-    reserved_username: 此用戶名已被保留
+      other: 文章
+    posts_tab_heading: 文章
+    posts_with_replies: 包含回覆的文章
+    reserved_username: 這個使用者名稱已被保留
     roles:
       admin: 管理員
       bot: 機械人
       group: 群組
-      moderator: 監察員
+      moderator: 板主
     unavailable: 無法取得個人檔案
     unfollow: 取消關注
   admin:
     account_actions:
       action: 執行動作
-      title: 在 %{acct} 執行管理員動作
+      title: 在 %{acct} 執行管理操作
     account_moderation_notes:
-      create: 記錄
-      created_msg: 管理記錄已新增
+      create: 加入管理紀錄
+      created_msg: 已新增管理紀錄
       delete: 刪除
-      destroyed_msg: 管理記錄已被刪除
+      destroyed_msg: 管理紀錄已被刪除
     accounts:
-      add_email_domain_block: 將電子郵件網域加入黑名單
+      add_email_domain_block: 封鎖電郵網域
       approve: 核准
       approve_all: 全部批准
+      approved_msg: 成功審核了%{username} 的新帳號申請
       are_you_sure: 你確定嗎?
       avatar: 頭像
       by_domain: 域名
       change_email:
         changed_msg: 帳號電郵更新成功!
         current_email: 現時電郵
-        label: 改變電郵
+        label: 更改電郵
         new_email: 新的電郵
         submit: 改變電郵
         title: 改變 %{username} 的電郵
       confirm: 確定
       confirmed: 已確定
       confirming: 確定
+      delete: 刪除資料
       deleted: 已刪除
-      demote: 降任
+      demote: 降權
+      destroyed_msg: 即將刪除 %{username} 的數據
       disable: 停用
-      disable_two_factor_authentication: 停用雙重認證
-      disabled: 已停用
+      disable_two_factor_authentication: 關閉雙重認證
+      disabled: 已凍結
       display_name: 顯示名稱
       domain: 域名
       edit: 編輯
       email: 電郵地址
-      email_status: 电子邮件状态
-      enable: 啟用
+      email_status: 電郵狀態
+      enable: 解除凍結
       enabled: 已啟用
+      enabled_msg: 成功解除 %{username} 帳號的凍結
       followers: 關注者
       follows: 正在關注
-      header: 開頭
+      header: 個人資料頁頂圖片
       inbox_url: 收件箱(Inbox)URL
+      invite_request_text: 加入的原因
       invited_by: 邀請者
-      ip: IP 位域
+      ip: IP 位址
       joined: 已加入
       location:
         all: 全部
@@ -120,117 +140,179 @@ zh-HK:
       login_status: 登入狀態
       media_attachments: 媒體檔案
       memorialize: 設定為追悼帳戶
+      memorialized: 被悼念的
+      memorialized_msg: 成功將%{username} 的帳號變為紀念帳號
       moderation:
         active: 活躍
         all: 全部
-        pending: 等待中
+        pending: 處理中
         silenced: 被靜音的
-        suspended: 被停權的
+        suspended: 已停權
         title: 管理操作
-      moderation_notes: 管理記錄
-      most_recent_activity: 最新活動
-      most_recent_ip: 最新 IP 位域
+      moderation_notes: 管理備註
+      most_recent_activity: 最近活動
+      most_recent_ip: 最近的 IP 位址
+      no_account_selected: 因未選擇帳號而未有任何變更
       no_limits_imposed: 未受限制
       not_subscribed: 未訂閱
       pending: 等待審核中
-      perform_full_suspension: 完全停權
-      promote: 升任
+      perform_full_suspension: 已停權
+      promote: 提升權限
       protocol: 協議
-      public: 公共
+      public: 公開
       push_subscription_expires: PuSH 訂閱過期
-      redownload: 更新頭像
+      redownload: 更新頁面
+      redownloaded_msg: 成功重新載入 %{username} 的個人資料頁面
       reject: 拒絕
       reject_all: 全部拒絕
-      remove_avatar: 取消頭像
-      remove_header: 移除開頭
+      rejected_msg: 成功拒絕了 %{username} 的新帳號申請
+      remove_avatar: 刪除頭像
+      remove_header: 移除頁面頂端
+      removed_avatar_msg: 成功刪除 %{username} 的頭像
+      removed_header_msg: 成功刪除 %{username} 的頁面頂端圖片
       resend_confirmation:
-        already_confirmed: 该用户已被确认
-        send: 重发确认邮件
-        success: 确认电子邮件成功发送!
+        already_confirmed: 這個使用者先前已經被確認過
+        send: 重寄確認郵件
+        success: 確認電郵發送成功!
       reset: 重設
       reset_password: 重設密碼
       resubscribe: 重新訂閱
-      role: 身份
+      role: 權限
       roles:
         admin: 管理員
-        moderator: 監察員
-        staff: 管理人員
-        user: 普通用戶
-      search: 搜索
-      search_same_email_domain: 其他有同個電子郵件網域的使用者
-      search_same_ip: 其他有同個 IP 的使用者
+        moderator: 管理員
+        staff: 工作人員
+        user: 普通使用者
+      search: 搜尋
+      search_same_email_domain: 其他有相同電郵網域的使用者
+      search_same_ip: 其他有相同 IP 位址的使用者
       sensitive: 敏感内容
       sensitized: 已標記為敏感內容
       shared_inbox_url: 公共收件箱(Shared Inbox)URL
       show:
-        created_reports: 此用戶所提舉報的紀錄
-        targeted_reports: 此用戶被舉報的紀錄
+        created_reports: 舉報紀錄
+        targeted_reports: 被其他人舉報的紀錄
       silence: 靜音
       silenced: 已靜音
       statuses: 文章
       subscribe: 訂閱
       suspended: 已停權
-      time_in_queue: 正在佇列等待 %{time}
-      title: 用戶
+      suspension_irreversible: 已永久刪除此帳號的數據。你可以取消此帳號的停權狀態,但帳號的資料已被永久刪除。
+      suspension_reversible_hint_html: 此帳戶已被停權及所有數據將會於 %{date} 被刪除。在此之前,你仍可以完全回復帳號。如果你想即時刪除此帳戶的資料,可以在下面進行操作。
+      time_in_queue: 排隊中 %{time}
+      title: 帳號
       unconfirmed_email: 未確認的電郵
+      undo_sensitized: 取消敏感狀態
       undo_silenced: 解除靜音
       undo_suspension: 解除停權
+      unsilenced_msg: 成功取消對 %{username} 帳號的限制
       unsubscribe: 取消訂閱
-      username: 用戶名稱
+      unsuspended_msg: 成功取消對 %{username} 帳號的停權操作
+      username: 使用者名稱
+      view_domain: 查看域名概要
       warn: 警告
-      web: 用戶頁面
-      whitelisted: 已加入白名單
+      web: 頁面
+      whitelisted: 容許互傳文章
     action_logs:
+      action_types:
+        assigned_to_self_report: 指派舉報
+        change_email_user: 更改使用者的電郵
+        confirm_user: 確認使用者
+        create_account_warning: 新增警告
+        create_announcement: 建立公告
+        create_custom_emoji: 新增自訂的 Emoji
+        create_domain_allow: 新增允許的域名
+        create_domain_block: 封鎖域名
+        create_email_domain_block: 封鎖電郵域名
+        create_ip_block: 新增IP規則
+        demote_user: 將帳號降級
+        destroy_announcement: 刪除公告
+        destroy_custom_emoji: 刪除自定的 Emoji 表情符號
+        destroy_domain_allow: 刪除允許的域名
+        destroy_domain_block: 刪除已封鎖的域名
+        destroy_email_domain_block: 刪除已封鎖的電郵城名
+        destroy_ip_block: 刪除 IP 規則
+        destroy_status: 刪除文章
+        disable_2fa_user: 停用兩步驟驗證
+        disable_custom_emoji: 停用自定的 Emoji 表情符號
+        disable_user: 停用帳號
+        enable_custom_emoji: 啟用自定的 Emoji 表情符號
+        enable_user: 啟用帳號
+        memorialize_account: 把帳號設定為悼念帳號
+        promote_user: 提升帳號權限
+        remove_avatar_user: 刪除頭像
+        reopen_report: 重開舉報個案
+        reset_password_user: 重設密碼
+        resolve_report: 解決舉報個案
+        sensitive_account: 把你的帳號的媒體設定為敏感內容
+        silence_account: 把帳號靜音
+        suspend_account: 把帳號停權
+        unassigned_report: 取消指派舉報
+        unsensitive_account: 取消把你帳號的媒體設定為敏感內容
+        unsilence_account: 取消帳號的靜音狀態
+        unsuspend_account: 取消帳號的停權狀態
+        update_announcement: 更新公告
+        update_custom_emoji: 更新自定的 Emoji 表情符號
+        update_domain_block: 更新域名阻隔
+        update_status: 更新文章
       actions:
         assigned_to_self_report: "%{name} 指派了 %{target} 的舉報給自己"
-        change_email_user: "%{name} 改變了用戶 %{target} 的電郵地址"
-        confirm_user: "%{name} 確認了用戶 %{target} 的電郵地址"
-        create_account_warning: "%{name} 已對 %{target} 送出警告"
-        create_announcement: "%{name} 建立了新公告 %{target}"
-        create_custom_emoji: "%{name} 加入自訂表情符號 %{target}"
-        create_domain_allow: "%{name} 將 %{target} 網域加入黑名單了"
-        create_domain_block: "%{name} 阻隔了網域 %{target}"
-        create_email_domain_block: "%{name} 阻隔了電郵網域 %{target}"
-        demote_user: "%{name} 把用戶 %{target} 降任"
+        change_email_user: "%{name} 改變了使用者 %{target} 的電郵地址"
+        confirm_user: "%{name} 確認了使用者 %{target} 的電郵地址"
+        create_account_warning: "%{name} 已警告了 %{target}"
+        create_announcement: "%{name} 新增了公告 %{target}"
+        create_custom_emoji: "%{name} 加入了新的 Emoji %{target}"
+        create_domain_allow: "%{name} 和 %{target} 網域結盟了"
+        create_domain_block: "%{name} 封鎖了網域 %{target}"
+        create_email_domain_block: "%{name} 封鎖了電郵網域 %{target}"
+        create_ip_block: "%{name} 已經設定了針對 IP %{target} 的規則"
+        demote_user: "%{name} 把使用者 %{target} 降權"
         destroy_announcement: "%{name} 刪除了公告 %{target}"
-        destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號"
-        destroy_domain_allow: "%{name} 從白名單中移除了 %{target} 網域"
-        destroy_domain_block: "%{name} 取消了對網域 %{target} 的阻隔"
-        destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的阻隔"
+        destroy_custom_emoji: "%{name} 刪除了 Emoji %{target}"
+        destroy_domain_allow: "%{name} 禁止了與 %{target} 網域進行訊息聯網"
+        destroy_domain_block: "%{name} 取消了對網域 %{target} 的封鎖"
+        destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的封鎖"
+        destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則"
         destroy_status: "%{name} 刪除了 %{target} 的文章"
-        disable_2fa_user: "%{name} 停用了用戶 %{target} 的雙重認證"
-        disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}"
-        disable_user: "%{name} 把用戶 %{target} 設定為禁止登入"
-        enable_custom_emoji: "%{name} 啟用了自訂表情符號 %{target}"
-        enable_user: "%{name} 把用戶 %{target} 設定為允許登入"
+        disable_2fa_user: "%{name} 停用了使用者 %{target} 的雙重認證"
+        disable_custom_emoji: "%{name} 停用了 Emoji %{target}"
+        disable_user: "%{name} 把使用者 %{target} 設定為禁止登入"
+        enable_custom_emoji: "%{name} 啟用了 Emoji %{target}"
+        enable_user: "%{name} 把使用者 %{target} 設定為允許登入"
         memorialize_account: "%{name} 把 %{target} 設定為追悼帳戶"
-        promote_user: "%{name} 對用戶 %{target} 进行了升任操作"
+        promote_user: "%{name} 對提升了使用者 %{target} 的權限"
         remove_avatar_user: "%{name} 取消了 %{target} 的頭像"
-        reopen_report: "%{name} 重開 %{target} 的舉報"
-        reset_password_user: "%{name} 重設了用戶 %{target} 的密碼"
-        resolve_report: "%{name} 處理了 %{target} 的舉報"
-        silence_account: "%{name} 靜音了用戶 %{target}"
-        suspend_account: "%{name} 停權了用戶 %{target}"
+        reopen_report: "%{name} 重開 %{target} 的舉報個案"
+        reset_password_user: "%{name} 重設了使用者 %{target} 的密碼"
+        resolve_report: "%{name} 處理了 %{target} 的舉報個案"
+        sensitive_account: "%{name} 將 %{target} 的媒體檔案列為敏感"
+        silence_account: "%{name} 靜音了帳號 %{target}"
+        suspend_account: "%{name} 將帳號 %{target} 停權"
         unassigned_report: "%{name} 取消指派 %{target} 的舉報"
+        unsensitive_account: "%{name} 取消將 %{target} 的媒體檔案的設為敏感"
         unsilence_account: "%{name} 取消了用戶 %{target} 的靜音狀態"
-        unsuspend_account: "%{name} 取消了用戶 %{target} 的停權狀態"
+        unsuspend_account: "%{name} 取消了帳號 %{target} 的停權狀態"
         update_announcement: "%{name} 更新了公告 %{target}"
-        update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}"
-        update_status: "%{name} 刷新了 %{target} 的文章"
-      deleted_status: "(已刪除嘟文)"
+        update_custom_emoji: "%{name} 更新了 Emoji 表情符號 %{target}"
+        update_domain_block: "%{name} 更新了對 %{target} 的域名阻隔"
+        update_status: "%{name} 更新了 %{target} 的文章"
+      deleted_status: "(已刪除文章)"
+      empty: 找不到任何日誌。
+      filter_by_action: 按動作篩選
+      filter_by_user: 按帳號篩選
       title: 營運日誌
     announcements:
       destroyed_msg: 成功刪除公告!
       edit:
         title: 編輯公告
       empty: 找不到公告。
-      live: 直播
+      live: 在線
       new:
         create: 建立公告
         title: 新增公告
       published_msg: 成功發布公告!
       scheduled_for: 排定 %{time}
-      scheduled_msg: 公告已排定公開!
+      scheduled_msg: 公告已排程!
       title: 公告
       unpublished_msg: 成功取消發布公告!
       updated_msg: 成功更新公告!
@@ -239,7 +321,7 @@ zh-HK:
       by_domain: 網域
       copied_msg: 成功將表情複製到本地
       copy: 複製
-      copy_failed_msg: 無法將表情複製到本地
+      copy_failed_msg: 無法將表情符號複製到本地
       create_new_category: 建立新分類
       created_msg: 已新增表情符號
       delete: 刪除
@@ -247,20 +329,22 @@ zh-HK:
       disable: 停用
       disabled: 已停用
       disabled_msg: 已停用表情符號
-      emoji: emoji
+      emoji: Emoji 表情符號
       enable: 啟用
       enabled: 已啟用
       enabled_msg: 已啟用表情符號
       image_hint: PNG 格式,最大 50KB
-      list: 列表
-      listed: 已顯示
+      list: 列出
+      listed: 已列出
       new:
-        title: 加入新的自訂表情符號
+        title: 加入新的自訂 Emoji 表情符號
+      not_permitted: 你無權執行此操作
       overwrite: 覆蓋
       shortcode: 短代碼
       shortcode_hint: 至少 2 個字元,只能使用字母、數字和下劃線
-      title: 自訂 emoji
+      title: 自訂 Emoji 表情符號
       uncategorized: 未分類
+      unlist: 隱藏
       unlisted: 已隱藏
       update_failed_msg: 無法更新表情符號
       updated_msg: 已更新表情符號
@@ -269,26 +353,26 @@ zh-HK:
       authorized_fetch_mode: 安全模式
       backlog: 未處理工作數
       config: 設定
-      feature_deletions: 帳戶刪除
+      feature_deletions: 刪除帳號功能
       feature_invites: 邀請連結
       feature_profile_directory: 個人資料目錄
       feature_registrations: 註冊
-      feature_relay: 聯邦中繼站
+      feature_relay: 聯網中繼站
       feature_spam_check: 防垃圾訊息
       feature_timeline_preview: 時間軸預覽
       features: 功能
       hidden_service: 與隱密服務互連
-      open_reports: 待處理檢舉數
+      open_reports: 未處理的舉報個案數
       pending_tags: 等待審核的主題標籤
       pending_users: 等待審核的使用者
       recent_users: 最近加入的使用者
       search: 全文搜尋
       single_user_mode: 單一使用者模式
-      software: 軟體
+      software: 軟件
       space: 儲存空間用量
       title: 儀表板
       total_users: 總使用者數
-      trends: 趨勢
+      trends: 近期流行
       week_interactions: 本週互動次數
       week_users_active: 本週活躍使用者數
       week_users_new: 本週新使用者數
@@ -299,22 +383,28 @@ zh-HK:
       destroyed_msg: 網域已成功從白名單移除
       undo: 從白名單移除
     domain_blocks:
-      add_new: 新增
-      created_msg: 正處理域名阻隔
+      add_new: 新增域名阻隔規則
+      created_msg: 正處理阻隔域名的請求
       destroyed_msg: 已撤銷域名阻隔
       domain: 域名阻隔
+      edit: 更改域名阻隔
+      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: 自動刪除
         title: 新增域名阻隔
+      private_comment: 私人留言
+      private_comment_hint: 請提供更多有關此域名限制的資訊以供管理員作內部參考。
+      public_comment: 公開留言
+      public_comment_hint: 如果你已經啟用域名限制列表的公告,請為一般大眾提供更多有關此域名限制的資訊。
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關
-      reject_reports: 拒絕檢舉
+      reject_reports: 拒絕檢舉個案
       reject_reports_hint: 忽略所有來自此站點的檢舉。與停權無關
       rejecting_media: 拒絕媒體檔案
       rejecting_reports: 拒絕檢舉中
@@ -323,66 +413,120 @@ zh-HK:
         suspend: 已停權
       show:
         affected_accounts:
-          other: 將影響到資料庫中的 %{count} 個帳戶
+          other: 將影響到資料庫中的 %{count} 個帳號
         retroactive:
-          silence: 對此域名的所有用戶取消靜音
-          suspend: 對此域名的所有用戶取消除名
+          silence: 對此域名的所有帳號取消靜音
+          suspend: 對此域名的所有帳號取消除名
         title: 撤銷 %{domain} 的域名阻隔
         undo: 撤銷
-      undo: 撤銷
+      undo: 撤銷域名阻隔
+      view: 顯示正被阻隔的網域
     email_domain_blocks:
-      add_new: 加入新項目
+      add_new: 新增
       created_msg: 已新增電郵網域阻隔
       delete: 刪除
       destroyed_msg: 已刪除電郵網域阻隔
       domain: 網域
+      empty: 現時並沒有電郵域名被阻隔。
+      from_html: 由%{domain}
       new:
         create: 新增網域
         title: 新增電郵網域阻隔
       title: 電郵網域阻隔
     instances:
+      by_domain: 域名
+      delivery_available: 可傳送
+      empty: 找不到域名。
+      known_accounts:
+        other: "%{count} 已知的帳號"
       moderation:
         all: 全部
         limited: 限制
         title: 版主
+      private_comment: 私人留言
+      public_comment: 公開留言
       title: 已知服務站
-      total_followed_by_us: 開始關注你
+      total_blocked_by_us: 被我們封鎖
+      total_followed_by_them: 被他們關注
+      total_followed_by_us: 被我們關注
+      total_reported: 關於他們的舉報
+      total_storage: 媒體附件
     invites:
+      deactivate_all: 全部停用
       filter:
         all: 全部
         available: 可用
         expired: 已失效
         title: 篩選
-      title: 邀請用戶
+      title: 邀請
+    ip_blocks:
+      add_new: 新增規則
+      created_msg: 成功新增 IP 規則
+      delete: 刪除
+      expires_in:
+        '1209600': 2 週
+        '15778476': 6 個月
+        '2629746': 1 個月
+        '31556952': 1 年
+        '86400': 1 日
+        '94670856': 3 年
+      new:
+        title: 新增 IP 規則
+      no_ip_block_selected: 因未選擇 IP 規則而未有任何變更。
+      title: IP 規則
+    pending_accounts:
+      title: 待處理帳戶(%{count})
+    relationships:
+      title: "%{acct} 的關係"
     relays:
-      description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
-      disabled: 停用
+      add_new: 新增中繼
+      delete: 刪除
+      description_html: "<strong>聯盟中繼站</strong>是一種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
+      disable: 停用
+      disabled: 已停用
       enable: 啟用
+      enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。
+      enabled: 已啟用
+      inbox_url: 中繼 URL
+      pending: 正在等待中繼許可
+      save_and_enable: 儲存並啟用
+      setup: 建立中繼通訊
+      signatures_not_enabled: 中繼不會在安全模式或有限聯盟模式被開啓的情況下正常運作
+      status: 狀態
+      title: 中繼
     report_notes:
-      created_msg: 舉報筆記已建立。
-      destroyed_msg: 舉報筆記已刪除。
+      created_msg: 舉報備註已建立!
+      destroyed_msg: 舉報備註已刪除!
     reports:
+      account:
+        notes:
+          other: "%{count} 則備註"
+        reports:
+          other: "%{count} 則舉報"
       action_taken_by: 操作執行者
       are_you_sure: 你確認嗎?
       assign_to_self: 指派給自己
-      assigned: 指派負責人
+      assigned: 指派版主
+      by_target_domain: 被舉報帳號的域名
       comment:
         none: 沒有
       created_at: 日期
+      forwarded: 已轉寄
+      forwarded_to: 已轉寄到 %{domain}
       mark_as_resolved: 標示為「已處理」
       mark_as_unresolved: 標示為「未處理」
       notes:
-        create: 建立筆記
-        create_and_resolve: 建立筆記並標示為「已處理」
-        create_and_unresolve: 建立筆記並標示為「未處理」
+        create: 建立備註
+        create_and_resolve: 標示為「已處理」並留下備註
+        create_and_unresolve: 標示為「未處理」並留下備註
         delete: 刪除
         placeholder: 記錄已執行的動作,或其他相關的更新……
-      reopen: 重開舉報
+      reopen: 重開舉報個案
       report: '舉報 #%{id}'
       reported_account: 舉報用戶
       reported_by: 舉報者
       resolved: 已處理
-      resolved_msg: 舉報已處理。
+      resolved_msg: 舉報個案已被處理!
       status: 狀態
       title: 舉報
       unassign: 取消指派
@@ -390,41 +534,57 @@ zh-HK:
       updated_at: 更新
     settings:
       activity_api_enabled:
-        desc_html: 本站用戶發佈的文章,以及本站的活躍用戶和一週內新用戶數
-        title: 公開用戶活躍度的統計數據
+        desc_html: 本站的文章數量、活躍使用者數量、及每週新註冊使用者數量
+        title: 公佈使用者活躍度的統計數據
       bootstrap_timeline_accounts:
-        desc_html: 以半形逗號分隔多個用戶名。只能加入來自本站且未開啟保護的帳號。如果留空,則默認關注本站所有管理員。
-        title: 新用戶默認關注
+        desc_html: 以半形逗號分隔多個使用者名稱。只能加入來自本站且未開啟保護的帳號。如果留空,則默認關注本站所有管理員。
+        title: 新使用者預設關注的對像
       contact_information:
         email: 輸入一個公開的電郵地址
-        username: 輸入用戶名稱
+        username: 輸入使用者名稱
+      custom_css:
+        desc_html: 透過 CSS 自訂每一頁的外觀
+        title: 自訂 CSS
+      default_noindex:
+        desc_html: 影響所有未自行設定的帳號
+        title: 預設帳號不在搜尋引擎索引之內
       domain_blocks:
         all: 給任何人
         disabled: 給沒有人
         title: 顯示封鎖的網域
+        users: 所有已登入的帳號
+      domain_blocks_rationale:
+        title: 顯示原因予
       enable_bootstrap_timeline_accounts:
-        title: 啟用新使用者的預設追蹤
+        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: 允許能探索使用者
+        desc_html: 允許使用者被搜尋
         title: 啟用個人資料目錄
       registrations:
         closed_message:
           desc_html: 當本站暫停接受註冊時,會顯示這個訊息。<br/> 可使用 HTML
           title: 暫停註冊訊息
         deletion:
-          desc_html: 允許所有人刪除自己的帳戶
-          title: 開放刪除帳戶的權限
+          desc_html: 允許所有人刪除自己的帳號
+          title: 容許刪除帳號
         min_invite_role:
           disabled: 沒有人
           title: 允許發送邀請的身份
+        require_invite_text:
+          desc_html: 如果已設定為手動審核注冊,請把「加入的原因」設定為必填項目。
+          title: 要求新用戶填寫注冊申請
       registrations_mode:
         modes:
           approved: 註冊需要核准
@@ -432,11 +592,11 @@ zh-HK:
           open: 任何人皆能註冊
         title: 註冊模式
       show_known_fediverse_at_about_page:
-        desc_html: 如果開啟,就會在時間軸預覽顯示跨站文章,否則就只會顯示本站文章。
-        title: 在時間軸預覽顯示跨站文章
+        desc_html: 如果停用,將會只在本站的歡迎頁顯示本站的文章。
+        title: 在訪客預覽本站的時間軸上,顯示跨站文章
       show_staff_badge:
-        desc_html: 在個人資料頁上顯示管理人員標誌
-        title: 顯示管理人員標誌
+        desc_html: 在個人資料頁上顯示工作人員標誌
+        title: 顯示工作人員標誌
       site_description:
         desc_html: 在首頁顯示,及在 meta 標籤使用作網站介紹。<br/> 你可以在此使用 <code>&lt;a&gt;</code> 和 <code>&lt;em&gt;</code> 等 HTML 標籤。
         title: 本站介紹
@@ -444,12 +604,14 @@ zh-HK:
         desc_html: 本站詳細資訊頁的內文<br/>你可以在此使用 HTML
         title: 本站詳細資訊
       site_short_description:
+        desc_html: "顯示在側邊欄和網頁標籤(meta tags)。以一句話描述Mastodon是甚麼,有甚麼令這個伺服器脫\U000294D9而出。"
         title: 伺服器短描述
       site_terms:
         desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤
         title: 自訂使用條款
       site_title: 本站名稱
       spam_check_enabled:
+        desc_html: Mastodon可以自動舉報產生重複的垃圾內容的帳號,不過未必準確。
         title: 自動防廣告訊息
       thumbnail:
         desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px
@@ -458,7 +620,11 @@ zh-HK:
         desc_html: 在主頁顯示本站時間軸
         title: 時間軸預覽
       title: 網站設定
+      trendable_by_default:
+        desc_html: 影響之前並未禁止的標籤
+        title: 容許標籤不需要審核來成為今期流行
       trends:
+        desc_html: 公開地顯示已審核的標籤為今期流行
         title: 趨勢主題標籤
     site_uploads:
       delete: 刪除上傳的檔案
@@ -478,13 +644,17 @@ zh-HK:
       title: 帳戶文章
       with_media: 含有媒體檔案
     tags:
+      accounts_today: 今日特殊使用
+      accounts_week: 今週特殊使用
+      breakdown: 根據來源剖析是日用量
       context: 上下文
       directory: 在目錄中
       in_directory: 目錄中有 %{count} 個
       last_active: 上次活躍
       most_popular: 最熱門
       most_recent: 最近
-      review: 審核嘟文
+      name: 主題標籤
+      review: 審核文章
       reviewed: 已審核
       title: 主題標籤
       trending_right_now: 最新趨勢
@@ -495,50 +665,100 @@ zh-HK:
     warning_presets:
       add_new: 新增
       delete: 刪除
+      edit_preset: 設定警告預設
+      title: 管理警告預設
   admin_mailer:
+    new_pending_account:
+      body: 以下是新帳戶的資訊。你可以審核這項申請。
+      subject: 在 %{instance} 上未審核的新用戶(%{username})
     new_report:
-      body: "%{reporter} 舉報了用戶 %{target}"
-      body_remote: 來自 %{domain} 的用戶舉報了用戶 %{target}
-      subject: 來自 %{instance} 的用戶舉報(#%{id})
+      body: "%{reporter} 舉報了 %{target}"
+      body_remote: 來自 %{domain} 的人舉報了 %{target}
+      subject: 針對 %{instance} 的舉報(#%{id})
+    new_trending_tag:
+      body: '今天流行使用未被審核的 #%{name} 主題標籤。在你允許之前,它不會被公開地顯示,你亦可以無視它使它不再污染你的眼睛。'
+      subject: 在 %{instance} 上未審核的主題標籤 (%{name})
+  aliases:
+    add_new: 建立別名 (Alias)
+    created_msg: 成功建立別名 (alias)。你可以從舊帳號開始轉移。
+    deleted_msg: 成功刪除別名 (alias)。你將不可以由舊帳號轉移到當前帳號。
+    empty: 你沒有別名 (alias)。
+    hint_html: 如果你想由另一個帳戶轉移到此帳號,你可以在此處創建別名 (alias),然後系統容許你將關注者由舊帳戶轉移到此帳號。此操作是<strong>無害且可以還原的</strong>。 <strong>帳號遷移程序,需要在舊帳號啟動</strong>。
+    remove: 取消連結別名 (Alias)
   appearance:
+    advanced_web_interface: 進階網頁介面
+    advanced_web_interface_hint: 如果你想善用整個螢幕闊度,你可以啟用「進階網頁介面」,在畫面上配置多個不同的欄目,讓你能根據需要,同時查看盡可能多的信息,支援的欄位包括:主頁、通知、其他站點和任何的列表和標籤。
+    animations_and_accessibility: 動畫和輔助功能
+    confirmation_dialogs: 確認對話框
+    discovery: 探索
     localization:
       body: Mastodon 是由志願者翻譯的。
+      guide_link: https://crowdin.com/project/mastodon
       guide_link_text: 每個人都能貢獻。
+    sensitive_content: 敏感內容
+    toot_layout: 發文介面
   application_mailer:
-    notification_preferences: 更改電郵首選項
+    notification_preferences: 更改電郵設定
     salutation: "%{name}:"
     settings: 修改電郵設定︰%{link}
     view: 進入瀏覽︰
     view_profile: 檢視個人資料頁
     view_status: 檢視文章
   applications:
-    created: 已建立應用
-    destroyed: 已刪除應用
+    created: 已建立應用程式
+    destroyed: 已刪除應用程式
     invalid_url: 所提供的網址不正確
     regenerate_token: 重設 token
     token_regenerated: 已重設 token
     warning: 警告,不要把它分享給任何人!
     your_token: token
   auth:
+    apply_for_account: 請求邀請
     change_password: 密碼
-    delete_account: 刪除帳戶
-    delete_account_html: 如果你想刪除你的帳戶,請<a href="%{path}">點擊這裡繼續</a>。你需要確認你的操作。
+    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} 邀請你加入這個 Mastodon 服務站!"
+      prefix_sign_up: 立即註冊 Mastodon!
+      suffix: 有了一個帳戶,就可以從任何Mastodon服務器關注任何人,發佈更新並與任何Mastodon服務器的用戶交流!
     didnt_get_confirmation: 沒有收到確認指示電郵?
+    dont_have_your_security_key: 找不到安全密鑰?
     forgot_password: 忘記了密碼?
     invalid_reset_password_token: 密碼重置 token 無效或已過期。請重新重設密碼。
+    link_to_otp: 請輸入兩步䮕認證碼或恢復碼
+    link_to_webauth: 使用你的安全密鑰裝置
     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},所以暫時被停用。
+    too_fast: 你太快遞交了,請再試一次。
+    trouble_logging_in: 不能登入?
+    use_security_key: 使用安全密鑰裝置
   authorize_follow:
     already_following: 你已經關注了這個帳號
-    already_requested: 您早已向該帳戶寄送追蹤請求
+    already_requested: 你先前已向該帳號發送關注請求
     error: 對不起,尋找這個跨站用戶的過程發生錯誤
     follow: 關注
     follow_request: 關注請求已發送给:
@@ -548,6 +768,19 @@ zh-HK:
       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: "%Y年%b月%d日"
+      with_month_name: "%B %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}小時前"
@@ -563,14 +796,33 @@ zh-HK:
       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}
+  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: 無法確認登入資訊。會不會你阻擋了本站使用 Cookies 的權限?
@@ -579,37 +831,98 @@ zh-HK:
     '500':
       content: 抱歉,我們的後台出錯了。
       title: 這個頁面有問題
-    '503': The page could not be served due to a temporary server failure.
+    '503': 因短暫的伺服器錯誤而未能提供此頁面
     noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 <a href="%{apps_path}">Mastodon 應用</a>。
+  existing_username_validator:
+    not_found: 無法找到位於本伺服器的用戶
+    not_found_multiple: 無法找到%{usernames}
   exports:
     archive_takeout:
       date: 日期
       download: 下載檔案
-      hint_html: 你可以下載包含你的<strong>文章和媒體</strong>的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。你可以每七天下載一次。
+      hint_html: 你可以下載包含你的<strong>文章和媒體</strong>的檔案。資料以 ActivityPub 格式儲存,可用於相容的軟體。你可以每 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:
-      empty: 您沒有過濾器。
+      delete: 刪除
+      empty: 你沒有過濾器。
+      title: 篩選
+    new:
+      title: 新增篩選器
   footer:
+    developers: 開發者
     more: 更多......
+    resources: 項目
+    trending_now: 今期流行
   generic:
     all: 全部
     changes_saved_msg: 已成功儲存修改。
     copy: 複製
+    delete: 刪除
+    no_batch_actions_available: 此頁目沒有可用的批次操作
+    order_by: 排序
     save_changes: 儲存修改
     validation_errors:
       other: 提交的資料有 %{count} 項問題
+  html_validator:
+    invalid_markup: 含有無效的HTML標記:%{error}
+  identity_proofs:
+    active: 活躍
+    authorize: 是的,請授權
+    authorize_connection_prompt: 授權此加密通訊?
+    errors:
+      failed: 加密通訊失敗。請在%{provider} 重試。
+      keybase:
+        invalid_token: Keybase tokens必定為66個16位元字符的簽名檔散列。
+        verification_failed: Keybase不能識別此令牌為Keybase用戶%{kb_username} 的簽名。請在Keybase再試一次。
+      wrong_user: 未能以%{current} 為 %{proving} 建立身份驗證。請登入為%{proving} 再試一次。
+    explanation_html: 在此你連結其他網路平台(如 Keybase)上的加密身份。讓其他人可以在那些平台上,傳送加密信息給你,並驗證你的身份。
+    i_am_html: 我是 %{service} 上的 %{username}
+    identity: 身份
+    inactive: 停用
+    publicize_checkbox: 發表文章:
+    publicize_toot: 驗證成功!我在%{service} 是%{username} :%{url}
+    remove: 刪除帳號的驗證
+    removed: 成功刪除身份驗證
+    status: 確認狀態
+    view_proof: 查看證明
   imports:
+    modes:
+      merge: 合併
+      merge_long: 留下舊有記錄並添加新的資訊
+      overwrite: 覆蓋
+      overwrite_long: 用新記錄覆蓋當前記錄
     preface: 你可以在此匯入你在其他服務站所匯出的資料檔,包括︰你所關注的用戶,被你封鎖的用戶。
     success: 你已成功上載資料檔,我們正將資料匯入,請稍候
     types:
       blocking: 被你封鎖的用戶名單
+      bookmarks: 書籤
+      domain_blocking: 域名封鎖名單
       following: 你所關注的用戶名單
       muting: 靜音名單
     upload: 上載
@@ -641,11 +954,45 @@ zh-HK:
   media_attachments:
     validations:
       images_and_video: 不能在已有圖片的文章上加入影片
+      not_ready: 無法附加尚未處理完的檔案。 請稍後再試!
       too_many: 不可以加入超過 4 個檔案
   migrations:
     acct: 新帳戶的 用戶名@域名
+    cancel: 取消定向
+    cancel_explanation: 取消重新定向將會重新激活當前帳戶,但並不會還原已移至該帳戶的關注者。
+    cancelled_msg: 成功取消定向。
+    errors:
+      already_moved: 是已經移至的相同帳戶
+      missing_also_known_as: 不是此帳戶的別名(alias)
+      move_to_self: 不能移至當前帳戶
+      not_found: 找不到
+      on_cooldown: 你正在處於冷卻狀態
+    followers_count: 轉移時的追隨者
+    incoming_migrations: 由另一個帳號轉移
+    incoming_migrations_html: 要由其他帳戶轉移至當前帳戶的話,首先你需要 <a href="%{path}">新增帳戶別名(alias)</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: 新帳戶必須首先反向標識(back-reference)當前帳戶
+      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:
     digest:
       action: 查看所有通知
@@ -657,9 +1004,9 @@ zh-HK:
         other: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418"
       title: 在你不在的這段時間……
     favourite:
-      body: 您的文章被 %{name} 收藏:
-      subject: "%{name} 收藏了你的文章"
-      title: 新的收藏
+      body: 你的文章被 %{name} 喜愛:
+      subject: "%{name} 喜歡你的文章"
+      title: 新的最愛
     follow:
       body: "%{name} 開始關注你!"
       subject: "%{name} 現正關注你"
@@ -675,22 +1022,94 @@ zh-HK:
       subject: "%{name} 在文章中提及你"
       title: 新的提及
     reblog:
-      body: 您的文章被 %{name} 轉推:
+      body: 你的文章被 %{name} 轉推:
       subject: "%{name} 轉推了你的文章"
       title: 新的轉推
+  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>請用你手機的認證器應用程式(如 Google Authenticator、Authy),掃描這裏的QR 圖形碼</strong>。在雙重認證啟用後,你登入時將須要使用此應用程式產生的認證碼。"
+    manual_instructions: 如果你無法掃描 QR 圖形碼,請手動輸入這個文字密碼︰
+    setup: 設定
+    wrong_code: 你輸入的認證碼並不正確!可能伺服器時間和你手機不一致,請檢查你手機的時鐘,或與本站管理員聯絡。
   pagination:
     newer: 較新
     next: 下一頁
     older: 較舊
     prev: 上一頁
     truncate: "……"
+  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: 不能識別這個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: 請輸入你的︰用戶名稱@服務點域名
+    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: 你想回覆:
+  scheduled_statuses:
+    over_daily_limit: 你已經超越了當天排定發文的限額 (%{limit})
+    over_total_limit: 你已經超越了排定發文的限額 (%{limit})
+    too_soon: 不可以改變過去哦,嘟文只可以排定在未來
   sessions:
     activity: 最近活動
     browser: 瀏覽器
@@ -717,24 +1136,49 @@ zh-HK:
     explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。
     ip: IP 位址
     platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
       mac: Mac
+      other: 未知平台
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
     revoke: 取消
     revoke_success: 作業階段成功取消
     title: 作業階段
   settings:
+    account: 帳戶
+    account_settings: 帳戶設定
+    aliases: 帳戶別名(aliases)
+    appearance: 外觀設定
     authorized_apps: 授權應用程式
     back: 回到 Mastodon
     delete: 刪除帳戶
     development: 開發
     edit_profile: 修改個人資料
     export: 匯出
+    featured_tags: 推薦的標籤
+    identity_proofs: 身份驗證
     import: 匯入
+    import_and_export: 匯入及匯出
     migrate: 帳戶遷移
     notifications: 通知
     preferences: 偏好設定
+    profile: 個人資料
+    relationships: 關注及追隨者
     two_factor_authentication: 雙重認證
+    webauthn_authentication: 安全鑰匙
+  spam_check:
+    spam_detected: 此為系統的自動報告:已發現垃圾訊息。
   statuses:
     attached:
+      audio:
+        other: "%{count} 段影片"
       description: 附件: %{attached}
       image:
         other: "%{count} 幅圖片"
@@ -744,6 +1188,8 @@ zh-HK:
     content_warning: 內容警告: %{warning}
     disallowed_hashtags:
       other: 包含不允許的標籤: %{tags}
+    errors:
+      in_reply_not_found: 你所回覆的嘟文並不存在。
     language_detection: 自動偵測語言
     open_in_web: 開啟網頁
     over_character_limit: 超過了 %{max} 字的限制
@@ -753,8 +1199,16 @@ zh-HK:
       private: 不能置頂非公開的文章
       reblog: 不能置頂轉推
     poll:
+      total_people:
+        other: "%{count} 人"
+      total_votes:
+        other: "%{count} 票"
       vote: 投票
     show_more: 顯示更多
+    show_newer: 顯示較新嘟文
+    show_older: 顯示較舊嘟文
+    show_thread: 顯示討論串
+    sign_in_to_participate: 登入以加入討論
     title: "%{name}:「%{quote}」"
     visibilities:
       private: 關注者觀看
@@ -767,7 +1221,90 @@ zh-HK:
     pinned: 置頂文章
     reblogged: 轉推
     sensitive_content: 敏感內容
+  tags:
+    does_not_match_previous_name: 和舊有名稱並不符合
   terms:
+    body_html: |
+      <h2>隱私權政策</h2>
+      <h3 id="collect">我們蒐集甚麼資訊?</h3>
+
+      <ul>
+      <li><em>基本帳戶資訊</em>:如果您在此服務器上註冊,我們可能會要求您輸入用戶名、電子郵件地址和密碼。 您還可以輸入其他個人資料信息(例如顯示名稱和自我簡介),並上傳個人資料圖片和標題圖片。 用戶名、顯示名稱、自我簡介、個人資料圖片和標題圖片會持續公開。</li>
+      <li><em>帖文,關注和其他公共信息</em>:您的關注和追隨者名單為公開資訊。 在發佈帖文時,我們將會存儲日期和時間,以及您用以發佈帖文的應用程序。 帖文可能包含多媒體附件,例如圖片和視頻。 公開和非公開(unlisted)的帖文為公開資訊。 您在個人資料上推薦的帖文時也是公開的資訊。 您的追隨者會收到你的帖文,在某些情況下,它們有可能會在不同的服務器互相傳遞並將儲存副本。 您刪除帖文時亦同樣會傳遞給您的追隨者。 轉發或收藏其他帖文的操作始終是公開的。</li>
+      <li><em>私訊和追隨者限定的帖文</em>:所有的帖子都在服務器上被儲存和處理。 追隨者限定的帖文將傳遞給您的追隨者和其中提及的用家,而私訊僅會傳遞給其中提及的用戶。 在某些情況下,它們有可能會在不同的服務器互相傳遞並將儲存副本。 我們將努力地將訪問權限制為僅授權人員,但其他服務器可能無法這樣做。 因此,請檢查您的追隨者所屬的服務器。 您可以在設置中選擇手動批准和拒絕新追隨者。<em>請記住,服務器和任何接收服務器的操作員都可以查看此類消息</em>,並且收件人可以截屏,複製或以其他方式重新分享。 <em>請勿在Mastodon上分享任何危險信息。</em> </li>
+      <li> <em> IP和其他元數據</em>:登錄時,我們會記錄您登錄時使用的IP位址以及瀏覽器應用程序的名稱。 您可以在設置中查看和撤消所有已登錄的作業階段。 最新上傳的IP位址最多可以儲存12個月。 我們還可能保留服務器日誌,其中包括對我們服務器的每個請求的IP地位。</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">您的資訊將會被用在甚麼用途?</h3>
+
+      <p>我們從您那裡收集的任何資訊都可能通過以下方式使用:</p>
+
+      <ul>
+      <li>提供Mastodon的核心功能:您只可以在登錄後與其他人的內容交流並發佈自己的內容。例如,您可以追隨其他人以在自己的個人化主頁中查看他們的帖文。</li>
+      <li>社區管理:例如將您的IP位址與其他已知的IP位址進行比較來鑑定逃避封鎖或其他侵權行為。</li>
+      <li>您的電郵地址:可能會被用於向您發送信息,有關其他人與您互動或向您發送消息的通知,並用於答複查詢和/或其他請求或問題。</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">我們如何保護您的資訊?</h3>
+
+      <p>當您輸入,提交或訪問您的個人信息時,我們會採取各種安全措施來維護您的個人信息的安全。 除其他事項外,您的瀏覽器作業階段以及應用程序和API之間的流量均使用SSL進行保護。您的密碼也會以強大的單向算法進行散列處理。 您亦可以啟用多重驗證,以進一步安全地訪問您的帳戶。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">我們的數據保留政策</h3>
+
+      <p>我們會致力:</p>
+
+      <ul>
+      <li>保留包含對該服務器所有請求的IP位址的服務器日誌,而保留時間將不會超過90天。</li>
+      <li>保留與註冊用戶關聯的IP位址不超過12個月。</li>
+      </ul>
+
+      <p>您可以請求並下載您的內容備份,包括您的帖文,媒體附件,個人資料圖片和標題圖片。</p>
+
+      <p>您亦可以隨時不可逆地刪除您的帳戶。</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">我們使用cookies嗎?</h3>
+
+      <p>是。 Cookies是站點或其服務提供商通過Web瀏覽器(如果允許)傳輸到計算機硬盤的小文件。 這些cookies使站點能夠識別您的瀏覽器,並且如果您已經擁有註冊帳戶,會連結至您的註冊帳戶。</p>
+
+      <p>我們使用Cookie來了解並保存您的偏好,以供將來訪問。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">我們會否透露任何信息給第三方機構?</h3>
+
+      <p>我們不會將您的個人身份信息出售,交易或以其他方式轉讓給第三方。 這不包括同意對這些信息保密的運營方,和我們開展業務或為您提供服務的受信任的第三方。我們或會在基於對法律的尊重,或在執行我們的網站政策或保護我們或其他人的權利、財產或安全時釋出你的個人資料。</p>
+
+      <p>您的公開內容可能會被網絡中的其他服務器下載。 只要這些追隨者或收件人位於與之不同的服務器上,您的公開帖文和追隨者限定帖文將傳遞到您的追隨者所在的服務器,而私信將傳遞給收件人的服務器。</p>
+
+      <p>當您授權應用程序使用您的帳戶時,根據您批准的權限範圍,它可能會訪問您的公開資訊,您的關注列表,您的關注者,您的列表,所有帖文以及您的收藏夾。 應用程序永遠無法取得您的電子郵件地址或密碼。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">兒童在網站的應用</h3>
+
+      <p>如果此服務器位於歐盟或EEA中:我們的網站,產品和服務只為16歲或以上的人提供服務。 如果您未滿16歲,請按照GDPR的要求 (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">歐盟一般資料保護規範</a>)不使用此網站。</p>
+
+      <p>如果此服務器位於美國:我們的網站,產品和服務只為13歲或以上的人提供服務。 如果您未滿13歲,請按照COPPA的要求 (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">兒童在線隱私權保護法</a>)不使用此網站。</p>
+
+      <p>在其他管轄區內,法律要求可能會有所不同。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">隱私權政策更改</h3>
+
+      <p>請根據英文版本所準,此中文版本只為英文版隱私政策的翻譯版本</p>
+
+      <p>此文件以 CC-BY-SA 授權。英文版本的發佈日期為2018年3月7日。此中文翻譯的翻譯日期為2020年11月28日。</p>
+
+      <p>最初改編自 <a href="https://github.com/discourse/discourse">Discourse的隱私權政策</a>.</p>
     title: "%{instance} 使用條款和隱私權政策"
   themes:
     contrast: 高對比
@@ -776,40 +1313,100 @@ zh-HK:
   time:
     formats:
       default: "%Y年%-m月%d日 %H:%M"
+      month: "%b %Y"
   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: 如果你遺失了安裝認證器的裝置(如︰你的電話),你可以使用備用驗證碼進行登入。請確保將備用驗證碼收藏穩當,(如列印出來,和你其他重要文件一起存放)。
+    webauthn: 安全密鑰
   user_mailer:
     backup_ready:
       explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載。
       subject: 你的備份檔已可供下載
       title: 檔案匯出
+    sign_in_token:
+      details: 這是嘗試的詳細資訊
+      explanation: 我們發現有人嘗試以未使用過的 IP 位址登入到你的帳號。 如果這個登入的人是你,請在「登入請求」頁面上輸入以下安全代碼:
+      further_actions: 如果這不是你,請到這裏更改你的密碼,並啟用雙重認證:
+      subject: 請確認登入請求
+      title: 登入請求
+    warning:
+      explanation:
+        disable: 你不能以任何方式登入或使用你的帳號,但你的個人資料頁面和其他資料仍保持完整。
+        sensitive: 你上載的媒體檔案和連結媒體將被標記為敏感項目。
+        silence: 你仍然可以使用你的帳號,但只有你現時的追隨者會看見你在此伺服器的嘟文。你或從公開名冊中被剔除。但是其他人仍然可以主動關注你。
+        suspend: 你將不能使用您的帳號,你的個人資料頁面及其他資料將不能再被取得。你仍可在資料被完全刪除前請求下載你的數據,但我們仍會保留一部份資料,以防止有人規避停權處罰。
+      get_in_touch: 你可以回覆此電郵來跟我們(%{instance})聯絡
+      review_server_policies: 審視伺服器政策
+      statuses: 特別是:
+      subject:
+        disable: 你的帳號 %{acct} 已經被涷結
+        none: 警告帳號%{acct}
+        sensitive: 你的帳號 %{acct} 的媒體已被標記為敏感內容
+        silence: 你的帳號 %{acct} 已經被限制
+        suspend: 你的帳號 %{acct} 已經被停權
+      title:
+        disable: 帳號涷結
+        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: 歡迎來到 Mastodon
-      tip_federated_timeline: 跨站公共時間軸可以讓你一窺更廣闊的 Mastodon 網絡。不過,由於它只顯示你的鄰居們所訂閱的內容,所以並不是全部。
-      tip_following: 默認情況下,你會自動關注你所在服務站的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸和跨站公共時間軸哦。
-      tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 上的用戶。他們就是離你最近的鄰居!
-      tip_mobile_webapp: 如果你的移動設備瀏覽器允許你將 Mastodon 添加到主屏幕,你就能夠接收推送消息。它就像本地應用一樣好使!
+      full_handle: 你的完整 Mastodon 地址
+      full_handle_hint: 這訊息將顯示給你朋友們,讓他們能從另一個服務站發信息給你,或者關注你的。
+      review_preferences_action: 更改偏好設定
+      review_preferences_step: 記得調整你的偏好設定,比如你想接收什麼類型的郵件,或者你想把你的文章可見範圍默認設定為什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。
+      subject: 歡迎來到 Mastodon (萬象)
+      tip_federated_timeline: 跨站時間軸可以讓你一窺更廣闊的 Mastodon 網絡。不過,由於它只顯示你的鄰居們所訂閱的內容,所以並不是全部。
+      tip_following: 你會預設關注你服務站的管理員。想結交更多有趣的人的話,記得多逛逛本站時間軸和跨站時間軸哦。
+      tip_local_timeline: 本站時間軸可以讓你一窺 %{instance} 本站上的用戶。他們就是離你最近的鄰居!
+      tip_mobile_webapp: 如果你的移動設備瀏覽器支援,你可以將 Mastodon 加到裝置的主畫面,讓你可以選擇接收推送通知,就像本機的 App 一樣方便!
       tips: 小貼士
-      title: "%{name},歡迎你的加入!"
+      title: 歡迎 %{name} 加入!
   users:
+    blocked_email_provider: 此電郵提供商並不被允許
+    follow_limit_reached: 你不能關注多於%{limit} 人
+    generic_access_help_html: 不能登入?你可以寄電郵至 %{email} 尋求協助
     invalid_email: 電郵地址格式不正確
-    invalid_otp_token: 雙重認證確認碼不正確
-    otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫
-    seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼和電郵。
+    invalid_email_mx: 此電郵地址不存在
+    invalid_otp_token: 雙重認證碼不正確
+    invalid_sign_in_token: 無效的安全碼
+    otp_lost_help_html: 如果這兩者你均無法登入,你可以聯繫 %{email}
+    seamless_external_login: 因為你正在使用第三方服務登入,所以不能設定密碼和電郵。
     signed_in_as: 目前登入的帳戶:
+    suspicious_sign_in_confirmation: 你似乎未曾從此設備登入,而你又有一段時間沒有登入了。我們剛剛把安全碼傳送到你的電郵地址,請查看你的電郵信箱,以確認你是帳號擁有者本人。
+  verification:
+    explanation_html: 你可以<strong>認證個人資料頁面的元數據 (Metadata) 連結是屬於你的</strong>。要認證,那些連結的目的地網站必須有一條回到你 Mastodon 個人頁面的連結,而且連結<strong>必須</strong>具有<code>rel="me"</code>屬性。連結的文字內容都不會影響認證。這裏有一個例子:
+    verification: 驗證
+  webauthn_credentials:
+    add: 新增安全密鑰裝置
+    create:
+      error: 新增安全密鑰裝置時出現了問題。請重新再試一次。
+      success: 你已成功將安全密鑰裝置加入帳號。
+    delete: 刪除
+    delete_confirmation: 你確定要刪除這個安全密鑰裝置嗎?
+    description_html: 如果你啟用<strong>安全密鑰驗證</strong>的話,登入時你將需要使用其中一個安全密鑰。
+    destroy:
+      error: 刪除安全密鑰裝置時出現了問題。請重新再試一次。
+      success: 你已成功將安全密鑰裝置從帳號移除。
+    invalid_credential: 無效的安全密鑰裝置
+    nickname_hint: 請為你的安全密鑰裝置命名
+    not_enabled: 你還未啟用 WebAuthn
+    not_supported: 這個瀏覽器並不支援安全密鑰裝置
+    otp_required: 請開啟雙重認證以使用安全密鑰裝置
+    registered_on: 在 %{date} 注冊
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 0f761a03e..da340a1bc 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -21,6 +21,9 @@ zh-TW:
     federation_hint_html: 你只需要擁有 %{instance} 的帳戶,就可以追蹤隨便一台 Mastodon 伺服器上的人等等。
     get_apps: 嘗試行動應用程式
     hosted_on: 在 %{domain} 運作的 Mastodon 站點
+    instance_actor_flash: '這個帳戶是個用來代表伺服器自已的虛擬角色,而不是實際的使用者。它是用來聯盟用的,除非您想要封鎖整個站台,不然不該封鎖它。但要封鎖整個站台,您可以使用網域封鎖功能。
+
+'
     learn_more: 了解詳細
     privacy_policy: 隱私權政策
     see_whats_happening: 看看發生什麼事
@@ -37,18 +40,24 @@ zh-TW:
       reason: 原因
       rejecting_media: 不會處理或儲存這些伺服器的媒體檔案,也不會顯示縮圖,需要手動點選原始檔:
       rejecting_media_title: 過濾的媒體
+      silenced: 這些伺服器的嘟文會被從公開時間軸與對話中隱藏,而且與它們的使用者互動並不會產生任何通知,除非您追蹤他們:
       silenced_title: 靜音的伺服器
+      suspended: 來自這些伺服器的資料都不會被處理、儲存或交換,也無法和這些伺服器上的使用者互動與溝通:
       suspended_title: 暫停的伺服器
+    unavailable_content_html: Mastodon 一般來說允許您閱讀並和任何聯盟伺服器上的使用者互動。這些伺服器是這個站台設下的例外。
     user_count_after:
       other: 位使用者
     user_count_before: 註冊使用者數
     what_is_mastodon: 什麼是 Mastodon?
   accounts:
     choices_html: "%{name} 的選擇:"
+    endorsements_hint: 推薦您已經關注的人,把他們釘在您的個人頁面。
+    featured_tags_hint: 您可以推薦不同主題標籤,它們也會在此處出現。
     follow: 關注
     followers:
       other: 關注者
     following: 正在關注
+    instance_actor_flash: 這個帳號是一個用來代表此伺服器的虛擬執行者,而非真實使用者。它用途為站點聯盟且不應被停權。
     joined: 加入於 %{date}
     last_active: 上次活躍時間
     link_verified_on: 此連結的所有權已在 %{date} 檢查過
@@ -59,6 +68,8 @@ zh-TW:
     nothing_here: 暫時沒有內容可供顯示!
     people_followed_by: "%{name} 關注的人"
     people_who_follow: 關注 %{name} 的人
+    pin_errors:
+      following: 你只能推薦你正在關注的使用者。
     posts:
       other: 嘟文
     posts_tab_heading: 嘟文
@@ -84,6 +95,7 @@ zh-TW:
       add_email_domain_block: 將電子郵件網域加入黑名單
       approve: 核准
       approve_all: 全部批准
+      approved_msg: 成功審核了%{username} 的新帳戶申請
       are_you_sure: 您確定嗎?
       avatar: 頭像
       by_domain: 站點
@@ -97,8 +109,10 @@ zh-TW:
       confirm: 確定
       confirmed: 已確定
       confirming: 確定
+      delete: 刪除資料
       deleted: 已刪除
       demote: 降級
+      destroyed_msg: 即將刪除 %{username} 的數據
       disable: 停用
       disable_two_factor_authentication: 停用兩階段認證
       disabled: 已停用
@@ -109,10 +123,12 @@ zh-TW:
       email_status: 電子信箱狀態
       enable: 啟用
       enabled: 已啟用
+      enabled_msg: 成功解除 %{username} 帳戶的凍結
       followers: 關注者
       follows: 正在關注
       header: 開頭
       inbox_url: 收件箱 (Inbox) URL
+      invite_request_text: 加入原因
       invited_by: 邀請者
       ip: IP 位址
       joined: 已加入
@@ -124,6 +140,8 @@ zh-TW:
       login_status: 登入狀態
       media_attachments: 多媒體附件
       memorialize: 設定為追悼帳戶
+      memorialized: 被悼念的
+      memorialized_msg: 成功將%{username} 的帳號變為紀念帳號
       moderation:
         active: 活躍
         all: 全部
@@ -144,10 +162,14 @@ zh-TW:
       public: 公開
       push_subscription_expires: PuSH 訂閱過期
       redownload: 重新整理個人資料
+      redownloaded_msg: 成功重新載入%{username} 的個人資料頁面
       reject: 拒絕
       reject_all: 全部拒絕
+      rejected_msg: 成功拒絕了%{username} 的新帳號申請
       remove_avatar: 取消頭像
       remove_header: 移除開頭
+      removed_avatar_msg: 成功刪除了 %{username} 的頭像
+      removed_header_msg: 成功刪除了 %{username} 的頁面頂端
       resend_confirmation:
         already_confirmed: 此使用者已被確認
         send: 重新發送驗證信
@@ -164,6 +186,8 @@ zh-TW:
       search: 搜尋
       search_same_email_domain: 其他有同個電子郵件網域的使用者
       search_same_ip: 其他有同個 IP 的使用者
+      sensitive: 敏感内容
+      sensitized: 已標記為敏感內容
       shared_inbox_url: 共享收件箱網址
       show:
         created_reports: 建立檢舉
@@ -173,13 +197,19 @@ zh-TW:
       statuses: 嘟文
       subscribe: 訂閱
       suspended: 已停權
+      suspension_irreversible: 已永久刪除這個帳戶的數據。雖然這個帳戶的數據已被永久刪除,但是您仍然可以取消暫停這個帳戶。
+      suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。
       time_in_queue: 正在佇列等待 %{time}
       title: 帳戶
       unconfirmed_email: 未確認的電子信箱位址
+      undo_sensitized: 取消敏感狀態
       undo_silenced: 取消靜音
       undo_suspension: 取消停權
+      unsilenced_msg: 成功解除 %{username} 的帳戶限制
       unsubscribe: 取消訂閱
+      unsuspended_msg: 成功取消暫停 %{username} 的帳戶
       username: 使用者名稱
+      view_domain: 查看站台概要
       warn: 警告
       web: 頁面
       whitelisted: 已加入白名單
@@ -193,17 +223,38 @@ zh-TW:
         create_custom_emoji: 建立自訂顏文字
         create_domain_allow: 建立允許網域
         create_domain_block: 建立阻擋網域
+        create_email_domain_block: 封鎖電子郵件站台
+        create_ip_block: 新增IP規則
+        demote_user: 把用戶降級
         destroy_announcement: 刪除公告
         destroy_custom_emoji: 刪除自訂顏文字
         destroy_domain_allow: 刪除允許網域
         destroy_domain_block: 刪除阻擋網域
         destroy_email_domain_block: 刪除阻擋電郵網域
+        destroy_ip_block: 刪除 IP 規則
         destroy_status: 刪除狀態
         disable_2fa_user: 停用兩階段認證
         disable_custom_emoji: 停用自訂顏文字
         disable_user: 停用帳戶
         enable_custom_emoji: 啓用自訂顏文字
         enable_user: 啓用帳戶
+        memorialize_account: 設定成紀念帳號
+        promote_user: 把用戶升級
+        remove_avatar_user: 刪除大頭貼
+        reopen_report: 重開舉報
+        reset_password_user: 重設密碼
+        resolve_report: 消除舉報
+        sensitive_account: 把您的帳號的媒體標記為敏感內容
+        silence_account: 靜音用戶
+        suspend_account: 暫停用戶
+        unassigned_report: 取消指派舉報
+        unsensitive_account: 取消把您的帳號的媒體設定為敏感內容
+        unsilence_account: 取消用戶的靜音狀態
+        unsuspend_account: 取消用戶的暫停狀態
+        update_announcement: 更新公告
+        update_custom_emoji: 更新自訂顏文字
+        update_domain_block: 更新封鎖網域
+        update_status: 更新狀態
       actions:
         assigned_to_self_report: "%{name} 接受了檢舉 %{target}"
         change_email_user: "%{name} 變更了使用者 %{target} 的電子信箱位址"
@@ -214,12 +265,14 @@ zh-TW:
         create_domain_allow: "%{name} 將 %{target} 網域加入黑名單了"
         create_domain_block: "%{name} 封鎖了站點 %{target}"
         create_email_domain_block: "%{name} 封鎖了電子信箱網域 %{target}"
+        create_ip_block: "%{name} 已經設定了IP %{target} 的規則"
         demote_user: "%{name} 把使用者 %{target} 降級"
         destroy_announcement: "%{name} 刪除了公告 %{target}"
         destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號"
         destroy_domain_allow: "%{name} 從白名單中移除了 %{target} 網域"
         destroy_domain_block: "%{name} 取消了對站點 %{target} 的封鎖"
         destroy_email_domain_block: "%{name} 取消了對電子信箱網域 %{target} 的封鎖"
+        destroy_ip_block: "%{name} 已經刪除了 IP %{target} 的規則"
         destroy_status: "%{name} 刪除了 %{target} 的嘟文"
         disable_2fa_user: "%{name} 停用了使用者 %{target} 的兩階段認證"
         disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}"
@@ -232,15 +285,21 @@ zh-TW:
         reopen_report: "%{name} 重新開啟 %{target} 的檢舉"
         reset_password_user: "%{name} 重新設定了使用者 %{target} 的密碼"
         resolve_report: "%{name} 處理了 %{target} 的檢舉"
+        sensitive_account: "%{name} 將 %{target} 的媒體檔案標記為敏感內容"
         silence_account: "%{name} 靜音了使用者 %{target}"
         suspend_account: "%{name} 停權了使用者 %{target}"
         unassigned_report: "%{name} 取消指派 %{target} 的檢舉"
+        unsensitive_account: "%{name} 將 %{target} 的媒體檔案的敏感狀態取消"
         unsilence_account: "%{name} 取消了使用者 %{target} 的靜音狀態"
         unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態"
         update_announcement: "%{name} 更新了公告 %{target}"
         update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}"
+        update_domain_block: "%{name} 更新封鎖網域 %{target}"
         update_status: "%{name} 重整了 %{target} 的嘟文"
       deleted_status: "(已刪除嘟文)"
+      empty: 找不到 log
+      filter_by_action: 按動作篩選
+      filter_by_user: 按使用者篩選
       title: 營運日誌
     announcements:
       destroyed_msg: 成功刪除公告!
@@ -279,11 +338,13 @@ zh-TW:
       listed: 已顯示
       new:
         title: 加入新的自訂表情符號
+      not_permitted: 您無權執行此操作
       overwrite: 覆蓋
       shortcode: 短代碼
       shortcode_hint: 至少 2 個字元,只能使用字母、數字和下劃線
       title: 自訂表情符號
       uncategorized: 未分類
+      unlist: 不公開
       unlisted: 已隱藏
       update_failed_msg: 無法更新表情符號
       updated_msg: 已更新表情符號!
@@ -326,6 +387,8 @@ zh-TW:
       created_msg: 正在進行站點封鎖
       destroyed_msg: 已撤銷站點封鎖
       domain: 站點
+      edit: 更改封鎖的站台
+      existing_domain_block_html: 您已經對 %{name} 施加了更嚴格的限制,您需要先把他<a href="%{unblock_url}">取消封鎖</a>。
       new:
         create: 新增封鎖
         hint: 站點封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。
@@ -335,6 +398,12 @@ zh-TW:
           silence: 靜音
           suspend: 停權
         title: 新增封鎖站點
+      obfuscate: 混淆網域名稱
+      obfuscate_hint: 若啟用網域廣告列表限制,於列表部份混淆網域名稱
+      private_comment: 私人留言
+      private_comment_hint: 請提供更多有關此站台限制的資訊以供版主作內部參考。
+      public_comment: 公開留言
+      public_comment_hint: 如果你已經啟用站台限制列表的公告,請為一般大眾提供更多有關此站台限制的資訊。
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地快取的媒體檔案,並且不再接收來自該站點的任何媒體檔案。與停權無關
       reject_reports: 拒絕檢舉
@@ -353,44 +422,99 @@ zh-TW:
         title: 撤銷 %{domain} 的站點封鎖
         undo: 撤銷
       undo: 復原欲封鎖域名
+      view: 顯示阻擋的網域
     email_domain_blocks:
       add_new: 加入新項目
       created_msg: 已成功將電子信箱網域加入黑名單
       delete: 刪除
       destroyed_msg: 已成功從黑名單刪除電子信箱網域
       domain: 站點
+      empty: 現在沒有阻擋任何 e-mail 網域。
+      from_html: 由 %{domain}
       new:
         create: 新增站點
         title: 新增電子信箱黑名單項目
       title: 電子信箱黑名單
     instances:
+      by_domain: 站台
+      delivery_available: 可傳送
+      empty: 找不到網域
+      known_accounts:
+        other: "%{count} 已知的帳戶"
       moderation:
         all: 全部
         limited: 限制
         title: 版主
+      private_comment: 私人留言
+      public_comment: 公開留言
       title: 聯邦
+      total_blocked_by_us: 被我們封鎖
+      total_followed_by_them: 被他們關注
+      total_followed_by_us: 被我們關注
+      total_reported: 關於他們的舉報
+      total_storage: 多媒體附檔
     invites:
+      deactivate_all: 全部停用
       filter:
         all: 全部
         available: 可用
         expired: 已失效
         title: 篩選
       title: 邀請使用者
+    ip_blocks:
+      add_new: 建立規則
+      created_msg: 更新 IP 規則成功
+      delete: 刪除
+      expires_in:
+        '1209600': 2 個星期
+        '15778476': 6 個月
+        '2629746': 1 個月
+        '31556952': 1 年
+        '86400': 1 天
+        '94670856': 3 年
+      new:
+        title: 建立新的 IP 規則
+      no_ip_block_selected: 因為沒有選擇任何 IP 規則,所以什麼事都沒發生
+      title: IP 規則
+    pending_accounts:
+      title: 待處理帳戶(%{count})
+    relationships:
+      title: "%{acct} 的關係"
     relays:
+      add_new: 新增中繼站
+      delete: 刪除
       description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
+      disable: 停用
       disabled: 停用
       enable: 啟用
+      enable_hint: 啟用後,你的伺服器將訂閱該中繼的所有公開文章,並將會此伺服器的公開文章發送給它。
+      enabled: 已啟用
+      inbox_url: 中繼URL
+      pending: 等待中繼站審核
+      save_and_enable: 儲存並啟用
+      setup: 設定中繼連結
+      signatures_not_enabled: 若啟用安全模式或受限的站點聯盟模式,中繼將不會正常運作
+      status: 狀態
+      title: 中繼
     report_notes:
       created_msg: 檢舉記錄建立成功!
       destroyed_msg: 檢舉記錄刪除成功!
     reports:
+      account:
+        notes:
+          other: "%{count} 則備註"
+        reports:
+          other: "%{count} 則檢舉"
       action_taken_by: 操作執行者
       are_you_sure: 你確定嗎?
       assign_to_self: 指派給自己
       assigned: 指派負責人
+      by_target_domain: 檢舉帳號之網域
       comment:
         none: 無
       created_at: 日期
+      forwarded: 已轉寄
+      forwarded_to: 轉寄到 %{domain}
       mark_as_resolved: 標記為「已解決」
       mark_as_unresolved: 標記為「未解決」
       notes:
@@ -420,19 +544,33 @@ zh-TW:
       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: 顯示解釋原因
       enable_bootstrap_timeline_accounts:
+        desc_html: 使新使用者自動跟隨設定之帳號,所以他們的首頁動態一開始不會空白
         title: 啟用新使用者的預設追蹤
       hero:
         desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會重設回伺服器預覽圖
         title: 主題圖片
+      mascot:
+        desc_html: 在許多頁面都會顯示。推薦最小 293x205px。如果留空,將採用預設的吉祥物
+        title: 吉祥物圖片
       peers_api_enabled:
         desc_html: 本伺服器在聯邦中發現的站點
         title: 發布已知伺服器的列表
       preview_sensitive_media:
+        desc_html: 連結來自其他網站的預覽將顯示於縮圖,即使這些媒體被標記為敏感
         title: 在 OpenGraph 預覽中顯示敏感媒體
       profile_directory:
         desc_html: 允許能探索使用者
@@ -447,6 +585,8 @@ zh-TW:
         min_invite_role:
           disabled: 沒有人
           title: 允許發送邀請的身份
+        require_invite_text:
+          title: 要求新使用者填申請書以索取邀請
       registrations_mode:
         modes:
           approved: 註冊需要核准
@@ -480,6 +620,8 @@ zh-TW:
         desc_html: 在主頁顯示本站時間軸
         title: 時間軸預覽
       title: 網站設定
+      trendable_by_default:
+        title: 允許熱門的主題標籤直接顯示於趨勢區,不需經過審核
       trends:
         title: 趨勢主題標籤
     site_uploads:
@@ -500,6 +642,8 @@ zh-TW:
       title: 帳戶嘟文
       with_media: 含有媒體檔案
     tags:
+      accounts_today: 本日不重複使用者數
+      accounts_week: 本週不重複使用者數
       context: 上下文
       directory: 在目錄中
       in_directory: 目錄中有 %{count} 個
@@ -527,6 +671,7 @@ zh-TW:
     advanced_web_interface: 進階網頁介面
     advanced_web_interface_hint: 進階網頁界面可讓您配置許多不同的欄位來善用多餘的螢幕空間,依需要同時查看盡可能多的資訊如:首頁、通知、站點聯邦時間軸、任意數量的列表和主題標籤。
     animations_and_accessibility: 動畫與可用性
+    discovery: 探索
     localization:
       body: Mastodon 是由志願者翻譯的。
       guide_link: https://crowdin.com/project/mastodon
@@ -549,12 +694,16 @@ zh-TW:
     warning: 警告,不要把它分享給任何人!
     your_token: 你的 token
   auth:
+    apply_for_account: 索取註冊邀請
     change_password: 密碼
     delete_account: 刪除帳戶
     delete_account_html: 如果你想刪除你的帳戶,請<a href="%{path}">點擊這裡繼續</a>。你需要確認你的操作。
+    description:
+      prefix_sign_up: 現在就註冊 Mastodon 帳號吧!
     didnt_get_confirmation: 沒有收到驗證信?
     forgot_password: 忘記密碼?
     invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。
+    link_to_webauth: 使用您的安全金鑰
     login: 登入
     logout: 登出
     migrate_account: 轉移到另一個帳戶
@@ -563,10 +712,14 @@ zh-TW:
     providers:
       saml: SAML
     register: 註冊
+    registration_closed: "%{instance} 現在不開放新成員"
     resend_confirmation: 重新寄送確認指引
     reset_password: 重設密碼
     security: 登入資訊
     set_new_password: 設定新密碼
+    setup:
+      email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。
+      title: 設定
   authorize_follow:
     already_following: 你已經關注了這個使用者
     already_requested: 您早已向該帳戶寄送追蹤請求
@@ -630,12 +783,15 @@ zh-TW:
   filters:
     index:
       empty: 您沒有過濾器。
+      title: 過濾器
   footer:
     more: 更多......
+    trending_now: 現正熱門
   generic:
     all: 全部
     changes_saved_msg: 已成功儲存修改!
     copy: 複製
+    delete: 刪除
     save_changes: 儲存修改
   imports:
     preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。
@@ -674,6 +830,8 @@ zh-TW:
       too_many: 無法加入超過 4 個檔案
   migrations:
     acct: 新帳戶的 使用者名稱@站點網域
+    proceed_with_move: 移動關注者
+    redirected_msg: 您的帳號現在指向 %{acct}
   moderation:
     title: 營運
   notification_mailer:
@@ -855,3 +1013,5 @@ zh-TW:
   verification:
     explanation_html: 您在 Mastodon 個人資料頁上所列出的連結,可以用此方式<strong>驗證您確實掌控該連結網頁的內容</strong>。您可以在連結的網頁上加上一個連回 Mastodon 個人資料頁的連結,該連結的原始碼 <strong>必須</strong>包含<code>rel="me"</code>屬性。連結的顯示文字可自由發揮,以下為範例:
     verification: 驗證連結
+  webauthn_credentials:
+    registered_on: 註冊於 %{date}
diff --git a/config/settings.yml b/config/settings.yml
index 4d6a1cffc..96645c222 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -79,6 +79,7 @@ defaults: &defaults
   show_domain_blocks: 'disabled'
   show_domain_blocks_rationale: 'disabled'
   outgoing_spoilers: ''
+  require_invite_text: false
 
 development:
   <<: *defaults
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 5de25de23..010923717 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -5,34 +5,51 @@
   - [push, 4]
   - [mailers, 2]
   - [pull]
+  - [scheduler]
+:scheduler:
+  :listened_queues_only: true
 :schedule:
   scheduled_statuses_scheduler:
     every: '5m'
     class: Scheduler::ScheduledStatusesScheduler
+    queue: scheduler
   trending_tags_scheduler:
     every: '5m'
     class: Scheduler::TrendingTagsScheduler
+    queue: scheduler
   media_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::MediaCleanupScheduler
+    queue: scheduler
   feed_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * *'
     class: Scheduler::FeedCleanupScheduler
+    queue: scheduler
   doorkeeper_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * 0'
     class: Scheduler::DoorkeeperCleanupScheduler
+    queue: scheduler
   user_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
     class: Scheduler::UserCleanupScheduler
+    queue: scheduler
   ip_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::IpCleanupScheduler
+    queue: scheduler
   email_scheduler:
     cron: '0 10 * * 2'
     class: Scheduler::EmailScheduler
+    queue: scheduler
   backup_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::BackupCleanupScheduler
+    queue: scheduler
   pghero_scheduler:
     cron: '0 0 * * *'
     class: Scheduler::PgheroScheduler
+    queue: scheduler
+  instance_refresh_scheduler:
+    cron: '0 * * * *'
+    class: Scheduler::InstanceRefreshScheduler
+    queue: scheduler
diff --git a/db/migrate/20200309150742_add_forwarded_to_reports.rb b/db/migrate/20200309150742_add_forwarded_to_reports.rb
new file mode 100644
index 000000000..df278240b
--- /dev/null
+++ b/db/migrate/20200309150742_add_forwarded_to_reports.rb
@@ -0,0 +1,5 @@
+class AddForwardedToReports < ActiveRecord::Migration[5.2]
+  def change
+    add_column :reports, :forwarded, :boolean
+  end
+end
diff --git a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb
index c5688681f..c3aa8e33c 100644
--- a/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb
+++ b/db/migrate/20200620164023_add_fixed_lowercase_index_to_accounts.rb
@@ -1,10 +1,30 @@
 class AddFixedLowercaseIndexToAccounts < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
+  class CorruptionError < StandardError
+    def cause
+      nil
+    end
+
+    def backtrace
+      []
+    end
+  end
+
   def up
-    rename_index :accounts, 'index_accounts_on_username_and_domain_lower', 'old_index_accounts_on_username_and_domain_lower' unless index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower')
-    add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently
-    remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower'
+    if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower') && index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower')
+      remove_index :accounts, name: 'index_accounts_on_username_and_domain_lower'
+    elsif index_name_exists?(:accounts, 'index_accounts_on_username_and_domain_lower')
+      rename_index :accounts, 'index_accounts_on_username_and_domain_lower', 'old_index_accounts_on_username_and_domain_lower'
+    end
+
+    begin
+      add_index :accounts, "lower (username), COALESCE(lower(domain), '')", name: 'index_accounts_on_username_and_domain_lower', unique: true, algorithm: :concurrently
+    rescue ActiveRecord::RecordNotUnique
+      raise CorruptionError, 'Migration failed because of index corruption, see https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/#fixing'
+    end
+
+    remove_index :accounts, name: 'old_index_accounts_on_username_and_domain_lower' if index_name_exists?(:accounts, 'old_index_accounts_on_username_and_domain_lower')
   end
 
   def down
diff --git a/db/migrate/20201206004238_create_instances.rb b/db/migrate/20201206004238_create_instances.rb
new file mode 100644
index 000000000..a4b866894
--- /dev/null
+++ b/db/migrate/20201206004238_create_instances.rb
@@ -0,0 +1,9 @@
+class CreateInstances < ActiveRecord::Migration[5.2]
+  def change
+    create_view :instances, materialized: true
+
+    # To be able to refresh the view concurrently,
+    # at least one unique index is required
+    safety_assured { add_index :instances, :domain, unique: true }
+  end
+end
diff --git a/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb b/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb
new file mode 100644
index 000000000..26f4ddb85
--- /dev/null
+++ b/db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb
@@ -0,0 +1,15 @@
+require Rails.root.join('lib', 'mastodon', 'migration_helpers')
+
+class AddObfuscateToDomainBlocks < ActiveRecord::Migration[5.2]
+  include Mastodon::MigrationHelpers
+
+  disable_ddl_transaction!
+
+  def up
+    safety_assured { add_column_with_default :domain_blocks, :obfuscate, :boolean, default: false, allow_null: false }
+  end
+
+  def down
+    remove_column :domain_blocks, :obfuscate
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 7d39126f0..a76e34e95 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2020_10_17_234926) do
+ActiveRecord::Schema.define(version: 2020_12_18_054746) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -360,6 +360,7 @@ ActiveRecord::Schema.define(version: 2020_10_17_234926) do
     t.boolean "reject_reports", default: false, null: false
     t.text "private_comment"
     t.text "public_comment"
+    t.boolean "obfuscate", default: false, null: false
     t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true
   end
 
@@ -717,6 +718,7 @@ ActiveRecord::Schema.define(version: 2020_10_17_234926) do
     t.bigint "target_account_id", null: false
     t.bigint "assigned_account_id"
     t.string "uri"
+    t.boolean "forwarded"
     t.index ["account_id"], name: "index_reports_on_account_id"
     t.index ["target_account_id"], name: "index_reports_on_target_account_id"
   end
@@ -1047,4 +1049,29 @@ ActiveRecord::Schema.define(version: 2020_10_17_234926) do
   add_foreign_key "web_push_subscriptions", "users", on_delete: :cascade
   add_foreign_key "web_settings", "users", name: "fk_11910667b2", on_delete: :cascade
   add_foreign_key "webauthn_credentials", "users"
+
+  create_view "instances", materialized: true, sql_definition: <<-SQL
+      WITH domain_counts(domain, accounts_count) AS (
+           SELECT accounts.domain,
+              count(*) AS accounts_count
+             FROM accounts
+            WHERE (accounts.domain IS NOT NULL)
+            GROUP BY accounts.domain
+          )
+   SELECT domain_counts.domain,
+      domain_counts.accounts_count
+     FROM domain_counts
+  UNION
+   SELECT domain_blocks.domain,
+      COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count
+     FROM (domain_blocks
+       LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_blocks.domain)::text)))
+  UNION
+   SELECT domain_allows.domain,
+      COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count
+     FROM (domain_allows
+       LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_allows.domain)::text)));
+  SQL
+  add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true
+
 end
diff --git a/db/views/instances_v01.sql b/db/views/instances_v01.sql
new file mode 100644
index 000000000..94acd61a1
--- /dev/null
+++ b/db/views/instances_v01.sql
@@ -0,0 +1,17 @@
+WITH domain_counts(domain, accounts_count)
+AS (
+  SELECT domain, COUNT(*) as accounts_count
+  FROM accounts
+  WHERE domain IS NOT NULL
+  GROUP BY domain
+)
+SELECT domain, accounts_count
+FROM domain_counts
+UNION
+SELECT domain_blocks.domain, COALESCE(domain_counts.accounts_count, 0)
+FROM domain_blocks
+LEFT OUTER JOIN domain_counts ON domain_counts.domain = domain_blocks.domain
+UNION
+SELECT domain_allows.domain, COALESCE(domain_counts.accounts_count, 0)
+FROM domain_allows
+LEFT OUTER JOIN domain_counts ON domain_counts.domain = domain_allows.domain
diff --git a/lib/chewy/strategy/custom_sidekiq.rb b/lib/chewy/strategy/custom_sidekiq.rb
index 3e54326ba..794ae4ed4 100644
--- a/lib/chewy/strategy/custom_sidekiq.rb
+++ b/lib/chewy/strategy/custom_sidekiq.rb
@@ -2,29 +2,10 @@
 
 module Chewy
   class Strategy
-    class CustomSidekiq < Base
-      class Worker
-        include ::Sidekiq::Worker
-
-        sidekiq_options queue: 'pull'
-
-        def perform(type, ids, options = {})
-          options[:refresh] = !Chewy.disable_refresh_async if Chewy.disable_refresh_async
-          type.constantize.import!(ids, options)
-        end
-      end
-
-      def update(type, objects, _options = {})
-        return unless Chewy.enabled?
-
-        ids = type.root.id ? Array.wrap(objects) : type.adapter.identify(objects)
-
-        return if ids.empty?
-
-        Worker.perform_async(type.name, ids)
+    class CustomSidekiq < Sidekiq
+      def update(_type, _objects, _options = {})
+        super if Chewy.enabled?
       end
-
-      def leave; end
     end
   end
 end
diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb
index bef4093a8..cdd1db995 100644
--- a/lib/mastodon/accounts_cli.rb
+++ b/lib/mastodon/accounts_cli.rb
@@ -77,7 +77,7 @@ module Mastodon
     def create(username)
       account  = Account.new(username: username)
       password = SecureRandom.hex
-      user     = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil)
+      user     = User.new(email: options[:email], password: password, agreement: true, approved: true, admin: options[:role] == 'admin', moderator: options[:role] == 'moderator', confirmed_at: options[:confirmed] ? Time.now.utc : nil, bypass_invite_request_check: true)
 
       if options[:reattach]
         account = Account.find_local(username) || Account.new(username: username)
@@ -236,6 +236,25 @@ module Mastodon
       say('OK', :green)
     end
 
+    desc 'fix-duplicates', 'Find duplicate remote accounts and merge them'
+    option :dry_run, type: :boolean
+    long_desc <<-LONG_DESC
+      Merge known remote accounts sharing an ActivityPub actor identifier.
+
+      Such duplicates can occur when a remote server admin misconfigures their
+      domain configuration.
+    LONG_DESC
+    def fix_duplicates
+      Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck(:uri).each do |uri|
+        say("Duplicates found for #{uri}")
+        begin
+          ActivityPub::FetchRemoteAccountService.new.call(uri) unless options[:dry_run]
+        rescue => e
+          say("Error processing #{uri}: #{e}", :red)
+        end
+      end
+    end
+
     desc 'backup USERNAME', 'Request a backup for a user'
     long_desc <<-LONG_DESC
       Request a new backup for an account with a given USERNAME.
diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb
index 5433ddd9d..3c2dfd4ec 100644
--- a/lib/mastodon/domains_cli.rb
+++ b/lib/mastodon/domains_cli.rb
@@ -53,6 +53,8 @@ module Mastodon
       custom_emojis_count = custom_emojis.count
       custom_emojis.destroy_all unless options[:dry_run]
 
+      Instance.refresh unless options[:dry_run]
+
       say("Removed #{custom_emojis_count} custom emojis", :green)
     end
 
@@ -83,7 +85,7 @@ module Mastodon
       processed       = Concurrent::AtomicFixnum.new(0)
       failed          = Concurrent::AtomicFixnum.new(0)
       start_at        = Time.now.to_f
-      seed            = start ? [start] : Account.remote.domains
+      seed            = start ? [start] : Instance.pluck(:domain)
       blocked_domains = Regexp.new('\\.?' + DomainBlock.where(severity: 1).pluck(:domain).join('|') + '$')
       progress        = create_progress_bar
 
diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb
index 99d13f43d..822051ceb 100644
--- a/lib/mastodon/maintenance_cli.rb
+++ b/lib/mastodon/maintenance_cli.rb
@@ -14,7 +14,7 @@ module Mastodon
     end
 
     MIN_SUPPORTED_VERSION = 2019_10_01_213028
-    MAX_SUPPORTED_VERSION = 2020_10_17_234926
+    MAX_SUPPORTED_VERSION = 2020_12_18_054746
 
     # Stubs to enjoy ActiveRecord queries while not depending on a particular
     # version of the code/database
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 26146365e..b51ce9042 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -17,7 +17,7 @@ module Mastodon
     end
 
     def flags
-      'rc1'
+      'rc3'
     end
 
     def suffix
diff --git a/lib/paperclip/attachment_extensions.rb b/lib/paperclip/attachment_extensions.rb
index 752e79e65..94f7769b6 100644
--- a/lib/paperclip/attachment_extensions.rb
+++ b/lib/paperclip/attachment_extensions.rb
@@ -39,6 +39,23 @@ module Paperclip
     def default_url(style_name = default_style)
       @url_generator.for_as_default(style_name)
     end
+
+    STOPLIGHT_THRESHOLD = 10
+    STOPLIGHT_COOLDOWN  = 30
+
+    # We overwrite this method to put a circuit breaker around
+    # calls to object storage, to stop hitting APIs that are slow
+    # to respond or don't respond at all and as such minimize the
+    # impact of object storage outages on application throughput
+    def save
+      Stoplight('object-storage') { super }.with_threshold(STOPLIGHT_THRESHOLD).with_cool_off_time(STOPLIGHT_COOLDOWN).with_error_handler do |error, handle|
+        if error.is_a?(Seahorse::Client::NetworkingError)
+          handle.call(error)
+        else
+          raise error
+        end
+      end.run
+    end
   end
 end
 
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index 9e80989ef..2ad1e778b 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -412,7 +412,7 @@ namespace :mastodon do
 
           password = SecureRandom.hex(16)
 
-          user = User.new(admin: true, email: email, password: password, confirmed_at: Time.now.utc, account_attributes: { username: username })
+          user = User.new(admin: true, email: email, password: password, confirmed_at: Time.now.utc, account_attributes: { username: username }, bypass_invite_request_check: true)
           user.save(validate: false)
 
           prompt.ok "You can login with the password: #{password}"
diff --git a/public/shortcuts/direct.png b/public/shortcuts/direct.png
new file mode 100644
index 000000000..e8772c00e
--- /dev/null
+++ b/public/shortcuts/direct.png
Binary files differdiff --git a/public/shortcuts/new-status.png b/public/shortcuts/new-status.png
new file mode 100644
index 000000000..b7095f3c4
--- /dev/null
+++ b/public/shortcuts/new-status.png
Binary files differdiff --git a/public/shortcuts/notifications.png b/public/shortcuts/notifications.png
new file mode 100644
index 000000000..6b9d45718
--- /dev/null
+++ b/public/shortcuts/notifications.png
Binary files differdiff --git a/public/shortcuts/profile.png b/public/shortcuts/profile.png
new file mode 100644
index 000000000..0b3bf517d
--- /dev/null
+++ b/public/shortcuts/profile.png
Binary files differdiff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb
index 412b81443..8c0b309f2 100644
--- a/spec/controllers/admin/instances_controller_spec.rb
+++ b/spec/controllers/admin/instances_controller_spec.rb
@@ -9,10 +9,10 @@ RSpec.describe Admin::InstancesController, type: :controller do
 
   describe 'GET #index' do
     around do |example|
-      default_per_page = Account.default_per_page
-      Account.paginates_per 1
+      default_per_page = Instance.default_per_page
+      Instance.paginates_per 1
       example.run
-      Account.paginates_per default_per_page
+      Instance.paginates_per default_per_page
     end
 
     it 'renders instances' do
diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb
index c701a3b8b..ccf304a93 100644
--- a/spec/controllers/auth/registrations_controller_spec.rb
+++ b/spec/controllers/auth/registrations_controller_spec.rb
@@ -195,16 +195,19 @@ RSpec.describe Auth::RegistrationsController, type: :controller do
       end
     end
 
-    context 'approval-based registrations with valid invite' do
+    context 'approval-based registrations with valid invite and required invite text' do
       around do |example|
         registrations_mode = Setting.registrations_mode
+        require_invite_text = Setting.require_invite_text
         example.run
+        Setting.require_invite_text = require_invite_text
         Setting.registrations_mode = registrations_mode
       end
 
       subject do
         inviter = Fabricate(:user, confirmed_at: 2.days.ago)
         Setting.registrations_mode = 'approved'
+        Setting.require_invite_text = true
         request.headers["Accept-Language"] = accept_language
         invite = Fabricate(:invite, user: inviter, max_uses: nil, expires_at: 1.hour.from_now)
         post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', 'invite_code': invite.code, agreement: 'true' } }
diff --git a/spec/helpers/statuses_helper_spec.rb b/spec/helpers/statuses_helper_spec.rb
index 940ff072e..cba659bfb 100644
--- a/spec/helpers/statuses_helper_spec.rb
+++ b/spec/helpers/statuses_helper_spec.rb
@@ -149,22 +149,4 @@ RSpec.describe StatusesHelper, type: :helper do
       expect(css_class).to eq 'h-cite'
     end
   end
-
-  describe '#rtl?' do
-    it 'is false if text is empty' do
-      expect(helper).not_to be_rtl ''
-    end
-
-    it 'is false if there are no right to left characters' do
-      expect(helper).not_to be_rtl 'hello world'
-    end
-
-    it 'is false if right to left characters are fewer than 1/3 of total text' do
-      expect(helper).not_to be_rtl 'hello ݟ world'
-    end
-
-    it 'is true if right to left characters are greater than 1/3 of total text' do
-      expect(helper).to be_rtl 'aaݟaaݟ'
-    end
-  end
 end
diff --git a/spec/models/account_filter_spec.rb b/spec/models/account_filter_spec.rb
index 176a0eeac..0cdb373f6 100644
--- a/spec/models/account_filter_spec.rb
+++ b/spec/models/account_filter_spec.rb
@@ -5,7 +5,7 @@ describe AccountFilter do
     it 'defaults to recent local not-suspended account list' do
       filter = described_class.new({})
 
-      expect(filter.results).to eq Account.local.recent.without_suspended
+      expect(filter.results).to eq Account.local.without_instance_actor.recent.without_suspended
     end
   end
 
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 75f628076..1d000ed4d 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -440,13 +440,6 @@ RSpec.describe Account, type: :model do
     end
   end
 
-  describe '.domains' do
-    it 'returns domains' do
-      Fabricate(:account, domain: 'domain')
-      expect(Account.remote.domains).to match_array(['domain'])
-    end
-  end
-
   describe '#statuses_count' do
     subject { Fabricate(:account) }
 
@@ -737,20 +730,6 @@ RSpec.describe Account, type: :model do
       end
     end
 
-    describe 'by_domain_accounts' do
-      it 'returns accounts grouped by domain sorted by accounts' do
-        2.times { Fabricate(:account, domain: 'example.com') }
-        Fabricate(:account, domain: 'example2.com')
-
-        results = Account.where('id > 0').by_domain_accounts
-        expect(results.length).to eq 2
-        expect(results.first.domain).to eq 'example.com'
-        expect(results.first.accounts_count).to eq 2
-        expect(results.last.domain).to eq 'example2.com'
-        expect(results.last.accounts_count).to eq 1
-      end
-    end
-
     describe 'local' do
       it 'returns an array of accounts who do not have a domain' do
         account_1 = Fabricate(:account, domain: nil)
diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb
index 0c84e5e7b..e723a1ef2 100644
--- a/spec/models/follow_spec.rb
+++ b/spec/models/follow_spec.rb
@@ -5,7 +5,7 @@ RSpec.describe Follow, type: :model do
   let(:bob)   { Fabricate(:account, username: 'bob') }
 
   describe 'validations' do
-    subject { Follow.new(account: alice, target_account: bob) }
+    subject { Follow.new(account: alice, target_account: bob, rate_limit: true) }
 
     it 'has a valid fabricator' do
       follow = Fabricate.build(:follow)
diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb
index 321761166..a5eec1722 100644
--- a/spec/models/import_spec.rb
+++ b/spec/models/import_spec.rb
@@ -20,5 +20,15 @@ RSpec.describe Import, type: :model do
       import = Import.create(account: account, type: type)
       expect(import).to model_have_error_on_field(:data)
     end
+
+    it 'is invalid with too many rows in data' do
+      import = Import.create(account: account, type: type, data: StringIO.new("foo@bar.com\n" * (ImportService::ROWS_PROCESSING_LIMIT + 10)))
+      expect(import).to model_have_error_on_field(:data)
+    end
+
+    it 'is invalid when there are more rows when following limit' do
+      import = Import.create(account: account, type: type, data: StringIO.new("foo@bar.com\n" * (FollowLimitValidator.limit_for_account(account) + 10)))
+      expect(import).to model_have_error_on_field(:data)
+    end
   end
 end
diff --git a/spec/services/batched_remove_status_service_spec.rb b/spec/services/batched_remove_status_service_spec.rb
index f84256f18..c1f54a6fd 100644
--- a/spec/services/batched_remove_status_service_spec.rb
+++ b/spec/services/batched_remove_status_service_spec.rb
@@ -26,6 +26,11 @@ RSpec.describe BatchedRemoveStatusService, type: :service do
     subject.call([status1, status2])
   end
 
+  it 'removes statuses' do
+    expect { Status.find(status1.id) }.to raise_error ActiveRecord::RecordNotFound
+    expect { Status.find(status2.id) }.to raise_error ActiveRecord::RecordNotFound
+  end
+
   it 'removes statuses from author\'s home feed' do
     expect(HomeFeed.new(alice).get(10)).to_not include([status1.id, status2.id])
   end
@@ -38,10 +43,6 @@ RSpec.describe BatchedRemoveStatusService, type: :service do
     expect(Redis.current).to have_received(:publish).with("timeline:#{jeff.id}", any_args).at_least(:once)
   end
 
-  it 'notifies streaming API of author' do
-    expect(Redis.current).to have_received(:publish).with("timeline:#{alice.id}", any_args).at_least(:once)
-  end
-
   it 'notifies streaming API of public timeline' do
     expect(Redis.current).to have_received(:publish).with('timeline:public', any_args).at_least(:once)
   end
diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb
index d208b25b8..cd7d32d59 100644
--- a/spec/services/delete_account_service_spec.rb
+++ b/spec/services/delete_account_service_spec.rb
@@ -1,28 +1,31 @@
 require 'rails_helper'
 
 RSpec.describe DeleteAccountService, type: :service do
-  describe '#call on local account' do
-    before do
-      stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
-      stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
-    end
+  shared_examples 'common behavior' do
+    let!(:status) { Fabricate(:status, account: account) }
+    let!(:mention) { Fabricate(:mention, account: local_follower) }
+    let!(:status_with_mention) { Fabricate(:status, account: account, mentions: [mention]) }
+    let!(:media_attachment) { Fabricate(:media_attachment, account: account) }
+    let!(:notification) { Fabricate(:notification, account: account) }
+    let!(:favourite) { Fabricate(:favourite, account: account, status: Fabricate(:status, account: local_follower)) }
+    let!(:poll) { Fabricate(:poll, account: account) }
+    let!(:poll_vote) { Fabricate(:poll_vote, account: local_follower, poll: poll) }
+
+    let!(:active_relationship) { Fabricate(:follow, account: account, target_account: local_follower) }
+    let!(:passive_relationship) { Fabricate(:follow, account: local_follower, target_account: account) }
+    let!(:endorsement) { Fabricate(:account_pin, account: local_follower, target_account: account) }
+
+    let!(:mention_notification) { Fabricate(:notification, account: local_follower, activity: mention, type: :mention) }
+    let!(:status_notification) { Fabricate(:notification, account: local_follower, activity: status, type: :status) }
+    let!(:poll_notification) { Fabricate(:notification, account: local_follower, activity: poll, type: :poll) }
+    let!(:favourite_notification) { Fabricate(:notification, account: local_follower, activity: favourite, type: :favourite) }
+    let!(:follow_notification) { Fabricate(:notification, account: local_follower, activity: active_relationship, type: :follow) }
 
     subject do
       -> { described_class.new.call(account) }
     end
 
-    let!(:account) { Fabricate(:account) }
-    let!(:status) { Fabricate(:status, account: account) }
-    let!(:media_attachment) { Fabricate(:media_attachment, account: account) }
-    let!(:notification) { Fabricate(:notification, account: account) }
-    let!(:favourite) { Fabricate(:favourite, account: account) }
-    let!(:active_relationship) { Fabricate(:follow, account: account) }
-    let!(:passive_relationship) { Fabricate(:follow, target_account: account) }
-    let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) }
-    let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
-    let!(:endorsment) { Fabricate(:account_pin, account: passive_relationship.account, target_account: account) }
-
-    it 'deletes associated records' do
+    it 'deletes associated owned records' do
       is_expected.to change {
         [
           account.statuses,
@@ -31,54 +34,63 @@ RSpec.describe DeleteAccountService, type: :service do
           account.favourites,
           account.active_relationships,
           account.passive_relationships,
+          account.polls,
+        ].map(&:count)
+      }.from([2, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0])
+    end
+
+    it 'deletes associated target records' do
+      is_expected.to change {
+        [
           AccountPin.where(target_account: account),
         ].map(&:count)
-      }.from([1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0])
+      }.from([1]).to([0])
     end
 
-    it 'sends a delete actor activity to all known inboxes' do
-      subject.call
-      expect(a_request(:post, "https://alice.com/inbox")).to have_been_made.once
-      expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once
+    it 'deletes associated target notifications' do
+      is_expected.to change {
+        [
+          'poll', 'favourite', 'status', 'mention', 'follow'
+        ].map { |type| Notification.where(type: type).count }
+      }.from([1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0])
     end
   end
 
-  describe '#call on remote account' do
+  describe '#call on local account' do
     before do
       stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
       stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
     end
 
-    subject do
-      -> { described_class.new.call(remote_bob) }
-    end
-
-    let!(:account) { Fabricate(:account) }
     let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) }
     let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
-    let!(:status) { Fabricate(:status, account: remote_bob) }
-    let!(:media_attachment) { Fabricate(:media_attachment, account: remote_bob) }
-    let!(:notification) { Fabricate(:notification, account: remote_bob) }
-    let!(:favourite) { Fabricate(:favourite, account: remote_bob) }
-    let!(:active_relationship) { Fabricate(:follow, account: remote_bob, target_account: account) }
-    let!(:passive_relationship) { Fabricate(:follow, target_account: remote_bob) }
 
-    it 'deletes associated records' do
-      is_expected.to change {
-        [
-          remote_bob.statuses,
-          remote_bob.media_attachments,
-          remote_bob.notifications,
-          remote_bob.favourites,
-          remote_bob.active_relationships,
-          remote_bob.passive_relationships,
-        ].map(&:count)
-      }.from([1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0])
+    include_examples 'common behavior' do
+      let!(:account) { Fabricate(:account) }
+      let!(:local_follower) { Fabricate(:account) }
+
+      it 'sends a delete actor activity to all known inboxes' do
+        subject.call
+        expect(a_request(:post, "https://alice.com/inbox")).to have_been_made.once
+        expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once
+      end
+    end
+  end
+
+  describe '#call on remote account' do
+    before do
+      stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
+      stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
     end
 
-    it 'sends a reject follow to follwer inboxes' do
-      subject.call
-      expect(a_request(:post, remote_bob.inbox_url)).to have_been_made.once
+    include_examples 'common behavior' do
+      let!(:account) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
+      let!(:local_follower) { Fabricate(:account) }
+
+      it 'sends a reject follow to follwer inboxes' do
+        subject.call
+        expect(a_request(:post, account.inbox_url)).to have_been_made.once
+      end
     end
   end
 end
diff --git a/spec/services/remove_status_service_spec.rb b/spec/services/remove_status_service_spec.rb
index 06676ec45..7ce75b2c7 100644
--- a/spec/services/remove_status_service_spec.rb
+++ b/spec/services/remove_status_service_spec.rb
@@ -3,7 +3,7 @@ require 'rails_helper'
 RSpec.describe RemoveStatusService, type: :service do
   subject { RemoveStatusService.new }
 
-  let!(:alice)  { Fabricate(:account) }
+  let!(:alice)  { Fabricate(:account, user: Fabricate(:user)) }
   let!(:bob)    { Fabricate(:account, username: 'bob', domain: 'example.com', salmon_url: 'http://example.com/salmon') }
   let!(:jeff)   { Fabricate(:account) }
   let!(:hank)   { Fabricate(:account, username: 'hank', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
@@ -17,23 +17,33 @@ RSpec.describe RemoveStatusService, type: :service do
     hank.follow!(alice)
 
     @status = PostStatusService.new.call(alice, text: 'Hello @bob@example.com')
+    FavouriteService.new.call(jeff, @status)
     Fabricate(:status, account: bill, reblog: @status, uri: 'hoge')
-    subject.call(@status)
   end
 
   it 'removes status from author\'s home feed' do
+    subject.call(@status)
     expect(HomeFeed.new(alice).get(10)).to_not include(@status.id)
   end
 
   it 'removes status from local follower\'s home feed' do
+    subject.call(@status)
     expect(HomeFeed.new(jeff).get(10)).to_not include(@status.id)
   end
 
   it 'sends delete activity to followers' do
+    subject.call(@status)
     expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.twice
   end
 
   it 'sends delete activity to rebloggers' do
+    subject.call(@status)
     expect(a_request(:post, 'http://example2.com/inbox')).to have_been_made
   end
+
+  it 'remove status from notifications' do
+    expect { subject.call(@status) }.to change {
+      Notification.where(activity_type: 'Favourite', from_account: jeff, account: alice).count
+    }.from(1).to(0)
+  end
 end
diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb
index 5bd0ec264..a604e90b5 100644
--- a/spec/services/resolve_account_service_spec.rb
+++ b/spec/services/resolve_account_service_spec.rb
@@ -60,7 +60,22 @@ RSpec.describe ResolveAccountService, type: :service do
 
   context 'with a legitimate webfinger redirection' do
     before do
-      webfinger = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] }
+      webfinger = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] }
+      stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
+    end
+
+    it 'returns new remote account' do
+      account = subject.call('Foo@redirected.example.com')
+
+      expect(account.activitypub?).to eq true
+      expect(account.acct).to eq 'foo@ap.example.com'
+      expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox'
+    end
+  end
+
+  context 'with a misconfigured redirection' do
+    before do
+      webfinger = { subject: 'acct:Foo@redirected.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] }
       stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
     end
 
@@ -75,9 +90,9 @@ RSpec.describe ResolveAccountService, type: :service do
 
   context 'with too many webfinger redirections' do
     before do
-      webfinger = { subject: 'acct:foo@evil.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] }
+      webfinger = { subject: 'acct:foo@evil.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] }
       stub_request(:get, 'https://redirected.example.com/.well-known/webfinger?resource=acct:Foo@redirected.example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
-      webfinger2 = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo' }] }
+      webfinger2 = { subject: 'acct:foo@ap.example.com', links: [{ rel: 'self', href: 'https://ap.example.com/users/foo', type: 'application/activity+json' }] }
       stub_request(:get, 'https://evil.example.com/.well-known/webfinger?resource=acct:foo@evil.example.com').to_return(body: Oj.dump(webfinger2), headers: { 'Content-Type': 'application/jrd+json' })
     end
 
@@ -111,6 +126,41 @@ RSpec.describe ResolveAccountService, type: :service do
     end
   end
 
+  context 'with an already-known actor changing acct: URI' do
+    let!(:duplicate) { Fabricate(:account, username: 'foo', domain: 'old.example.com', uri: 'https://ap.example.com/users/foo') }
+    let!(:status)    { Fabricate(:status, account: duplicate, text: 'foo') }
+
+    it 'returns new remote account' do
+      account = subject.call('foo@ap.example.com')
+
+      expect(account.activitypub?).to eq true
+      expect(account.domain).to eq 'ap.example.com'
+      expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox'
+      expect(account.uri).to eq 'https://ap.example.com/users/foo'
+    end
+
+    it 'merges accounts' do
+      account = subject.call('foo@ap.example.com')
+
+      expect(status.reload.account_id).to eq account.id
+      expect(Account.where(uri: account.uri).count).to eq 1
+    end
+  end
+
+  context 'with an already-known acct: URI changing ActivityPub id' do
+    let!(:old_account) { Fabricate(:account, username: 'foo', domain: 'ap.example.com', uri: 'https://old.example.com/users/foo', last_webfingered_at: nil) }
+    let!(:status)    { Fabricate(:status, account: old_account, text: 'foo') }
+
+    it 'returns new remote account' do
+      account = subject.call('foo@ap.example.com')
+
+      expect(account.activitypub?).to eq true
+      expect(account.domain).to eq 'ap.example.com'
+      expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox'
+      expect(account.uri).to eq 'https://ap.example.com/users/foo'
+    end
+  end
+
   it 'processes one remote account at a time using locks' do
     wait_for_start = true
     fail_occurred  = false
diff --git a/yarn.lock b/yarn.lock
index 69a0ccf92..042fbb4b9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5533,9 +5533,9 @@ inherits@2.0.3:
   integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
 
 ini@^1.3.4, ini@^1.3.5:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+  version "1.3.7"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
+  integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
 
 inquirer@^0.12.0:
   version "0.12.0"
@@ -7313,9 +7313,9 @@ node-modules-regexp@^1.0.0:
   integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
 
 node-notifier@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620"
-  integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1"
+  integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==
   dependencies:
     growly "^1.3.0"
     is-wsl "^2.2.0"
@@ -9561,9 +9561,11 @@ semver@^6.0.0, semver@^6.3.0:
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
 semver@^7.2.1, semver@^7.3.2:
-  version "7.3.2"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
-  integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
+  integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
+  dependencies:
+    lru-cache "^6.0.0"
 
 send@0.17.1:
   version "0.17.1"
@@ -10855,9 +10857,9 @@ uuid@^3.3.2, uuid@^3.4.0:
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
 uuid@^8.3.0, uuid@^8.3.1:
-  version "8.3.1"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
-  integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
+  version "8.3.2"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
 
 v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
   version "2.2.0"